From: Ira Weiny <ira.weiny@intel.com>
To: Alison Schofield <alison.schofield@intel.com>
Cc: Vishal Verma <vishal.l.verma@intel.com>,
Jonathan Cameron <jonathan.cameron@Huawei.com>,
Fan Ni <fan.ni@samsung.com>,
Sushant1 Kumar <sushant1.kumar@intel.com>,
Dan Williams <dan.j.williams@intel.com>,
Dave Jiang <dave.jiang@intel.com>,
linux-cxl@vger.kernel.org, nvdimm@lists.linux.dev,
Ira Weiny <ira.weiny@intel.com>
Subject: [ndctl PATCH v4 3/9] libcxl: Separate region mode from decoder mode
Date: Sat, 14 Dec 2024 20:58:30 -0600 [thread overview]
Message-ID: <20241214-dcd-region2-v4-3-36550a97f8e2@intel.com> (raw)
In-Reply-To: <20241214-dcd-region2-v4-0-36550a97f8e2@intel.com>
With the introduction of DCD, region mode and decoder mode no longer
remain a 1:1 relation. An interleaved region may be made up of Dynamic
Capacity partitions with different indexes on each of the target
devices.
Introduce a new region mode enumeration and access function to libcxl.
To maintain compatibility with existing software the region mode values
are defined the same as the current decoder mode. In addition
cxl_region_get_mode() is retained.
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
---
Documentation/cxl/lib/libcxl.txt | 20 ++++++++++++++++++--
cxl/lib/libcxl.c | 25 +++++++++++++++----------
cxl/lib/libcxl.sym | 5 +++++
cxl/lib/private.h | 2 +-
cxl/libcxl.h | 35 +++++++++++++++++++++++++++++++++++
5 files changed, 74 insertions(+), 13 deletions(-)
diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt
index 40598a08b9f4840f79e3ab43f62f412d8b2136ed..d5c3558aacecb08d7f5754fdcc77d6e743560601 100644
--- a/Documentation/cxl/lib/libcxl.txt
+++ b/Documentation/cxl/lib/libcxl.txt
@@ -553,11 +553,20 @@ struct cxl_region *cxl_region_get_next(struct cxl_region *region);
===== REGION: Attributes
----
+enum cxl_region_mode {
+ CXL_REGION_MODE_NONE = CXL_DECODER_MODE_NONE,
+ CXL_REGION_MODE_MIXED = CXL_DECODER_MODE_MIXED,
+ CXL_REGION_MODE_PMEM = CXL_DECODER_MODE_PMEM,
+ CXL_REGION_MODE_RAM = CXL_DECODER_MODE_RAM,
+};
+const char *cxl_region_mode_name(enum cxl_region_mode mode);
+enum cxl_region_mode cxl_region_mode_from_ident(const char *ident);
+enum cxl_region_mode cxl_region_get_region_mode(struct cxl_region *region);
+
int cxl_region_get_id(struct cxl_region *region);
const char *cxl_region_get_devname(struct cxl_region *region);
void cxl_region_get_uuid(struct cxl_region *region, uuid_t uu);
unsigned long long cxl_region_get_size(struct cxl_region *region);
-enum cxl_decoder_mode cxl_region_get_mode(struct cxl_region *region);
unsigned long long cxl_region_get_resource(struct cxl_region *region);
unsigned int cxl_region_get_interleave_ways(struct cxl_region *region);
unsigned int cxl_region_get_interleave_granularity(struct cxl_region *region);
@@ -576,8 +585,12 @@ int cxl_region_clear_all_targets(struct cxl_region *region);
int cxl_region_decode_commit(struct cxl_region *region);
int cxl_region_decode_reset(struct cxl_region *region);
struct daxctl_region *cxl_region_get_daxctl_region(struct cxl_region *region);
-----
+DEPRECATED:
+
+enum cxl_decoder_mode cxl_region_get_mode(struct cxl_region *region);
+
+----
A region's resource attribute is the Host Physical Address at which the region's
address space starts. The region's address space is a subset of the parent root
decoder's address space.
@@ -601,6 +614,9 @@ where its properties can be interrogated by daxctl. The helper
cxl_region_get_daxctl_region() returns an 'struct daxctl_region *' that
can be used with other libdaxctl APIs.
+Regions now have a mode distinct from decoders. cxl_region_get_mode() is
+deprecated in favor of cxl_region_get_region_mode().
+
include::../../copyright.txt[]
SEE ALSO
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
index 63aa4ef3acdc2fb3c4ec6c13be5feb802e817d0d..35a40091e8f5813c1b3ef2ffb931c9ec584b02ad 100644
--- a/cxl/lib/libcxl.c
+++ b/cxl/lib/libcxl.c
@@ -431,10 +431,10 @@ CXL_EXPORT bool cxl_region_qos_class_mismatch(struct cxl_region *region)
if (!memdev)
continue;
- if (region->mode == CXL_DECODER_MODE_RAM) {
+ if (region->mode == CXL_REGION_MODE_RAM) {
if (root_decoder->qos_class != memdev->ram_qos_class)
return true;
- } else if (region->mode == CXL_DECODER_MODE_PMEM) {
+ } else if (region->mode == CXL_REGION_MODE_PMEM) {
if (root_decoder->qos_class != memdev->pmem_qos_class)
return true;
}
@@ -619,9 +619,9 @@ static void *add_cxl_region(void *parent, int id, const char *cxlregion_base)
sprintf(path, "%s/mode", cxlregion_base);
if (sysfs_read_attr(ctx, path, buf) < 0)
- region->mode = CXL_DECODER_MODE_NONE;
+ region->mode = CXL_REGION_MODE_NONE;
else
- region->mode = cxl_decoder_mode_from_ident(buf);
+ region->mode = cxl_region_mode_from_ident(buf);
sprintf(path, "%s/modalias", cxlregion_base);
if (sysfs_read_attr(ctx, path, buf) == 0)
@@ -748,11 +748,16 @@ CXL_EXPORT unsigned long long cxl_region_get_resource(struct cxl_region *region)
return region->start;
}
-CXL_EXPORT enum cxl_decoder_mode cxl_region_get_mode(struct cxl_region *region)
+CXL_EXPORT enum cxl_region_mode cxl_region_get_region_mode(struct cxl_region *region)
{
return region->mode;
}
+CXL_EXPORT enum cxl_decoder_mode cxl_region_get_mode(struct cxl_region *region)
+{
+ return (enum cxl_decoder_mode)cxl_region_get_region_mode(region);
+}
+
CXL_EXPORT unsigned int
cxl_region_get_interleave_ways(struct cxl_region *region)
{
@@ -2700,7 +2705,7 @@ cxl_decoder_get_region(struct cxl_decoder *decoder)
}
static struct cxl_region *cxl_decoder_create_region(struct cxl_decoder *decoder,
- enum cxl_decoder_mode mode)
+ enum cxl_region_mode mode)
{
struct cxl_ctx *ctx = cxl_decoder_get_ctx(decoder);
char *path = decoder->dev_buf;
@@ -2708,9 +2713,9 @@ static struct cxl_region *cxl_decoder_create_region(struct cxl_decoder *decoder,
struct cxl_region *region;
int rc;
- if (mode == CXL_DECODER_MODE_PMEM)
+ if (mode == CXL_REGION_MODE_PMEM)
sprintf(path, "%s/create_pmem_region", decoder->dev_path);
- else if (mode == CXL_DECODER_MODE_RAM)
+ else if (mode == CXL_REGION_MODE_RAM)
sprintf(path, "%s/create_ram_region", decoder->dev_path);
rc = sysfs_read_attr(ctx, path, buf);
@@ -2754,13 +2759,13 @@ static struct cxl_region *cxl_decoder_create_region(struct cxl_decoder *decoder,
CXL_EXPORT struct cxl_region *
cxl_decoder_create_pmem_region(struct cxl_decoder *decoder)
{
- return cxl_decoder_create_region(decoder, CXL_DECODER_MODE_PMEM);
+ return cxl_decoder_create_region(decoder, CXL_REGION_MODE_PMEM);
}
CXL_EXPORT struct cxl_region *
cxl_decoder_create_ram_region(struct cxl_decoder *decoder)
{
- return cxl_decoder_create_region(decoder, CXL_DECODER_MODE_RAM);
+ return cxl_decoder_create_region(decoder, CXL_REGION_MODE_RAM);
}
CXL_EXPORT int cxl_decoder_get_nr_targets(struct cxl_decoder *decoder)
diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym
index 0c155a40ad4765106f0eab1745281d462af782fe..17a660f508ad1e053af2992824535ccf7ce877b2 100644
--- a/cxl/lib/libcxl.sym
+++ b/cxl/lib/libcxl.sym
@@ -288,3 +288,8 @@ global:
cxl_memdev_trigger_poison_list;
cxl_region_trigger_poison_list;
} LIBCXL_7;
+
+LIBCXL_9 {
+global:
+ cxl_region_get_region_mode;
+} LIBECXL_8;
diff --git a/cxl/lib/private.h b/cxl/lib/private.h
index b6cd910e93359b53cac34427acfe84c7abcb78b0..0f45be89b6a00477d13fb6d7f1906213a3073c48 100644
--- a/cxl/lib/private.h
+++ b/cxl/lib/private.h
@@ -171,7 +171,7 @@ struct cxl_region {
unsigned int interleave_ways;
unsigned int interleave_granularity;
enum cxl_decode_state decode_state;
- enum cxl_decoder_mode mode;
+ enum cxl_region_mode mode;
struct daxctl_region *dax_region;
struct kmod_module *module;
struct list_head mappings;
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
index 0a5fd0e13cc24e0032d4a83d780278fbe0038d32..06b87a0924faafec6c80eca83ea7551d4e117256 100644
--- a/cxl/libcxl.h
+++ b/cxl/libcxl.h
@@ -303,6 +303,39 @@ int cxl_memdev_is_enabled(struct cxl_memdev *memdev);
for (endpoint = cxl_endpoint_get_first(port); endpoint != NULL; \
endpoint = cxl_endpoint_get_next(endpoint))
+enum cxl_region_mode {
+ CXL_REGION_MODE_NONE = CXL_DECODER_MODE_NONE,
+ CXL_REGION_MODE_MIXED = CXL_DECODER_MODE_MIXED,
+ CXL_REGION_MODE_PMEM = CXL_DECODER_MODE_PMEM,
+ CXL_REGION_MODE_RAM = CXL_DECODER_MODE_RAM,
+};
+
+static inline const char *cxl_region_mode_name(enum cxl_region_mode mode)
+{
+ static const char *names[] = {
+ [CXL_REGION_MODE_NONE] = "none",
+ [CXL_REGION_MODE_MIXED] = "mixed",
+ [CXL_REGION_MODE_PMEM] = "pmem",
+ [CXL_REGION_MODE_RAM] = "ram",
+ };
+
+ if (mode < CXL_REGION_MODE_NONE || mode > CXL_REGION_MODE_RAM)
+ mode = CXL_REGION_MODE_NONE;
+ return names[mode];
+}
+
+static inline enum cxl_region_mode
+cxl_region_mode_from_ident(const char *ident)
+{
+ if (strcmp(ident, "ram") == 0)
+ return CXL_REGION_MODE_RAM;
+ else if (strcmp(ident, "volatile") == 0)
+ return CXL_REGION_MODE_RAM;
+ else if (strcmp(ident, "pmem") == 0)
+ return CXL_REGION_MODE_PMEM;
+ return CXL_REGION_MODE_NONE;
+}
+
struct cxl_region;
struct cxl_region *cxl_region_get_first(struct cxl_decoder *decoder);
struct cxl_region *cxl_region_get_next(struct cxl_region *region);
@@ -318,6 +351,8 @@ const char *cxl_region_get_devname(struct cxl_region *region);
void cxl_region_get_uuid(struct cxl_region *region, uuid_t uu);
unsigned long long cxl_region_get_size(struct cxl_region *region);
unsigned long long cxl_region_get_resource(struct cxl_region *region);
+enum cxl_region_mode cxl_region_get_region_mode(struct cxl_region *region);
+/* Deprecated: use cxl_region_get_region_mode() */
enum cxl_decoder_mode cxl_region_get_mode(struct cxl_region *region);
unsigned int cxl_region_get_interleave_ways(struct cxl_region *region);
unsigned int cxl_region_get_interleave_granularity(struct cxl_region *region);
--
2.47.1
next prev parent reply other threads:[~2024-12-15 2:58 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-15 2:58 [ndctl PATCH v4 0/9] ndctl: Dynamic Capacity additions for cxl-cli Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 1/9] ndctl/cxl-events: Don't fail test until event counts are reported Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 2/9] ndctl/cxl/region: Report max size for region creation Ira Weiny
2024-12-15 2:58 ` Ira Weiny [this message]
2024-12-15 2:58 ` [ndctl PATCH v4 4/9] cxl/region: Use new region mode in cxl-cli Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 5/9] libcxl: Add Dynamic Capacity region support Ira Weiny
2025-02-11 3:12 ` Alison Schofield
2024-12-15 2:58 ` [ndctl PATCH v4 6/9] cxl/region: Add cxl-cli support for DCD regions Ira Weiny
2025-02-11 3:21 ` Alison Schofield
2024-12-15 2:58 ` [ndctl PATCH v4 7/9] libcxl: Add extent functionality to DC regions Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 8/9] cxl/region: Add extent output to region query Ira Weiny
2025-02-11 3:24 ` Alison Schofield
2025-02-12 22:03 ` Ira Weiny
2024-12-15 2:58 ` [ndctl PATCH v4 9/9] cxl/test: Add Dynamic Capacity tests Ira Weiny
2025-02-11 3:33 ` Alison Schofield
2025-02-11 2:47 ` [ndctl PATCH v4 0/9] ndctl: Dynamic Capacity additions for cxl-cli Alison Schofield
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=20241214-dcd-region2-v4-3-36550a97f8e2@intel.com \
--to=ira.weiny@intel.com \
--cc=alison.schofield@intel.com \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=fan.ni@samsung.com \
--cc=jonathan.cameron@Huawei.com \
--cc=linux-cxl@vger.kernel.org \
--cc=nvdimm@lists.linux.dev \
--cc=sushant1.kumar@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox