anitazha / rpms / ndctl

Forked from rpms/ndctl 2 years ago
Clone
Jeff Moyer 2c91dc
From 2d1b8cea119ca2bb0eec8ebb2dfb1b6c4d844ddd Mon Sep 17 00:00:00 2001
Jeff Moyer 2c91dc
From: Dan Williams <dan.j.williams@intel.com>
Jeff Moyer 2c91dc
Date: Sun, 23 Jan 2022 16:52:36 -0800
Jeff Moyer 2c91dc
Subject: [PATCH 095/217] cxl/list: Emit device serial numbers
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Starting with the v5.17 kernel the CXL driver emits the mandatory device
Jeff Moyer 2c91dc
serial number for each memory device. Include it in the memory device
Jeff Moyer 2c91dc
listing.
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
Link: https://lore.kernel.org/r/164298555630.3021641.3246226448369816200.stgit@dwillia2-desk3.amr.corp.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/cxl-list.txt | 15 +++++++++------
Jeff Moyer 2c91dc
 cxl/json.c                     | 11 ++++++++++-
Jeff Moyer 2c91dc
 cxl/lib/libcxl.c               | 11 +++++++++++
Jeff Moyer 2c91dc
 cxl/lib/libcxl.sym             |  5 +++++
Jeff Moyer 2c91dc
 cxl/lib/private.h              |  1 +
Jeff Moyer 2c91dc
 cxl/libcxl.h                   |  1 +
Jeff Moyer 2c91dc
 6 files changed, 37 insertions(+), 7 deletions(-)
Jeff Moyer 2c91dc
Jeff Moyer 2c91dc
diff --git a/Documentation/cxl/cxl-list.txt b/Documentation/cxl/cxl-list.txt
Jeff Moyer 2c91dc
index 4d409ba..bd0207e 100644
Jeff Moyer 2c91dc
--- a/Documentation/cxl/cxl-list.txt
Jeff Moyer 2c91dc
+++ b/Documentation/cxl/cxl-list.txt
Jeff Moyer 2c91dc
@@ -41,22 +41,25 @@ OPTIONS
Jeff Moyer 2c91dc
   "ram_size":0,
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
-# cxl list -m "0 mem1 2"
Jeff Moyer 2c91dc
+# cxl list -M --memdev="0 mem3 5"
Jeff Moyer 2c91dc
 [
Jeff Moyer 2c91dc
   {
Jeff Moyer 2c91dc
     "memdev":"mem0",
Jeff Moyer 2c91dc
     "pmem_size":268435456,
Jeff Moyer 2c91dc
-    "ram_size":0
Jeff Moyer 2c91dc
+    "ram_size":0,
Jeff Moyer 2c91dc
+    "serial":0
Jeff Moyer 2c91dc
   },
Jeff Moyer 2c91dc
   {
Jeff Moyer 2c91dc
-    "memdev":"mem2",
Jeff Moyer 2c91dc
+    "memdev":"mem3",
Jeff Moyer 2c91dc
     "pmem_size":268435456,
Jeff Moyer 2c91dc
-    "ram_size":268435456
Jeff Moyer 2c91dc
+    "ram_size":268435456,
Jeff Moyer 2c91dc
+    "serial":2
Jeff Moyer 2c91dc
   },
Jeff Moyer 2c91dc
   {
Jeff Moyer 2c91dc
-    "memdev":"mem1",
Jeff Moyer 2c91dc
+    "memdev":"mem5",
Jeff Moyer 2c91dc
     "pmem_size":268435456,
Jeff Moyer 2c91dc
-    "ram_size":268435456
Jeff Moyer 2c91dc
+    "ram_size":268435456,
Jeff Moyer 2c91dc
+    "serial":4
Jeff Moyer 2c91dc
   }
Jeff Moyer 2c91dc
 ]
Jeff Moyer 2c91dc
 ----
Jeff Moyer 2c91dc
diff --git a/cxl/json.c b/cxl/json.c
Jeff Moyer 2c91dc
index 3ef9f76..d8e65df 100644
Jeff Moyer 2c91dc
--- a/cxl/json.c
Jeff Moyer 2c91dc
+++ b/cxl/json.c
Jeff Moyer 2c91dc
@@ -1,5 +1,6 @@
Jeff Moyer 2c91dc
 // SPDX-License-Identifier: GPL-2.0
Jeff Moyer 2c91dc
-// Copyright (C) 2015-2020 Intel Corporation. All rights reserved.
Jeff Moyer 2c91dc
+// Copyright (C) 2015-2021 Intel Corporation. All rights reserved.
Jeff Moyer 2c91dc
+#include <limits.h>
Jeff Moyer 2c91dc
 #include <util/json.h>
Jeff Moyer 2c91dc
 #include <uuid/uuid.h>
Jeff Moyer 2c91dc
 #include <cxl/libcxl.h>
