Host bridge hotplug
     - Major overhaul of ACPI host bridge add/start (Rafael Wysocki, Yinghai Lu)
     - Major overhaul of PCI/ACPI binding (Rafael Wysocki, Yinghai Lu)
     - Split out ACPI host bridge and ACPI PCI device hotplug (Yinghai Lu)
     - Stop caching _PRT and make independent of bus numbers (Yinghai Lu)
 
   PCI device hotplug
     - Clean up cpqphp dead code (Sasha Levin)
     - Disable ARI unless device and upstream bridge support it (Yijing Wang)
     - Initialize all hot-added devices (not functions 0-7) (Yijing Wang)
 
   Power management
     - Don't touch ASPM if disabled (Joe Lawrence)
     - Fix ASPM link state management (Myron Stowe)
 
   Miscellaneous
     - Fix PCI_EXP_FLAGS accessor (Alex Williamson)
     - Disable Bus Master in pci_device_shutdown (Konstantin Khlebnikov)
     - Document hotplug resource and MPS parameters (Yijing Wang)
     - Add accessor for PCIe capabilities (Myron Stowe)
     - Drop pciehp suspend/resume messages (Paul Bolle)
     - Make pci_slot built-in only (not a module) (Jiang Liu)
     - Remove unused PCI/ACPI bind ops (Jiang Liu)
     - Removed used pci_root_bus (Bjorn Helgaas)
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v1.4.11 (GNU/Linux)
 
 iQIcBAABAgAGBQJRKS3hAAoJEFmIoMA60/r8xxoP/j1CS4oCZAnBIVT9fKBkis+/
 CENcfHIUKj6J9iMfJEVvqBELvqaLqtpeNwAGMcGPxV7VuT3K1QumChfaTpRDP0HC
 VDRmrjcmfenEK+YPOG7acsrTyqk2wjpLOyu9MKRxtC5u7tF6376KQpkEFpO4haL4
 eUHTxfE76OkrPBSvx3+PUSf6jqrvrNbjX8K6HdDVVlm3sVAQKmYJU/Wphv2NPOqa
 CAMyCzEGybFjr8hDRwvWgr+06c718GMwQUbnrPdHXAe7lMNMrN/XVBmU9ABN3Aas
 icd3lrDs+yPObgcO/gT8+sAZErCtdJ9zuHGYHdYpRbIQj/5JT4TMk7tw/Bj7vKY9
 Mqmho9GR5YmYTRN9f1r+2n5AQ/KYWXJDrRNOnt5/ys5BOM3vwJ7WJ902zpSwtFQp
 nLX+oD/hLfzpnoIQGDuBAoAXp2Kam3XWRgVvG78buRNrPj+kUzimk14a8qQeY+CB
 El6UKuwi5Uv/qgs1gAqqjmZmsAkon2DnsRZa6Fl8NTkDlis7LY4gp9OU38ySFpB+
 PhCmRyCZmDDqTVtwj6XzR3nPQ5LBSbvsTfgMxYMIUSXHa06tyb2q5p4mEIas0OmU
 RKaP5xQqZuTgD8fbdYrx0xgSrn7JHt/j/X//Qs6unlLCWhlpm3LjJZKxyw2FwBGr
 o4Lci+PiBh3MowCrju9D
 =ER3b
 -----END PGP SIGNATURE-----
