msi.h 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #include <linux/pci.h>
  3. #include <linux/msi.h>
  4. #define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
  5. extern int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
  6. extern void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
  7. #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
  8. extern int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
  9. extern void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
  10. #else
  11. static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
  12. {
  13. WARN_ON_ONCE(1);
  14. return -ENODEV;
  15. }
  16. static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
  17. {
  18. WARN_ON_ONCE(1);
  19. }
  20. #endif
  21. /*
  22. * PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
  23. * mask all MSI interrupts by clearing the MSI enable bit does not work
  24. * reliably as devices without an INTx disable bit will then generate a
  25. * level IRQ which will never be cleared.
  26. */
  27. static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
  28. {
  29. /* Don't shift by >= width of type */
  30. if (desc->pci.msi_attrib.multi_cap >= 5)
  31. return 0xffffffff;
  32. return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
  33. }