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 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.