CXL 3.0 Spec 8.2.9.8.3.3 defines Set Alert Configuration mailbox command which allows a CXL host to configure programmable warning thresholds optionally.
Add methods to issue the command and set fields. Signed-off-by: Jehoon Park <[email protected]> --- Documentation/cxl/lib/libcxl.txt | 1 + cxl/lib/libcxl.c | 21 +++++++++++++++++++++ cxl/lib/libcxl.sym | 12 ++++++++++++ cxl/lib/private.h | 12 ++++++++++++ cxl/libcxl.h | 16 ++++++++++++++++ 5 files changed, 62 insertions(+) diff --git a/Documentation/cxl/lib/libcxl.txt b/Documentation/cxl/lib/libcxl.txt index 31bc855..bcb8928 100644 --- a/Documentation/cxl/lib/libcxl.txt +++ b/Documentation/cxl/lib/libcxl.txt @@ -122,6 +122,7 @@ struct cxl_cmd *cxl_cmd_new_raw(struct cxl_memdev *memdev, int opcode); struct cxl_cmd *cxl_cmd_new_identify(struct cxl_memdev *memdev); struct cxl_cmd *cxl_cmd_new_get_health_info(struct cxl_memdev *memdev); struct cxl_cmd *cxl_cmd_new_get_alert_config(struct cxl_memdev *memdev); +struct cxl_cmd *cxl_cmd_new_set_alert_config(struct cxl_memdev *memdev); struct cxl_cmd *cxl_cmd_new_read_label(struct cxl_memdev *memdev, unsigned int offset, unsigned int length); struct cxl_cmd *cxl_cmd_new_write_label(struct cxl_memdev *memdev, void *buf, diff --git a/cxl/lib/libcxl.c b/cxl/lib/libcxl.c index af4ca44..c781566 100644 --- a/cxl/lib/libcxl.c +++ b/cxl/lib/libcxl.c @@ -4465,3 +4465,24 @@ CXL_EXPORT int cxl_memdev_read_label(struct cxl_memdev *memdev, void *buf, { return lsa_op(memdev, LSA_OP_GET, buf, length, offset); } + +#define cxl_alert_config_set_field(field) \ +CXL_EXPORT int cxl_cmd_alert_config_set_##field(struct cxl_cmd *cmd, int val) \ +{ \ + struct cxl_cmd_set_alert_config *setalert = cmd->input_payload; \ + setalert->field = val; \ + return 0; \ +} + +cxl_alert_config_set_field(life_used_prog_warn_threshold) +cxl_alert_config_set_field(dev_over_temperature_prog_warn_threshold) +cxl_alert_config_set_field(dev_under_temperature_prog_warn_threshold) +cxl_alert_config_set_field(corrected_volatile_mem_err_prog_warn_threshold) +cxl_alert_config_set_field(corrected_pmem_err_prog_warn_threshold) +cxl_alert_config_set_field(valid_alert_actions) +cxl_alert_config_set_field(enable_alert_actions) + +CXL_EXPORT struct cxl_cmd *cxl_cmd_new_set_alert_config(struct cxl_memdev *memdev) +{ + return cxl_cmd_new_generic(memdev, CXL_MEM_COMMAND_ID_SET_ALERT_CONFIG); +} diff --git a/cxl/lib/libcxl.sym b/cxl/lib/libcxl.sym index 8fa1cca..6beca52 100644 --- a/cxl/lib/libcxl.sym +++ b/cxl/lib/libcxl.sym @@ -264,3 +264,15 @@ global: cxl_memdev_update_fw; cxl_memdev_cancel_fw_update; } LIBCXL_5; + +LIBCXL_7 { +global: + cxl_cmd_alert_config_set_life_used_prog_warn_threshold; + cxl_cmd_alert_config_set_dev_over_temperature_prog_warn_threshold; + cxl_cmd_alert_config_set_dev_under_temperature_prog_warn_threshold; + cxl_cmd_alert_config_set_corrected_volatile_mem_err_prog_warn_threshold; + cxl_cmd_alert_config_set_corrected_pmem_err_prog_warn_threshold; + cxl_cmd_alert_config_set_valid_alert_actions; + cxl_cmd_alert_config_set_enable_alert_actions; + cxl_cmd_new_set_alert_config; +} LIBCXL_6; diff --git a/cxl/lib/private.h b/cxl/lib/private.h index a641727..b26a862 100644 --- a/cxl/lib/private.h +++ b/cxl/lib/private.h @@ -309,6 +309,18 @@ struct cxl_cmd_get_alert_config { #define CXL_CMD_ALERT_CONFIG_PROG_ALERTS_CORRECTED_PMEM_ERR_PROG_WARN_THRESHOLD_MASK \ BIT(4) +/* CXL 3.0 8.2.9.8.3.3 Set Alert Configuration */ +struct cxl_cmd_set_alert_config { + u8 valid_alert_actions; + u8 enable_alert_actions; + u8 life_used_prog_warn_threshold; + u8 rsvd; + le16 dev_over_temperature_prog_warn_threshold; + le16 dev_under_temperature_prog_warn_threshold; + le16 corrected_volatile_mem_err_prog_warn_threshold; + le16 corrected_pmem_err_prog_warn_threshold; +} __attribute__((packed)); + struct cxl_cmd_get_partition { le64 active_volatile; le64 active_persistent; diff --git a/cxl/libcxl.h b/cxl/libcxl.h index 0f4f4b2..b0ec369 100644 --- a/cxl/libcxl.h +++ b/cxl/libcxl.h @@ -461,6 +461,22 @@ enum cxl_setpartition_mode { int cxl_cmd_partition_set_mode(struct cxl_cmd *cmd, enum cxl_setpartition_mode mode); +int cxl_cmd_alert_config_set_life_used_prog_warn_threshold(struct cxl_cmd *cmd, + int threshold); +int cxl_cmd_alert_config_set_dev_over_temperature_prog_warn_threshold( + struct cxl_cmd *cmd, int threshold); +int cxl_cmd_alert_config_set_dev_under_temperature_prog_warn_threshold( + struct cxl_cmd *cmd, int threshold); +int cxl_cmd_alert_config_set_corrected_volatile_mem_err_prog_warn_threshold( + struct cxl_cmd *cmd, int threshold); +int cxl_cmd_alert_config_set_corrected_pmem_err_prog_warn_threshold( + struct cxl_cmd *cmd, int threshold); +int cxl_cmd_alert_config_set_valid_alert_actions(struct cxl_cmd *cmd, + int action); +int cxl_cmd_alert_config_set_enable_alert_actions(struct cxl_cmd *cmd, + int enable); +struct cxl_cmd *cxl_cmd_new_set_alert_config(struct cxl_memdev *memdev); + #ifdef __cplusplus } /* extern "C" */ #endif -- 2.17.1
