anitazha / rpms / ndctl

Forked from rpms/ndctl 2 years ago
Clone

Blame 0178-cxl-list-Add-DPA-span-to-endpoint-decoder-listings.patch

Jeff Moyer 2c91dc
From bbc0da95d12b3c890cc323a34b48cf489d4b467a Mon Sep 17 00:00:00 2001
Jeff Moyer 2c91dc
From: Dan Williams <dan.j.williams@intel.com>
Jeff Moyer 2c91dc
Date: Thu, 14 Jul 2022 10:02:09 -0700
Jeff Moyer 2c91dc
Subject: [PATCH 178/217] cxl/list: Add DPA span to endpoint decoder listings
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Optionally include in decoder listings the device local address space for
Jeff Moyer 2c91dc
endpoint decoders with active / allocated capacity.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Link: https://lore.kernel.org/r/165781812967.1555691.4685129673233918478.stgit@dwillia2-xfh.jf.intel.com
Jeff Moyer 2c91dc
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Jeff Moyer 2c91dc
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Jeff Moyer 2c91dc
---
Jeff Moyer 2c91dc
 Documentation/cxl/lib/libcxl.txt |  2 ++
Jeff Moyer 2c91dc
 cxl/json.c                       | 18 +++++++++++++
Jeff Moyer 2c91dc
 cxl/lib/libcxl.c                 | 43 +++++++++++++++++++++++++++++++-
Jeff Moyer 2c91dc
 cxl/lib/libcxl.sym               |  6 +++++
Jeff Moyer 2c91dc
 cxl/lib/private.h                |  2 ++
Jeff Moyer 2c91dc
 cxl/libcxl.h                     |  2 ++
Jeff Moyer 2c91dc
 6 files changed, 72 insertions(+), 1 deletion(-)
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt
Jeff Moyer 2c91dc
index f8f0e66..2aef489 100644
Jeff Moyer 2c91dc
--- a/Documentation/cxl/lib/libcxl.txt
Jeff Moyer 2c91dc
+++ b/Documentation/cxl/lib/libcxl.txt
Jeff Moyer 2c91dc
@@ -392,6 +392,8 @@ more CXL decoder objects.
Jeff Moyer 2c91dc
 ----
