aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorAlison Schofield <alison.schofield@intel.com>2022-02-22 11:56:04 -0800
committerVishal Verma <vishal.l.verma@intel.com>2022-02-22 17:40:52 -0700
commit50b9d77232d41a33c2109894ae93ddad877c1747 (patch)
tree393e13c5775ffbef7b553b05f4b2e4a6486976a4
parent4f588b964dccf72030b1c432ed5dd8e2856f9d38 (diff)
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>
-rw-r--r--cxl/lib/libcxl.c44
-rw-r--r--cxl/lib/libcxl.sym3
-rw-r--r--cxl/libcxl.h3
3 files changed, 50 insertions, 0 deletions
diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c
index 4557a71d..9413384b 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 509e62da..5ac6e9bb 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 2c0a8d19..6e18e843 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);