* [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources @ 2011-08-26 9:07 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-26 9:07 UTC (permalink / raw) To: jbarnes, ralf Cc: linux-pci, linux-kernel, linux-mips, eyal, zenon, dczhu, dengcheng.zhu Change the pci_create_bus() interface to pass in available resources to get them settled down early. This is to avoid possible resource conflicts while doing pci_scan_slot() in pci_scan_child_bus(). Note that pcibios_fixup_bus() can get rid of such conflicts, but it's done AFTER scanning slots. In addition, MIPS PCI resources are now fixed using this new interface. -- Changes -- v3 - v2: o Do not do fixups for root buses in pcibios_fixup_bus(). o Skip bus creation when bus resources cannot be allocated. o PCI domain/bus numbers added to the error info in controller_resources(). v2 - v1: o Merge [PATCH 1/3] to [PATCH 3/3], so now 2 patches in total. o Add more info to patch description. o Fix arch breaks in default resource setup discovered by Bjorn Helgaas. Deng-Cheng Zhu (2): PCI: Pass available resources into pci_create_bus() MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() arch/microblaze/pci/pci-common.c | 3 +- arch/mips/pci/pci.c | 61 +++++++++++++++++++++++++++++++++----- arch/powerpc/kernel/pci-common.c | 3 +- arch/sparc/kernel/pci.c | 3 +- arch/x86/pci/acpi.c | 2 +- drivers/pci/probe.c | 15 +++++++-- include/linux/pci.h | 3 +- 7 files changed, 73 insertions(+), 17 deletions(-) ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources @ 2011-08-26 9:07 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-26 9:07 UTC (permalink / raw) To: jbarnes, ralf Cc: linux-pci, linux-kernel, linux-mips, eyal, zenon, dczhu, dengcheng.zhu Change the pci_create_bus() interface to pass in available resources to get them settled down early. This is to avoid possible resource conflicts while doing pci_scan_slot() in pci_scan_child_bus(). Note that pcibios_fixup_bus() can get rid of such conflicts, but it's done AFTER scanning slots. In addition, MIPS PCI resources are now fixed using this new interface. -- Changes -- v3 - v2: o Do not do fixups for root buses in pcibios_fixup_bus(). o Skip bus creation when bus resources cannot be allocated. o PCI domain/bus numbers added to the error info in controller_resources(). v2 - v1: o Merge [PATCH 1/3] to [PATCH 3/3], so now 2 patches in total. o Add more info to patch description. o Fix arch breaks in default resource setup discovered by Bjorn Helgaas. Deng-Cheng Zhu (2): PCI: Pass available resources into pci_create_bus() MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() arch/microblaze/pci/pci-common.c | 3 +- arch/mips/pci/pci.c | 61 +++++++++++++++++++++++++++++++++----- arch/powerpc/kernel/pci-common.c | 3 +- arch/sparc/kernel/pci.c | 3 +- arch/x86/pci/acpi.c | 2 +- drivers/pci/probe.c | 15 +++++++-- include/linux/pci.h | 3 +- 7 files changed, 73 insertions(+), 17 deletions(-) ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v3 1/2] PCI: Pass available resources into pci_create_bus() @ 2011-08-26 9:07 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-26 9:07 UTC (permalink / raw) To: jbarnes, ralf Cc: linux-pci, linux-kernel, linux-mips, eyal, zenon, dczhu, dengcheng.zhu Currently, after pci_create_bus(), resources available on the bus could be handled by pci_scan_child_bus(). The problem is that, in pci_scan_child_bus(), before calling arch-dependent pcibios_fixup_bus(), PCI quirks will probably conflict (while doing pci_claim_resource()) with resources like system controller's I/O resource that have not yet been added to the bus. One can see that, by default, ioport_resource and iomem_resource are filled into the bus->resource[] array as the initial resources in pci_create_bus(). So, to avoid such conflicts, add those really available resources right before returning the newly created bus in pci_create_bus() whose interface should then be extended to receive them. A related discussion thread can be found here: http://www.spinics.net/lists/mips/msg41654.html Signed-off-by: Deng-Cheng Zhu <dczhu@mips.com> --- Changes (v3 - v2): None Changes (v2 - v1): o Add more info to the patch description. o Fix arch breaks in default resource setup discovered by Bjorn Helgaas. arch/microblaze/pci/pci-common.c | 3 ++- arch/powerpc/kernel/pci-common.c | 3 ++- arch/sparc/kernel/pci.c | 3 ++- arch/x86/pci/acpi.c | 2 +- drivers/pci/probe.c | 15 +++++++++++---- include/linux/pci.h | 3 ++- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 4cfae20..9c35aa6 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -1581,7 +1581,8 @@ static void __devinit pcibios_scan_phb(struct pci_controller *hose) node ? node->full_name : "<NO NAME>"); /* Create an empty bus for the toplevel */ - bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); + bus = pci_create_bus(hose->parent, hose->first_busno, + hose->ops, hose, NULL); if (bus == NULL) { printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", hose->global_number); diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 32656f1..2ede26a 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1703,7 +1703,8 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose) node ? node->full_name : "<NO NAME>"); /* Create an empty bus for the toplevel */ - bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); + bus = pci_create_bus(hose->parent, hose->first_busno, + hose->ops, hose, NULL); if (bus == NULL) { pr_err("Failed to create bus for PCI domain %04x\n", hose->global_number); diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 1e94f94..77c38bb 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -689,7 +689,8 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm, printk("PCI: Scanning PBM %s\n", node->full_name); - bus = pci_create_bus(parent, pbm->pci_first_busno, pbm->pci_ops, pbm); + bus = pci_create_bus(parent, pbm->pci_first_busno, + pbm->pci_ops, pbm, NULL); if (!bus) { printk(KERN_ERR "Failed to create bus for %s\n", node->full_name); diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index c953302..bab2113 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -353,7 +353,7 @@ 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); + bus = pci_create_bus(NULL, busnum, &pci_root_ops, sd, NULL); if (bus) { get_current_resources(device, busnum, domain, bus); bus->subordinate = pci_scan_child_bus(bus); diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 8473727..47a364c 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1516,7 +1516,8 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus) } struct pci_bus * pci_create_bus(struct device *parent, - int bus, struct pci_ops *ops, void *sysdata) + int bus, struct pci_ops *ops, void *sysdata, + struct pci_bus_resource *bus_res) { int error; struct pci_bus *b, *b2; @@ -1570,8 +1571,14 @@ struct pci_bus * pci_create_bus(struct device *parent, pci_create_legacy_files(b); b->number = b->secondary = bus; - b->resource[0] = &ioport_resource; - b->resource[1] = &iomem_resource; + + /* Add initial resources to the bus */ + if (bus_res != NULL) + list_add_tail(&b->resources, &bus_res->list); + else { + b->resource[0] = &ioport_resource; + b->resource[1] = &iomem_resource; + } return b; @@ -1592,7 +1599,7 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, { struct pci_bus *b; - b = pci_create_bus(parent, bus, ops, sysdata); + b = pci_create_bus(parent, bus, ops, sysdata, NULL); if (b) b->subordinate = pci_scan_child_bus(b); return b; diff --git a/include/linux/pci.h b/include/linux/pci.h index 8c230cb..5e1bacd 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -666,7 +666,8 @@ static inline struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *o return root_bus; } struct pci_bus *pci_create_bus(struct device *parent, int bus, - struct pci_ops *ops, void *sysdata); + struct pci_ops *ops, void *sysdata, + struct pci_bus_resource *bus_res); struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr); void pcie_update_link_speed(struct pci_bus *bus, u16 link_status); -- 1.7.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 1/2] PCI: Pass available resources into pci_create_bus() @ 2011-08-26 9:07 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-26 9:07 UTC (permalink / raw) To: jbarnes, ralf Cc: linux-pci, linux-kernel, linux-mips, eyal, zenon, dczhu, dengcheng.zhu Currently, after pci_create_bus(), resources available on the bus could be handled by pci_scan_child_bus(). The problem is that, in pci_scan_child_bus(), before calling arch-dependent pcibios_fixup_bus(), PCI quirks will probably conflict (while doing pci_claim_resource()) with resources like system controller's I/O resource that have not yet been added to the bus. One can see that, by default, ioport_resource and iomem_resource are filled into the bus->resource[] array as the initial resources in pci_create_bus(). So, to avoid such conflicts, add those really available resources right before returning the newly created bus in pci_create_bus() whose interface should then be extended to receive them. A related discussion thread can be found here: http://www.spinics.net/lists/mips/msg41654.html Signed-off-by: Deng-Cheng Zhu <dczhu@mips.com> --- Changes (v3 - v2): None Changes (v2 - v1): o Add more info to the patch description. o Fix arch breaks in default resource setup discovered by Bjorn Helgaas. arch/microblaze/pci/pci-common.c | 3 ++- arch/powerpc/kernel/pci-common.c | 3 ++- arch/sparc/kernel/pci.c | 3 ++- arch/x86/pci/acpi.c | 2 +- drivers/pci/probe.c | 15 +++++++++++---- include/linux/pci.h | 3 ++- 6 files changed, 20 insertions(+), 9 deletions(-) diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 4cfae20..9c35aa6 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -1581,7 +1581,8 @@ static void __devinit pcibios_scan_phb(struct pci_controller *hose) node ? node->full_name : "<NO NAME>"); /* Create an empty bus for the toplevel */ - bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); + bus = pci_create_bus(hose->parent, hose->first_busno, + hose->ops, hose, NULL); if (bus == NULL) { printk(KERN_ERR "Failed to create bus for PCI domain %04x\n", hose->global_number); diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 32656f1..2ede26a 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1703,7 +1703,8 @@ void __devinit pcibios_scan_phb(struct pci_controller *hose) node ? node->full_name : "<NO NAME>"); /* Create an empty bus for the toplevel */ - bus = pci_create_bus(hose->parent, hose->first_busno, hose->ops, hose); + bus = pci_create_bus(hose->parent, hose->first_busno, + hose->ops, hose, NULL); if (bus == NULL) { pr_err("Failed to create bus for PCI domain %04x\n", hose->global_number); diff --git a/arch/sparc/kernel/pci.c b/arch/sparc/kernel/pci.c index 1e94f94..77c38bb 100644 --- a/arch/sparc/kernel/pci.c +++ b/arch/sparc/kernel/pci.c @@ -689,7 +689,8 @@ struct pci_bus * __devinit pci_scan_one_pbm(struct pci_pbm_info *pbm, printk("PCI: Scanning PBM %s\n", node->full_name); - bus = pci_create_bus(parent, pbm->pci_first_busno, pbm->pci_ops, pbm); + bus = pci_create_bus(parent, pbm->pci_first_busno, + pbm->pci_ops, pbm, NULL); if (!bus) { printk(KERN_ERR "Failed to create bus for %s\n", node->full_name); diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index c953302..bab2113 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c @@ -353,7 +353,7 @@ 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); + bus = pci_create_bus(NULL, busnum, &pci_root_ops, sd, NULL); if (bus) { get_current_resources(device, busnum, domain, bus); bus->subordinate = pci_scan_child_bus(bus); diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 8473727..47a364c 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1516,7 +1516,8 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus) } struct pci_bus * pci_create_bus(struct device *parent, - int bus, struct pci_ops *ops, void *sysdata) + int bus, struct pci_ops *ops, void *sysdata, + struct pci_bus_resource *bus_res) { int error; struct pci_bus *b, *b2; @@ -1570,8 +1571,14 @@ struct pci_bus * pci_create_bus(struct device *parent, pci_create_legacy_files(b); b->number = b->secondary = bus; - b->resource[0] = &ioport_resource; - b->resource[1] = &iomem_resource; + + /* Add initial resources to the bus */ + if (bus_res != NULL) + list_add_tail(&b->resources, &bus_res->list); + else { + b->resource[0] = &ioport_resource; + b->resource[1] = &iomem_resource; + } return b; @@ -1592,7 +1599,7 @@ struct pci_bus * __devinit pci_scan_bus_parented(struct device *parent, { struct pci_bus *b; - b = pci_create_bus(parent, bus, ops, sysdata); + b = pci_create_bus(parent, bus, ops, sysdata, NULL); if (b) b->subordinate = pci_scan_child_bus(b); return b; diff --git a/include/linux/pci.h b/include/linux/pci.h index 8c230cb..5e1bacd 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -666,7 +666,8 @@ static inline struct pci_bus * __devinit pci_scan_bus(int bus, struct pci_ops *o return root_bus; } struct pci_bus *pci_create_bus(struct device *parent, int bus, - struct pci_ops *ops, void *sysdata); + struct pci_ops *ops, void *sysdata, + struct pci_bus_resource *bus_res); struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev, int busnr); void pcie_update_link_speed(struct pci_bus *bus, u16 link_status); -- 1.7.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 2/2] MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() @ 2011-08-26 9:07 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-26 9:07 UTC (permalink / raw) To: jbarnes, ralf Cc: linux-pci, linux-kernel, linux-mips, eyal, zenon, dczhu, dengcheng.zhu Use the new interface of pci_create_bus() so that system controller's resources are added to the root bus upon bus creation, thereby avoiding conflicts with PCI quirks before pcibios_fixup_bus() gets the chance to do right things in pci_scan_child_bus(). Signed-off-by: Deng-Cheng Zhu <dczhu@mips.com> --- Changes (v3 - v2): o Do not do fixups for root buses in pcibios_fixup_bus(). o Skip bus creation when bus resources cannot be allocated. o PCI domain/bus numbers added to the error info in controller_resources(). o Patch description modified according to the changes above. Changes (v2 - v1): o Merge [PATCH 1/3] to [PATCH 3/3] of v1. o Add more info to patch description. arch/mips/pci/pci.c | 61 ++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 53 insertions(+), 8 deletions(-) diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 33bba7b..c76fb30 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c @@ -76,11 +76,42 @@ pcibios_align_resource(void *data, const struct resource *res, return start; } +static struct pci_bus_resource * +controller_resources(const struct pci_controller *ctrl, int domain, int busno) +{ + struct pci_bus_resource *mem_res, *io_res; + + mem_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL); + if (!mem_res) + goto err_out; + + mem_res->res = ctrl->mem_resource; + mem_res->flags = 0; + INIT_LIST_HEAD(&mem_res->list); + + io_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL); + if (!io_res) { + kfree(mem_res); + goto err_out; + } + + io_res->res = ctrl->io_resource; + io_res->flags = 0; + list_add(&io_res->list, &mem_res->list); + + return mem_res; +err_out: + printk(KERN_ERR "PCI bus %04x:%02x: Can't allocate bus resource.\n", + domain, busno); + return NULL; +} + static void __devinit pcibios_scanbus(struct pci_controller *hose) { static int next_busno; static int need_domain_info; - struct pci_bus *bus; + struct pci_bus *bus = NULL; + struct pci_bus_resource *bus_res; if (!hose->iommu) PCI_DMA_BUS_IS_PHYS = 1; @@ -88,7 +119,22 @@ static void __devinit pcibios_scanbus(struct pci_controller *hose) if (hose->get_busno && pci_probe_only) next_busno = (*hose->get_busno)(); - bus = pci_scan_bus(next_busno, hose->pci_ops, hose); + bus_res = controller_resources(hose, hose->index, next_busno); + if (bus_res) { + bus = pci_create_bus(NULL, next_busno, hose->pci_ops, + hose, bus_res); + if (bus) { + bus->subordinate = pci_scan_child_bus(bus); + pci_bus_add_devices(bus); + } else { + /* io_resource */ + kfree(list_first_entry(&bus_res->list, + struct pci_bus_resource, list)); + /* mem_resource */ + kfree(bus_res); + } + } + hose->bus = bus; need_domain_info = need_domain_info || hose->index; @@ -265,15 +311,14 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) { /* Propagate hose info into the subordinate devices. */ - struct pci_controller *hose = bus->sysdata; struct list_head *ln; struct pci_dev *dev = bus->self; - if (!dev) { - bus->resource[0] = hose->io_resource; - bus->resource[1] = hose->mem_resource; - } else if (pci_probe_only && - (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { + /* + * Root bus resources should already be set up correctly in + * pci_create_bus(), so don't do fixups for it. + */ + if (pci_probe_only && (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { pci_read_bridge_bases(bus); pcibios_fixup_device_resources(dev, bus); } -- 1.7.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v3 2/2] MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() @ 2011-08-26 9:07 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-26 9:07 UTC (permalink / raw) To: jbarnes, ralf Cc: linux-pci, linux-kernel, linux-mips, eyal, zenon, dczhu, dengcheng.zhu Use the new interface of pci_create_bus() so that system controller's resources are added to the root bus upon bus creation, thereby avoiding conflicts with PCI quirks before pcibios_fixup_bus() gets the chance to do right things in pci_scan_child_bus(). Signed-off-by: Deng-Cheng Zhu <dczhu@mips.com> --- Changes (v3 - v2): o Do not do fixups for root buses in pcibios_fixup_bus(). o Skip bus creation when bus resources cannot be allocated. o PCI domain/bus numbers added to the error info in controller_resources(). o Patch description modified according to the changes above. Changes (v2 - v1): o Merge [PATCH 1/3] to [PATCH 3/3] of v1. o Add more info to patch description. arch/mips/pci/pci.c | 61 ++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 53 insertions(+), 8 deletions(-) diff --git a/arch/mips/pci/pci.c b/arch/mips/pci/pci.c index 33bba7b..c76fb30 100644 --- a/arch/mips/pci/pci.c +++ b/arch/mips/pci/pci.c @@ -76,11 +76,42 @@ pcibios_align_resource(void *data, const struct resource *res, return start; } +static struct pci_bus_resource * +controller_resources(const struct pci_controller *ctrl, int domain, int busno) +{ + struct pci_bus_resource *mem_res, *io_res; + + mem_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL); + if (!mem_res) + goto err_out; + + mem_res->res = ctrl->mem_resource; + mem_res->flags = 0; + INIT_LIST_HEAD(&mem_res->list); + + io_res = kzalloc(sizeof(struct pci_bus_resource), GFP_KERNEL); + if (!io_res) { + kfree(mem_res); + goto err_out; + } + + io_res->res = ctrl->io_resource; + io_res->flags = 0; + list_add(&io_res->list, &mem_res->list); + + return mem_res; +err_out: + printk(KERN_ERR "PCI bus %04x:%02x: Can't allocate bus resource.\n", + domain, busno); + return NULL; +} + static void __devinit pcibios_scanbus(struct pci_controller *hose) { static int next_busno; static int need_domain_info; - struct pci_bus *bus; + struct pci_bus *bus = NULL; + struct pci_bus_resource *bus_res; if (!hose->iommu) PCI_DMA_BUS_IS_PHYS = 1; @@ -88,7 +119,22 @@ static void __devinit pcibios_scanbus(struct pci_controller *hose) if (hose->get_busno && pci_probe_only) next_busno = (*hose->get_busno)(); - bus = pci_scan_bus(next_busno, hose->pci_ops, hose); + bus_res = controller_resources(hose, hose->index, next_busno); + if (bus_res) { + bus = pci_create_bus(NULL, next_busno, hose->pci_ops, + hose, bus_res); + if (bus) { + bus->subordinate = pci_scan_child_bus(bus); + pci_bus_add_devices(bus); + } else { + /* io_resource */ + kfree(list_first_entry(&bus_res->list, + struct pci_bus_resource, list)); + /* mem_resource */ + kfree(bus_res); + } + } + hose->bus = bus; need_domain_info = need_domain_info || hose->index; @@ -265,15 +311,14 @@ void __devinit pcibios_fixup_bus(struct pci_bus *bus) { /* Propagate hose info into the subordinate devices. */ - struct pci_controller *hose = bus->sysdata; struct list_head *ln; struct pci_dev *dev = bus->self; - if (!dev) { - bus->resource[0] = hose->io_resource; - bus->resource[1] = hose->mem_resource; - } else if (pci_probe_only && - (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { + /* + * Root bus resources should already be set up correctly in + * pci_create_bus(), so don't do fixups for it. + */ + if (pci_probe_only && (dev->class >> 8) == PCI_CLASS_BRIDGE_PCI) { pci_read_bridge_bases(bus); pcibios_fixup_device_resources(dev, bus); } -- 1.7.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources 2011-08-26 9:07 ` Deng-Cheng Zhu ` (2 preceding siblings ...) (?) @ 2011-08-26 13:54 ` Bjorn Helgaas 2011-08-30 15:13 ` Bjorn Helgaas -1 siblings, 1 reply; 12+ messages in thread From: Bjorn Helgaas @ 2011-08-26 13:54 UTC (permalink / raw) To: Deng-Cheng Zhu Cc: jbarnes, ralf, linux-pci, linux-kernel, linux-mips, eyal, zenon, dengcheng.zhu On Fri, Aug 26, 2011 at 3:07 AM, Deng-Cheng Zhu <dczhu@mips.com> wrote: > Change the pci_create_bus() interface to pass in available resources to get them > settled down early. This is to avoid possible resource conflicts while doing > pci_scan_slot() in pci_scan_child_bus(). Note that pcibios_fixup_bus() can get > rid of such conflicts, but it's done AFTER scanning slots. > > In addition, MIPS PCI resources are now fixed using this new interface. > > -- Changes -- > v3 - v2: > o Do not do fixups for root buses in pcibios_fixup_bus(). > o Skip bus creation when bus resources cannot be allocated. > o PCI domain/bus numbers added to the error info in controller_resources(). > > v2 - v1: > o Merge [PATCH 1/3] to [PATCH 3/3], so now 2 patches in total. > o Add more info to patch description. > o Fix arch breaks in default resource setup discovered by Bjorn Helgaas. > > Deng-Cheng Zhu (2): > PCI: Pass available resources into pci_create_bus() > MIPS: PCI: Pass controller's resources to pci_create_bus() in > pcibios_scanbus() > > arch/microblaze/pci/pci-common.c | 3 +- > arch/mips/pci/pci.c | 61 +++++++++++++++++++++++++++++++++----- > arch/powerpc/kernel/pci-common.c | 3 +- > arch/sparc/kernel/pci.c | 3 +- > arch/x86/pci/acpi.c | 2 +- > drivers/pci/probe.c | 15 +++++++-- > include/linux/pci.h | 3 +- > 7 files changed, 73 insertions(+), 17 deletions(-) This is beautiful. Thanks for doing this work! I hope other architectures will follow your lead and get rid of their root bus resource fixups. Reviewed-by: Bjorn Helgaas <bhelgaas@google.com> ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources 2011-08-26 13:54 ` [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources Bjorn Helgaas @ 2011-08-30 15:13 ` Bjorn Helgaas 2011-08-31 4:50 ` Deng-Cheng Zhu 0 siblings, 1 reply; 12+ messages in thread From: Bjorn Helgaas @ 2011-08-30 15:13 UTC (permalink / raw) To: Deng-Cheng Zhu Cc: jbarnes, ralf, linux-pci, linux-kernel, linux-mips, eyal, zenon, dengcheng.zhu On Fri, Aug 26, 2011 at 7:54 AM, Bjorn Helgaas <bhelgaas@google.com> wrote: > On Fri, Aug 26, 2011 at 3:07 AM, Deng-Cheng Zhu <dczhu@mips.com> wrote: >> Change the pci_create_bus() interface to pass in available resources to get them >> settled down early. This is to avoid possible resource conflicts while doing >> pci_scan_slot() in pci_scan_child_bus(). Note that pcibios_fixup_bus() can get >> rid of such conflicts, but it's done AFTER scanning slots. >> >> In addition, MIPS PCI resources are now fixed using this new interface. >> >> -- Changes -- >> v3 - v2: >> o Do not do fixups for root buses in pcibios_fixup_bus(). >> o Skip bus creation when bus resources cannot be allocated. >> o PCI domain/bus numbers added to the error info in controller_resources(). >> >> v2 - v1: >> o Merge [PATCH 1/3] to [PATCH 3/3], so now 2 patches in total. >> o Add more info to patch description. >> o Fix arch breaks in default resource setup discovered by Bjorn Helgaas. >> >> Deng-Cheng Zhu (2): >> PCI: Pass available resources into pci_create_bus() >> MIPS: PCI: Pass controller's resources to pci_create_bus() in >> pcibios_scanbus() >> >> arch/microblaze/pci/pci-common.c | 3 +- >> arch/mips/pci/pci.c | 61 +++++++++++++++++++++++++++++++++----- >> arch/powerpc/kernel/pci-common.c | 3 +- >> arch/sparc/kernel/pci.c | 3 +- >> arch/x86/pci/acpi.c | 2 +- >> drivers/pci/probe.c | 15 +++++++-- >> include/linux/pci.h | 3 +- >> 7 files changed, 73 insertions(+), 17 deletions(-) > > This is beautiful. Thanks for doing this work! I hope other > architectures will follow your lead and get rid of their root bus > resource fixups. > > Reviewed-by: Bjorn Helgaas <bhelgaas@google.com> > One logistical issue here is that the first patch touches several architectures at once, which puts Jesse in a bit of a pinch. If he applies it, there's always the possibility that an arch patch will conflict with it, which makes merging harder. It might be easier if, instead of changing the pci_create_bus() interface, you added a new one (it could call pci_create_bus() then replace the resources, so the implementation could still be mostly shared.) We already have a plethora of "create bus" methods (pci_create_bus(), pci_scan_bus_parented(), pci_scan_bus()), but if you added a pci_create_root_bus() or something similar, maybe we could try to converge on it and obsolete the others. Then the first patch would touch only the PCI core, and the second would touch only MIPS, which would make merging more straightforward. Bjorn ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources @ 2011-08-31 4:50 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-31 4:50 UTC (permalink / raw) To: Bjorn Helgaas Cc: jbarnes, ralf, linux-pci, linux-kernel, linux-mips, eyal, zenon, dengcheng.zhu Hi, Bjorn Thanks for your constructive review. > One logistical issue here is that the first patch touches several > architectures at once, which puts Jesse in a bit of a pinch. If he > applies it, there's always the possibility that an arch patch will > conflict with it, which makes merging harder. In case the conflicts happen, the effort to resolve them should be trivial (a matter of an extra NULL argument), I suppose. Also, the odds of other incoming arch patches making a reference to pci_create_bus() should not be great. > It might be easier if, instead of changing the pci_create_bus() > interface, you added a new one (it could call pci_create_bus() then > replace the resources, so the implementation could still be mostly > shared.) We already have a plethora of "create bus" methods > (pci_create_bus(), pci_scan_bus_parented(), pci_scan_bus()), but if > you added a pci_create_root_bus() or something similar, maybe we could > try to converge on it and obsolete the others. > > Then the first patch would touch only the PCI core, and the second > would touch only MIPS, which would make merging more straightforward. > Hmm.. Adding a wrapper of pci_create_bus() does leave other architectures alone for this merging. But before all of them converge on it (a long way to go), the wrapper is adding naming confusion to the PCI core. Personally I think the current low-level transparent change to pci_create_bus() is appropriate enough. Does anybody have comments? Deng-Cheng ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources @ 2011-08-31 4:50 ` Deng-Cheng Zhu 0 siblings, 0 replies; 12+ messages in thread From: Deng-Cheng Zhu @ 2011-08-31 4:50 UTC (permalink / raw) To: Bjorn Helgaas Cc: jbarnes, ralf, linux-pci, linux-kernel, linux-mips, eyal, zenon, dengcheng.zhu Hi, Bjorn Thanks for your constructive review. > One logistical issue here is that the first patch touches several > architectures at once, which puts Jesse in a bit of a pinch. If he > applies it, there's always the possibility that an arch patch will > conflict with it, which makes merging harder. In case the conflicts happen, the effort to resolve them should be trivial (a matter of an extra NULL argument), I suppose. Also, the odds of other incoming arch patches making a reference to pci_create_bus() should not be great. > It might be easier if, instead of changing the pci_create_bus() > interface, you added a new one (it could call pci_create_bus() then > replace the resources, so the implementation could still be mostly > shared.) We already have a plethora of "create bus" methods > (pci_create_bus(), pci_scan_bus_parented(), pci_scan_bus()), but if > you added a pci_create_root_bus() or something similar, maybe we could > try to converge on it and obsolete the others. > > Then the first patch would touch only the PCI core, and the second > would touch only MIPS, which would make merging more straightforward. > Hmm.. Adding a wrapper of pci_create_bus() does leave other architectures alone for this merging. But before all of them converge on it (a long way to go), the wrapper is adding naming confusion to the PCI core. Personally I think the current low-level transparent change to pci_create_bus() is appropriate enough. Does anybody have comments? Deng-Cheng ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources 2011-08-31 4:50 ` Deng-Cheng Zhu (?) @ 2011-08-31 13:48 ` Bjorn Helgaas 2011-08-31 15:47 ` Jesse Barnes -1 siblings, 1 reply; 12+ messages in thread From: Bjorn Helgaas @ 2011-08-31 13:48 UTC (permalink / raw) To: Deng-Cheng Zhu Cc: jbarnes, ralf, linux-pci, linux-kernel, linux-mips, eyal, zenon, dengcheng.zhu On Tue, Aug 30, 2011 at 10:50 PM, Deng-Cheng Zhu <dczhu@mips.com> wrote: > Hi, Bjorn > > > Thanks for your constructive review. > >> One logistical issue here is that the first patch touches several >> architectures at once, which puts Jesse in a bit of a pinch. If he >> applies it, there's always the possibility that an arch patch will >> conflict with it, which makes merging harder. > > In case the conflicts happen, the effort to resolve them should be > trivial (a matter of an extra NULL argument), I suppose. Also, the odds > of other incoming arch patches making a reference to pci_create_bus() > should not be great. > >> It might be easier if, instead of changing the pci_create_bus() >> interface, you added a new one (it could call pci_create_bus() then >> replace the resources, so the implementation could still be mostly >> shared.) We already have a plethora of "create bus" methods >> (pci_create_bus(), pci_scan_bus_parented(), pci_scan_bus()), but if >> you added a pci_create_root_bus() or something similar, maybe we could >> try to converge on it and obsolete the others. >> >> Then the first patch would touch only the PCI core, and the second >> would touch only MIPS, which would make merging more straightforward. >> > > Hmm.. Adding a wrapper of pci_create_bus() does leave other > architectures alone for this merging. But before all of them converge on > it (a long way to go), the wrapper is adding naming confusion to the > PCI core. Personally I think the current low-level transparent change to > pci_create_bus() is appropriate enough. Does anybody have comments? > > > Deng-Cheng Just to be clear, I'm fine with it either way, as long as Jesse and the arch maintainers are OK with it. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources 2011-08-31 13:48 ` Bjorn Helgaas @ 2011-08-31 15:47 ` Jesse Barnes 0 siblings, 0 replies; 12+ messages in thread From: Jesse Barnes @ 2011-08-31 15:47 UTC (permalink / raw) To: Bjorn Helgaas Cc: Deng-Cheng Zhu, ralf, linux-pci, linux-kernel, linux-mips, eyal, zenon, dengcheng.zhu On Wed, 31 Aug 2011 07:48:16 -0600 Bjorn Helgaas <bhelgaas@google.com> wrote: > On Tue, Aug 30, 2011 at 10:50 PM, Deng-Cheng Zhu <dczhu@mips.com> wrote: > > Hi, Bjorn > > > > > > Thanks for your constructive review. > > > >> One logistical issue here is that the first patch touches several > >> architectures at once, which puts Jesse in a bit of a pinch. If he > >> applies it, there's always the possibility that an arch patch will > >> conflict with it, which makes merging harder. > > > > In case the conflicts happen, the effort to resolve them should be > > trivial (a matter of an extra NULL argument), I suppose. Also, the odds > > of other incoming arch patches making a reference to pci_create_bus() > > should not be great. > > > >> It might be easier if, instead of changing the pci_create_bus() > >> interface, you added a new one (it could call pci_create_bus() then > >> replace the resources, so the implementation could still be mostly > >> shared.) We already have a plethora of "create bus" methods > >> (pci_create_bus(), pci_scan_bus_parented(), pci_scan_bus()), but if > >> you added a pci_create_root_bus() or something similar, maybe we could > >> try to converge on it and obsolete the others. > >> > >> Then the first patch would touch only the PCI core, and the second > >> would touch only MIPS, which would make merging more straightforward. > >> > > > > Hmm.. Adding a wrapper of pci_create_bus() does leave other > > architectures alone for this merging. But before all of them converge on > > it (a long way to go), the wrapper is adding naming confusion to the > > PCI core. Personally I think the current low-level transparent change to > > pci_create_bus() is appropriate enough. Does anybody have comments? > > > > > > Deng-Cheng > > Just to be clear, I'm fine with it either way, as long as Jesse and > the arch maintainers are OK with it. I'm fine merging the arch bits too, as long as you can get some arch maintainer acks. If there are conflicts Linus will flag them (he likes to fix the occasional merge problem anyway). Thanks, -- Jesse Barnes, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2011-08-31 15:47 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-08-26 9:07 [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources Deng-Cheng Zhu 2011-08-26 9:07 ` Deng-Cheng Zhu 2011-08-26 9:07 ` [PATCH v3 1/2] PCI: Pass available resources into pci_create_bus() Deng-Cheng Zhu 2011-08-26 9:07 ` Deng-Cheng Zhu 2011-08-26 9:07 ` [PATCH v3 2/2] MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() Deng-Cheng Zhu 2011-08-26 9:07 ` Deng-Cheng Zhu 2011-08-26 13:54 ` [PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources Bjorn Helgaas 2011-08-30 15:13 ` Bjorn Helgaas 2011-08-31 4:50 ` Deng-Cheng Zhu 2011-08-31 4:50 ` Deng-Cheng Zhu 2011-08-31 13:48 ` Bjorn Helgaas 2011-08-31 15:47 ` Jesse Barnes
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.