msi.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
  6. void pci_msi_teardown_msi_irqs(struct pci_dev *dev);
  7. /* Mask/unmask helpers */
  8. void pci_msi_update_mask(struct msi_desc *desc, u32 clear, u32 set);
  9. static inline void pci_msi_mask(struct msi_desc *desc, u32 mask)
  10. {
  11. pci_msi_update_mask(desc, 0, mask);
  12. }
  13. static inline void pci_msi_unmask(struct msi_desc *desc, u32 mask)
  14. {
  15. pci_msi_update_mask(desc, mask, 0);
  16. }
  17. static inline void __iomem *pci_msix_desc_addr(struct msi_desc *desc)
  18. {
  19. return desc->pci.mask_base + desc->msi_index * PCI_MSIX_ENTRY_SIZE;
  20. }
  21. /*
  22. * This internal function does not flush PCI writes to the device. All
  23. * users must ensure that they read from the device before either assuming
  24. * that the device state is up to date, or returning out of this file.
  25. * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
  26. */
  27. static inline void pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
  28. {
  29. void __iomem *desc_addr = pci_msix_desc_addr(desc);
  30. if (desc->pci.msi_attrib.can_mask)
  31. writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
  32. }
  33. static inline void pci_msix_mask(struct msi_desc *desc)
  34. {
  35. desc->pci.msix_ctrl |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
  36. pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
  37. /* Flush write to device */
  38. readl(desc->pci.mask_base);
  39. }
  40. static inline void pci_msix_unmask(struct msi_desc *desc)
  41. {
  42. desc->pci.msix_ctrl &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
  43. pci_msix_write_vector_ctrl(desc, desc->pci.msix_ctrl);
  44. }
  45. static inline void __pci_msi_mask_desc(struct msi_desc *desc, u32 mask)
  46. {
  47. if (desc->pci.msi_attrib.is_msix)
  48. pci_msix_mask(desc);
  49. else
  50. pci_msi_mask(desc, mask);
  51. }
  52. static inline void __pci_msi_unmask_desc(struct msi_desc *desc, u32 mask)
  53. {
  54. if (desc->pci.msi_attrib.is_msix)
  55. pci_msix_unmask(desc);
  56. else
  57. pci_msi_unmask(desc, mask);
  58. }
  59. /*
  60. * PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to
  61. * mask all MSI interrupts by clearing the MSI enable bit does not work
  62. * reliably as devices without an INTx disable bit will then generate a
  63. * level IRQ which will never be cleared.
  64. */
  65. static inline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
  66. {
  67. /* Don't shift by >= width of type */
  68. if (desc->pci.msi_attrib.multi_cap >= 5)
  69. return 0xffffffff;
  70. return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
  71. }
  72. void msix_prepare_msi_desc(struct pci_dev *dev, struct msi_desc *desc);
  73. /* Subsystem variables */
  74. extern int pci_msi_enable;
  75. /* MSI internal functions invoked from the public APIs */
  76. void pci_msi_shutdown(struct pci_dev *dev);
  77. void pci_msix_shutdown(struct pci_dev *dev);
  78. void pci_free_msi_irqs(struct pci_dev *dev);
  79. int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, struct irq_affinity *affd);
  80. int __pci_enable_msix_range(struct pci_dev *dev, struct msix_entry *entries, int minvec,
  81. int maxvec, struct irq_affinity *affd, int flags);
  82. void __pci_restore_msi_state(struct pci_dev *dev);
  83. void __pci_restore_msix_state(struct pci_dev *dev);
  84. /* irq_domain related functionality */
  85. enum support_mode {
  86. ALLOW_LEGACY,
  87. DENY_LEGACY,
  88. };
  89. bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
  90. bool pci_setup_msi_device_domain(struct pci_dev *pdev);
  91. bool pci_setup_msix_device_domain(struct pci_dev *pdev, unsigned int hwsize);
  92. /* Legacy (!IRQDOMAIN) fallbacks */
  93. #ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS
  94. int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
  95. void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev);
  96. #else
  97. static inline int pci_msi_legacy_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
  98. {
  99. WARN_ON_ONCE(1);
  100. return -ENODEV;
  101. }
  102. static inline void pci_msi_legacy_teardown_msi_irqs(struct pci_dev *dev)
  103. {
  104. WARN_ON_ONCE(1);
  105. }
  106. #endif