Merge branch 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* 'linux-next' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: (74 commits) PCI: make msi_free_irqs() to use msix_mask_irq() instead of open coded write PCI: Fix the NIU MSI-X problem in a better way PCI ASPM: remove get_root_port_link PCI ASPM: cleanup pcie_aspm_sanity_check PCI ASPM: remove has_switch field PCI ASPM: cleanup calc_Lx_latency PCI ASPM: cleanup pcie_aspm_get_cap_device PCI ASPM: cleanup clkpm checks PCI ASPM: cleanup __pcie_aspm_check_state_one PCI ASPM: cleanup initialization PCI ASPM: cleanup change input argument of aspm functions PCI ASPM: cleanup misc in struct pcie_link_state PCI ASPM: cleanup clkpm state in struct pcie_link_state PCI ASPM: cleanup latency field in struct pcie_link_state PCI ASPM: cleanup aspm state field in struct pcie_link_state PCI ASPM: fix typo in struct pcie_link_state PCI: drivers/pci/slot.c should depend on CONFIG_SYSFS PCI: remove redundant __msi_set_enable() PCI PM: consistently use type bool for wake enable variable x86/ACPI: Correct maximum allowed _CRS returned resources and warn if exceeded ...
This commit is contained in:
@@ -38,15 +38,26 @@ count_resource(struct acpi_resource *acpi_res, void *data)
|
||||
struct acpi_resource_address64 addr;
|
||||
acpi_status status;
|
||||
|
||||
if (info->res_num >= PCI_BUS_NUM_RESOURCES)
|
||||
return AE_OK;
|
||||
|
||||
status = resource_to_addr(acpi_res, &addr);
|
||||
if (ACPI_SUCCESS(status))
|
||||
info->res_num++;
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
bus_has_transparent_bridge(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
|
||||
list_for_each_entry(dev, &bus->devices, bus_list) {
|
||||
u16 class = dev->class >> 8;
|
||||
|
||||
if (class == PCI_CLASS_BRIDGE_PCI && dev->transparent)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
setup_resource(struct acpi_resource *acpi_res, void *data)
|
||||
{
|
||||
@@ -56,9 +67,7 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
|
||||
acpi_status status;
|
||||
unsigned long flags;
|
||||
struct resource *root;
|
||||
|
||||
if (info->res_num >= PCI_BUS_NUM_RESOURCES)
|
||||
return AE_OK;
|
||||
int max_root_bus_resources = PCI_BUS_NUM_RESOURCES;
|
||||
|
||||
status = resource_to_addr(acpi_res, &addr);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
@@ -82,6 +91,18 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
|
||||
res->end = res->start + addr.address_length - 1;
|
||||
res->child = NULL;
|
||||
|
||||
if (bus_has_transparent_bridge(info->bus))
|
||||
max_root_bus_resources -= 3;
|
||||
if (info->res_num >= max_root_bus_resources) {
|
||||
printk(KERN_WARNING "PCI: Failed to allocate 0x%lx-0x%lx "
|
||||
"from %s for %s due to _CRS returning more than "
|
||||
"%d resource descriptors\n", (unsigned long) res->start,
|
||||
(unsigned long) res->end, root->name, info->name,
|
||||
max_root_bus_resources);
|
||||
info->res_num++;
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
if (insert_resource(root, res)) {
|
||||
printk(KERN_ERR "PCI: Failed to allocate 0x%lx-0x%lx "
|
||||
"from %s for %s\n", (unsigned long) res->start,
|
||||
@@ -217,7 +238,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do
|
||||
#endif
|
||||
}
|
||||
|
||||
if (bus && (pci_probe & PCI_USE__CRS))
|
||||
if (bus && !(pci_probe & PCI_NO_ROOT_CRS))
|
||||
get_current_resources(device, busnum, domain, bus);
|
||||
return bus;
|
||||
}
|
||||
|
@@ -101,7 +101,7 @@ void x86_pci_root_bus_res_quirks(struct pci_bus *b)
|
||||
struct pci_root_info *info;
|
||||
|
||||
/* don't go for it if _CRS is used */
|
||||
if (pci_probe & PCI_USE__CRS)
|
||||
if (!(pci_probe & PCI_NO_ROOT_CRS))
|
||||
return;
|
||||
|
||||
/* if only one root bus, don't need to anything */
|
||||
|
@@ -515,8 +515,8 @@ char * __devinit pcibios_setup(char *str)
|
||||
} else if (!strcmp(str, "assign-busses")) {
|
||||
pci_probe |= PCI_ASSIGN_ALL_BUSSES;
|
||||
return NULL;
|
||||
} else if (!strcmp(str, "use_crs")) {
|
||||
pci_probe |= PCI_USE__CRS;
|
||||
} else if (!strcmp(str, "nocrs")) {
|
||||
pci_probe |= PCI_NO_ROOT_CRS;
|
||||
return NULL;
|
||||
} else if (!strcmp(str, "earlydump")) {
|
||||
pci_early_dump_regs = 1;
|
||||
|
Reference in New Issue
Block a user