From: Junjie Cao <junjie.cao@intel.com>
To: 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>, Li Ming <ming.li@zohomail.com>,
Richard Cheng <icheng@nvidia.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH] cxl/regs: Reject register blocks in an unassigned BAR
Date: Thu, 10 Sep 2026 17:38:58 +0800 [thread overview]
Message-ID: <20260910093858.535969-1-junjie.cao@intel.com> (raw)
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>
---
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,
--
2.43.0
next reply other threads:[~2026-09-10 9:39 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-10 9:38 Junjie Cao [this message]
2026-09-10 9:54 ` [PATCH] cxl/regs: Reject register blocks in an unassigned BAR sashiko-bot
2026-09-10 15:38 ` Dave Jiang
2026-09-10 20:55 ` Jonathan Cameron
2026-09-11 9:50 ` Li Ming
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=20260910093858.535969-1-junjie.cao@intel.com \
--to=junjie.cao@intel.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=linux-cxl@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=ming.li@zohomail.com \
--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.