PCI: MSI: Remove unsafe and unnecessary hardware access
[firefly-linux-kernel-4.4.55.git] / drivers / pci / msi.c
1 /*
2  * File:        msi.c
3  * Purpose:     PCI Message Signaled Interrupt (MSI)
4  *
5  * Copyright (C) 2003-2004 Intel
6  * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
7  */
8
9 #include <linux/err.h>
10 #include <linux/mm.h>
11 #include <linux/irq.h>
12 #include <linux/interrupt.h>
13 #include <linux/init.h>
14 #include <linux/ioport.h>
15 #include <linux/pci.h>
16 #include <linux/proc_fs.h>
17 #include <linux/msi.h>
18 #include <linux/smp.h>
19 #include <linux/errno.h>
20 #include <linux/io.h>
21
22 #include "pci.h"
23 #include "msi.h"
24
25 static int pci_msi_enable = 1;
26
27 /* Arch hooks */
28
29 #ifndef arch_msi_check_device
30 int arch_msi_check_device(struct pci_dev *dev, int nvec, int type)
31 {
32         return 0;
33 }
34 #endif
35
36 #ifndef arch_setup_msi_irqs
37 int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
38 {
39         struct msi_desc *entry;
40         int ret;
41
42         /*
43          * If an architecture wants to support multiple MSI, it needs to
44          * override arch_setup_msi_irqs()
45          */
46         if (type == PCI_CAP_ID_MSI && nvec > 1)
47                 return 1;
48
49         list_for_each_entry(entry, &dev->msi_list, list) {
50                 ret = arch_setup_msi_irq(dev, entry);
51                 if (ret < 0)
52                         return ret;
53                 if (ret > 0)
54                         return -ENOSPC;
55         }
56
57         return 0;
58 }
59 #endif
60
61 #ifndef arch_teardown_msi_irqs
62 void arch_teardown_msi_irqs(struct pci_dev *dev)
63 {
64         struct msi_desc *entry;
65
66         list_for_each_entry(entry, &dev->msi_list, list) {
67                 int i, nvec;
68                 if (entry->irq == 0)
69                         continue;
70                 nvec = 1 << entry->msi_attrib.multiple;
71                 for (i = 0; i < nvec; i++)
72                         arch_teardown_msi_irq(entry->irq + i);
73         }
74 }
75 #endif
76
77 static void msi_set_enable(struct pci_dev *dev, int pos, int enable)
78 {
79         u16 control;
80
81         BUG_ON(!pos);
82
83         pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
84         control &= ~PCI_MSI_FLAGS_ENABLE;
85         if (enable)
86                 control |= PCI_MSI_FLAGS_ENABLE;
87         pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control);
88 }
89
90 static void msix_set_enable(struct pci_dev *dev, int enable)
91 {
92         int pos;
93         u16 control;
94
95         pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
96         if (pos) {
97                 pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control);
98                 control &= ~PCI_MSIX_FLAGS_ENABLE;
99                 if (enable)
100                         control |= PCI_MSIX_FLAGS_ENABLE;
101                 pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
102         }
103 }
104
105 static inline __attribute_const__ u32 msi_mask(unsigned x)
106 {
107         /* Don't shift by >= width of type */
108         if (x >= 5)
109                 return 0xffffffff;
110         return (1 << (1 << x)) - 1;
111 }
112
113 static inline __attribute_const__ u32 msi_capable_mask(u16 control)
114 {
115         return msi_mask((control >> 1) & 7);
116 }
117
118 static inline __attribute_const__ u32 msi_enabled_mask(u16 control)
119 {
120         return msi_mask((control >> 4) & 7);
121 }
122
123 /*
124  * PCI 2.3 does not specify mask bits for each MSI interrupt.  Attempting to
125  * mask all MSI interrupts by clearing the MSI enable bit does not work
126  * reliably as devices without an INTx disable bit will then generate a
127  * level IRQ which will never be cleared.
128  */
129 static u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
130 {
131         u32 mask_bits = desc->masked;
132
133         if (!desc->msi_attrib.maskbit)
134                 return 0;
135
136         mask_bits &= ~mask;
137         mask_bits |= flag;
138         pci_write_config_dword(desc->dev, desc->mask_pos, mask_bits);
139
140         return mask_bits;
141 }
142
143 static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
144 {
145         desc->masked = __msi_mask_irq(desc, mask, flag);
146 }
147
148 /*
149  * This internal function does not flush PCI writes to the device.
150  * All users must ensure that they read from the device before either
151  * assuming that the device state is up to date, or returning out of this
152  * file.  This saves a few milliseconds when initialising devices with lots
153  * of MSI-X interrupts.
154  */
155 static u32 __msix_mask_irq(struct msi_desc *desc, u32 flag)
156 {
157         u32 mask_bits = desc->masked;
158         unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
159                                                 PCI_MSIX_ENTRY_VECTOR_CTRL;
160         mask_bits &= ~1;
161         mask_bits |= flag;
162         writel(mask_bits, desc->mask_base + offset);
163
164         return mask_bits;
165 }
166
167 static void msix_mask_irq(struct msi_desc *desc, u32 flag)
168 {
169         desc->masked = __msix_mask_irq(desc, flag);
170 }
171
172 static void msi_set_mask_bit(unsigned irq, u32 flag)
173 {
174         struct msi_desc *desc = get_irq_msi(irq);
175
176         if (desc->msi_attrib.is_msix) {
177                 msix_mask_irq(desc, flag);
178                 readl(desc->mask_base);         /* Flush write to device */
179         } else {
180                 unsigned offset = irq - desc->dev->irq;
181                 msi_mask_irq(desc, 1 << offset, flag << offset);
182         }
183 }
184
185 void mask_msi_irq(unsigned int irq)
186 {
187         msi_set_mask_bit(irq, 1);
188 }
189
190 void unmask_msi_irq(unsigned int irq)
191 {
192         msi_set_mask_bit(irq, 0);
193 }
194
195 void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
196 {
197         struct msi_desc *entry = get_irq_desc_msi(desc);
198
199         /* We do not touch the hardware (which may not even be
200          * accessible at the moment) but return the last message
201          * written.  Assert that this is valid, assuming that
202          * valid messages are not all-zeroes. */
203         BUG_ON(!(entry->msg.address_hi | entry->msg.address_lo |
204                  entry->msg.data));
205
206         *msg = entry->msg;
207 }
208
209 void read_msi_msg(unsigned int irq, struct msi_msg *msg)
210 {
211         struct irq_desc *desc = irq_to_desc(irq);
212
213         read_msi_msg_desc(desc, msg);
214 }
215
216 void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg)
217 {
218         struct msi_desc *entry = get_irq_desc_msi(desc);
219
220         if (entry->dev->current_state != PCI_D0) {
221                 /* Don't touch the hardware now */
222         } else if (entry->msi_attrib.is_msix) {
223                 void __iomem *base;
224                 base = entry->mask_base +
225                         entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE;
226
227                 writel(msg->address_lo, base + PCI_MSIX_ENTRY_LOWER_ADDR);
228                 writel(msg->address_hi, base + PCI_MSIX_ENTRY_UPPER_ADDR);
229                 writel(msg->data, base + PCI_MSIX_ENTRY_DATA);
230         } else {
231                 struct pci_dev *dev = entry->dev;
232                 int pos = entry->msi_attrib.pos;
233                 u16 msgctl;
234
235                 pci_read_config_word(dev, msi_control_reg(pos), &msgctl);
236                 msgctl &= ~PCI_MSI_FLAGS_QSIZE;
237                 msgctl |= entry->msi_attrib.multiple << 4;
238                 pci_write_config_word(dev, msi_control_reg(pos), msgctl);
239
240                 pci_write_config_dword(dev, msi_lower_address_reg(pos),
241                                         msg->address_lo);
242                 if (entry->msi_attrib.is_64) {
243                         pci_write_config_dword(dev, msi_upper_address_reg(pos),
244                                                 msg->address_hi);
245                         pci_write_config_word(dev, msi_data_reg(pos, 1),
246                                                 msg->data);
247                 } else {
248                         pci_write_config_word(dev, msi_data_reg(pos, 0),
249                                                 msg->data);
250                 }
251         }
252         entry->msg = *msg;
253 }
254
255 void write_msi_msg(unsigned int irq, struct msi_msg *msg)
256 {
257         struct irq_desc *desc = irq_to_desc(irq);
258
259         write_msi_msg_desc(desc, msg);
260 }
261
262 static void free_msi_irqs(struct pci_dev *dev)
263 {
264         struct msi_desc *entry, *tmp;
265
266         list_for_each_entry(entry, &dev->msi_list, list) {
267                 int i, nvec;
268                 if (!entry->irq)
269                         continue;
270                 nvec = 1 << entry->msi_attrib.multiple;
271                 for (i = 0; i < nvec; i++)
272                         BUG_ON(irq_has_action(entry->irq + i));
273         }
274
275         arch_teardown_msi_irqs(dev);
276
277         list_for_each_entry_safe(entry, tmp, &dev->msi_list, list) {
278                 if (entry->msi_attrib.is_msix) {
279                         if (list_is_last(&entry->list, &dev->msi_list))
280                                 iounmap(entry->mask_base);
281                 }
282                 list_del(&entry->list);
283                 kfree(entry);
284         }
285 }
286
287 static struct msi_desc *alloc_msi_entry(struct pci_dev *dev)
288 {
289         struct msi_desc *desc = kzalloc(sizeof(*desc), GFP_KERNEL);
290         if (!desc)
291                 return NULL;
292
293         INIT_LIST_HEAD(&desc->list);
294         desc->dev = dev;
295
296         return desc;
297 }
298
299 static void pci_intx_for_msi(struct pci_dev *dev, int enable)
300 {
301         if (!(dev->dev_flags & PCI_DEV_FLAGS_MSI_INTX_DISABLE_BUG))
302                 pci_intx(dev, enable);
303 }
304
305 static void __pci_restore_msi_state(struct pci_dev *dev)
306 {
307         int pos;
308         u16 control;
309         struct msi_desc *entry;
310
311         if (!dev->msi_enabled)
312                 return;
313
314         entry = get_irq_msi(dev->irq);
315         pos = entry->msi_attrib.pos;
316
317         pci_intx_for_msi(dev, 0);
318         msi_set_enable(dev, pos, 0);
319         write_msi_msg(dev->irq, &entry->msg);
320
321         pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control);
322         msi_mask_irq(entry, msi_capable_mask(control), entry->masked);
323         control &= ~PCI_MSI_FLAGS_QSIZE;
324         control |= (entry->msi_attrib.multiple << 4) | PCI_MSI_FLAGS_ENABLE;
325         pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control);
326 }
327
328 static void __pci_restore_msix_state(struct pci_dev *dev)
329 {
330         int pos;
331         struct msi_desc *entry;
332         u16 control;
333
334         if (!dev->msix_enabled)
335                 return;
336         BUG_ON(list_empty(&dev->msi_list));
337         entry = list_first_entry(&dev->msi_list, struct msi_desc, list);
338         pos = entry->msi_attrib.pos;
339         pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control);
340
341         /* route the table */
342         pci_intx_for_msi(dev, 0);
343         control |= PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL;
344         pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
345
346         list_for_each_entry(entry, &dev->msi_list, list) {
347                 write_msi_msg(entry->irq, &entry->msg);
348                 msix_mask_irq(entry, entry->masked);
349         }
350
351         control &= ~PCI_MSIX_FLAGS_MASKALL;
352         pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
353 }
354
355 void pci_restore_msi_state(struct pci_dev *dev)
356 {
357         __pci_restore_msi_state(dev);
358         __pci_restore_msix_state(dev);
359 }
360 EXPORT_SYMBOL_GPL(pci_restore_msi_state);
361
362 /**
363  * msi_capability_init - configure device's MSI capability structure
364  * @dev: pointer to the pci_dev data structure of MSI device function
365  * @nvec: number of interrupts to allocate
366  *
367  * Setup the MSI capability structure of the device with the requested
368  * number of interrupts.  A return value of zero indicates the successful
369  * setup of an entry with the new MSI irq.  A negative return value indicates
370  * an error, and a positive return value indicates the number of interrupts
371  * which could have been allocated.
372  */
373 static int msi_capability_init(struct pci_dev *dev, int nvec)
374 {
375         struct msi_desc *entry;
376         int pos, ret;
377         u16 control;
378         unsigned mask;
379
380         pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
381         msi_set_enable(dev, pos, 0);    /* Disable MSI during set up */
382
383         pci_read_config_word(dev, msi_control_reg(pos), &control);
384         /* MSI Entry Initialization */
385         entry = alloc_msi_entry(dev);
386         if (!entry)
387                 return -ENOMEM;
388
389         entry->msi_attrib.is_msix       = 0;
390         entry->msi_attrib.is_64         = is_64bit_address(control);
391         entry->msi_attrib.entry_nr      = 0;
392         entry->msi_attrib.maskbit       = is_mask_bit_support(control);
393         entry->msi_attrib.default_irq   = dev->irq;     /* Save IOAPIC IRQ */
394         entry->msi_attrib.pos           = pos;
395
396         entry->mask_pos = msi_mask_reg(pos, entry->msi_attrib.is_64);
397         /* All MSIs are unmasked by default, Mask them all */
398         if (entry->msi_attrib.maskbit)
399                 pci_read_config_dword(dev, entry->mask_pos, &entry->masked);
400         mask = msi_capable_mask(control);
401         msi_mask_irq(entry, mask, mask);
402
403         list_add_tail(&entry->list, &dev->msi_list);
404
405         /* Configure MSI capability structure */
406         ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSI);
407         if (ret) {
408                 msi_mask_irq(entry, mask, ~mask);
409                 free_msi_irqs(dev);
410                 return ret;
411         }
412
413         /* Set MSI enabled bits  */
414         pci_intx_for_msi(dev, 0);
415         msi_set_enable(dev, pos, 1);
416         dev->msi_enabled = 1;
417
418         dev->irq = entry->irq;
419         return 0;
420 }
421
422 static void __iomem *msix_map_region(struct pci_dev *dev, unsigned pos,
423                                                         unsigned nr_entries)
424 {
425         unsigned long phys_addr;
426         u32 table_offset;
427         u8 bir;
428
429         pci_read_config_dword(dev, msix_table_offset_reg(pos), &table_offset);
430         bir = (u8)(table_offset & PCI_MSIX_FLAGS_BIRMASK);
431         table_offset &= ~PCI_MSIX_FLAGS_BIRMASK;
432         phys_addr = pci_resource_start(dev, bir) + table_offset;
433
434         return ioremap_nocache(phys_addr, nr_entries * PCI_MSIX_ENTRY_SIZE);
435 }
436
437 static int msix_setup_entries(struct pci_dev *dev, unsigned pos,
438                                 void __iomem *base, struct msix_entry *entries,
439                                 int nvec)
440 {
441         struct msi_desc *entry;
442         int i;
443
444         for (i = 0; i < nvec; i++) {
445                 entry = alloc_msi_entry(dev);
446                 if (!entry) {
447                         if (!i)
448                                 iounmap(base);
449                         else
450                                 free_msi_irqs(dev);
451                         /* No enough memory. Don't try again */
452                         return -ENOMEM;
453                 }
454
455                 entry->msi_attrib.is_msix       = 1;
456                 entry->msi_attrib.is_64         = 1;
457                 entry->msi_attrib.entry_nr      = entries[i].entry;
458                 entry->msi_attrib.default_irq   = dev->irq;
459                 entry->msi_attrib.pos           = pos;
460                 entry->mask_base                = base;
461
462                 list_add_tail(&entry->list, &dev->msi_list);
463         }
464
465         return 0;
466 }
467
468 static void msix_program_entries(struct pci_dev *dev,
469                                         struct msix_entry *entries)
470 {
471         struct msi_desc *entry;
472         int i = 0;
473
474         list_for_each_entry(entry, &dev->msi_list, list) {
475                 int offset = entries[i].entry * PCI_MSIX_ENTRY_SIZE +
476                                                 PCI_MSIX_ENTRY_VECTOR_CTRL;
477
478                 entries[i].vector = entry->irq;
479                 set_irq_msi(entry->irq, entry);
480                 entry->masked = readl(entry->mask_base + offset);
481                 msix_mask_irq(entry, 1);
482                 i++;
483         }
484 }
485
486 /**
487  * msix_capability_init - configure device's MSI-X capability
488  * @dev: pointer to the pci_dev data structure of MSI-X device function
489  * @entries: pointer to an array of struct msix_entry entries
490  * @nvec: number of @entries
491  *
492  * Setup the MSI-X capability structure of device function with a
493  * single MSI-X irq. A return of zero indicates the successful setup of
494  * requested MSI-X entries with allocated irqs or non-zero for otherwise.
495  **/
496 static int msix_capability_init(struct pci_dev *dev,
497                                 struct msix_entry *entries, int nvec)
498 {
499         int pos, ret;
500         u16 control;
501         void __iomem *base;
502
503         pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
504         pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control);
505
506         /* Ensure MSI-X is disabled while it is set up */
507         control &= ~PCI_MSIX_FLAGS_ENABLE;
508         pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
509
510         /* Request & Map MSI-X table region */
511         base = msix_map_region(dev, pos, multi_msix_capable(control));
512         if (!base)
513                 return -ENOMEM;
514
515         ret = msix_setup_entries(dev, pos, base, entries, nvec);
516         if (ret)
517                 return ret;
518
519         ret = arch_setup_msi_irqs(dev, nvec, PCI_CAP_ID_MSIX);
520         if (ret)
521                 goto error;
522
523         /*
524          * Some devices require MSI-X to be enabled before we can touch the
525          * MSI-X registers.  We need to mask all the vectors to prevent
526          * interrupts coming in before they're fully set up.
527          */
528         control |= PCI_MSIX_FLAGS_MASKALL | PCI_MSIX_FLAGS_ENABLE;
529         pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
530
531         msix_program_entries(dev, entries);
532
533         /* Set MSI-X enabled bits and unmask the function */
534         pci_intx_for_msi(dev, 0);
535         dev->msix_enabled = 1;
536
537         control &= ~PCI_MSIX_FLAGS_MASKALL;
538         pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control);
539
540         return 0;
541
542 error:
543         if (ret < 0) {
544                 /*
545                  * If we had some success, report the number of irqs
546                  * we succeeded in setting up.
547                  */
548                 struct msi_desc *entry;
549                 int avail = 0;
550
551                 list_for_each_entry(entry, &dev->msi_list, list) {
552                         if (entry->irq != 0)
553                                 avail++;
554                 }
555                 if (avail != 0)
556                         ret = avail;
557         }
558
559         free_msi_irqs(dev);
560
561         return ret;
562 }
563
564 /**
565  * pci_msi_check_device - check whether MSI may be enabled on a device
566  * @dev: pointer to the pci_dev data structure of MSI device function
567  * @nvec: how many MSIs have been requested ?
568  * @type: are we checking for MSI or MSI-X ?
569  *
570  * Look at global flags, the device itself, and its parent busses
571  * to determine if MSI/-X are supported for the device. If MSI/-X is
572  * supported return 0, else return an error code.
573  **/
574 static int pci_msi_check_device(struct pci_dev *dev, int nvec, int type)
575 {
576         struct pci_bus *bus;
577         int ret;
578
579         /* MSI must be globally enabled and supported by the device */
580         if (!pci_msi_enable || !dev || dev->no_msi)
581                 return -EINVAL;
582
583         /*
584          * You can't ask to have 0 or less MSIs configured.
585          *  a) it's stupid ..
586          *  b) the list manipulation code assumes nvec >= 1.
587          */
588         if (nvec < 1)
589                 return -ERANGE;
590
591         /*
592          * Any bridge which does NOT route MSI transactions from its
593          * secondary bus to its primary bus must set NO_MSI flag on
594          * the secondary pci_bus.
595          * We expect only arch-specific PCI host bus controller driver
596          * or quirks for specific PCI bridges to be setting NO_MSI.
597          */
598         for (bus = dev->bus; bus; bus = bus->parent)
599                 if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
600                         return -EINVAL;
601
602         ret = arch_msi_check_device(dev, nvec, type);
603         if (ret)
604                 return ret;
605
606         if (!pci_find_capability(dev, type))
607                 return -EINVAL;
608
609         return 0;
610 }
611
612 /**
613  * pci_enable_msi_block - configure device's MSI capability structure
614  * @dev: device to configure
615  * @nvec: number of interrupts to configure
616  *
617  * Allocate IRQs for a device with the MSI capability.
618  * This function returns a negative errno if an error occurs.  If it
619  * is unable to allocate the number of interrupts requested, it returns
620  * the number of interrupts it might be able to allocate.  If it successfully
621  * allocates at least the number of interrupts requested, it returns 0 and
622  * updates the @dev's irq member to the lowest new interrupt number; the
623  * other interrupt numbers allocated to this device are consecutive.
624  */
625 int pci_enable_msi_block(struct pci_dev *dev, unsigned int nvec)
626 {
627         int status, pos, maxvec;
628         u16 msgctl;
629
630         pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
631         if (!pos)
632                 return -EINVAL;
633         pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &msgctl);
634         maxvec = 1 << ((msgctl & PCI_MSI_FLAGS_QMASK) >> 1);
635         if (nvec > maxvec)
636                 return maxvec;
637
638         status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSI);
639         if (status)
640                 return status;
641
642         WARN_ON(!!dev->msi_enabled);
643
644         /* Check whether driver already requested MSI-X irqs */
645         if (dev->msix_enabled) {
646                 dev_info(&dev->dev, "can't enable MSI "
647                          "(MSI-X already enabled)\n");
648                 return -EINVAL;
649         }
650
651         status = msi_capability_init(dev, nvec);
652         return status;
653 }
654 EXPORT_SYMBOL(pci_enable_msi_block);
655
656 void pci_msi_shutdown(struct pci_dev *dev)
657 {
658         struct msi_desc *desc;
659         u32 mask;
660         u16 ctrl;
661         unsigned pos;
662
663         if (!pci_msi_enable || !dev || !dev->msi_enabled)
664                 return;
665
666         BUG_ON(list_empty(&dev->msi_list));
667         desc = list_first_entry(&dev->msi_list, struct msi_desc, list);
668         pos = desc->msi_attrib.pos;
669
670         msi_set_enable(dev, pos, 0);
671         pci_intx_for_msi(dev, 1);
672         dev->msi_enabled = 0;
673
674         /* Return the device with MSI unmasked as initial states */
675         pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &ctrl);
676         mask = msi_capable_mask(ctrl);
677         /* Keep cached state to be restored */
678         __msi_mask_irq(desc, mask, ~mask);
679
680         /* Restore dev->irq to its default pin-assertion irq */
681         dev->irq = desc->msi_attrib.default_irq;
682 }
683
684 void pci_disable_msi(struct pci_dev *dev)
685 {
686         if (!pci_msi_enable || !dev || !dev->msi_enabled)
687                 return;
688
689         pci_msi_shutdown(dev);
690         free_msi_irqs(dev);
691 }
692 EXPORT_SYMBOL(pci_disable_msi);
693
694 /**
695  * pci_msix_table_size - return the number of device's MSI-X table entries
696  * @dev: pointer to the pci_dev data structure of MSI-X device function
697  */
698 int pci_msix_table_size(struct pci_dev *dev)
699 {
700         int pos;
701         u16 control;
702
703         pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
704         if (!pos)
705                 return 0;
706
707         pci_read_config_word(dev, msi_control_reg(pos), &control);
708         return multi_msix_capable(control);
709 }
710
711 /**
712  * pci_enable_msix - configure device's MSI-X capability structure
713  * @dev: pointer to the pci_dev data structure of MSI-X device function
714  * @entries: pointer to an array of MSI-X entries
715  * @nvec: number of MSI-X irqs requested for allocation by device driver
716  *
717  * Setup the MSI-X capability structure of device function with the number
718  * of requested irqs upon its software driver call to request for
719  * MSI-X mode enabled on its hardware device function. A return of zero
720  * indicates the successful configuration of MSI-X capability structure
721  * with new allocated MSI-X irqs. A return of < 0 indicates a failure.
722  * Or a return of > 0 indicates that driver request is exceeding the number
723  * of irqs or MSI-X vectors available. Driver should use the returned value to
724  * re-send its request.
725  **/
726 int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
727 {
728         int status, nr_entries;
729         int i, j;
730
731         if (!entries)
732                 return -EINVAL;
733
734         status = pci_msi_check_device(dev, nvec, PCI_CAP_ID_MSIX);
735         if (status)
736                 return status;
737
738         nr_entries = pci_msix_table_size(dev);
739         if (nvec > nr_entries)
740                 return nr_entries;
741
742         /* Check for any invalid entries */
743         for (i = 0; i < nvec; i++) {
744                 if (entries[i].entry >= nr_entries)
745                         return -EINVAL;         /* invalid entry */
746                 for (j = i + 1; j < nvec; j++) {
747                         if (entries[i].entry == entries[j].entry)
748                                 return -EINVAL; /* duplicate entry */
749                 }
750         }
751         WARN_ON(!!dev->msix_enabled);
752
753         /* Check whether driver already requested for MSI irq */
754         if (dev->msi_enabled) {
755                 dev_info(&dev->dev, "can't enable MSI-X "
756                        "(MSI IRQ already assigned)\n");
757                 return -EINVAL;
758         }
759         status = msix_capability_init(dev, entries, nvec);
760         return status;
761 }
762 EXPORT_SYMBOL(pci_enable_msix);
763
764 void pci_msix_shutdown(struct pci_dev *dev)
765 {
766         struct msi_desc *entry;
767
768         if (!pci_msi_enable || !dev || !dev->msix_enabled)
769                 return;
770
771         /* Return the device with MSI-X masked as initial states */
772         list_for_each_entry(entry, &dev->msi_list, list) {
773                 /* Keep cached states to be restored */
774                 __msix_mask_irq(entry, 1);
775         }
776
777         msix_set_enable(dev, 0);
778         pci_intx_for_msi(dev, 1);
779         dev->msix_enabled = 0;
780 }
781
782 void pci_disable_msix(struct pci_dev *dev)
783 {
784         if (!pci_msi_enable || !dev || !dev->msix_enabled)
785                 return;
786
787         pci_msix_shutdown(dev);
788         free_msi_irqs(dev);
789 }
790 EXPORT_SYMBOL(pci_disable_msix);
791
792 /**
793  * msi_remove_pci_irq_vectors - reclaim MSI(X) irqs to unused state
794  * @dev: pointer to the pci_dev data structure of MSI(X) device function
795  *
796  * Being called during hotplug remove, from which the device function
797  * is hot-removed. All previous assigned MSI/MSI-X irqs, if
798  * allocated for this device function, are reclaimed to unused state,
799  * which may be used later on.
800  **/
801 void msi_remove_pci_irq_vectors(struct pci_dev *dev)
802 {
803         if (!pci_msi_enable || !dev)
804                 return;
805
806         if (dev->msi_enabled || dev->msix_enabled)
807                 free_msi_irqs(dev);
808 }
809
810 void pci_no_msi(void)
811 {
812         pci_msi_enable = 0;
813 }
814
815 /**
816  * pci_msi_enabled - is MSI enabled?
817  *
818  * Returns true if MSI has not been disabled by the command-line option
819  * pci=nomsi.
820  **/
821 int pci_msi_enabled(void)
822 {
823         return pci_msi_enable;
824 }
825 EXPORT_SYMBOL(pci_msi_enabled);
826
827 void pci_msi_init_pci_dev(struct pci_dev *dev)
828 {
829         INIT_LIST_HEAD(&dev->msi_list);
830 }