0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _PCI_ACPI_H_
0010 #define _PCI_ACPI_H_
0011
0012 #include <linux/acpi.h>
0013
0014 #ifdef CONFIG_ACPI
0015 extern acpi_status pci_acpi_add_bus_pm_notifier(struct acpi_device *dev);
0016 static inline acpi_status pci_acpi_remove_bus_pm_notifier(struct acpi_device *dev)
0017 {
0018 return acpi_remove_pm_notifier(dev);
0019 }
0020 extern acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev,
0021 struct pci_dev *pci_dev);
0022 static inline acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev)
0023 {
0024 return acpi_remove_pm_notifier(dev);
0025 }
0026 extern phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle);
0027
0028 struct pci_ecam_ops;
0029 extern int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres,
0030 const struct pci_ecam_ops **ecam_ops);
0031
0032 static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
0033 {
0034 struct pci_bus *pbus = pdev->bus;
0035
0036
0037 while (!pci_is_root_bus(pbus))
0038 pbus = pbus->parent;
0039
0040 return ACPI_HANDLE(pbus->bridge);
0041 }
0042
0043 static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)
0044 {
0045 struct device *dev;
0046
0047 if (pci_is_root_bus(pbus))
0048 dev = pbus->bridge;
0049 else {
0050
0051 if (!pbus->self)
0052 return NULL;
0053
0054 dev = &pbus->self->dev;
0055 }
0056
0057 return ACPI_HANDLE(dev);
0058 }
0059
0060 struct acpi_pci_root;
0061 struct acpi_pci_root_ops;
0062
0063 struct acpi_pci_root_info {
0064 struct acpi_pci_root *root;
0065 struct acpi_device *bridge;
0066 struct acpi_pci_root_ops *ops;
0067 struct list_head resources;
0068 char name[16];
0069 };
0070
0071 struct acpi_pci_root_ops {
0072 struct pci_ops *pci_ops;
0073 int (*init_info)(struct acpi_pci_root_info *info);
0074 void (*release_info)(struct acpi_pci_root_info *info);
0075 int (*prepare_resources)(struct acpi_pci_root_info *info);
0076 };
0077
0078 extern int acpi_pci_probe_root_resources(struct acpi_pci_root_info *info);
0079 extern struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
0080 struct acpi_pci_root_ops *ops,
0081 struct acpi_pci_root_info *info,
0082 void *sd);
0083
0084 void acpi_pci_add_bus(struct pci_bus *bus);
0085 void acpi_pci_remove_bus(struct pci_bus *bus);
0086
0087 #ifdef CONFIG_PCI
0088 void pci_acpi_setup(struct device *dev, struct acpi_device *adev);
0089 void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev);
0090 #else
0091 static inline void pci_acpi_setup(struct device *dev, struct acpi_device *adev) {}
0092 static inline void pci_acpi_cleanup(struct device *dev, struct acpi_device *adev) {}
0093 #endif
0094
0095 #ifdef CONFIG_ACPI_PCI_SLOT
0096 void acpi_pci_slot_init(void);
0097 void acpi_pci_slot_enumerate(struct pci_bus *bus);
0098 void acpi_pci_slot_remove(struct pci_bus *bus);
0099 #else
0100 static inline void acpi_pci_slot_init(void) { }
0101 static inline void acpi_pci_slot_enumerate(struct pci_bus *bus) { }
0102 static inline void acpi_pci_slot_remove(struct pci_bus *bus) { }
0103 #endif
0104
0105 #ifdef CONFIG_HOTPLUG_PCI_ACPI
0106 void acpiphp_init(void);
0107 void acpiphp_enumerate_slots(struct pci_bus *bus);
0108 void acpiphp_remove_slots(struct pci_bus *bus);
0109 void acpiphp_check_host_bridge(struct acpi_device *adev);
0110 #else
0111 static inline void acpiphp_init(void) { }
0112 static inline void acpiphp_enumerate_slots(struct pci_bus *bus) { }
0113 static inline void acpiphp_remove_slots(struct pci_bus *bus) { }
0114 static inline void acpiphp_check_host_bridge(struct acpi_device *adev) { }
0115 #endif
0116
0117 extern const guid_t pci_acpi_dsm_guid;
0118
0119
0120 #define DSM_PCI_PRESERVE_BOOT_CONFIG 0x05
0121 #define DSM_PCI_DEVICE_NAME 0x07
0122 #define DSM_PCI_POWER_ON_RESET_DELAY 0x08
0123 #define DSM_PCI_DEVICE_READINESS_DURATIONS 0x09
0124
0125 #ifdef CONFIG_PCIE_EDR
0126 void pci_acpi_add_edr_notifier(struct pci_dev *pdev);
0127 void pci_acpi_remove_edr_notifier(struct pci_dev *pdev);
0128 #else
0129 static inline void pci_acpi_add_edr_notifier(struct pci_dev *pdev) { }
0130 static inline void pci_acpi_remove_edr_notifier(struct pci_dev *pdev) { }
0131 #endif
0132
0133 int pci_acpi_set_companion_lookup_hook(struct acpi_device *(*func)(struct pci_dev *));
0134 void pci_acpi_clear_companion_lookup_hook(void);
0135
0136 #else
0137 static inline void acpi_pci_add_bus(struct pci_bus *bus) { }
0138 static inline void acpi_pci_remove_bus(struct pci_bus *bus) { }
0139 #endif
0140
0141 #endif