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

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