msi.c 35.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/*
 * File:	msi.c
 * Purpose:	PCI Message Signaled Interrupt (MSI)
 *
 * Copyright (C) 2003-2004 Intel
 * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
 */

9
#include <linux/err.h>
L
Linus Torvalds 已提交
10 11 12
#include <linux/mm.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
13
#include <linux/export.h>
L
Linus Torvalds 已提交
14 15 16
#include <linux/ioport.h>
#include <linux/pci.h>
#include <linux/proc_fs.h>
17
#include <linux/msi.h>
D
Dan Williams 已提交
18
#include <linux/smp.h>
H
Hidetoshi Seto 已提交
19 20
#include <linux/errno.h>
#include <linux/io.h>
21
#include <linux/slab.h>
22
#include <linux/irqdomain.h>
23
#include <linux/of_irq.h>
L
Linus Torvalds 已提交
24 25 26 27

#include "pci.h"

static int pci_msi_enable = 1;
28
int pci_msi_ignore_mask;
L
Linus Torvalds 已提交
29

30 31
#define msix_table_size(flags)	((flags & PCI_MSIX_FLAGS_QSIZE) + 1)

32 33 34 35 36 37 38 39 40
#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
static struct irq_domain *pci_msi_default_domain;
static DEFINE_MUTEX(pci_msi_domain_lock);

struct irq_domain * __weak arch_get_pci_msi_domain(struct pci_dev *dev)
{
	return pci_msi_default_domain;
}

41 42
static struct irq_domain *pci_msi_get_domain(struct pci_dev *dev)
{
43
	struct irq_domain *domain;
44

45 46 47
	domain = dev_get_msi_domain(&dev->dev);
	if (domain)
		return domain;
48

49
	return arch_get_pci_msi_domain(dev);
50 51
}

52 53 54 55
static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
{
	struct irq_domain *domain;

56
	domain = pci_msi_get_domain(dev);
57
	if (domain && irq_domain_is_hierarchy(domain))
58 59 60 61 62 63 64 65 66
		return pci_msi_domain_alloc_irqs(domain, dev, nvec, type);

	return arch_setup_msi_irqs(dev, nvec, type);
}

static void pci_msi_teardown_msi_irqs(struct pci_dev *dev)
{
	struct irq_domain *domain;

67
	domain = pci_msi_get_domain(dev);
68
	if (domain && irq_domain_is_hierarchy(domain))
69 70 71 72 73 74 75 76
		pci_msi_domain_free_irqs(domain, dev);
	else
		arch_teardown_msi_irqs(dev);
}
#else
#define pci_msi_setup_msi_irqs		arch_setup_msi_irqs
#define pci_msi_teardown_msi_irqs	arch_teardown_msi_irqs
#endif
77

78 79
/* Arch hooks */

80 81
int __weak arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc)
{
82
	struct msi_controller *chip = dev->bus->msi;
83 84 85 86 87 88 89 90 91 92 93 94
	int err;

	if (!chip || !chip->setup_irq)
		return -EINVAL;

	err = chip->setup_irq(chip, dev, desc);
	if (err < 0)
		return err;

	irq_set_chip_data(desc->irq, chip);

	return 0;
95 96 97
}

void __weak arch_teardown_msi_irq(unsigned int irq)
98
{
99
	struct msi_controller *chip = irq_get_chip_data(irq);
100 101 102 103 104

	if (!chip || !chip->teardown_irq)
		return;

	chip->teardown_irq(chip, irq);
105 106
}

107
int __weak arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
108
{
109
	struct msi_controller *chip = dev->bus->msi;
110 111 112
	struct msi_desc *entry;
	int ret;

113 114
	if (chip && chip->setup_irqs)
		return chip->setup_irqs(chip, dev, nvec, type);
115 116 117 118 119 120 121
	/*
	 * If an architecture wants to support multiple MSI, it needs to
	 * override arch_setup_msi_irqs()
	 */
	if (type == PCI_CAP_ID_MSI && nvec > 1)
		return 1;

122
	for_each_pci_msi_entry(entry, dev) {
123
		ret = arch_setup_msi_irq(dev, entry);
124
		if (ret < 0)
125
			return ret;
126 127
		if (ret > 0)
			return -ENOSPC;
128 129 130 131
	}

	return 0;
}
132

133 134 135 136
/*
 * We have a default implementation available as a separate non-weak
 * function, as it is used by the Xen x86 PCI code
 */
137
void default_teardown_msi_irqs(struct pci_dev *dev)
138
{
139
	int i;
140 141
	struct msi_desc *entry;

142
	for_each_pci_msi_entry(entry, dev)
143 144 145
		if (entry->irq)
			for (i = 0; i < entry->nvec_used; i++)
				arch_teardown_msi_irq(entry->irq + i);
146 147
}

148 149 150 151
void __weak arch_teardown_msi_irqs(struct pci_dev *dev)
{
	return default_teardown_msi_irqs(dev);
}
152

153
static void default_restore_msi_irq(struct pci_dev *dev, int irq)
154 155 156 157 158
{
	struct msi_desc *entry;

	entry = NULL;
	if (dev->msix_enabled) {
159
		for_each_pci_msi_entry(entry, dev) {
160 161 162 163 164 165 166 167
			if (irq == entry->irq)
				break;
		}
	} else if (dev->msi_enabled)  {
		entry = irq_get_msi_desc(irq);
	}

	if (entry)
168
		__pci_write_msi_msg(entry, &entry->msg);
169
}
170

171
void __weak arch_restore_msi_irqs(struct pci_dev *dev)
172
{
173
	return default_restore_msi_irqs(dev);
174
}
175

176 177
static inline __attribute_const__ u32 msi_mask(unsigned x)
{
178 179 180 181
	/* Don't shift by >= width of type */
	if (x >= 5)
		return 0xffffffff;
	return (1 << (1 << x)) - 1;
182 183
}

184 185 186 187 188 189
/*
 * PCI 2.3 does not specify mask bits for each MSI interrupt.  Attempting to
 * mask all MSI interrupts by clearing the MSI enable bit does not work
 * reliably as devices without an INTx disable bit will then generate a
 * level IRQ which will never be cleared.
 */
