|
@@ -12,7 +12,7 @@ struct pci_root_info {
|
|
|
char *name;
|
|
|
unsigned int res_num;
|
|
|
struct resource *res;
|
|
|
- struct pci_bus *bus;
|
|
|
+ struct list_head *resources;
|
|
|
int busnum;
|
|
|
};
|
|
|
|
|
@@ -304,23 +304,20 @@ static void add_resources(struct pci_root_info *info)
|
|
|
"ignoring host bridge window %pR (conflicts with %s %pR)\n",
|
|
|
res, conflict->name, conflict);
|
|
|
else
|
|
|
- pci_bus_add_resource(info->bus, res, 0);
|
|
|
+ pci_add_resource(info->resources, res);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void
|
|
|
get_current_resources(struct acpi_device *device, int busnum,
|
|
|
- int domain, struct pci_bus *bus)
|
|
|
+ int domain, struct list_head *resources)
|
|
|
{
|
|
|
struct pci_root_info info;
|
|
|
size_t size;
|
|
|
|
|
|
- if (pci_use_crs)
|
|
|
- pci_bus_remove_resources(bus);
|
|
|
-
|
|
|
info.bridge = device;
|
|
|
- info.bus = bus;
|
|
|
info.res_num = 0;
|
|
|
+ info.resources = resources;
|
|
|
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_resource,
|
|
|
&info);
|
|
|
if (!info.res_num)
|
|
@@ -329,7 +326,7 @@ get_current_resources(struct acpi_device *device, int busnum,
|
|
|
size = sizeof(*info.res) * info.res_num;
|
|
|
info.res = kmalloc(size, GFP_KERNEL);
|
|
|
if (!info.res)
|
|
|
- goto res_alloc_fail;
|
|
|
+ return;
|
|
|
|
|
|
info.name = kasprintf(GFP_KERNEL, "PCI Bus %04x:%02x", domain, busnum);
|
|
|
if (!info.name)
|
|
@@ -344,8 +341,6 @@ get_current_resources(struct acpi_device *device, int busnum,
|
|
|
|
|
|
name_alloc_fail:
|
|
|
kfree(info.res);
|
|
|
-res_alloc_fail:
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
|
|
@@ -353,6 +348,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
|
|
|
struct acpi_device *device = root->device;
|
|
|
int domain = root->segment;
|
|
|
int busnum = root->secondary.start;
|
|
|
+ LIST_HEAD(resources);
|
|
|
struct pci_bus *bus;
|
|
|
struct pci_sysdata *sd;
|
|
|
int node;
|
|
@@ -407,11 +403,15 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_pci_root *root)
|
|
|
memcpy(bus->sysdata, sd, sizeof(*sd));
|
|
|
kfree(sd);
|
|
|
} else {
|
|
|
- bus = pci_create_bus(NULL, busnum, &pci_root_ops, sd);
|
|
|
- if (bus) {
|
|
|
- get_current_resources(device, busnum, domain, bus);
|
|
|
+ get_current_resources(device, busnum, domain, &resources);
|
|
|
+ if (list_empty(&resources))
|
|
|
+ x86_pci_root_bus_resources(busnum, &resources);
|
|
|
+ bus = pci_create_root_bus(NULL, busnum, &pci_root_ops, sd,
|
|
|
+ &resources);
|
|
|
+ if (bus)
|
|
|
bus->subordinate = pci_scan_child_bus(bus);
|
|
|
- }
|
|
|
+ else
|
|
|
+ pci_free_resource_list(&resources);
|
|
|
}
|
|
|
|
|
|
/* After the PCI-E bus has been walked and all devices discovered,
|