aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJonathan Zhang <jonzhang@fb.com>2022-11-07 15:38:42 -0800
committerVishal Verma <vishal.l.verma@intel.com>2022-11-10 12:43:07 -0700
commitbd8d2ef708bb90c650c8b63e3ff1fd35bc60c599 (patch)
tree60c50d66524cfa2c6c763c4019da10e1003305ab
parentb405316bca5e4de4b4dd97778bb121e41ae667f3 (diff)
cxl/list: display alert configuration fieldsfor-75/jz/alert-config
Add a --alert-config option to cxl-list to display the CXL device's critical alert and programmable warning configurations under the memdev listing. Signed-off-by: Jonathan Zhang <jonzhang@meta.com> Link: https://lore.kernel.org/r/20221107233842.3553784-3-jonzhang@meta.com Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
-rw-r--r--Documentation/cxl/cxl-list.txt33
-rw-r--r--cxl/filter.c2
-rw-r--r--cxl/filter.h1
-rw-r--r--cxl/json.c185
-rw-r--r--cxl/list.c6
-rw-r--r--util/json.h1
6 files changed, 226 insertions, 2 deletions
diff --git a/Documentation/cxl/cxl-list.txt b/Documentation/cxl/cxl-list.txt
index 14a2b4bb..1d320678 100644
--- a/Documentation/cxl/cxl-list.txt
+++ b/Documentation/cxl/cxl-list.txt
@@ -219,6 +219,39 @@ OPTIONS
}
]
----
+-A::
+--alert-config::
+ Include alert configuration in the memdev listing. Example listing:
+----
+# cxl list -m mem0 -A
+[
+ {
+ "memdev":"mem0",
+ "pmem_size":0,
+ "ram_size":273535729664,
+ "alert_config":{
+ "life_used_prog_warn_threshold_valid":false,
+ "dev_over_temperature_prog_warn_threshold_valid":false,
+ "dev_under_temperature_prog_warn_threshold_valid":false,
+ "corrected_volatile_mem_err_prog_warn_threshold_valid":true,
+ "corrected_pmem_err_prog_warn_threshold_valid":false,
+ "life_used_prog_warn_threshold_writable":false,
+ "dev_over_temperature_prog_warn_threshold_writable":false,
+ "dev_under_temperature_prog_warn_threshold_writable":false,
+ "corrected_volatile_mem_err_prog_warn_threshold_writable":true,
+ "corrected_pmem_err_prog_warn_threshold_writable":false,
+ "life_used_crit_alert_threshold":0,
+ "life_used_prog_warn_threshold":0,
+ "dev_over_temperature_crit_alert_threshold":0,
+ "dev_under_temperature_crit_alert_threshold":0,
+ "dev_over_temperature_prog_warn_threshold":0,
+ "dev_under_temperature_prog_warn_threshold":0,
+ "corrected_volatile_mem_err_prog_warn_threshold":0,
+ "corrected_pmem_err_prog_warn_threshold":0
+ },
+ }
+]
+----
-B::
--buses::
diff --git a/cxl/filter.c b/cxl/filter.c
index 56c65996..beb64de6 100644
--- a/cxl/filter.c
+++ b/cxl/filter.c
@@ -686,6 +686,8 @@ static unsigned long params_to_flags(struct cxl_filter_params *param)
flags |= UTIL_JSON_TARGETS;
if (param->partition)
flags |= UTIL_JSON_PARTITION;
+ if (param->alert_config)
+ flags |= UTIL_JSON_ALERT_CONFIG;
return flags;
}
diff --git a/cxl/filter.h b/cxl/filter.h
index 256df49c..cd514c99 100644
--- a/cxl/filter.h
+++ b/cxl/filter.h
@@ -26,6 +26,7 @@ struct cxl_filter_params {
bool human;
bool health;
bool partition;
+ bool alert_config;
int verbose;
struct log_ctx ctx;
};
diff --git a/cxl/json.c b/cxl/json.c
index 63c17519..2a56e276 100644
--- a/cxl/json.c
+++ b/cxl/json.c
@@ -185,6 +185,185 @@ err_jobj:
return NULL;
}
+static struct json_object *
+util_cxl_memdev_alert_config_to_json(struct cxl_memdev *memdev,
+ unsigned long flags)
+{
+ struct json_object *jalert_config;
+ struct json_object *jobj;
+ struct cxl_cmd *cmd;
+ int rc;
+
+ jalert_config = json_object_new_object();
+ if (!jalert_config)
+ return NULL;
+ if (!memdev)
+ goto err_jobj;
+
+ cmd = cxl_cmd_new_get_alert_config(memdev);
+ if (!cmd)
+ goto err_jobj;
+
+ rc = cxl_cmd_submit(cmd);
+ if (rc < 0)
+ goto err_cmd;
+ rc = cxl_cmd_get_mbox_status(cmd);
+ if (rc != 0)
+ goto err_cmd;
+
+ rc = cxl_cmd_alert_config_life_used_prog_warn_threshold_valid(cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(jalert_config,
+ "life_used_prog_warn_threshold_valid",
+ jobj);
+
+ rc = cxl_cmd_alert_config_dev_over_temperature_prog_warn_threshold_valid(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_over_temperature_prog_warn_threshold_valid", jobj);
+
+ rc = cxl_cmd_alert_config_dev_under_temperature_prog_warn_threshold_valid(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_under_temperature_prog_warn_threshold_valid",
+ jobj);
+
+ rc = cxl_cmd_alert_config_corrected_volatile_mem_err_prog_warn_threshold_valid(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "corrected_volatile_mem_err_prog_warn_threshold_valid",
+ jobj);
+
+ rc = cxl_cmd_alert_config_corrected_pmem_err_prog_warn_threshold_valid(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "corrected_pmem_err_prog_warn_threshold_valid",
+ jobj);
+
+ rc = cxl_cmd_alert_config_life_used_prog_warn_threshold_writable(cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(jalert_config,
+ "life_used_prog_warn_threshold_writable",
+ jobj);
+
+ rc = cxl_cmd_alert_config_dev_over_temperature_prog_warn_threshold_writable(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_over_temperature_prog_warn_threshold_writable",
+ jobj);
+
+ rc = cxl_cmd_alert_config_dev_under_temperature_prog_warn_threshold_writable(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_under_temperature_prog_warn_threshold_writable",
+ jobj);
+
+ rc = cxl_cmd_alert_config_corrected_volatile_mem_err_prog_warn_threshold_writable(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "corrected_volatile_mem_err_prog_warn_threshold_writable",
+ jobj);
+
+ rc = cxl_cmd_alert_config_corrected_pmem_err_prog_warn_threshold_writable(
+ cmd);
+ jobj = json_object_new_boolean(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "corrected_pmem_err_prog_warn_threshold_writable", jobj);
+
+ rc = cxl_cmd_alert_config_get_life_used_crit_alert_threshold(cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(jalert_config,
+ "life_used_crit_alert_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_life_used_prog_warn_threshold(cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(jalert_config,
+ "life_used_prog_warn_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_dev_over_temperature_crit_alert_threshold(
+ cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_over_temperature_crit_alert_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_dev_under_temperature_crit_alert_threshold(
+ cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_under_temperature_crit_alert_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_dev_over_temperature_prog_warn_threshold(
+ cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_over_temperature_prog_warn_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_dev_under_temperature_prog_warn_threshold(
+ cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "dev_under_temperature_prog_warn_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_corrected_volatile_mem_err_prog_warn_threshold(
+ cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(
+ jalert_config,
+ "corrected_volatile_mem_err_prog_warn_threshold", jobj);
+
+ rc = cxl_cmd_alert_config_get_corrected_pmem_err_prog_warn_threshold(
+ cmd);
+ jobj = json_object_new_int(rc);
+ if (jobj)
+ json_object_object_add(jalert_config,
+ "corrected_pmem_err_prog_warn_threshold", jobj);
+
+ cxl_cmd_unref(cmd);
+ return jalert_config;
+
+err_cmd:
+ cxl_cmd_unref(cmd);
+err_jobj:
+ json_object_put(jalert_config);
+ return NULL;
+}
+
/*
* Present complete view of memdev partition by presenting fields from
* both GET_PARTITION_INFO and IDENTIFY mailbox commands.
@@ -330,6 +509,12 @@ struct json_object *util_cxl_memdev_to_json(struct cxl_memdev *memdev,
json_object_object_add(jdev, "health", jobj);
}
+ if (flags & UTIL_JSON_ALERT_CONFIG) {
+ jobj = util_cxl_memdev_alert_config_to_json(memdev, flags);
+ if (jobj)
+ json_object_object_add(jdev, "alert_config", jobj);
+ }
+
serial = cxl_memdev_get_serial(memdev);
if (serial < ULLONG_MAX) {
jobj = util_json_object_hex(serial, flags);
diff --git a/cxl/list.c b/cxl/list.c
index 8c48fbba..5dd76b9e 100644
--- a/cxl/list.c
+++ b/cxl/list.c
@@ -52,8 +52,9 @@ static const struct option options[] = {
"include memory device health information"),
OPT_BOOLEAN('I', "partition", &param.partition,
"include memory device partition information"),
- OPT_INCR('v', "verbose", &param.verbose,
- "increase output detail"),
+ OPT_BOOLEAN('A', "alert-config", &param.alert_config,
+ "include alert configuration information"),
+ OPT_INCR('v', "verbose", &param.verbose, "increase output detail"),
#ifdef ENABLE_DEBUG
OPT_BOOLEAN(0, "debug", &debug, "debug list walk"),
#endif
@@ -113,6 +114,7 @@ int cmd_list(int argc, const char **argv, struct cxl_ctx *ctx)
case 3:
param.health = true;
param.partition = true;
+ param.alert_config = true;
/* fallthrough */
case 2:
param.idle = true;
diff --git a/util/json.h b/util/json.h
index 73bb9f00..ea370df4 100644
--- a/util/json.h
+++ b/util/json.h
@@ -20,6 +20,7 @@ enum util_json_flags {
UTIL_JSON_HEALTH = (1 << 10),
UTIL_JSON_TARGETS = (1 << 11),
UTIL_JSON_PARTITION = (1 << 12),
+ UTIL_JSON_ALERT_CONFIG = (1 << 13),
};
void util_display_json_array(FILE *f_out, struct json_object *jarray,