From: "Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>
To: Sizhe Liu <liusizhe5@huawei.com>
Cc: bhelgaas@google.com, jonathan.cameron@huawei.com,
shiju.jose@huawei.com, linux-pci@vger.kernel.org,
linuxarm@huawei.com, prime.zeng@hisilicon.com,
fanghao11@huawei.com, shenyang39@huawei.com
Subject: Re: [PATCH] PCI: Fix PCI bridge resource allocation when base exceeds limit
Date: Tue, 3 Feb 2026 17:14:55 +0200 (EET) [thread overview]
Message-ID: <cc4121b7-b99e-d7e0-8c20-8a2f0d3a0e2d@linux.intel.com> (raw)
In-Reply-To: <20260203023545.2753811-1-liusizhe5@huawei.com>
On Tue, 3 Feb 2026, Sizhe Liu wrote:
> In pci_read_bridge_mmio_pref(), pci_read_bridge_mmio() and pci_read_bridge_io(),
> when the MEMORY_BASE value is greater than MEMORY_LIMIT,
> resource_set_range(res, 0, 0) is called to set both the start address
> and the size of the address of the PCI bridge resource to 0.
> However, the end address is later calculated as:
> res->end = res->start + size - 1
> As a result, the resource range becomes [0x00000000-0xffffffffffffffff]
> instead of the expected [0x00000000-0x00000000].
Hi,
Thanks for the patch but your understanding on how resources addresses
work is not correct.
A zero sized resource should have end at start - 1, just like
resource_set_range() sets it!
> This causes an exception in the subsequent resource claiming process,
> because the address range [0x00000000-0xffffffffffffffff] exceeds
> the range specified in the DSDT. The abnormal bridge triggers clipping
> when claiming resources, then the entire parent PCI bus address range
> becomes occupied. Other bridges on the same bus will report
> address conflicts during their claim process. The resource allocation
> may be degraded from 64-bit to 32-bit, or even worse, it fails.
>
> The related boot log is as follows:
> pci 0000:20:00.0: PCI bridge to [bus 21]
> pci 0000:20:00.0: bridge window [io size 0x0000 disabled]: can't claim; no address assigned
> pci 0000:20:00.0: [io 0x0000-0xffffffffffffffff disabled] clipped to [io 0x0000-0xffff disabled]
pci_bus_clip_resource() should not touch IORESOURCE_DISABLED resources
nor zero sized resources. The problem seems to originate from
pci_claim_bridge_resources() and pci_claim_bridge_resource() which try to
claim such resources no matter what.
I think pci_claim_bridge_resources() should check if IORESOURCE_DISABLED
is set and use continue, it already has check !r->flags which probably
worked prior to 8278c6914306 ("PCI: Preserve bridge window resource type
flags") but is no longer enough to decided if bridge window is valid or
not.
Do you want to do that patch and test it? (I'm quite busy this week
myself.)
> pci 0000:20:00.0: bridge window [io 0x0000-0xffff disabled]
> pci 0000:20:00.0: bridge window [mem size 0x00000000 disabled]: can't claim; no address assigned
> pci 0000:20:00.0: [mem 0x00000000-0xffffffffffffffff disabled] clipped to [mem 0x800000000000-0x8013ffffffff disabled]
> pci 0000:20:00.0: bridge window [mem 0x800000000000-0x8013ffffffff disabled]: can't claim; no compatible bridge window
> pci 0000:20:00.0: bridge window [mem size 0x00000000 64bit pref disabled]: can't claim; no address assigned
> pci 0000:20:00.0: [mem 0x00000000-0xffffffffffffffff 64bit pref disabled] clipped to [mem 0x800000000000-0x8013ffffffff 64bit pref disabled]
> pci 0000:20:00.0: bridge window [mem 0x800000000000-0x8013ffffffff 64bit pref disabled]
> pci 0000:20:08.0: PCI bridge to [bus 22]
> pci 0000:20:08.0: bridge window [io size 0x0000 disabled]: can't claim; no address assigned
> pci 0000:20:08.0: [io 0x0000-0xffffffffffffffff disabled] clipped to [io 0x0000-0xffff disabled]
> pci 0000:20:08.0: bridge window [io 0x0000-0xffff disabled]: can't claim; address conflict with PCI Bus 0000:21 [io 0x0000-0xffff disabled]
> pci 0000:20:08.0: bridge window [mem size 0x00000000 disabled]: can't claim; no address assigned
> pci 0000:20:08.0: [mem 0x00000000-0xffffffffffffffff disabled] clipped to [mem 0x800000000000-0x8013ffffffff disabled]
> pci 0000:20:08.0: bridge window [mem 0x800000000000-0x8013ffffffff disabled]: can't claim; no compatible bridge window
> pci 0000:20:08.0: bridge window [mem size 0x00000000 64bit pref disabled]: can't claim; no address assigned
> pci 0000:20:08.0: [mem 0x00000000-0xffffffffffffffff 64bit pref disabled] clipped to [mem 0x800000000000-0x8013ffffffff 64bit pref disabled]
> pci 0000:20:08.0: bridge window [mem 0x800000000000-0x8013ffffffff 64bit pref disabled]: can't claim; address conflict with PCI Bus 0000:21 [mem 0x800000000000-0x8013ffffffff 64bit pref disabled]
> pci 0000:20:09.0: PCI bridge to [bus 23]
> pci 0000:20:09.0: bridge window [io 0x0000-0x0fff]: can't claim; address conflict with PCI Bus 0000:21 [io 0x0000-0xffff disabled]
> pci 0000:20:09.0: bridge window [mem 0x800003000000-0x8000048fffff 64bit pref]: can't claim; address conflict with PCI Bus 0000:21 [mem 0x800000000000-0x8013ffffffff 64bit pref disabled]
>
> Solution:
> A comment in pci_read_bridge_mmio_pref() states:
> /*
> * Some bridges set the base > limit by default, and some
> * (broken) BIOSes do not initialize them. If we find
> * this, just assume they are not being used.
> */
> When the base is greater than the limit, a proper fix is to set the
> resource flag to IORESOURCE_UNSET or IORESOURCE_DISABLED while keeping
> the start and end addresses as 0. This prevents the clipping process
> from being triggered incorrectly.
>
> Fixes: 8278c6914306 ("PCI: Preserve bridge window resource type flags")
> Signed-off-by: Sizhe Liu <liusizhe5@huawei.com>
> ---
> drivers/pci/probe.c | 3 ---
> 1 file changed, 3 deletions(-)
>
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 41183aed8f5d..561f2420d9eb 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -429,7 +429,6 @@ static void pci_read_bridge_io(struct pci_dev *dev, struct resource *res,
> if (log)
> pci_info(dev, " bridge window %pR\n", res);
> } else {
> - resource_set_range(res, 0, 0);
> res->flags |= IORESOURCE_UNSET | IORESOURCE_DISABLED;
> }
> }
> @@ -455,7 +454,6 @@ static void pci_read_bridge_mmio(struct pci_dev *dev, struct resource *res,
> if (log)
> pci_info(dev, " bridge window %pR\n", res);
> } else {
> - resource_set_range(res, 0, 0);
> res->flags |= IORESOURCE_UNSET | IORESOURCE_DISABLED;
> }
> }
> @@ -511,7 +509,6 @@ static void pci_read_bridge_mmio_pref(struct pci_dev *dev, struct resource *res,
> if (log)
> pci_info(dev, " bridge window %pR\n", res);
> } else {
> - resource_set_range(res, 0, 0);
> res->flags |= IORESOURCE_UNSET | IORESOURCE_DISABLED;
> }
> }
--
i.
next prev parent reply other threads:[~2026-02-03 15:15 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-03 2:35 [PATCH] PCI: Fix PCI bridge resource allocation when base exceeds limit Sizhe Liu
2026-02-03 15:14 ` Ilpo Järvinen [this message]
2026-02-03 17:21 ` Ilpo Järvinen
2026-02-04 8:56 ` Sizhe LIU
2026-02-06 22:17 ` Bjorn Helgaas
2026-02-04 3:58 ` Sizhe LIU
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=cc4121b7-b99e-d7e0-8c20-8a2f0d3a0e2d@linux.intel.com \
--to=ilpo.jarvinen@linux.intel.com \
--cc=bhelgaas@google.com \
--cc=fanghao11@huawei.com \
--cc=jonathan.cameron@huawei.com \
--cc=linux-pci@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=liusizhe5@huawei.com \
--cc=prime.zeng@hisilicon.com \
--cc=shenyang39@huawei.com \
--cc=shiju.jose@huawei.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