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 : static inline struct pci_sysdata *to_pci_sysdata(const struct pci_bus *bus) 37 : { 38 : return bus->sysdata; 39 : } 40 : 41 : #ifdef CONFIG_PCI 42 : 43 : #ifdef CONFIG_PCI_DOMAINS 44 : static inline int pci_domain_nr(struct pci_bus *bus) 45 : { 46 : return to_pci_sysdata(bus)->domain; 47 : } 48 : 49 : static inline int pci_proc_domain(struct pci_bus *bus) 50 : { 51 : return pci_domain_nr(bus); 52 : } 53 : #endif 54 : 55 : #ifdef CONFIG_PCI_MSI_IRQ_DOMAIN 56 : static inline void *_pci_root_bus_fwnode(struct pci_bus *bus) 57 : { 58 : 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 1 : static inline void early_quirks(void) { } 104 : #endif 105 : 106 : extern void pci_iommu_alloc(void); 107 : 108 : /* generic pci stuff */ 109 : #include <asm-generic/pci.h> 110 : 111 : #ifdef CONFIG_NUMA 112 : /* Returns the node based on pci bus */ 113 : static inline int __pcibus_to_node(const struct pci_bus *bus) 114 : { 115 : return to_pci_sysdata(bus)->node; 116 : } 117 : 118 : static inline const struct cpumask * 119 : cpumask_of_pcibus(const struct pci_bus *bus) 120 : { 121 : int node; 122 : 123 : node = __pcibus_to_node(bus); 124 : return (node == NUMA_NO_NODE) ? cpu_online_mask : 125 : cpumask_of_node(node); 126 : } 127 : #endif 128 : 129 : struct pci_setup_rom { 130 : struct setup_data data; 131 : uint16_t vendor; 132 : uint16_t devid; 133 : uint64_t pcilen; 134 : unsigned long segment; 135 : unsigned long bus; 136 : unsigned long device; 137 : unsigned long function; 138 : uint8_t romdata[0]; 139 : }; 140 : 141 : #endif /* _ASM_X86_PCI_H */