190
u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
L
Linus Torvalds 已提交
191
{
192
	u32 mask_bits = desc->masked;
L
Linus Torvalds 已提交
193

194
	if (pci_msi_ignore_mask || !desc->msi_attrib.maskbit)
195
		return 0;
196 197 198

	mask_bits &= ~mask;
	mask_bits |= flag;
199 200
	pci_write_config_dword(msi_desc_to_pci_dev(desc), desc->mask_pos,
			       mask_bits);
201 202 203 204 205 206

	return mask_bits;
}

static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
{
207
	desc->masked = __pci_msi_desc_mask_irq(desc, mask, flag);
208 209 210 211 212 213 214 215 216
}

/*
 * This internal function does not flush PCI writes to the device.
 * All users must ensure that they read from the device before either
 * assuming that the device state is up to date, or returning out of this
 * file.  This saves a few milliseconds when initialising devices with lots
 * of MSI-X interrupts.
 */
217
u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag)
218 219 220
{
	u32 mask_bits = desc->masked;
	unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
221
						PCI_MSIX_ENTRY_VECTOR_CTRL;
222 223 224 225

	if (pci_msi_ignore_mask)
		return 0;

226 227 228
	mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
	if (flag)
		mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
229
	writel(mask_bits, desc->mask_base + offset);
230 231 232 233 234 235

	return mask_bits;
}

static void msix_mask_irq(struct msi_desc *desc, u32 flag)
{
236
	desc->masked = __pci_msix_desc_mask_irq(desc, flag);
237
}
238

239
static void msi_set_mask_bit(struct irq_data *data, u32 flag)
240
{
241
	struct msi_desc *desc = irq_data_get_msi_desc(data);
242

243 244 245 246
	if (desc->msi_attrib.is_msix) {
		msix_mask_irq(desc, flag);
		readl(desc->mask_base);		/* Flush write to device */
	} else {
247
		unsigned offset = data->irq - desc->irq;
248
		msi_mask_irq(desc, 1 << offset, flag << offset);
L
Linus Torvalds 已提交
249
	}
250 251
}

252 253 254 255 256
/**
 * pci_msi_mask_irq - Generic irq chip callback to mask PCI/MSI interrupts
 * @data:	pointer to irqdata associated to that interrupt
 */
void pci_msi_mask_irq(struct irq_data *data)
257
{
258
	msi_set_mask_bit(data, 1);
259 260
}

261 262 263 264 265
/**
 * pci_msi_unmask_irq - Generic irq chip callback to unmask PCI/MSI interrupts
 * @data:	pointer to irqdata associated to that interrupt
 */
void pci_msi_unmask_irq(struct irq_data *data)
266
{
267
	msi_set_mask_bit(data, 0);
L
Linus Torvalds 已提交
268 269
}

270 271 272 273
void default_restore_msi_irqs(struct pci_dev *dev)
{
	struct msi_desc *entry;

274
	for_each_pci_msi_entry(entry, dev)
275 276 277
		default_restore_msi_irq(dev, entry->irq);
}

278
void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
L
Linus Torvalds 已提交
279
{
280 281 282
	struct pci_dev *dev = msi_desc_to_pci_dev(entry);

	BUG_ON(dev->current_state != PCI_D0);
283 284 285 286 287 288 289 290 291

	if (entry->msi_attrib.is_msix) {
		void __iomem *base = entry->mask_base +
			entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;

		msg->address_lo = readl(base + PCI_MSIX_ENTRY_LOWER_ADDR);
		msg->address_hi = readl(base + PCI_MSIX_ENTRY_UPPER_ADDR);
		msg->data = readl(base + PCI_MSIX_ENTRY_DATA);
	} else {
292
		int pos = dev->msi_cap;
293 294
		u16 data;

295 296
		pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO,
				      &msg->address_lo);
297
		if (entry->msi_attrib.is_64) {
298 299
			pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI,
					      &msg->address_hi);
B
Bjorn Helgaas 已提交
300
			pci_read_config_word(dev, pos + PCI_MSI_DATA_64, &data);
301 302
		} else {
			msg->address_hi = 0;
B
Bjorn Helgaas 已提交
303
			pci_read_config_word(dev, pos + PCI_MSI_DATA_32, &data);
304 305 306 307 308
		}
		msg->data = data;
	}
}

309
void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
Y
Yinghai Lu 已提交
310
{
311 312 313
	struct pci_dev *dev = msi_desc_to_pci_dev(entry);

	if (dev->current_state != PCI_D0) {
314 315
		/* Don't touch the hardware now */
	} else if (entry->msi_attrib.is_msix) {
316 317 318 319
		void __iomem *base;
		base = entry->mask_base +
			entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;

320 321 322
		writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR);
		writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR);
		writel(msg->data, base + PCI_MSIX_ENTRY_DATA);
323
	} else {
324
		int pos = dev->msi_cap;
325 326
		u16 msgctl;

327
		pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl);
328 329
		msgctl &= ~PCI_MSI_FLAGS_QSIZE;
		msgctl |= entry->msi_attrib.multiple << 4;
330
		pci_write_config_word(dev, pos + PCI_MSI_FLAGS, msgctl);
331

332 333
		pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO,
				       msg->address_lo);
334
		if (entry->msi_attrib.is_64) {
335 336
			pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI,
					       msg->address_hi);
B
Bjorn Helgaas 已提交
337 338
			pci_write_config_word(dev, pos + PCI_MSI_DATA_64,
					      msg->data);
339
		} else {
B
Bjorn Helgaas 已提交
340 341
			pci_write_config_word(dev, pos + PCI_MSI_DATA_32,
					      msg->data);
342
		}
L
Linus Torvalds 已提交
343
	}
344
	entry->msg = *msg;
L
Linus Torvalds 已提交
345
}
346

347
void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg)
Y
Yinghai Lu 已提交
348
{
349
	struct msi_desc *entry = irq_get_msi_desc(irq);
Y
Yinghai Lu 已提交
350

351
	__pci_write_msi_msg(entry, msg);
Y
Yinghai Lu 已提交
352
}
353
EXPORT_SYMBOL_GPL(pci_write_msi_msg);
Y
Yinghai Lu 已提交
354

