diff options
| author | Bjorn Helgaas <bhelgaas@google.com> | 2013-01-17 16:00:36 -0700 | 
|---|---|---|
| committer | Bjorn Helgaas <bhelgaas@google.com> | 2013-01-17 16:00:36 -0700 | 
| commit | 708b59bfe1d1727451ca41f5dc4c17cf99dfaf51 (patch) | |
| tree | da5fb7826f92f90b58bb5f33ec552b52d3667152 | |
| parent | b7040469de97d361120836b4140941a08d06f56f (diff) | |
| parent | 6c0cc950ae670403a362bdcbf3cde0df33744928 (diff) | |
| download | olio-linux-3.10-708b59bfe1d1727451ca41f5dc4c17cf99dfaf51.tar.xz olio-linux-3.10-708b59bfe1d1727451ca41f5dc4c17cf99dfaf51.zip  | |
Merge branch 'pci/rafael-set-root-bridge-handle' into next
* pci/rafael-set-root-bridge-handle:
  ACPI / PCI: Set root bridge ACPI handle in advance
| -rw-r--r-- | arch/ia64/pci/pci.c | 8 | ||||
| -rw-r--r-- | arch/x86/include/asm/pci.h | 3 | ||||
| -rw-r--r-- | arch/x86/pci/acpi.c | 9 | ||||
| -rw-r--r-- | drivers/acpi/pci_root.c | 18 | ||||
| -rw-r--r-- | drivers/pci/pci-acpi.c | 19 | ||||
| -rw-r--r-- | drivers/pci/probe.c | 16 | ||||
| -rw-r--r-- | include/acpi/acpi_bus.h | 1 | ||||
| -rw-r--r-- | include/linux/pci.h | 2 | 
8 files changed, 38 insertions, 38 deletions
diff --git a/arch/ia64/pci/pci.c b/arch/ia64/pci/pci.c index 5faa66c5c2a..00e59c7ad3c 100644 --- a/arch/ia64/pci/pci.c +++ b/arch/ia64/pci/pci.c @@ -396,6 +396,14 @@ out1:  	return NULL;  } +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) +{ +	struct pci_controller *controller = bridge->bus->sysdata; + +	ACPI_HANDLE_SET(&bridge->dev, controller->acpi_handle); +	return 0; +} +  static int __devinit is_valid_resource(struct pci_dev *dev, int idx)  {  	unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM; diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index dba7805176b..9f437e97e9e 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h @@ -14,6 +14,9 @@  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 diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 0c01261fe5a..3d49094ed3e 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -522,6 +522,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)  	sd = &info->sd;  	sd->domain = domain;  	sd->node = node; +	sd->acpi = device->handle;  	/*  	 * Maybe the desired pci bus has been already scanned. In such case  	 * it is unnecessary to scan the pci bus with the given domain,busnum. @@ -593,6 +594,14 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)  	return bus;  } +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) +{ +	struct pci_sysdata *sd = bridge->bus->sysdata; + +	ACPI_HANDLE_SET(&bridge->dev, sd->acpi); +	return 0; +} +  int __init pci_acpi_init(void)  {  	struct pci_dev *dev = NULL; diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index 471b2dcb1c6..bf5108ad4d6 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -107,24 +107,6 @@ void acpi_pci_unregister_driver(struct acpi_pci_driver *driver)  }  EXPORT_SYMBOL(acpi_pci_unregister_driver); -acpi_handle acpi_get_pci_rootbridge_handle(unsigned int seg, unsigned int bus) -{ -	struct acpi_pci_root *root; -	acpi_handle handle = NULL; -	 -	mutex_lock(&acpi_pci_root_lock); -	list_for_each_entry(root, &acpi_pci_roots, node) -		if ((root->segment == (u16) seg) && -		    (root->secondary.start == (u16) bus)) { -			handle = root->device->handle; -			break; -		} -	mutex_unlock(&acpi_pci_root_lock); -	return handle; -} - -EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle); -  /**   * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge   * @handle - the ACPI CA node in question. diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index 42736e213f2..1c2587c4029 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -302,24 +302,6 @@ static int acpi_pci_find_device(struct device *dev, acpi_handle *handle)  	return 0;  } -static int acpi_pci_find_root_bridge(struct device *dev, acpi_handle *handle) -{ -	int num; -	unsigned int seg, bus; - -	/* -	 * The string should be the same as root bridge's name -	 * Please look at 'pci_scan_bus_parented' -	 */ -	num = sscanf(dev_name(dev), "pci%04x:%02x", &seg, &bus); -	if (num != 2) -		return -ENODEV; -	*handle = acpi_get_pci_rootbridge_handle(seg, bus); -	if (!*handle) -		return -ENODEV; -	return 0; -} -  static void pci_acpi_setup(struct device *dev)  {  	struct pci_dev *pci_dev = to_pci_dev(dev); @@ -378,7 +360,6 @@ static void pci_acpi_cleanup(struct device *dev)  static struct acpi_bus_type acpi_pci_bus = {  	.bus = &pci_bus_type,  	.find_device = acpi_pci_find_device, -	.find_bridge = acpi_pci_find_root_bridge,  	.setup = pci_acpi_setup,  	.cleanup = pci_acpi_cleanup,  }; diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 2dcd22d9c81..bbe4be7fc68 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1632,6 +1632,18 @@ unsigned int pci_scan_child_bus(struct pci_bus *bus)  	return max;  } +/** + * pcibios_root_bridge_prepare - Platform-specific host bridge setup. + * @bridge: Host bridge to set up. + * + * Default empty implementation.  Replace with an architecture-specific setup + * routine, if necessary. + */ +int __weak pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) +{ +	return 0; +} +  struct pci_bus *pci_create_root_bus(struct device *parent, int bus,  		struct pci_ops *ops, void *sysdata, struct list_head *resources)  { @@ -1665,6 +1677,10 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,  	bridge->dev.parent = parent;  	bridge->dev.release = pci_release_bus_bridge_dev;  	dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus); +	error = pcibios_root_bridge_prepare(bridge); +	if (error) +		goto bridge_dev_reg_err; +  	error = device_register(&bridge->dev);  	if (error)  		goto bridge_dev_reg_err; diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index a9e1421cd00..796ccc3247d 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h @@ -402,7 +402,6 @@ struct acpi_pci_root {  /* helper */  acpi_handle acpi_get_child(acpi_handle, u64);  int acpi_is_root_bridge(acpi_handle); -acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);  struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle);  #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)ACPI_HANDLE(dev)) diff --git a/include/linux/pci.h b/include/linux/pci.h index 907b455ab60..6860f4dec99 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -378,6 +378,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge *bridge,  		     void (*release_fn)(struct pci_host_bridge *),  		     void *release_data); +int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge); +  /*   * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond   * to P2P or CardBus bridge windows) go in a table.  Additional ones (for  |