[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251015024019.1189713-3-vaslot@nvidia.com>
Date: Tue, 14 Oct 2025 19:40:06 -0700
From: Vishal Aslot <vaslot@...dia.com>
To: Davidlohr Bueso <dave@...olabs.net>, Jonathan Cameron
<jonathan.cameron@...wei.com>, Dave Jiang <dave.jiang@...el.com>, "Alison
Schofield" <alison.schofield@...el.com>, Vishal Verma
<vishal.l.verma@...el.com>, Ira Weiny <ira.weiny@...el.com>, Dan Williams
<dan.j.williams@...el.com>, Li Ming <ming.li@...omail.com>, Vishal Aslot
<vaslot@...dia.com>, "open list:COMPUTE EXPRESS LINK (CXL)"
<linux-cxl@...r.kernel.org>, open list <linux-kernel@...r.kernel.org>
Subject: [PATCH v1 2/2] cxl: Allow zero sized HDM decoders
CXL spec permits committing zero sized decoders.
Linux currently considers them as an error.
Zero-sized decoders are helpful when the BIOS
is committing them. Often BIOS will also lock
them to prevent them being changed due to the
TSP requirement. For example, if the type 3
device is part of a TCB.
The host bridge, switch, and end-point decoders
can all be committed with zero-size. If they are
locked along the VH, it is often to prevent
hotplugging of a new device that could not be
attested post boot and cannot be included in
TCB.
The caller leaves the decoder allocated but does
not add it. It simply continues to the next decoder.
Signed-off-by: Vishal Aslot <vaslot@...dia.com>
---
drivers/cxl/core/hdm.c | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/drivers/cxl/core/hdm.c b/drivers/cxl/core/hdm.c
index d3a094ca01ad..1c036a485723 100644
--- a/drivers/cxl/core/hdm.c
+++ b/drivers/cxl/core/hdm.c
@@ -1036,13 +1036,14 @@ static int init_hdm_decoder(struct cxl_port *port, struct cxl_decoder *cxld,
return -ENXIO;
}
+ port->commit_end = cxld->id;
+
if (size == 0) {
- dev_warn(&port->dev,
+ dev_dbg(&port->dev,
"decoder%d.%d: Committed with zero size\n",
port->id, cxld->id);
- return -ENXIO;
+ return -ENOSPC;
}
- port->commit_end = cxld->id;
} else {
if (cxled) {
struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
@@ -1198,6 +1199,8 @@ static int devm_cxl_enumerate_decoders(struct cxl_hdm *cxlhdm,
rc = init_hdm_decoder(port, cxld, hdm, i, &dpa_base, info);
if (rc) {
+ if (rc == -ENOSPC)
+ continue;
dev_warn(&port->dev,
"Failed to initialize decoder%d.%d\n",
port->id, i);
--
2.43.0
Powered by blists - more mailing lists