355 356
static void free_msi_irqs(struct pci_dev *dev)
{
357
	struct list_head *msi_list = dev_to_msi_list(&dev->dev);
358
	struct msi_desc *entry, *tmp;
359 360
	struct attribute **msi_attrs;
	struct device_attribute *dev_attr;
361
	int i, count = 0;
362

363
	for_each_pci_msi_entry(entry, dev)
364 365 366
		if (entry->irq)
			for (i = 0; i < entry->nvec_used; i++)
				BUG_ON(irq_has_action(entry->irq + i));
367

368
	pci_msi_teardown_msi_irqs(dev);
369

370
	list_for_each_entry_safe(entry, tmp, msi_list, list) {
371
		if (entry->msi_attrib.is_msix) {
372
			if (list_is_last(&entry->list, msi_list))
373 374
				iounmap(entry->mask_base);
		}
375

376 377 378
		list_del(&entry->list);
		kfree(entry);
	}
379 380 381 382

	if (dev->msi_irq_groups) {
		sysfs_remove_groups(&dev->dev.kobj, dev->msi_irq_groups);
		msi_attrs = dev->msi_irq_groups[0]->attrs;
383
		while (msi_attrs[count]) {
384 385 386 387 388 389 390 391 392 393 394
			dev_attr = container_of(msi_attrs[count],
						struct device_attribute, attr);
			kfree(dev_attr->attr.name);
			kfree(dev_attr);
			++count;
		}
		kfree(msi_attrs);
		kfree(dev->msi_irq_groups[0]);
		kfree(dev->msi_irq_groups);
		dev->msi_irq_groups = NULL;
	}
395
}
S
Satoru Takeuchi 已提交
396

397 398 399 400 401 402
static void pci_intx_for_msi(struct pci_dev *dev, int enable)
{
	if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG))
		pci_intx(dev, enable);
}

403
static void __pci_restore_msi_state(struct pci_dev *dev)
404 405
{
	u16 control;
406
	struct msi_desc *entry;
407

408 409 410
	if (!dev->msi_enabled)
		return;

411
	entry = irq_get_msi_desc(dev->irq);
412

413
	pci_intx_for_msi(dev, 0);
414
	pci_msi_set_enable(dev, 0);
415
	arch_restore_msi_irqs(dev);
416

417
	pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
418 419
	msi_mask_irq(entry, msi_mask(entry->msi_attrib.multi_cap),
		     entry->masked);
420
	control &= ~PCI_MSI_FLAGS_QSIZE;
421
	control |= (entry->msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
422
	pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, control);
423 424 425
}

static void __pci_restore_msix_state(struct pci_dev *dev)
426 427 428
{
	struct msi_desc *entry;

E
Eric W. Biederman 已提交
429 430
	if (!dev->msix_enabled)
		return;
431
	BUG_ON(list_empty(dev_to_msi_list(&dev->dev)));
E
Eric W. Biederman 已提交
432

433
	/* route the table */
434
	pci_intx_for_msi(dev, 0);
435
	pci_msix_clear_and_set_ctrl(dev, 0,
436
				PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL);
437

438
	arch_restore_msi_irqs(dev);
439
	for_each_pci_msi_entry(entry, dev)
440
		msix_mask_irq(entry, entry->masked);
441

442
	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
443
}
444 445 446 447 448 449

void pci_restore_msi_state(struct pci_dev *dev)
{
	__pci_restore_msi_state(dev);
	__pci_restore_msix_state(dev);
}
450
EXPORT_SYMBOL_GPL(pci_restore_msi_state);
451

452
static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
453 454
			     char *buf)
{
455 456 457
	struct msi_desc *entry;
	unsigned long irq;
	int retval;
458

459 460 461
	retval = kstrtoul(attr->attr.name, 10, &irq);
	if (retval)
		return retval;
462

463 464 465 466 467
	entry = irq_get_msi_desc(irq);
	if (entry)
		return sprintf(buf, "%s\n",
				entry->msi_attrib.is_msix ? "msix" : "msi");

468
	return -ENODEV;
469 470 471 472
}

static int populate_msi_sysfs(struct pci_dev *pdev)
{
473 474 475 476 477
	struct attribute **msi_attrs;
	struct attribute *msi_attr;
	struct device_attribute *msi_dev_attr;
	struct attribute_group *msi_irq_group;
	const struct attribute_group **msi_irq_groups;
478
	struct msi_desc *entry;
479 480
	int ret = -ENOMEM;
	int num_msi = 0;
481
	int count = 0;
482
	int i;
483

484
	/* Determine how many msi entries we have */
485
	for_each_pci_msi_entry(entry, pdev)
486
		num_msi += entry->nvec_used;
487 488
	if (!num_msi)
		return 0;
489

490 491 492 493
	/* Dynamically create the MSI attributes for the PCI device */
	msi_attrs = kzalloc(sizeof(void *) * (num_msi + 1), GFP_KERNEL);
	if (!msi_attrs)
		return -ENOMEM;
494
	for_each_pci_msi_entry(entry, pdev) {
495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
		for (i = 0; i < entry->nvec_used; i++) {
			msi_dev_attr = kzalloc(sizeof(*msi_dev_attr), GFP_KERNEL);
			if (!msi_dev_attr)
				goto error_attrs;
			msi_attrs[count] = &msi_dev_attr->attr;

			sysfs_attr_init(&msi_dev_attr->attr);
			msi_dev_attr->attr.name = kasprintf(GFP_KERNEL, "%d",
							    entry->irq + i);
			if (!msi_dev_attr->attr.name)
				goto error_attrs;
			msi_dev_attr->attr.mode = S_IRUGO;
			msi_dev_attr->show = msi_mode_show;
			++count;
		}
510 511
	}

512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527
	msi_irq_group = kzalloc(sizeof(*msi_irq_group), GFP_KERNEL);
	if (!msi_irq_group)
		goto error_attrs;
	msi_irq_group->name = "msi_irqs";
	msi_irq_group->attrs = msi_attrs;

	msi_irq_groups = kzalloc(sizeof(void *) * 2, GFP_KERNEL);
	if (!msi_irq_groups)
		goto error_irq_group;
	msi_irq_groups[0] = msi_irq_group;

	ret = sysfs_create_groups(&pdev->dev.kobj, msi_irq_groups);
	if (ret)
		goto error_irq_groups;
	pdev->msi_irq_groups = msi_irq_groups;

528 529
	return 0;

530 531 532 533 534 535 536 537 538 539 540 541 542
error_irq_groups:
	kfree(msi_irq_groups);
error_irq_group:
	kfree(msi_irq_group);
error_attrs:
	count = 0;
	msi_attr = msi_attrs[count];
	while (msi_attr) {
		msi_dev_attr = container_of(msi_attr, struct device_attribute, attr);
		kfree(msi_attr->name);
		kfree(msi_dev_attr);
		++count;
		msi_attr = msi_attrs[count];
543
	}
544
	kfree(msi_attrs);
545 546 547
	return ret;
}