Merge tag 'pci-v3.9-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI changes from Bjorn Helgaas:
 "Host bridge hotplug
    - Major overhaul of ACPI host bridge add/start (Rafael Wysocki, Yinghai Lu)
    - Major overhaul of PCI/ACPI binding (Rafael Wysocki, Yinghai Lu)
    - Split out ACPI host bridge and ACPI PCI device hotplug (Yinghai Lu)
    - Stop caching _PRT and make independent of bus numbers (Yinghai Lu)
  PCI device hotplug
    - Clean up cpqphp dead code (Sasha Levin)
    - Disable ARI unless device and upstream bridge support it (Yijing Wang)
    - Initialize all hot-added devices (not functions 0-7) (Yijing Wang)
  Power management
    - Don't touch ASPM if disabled (Joe Lawrence)
    - Fix ASPM link state management (Myron Stowe)
  Miscellaneous
    - Fix PCI_EXP_FLAGS accessor (Alex Williamson)
    - Disable Bus Master in pci_device_shutdown (Konstantin Khlebnikov)
    - Document hotplug resource and MPS parameters (Yijing Wang)
    - Add accessor for PCIe capabilities (Myron Stowe)
    - Drop pciehp suspend/resume messages (Paul Bolle)
    - Make pci_slot built-in only (not a module) (Jiang Liu)
    - Remove unused PCI/ACPI bind ops (Jiang Liu)
    - Removed used pci_root_bus (Bjorn Helgaas)"
* tag 'pci-v3.9-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (51 commits)
  PCI/ACPI: Don't cache _PRT, and don't associate them with bus numbers
  PCI: Fix PCI Express Capability accessors for PCI_EXP_FLAGS
  ACPI / PCI: Make pci_slot built-in only, not a module
  PCI/PM: Clear state_saved during suspend
  PCI: Use atomic_inc_return() rather than atomic_add_return()
  PCI: Catch attempts to disable already-disabled devices
  PCI: Disable Bus Master unconditionally in pci_device_shutdown()
  PCI: acpiphp: Remove dead code for PCI host bridge hotplug
  PCI: acpiphp: Create companion ACPI devices before creating PCI devices
  PCI: Remove unused "rc" in virtfn_add_bus()
  PCI: pciehp: Drop suspend/resume ENTRY messages
  PCI/ASPM: Don't touch ASPM if forcibly disabled
  PCI/ASPM: Deallocate upstream link state even if device is not PCIe
  PCI: Document MPS parameters pci=pcie_bus_safe, pci=pcie_bus_perf, etc
  PCI: Document hpiosize= and hpmemsize= resource reservation parameters
  PCI: Use PCI Express Capability accessor
  PCI: Introduce accessor to retrieve PCIe Capabilities Register
  PCI: Put pci_dev in device tree as early as possible
  PCI: Skip attaching driver in device_add()
  PCI: acpiphp: Keep driver loaded even if no slots found
  ...
		
	
			
		
			
				
	
	
		
			192 lines
		
	
	
	
		
			4.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
	
		
			4.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
#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 <asm/scatterlist.h>
 | 
						|
#include <asm/io.h>
 | 
						|
#include <asm/x86_init.h>
 | 
						|
 | 
						|
#ifdef __KERNEL__
 | 
						|
 | 
						|
struct pci_sysdata {
 | 
						|
	int		domain;		/* PCI domain */
 | 
						|
	int		node;		/* NUMA node */
 | 
						|
#ifdef CONFIG_ACPI
 | 
						|
	void		*acpi;		/* ACPI-specific data */
 | 
						|
#endif
 | 
						|
#ifdef CONFIG_X86_64
 | 
						|
	void		*iommu;		/* IOMMU private data */
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
extern int pci_routeirq;
 | 
						|
extern int noioapicquirk;
 | 
						|
extern int noioapicreroute;
 | 
						|
 | 
						|
/* scan a bus after allocating a pci_sysdata for it */
 | 
						|
extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
 | 
						|
					    int node);
 | 
						|
extern struct pci_bus *pci_scan_bus_with_sysdata(int busno);
 | 
						|
 | 
						|
#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
 | 
						|
 | 
						|
