Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * File     pci-acpi.h
0004  *
0005  * Copyright (C) 2004 Intel
0006  * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
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     /* Find a PCI root bus */
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         /* If pbus is a virtual bus, there is no bridge to it */
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 /* _DSM Definitions for PCI */
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 /* CONFIG_PCIE_EDR */
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   /* CONFIG_ACPI */
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  /* CONFIG_ACPI */
0140 
0141 #endif  /* _PCI_ACPI_H_ */