548
static struct msi_desc *msi_setup_entry(struct pci_dev *dev, int nvec)
549 550 551 552 553
{
	u16 control;
	struct msi_desc *entry;

	/* MSI Entry Initialization */
554
	entry = alloc_msi_entry(&dev->dev);
555 556 557 558 559 560 561 562 563 564 565
	if (!entry)
		return NULL;

	pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);

	entry->msi_attrib.is_msix	= 0;
	entry->msi_attrib.is_64		= !!(control & PCI_MSI_FLAGS_64BIT);
	entry->msi_attrib.entry_nr	= 0;
	entry->msi_attrib.maskbit	= !!(control & PCI_MSI_FLAGS_MASKBIT);
	entry->msi_attrib.default_irq	= dev->irq;	/* Save IOAPIC IRQ */
	entry->msi_attrib.multi_cap	= (control & PCI_MSI_FLAGS_QMASK) >> 1;
566 567
	entry->msi_attrib.multiple	= ilog2(__roundup_pow_of_two(nvec));
	entry->nvec_used		= nvec;
568 569 570 571 572 573 574 575 576 577 578 579 580

	if (control & PCI_MSI_FLAGS_64BIT)
		entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64;
	else
		entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32;

	/* Save the initial mask status */
	if (entry->msi_attrib.maskbit)
		pci_read_config_dword(dev, entry->mask_pos, &entry->masked);

	return entry;
}

581 582 583 584
static int msi_verify_entries(struct pci_dev *dev)
{
	struct msi_desc *entry;

585
	for_each_pci_msi_entry(entry, dev) {
586 587 588 589 590 591 592 593 594
		if (!dev->no_64bit_msi || !entry->msg.address_hi)
			continue;
		dev_err(&dev->dev, "Device has broken 64-bit MSI but arch"
			" tried to assign one above 4G\n");
		return -EIO;
	}
	return 0;
}

L
Linus Torvalds 已提交
595 596 597
/**
 * msi_capability_init - configure device's MSI capability structure
 * @dev: pointer to the pci_dev data structure of MSI device function
598
 * @nvec: number of interrupts to allocate
L
Linus Torvalds 已提交
599
 *
600 601 602 603 604 605 606
 * Setup the MSI capability structure of the device with the requested
 * number of interrupts.  A return value of zero indicates the successful
 * setup of an entry with the new MSI irq.  A negative return value indicates
 * an error, and a positive return value indicates the number of interrupts
 * which could have been allocated.
 */
static int msi_capability_init(struct pci_dev *dev, int nvec)
L
Linus Torvalds 已提交
607 608
{
	struct msi_desc *entry;
609
	int ret;
610
	unsigned mask;
L
Linus Torvalds 已提交
611

612
	pci_msi_set_enable(dev, 0);	/* Disable MSI during set up */
613

614
	entry = msi_setup_entry(dev, nvec);
615 616
	if (!entry)
		return -ENOMEM;
617

618
	/* All MSIs are unmasked by default, Mask them all */
619
	mask = msi_mask(entry->msi_attrib.multi_cap);
620 621
	msi_mask_irq(entry, mask, mask);

622
	list_add_tail(&entry->list, dev_to_msi_list(&dev->dev));
623

L
Linus Torvalds 已提交
624
	/* Configure MSI capability structure */
625
	ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
626
	if (ret) {
627
		msi_mask_irq(entry, mask, ~mask);
628
		free_msi_irqs(dev);
629
		return ret;
630
	}
631

632 633 634 635 636 637 638
	ret = msi_verify_entries(dev);
	if (ret) {
		msi_mask_irq(entry, mask, ~mask);
		free_msi_irqs(dev);
		return ret;
	}

639 640 641 642 643 644 645
	ret = populate_msi_sysfs(dev);
	if (ret) {
		msi_mask_irq(entry, mask, ~mask);
		free_msi_irqs(dev);
		return ret;
	}

L
Linus Torvalds 已提交
646
	/* Set MSI enabled bits	 */
647
	pci_intx_for_msi(dev, 0);
648
	pci_msi_set_enable(dev, 1);
649
	dev->msi_enabled = 1;
L
Linus Torvalds 已提交
650

651
	pcibios_free_irq(dev);
652
	dev->irq = entry->irq;
L
Linus Torvalds 已提交
653 654 655
	return 0;
}

656
static void __iomem *msix_map_region(struct pci_dev *dev, unsigned nr_entries)
657
{
658
	resource_size_t phys_addr;
659
	u32 table_offset;
660
	unsigned long flags;
661 662
	u8 bir;

663 664
	pci_read_config_dword(dev, dev->msix_cap + PCI_MSIX_TABLE,
			      &table_offset);
665
	bir = (u8)(table_offset & PCI_MSIX_TABLE_BIR);
666 667 668 669
	flags = pci_resource_flags(dev, bir);
	if (!flags || (flags & IORESOURCE_UNSET))
		return NULL;

670
	table_offset &= PCI_MSIX_TABLE_OFFSET;
671 672 673 674 675
	phys_addr = pci_resource_start(dev, bir) + table_offset;

	return ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE);
}

676 677
static int msix_setup_entries(struct pci_dev *dev, void __iomem *base,
			      struct msix_entry *entries, int nvec)
678 679 680 681 682
{
	struct msi_desc *entry;
	int i;

	for (i = 0; i < nvec; i++) {
683
		entry = alloc_msi_entry(&dev->dev);
684 685 686 687 688 689 690 691 692 693 694 695 696 697
		if (!entry) {
			if (!i)
				iounmap(base);
			else
				free_msi_irqs(dev);
			/* No enough memory. Don't try again */
			return -ENOMEM;
		}

		entry->msi_attrib.is_msix	= 1;
		entry->msi_attrib.is_64		= 1;
		entry->msi_attrib.entry_nr	= entries[i].entry;
		entry->msi_attrib.default_irq	= dev->irq;
		entry->mask_base		= base;
698
		entry->nvec_used		= 1;
699

700
		list_add_tail(&entry->list, dev_to_msi_list(&dev->dev));
701 702 703 704 705
	}

	return 0;
}

