Add APIs to access an incomplete list of fields from the 'Identify' mailbox command. The fields added are fw_revision, partition_align, and lsa_size.
Signed-off-by: Vishal Verma <[email protected]> --- cxl/lib/private.h | 19 +++++++++++++++++++ cxl/lib/libcxl.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ cxl/libcxl.h | 3 +++ cxl/lib/libcxl.sym | 3 +++ 4 files changed, 69 insertions(+) diff --git a/cxl/lib/private.h b/cxl/lib/private.h index c7ebfcb..19f3a37 100644 --- a/cxl/lib/private.h +++ b/cxl/lib/private.h @@ -60,6 +60,25 @@ struct cxl_cmd { int status; }; +#define CXL_CMD_IDENTIFY_FW_REV_LENGTH 0x10 + +struct cxl_cmd_identify { + char fw_revision[CXL_CMD_IDENTIFY_FW_REV_LENGTH]; + le64 total_capacity; + le64 volatile_capacity; + le64 persistent_capacity; + le64 partition_align; + le16 info_event_log_size; + le16 warning_event_log_size; + le16 failure_event_log_size; + le16 fatal_event_log_size; + le32 lsa_size; + u8 poison_list_max_mer[3]; + le16 inject_poison_limit; + u8 poison_caps; + u8 qos_telemetry_caps; +} __packed; + static inline int check_kmod(struct kmod_ctx *kmod_ctx) { return kmod_ctx ? 0 : -ENXIO; diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index 02bc316..d54da95 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -13,7 +13,10 @@ #include <sys/sysmacros.h> #include <uuid/uuid.h> #include <ccan/list/list.h> +#include <ccan/endian/endian.h> +#include <ccan/minmax/minmax.h> #include <ccan/array_size/array_size.h> +#include <ccan/short_types/short_types.h> #include <cxl_mem.h> #include <util/log.h> @@ -624,6 +627,47 @@ CXL_EXPORT struct cxl_cmd *cxl_cmd_new_identify(struct cxl_memdev *memdev) return cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_IDENTIFY); } +CXL_EXPORT int cxl_cmd_identify_get_fw_rev(struct cxl_cmd *cmd, char *fw_rev, + int fw_len) +{ + struct cxl_cmd_identify *id = (void *)cmd->send_cmd->out_payload; + + if (cmd->send_cmd->id != CXL_MEM_COMMAND_ID_IDENTIFY) + return -EINVAL; + if (cmd->status < 0) + return cmd->status; + + if (fw_len > 0) + memcpy(fw_rev, id->fw_revision, + min(fw_len, CXL_CMD_IDENTIFY_FW_REV_LENGTH)); + return 0; +} + +CXL_EXPORT unsigned long long cxl_cmd_identify_get_partition_align( + struct cxl_cmd *cmd) +{ + struct cxl_cmd_identify *id = (void *)cmd->send_cmd->out_payload; + + if (cmd->send_cmd->id != CXL_MEM_COMMAND_ID_IDENTIFY) + return -EINVAL; + if (cmd->status < 0) + return cmd->status; + + return le64_to_cpu(id->partition_align); +} + +CXL_EXPORT unsigned int cxl_cmd_identify_get_lsa_size(struct cxl_cmd *cmd) +{ + struct cxl_cmd_identify *id = (void *)cmd->send_cmd->out_payload; + + if (cmd->send_cmd->id != CXL_MEM_COMMAND_ID_IDENTIFY) + return -EINVAL; + if (cmd->status < 0) + return cmd->status; + + return le32_to_cpu(id->lsa_size); +} + CXL_EXPORT struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev) { return cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_RAW); diff --git a/cxl/libcxl.h b/cxl/libcxl.h index 83888bc..caa2e76 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -55,6 +55,9 @@ int cxl_cmd_attach_payloads(struct cxl_cmd *cmd, void cxl_cmd_ref(struct cxl_cmd *cmd); void cxl_cmd_unref(struct cxl_cmd *cmd); int cxl_cmd_submit(struct cxl_cmd *cmd); +int cxl_cmd_identify_get_fw_rev(struct cxl_cmd *cmd, char *fw_rev, int fw_len); +unsigned long long cxl_cmd_identify_get_partition_align(struct cxl_cmd *cmd); +unsigned int cxl_cmd_identify_get_lsa_size(struct cxl_cmd *cmd); #ifdef __cplusplus } /* extern "C" */ diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym index 3583bab..41311d9 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -35,4 +35,7 @@ global: cxl_cmd_ref; cxl_cmd_unref; cxl_cmd_submit; + cxl_cmd_identify_get_fw_rev; + cxl_cmd_identify_get_partition_align; + cxl_cmd_identify_get_lsa_size; } LIBCXL_2; -- 2.29.2 _______________________________________________ Linux-nvdimm mailing list -- [email protected] To unsubscribe send an email to [email protected]
