From: Deng-Cheng Zhu <dczhu@mips.com> To: <bhelgaas@google.com>, <jbarnes@virtuousgeek.org>, <ralf@linux-mips.org>, <monstr@monstr.eu>, <benh@kernel.crashing.org>, <paulus@samba.org>, <davem@davemloft.net>, <tglx@linutronix.de>, <mingo@redhat.com>, <hpa@zytor.com>, <x86@kernel.org> Cc: <linux-pci@vger.kernel.org>, <linux-kernel@vger.kernel.org>, <linux-mips@linux-mips.org>, <eyal@mips.com>, <zenon@mips.com>, <dczhu@mips.com>, <dengcheng.zhu@gmail.com> Subject: [RESEND PATCH v3 2/2] MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() Date: Thu, 1 Sep 2011 10:48:29 +0800 [thread overview] Message-ID: <1314845309-3277-3-git-send-email-dczhu@mips.com> (raw) In-Reply-To: <1314845309-3277-1-git-send-email-dczhu@mips.com> 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(). Reviewed-by: Bjorn Helgaas <bhelgaas@google.com> 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
WARNING: multiple messages have this Message-ID (diff)
From: Deng-Cheng Zhu <dczhu@mips.com> To: bhelgaas@google.com, jbarnes@virtuousgeek.org, ralf@linux-mips.org, monstr@monstr.eu, benh@kernel.crashing.org, paulus@samba.org, davem@davemloft.net, tglx@linutronix.de, mingo@redhat.com, hpa@zytor.com, x86@kernel.org Cc: linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mips@linux-mips.org, eyal@mips.com, zenon@mips.com, dczhu@mips.com, dengcheng.zhu@gmail.com Subject: [RESEND PATCH v3 2/2] MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() Date: Thu, 1 Sep 2011 10:48:29 +0800 [thread overview] Message-ID: <1314845309-3277-3-git-send-email-dczhu@mips.com> (raw) Message-ID: <20110901024829.JUhmoZ2cvFgShb81-0ja2wmwb_ArgFrlaMLayn2rcYs@z> (raw) In-Reply-To: <1314845309-3277-1-git-send-email-dczhu@mips.com> 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(). Reviewed-by: Bjorn Helgaas <bhelgaas@google.com> 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
next prev parent reply other threads:[~2011-09-01 2:58 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-09-01 2:48 [RESEND PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources Deng-Cheng Zhu 2011-09-01 2:48 ` Deng-Cheng Zhu 2011-09-01 2:48 ` [RESEND PATCH v3 1/2] PCI: Pass available resources into pci_create_bus() Deng-Cheng Zhu 2011-09-01 2:48 ` Deng-Cheng Zhu 2011-09-01 2:48 ` Deng-Cheng Zhu [this message] 2011-09-01 2:48 ` [RESEND PATCH v3 2/2] MIPS: PCI: Pass controller's resources to pci_create_bus() in pcibios_scanbus() Deng-Cheng Zhu 2011-10-07 21:50 ` [RESEND PATCH v3 0/2] Pass resources to pci_create_bus() and fix MIPS PCI resources Bjorn Helgaas 2011-10-10 21:04 ` Bjorn Helgaas 2011-10-10 23:49 ` Zhu, DengCheng 2011-10-11 7:48 ` Benjamin Herrenschmidt 2011-10-11 16:15 ` Bjorn Helgaas 2011-11-02 21:14 ` Jesse Barnes 2011-11-02 21:37 ` Bjorn Helgaas
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1314845309-3277-3-git-send-email-dczhu@mips.com \ --to=dczhu@mips.com \ --cc=benh@kernel.crashing.org \ --cc=bhelgaas@google.com \ --cc=davem@davemloft.net \ --cc=dengcheng.zhu@gmail.com \ --cc=eyal@mips.com \ --cc=hpa@zytor.com \ --cc=jbarnes@virtuousgeek.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mips@linux-mips.org \ --cc=linux-pci@vger.kernel.org \ --cc=mingo@redhat.com \ --cc=monstr@monstr.eu \ --cc=paulus@samba.org \ --cc=ralf@linux-mips.org \ --cc=tglx@linutronix.de \ --cc=x86@kernel.org \ --cc=zenon@mips.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.