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