706
static void msix_program_entries(struct pci_dev *dev,
707
				 struct msix_entry *entries)
708 709 710 711
{
	struct msi_desc *entry;
	int i = 0;

712
	for_each_pci_msi_entry(entry, dev) {
713 714 715 716 717 718 719 720 721 722
		int offset = entries[i].entry * PCI_MSIX_ENTRY_SIZE +
						PCI_MSIX_ENTRY_VECTOR_CTRL;

		entries[i].vector = entry->irq;
		entry->masked = readl(entry->mask_base + offset);
		msix_mask_irq(entry, 1);
		i++;
	}
}

L
Linus Torvalds 已提交
723 724 725
/**
 * msix_capability_init - configure device's MSI-X capability
 * @dev: pointer to the pci_dev data structure of MSI-X device function
R
Randy Dunlap 已提交
726 727
 * @entries: pointer to an array of struct msix_entry entries
 * @nvec: number of @entries
L
Linus Torvalds 已提交
728
 *
729
 * Setup the MSI-X capability structure of device function with a
730 731
 * single MSI-X irq. A return of zero indicates the successful setup of
 * requested MSI-X entries with allocated irqs or non-zero for otherwise.
L
Linus Torvalds 已提交
732 733 734 735
 **/
static int msix_capability_init(struct pci_dev *dev,
				struct msix_entry *entries, int nvec)
{
736
	int ret;
737
	u16 control;
L
Linus Torvalds 已提交
738 739
	void __iomem *base;

740
	/* Ensure MSI-X is disabled while it is set up */
741
	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
742

743
	pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
L
Linus Torvalds 已提交
744
	/* Request & Map MSI-X table region */
745
	base = msix_map_region(dev, msix_table_size(control));
746
	if (!base)
L
Linus Torvalds 已提交
747 748
		return -ENOMEM;

749
	ret = msix_setup_entries(dev, base, entries, nvec);
750 751
	if (ret)
		return ret;
752

753
	ret = pci_msi_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
754
	if (ret)
755
		goto out_avail;
756

757 758 759 760 761
	/* Check if all MSI entries honor device restrictions */
	ret = msi_verify_entries(dev);
	if (ret)
		goto out_free;

762 763 764 765 766
	/*
	 * Some devices require MSI-X to be enabled before we can touch the
	 * MSI-X registers.  We need to mask all the vectors to prevent
	 * interrupts coming in before they're fully set up.
	 */
767
	pci_msix_clear_and_set_ctrl(dev, 0,
768
				PCI_MSIX_FLAGS_MASKALL | PCI_MSIX_FLAGS_ENABLE);
769

770
	msix_program_entries(dev, entries);
771

772
	ret = populate_msi_sysfs(dev);
773 774
	if (ret)
		goto out_free;
775

776
	/* Set MSI-X enabled bits and unmask the function */
777
	pci_intx_for_msi(dev, 0);
778
	dev->msix_enabled = 1;
779
	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
780

781
	pcibios_free_irq(dev);
L
Linus Torvalds 已提交
782
	return 0;
783

784
out_avail:
785 786 787 788 789
	if (ret < 0) {
		/*
		 * If we had some success, report the number of irqs
		 * we succeeded in setting up.
		 */
790
		struct msi_desc *entry;
791 792
		int avail = 0;

793
		for_each_pci_msi_entry(entry, dev) {
794 795 796 797 798 799 800
			if (entry->irq != 0)
				avail++;
		}
		if (avail != 0)
			ret = avail;
	}

801
out_free:
802 803 804
	free_msi_irqs(dev);

	return ret;
L
Linus Torvalds 已提交
805 806
}

807
/**
808
 * pci_msi_supported - check whether MSI may be enabled on a device
809
 * @dev: pointer to the pci_dev data structure of MSI device function
810
 * @nvec: how many MSIs have been requested ?
811
 *
812
 * Look at global flags, the device itself, and its parent buses
813
 * to determine if MSI/-X are supported for the device. If MSI/-X is
814
 * supported return 1, else return 0.
815
 **/
816
static int pci_msi_supported(struct pci_dev *dev, int nvec)
817 818 819
{
	struct pci_bus *bus;

820
	/* MSI must be globally enabled and supported by the device */
821
	if (!pci_msi_enable)
822
		return 0;
823 824

	if (!dev || dev->no_msi || dev->current_state != PCI_D0)
825
		return 0;
826

827 828 829 830 831 832
	/*
	 * You can't ask to have 0 or less MSIs configured.
	 *  a) it's stupid ..
	 *  b) the list manipulation code assumes nvec >= 1.
	 */
	if (nvec < 1)
833
		return 0;
834

H
Hidetoshi Seto 已提交
835 836 837
	/*
	 * Any bridge which does NOT route MSI transactions from its
	 * secondary bus to its primary bus must set NO_MSI flag on
838 839 840 841
	 * the secondary pci_bus.
	 * We expect only arch-specific PCI host bus controller driver
	 * or quirks for specific PCI bridges to be setting NO_MSI.
	 */
842 843
	for (bus = dev->bus; bus; bus = bus->parent)
		if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
844
			return 0;
845

846
	return 1;
847 848
}

849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
/**
 * pci_msi_vec_count - Return the number of MSI vectors a device can send
 * @dev: device to report about
 *
 * This function returns the number of MSI vectors a device requested via
 * Multiple Message Capable register. It returns a negative errno if the
 * device is not capable sending MSI interrupts. Otherwise, the call succeeds
 * and returns a power of two, up to a maximum of 2^5 (32), according to the
 * MSI specification.
 **/
int pci_msi_vec_count(struct pci_dev *dev)
{
	int ret;
	u16 msgctl;

	if (!dev->msi_cap)
		return -EINVAL;

	pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &msgctl);
	ret = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);

	return ret;
}
EXPORT_SYMBOL(pci_msi_vec_count);

