anitazha / rpms / ndctl

Forked from rpms/ndctl 2 years ago
Clone

Blame 0182-cxl-list-Emit-mode-for-endpoint-decoder-objects.patch

Jeff Moyer 2c91dc
From d2a7fc7fb87396eb267cf6c8948468f7e56bea89 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:33 -0700
Jeff Moyer 2c91dc
Subject: [PATCH 182/217] cxl/list: Emit 'mode' for endpoint decoder objects
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
The 'mode' property of an endpoint decoder indicates the access
Jeff Moyer 2c91dc
properties of the DPA (device physical address) mapped into HPA (host
Jeff Moyer 2c91dc
physical address) by the decoder. Where the modes are 'none'
Jeff Moyer 2c91dc
(decoder-disabled), 'ram' (voltaile memory), 'pmem' (persistent memory),
Jeff Moyer 2c91dc
and 'mixed' (an unexpected, but possible, case where the decoder
Jeff Moyer 2c91dc
straddles a mode / partition boundary).
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Link: https://lore.kernel.org/r/165781815306.1555691.17541956592287631419.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 |  9 +++++++++
Jeff Moyer 2c91dc
 cxl/json.c                       |  8 ++++++++
Jeff Moyer 2c91dc
 cxl/lib/libcxl.c                 | 30 ++++++++++++++++++++++++++++++
Jeff Moyer 2c91dc
 cxl/lib/libcxl.sym               |  1 +
Jeff Moyer 2c91dc
 cxl/lib/private.h                |  1 +
Jeff Moyer 2c91dc
 cxl/libcxl.h                     | 23 +++++++++++++++++++++++
