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