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