@@ -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)
{
@@ -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;
@@ -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);