portdrv.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Purpose: PCI Express Port Bus Driver's Internal Data Structures
  4. *
  5. * Copyright (C) 2004 Intel
  6. * Copyright (C) Tom Long Nguyen ([email protected])
  7. */
  8. #ifndef _PORTDRV_H_
  9. #define _PORTDRV_H_
  10. #include <linux/compiler.h>
  11. /* Service Type */
  12. #define PCIE_PORT_SERVICE_PME_SHIFT 0 /* Power Management Event */
  13. #define PCIE_PORT_SERVICE_PME (1 << PCIE_PORT_SERVICE_PME_SHIFT)
  14. #define PCIE_PORT_SERVICE_AER_SHIFT 1 /* Advanced Error Reporting */
  15. #define PCIE_PORT_SERVICE_AER (1 << PCIE_PORT_SERVICE_AER_SHIFT)
  16. #define PCIE_PORT_SERVICE_HP_SHIFT 2 /* Native Hotplug */
  17. #define PCIE_PORT_SERVICE_HP (1 << PCIE_PORT_SERVICE_HP_SHIFT)
  18. #define PCIE_PORT_SERVICE_DPC_SHIFT 3 /* Downstream Port Containment */
  19. #define PCIE_PORT_SERVICE_DPC (1 << PCIE_PORT_SERVICE_DPC_SHIFT)
  20. #define PCIE_PORT_SERVICE_BWNOTIF_SHIFT 4 /* Bandwidth notification */
  21. #define PCIE_PORT_SERVICE_BWNOTIF (1 << PCIE_PORT_SERVICE_BWNOTIF_SHIFT)
  22. #define PCIE_PORT_DEVICE_MAXSERVICES 5
  23. extern bool pcie_ports_dpc_native;
  24. #ifdef CONFIG_PCIEAER
  25. int pcie_aer_init(void);
  26. int pcie_aer_is_native(struct pci_dev *dev);
  27. #else
  28. static inline int pcie_aer_init(void) { return 0; }
  29. static inline int pcie_aer_is_native(struct pci_dev *dev) { return 0; }
  30. #endif
  31. #ifdef CONFIG_HOTPLUG_PCI_PCIE
  32. int pcie_hp_init(void);
  33. #else
  34. static inline int pcie_hp_init(void) { return 0; }
  35. #endif
  36. #ifdef CONFIG_PCIE_PME
  37. int pcie_pme_init(void);
  38. #else
  39. static inline int pcie_pme_init(void) { return 0; }
  40. #endif
  41. #ifdef CONFIG_PCIE_DPC
  42. int pcie_dpc_init(void);
  43. #else
  44. static inline int pcie_dpc_init(void) { return 0; }
  45. #endif
  46. /* Port Type */
  47. #define PCIE_ANY_PORT (~0)
  48. struct pcie_device {
  49. int irq; /* Service IRQ/MSI/MSI-X Vector */
  50. struct pci_dev *port; /* Root/Upstream/Downstream Port */
  51. u32 service; /* Port service this device represents */
  52. void *priv_data; /* Service Private Data */
  53. struct device device; /* Generic Device Interface */
  54. };
  55. #define to_pcie_device(d) container_of(d, struct pcie_device, device)
  56. static inline void set_service_data(struct pcie_device *dev, void *data)
  57. {
  58. dev->priv_data = data;
  59. }
  60. static inline void *get_service_data(struct pcie_device *dev)
  61. {
  62. return dev->priv_data;
  63. }
  64. struct pcie_port_service_driver {
  65. const char *name;
  66. int (*probe)(struct pcie_device *dev);
  67. void (*remove)(struct pcie_device *dev);
  68. int (*suspend)(struct pcie_device *dev);
  69. int (*resume_noirq)(struct pcie_device *dev);
  70. int (*resume)(struct pcie_device *dev);
  71. int (*runtime_suspend)(struct pcie_device *dev);
  72. int (*runtime_resume)(struct pcie_device *dev);
  73. int (*slot_reset)(struct pcie_device *dev);
  74. int port_type; /* Type of the port this driver can handle */
  75. u32 service; /* Port service this device represents */
  76. struct device_driver driver;
  77. };
  78. #define to_service_driver(d) \
  79. container_of(d, struct pcie_port_service_driver, driver)
  80. int pcie_port_service_register(struct pcie_port_service_driver *new);
  81. void pcie_port_service_unregister(struct pcie_port_service_driver *new);
  82. /*
  83. * The PCIe Capability Interrupt Message Number (PCIe r3.1, sec 7.8.2) must
  84. * be one of the first 32 MSI-X entries. Per PCI r3.0, sec 6.8.3.1, MSI
  85. * supports a maximum of 32 vectors per function.
  86. */
  87. #define PCIE_PORT_MAX_MSI_ENTRIES 32
  88. #define get_descriptor_id(type, service) (((type - 4) << 8) | service)
  89. extern struct bus_type pcie_port_bus_type;
  90. int pcie_port_device_register(struct pci_dev *dev);
  91. int pcie_port_device_iter(struct device *dev, void *data);
  92. #ifdef CONFIG_PM
  93. int pcie_port_device_suspend(struct device *dev);
  94. int pcie_port_device_resume_noirq(struct device *dev);
  95. int pcie_port_device_resume(struct device *dev);
  96. int pcie_port_device_runtime_suspend(struct device *dev);
  97. int pcie_port_device_runtime_resume(struct device *dev);
  98. #endif
  99. void pcie_port_device_remove(struct pci_dev *dev);
  100. struct pci_dev;
  101. #ifdef CONFIG_PCIE_PME
  102. extern bool pcie_pme_msi_disabled;
  103. static inline void pcie_pme_disable_msi(void)
  104. {
  105. pcie_pme_msi_disabled = true;
  106. }
  107. static inline bool pcie_pme_no_msi(void)
  108. {
  109. return pcie_pme_msi_disabled;
  110. }
  111. void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable);
  112. #else /* !CONFIG_PCIE_PME */
  113. static inline void pcie_pme_disable_msi(void) {}
  114. static inline bool pcie_pme_no_msi(void) { return false; }
  115. static inline void pcie_pme_interrupt_enable(struct pci_dev *dev, bool en) {}
  116. #endif /* !CONFIG_PCIE_PME */
  117. struct device *pcie_port_find_device(struct pci_dev *dev, u32 service);
  118. #endif /* _PORTDRV_H_ */