[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250715191143.1023512-17-rrichter@amd.com>
Date: Tue, 15 Jul 2025 21:11:39 +0200
From: Robert Richter <rrichter@....com>
To: 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>, Jonathan Cameron <Jonathan.Cameron@...wei.com>,
Dave Jiang <dave.jiang@...el.com>, Davidlohr Bueso <dave@...olabs.net>
CC: <linux-cxl@...r.kernel.org>, <linux-kernel@...r.kernel.org>, Gregory Price
<gourry@...rry.net>, "Fabio M. De Francesco"
<fabio.m.de.francesco@...ux.intel.com>, Terry Bowman <terry.bowman@....com>,
Robert Richter <rrichter@....com>
Subject: [PATCH v1 16/20] cxl/region: Introduce @hpa_range to struct cxl_region
Each region has a known host physical address (HPA) range it is
assigned to. All assigned ports to that region share the same hpa
range. The region's address range is the system's physical address
(SPA) range. That is, for regions there is hpa == spa.
As systems with address translation have hpa != spa, track the
region's spa range and introduce @hpa_range to struct cxl_region.
The introduction of @hpa_range also helps further reworking
construct_region() in order to move the create_region() call out of
the function and remove @cxled from the parameter list.
Signed-off-by: Robert Richter <rrichter@....com>
---
drivers/cxl/core/region.c | 18 ++++++++++++++++++
drivers/cxl/cxl.h | 2 ++
2 files changed, 20 insertions(+)
diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
index 81ff9956a128..7e21946072a5 100644
--- a/drivers/cxl/core/region.c
+++ b/drivers/cxl/core/region.c
@@ -653,6 +653,11 @@ static int alloc_hpa(struct cxl_region *cxlr, resource_size_t size)
return PTR_ERR(res);
}
+ cxlr->hpa_range = (struct range) {
+ .start = res->start,
+ .end = res->end,
+ };
+
p->res = res;
p->state = CXL_CONFIG_INTERLEAVE_ACTIVE;
@@ -689,8 +694,14 @@ static int free_hpa(struct cxl_region *cxlr)
if (p->state >= CXL_CONFIG_ACTIVE)
return -EBUSY;
+ cxlr->hpa_range = (struct range) {
+ .start = 0,
+ .end = -1,
+ };
+
cxl_region_iomem_release(cxlr);
p->state = CXL_CONFIG_IDLE;
+
return 0;
}
@@ -2496,6 +2507,11 @@ static void unregister_region(void *_cxlr)
for (i = 0; i < p->interleave_ways; i++)
detach_target(cxlr, i);
+ cxlr->hpa_range = (struct range) {
+ .start = 0,
+ .end = -1,
+ };
+
cxl_region_iomem_release(cxlr);
put_device(&cxlr->dev);
}
@@ -3354,6 +3370,7 @@ static struct cxl_region *create_region(struct cxl_root_decoder *cxlrd,
struct cxl_dev_state *cxlds = cxlmd->cxlds;
int part = READ_ONCE(cxled->part);
enum cxl_partition_mode mode = cxlds->part[part].mode;
+ struct range *hpa = &cxled->cxld.hpa_range;
struct cxl_region *cxlr;
struct cxl_region_params *p;
@@ -3381,6 +3398,7 @@ static struct cxl_region *create_region(struct cxl_root_decoder *cxlrd,
cxlr->mode = mode;
cxlr->type = CXL_DECODER_HOSTONLYMEM;
set_bit(CXL_REGION_F_AUTO, &cxlr->flags);
+ cxlr->hpa_range = *hpa;
p = &cxlr->params;
p->interleave_ways = cxled->cxld.interleave_ways;
diff --git a/drivers/cxl/cxl.h b/drivers/cxl/cxl.h
index 58c9db0bfb93..cdca44556039 100644
--- a/drivers/cxl/cxl.h
+++ b/drivers/cxl/cxl.h
@@ -509,6 +509,7 @@ enum cxl_partition_mode {
* @dev: This region's device
* @id: This region's id. Id is globally unique across all regions
* @cxlrd: Region's root decoder
+ * @hpa_range: Address range occupied by the region
* @mode: Operational mode of the mapped capacity
* @type: Endpoint decoder target type
* @cxl_nvb: nvdimm bridge for coordinating @cxlr_pmem setup / shutdown
@@ -523,6 +524,7 @@ struct cxl_region {
struct device dev;
int id;
struct cxl_root_decoder *cxlrd;
+ struct range hpa_range;
enum cxl_partition_mode mode;
enum cxl_decoder_type type;
struct cxl_nvdimm_bridge *cxl_nvb;
--
2.39.5
Powered by blists - more mailing lists