From: Bjorn Helgaas <bhelgaas@google.com>
To: Yinghai Lu <yinghai@kernel.org>
Cc: "Marek Kordík" <kordikmarek@gmail.com>,
"Gavin Shan" <gwshan@linux.vnet.ibm.com>,
"Benjamin Herrenschmidt" <benh@kernel.crashing.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"Alexey Voronkov" <zermond@gmail.com>,
"David Airlie" <airlied@linux.ie>,
"Alex Deucher" <alexdeucher@gmail.com>,
"Richard Yang" <weiyang@linux.vnet.ibm.com>
Subject: Re: Regression: bug 85491: radeon 0000:01:00.0: Fatal error during GPU init
Date: Tue, 23 Dec 2014 14:41:06 -0700 [thread overview]
Message-ID: <20141223214106.GA27291@google.com> (raw)
In-Reply-To: <CAE9FiQVggbU5u__0z8p33J9hQ39CtQ-vpQbZyjG-LO9aqN05Lw@mail.gmail.com>
On Mon, Dec 22, 2014 at 05:53:55PM -0800, Yinghai Lu wrote:
> On Fri, Dec 19, 2014 at 5:33 PM, Yinghai Lu <yinghai@kernel.org> wrote:
> > On Fri, Dec 19, 2014 at 4:56 PM, Bjorn Helgaas <bhelgaas@google.com> wrote:
> >>
> >> Marek's case is a little easier because his system is using _CRS. We
> >> should be able to notice that the Root Port window overlaps the host
> >> bridge window, but isn't contained by it. In that case, if we merely
> >> trim the Root Port window so it fits, everything will just work.
> >
> > Ok, will check that Monday.
>
> Please check attached patch that clip bridge resource.
>
> Marek, can you give it a try on top of v3.18?
>
> Thanks
>
> Yinghai
> Subject: [RFC PATCH] PCI, x86: clip firmware assigned pci bridges under hostbridge
>
> Some bios put range that is not fully coverred by root bus resources.
> Try to clip them and update them in pci bridge bars.
>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=85491
> Reported-by: Marek Kordik <kordikmarek@gmail.com>
> Fixes: 5b28541552ef ("PCI: Restrict 64-bit prefetchable bridge windows to 64-bit resources")
> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
>
> ---
> arch/x86/pci/i386.c | 43 +++++++++++++++++++++++++++++++------------
> drivers/pci/host-bridge.c | 31 +++++++++++++++++++++++++++++++
> include/linux/pci.h | 2 ++
> 3 files changed, 64 insertions(+), 12 deletions(-)
>
> Index: linux-2.6/arch/x86/pci/i386.c
> ===================================================================
> --- linux-2.6.orig/arch/x86/pci/i386.c
> +++ linux-2.6/arch/x86/pci/i386.c
> @@ -205,10 +205,11 @@ EXPORT_SYMBOL(pcibios_align_resource);
> * as well.
> */
>
> -static void pcibios_allocate_bridge_resources(struct pci_dev *dev)
> +static bool pcibios_allocate_bridge_resources(struct pci_dev *dev)
> {
> int idx;
> struct resource *r;
> + bool changed = false;
>
> for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
> r = &dev->resource[idx];
> @@ -216,17 +217,31 @@ static void pcibios_allocate_bridge_reso
> continue;
> if (r->parent) /* Already allocated */
> continue;
> - if (!r->start || pci_claim_resource(dev, idx) < 0) {
> - /*
> - * Something is wrong with the region.
> - * Invalidate the resource to prevent
> - * child resource allocations in this
> - * range.
> - */
> - r->start = r->end = 0;
> - r->flags = 0;
> + if (!r->start)
> + goto clear;
> + if (pci_claim_resource(dev, idx) < 0) {
> + /* try again after clip for pci bridge*/
> + if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
> + pcibios_resource_clip_in_host_bridge(dev->bus, r)) {
Can you do this so it clips to any upstream bridge, whether it's a host
bridge or a PCI-to-PCI bridge? It doesn't seem like this has to be
specific to host bridge windows -- any device below a PCI-to-PCI bridge has
to use address space forwarded by that upstream bridge.
I wish this were in generic code. There's nothing architecture-specific
about the problem, but this patch only fixes things on x86. Can you make a
similar change in the corresponding code for other arches, as well?
> + changed = true;
> + if (pci_claim_resource(dev, idx) >= 0)
> + continue;
> + }
> + goto clear;
> }
> + continue;
> +clear:
> + /*
> + * Something is wrong with the region.
> + * Invalidate the resource to prevent
> + * child resource allocations in this
> + * range.
> + */
> + r->start = r->end = 0;
> + r->flags = 0;
> }
> +
> + return changed;
> }
>
> static void pcibios_allocate_bus_resources(struct pci_bus *bus)
> @@ -234,8 +249,12 @@ static void pcibios_allocate_bus_resourc
> struct pci_bus *child;
>
> /* Depth-First Search on bus tree */
> - if (bus->self)
> - pcibios_allocate_bridge_resources(bus->self);
> + if (bus->self) {
> + bool changed = pcibios_allocate_bridge_resources(bus->self);
> +
> + if (changed)
> + pci_setup_bridge(bus);
> + }
> list_for_each_entry(child, &bus->children, node)
> pcibios_allocate_bus_resources(child);
> }
> Index: linux-2.6/drivers/pci/host-bridge.c
> ===================================================================
> --- linux-2.6.orig/drivers/pci/host-bridge.c
> +++ linux-2.6/drivers/pci/host-bridge.c
> @@ -31,6 +31,37 @@ void pci_set_host_bridge_release(struct
> bridge->release_data = release_data;
> }
>
> +bool pcibios_resource_clip_in_host_bridge(struct pci_bus *bus,
> + struct resource *res)
> +{
> + struct pci_host_bridge *bridge = find_pci_host_bridge(bus);
> + struct pci_host_bridge_window *window;
> + resource_size_t start, end;
> +
> + list_for_each_entry(window, &bridge->windows, list) {
> + if (resource_type(res) != resource_type(window->res))
> + continue;
> +
> + start = max(window->res->start, res->start);
> + end = min(window->res->end, res->end);
> +
> + /* no overlap ? */
> + if (start > end)
> + continue;
> +
> + if (res->start == start && res->end == end)
> + return false;
> +
> + /* changed */
> + res->start = start;
> + res->end = end;
I think it'd be useful to emit a diagnostic here so there's a clue in dmesg
about what's going on.
> + return true;
> + }
> +
> + return false;
> +}
> +
> void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region,
> struct resource *res)
> {
> Index: linux-2.6/include/linux/pci.h
> ===================================================================
> --- linux-2.6.orig/include/linux/pci.h
> +++ linux-2.6/include/linux/pci.h
> @@ -762,6 +762,8 @@ void pci_fixup_cardbus(struct pci_bus *)
>
> /* Generic PCI functions used internally */
>
> +bool pcibios_resource_clip_in_host_bridge(struct pci_bus *bus,
> + struct resource *res);
> void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *region,
> struct resource *res);
> void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res,
next prev parent reply other threads:[~2014-12-23 21:41 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-03 22:15 Regression: bug 85491: radeon 0000:01:00.0: Fatal error during GPU init Bjorn Helgaas
2014-12-04 0:51 ` Bjorn Helgaas
2014-12-04 1:44 ` Yinghai Lu
2014-12-04 17:34 ` Bjorn Helgaas
2014-12-04 22:06 ` Yinghai Lu
2014-12-05 10:59 ` Benjamin Herrenschmidt
2014-12-08 0:47 ` Gavin Shan
2014-12-08 21:04 ` Bjorn Helgaas
2014-12-08 21:38 ` Benjamin Herrenschmidt
2014-12-08 21:46 ` Bjorn Helgaas
2014-12-08 23:38 ` Gavin Shan
2014-12-09 0:21 ` Yinghai Lu
2014-12-19 22:17 ` Bjorn Helgaas
2014-12-20 0:23 ` Bjorn Helgaas
2014-12-20 0:34 ` Yinghai Lu
2014-12-20 0:56 ` Bjorn Helgaas
2014-12-20 1:33 ` Yinghai Lu
2014-12-23 1:53 ` Yinghai Lu
2014-12-23 21:41 ` Bjorn Helgaas [this message]
2014-12-24 2:29 ` Yinghai Lu
2014-12-24 17:26 ` Bjorn Helgaas
2014-12-24 20:29 ` Yinghai Lu
2014-12-25 15:46 ` Marek Kordík
2014-12-25 21:12 ` Yinghai Lu
2015-01-09 18:45 ` Bjorn Helgaas
2015-01-09 20:38 ` Yinghai Lu
2014-12-22 8:17 ` Wei Yang
2014-12-22 19:50 ` Bjorn Helgaas
2014-12-04 1:38 ` Yinghai Lu
2014-12-04 1:41 ` Yinghai Lu
2014-12-04 16:15 ` Bjorn Helgaas
2014-12-04 22:15 ` Yinghai Lu
2014-12-04 22:25 ` Bjorn Helgaas
2014-12-04 2:01 ` Yinghai Lu
2014-12-04 16:37 ` Bjorn Helgaas
2014-12-04 22:24 ` Yinghai Lu
2014-12-05 0:24 ` Yinghai Lu
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=20141223214106.GA27291@google.com \
--to=bhelgaas@google.com \
--cc=airlied@linux.ie \
--cc=alexdeucher@gmail.com \
--cc=benh@kernel.crashing.org \
--cc=gwshan@linux.vnet.ibm.com \
--cc=kordikmarek@gmail.com \
--cc=linux-pci@vger.kernel.org \
--cc=weiyang@linux.vnet.ibm.com \
--cc=yinghai@kernel.org \
--cc=zermond@gmail.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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox