anitazha / rpms / ndctl

Forked from rpms/ndctl a year ago
Clone

Blame SOURCES/0133-libcxl-add-accessors-for-capacity-fields-of-the-IDEN.patch

e0018b
From 50b9d77232d41a33c2109894ae93ddad877c1747 Mon Sep 17 00:00:00 2001
e0018b
From: Alison Schofield <alison.schofield@intel.com>
e0018b
Date: Tue, 22 Feb 2022 11:56:04 -0800
e0018b
Subject: [PATCH 133/217] libcxl: add accessors for capacity fields of the
e0018b
 IDENTIFY command
e0018b
e0018b
The CXL PMEM provisioning model depends upon the values reported
e0018b
in the CXL IDENTIFY mailbox command when changing the partitioning
e0018b
between volatile and persistent capacity.
e0018b
e0018b
Add accessors to the libcxl API to retrieve the total, volatile only,
e0018b
and persistent only capacities from the IDENTIFY command.
e0018b
e0018b
The fields are specified in multiples of 256MB per the CXL 2.0 spec.
e0018b
Use the capacity multiplier to convert the raw data into bytes for user
e0018b
consumption.
e0018b
e0018b
Link: https://lore.kernel.org/r/58dec40b15a68f134466f61421751994735e55c1.1645558189.git.alison.schofield@intel.com
e0018b
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
e0018b
Signed-off-by: Alison Schofield <alison.schofield@intel.com>
e0018b
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
e0018b
---
e0018b
 cxl/lib/libcxl.c   | 44 ++++++++++++++++++++++++++++++++++++++++++++
e0018b
 cxl/lib/libcxl.sym |  3 +++
e0018b
 cxl/libcxl.h       |  3 +++
e0018b
 3 files changed, 50 insertions(+)
e0018b
e0018b
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
e0018b
index 4557a71..9413384 100644
e0018b
--- a/cxl/lib/libcxl.c
e0018b
+++ b/cxl/lib/libcxl.c
e0018b
@@ -2277,6 +2277,17 @@ CXL_EXPORT struct cxl_cmd *cxl_cmd_new_identify(struct cxl_memdev *memdev)
e0018b
 	return cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_IDENTIFY);
e0018b
 }
e0018b
 
e0018b
+static struct cxl_cmd_identify *
e0018b
+cmd_to_identify(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	if (cxl_cmd_validate_status(cmd, CXL_MEM_COMMAND_ID_IDENTIFY))
e0018b
+		return NULL;
e0018b
+
e0018b
+	if (!cmd)
e0018b
+		return NULL;
e0018b
+	return cmd->output_payload;
e0018b
+}
e0018b
+
e0018b
 CXL_EXPORT int cxl_cmd_identify_get_fw_rev(struct cxl_cmd *cmd, char *fw_rev,
e0018b
 		int fw_len)
e0018b
 {
e0018b
@@ -2321,6 +2332,39 @@ CXL_EXPORT unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd)
e0018b
 	return le32_to_cpu(id->lsa_size);
e0018b
 }
e0018b
 
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_identify_get_total_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_identify *c;
e0018b
+
e0018b
+	c = cmd_to_identify(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->total_capacity);
e0018b
+}
e0018b
+
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_identify_get_volatile_only_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_identify *c;
e0018b
+
e0018b
+	c = cmd_to_identify(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->volatile_capacity);
e0018b
+}
e0018b
+
e0018b
+CXL_EXPORT unsigned long long
e0018b
+cxl_cmd_identify_get_persistent_only_size(struct cxl_cmd *cmd)
e0018b
+{
e0018b
+	struct cxl_cmd_identify *c;
e0018b
+
e0018b
+	c = cmd_to_identify(cmd);
e0018b
+	if (!c)
e0018b
+		return ULLONG_MAX;
e0018b
+	return cxl_capacity_to_bytes(c->persistent_capacity);
e0018b
+}
e0018b
+
e0018b
 CXL_EXPORT struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev,
e0018b
 		int opcode)
e0018b
 {
e0018b
diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym
e0018b
index 509e62d..5ac6e9b 100644
e0018b
--- a/cxl/lib/libcxl.sym
e0018b
+++ b/cxl/lib/libcxl.sym
e0018b
@@ -160,4 +160,7 @@ global:
e0018b
 	cxl_cmd_partition_get_active_persistent_size;
e0018b
 	cxl_cmd_partition_get_next_volatile_size;
e0018b
 	cxl_cmd_partition_get_next_persistent_size;
e0018b
+	cxl_cmd_identify_get_total_size;
e0018b
+	cxl_cmd_identify_get_volatile_only_size;
e0018b
+	cxl_cmd_identify_get_persistent_only_size;
e0018b
 } LIBCXL_1;
e0018b
diff --git a/cxl/libcxl.h b/cxl/libcxl.h
e0018b
index 2c0a8d1..6e18e84 100644
e0018b
--- a/cxl/libcxl.h
e0018b
+++ b/cxl/libcxl.h
e0018b
@@ -201,6 +201,9 @@ int cxl_cmd_get_mbox_status(struct cxl_cmd *cmd);
e0018b
 int cxl_cmd_get_out_size(struct cxl_cmd *cmd);
e0018b
 struct cxl_cmd *cxl_cmd_new_identify(struct cxl_memdev *memdev);
e0018b
 int cxl_cmd_identify_get_fw_rev(struct cxl_cmd *cmd, char *fw_rev, int fw_len);
e0018b
+unsigned long long cxl_cmd_identify_get_total_size(struct cxl_cmd *cmd);
e0018b
+unsigned long long cxl_cmd_identify_get_volatile_only_size(struct cxl_cmd *cmd);
e0018b
+unsigned long long cxl_cmd_identify_get_persistent_only_size(struct cxl_cmd *cmd);
e0018b
 unsigned long long cxl_cmd_identify_get_partition_align(struct cxl_cmd *cmd);
e0018b
 unsigned int cxl_cmd_identify_get_label_size(struct cxl_cmd *cmd);
e0018b
 struct cxl_cmd *cxl_cmd_new_get_health_info(struct cxl_memdev *memdev);
e0018b
-- 
e0018b
2.27.0
e0018b