Jeff Moyer 2c91dc
 6 files changed, 72 insertions(+)
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt
Jeff Moyer 2c91dc
index 2aef489..90fe338 100644
Jeff Moyer 2c91dc
--- a/Documentation/cxl/lib/libcxl.txt
Jeff Moyer 2c91dc
+++ b/Documentation/cxl/lib/libcxl.txt
Jeff Moyer 2c91dc
@@ -405,6 +405,15 @@ enum cxl_decoder_target_type {
Jeff Moyer 2c91dc
 };
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 cxl_decoder_get_target_type(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+enum cxl_decoder_mode {
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_NONE,
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_MIXED,
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_PMEM,
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_RAM,
Jeff Moyer 2c91dc
+};
Jeff Moyer 2c91dc
+enum cxl_decoder_mode cxl_decoder_get_mode(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 bool cxl_decoder_is_pmem_capable(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 bool cxl_decoder_is_volatile_capable(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
 bool cxl_decoder_is_mem_capable(struct cxl_decoder *decoder);
Jeff Moyer 2c91dc
diff --git a/cxl/json.c b/cxl/json.c
Jeff Moyer 2c91dc
index 3f52d3b..ae9c812 100644
Jeff Moyer 2c91dc
--- a/cxl/json.c
Jeff Moyer 2c91dc
+++ b/cxl/json.c
Jeff Moyer 2c91dc
@@ -473,6 +473,8 @@ struct json_object *util_cxl_decoder_to_json(struct cxl_decoder *decoder,
Jeff Moyer 2c91dc
 	}
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 	if (cxl_port_is_endpoint(port)) {
Jeff Moyer 2c91dc
+		enum cxl_decoder_mode mode = cxl_decoder_get_mode(decoder);
Jeff Moyer 2c91dc
+
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
@@ -488,6 +490,12 @@ struct json_object *util_cxl_decoder_to_json(struct cxl_decoder *decoder,
Jeff Moyer 2c91dc
 				json_object_object_add(jdecoder, "dpa_size",
Jeff Moyer 2c91dc
 						       jobj);
Jeff Moyer 2c91dc
 		}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+		if (mode > CXL_DECODER_MODE_NONE) {
Jeff Moyer 2c91dc
+			jobj = json_object_new_string(cxl_decoder_mode_name(mode));
Jeff Moyer 2c91dc
+			if (jobj)
Jeff Moyer 2c91dc
+				json_object_object_add(jdecoder, "mode", 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
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
index ea597f6..b802e5d 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
@@ -961,6 +961,21 @@ static void *add_cxl_decoder(void *parent, int id, const char *cxldecoder_base)
Jeff Moyer 2c91dc
 	else
Jeff Moyer 2c91dc
 		decoder->size = strtoull(buf, NULL, 0);
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+	sprintf(path, "%s/mode", cxldecoder_base);
Jeff Moyer 2c91dc
+	if (sysfs_read_attr(ctx, path, buf) == 0) {
Jeff Moyer 2c91dc
+		if (strcmp(buf, "ram") == 0)
Jeff Moyer 2c91dc
+			decoder->mode = CXL_DECODER_MODE_RAM;
Jeff Moyer 2c91dc
+		else if (strcmp(buf, "pmem") == 0)
Jeff Moyer 2c91dc
+			decoder->mode = CXL_DECODER_MODE_PMEM;
Jeff Moyer 2c91dc
+		else if (strcmp(buf, "mixed") == 0)
Jeff Moyer 2c91dc
+			decoder->mode = CXL_DECODER_MODE_MIXED;
Jeff Moyer 2c91dc
+		else if (strcmp(buf, "none") == 0)
Jeff Moyer 2c91dc
+			decoder->mode = CXL_DECODER_MODE_NONE;
Jeff Moyer 2c91dc
+		else
Jeff Moyer 2c91dc
+			decoder->mode = CXL_DECODER_MODE_MIXED;
Jeff Moyer 2c91dc
+	} else
Jeff Moyer 2c91dc
+		decoder->mode = CXL_DECODER_MODE_NONE;
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 	switch (port->type) {
Jeff Moyer 2c91dc
 	case CXL_PORT_ENDPOINT:
Jeff Moyer 2c91dc
 		sprintf(path, "%s/dpa_resource", cxldecoder_base);
Jeff Moyer 2c91dc
@@ -1161,6 +1176,21 @@ cxl_decoder_get_dpa_size(struct cxl_decoder *decoder)
Jeff Moyer 2c91dc
 	return decoder->dpa_size;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+CXL_EXPORT enum cxl_decoder_mode
Jeff Moyer 2c91dc
+cxl_decoder_get_mode(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 CXL_DECODER_MODE_NONE;
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	return decoder->mode;
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 8e2fc75..88c5a7e 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
@@ -172,4 +172,5 @@ 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
+	cxl_decoder_get_mode;
Jeff Moyer 2c91dc
 } LIBCXL_2;
Jeff Moyer 2c91dc
diff --git a/cxl/lib/private.h b/cxl/lib/private.h
Jeff Moyer 2c91dc
index 24a2ae6..f6d4573 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/private.h
Jeff Moyer 2c91dc
+++ b/cxl/lib/private.h
Jeff Moyer 2c91dc
@@ -108,6 +108,7 @@ struct cxl_decoder {
Jeff Moyer 2c91dc
 	char *dev_path;
Jeff Moyer 2c91dc
 	int nr_targets;
Jeff Moyer 2c91dc
 	int id;
Jeff Moyer 2c91dc
+	enum cxl_decoder_mode mode;
Jeff Moyer 2c91dc
 	bool pmem_capable;
Jeff Moyer 2c91dc
 	bool volatile_capable;
Jeff Moyer 2c91dc
 	bool mem_capable;
Jeff Moyer 2c91dc
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
Jeff Moyer 2c91dc
index 76aebe3..1436dc4 100644
Jeff Moyer 2c91dc
--- a/cxl/libcxl.h
Jeff Moyer 2c91dc
+++ b/cxl/libcxl.h
Jeff Moyer 2c91dc
@@ -127,10 +127,33 @@ struct cxl_dport *cxl_port_get_dport_by_memdev(struct cxl_port *port,
Jeff Moyer 2c91dc
 struct cxl_decoder;
Jeff Moyer 2c91dc
 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
+struct cxl_decoder *cxl_decoder_get_last(struct cxl_port *port);
Jeff Moyer 2c91dc
+struct cxl_decoder *cxl_decoder_get_prev(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
+enum cxl_decoder_mode {
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_NONE,
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_MIXED,
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_PMEM,
Jeff Moyer 2c91dc
+	CXL_DECODER_MODE_RAM,
Jeff Moyer 2c91dc
+};
Jeff Moyer 2c91dc
+static inline const char *cxl_decoder_mode_name(enum cxl_decoder_mode mode)
Jeff Moyer 2c91dc
+{
Jeff Moyer 2c91dc
+	static const char *names[] = {
Jeff Moyer 2c91dc
+		[CXL_DECODER_MODE_NONE] = "none",
Jeff Moyer 2c91dc
+		[CXL_DECODER_MODE_MIXED] = "mixed",
Jeff Moyer 2c91dc
+		[CXL_DECODER_MODE_PMEM] = "pmem",
Jeff Moyer 2c91dc
+		[CXL_DECODER_MODE_RAM] = "ram",
Jeff Moyer 2c91dc
+	};
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	if (mode < CXL_DECODER_MODE_NONE || mode > CXL_DECODER_MODE_RAM)
Jeff Moyer 2c91dc
+		mode = CXL_DECODER_MODE_NONE;
Jeff Moyer 2c91dc
+	return names[mode];
Jeff Moyer 2c91dc
+}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+enum cxl_decoder_mode cxl_decoder_get_mode(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