anitazha / rpms / ndctl

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