1#ifndef _ASM_X86_PCI_H 2#define _ASM_X86_PCI_H 3 4#include <linux/mm.h> /* for struct page */ 5#include <linux/types.h> 6#include <linux/slab.h> 7#include <linux/string.h> 8#include <asm/scatterlist.h> 9#include <asm/io.h> 10#include <asm/x86_init.h> 11 12#ifdef __KERNEL__ 13 14struct pci_sysdata { 15 int domain; /* PCI domain */ 16 int node; /* NUMA node */ 17#ifdef CONFIG_X86_64 18 void *iommu; /* IOMMU private data */ 19#endif 20}; 21 22extern int pci_routeirq; 23extern int noioapicquirk; 24extern int noioapicreroute; 25 26/* scan a bus after allocating a pci_sysdata for it */ 27extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops, 28 int node); 29extern struct pci_bus *pci_scan_bus_with_sysdata(int busno); 30 31#ifdef CONFIG_PCI 32 33#ifdef CONFIG_PCI_DOMAINS 34static inline int pci_domain_nr(struct pci_bus *bus) 35{ 36 struct pci_sysdata *sd = bus->sysdata; 37 return sd->domain; 38} 39 40static inline int pci_proc_domain(struct pci_bus *bus) 41{ 42 return pci_domain_nr(bus); 43} 44#endif 45 46/* Can be used to override the logic in pci_scan_bus for skipping 47 already-configured bus numbers - to be used for buggy BIOSes 48 or architectures with incomplete PCI setup by the loader */ 49 50extern unsigned int pcibios_assign_all_busses(void); 51extern int pci_legacy_init(void); 52# ifdef CONFIG_ACPI 53# define x86_default_pci_init pci_acpi_init 54# else 55# define x86_default_pci_init pci_legacy_init 56# endif 57#else 58# define pcibios_assign_all_busses() 0 59# define x86_default_pci_init NULL 60#endif 61 62extern unsigned long pci_mem_start; 63#define PCIBIOS_MIN_IO 0x1000 64#define PCIBIOS_MIN_MEM (pci_mem_start) 65 66#define PCIBIOS_MIN_CARDBUS_IO 0x4000 67 68extern int pcibios_enabled; 69void pcibios_config_init(void); 70struct pci_bus *pcibios_scan_root(int bus); 71 72void pcibios_set_master(struct pci_dev *dev); 73void pcibios_penalize_isa_irq(int irq, int active); 74struct irq_routing_table *pcibios_get_irq_routing_table(void); 75int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq); 76 77 78#define HAVE_PCI_MMAP 79extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, 80 enum pci_mmap_state mmap_state, 81 int write_combine); 82 83 84#ifdef CONFIG_PCI 85extern void early_quirks(void); 86static inline void pci_dma_burst_advice(struct pci_dev *pdev, 87 enum pci_dma_burst_strategy *strat, 88 unsigned long *strategy_parameter) 89{ 90 *strat = PCI_DMA_BURST_INFINITY; 91 *strategy_parameter = ~0UL; 92} 93#else 94static inline void early_quirks(void) { } 95#endif 96 97extern void pci_iommu_alloc(void); 98 99#ifdef CONFIG_PCI_MSI 100/* MSI arch specific hooks */ 101static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) 102{ 103 return x86_msi.setup_msi_irqs(dev, nvec, type); 104} 105 106static inline void x86_teardown_msi_irqs(struct pci_dev *dev) 107{ 108 x86_msi.teardown_msi_irqs(dev); 109} 110 111static inline void x86_teardown_msi_irq(unsigned int irq) 112{ 113 x86_msi.teardown_msi_irq(irq); 114} 115static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq) 116{ 117 x86_msi.restore_msi_irqs(dev, irq); 118} 119#define arch_setup_msi_irqs x86_setup_msi_irqs 120#define arch_teardown_msi_irqs x86_teardown_msi_irqs 121#define arch_teardown_msi_irq x86_teardown_msi_irq 122#define arch_restore_msi_irqs x86_restore_msi_irqs 123/* implemented in arch/x86/kernel/apic/io_apic. */ 124int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); 125void native_teardown_msi_irq(unsigned int irq); 126void native_restore_msi_irqs(struct pci_dev *dev, int irq); 127/* default to the implementation in drivers/lib/msi.c */ 128#define HAVE_DEFAULT_MSI_TEARDOWN_IRQS 129#define HAVE_DEFAULT_MSI_RESTORE_IRQS 130void default_teardown_msi_irqs(struct pci_dev *dev); 131void default_restore_msi_irqs(struct pci_dev *dev, int irq); 132#else 133#define native_setup_msi_irqs NULL 134#define native_teardown_msi_irq NULL 135#define default_teardown_msi_irqs NULL 136#define default_restore_msi_irqs NULL 137#endif 138 139#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) 140 141#endif /* __KERNEL__ */ 142 143#ifdef CONFIG_X86_64 144#include "pci_64.h" 145#endif 146 147/* implement the pci_ DMA API in terms of the generic device dma_ one */ 148#include <asm-generic/pci-dma-compat.h> 149 150/* generic pci stuff */ 151#include <asm-generic/pci.h> 152#define PCIBIOS_MAX_MEM_32 0xffffffff 153 154#ifdef CONFIG_NUMA 155/* Returns the node based on pci bus */ 156static inline int __pcibus_to_node(const struct pci_bus *bus) 157{ 158 const struct pci_sysdata *sd = bus->sysdata; 159 160 return sd->node; 161} 162 163static inline const struct cpumask * 164cpumask_of_pcibus(const struct pci_bus *bus) 165{ 166 int node; 167 168 node = __pcibus_to_node(bus); 169 return (node == -1) ? cpu_online_mask : 170 cpumask_of_node(node); 171} 172#endif 173 174#endif /* _ASM_X86_PCI_H */ 175