Jeff Moyer 2c91dc
@@ -188,6 +189,7 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
Jeff Moyer 2c91dc
 {
Jeff Moyer 2c91dc
 	const char *devname = cxl_memdev_get_devname(memdev);
Jeff Moyer 2c91dc
 	struct json_object *jdev, *jobj;
Jeff Moyer 2c91dc
+	unsigned long long serial;
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 	jdev = json_object_new_object();
Jeff Moyer 2c91dc
 	if (!jdev)
Jeff Moyer 2c91dc
@@ -210,5 +212,12 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
Jeff Moyer 2c91dc
 		if (jobj)
Jeff Moyer 2c91dc
 			json_object_object_add(jdev, "health", jobj);
Jeff Moyer 2c91dc
 	}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+	serial = cxl_memdev_get_serial(memdev);
Jeff Moyer 2c91dc
+	if (serial < ULLONG_MAX) {
Jeff Moyer 2c91dc
+		jobj = util_json_object_hex(serial, flags);
Jeff Moyer 2c91dc
+		if (jobj)
Jeff Moyer 2c91dc
+			json_object_object_add(jdev, "serial", jobj);
Jeff Moyer 2c91dc
+	}
Jeff Moyer 2c91dc
 	return jdev;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
index 3390eb9..8d3cf80 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.c
Jeff Moyer 2c91dc
@@ -296,6 +296,12 @@ static void *add_cxl_memdev(void *parent, int id, const char *cxlmem_base)
Jeff Moyer 2c91dc
 	if (memdev->lsa_size == ULLONG_MAX)
Jeff Moyer 2c91dc
 		goto err_read;
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+	sprintf(path, "%s/serial", cxlmem_base);
Jeff Moyer 2c91dc
+	if (sysfs_read_attr(ctx, path, buf) < 0)
Jeff Moyer 2c91dc
+		memdev->serial = ULLONG_MAX;
Jeff Moyer 2c91dc
+	else
Jeff Moyer 2c91dc
+		memdev->serial = strtoull(buf, NULL, 0);
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 	memdev->dev_path = strdup(cxlmem_base);
Jeff Moyer 2c91dc
 	if (!memdev->dev_path)
Jeff Moyer 2c91dc
 		goto err_read;
Jeff Moyer 2c91dc
@@ -371,6 +377,11 @@ CXL_EXPORT int cxl_memdev_get_id(struct cxl_memdev *memdev)
Jeff Moyer 2c91dc
 	return memdev->id;
Jeff Moyer 2c91dc
 }
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
+CXL_EXPORT unsigned long long cxl_memdev_get_serial(struct cxl_memdev *memdev)
Jeff Moyer 2c91dc
+{
Jeff Moyer 2c91dc
+	return memdev->serial;
Jeff Moyer 2c91dc
+}
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
 CXL_EXPORT const char *cxl_memdev_get_devname(struct cxl_memdev *memdev)
Jeff Moyer 2c91dc
 {
Jeff Moyer 2c91dc
 	return devpath_to_devname(memdev->dev_path);
Jeff Moyer 2c91dc
diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
index 077d104..4411035 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
+++ b/cxl/lib/libcxl.sym
Jeff Moyer 2c91dc
@@ -73,3 +73,8 @@ global:
Jeff Moyer 2c91dc
 local:
Jeff Moyer 2c91dc
         *;
Jeff Moyer 2c91dc
 };
Jeff Moyer 2c91dc
+
Jeff Moyer 2c91dc
+LIBCXL_2 {
Jeff Moyer 2c91dc
+global:
Jeff Moyer 2c91dc
+	cxl_memdev_get_serial;
Jeff Moyer 2c91dc
+} LIBCXL_1;
Jeff Moyer 2c91dc
diff --git a/cxl/lib/private.h b/cxl/lib/private.h
Jeff Moyer 2c91dc
index a1b8b50..28f7e16 100644
Jeff Moyer 2c91dc
--- a/cxl/lib/private.h
Jeff Moyer 2c91dc
+++ b/cxl/lib/private.h
Jeff Moyer 2c91dc
@@ -31,6 +31,7 @@ struct cxl_memdev {
Jeff Moyer 2c91dc
 	size_t lsa_size;
Jeff Moyer 2c91dc
 	struct kmod_module *module;
Jeff Moyer 2c91dc
 	struct cxl_nvdimm_bridge *bridge;
Jeff Moyer 2c91dc
+	unsigned long long serial;
Jeff Moyer 2c91dc
 };
Jeff Moyer 2c91dc
 
Jeff Moyer 2c91dc
 enum cxl_cmd_query_status {
Jeff Moyer 2c91dc
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
Jeff Moyer 2c91dc
index 89d35ba..bcdede8 100644
Jeff Moyer 2c91dc
--- a/cxl/libcxl.h
Jeff Moyer 2c91dc
+++ b/cxl/libcxl.h
Jeff Moyer 2c91dc
@@ -35,6 +35,7 @@ struct cxl_memdev;
Jeff Moyer 2c91dc
 struct cxl_memdev *cxl_memdev_get_first(struct cxl_ctx *ctx);
Jeff Moyer 2c91dc
 struct cxl_memdev *cxl_memdev_get_next(struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
 int cxl_memdev_get_id(struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
+unsigned long long cxl_memdev_get_serial(struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
 const char *cxl_memdev_get_devname(struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
 int cxl_memdev_get_major(struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
 int cxl_memdev_get_minor(struct cxl_memdev *memdev);
Jeff Moyer 2c91dc
-- 
Jeff Moyer 2c91dc
2.27.0
Jeff Moyer 2c91dc