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