From: Li Ming <ming.li@zohomail.com>
To: Junjie Cao <junjie.cao@intel.com>,
Dave Jiang <dave.jiang@intel.com>,
Jonathan Cameron <jic23@kernel.org>,
Jonathan Cameron <jonathan.cameron@oss.qualcomm.com>,
Davidlohr Bueso <dave@stgolabs.net>,
Alison Schofield <alison.schofield@intel.com>,
Vishal Verma <vishal.l.verma@intel.com>,
Dan Williams <djbw@kernel.org>,
linux-cxl@vger.kernel.org
Cc: Ira Weiny <iweiny@kernel.org>, Richard Cheng <icheng@nvidia.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] cxl/regs: Reject register blocks in an unassigned BAR
Date: Fri, 11 Sep 2026 17:50:49 +0800 [thread overview]
Message-ID: <21cef59d-89e7-4dcc-80b6-3bba7a366b38@zohomail.com> (raw)
In-Reply-To: <20260910093858.535969-1-junjie.cao@intel.com>
On 9/10/2026 5:38 PM, Junjie Cao wrote:
> cxl_decode_regblock() only checks that the Register Locator offset fits
> pci_resource_len(). A BAR the PCI core could not place is reset to zero
> start, end and flags while config space keeps the firmware value, so a
> zero offset passes and the block is mapped at physical address 0. On
> x86 ioremap() of the reserved low megabyte succeeds, the component
> register header does not match, and a switch port fails with "HDM
> decoder capability not found", pointing at the HDM decoders rather than
> at the BAR.
>
> Reject a BAR with no length or still unassigned, next to the existing size
> check. Skip empty Register Locator entries first: they decode as BAR0
> offset 0 and would trip the check, and nothing looks them up.
>
> Seen with edk2-stable202602 (f6489621b8ae, reverted in stable202605),
> which places 64-bit non-prefetchable BARs behind a bridge in the
> prefetchable window. Linux refuses to claim them and the switch
> upstream and downstream port BAR0s find no room in the 32-bit window.
> QEMU q35 with a CXL switch, Fedora 43 edk2-ovmf-20260213, before:
>
> pci 0000:0d:00.0: BAR 0 [mem size 0x00010000 64bit]: can't assign; no space
> cxl_port port2: HDM decoder capability not found
>
> after:
>
> pcieport 0000:0d:00.0: BAR0: not assigned (type: 1)
> cxl_port port2: No component registers mapped
> cxl_port port2: Failed to map HDM decoder capability
>
> Link: https://github.com/tianocore/edk2/issues/13104
> Signed-off-by: Junjie Cao <junjie.cao@intel.com>
Reviewed-by: Li Ming <ming.li@zohomail.com>
> ---
> drivers/cxl/core/regs.c | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/drivers/cxl/core/regs.c b/drivers/cxl/core/regs.c
> index 20c2d9fbcfe7..41416fa2ce4a 100644
> --- a/drivers/cxl/core/regs.c
> +++ b/drivers/cxl/core/regs.c
> @@ -277,6 +277,20 @@ static bool cxl_decode_regblock(struct pci_dev *pdev, u32 reg_lo, u32 reg_hi,
> u64 offset = ((u64)reg_hi << 32) |
> (reg_lo & PCI_DVSEC_CXL_REG_LOCATOR_BLOCK_OFF_LOW);
>
> + if (reg_type == CXL_REGLOC_RBI_EMPTY)
> + return false;
> +
> + /*
> + * A BAR the PCI core could not place is reset to zero; decoding it
> + * would map the block at physical address 0.
> + */
> + if (!pci_resource_len(pdev, bar) ||
> + (pci_resource_flags(pdev, bar) & IORESOURCE_UNSET)) {
> + dev_warn(&pdev->dev, "BAR%d: not assigned (type: %d)\n", bar,
> + reg_type);
> + return false;
> + }
> +
> if (offset > pci_resource_len(pdev, bar)) {
> dev_warn(&pdev->dev,
> "BAR%d: %pr: too small (offset: %pa, type: %d)\n", bar,
next prev parent reply other threads:[~2026-09-11 9:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 9:38 [PATCH] cxl/regs: Reject register blocks in an unassigned BAR Junjie Cao
2026-09-10 9:54 ` sashiko-bot
2026-09-10 15:38 ` Dave Jiang
2026-09-10 20:55 ` Jonathan Cameron
2026-09-11 9:50 ` Li Ming [this message]
2026-09-11 16:04 ` Dave Jiang
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=21cef59d-89e7-4dcc-80b6-3bba7a366b38@zohomail.com \
--to=ming.li@zohomail.com \
--cc=alison.schofield@intel.com \
--cc=dave.jiang@intel.com \
--cc=dave@stgolabs.net \
--cc=djbw@kernel.org \
--cc=icheng@nvidia.com \
--cc=iweiny@kernel.org \
--cc=jic23@kernel.org \
--cc=jonathan.cameron@oss.qualcomm.com \
--cc=junjie.cao@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=vishal.l.verma@intel.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.