/* 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);
 | 
						|
# ifdef CONFIG_ACPI
 | 
						|
#  define x86_default_pci_init pci_acpi_init
 | 
						|
# else
 | 
						|
#  define x86_default_pci_init pci_legacy_init
 | 
						|
# endif
 | 
						|
#else
 | 
						|
# define pcibios_assign_all_busses()	0
 | 
						|
# define x86_default_pci_init		NULL
 | 
						|
#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_config_init(void);
 | 
						|
struct pci_bus *pcibios_scan_root(int bus);
 | 
						|
 | 
						|
void pcibios_set_master(struct pci_dev *dev);
 | 
						|
void pcibios_penalize_isa_irq(int irq, int active);
 | 
						|
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
 | 
						|
extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
 | 
						|
			       enum pci_mmap_state mmap_state,
 | 
						|
			       int write_combine);
 | 
						|
 | 
						|
 | 
						|
#ifdef CONFIG_PCI
 | 
						|
extern void early_quirks(void);
 | 
						|
static inline void pci_dma_burst_advice(struct pci_dev *pdev,
 | 
						|
					enum pci_dma_burst_strategy *strat,
 | 
						|
					unsigned long *strategy_parameter)
 | 
						|
{
 | 
						|
	*strat = PCI_DMA_BURST_INFINITY;
 | 
						|
	*strategy_parameter = ~0UL;
 | 
						|
}
 | 
						|
#else
 | 
						|
static inline void early_quirks(void) { }
 | 
						|
#endif
 | 
						|
 | 
						|
extern void pci_iommu_alloc(void);
 | 
						|
 | 
						|
#ifdef CONFIG_PCI_MSI
 | 
						|
/* MSI arch specific hooks */
 | 
						|
static inline int x86_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
 | 
						|
{
 | 
						|
	return x86_msi.setup_msi_irqs(dev, nvec, type);
 | 
						|
}
 | 
						|
 | 
						|
static inline void x86_teardown_msi_irqs(struct pci_dev *dev)
 | 
						|
{
 | 
						|
	x86_msi.teardown_msi_irqs(dev);
 | 
						|
}
 | 
						|
 | 
						|
static inline void x86_teardown_msi_irq(unsigned int irq)
 | 
						|
{
 | 
						|
	x86_msi.teardown_msi_irq(irq);
 | 
						|
}
 | 
						|
static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)
 | 
						|
{
 | 
						|
	x86_msi.restore_msi_irqs(dev, irq);
 | 
						|
}
 | 
						|
#define arch_setup_msi_irqs x86_setup_msi_irqs
 | 
						|
#define arch_teardown_msi_irqs x86_teardown_msi_irqs
 | 
						|
#define arch_teardown_msi_irq x86_teardown_msi_irq
 | 
						|
#define arch_restore_msi_irqs x86_restore_msi_irqs
 | 
						|
/* 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, int irq);
 | 
						|
int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc,
 | 
						|
		  unsigned int irq_base, unsigned int irq_offset);
 | 
						|
/* default to the implementation in drivers/lib/msi.c */
 | 
						|
#define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
 | 
						|
#define HAVE_DEFAULT_MSI_RESTORE_IRQS
 | 
						|
void default_teardown_msi_irqs(struct pci_dev *dev);
 | 
						|
void default_restore_msi_irqs(struct pci_dev *dev, int irq);
 | 
						|
#else
 | 
						|
#define native_setup_msi_irqs		NULL
 | 
						|
#define native_teardown_msi_irq		NULL
 | 
						|
#define default_teardown_msi_irqs	NULL
 | 
						|
#define default_restore_msi_irqs	NULL
 | 
						|
#endif
 | 
						|
 | 
						|
#define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
 | 
						|
 | 
						|
#endif  /* __KERNEL__ */
 | 
						|
 | 
						|
#ifdef CONFIG_X86_64
 | 
						|
#include <asm/pci_64.h>
 | 
						|
#endif
 | 
						|
 | 
						|
/* implement the pci_ DMA API in terms of the generic device dma_ one */
 | 
						|
#include <asm-generic/pci-dma-compat.h>
 | 
						|
 | 
						|
/* generic pci stuff */
 | 
						|
#include <asm-generic/pci.h>
 | 
						|
#define PCIBIOS_MAX_MEM_32 0xffffffff
 | 
						|
 | 
						|
#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 */
 |