Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : #ifndef _ASM_X86_PCI_H 3 : : #define _ASM_X86_PCI_H 4 : : 5 : : #include <linux/mm.h> /* for struct page */ 6 : : #include <linux/types.h> 7 : : #include <linux/slab.h> 8 : : #include <linux/string.h> 9 : : #include <linux/scatterlist.h> 10 : : #include <linux/numa.h> 11 : : #include <asm/io.h> 12 : : #include <asm/memtype.h> 13 : : #include <asm/x86_init.h> 14 : : 15 : : struct pci_sysdata { 16 : : int domain; /* PCI domain */ 17 : : int node; /* NUMA node */ 18 : : #ifdef CONFIG_ACPI 19 : : struct acpi_device *companion; /* ACPI companion device */ 20 : : #endif 21 : : #ifdef CONFIG_X86_64 22 : : void *iommu; /* IOMMU private data */ 23 : : #endif 24 : : #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN 25 : : void *fwnode; /* IRQ domain for MSI assignment */ 26 : : #endif 27 : : #if IS_ENABLED(CONFIG_VMD) 28 : : struct pci_dev *vmd_dev; /* VMD Device if in Intel VMD domain */ 29 : : #endif 30 : : }; 31 : : 32 : : extern int pci_routeirq; 33 : : extern int noioapicquirk; 34 : : extern int noioapicreroute; 35 : : 36 : 55419 : static inline struct pci_sysdata *to_pci_sysdata(const struct pci_bus *bus) 37 : : { 38 : 55419 : return bus->sysdata; 39 : : } 40 : : 41 : : #ifdef CONFIG_PCI 42 : : 43 : : #ifdef CONFIG_PCI_DOMAINS 44 : 54717 : static inline int pci_domain_nr(struct pci_bus *bus) 45 : : { 46 [ - - - - : 54639 : return to_pci_sysdata(bus)->domain; - - ] 47 : : } 48 : : 49 : 78 : static inline int pci_proc_domain(struct pci_bus *bus) 50 : : { 51 [ - + ]: 78 : return pci_domain_nr(bus); 52 : : } 53 : : #endif 54 : : 55 : : #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN 56 : 78 : static inline void *_pci_root_bus_fwnode(struct pci_bus *bus) 57 : : { 58 [ - + ]: 78 : return to_pci_sysdata(bus)->fwnode; 59 : : } 60 : : 61 : : #define pci_root_bus_fwnode _pci_root_bus_fwnode 62 : : #endif 63 : : 64 : : #if IS_ENABLED(CONFIG_VMD) 65 : : static inline bool is_vmd(struct pci_bus *bus) 66 : : { 67 : : return to_pci_sysdata(bus)->vmd_dev != NULL; 68 : : } 69 : : #else 70 : : #define is_vmd(bus) false 71 : : #endif /* CONFIG_VMD */ 72 : : 73 : : /* Can be used to override the logic in pci_scan_bus for skipping 74 : : already-configured bus numbers - to be used for buggy BIOSes 75 : : or architectures with incomplete PCI setup by the loader */ 76 : : 77 : : extern unsigned int pcibios_assign_all_busses(void); 78 : : extern int pci_legacy_init(void); 79 : : #else 80 : : static inline int pcibios_assign_all_busses(void) { return 0; } 81 : : #endif 82 : : 83 : : extern unsigned long pci_mem_start; 84 : : #define PCIBIOS_MIN_IO 0x1000 85 : : #define PCIBIOS_MIN_MEM (pci_mem_start) 86 : : 87 : : #define PCIBIOS_MIN_CARDBUS_IO 0x4000 88 : : 89 : : extern int pcibios_enabled; 90 : : void pcibios_scan_root(int bus); 91 : : 92 : : struct irq_routing_table *pcibios_get_irq_routing_table(void); 93 : : int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq); 94 : : 95 : : 96 : : #define HAVE_PCI_MMAP 97 : : #define arch_can_pci_mmap_wc() pat_enabled() 98 : : #define ARCH_GENERIC_PCI_MMAP_RESOURCE 99 : : 100 : : #ifdef CONFIG_PCI 101 : : extern void early_quirks(void); 102 : : #else 103 : : static inline void early_quirks(void) { } 104 : : #endif 105 : : 106 : : extern void pci_iommu_alloc(void); 107 : : 108 : : #ifdef CONFIG_PCI_MSI 109 : : /* implemented in arch/x86/kernel/apic/io_apic. */ 110 : : struct msi_desc; 111 : : int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); 112 : : void native_teardown_msi_irq(unsigned int irq); 113 : : void native_restore_msi_irqs(struct pci_dev *dev); 114 : : #else 115 : : #define native_setup_msi_irqs NULL 116 : : #define native_teardown_msi_irq NULL 117 : : #endif 118 : : 119 : : /* generic pci stuff */ 120 : : #include <asm-generic/pci.h> 121 : : 122 : : #ifdef CONFIG_NUMA 123 : : /* Returns the node based on pci bus */ 124 : 624 : static inline int __pcibus_to_node(const struct pci_bus *bus) 125 : : { 126 [ + - - - ]: 624 : return to_pci_sysdata(bus)->node; 127 : : } 128 : : 129 : : static inline const struct cpumask * 130 : 0 : cpumask_of_pcibus(const struct pci_bus *bus) 131 : : { 132 : 0 : int node; 133 : : 134 : 0 : node = __pcibus_to_node(bus); 135 [ # # # # ]: 0 : return (node == NUMA_NO_NODE) ? cpu_online_mask : 136 : : cpumask_of_node(node); 137 : : } 138 : : #endif 139 : : 140 : : struct pci_setup_rom { 141 : : struct setup_data data; 142 : : uint16_t vendor; 143 : : uint16_t devid; 144 : : uint64_t pcilen; 145 : : unsigned long segment; 146 : : unsigned long bus; 147 : : unsigned long device; 148 : : unsigned long function; 149 : : uint8_t romdata[0]; 150 : : }; 151 : : 152 : : #endif /* _ASM_X86_PCI_H */