Skip to content

Commit

Permalink
PCI/ACPI: Add _PRT interrupt routing info before enumerating devices
Browse files Browse the repository at this point in the history
We used to add the _PRT after enumerating devices behind a new host
bridge.  This moves the _PRT addition *before* the enumeration, since
it no longer depends on the struct pci_bus existing.  This is one
step towards consolidating the .add/.start methods.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Taku Izumi <izumim.taku@jp.fujitsu.com>
  • Loading branch information
Bjorn Helgaas committed Nov 5, 2012
1 parent 79c4412 commit d4761ba
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions drivers/acpi/pci_root.c
Original file line number Diff line number Diff line change
Expand Up @@ -501,6 +501,20 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
device->driver_data = root;

printk(KERN_INFO PREFIX "%s [%s] (domain %04x %pR)\n",
acpi_device_name(device), acpi_device_bid(device),
root->segment, &root->secondary);

/*
* PCI Routing Table
* -----------------
* Evaluate and parse _PRT, if exists.
*/
status = acpi_get_handle(device->handle, METHOD_NAME__PRT, &handle);
if (ACPI_SUCCESS(status))
result = acpi_pci_irq_add_prt(device->handle, root->segment,
root->secondary.start);

root->mcfg_addr = acpi_pci_root_get_mcfg_addr(device->handle);

/*
Expand All @@ -518,10 +532,6 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
list_add_tail(&root->node, &acpi_pci_roots);
mutex_unlock(&acpi_pci_root_lock);

printk(KERN_INFO PREFIX "%s [%s] (domain %04x %pR)\n",
acpi_device_name(device), acpi_device_bid(device),
root->segment, &root->secondary);

/*
* Scan the Root Bridge
* --------------------
Expand All @@ -547,16 +557,6 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
if (result)
goto out_del_root;

/*
* PCI Routing Table
* -----------------
* Evaluate and parse _PRT, if exists.
*/
status = acpi_get_handle(device->handle, METHOD_NAME__PRT, &handle);
if (ACPI_SUCCESS(status))
result = acpi_pci_irq_add_prt(device->handle, root->segment,
root->secondary.start);

/*
* Scan and bind all _ADR-Based Devices
*/
Expand Down Expand Up @@ -635,6 +635,8 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
mutex_lock(&acpi_pci_root_lock);
list_del(&root->node);
mutex_unlock(&acpi_pci_root_lock);

acpi_pci_irq_del_prt(root->segment, root->secondary.start);
end:
kfree(root);
return result;
Expand Down

0 comments on commit d4761ba

Please sign in to comment.