Jeff Moyer 2c91dc
 unsigned long long cxl_decoder_get_resource(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 unsigned long long cxl_decoder_get_size(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
+unsigned long long cxl_decoder_get_dpa_resource(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
+unsigned long long cxl_decoder_get_dpa_size(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 const char *cxl_decoder_get_devname(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 int cxl_decoder_get_id(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 int cxl_decoder_get_nr_targets(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
diff --git a/cxl/json.c b/cxl/json.c
Jeff Moyer 2c91dc
index a213fda..3f52d3b 100644
Jeff Moyer 2c91dc
--- a/cxl/json.c
Jeff Moyer 2c91dc
+++ b/cxl/json.c
Jeff Moyer 2c91dc
@@ -472,6 +472,24 @@ struct json_object *util_cxl_decoder_to_json(struct cxl_decoder *decoder,
Jeff Moyer 2c91dc
 			json_object_object_add(jdecoder, "state", jobj);
Jeff Moyer 2c91dc
 	}
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+	if (cxl_port_is_endpoint(port)) {
Jeff Moyer 2c91dc
+		size = cxl_decoder_get_dpa_size(decoder);
Jeff Moyer 2c91dc
+		val = cxl_decoder_get_dpa_resource(decoder);
Jeff Moyer 2c91dc
+		if (size && val < ULLONG_MAX) {
Jeff Moyer 2c91dc
+			jobj = util_json_object_hex(val, flags);
Jeff Moyer 2c91dc
+			if (jobj)
Jeff Moyer 2c91dc
+				json_object_object_add(jdecoder, "dpa_resource",
Jeff Moyer 2c91dc
+						       jobj);
Jeff Moyer 2c91dc
+		}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+		if (size && size < ULLONG_MAX) {
Jeff Moyer 2c91dc
+			jobj = util_json_object_size(size, flags);
Jeff Moyer 2c91dc
+			if (jobj)
Jeff Moyer 2c91dc
+				json_object_object_add(jdecoder, "dpa_size",
Jeff Moyer 2c91dc
+						       jobj);
Jeff Moyer 2c91dc
+		}
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 	if (cxl_port_is_root(port) && cxl_decoder_is_mem_capable(decoder)) {
Jeff Moyer 2c91dc
 		if (cxl_decoder_is_pmem_capable(decoder)) {
Jeff Moyer 2c91dc
 			jobj = json_object_new_boolean(true);
Jeff Moyer 2c91dc
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
index bf3568d..6f4d64d 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
@@ -956,8 +956,19 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
Jeff Moyer 2c91dc
 		decoder->size = strtoull(buf, NULL, 0);
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 	switch (port->type) {
Jeff Moyer 2c91dc
-	case CXL_PORT_SWITCH:
Jeff Moyer 2c91dc
 	case CXL_PORT_ENDPOINT:
Jeff Moyer 2c91dc
+		sprintf(path, "%s/dpa_resource", cxldecoder_base);
Jeff Moyer 2c91dc
+		if (sysfs_read_attr(ctx, path, buf) < 0)
Jeff Moyer 2c91dc
+			decoder->dpa_resource = ULLONG_MAX;
Jeff Moyer 2c91dc
+		else
Jeff Moyer 2c91dc
+			decoder->dpa_resource = strtoull(buf, NULL, 0);
Jeff Moyer 2c91dc
+		sprintf(path, "%s/dpa_size", cxldecoder_base);
Jeff Moyer 2c91dc
+		if (sysfs_read_attr(ctx, path, buf) < 0)
Jeff Moyer 2c91dc
+			decoder->dpa_size = ULLONG_MAX;
Jeff Moyer 2c91dc
+		else
Jeff Moyer 2c91dc
+			decoder->dpa_size = strtoull(buf, NULL, 0);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	case CXL_PORT_SWITCH:
Jeff Moyer 2c91dc
 		decoder->pmem_capable = true;
Jeff Moyer 2c91dc
 		decoder->volatile_capable = true;
Jeff Moyer 2c91dc
 		decoder->mem_capable = true;
Jeff Moyer 2c91dc
@@ -1114,6 +1125,36 @@ CXL_EXPORT unsigned long long cxl_decoder_get_size(struct cxl_decoder *decoder)
Jeff Moyer 2c91dc
 	return decoder->size;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+CXL_EXPORT unsigned long long
Jeff Moyer 2c91dc
+cxl_decoder_get_dpa_resource(struct cxl_decoder *decoder)
Jeff Moyer 2c91dc
+{
Jeff Moyer 2c91dc
+	struct cxl_port *port = cxl_decoder_get_port(decoder);
Jeff Moyer 2c91dc
+	struct cxl_ctx *ctx = cxl_decoder_get_ctx(decoder);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	if (!cxl_port_is_endpoint(port)) {
Jeff Moyer 2c91dc
+		err(ctx, "%s: not an endpoint decoder\n",
Jeff Moyer 2c91dc
+		    cxl_decoder_get_devname(decoder));
Jeff Moyer 2c91dc
+		return ULLONG_MAX;
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	return decoder->dpa_resource;
Jeff Moyer 2c91dc
+}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+CXL_EXPORT unsigned long long
Jeff Moyer 2c91dc
+cxl_decoder_get_dpa_size(struct cxl_decoder *decoder)
Jeff Moyer 2c91dc
+{
Jeff Moyer 2c91dc
+	struct cxl_port *port = cxl_decoder_get_port(decoder);
Jeff Moyer 2c91dc
+	struct cxl_ctx *ctx = cxl_decoder_get_ctx(decoder);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	if (!cxl_port_is_endpoint(port)) {
Jeff Moyer 2c91dc
+		err(ctx, "%s: not an endpoint decoder\n",
Jeff Moyer 2c91dc
+		    cxl_decoder_get_devname(decoder));
Jeff Moyer 2c91dc
+		return ULLONG_MAX;
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	return decoder->dpa_size;
Jeff Moyer 2c91dc
+}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 CXL_EXPORT enum cxl_decoder_target_type
Jeff Moyer 2c91dc
 cxl_decoder_get_target_type(struct cxl_decoder *decoder)
Jeff Moyer 2c91dc
 {
Jeff Moyer 2c91dc
diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
index dffcb60..8e2fc75 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
@@ -167,3 +167,9 @@ global:
Jeff Moyer 2c91dc
 	cxl_cmd_new_set_partition;
Jeff Moyer 2c91dc
 	cxl_cmd_partition_set_mode;
Jeff Moyer 2c91dc
 } LIBCXL_1;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+LIBCXL_3 {
Jeff Moyer 2c91dc
+global:
Jeff Moyer 2c91dc
+	cxl_decoder_get_dpa_resource;
Jeff Moyer 2c91dc
+	cxl_decoder_get_dpa_size;
Jeff Moyer 2c91dc
+} LIBCXL_2;
Jeff Moyer 2c91dc
diff --git a/cxl/lib/private.h b/cxl/lib/private.h
Jeff Moyer 2c91dc
index c6d88f7..24a2ae6 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/private.h
Jeff Moyer 2c91dc
+++ b/cxl/lib/private.h
Jeff Moyer 2c91dc
@@ -101,6 +101,8 @@ struct cxl_decoder {
Jeff Moyer 2c91dc
 	struct cxl_ctx *ctx;
Jeff Moyer 2c91dc
 	u64 start;
Jeff Moyer 2c91dc
 	u64 size;
Jeff Moyer 2c91dc
+	u64 dpa_resource;
Jeff Moyer 2c91dc
+	u64 dpa_size;
Jeff Moyer 2c91dc
 	void *dev_buf;
Jeff Moyer 2c91dc
 	size_t buf_len;
Jeff Moyer 2c91dc
 	char *dev_path;
Jeff Moyer 2c91dc
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
Jeff Moyer 2c91dc
index 0007f4d..76aebe3 100644
Jeff Moyer 2c91dc
--- a/cxl/libcxl.h
Jeff Moyer 2c91dc
+++ b/cxl/libcxl.h
Jeff Moyer 2c91dc
@@ -129,6 +129,8 @@ struct cxl_decoder *cxl_decoder_get_first(struct cxl_port *port);
Jeff Moyer 2c91dc
 struct cxl_decoder *cxl_decoder_get_next(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 unsigned long long cxl_decoder_get_resource(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 unsigned long long cxl_decoder_get_size(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
+unsigned long long cxl_decoder_get_dpa_resource(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
+unsigned long long cxl_decoder_get_dpa_size(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 const char *cxl_decoder_get_devname(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 struct cxl_target *cxl_decoder_get_target_by_memdev(struct cxl_decoder *decoder,
Jeff Moyer 2c91dc
 						    struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
-- 
Jeff Moyer 2c91dc
2.27.0
Jeff Moyer 2c91dc