874
void pci_msi_shutdown(struct pci_dev *dev)
L
Linus Torvalds 已提交
875
{
876 877
	struct msi_desc *desc;
	u32 mask;
L
Linus Torvalds 已提交
878

879
	if (!pci_msi_enable || !dev || !dev->msi_enabled)
E
Eric W. Biederman 已提交
880 881
		return;

882
	BUG_ON(list_empty(dev_to_msi_list(&dev->dev)));
883
	desc = first_pci_msi_entry(dev);
884

885
	pci_msi_set_enable(dev, 0);
886
	pci_intx_for_msi(dev, 1);
887
	dev->msi_enabled = 0;
888

889
	/* Return the device with MSI unmasked as initial states */
890
	mask = msi_mask(desc->msi_attrib.multi_cap);
891
	/* Keep cached state to be restored */
892
	__pci_msi_desc_mask_irq(desc, mask, ~mask);
893 894

	/* Restore dev->irq to its default pin-assertion irq */
895
	dev->irq = desc->msi_attrib.default_irq;
896
	pcibios_alloc_irq(dev);
897
}
898

H
Hidetoshi Seto 已提交
899
void pci_disable_msi(struct pci_dev *dev)
900 901 902 903 904
{
	if (!pci_msi_enable || !dev || !dev->msi_enabled)
		return;

	pci_msi_shutdown(dev);
905
	free_msi_irqs(dev);
L
Linus Torvalds 已提交
906
}
907
EXPORT_SYMBOL(pci_disable_msi);
L
Linus Torvalds 已提交
908

909
/**
910
 * pci_msix_vec_count - return the number of device's MSI-X table entries
911
 * @dev: pointer to the pci_dev data structure of MSI-X device function
912 913 914 915 916 917
 * This function returns the number of device's MSI-X table entries and
 * therefore the number of MSI-X vectors device is capable of sending.
 * It returns a negative errno if the device is not capable of sending MSI-X
 * interrupts.
 **/
int pci_msix_vec_count(struct pci_dev *dev)
918 919 920
{
	u16 control;

921
	if (!dev->msix_cap)
922
		return -EINVAL;
923

924
	pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &control);
925
	return msix_table_size(control);
926
}
927
EXPORT_SYMBOL(pci_msix_vec_count);
928

L
Linus Torvalds 已提交
929 930 931
/**
 * pci_enable_msix - configure device's MSI-X capability structure
 * @dev: pointer to the pci_dev data structure of MSI-X device function
932
 * @entries: pointer to an array of MSI-X entries
933
 * @nvec: number of MSI-X irqs requested for allocation by device driver
L
Linus Torvalds 已提交
934 935
 *
 * Setup the MSI-X capability structure of device function with the number
936
 * of requested irqs upon its software driver call to request for
L
Linus Torvalds 已提交
937 938
 * MSI-X mode enabled on its hardware device function. A return of zero
 * indicates the successful configuration of MSI-X capability structure
939
 * with new allocated MSI-X irqs. A return of < 0 indicates a failure.
L
Linus Torvalds 已提交
940
 * Or a return of > 0 indicates that driver request is exceeding the number
941 942
 * of irqs or MSI-X vectors available. Driver should use the returned value to
 * re-send its request.
L
Linus Torvalds 已提交
943
 **/
H
Hidetoshi Seto 已提交
944
int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
L
Linus Torvalds 已提交
945
{
946
	int nr_entries;
E
Eric W. Biederman 已提交
947
	int i, j;
L
Linus Torvalds 已提交
948

949 950
	if (!pci_msi_supported(dev, nvec))
		return -EINVAL;
951

952 953 954
	if (!entries)
		return -EINVAL;

955 956 957
	nr_entries = pci_msix_vec_count(dev);
	if (nr_entries < 0)
		return nr_entries;
L
Linus Torvalds 已提交
958
	if (nvec > nr_entries)
959
		return nr_entries;
L
Linus Torvalds 已提交
960 961 962 963 964 965 966 967 968 969

	/* Check for any invalid entries */
	for (i = 0; i < nvec; i++) {
		if (entries[i].entry >= nr_entries)
			return -EINVAL;		/* invalid entry */
		for (j = i + 1; j < nvec; j++) {
			if (entries[i].entry == entries[j].entry)
				return -EINVAL;	/* duplicate entry */
		}
	}
E
Eric W. Biederman 已提交
970
	WARN_ON(!!dev->msix_enabled);
971

972
	/* Check whether driver already requested for MSI irq */
H
Hidetoshi Seto 已提交
973
	if (dev->msi_enabled) {
974
		dev_info(&dev->dev, "can't enable MSI-X (MSI IRQ already assigned)\n");
L
Linus Torvalds 已提交
975 976
		return -EINVAL;
	}
977
	return msix_capability_init(dev, entries, nvec);
L
Linus Torvalds 已提交
978
}
979
EXPORT_SYMBOL(pci_enable_msix);
L
Linus Torvalds 已提交
980

H
Hidetoshi Seto 已提交
981
void pci_msix_shutdown(struct pci_dev *dev)
982
{
983 984
	struct msi_desc *entry;

985
	if (!pci_msi_enable || !dev || !dev->msix_enabled)
E
Eric W. Biederman 已提交
986 987
		return;

988
	/* Return the device with MSI-X masked as initial states */
989
	for_each_pci_msi_entry(entry, dev) {
990
		/* Keep cached states to be restored */
991
		__pci_msix_desc_mask_irq(entry, 1);
992 993
	}

994
	pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
995
	pci_intx_for_msi(dev, 1);
996
	dev->msix_enabled = 0;
997
	pcibios_alloc_irq(dev);
998
}
999

H
Hidetoshi Seto 已提交
1000
void pci_disable_msix(struct pci_dev *dev)
1001 1002 1003 1004 1005
{
	if (!pci_msi_enable || !dev || !dev->msix_enabled)
		return;

	pci_msix_shutdown(dev);
1006
	free_msi_irqs(dev);
L
Linus Torvalds 已提交
1007
}
1008
EXPORT_SYMBOL(pci_disable_msix);
L
Linus Torvalds 已提交
1009

1010 1011 1012 1013
void pci_no_msi(void)
{
	pci_msi_enable = 0;
}
1014

1015 1016 1017 1018 1019 1020 1021
/**
 * pci_msi_enabled - is MSI enabled?
 *
 * Returns true if MSI has not been disabled by the command-line option
 * pci=nomsi.
 **/
int pci_msi_enabled(void)
1022
{
1023
	return pci_msi_enable;
1024
}
1025
EXPORT_SYMBOL(pci_msi_enabled);
1026

1027
void pci_msi_init_pci_dev(struct pci_dev *dev)
1028 1029
{
}
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044

