Blame SOURCES/0095-cxl-list-Emit-device-serial-numbers.patch

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