Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : /* 3 : : * File pci-acpi.h 4 : : * 5 : : * Copyright (C) 2004 Intel 6 : : * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com) 7 : : */ 8 : : 9 : : #ifndef _PCI_ACPI_H_ 10 : : #define _PCI_ACPI_H_ 11 : : 12 : : #include <linux/acpi.h> 13 : : 14 : : #ifdef CONFIG_ACPI 15 : : extern acpi_status pci_acpi_add_bus_pm_notifier(struct acpi_device *dev); 16 : 0 : static inline acpi_status pci_acpi_remove_bus_pm_notifier(struct acpi_device *dev) 17 : : { 18 : 0 : return acpi_remove_pm_notifier(dev); 19 : : } 20 : : extern acpi_status pci_acpi_add_pm_notifier(struct acpi_device *dev, 21 : : struct pci_dev *pci_dev); 22 : 0 : static inline acpi_status pci_acpi_remove_pm_notifier(struct acpi_device *dev) 23 : : { 24 : 0 : return acpi_remove_pm_notifier(dev); 25 : : } 26 : : extern phys_addr_t acpi_pci_root_get_mcfg_addr(acpi_handle handle); 27 : : 28 : : struct pci_ecam_ops; 29 : : extern int pci_mcfg_lookup(struct acpi_pci_root *root, struct resource *cfgres, 30 : : struct pci_ecam_ops **ecam_ops); 31 : : 32 : : static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) 33 : : { 34 : : struct pci_bus *pbus = pdev->bus; 35 : : 36 : : /* Find a PCI root bus */ 37 : : while (!pci_is_root_bus(pbus)) 38 : : pbus = pbus->parent; 39 : : 40 : : return ACPI_HANDLE(pbus->bridge); 41 : : } 42 : : 43 : 3042 : static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus) 44 : : { 45 : 3042 : struct device *dev; 46 : : 47 [ + - ]: 3042 : if (pci_is_root_bus(pbus)) 48 : 3042 : dev = pbus->bridge; 49 : : else { 50 : : /* If pbus is a virtual bus, there is no bridge to it */ 51 [ # # ]: 0 : if (!pbus->self) 52 : : return NULL; 53 : : 54 : 0 : dev = &pbus->self->dev; 55 : : } 56 : : 57 [ + - + - ]: 3042 : return ACPI_HANDLE(dev); 58 : : } 59 : : 60 : : struct acpi_pci_root; 61 : : struct acpi_pci_root_ops; 62 : : 63 : : struct acpi_pci_root_info { 64 : : struct acpi_pci_root *root; 65 : : struct acpi_device *bridge; 66 : : struct acpi_pci_root_ops *ops; 67 : : struct list_head resources; 68 : : char name[16]; 69 : : }; 70 : : 71 : : struct acpi_pci_root_ops { 72 : : struct pci_ops *pci_ops; 73 : : int (*init_info)(struct acpi_pci_root_info *info); 74 : : void (*release_info)(struct acpi_pci_root_info *info); 75 : : int (*prepare_resources)(struct acpi_pci_root_info *info); 76 : : }; 77 : : 78 : : extern int acpi_pci_probe_root_resources(struct acpi_pci_root_info *info); 79 : : extern struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root, 80 : : struct acpi_pci_root_ops *ops, 81 : : struct acpi_pci_root_info *info, 82 : : void *sd); 83 : : 84 : : void acpi_pci_add_bus(struct pci_bus *bus); 85 : : void acpi_pci_remove_bus(struct pci_bus *bus); 86 : : 87 : : #ifdef CONFIG_ACPI_PCI_SLOT 88 : : void acpi_pci_slot_init(void); 89 : : void acpi_pci_slot_enumerate(struct pci_bus *bus); 90 : : void acpi_pci_slot_remove(struct pci_bus *bus); 91 : : #else 92 : 78 : static inline void acpi_pci_slot_init(void) { } 93 : 78 : static inline void acpi_pci_slot_enumerate(struct pci_bus *bus) { } 94 : 0 : static inline void acpi_pci_slot_remove(struct pci_bus *bus) { } 95 : : #endif 96 : : 97 : : #ifdef CONFIG_HOTPLUG_PCI_ACPI 98 : : void acpiphp_init(void); 99 : : void acpiphp_enumerate_slots(struct pci_bus *bus); 100 : : void acpiphp_remove_slots(struct pci_bus *bus); 101 : : void acpiphp_check_host_bridge(struct acpi_device *adev); 102 : : #else 103 : : static inline void acpiphp_init(void) { } 104 : : static inline void acpiphp_enumerate_slots(struct pci_bus *bus) { } 105 : : static inline void acpiphp_remove_slots(struct pci_bus *bus) { } 106 : : static inline void acpiphp_check_host_bridge(struct acpi_device *adev) { } 107 : : #endif 108 : : 109 : : extern const guid_t pci_acpi_dsm_guid; 110 : : #define IGNORE_PCI_BOOT_CONFIG_DSM 0x05 111 : : #define DEVICE_LABEL_DSM 0x07 112 : : #define RESET_DELAY_DSM 0x08 113 : : #define FUNCTION_DELAY_DSM 0x09 114 : : 115 : : #else /* CONFIG_ACPI */ 116 : : static inline void acpi_pci_add_bus(struct pci_bus *bus) { } 117 : : static inline void acpi_pci_remove_bus(struct pci_bus *bus) { } 118 : : #endif /* CONFIG_ACPI */ 119 : : 120 : : #ifdef CONFIG_ACPI_APEI 121 : : extern bool aer_acpi_firmware_first(void); 122 : : #else 123 : 78 : static inline bool aer_acpi_firmware_first(void) { return false; } 124 : : #endif 125 : : 126 : : #endif /* _PCI_ACPI_H_ */