/**
 * pci_enable_msi_range - configure device's MSI capability structure
 * @dev: device to configure
 * @minvec: minimal number of interrupts to configure
 * @maxvec: maximum number of interrupts to configure
 *
 * This function tries to allocate a maximum possible number of interrupts in a
 * range between @minvec and @maxvec. It returns a negative errno if an error
 * occurs. If it succeeds, it returns the actual number of interrupts allocated
 * and updates the @dev's irq member to the lowest new interrupt number;
 * the other interrupt numbers allocated to this device are consecutive.
 **/
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)
{
1045
	int nvec;
1046 1047
	int rc;

1048 1049
	if (!pci_msi_supported(dev, minvec))
		return -EINVAL;
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059

	WARN_ON(!!dev->msi_enabled);

	/* Check whether driver already requested MSI-X irqs */
	if (dev->msix_enabled) {
		dev_info(&dev->dev,
			 "can't enable MSI (MSI-X already enabled)\n");
		return -EINVAL;
	}

1060 1061 1062
	if (maxvec < minvec)
		return -ERANGE;

1063 1064 1065 1066 1067 1068 1069 1070
	nvec = pci_msi_vec_count(dev);
	if (nvec < 0)
		return nvec;
	else if (nvec < minvec)
		return -EINVAL;
	else if (nvec > maxvec)
		nvec = maxvec;

1071
	do {
1072
		rc = msi_capability_init(dev, nvec);
1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123
		if (rc < 0) {
			return rc;
		} else if (rc > 0) {
			if (rc < minvec)
				return -ENOSPC;
			nvec = rc;
		}
	} while (rc);

	return nvec;
}
EXPORT_SYMBOL(pci_enable_msi_range);

/**
 * pci_enable_msix_range - configure device's MSI-X capability structure
 * @dev: pointer to the pci_dev data structure of MSI-X device function
 * @entries: pointer to an array of MSI-X entries
 * @minvec: minimum number of MSI-X irqs requested
 * @maxvec: maximum number of MSI-X irqs requested
 *
 * Setup the MSI-X capability structure of device function with a maximum
 * possible number of interrupts in the range between @minvec and @maxvec
 * upon its software driver call to request for MSI-X mode enabled on its
 * hardware device function. It returns a negative errno if an error occurs.
 * If it succeeds, it returns the actual number of interrupts allocated and
 * indicates the successful configuration of MSI-X capability structure
 * with new allocated MSI-X interrupts.
 **/
int pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries,
			       int minvec, int maxvec)
{
	int nvec = maxvec;
	int rc;

	if (maxvec < minvec)
		return -ERANGE;

	do {
		rc = pci_enable_msix(dev, entries, nvec);
		if (rc < 0) {
			return rc;
		} else if (rc > 0) {
			if (rc < minvec)
				return -ENOSPC;
			nvec = rc;
		}
	} while (rc);

	return nvec;
}
EXPORT_SYMBOL(pci_enable_msix_range);
1124

1125 1126 1127 1128 1129
struct pci_dev *msi_desc_to_pci_dev(struct msi_desc *desc)
{
	return to_pci_dev(desc->dev);
}

1130 1131 1132 1133 1134 1135 1136 1137
void *msi_desc_to_pci_sysdata(struct msi_desc *desc)
{
	struct pci_dev *dev = msi_desc_to_pci_dev(desc);

	return dev->bus->sysdata;
}
EXPORT_SYMBOL_GPL(msi_desc_to_pci_sysdata);

1138 1139 1140 1141 1142 1143 1144 1145
#ifdef CONFIG_PCI_MSI_IRQ_DOMAIN
/**
 * pci_msi_domain_write_msg - Helper to write MSI message to PCI config space
 * @irq_data:	Pointer to interrupt data of the MSI interrupt
 * @msg:	Pointer to the message
 */
void pci_msi_domain_write_msg(struct irq_data *irq_data, struct msi_msg *msg)
{
1146
	struct msi_desc *desc = irq_data_get_msi_desc(irq_data);
1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252

	/*
	 * For MSI-X desc->irq is always equal to irq_data->irq. For
	 * MSI only the first interrupt of MULTI MSI passes the test.
	 */
	if (desc->irq == irq_data->irq)
		__pci_write_msi_msg(desc, msg);
}

/**
 * pci_msi_domain_calc_hwirq - Generate a unique ID for an MSI source
 * @dev:	Pointer to the PCI device
 * @desc:	Pointer to the msi descriptor
 *
 * The ID number is only used within the irqdomain.
 */
irq_hw_number_t pci_msi_domain_calc_hwirq(struct pci_dev *dev,
					  struct msi_desc *desc)
{
	return (irq_hw_number_t)desc->msi_attrib.entry_nr |
		PCI_DEVID(dev->bus->number, dev->devfn) << 11 |
		(pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
}

static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
{
	return !desc->msi_attrib.is_msix && desc->nvec_used > 1;
}

/**
 * pci_msi_domain_check_cap - Verify that @domain supports the capabilities for @dev
 * @domain:	The interrupt domain to check
 * @info:	The domain info for verification
 * @dev:	The device to check
 *
 * Returns:
 *  0 if the functionality is supported
 *  1 if Multi MSI is requested, but the domain does not support it
 *  -ENOTSUPP otherwise
 */
int pci_msi_domain_check_cap(struct irq_domain *domain,
			     struct msi_domain_info *info, struct device *dev)
{
	struct msi_desc *desc = first_pci_msi_entry(to_pci_dev(dev));

	/* Special handling to support pci_enable_msi_range() */
	if (pci_msi_desc_is_multi_msi(desc) &&
	    !(info->flags & MSI_FLAG_MULTI_PCI_MSI))
		return 1;
	else if (desc->msi_attrib.is_msix && !(info->flags & MSI_FLAG_PCI_MSIX))
		return -ENOTSUPP;

	return 0;
}

static int pci_msi_domain_handle_error(struct irq_domain *domain,
				       struct msi_desc *desc, int error)
{
	/* Special handling to support pci_enable_msi_range() */
	if (pci_msi_desc_is_multi_msi(desc) && error == -ENOSPC)
		return 1;

	return error;
}

#ifdef GENERIC_MSI_DOMAIN_OPS
static void pci_msi_domain_set_desc(msi_alloc_info_t *arg,
				    struct msi_desc *desc)
{
	arg->desc = desc;
	arg->hwirq = pci_msi_domain_calc_hwirq(msi_desc_to_pci_dev(desc),
					       desc);
}
#else
#define pci_msi_domain_set_desc		NULL
#endif

static struct msi_domain_ops pci_msi_domain_ops_default = {
	.set_desc	= pci_msi_domain_set_desc,
	.msi_check	= pci_msi_domain_check_cap,
	.handle_error	= pci_msi_domain_handle_error,
};

static void pci_msi_domain_update_dom_ops(struct msi_domain_info *info)
{
	struct msi_domain_ops *ops = info->ops;

	if (ops == NULL) {
		info->ops = &pci_msi_domain_ops_default;
	} else {
		if (ops->set_desc == NULL)
			ops->set_desc = pci_msi_domain_set_desc;
		if (ops->msi_check == NULL)
			ops->msi_check = pci_msi_domain_check_cap;
		if (ops->handle_error == NULL)
			ops->handle_error = pci_msi_domain_handle_error;
	}
}

static void pci_msi_domain_update_chip_ops(struct msi_domain_info *info)
{
	struct irq_chip *chip = info->chip;

	BUG_ON(!chip);
	if (!chip->irq_write_msi_msg)
		chip->irq_write_msi_msg = pci_msi_domain_write_msg;
1253 1254 1255 1256
	if (!chip->irq_mask)
		chip->irq_mask = pci_msi_mask_irq;
	if (!chip->irq_unmask)
		chip->irq_unmask = pci_msi_unmask_irq;
1257 1258 1259
}

/**
1260 1261
 * pci_msi_create_irq_domain - Create a MSI interrupt domain
 * @fwnode:	Optional fwnode of the interrupt controller
1262 1263 1264 1265 1266 1267 1268 1269
 * @info:	MSI domain info
 * @parent:	Parent irq domain
 *
 * Updates the domain and chip ops and creates a MSI interrupt domain.
 *
 * Returns:
 * A domain pointer or NULL in case of failure.
 */
1270
struct irq_domain *pci_msi_create_irq_domain(struct fwnode_handle *fwnode,
1271 1272 1273
					     struct msi_domain_info *info,
					     struct irq_domain *parent)
{
1274 1275
	struct irq_domain *domain;

1276 1277 1278 1279 1280
	if (info->flags & MSI_FLAG_USE_DEF_DOM_OPS)
		pci_msi_domain_update_dom_ops(info);
	if (info->flags & MSI_FLAG_USE_DEF_CHIP_OPS)
		pci_msi_domain_update_chip_ops(info);

1281
	domain = msi_create_irq_domain(fwnode, info, parent);
1282 1283 1284 1285 1286
	if (!domain)
		return NULL;

	domain->bus_token = DOMAIN_BUS_PCI_MSI;
	return domain;
1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313
}

/**
 * pci_msi_domain_alloc_irqs - Allocate interrupts for @dev in @domain
 * @domain:	The interrupt domain to allocate from
 * @dev:	The device for which to allocate
 * @nvec:	The number of interrupts to allocate
 * @type:	Unused to allow simpler migration from the arch_XXX interfaces
 *
 * Returns:
 * A virtual interrupt number or an error code in case of failure
 */
int pci_msi_domain_alloc_irqs(struct irq_domain *domain, struct pci_dev *dev,
			      int nvec, int type)
{
	return msi_domain_alloc_irqs(domain, &dev->dev, nvec);
}

/**
 * pci_msi_domain_free_irqs - Free interrupts for @dev in @domain
 * @domain:	The interrupt domain
 * @dev:	The device for which to free interrupts
 */
void pci_msi_domain_free_irqs(struct irq_domain *domain, struct pci_dev *dev)
{
	msi_domain_free_irqs(domain, &dev->dev);
}
1314 1315 1316

/**
 * pci_msi_create_default_irq_domain - Create a default MSI interrupt domain
1317
 * @fwnode:	Optional fwnode of the interrupt controller
1318 1319 1320 1321 1322 1323
 * @info:	MSI domain info
 * @parent:	Parent irq domain
 *
 * Returns: A domain pointer or NULL in case of failure. If successful
 * the default PCI/MSI irqdomain pointer is updated.
 */
1324
struct irq_domain *pci_msi_create_default_irq_domain(struct fwnode_handle *fwnode,
1325 1326 1327 1328 1329 1330 1331 1332 1333
		struct msi_domain_info *info, struct irq_domain *parent)
{
	struct irq_domain *domain;

	mutex_lock(&pci_msi_domain_lock);
	if (pci_msi_default_domain) {
		pr_err("PCI: default irq domain for PCI MSI has already been created.\n");
		domain = NULL;
	} else {
1334
		domain = pci_msi_create_irq_domain(fwnode, info, parent);
1335 1336 1337 1338 1339 1340
		pci_msi_default_domain = domain;
	}
	mutex_unlock(&pci_msi_domain_lock);

	return domain;
}
1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371

static int get_msi_id_cb(struct pci_dev *pdev, u16 alias, void *data)
{
	u32 *pa = data;

	*pa = alias;
	return 0;
}
/**
 * pci_msi_domain_get_msi_rid - Get the MSI requester id (RID)
 * @domain:	The interrupt domain
 * @pdev:	The PCI device.
 *
 * The RID for a device is formed from the alias, with a firmware
 * supplied mapping applied
 *
 * Returns: The RID.
 */
u32 pci_msi_domain_get_msi_rid(struct irq_domain *domain, struct pci_dev *pdev)
{
	struct device_node *of_node;
	u32 rid = 0;

	pci_for_each_dma_alias(pdev, get_msi_id_cb, &rid);

	of_node = irq_domain_get_of_node(domain);
	if (of_node)
		rid = of_msi_map_rid(&pdev->dev, of_node, rid);

	return rid;
}
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388

/**
 * pci_msi_get_device_domain - Get the MSI domain for a given PCI device
 * @pdev:	The PCI device
 *
 * Use the firmware data to find a device-specific MSI domain
 * (i.e. not one that is ste as a default).
 *
 * Returns: The coresponding MSI domain or NULL if none has been found.
 */
struct irq_domain *pci_msi_get_device_domain(struct pci_dev *pdev)
{
	u32 rid = 0;

	pci_for_each_dma_alias(pdev, get_msi_id_cb, &rid);
	return of_msi_map_get_device_domain(&pdev->dev, rid);
}
1389
#endif /* CONFIG_PCI_MSI_IRQ_DOMAIN */