Move util_dimm_firmware_to_json() internal to util_dimm_to_json(). Introduce a new UTIL_JSON_FIRMWARE flag to optionally dump firmware info when listing the dimm from either 'ndctl list', or after 'ndctl update-firmware'.
Move util_dimm_firmware_to_json() out of ndctl/util/json-firmware.c into the core util/json.c. Signed-off-by: Dan Williams <[email protected]> --- ndctl/Makefile.am | 1 - ndctl/list.c | 10 +---- ndctl/util/json-firmware.c | 85 -------------------------------------------- util/json.c | 84 +++++++++++++++++++++++++++++++++++++++++++ util/json.h | 17 +++++---- 5 files changed, 95 insertions(+), 102 deletions(-) delete mode 100644 ndctl/util/json-firmware.c diff --git a/ndctl/Makefile.am b/ndctl/Makefile.am index 49c6c4ab4498..a63b1e0b8a01 100644 --- a/ndctl/Makefile.am +++ b/ndctl/Makefile.am @@ -25,7 +25,6 @@ ndctl_SOURCES = ndctl.c \ ../util/json.c \ ../util/json.h \ util/json-smart.c \ - util/json-firmware.c \ util/keys.h \ inject-error.c \ inject-smart.c \ diff --git a/ndctl/list.c b/ndctl/list.c index 31fb1b9593a2..1f7cc8ee1deb 100644 --- a/ndctl/list.c +++ b/ndctl/list.c @@ -59,6 +59,8 @@ static unsigned long listopts_to_flags(void) flags |= UTIL_JSON_VERBOSE; if (list.capabilities) flags |= UTIL_JSON_CAPABILITIES; + if (list.firmware) + flags |= UTIL_JSON_FIRMWARE; return flags; } @@ -367,14 +369,6 @@ static void filter_dimm(struct ndctl_dimm *dimm, struct util_filter_ctx *ctx) } } - if (list.firmware) { - struct json_object *jfirmware; - - jfirmware = util_dimm_firmware_to_json(dimm, lfa->flags); - if (jfirmware) - json_object_object_add(jdimm, "firmware", jfirmware); - } - /* * Without a bus we are collecting dimms anonymously across the * platform. diff --git a/ndctl/util/json-firmware.c b/ndctl/util/json-firmware.c deleted file mode 100644 index 9a9db064d851..000000000000 --- a/ndctl/util/json-firmware.c +++ /dev/null @@ -1,85 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -/* Copyright(c) 2018 Intel Corporation. All rights reserved. */ -#include <limits.h> -#include <util/json.h> -#include <uuid/uuid.h> -#include <json-c/json.h> -#include <ndctl/libndctl.h> -#include <ccan/array_size/array_size.h> -#include <ndctl.h> - -struct json_object *util_dimm_firmware_to_json(struct ndctl_dimm *dimm, - unsigned long flags) -{ - struct json_object *jfirmware = json_object_new_object(); - struct json_object *jobj; - struct ndctl_cmd *cmd; - int rc; - uint64_t run, next; - - if (!jfirmware) - return NULL; - - cmd = ndctl_dimm_cmd_new_fw_get_info(dimm); - if (!cmd) - goto err; - - rc = ndctl_cmd_submit(cmd); - if ((rc < 0) || ndctl_cmd_fw_xlat_firmware_status(cmd) != FW_SUCCESS) { - jobj = util_json_object_hex(-1, flags); - if (jobj) - json_object_object_add(jfirmware, "current_version", - jobj); - goto out; - } - - run = ndctl_cmd_fw_info_get_run_version(cmd); - if (run == ULLONG_MAX) { - jobj = util_json_object_hex(-1, flags); - if (jobj) - json_object_object_add(jfirmware, "current_version", - jobj); - goto out; - } - - jobj = util_json_object_hex(run, flags); - if (jobj) - json_object_object_add(jfirmware, "current_version", jobj); - - rc = ndctl_dimm_fw_update_supported(dimm); - jobj = json_object_new_boolean(rc == 0); - if (jobj) - json_object_object_add(jfirmware, "can_update", jobj); - - next = ndctl_cmd_fw_info_get_updated_version(cmd); - if (next == ULLONG_MAX) { - jobj = util_json_object_hex(-1, flags); - if (jobj) - json_object_object_add(jfirmware, "next_version", - jobj); - goto out; - } - - if (next != 0) { - jobj = util_json_object_hex(next, flags); - if (jobj) - json_object_object_add(jfirmware, - "next_version", jobj); - - jobj = json_object_new_boolean(true); - if (jobj) - json_object_object_add(jfirmware, - "need_powercycle", jobj); - } - - ndctl_cmd_unref(cmd); - return jfirmware; - -err: - json_object_put(jfirmware); - jfirmware = NULL; -out: - if (cmd) - ndctl_cmd_unref(cmd); - return jfirmware; -} diff --git a/util/json.c b/util/json.c index 21ab25674624..59a3d07cc4a6 100644 --- a/util/json.c +++ b/util/json.c @@ -156,6 +156,82 @@ struct json_object *util_bus_to_json(struct ndctl_bus *bus) return NULL; } +struct json_object *util_dimm_firmware_to_json(struct ndctl_dimm *dimm, + unsigned long flags) +{ + struct json_object *jfirmware = json_object_new_object(); + struct json_object *jobj; + struct ndctl_cmd *cmd; + int rc; + uint64_t run, next; + + if (!jfirmware) + return NULL; + + cmd = ndctl_dimm_cmd_new_fw_get_info(dimm); + if (!cmd) + goto err; + + rc = ndctl_cmd_submit(cmd); + if ((rc < 0) || ndctl_cmd_fw_xlat_firmware_status(cmd) != FW_SUCCESS) { + jobj = util_json_object_hex(-1, flags); + if (jobj) + json_object_object_add(jfirmware, "current_version", + jobj); + goto out; + } + + run = ndctl_cmd_fw_info_get_run_version(cmd); + if (run == ULLONG_MAX) { + jobj = util_json_object_hex(-1, flags); + if (jobj) + json_object_object_add(jfirmware, "current_version", + jobj); + goto out; + } + + jobj = util_json_object_hex(run, flags); + if (jobj) + json_object_object_add(jfirmware, "current_version", jobj); + + rc = ndctl_dimm_fw_update_supported(dimm); + jobj = json_object_new_boolean(rc == 0); + if (jobj) + json_object_object_add(jfirmware, "can_update", jobj); + + next = ndctl_cmd_fw_info_get_updated_version(cmd); + if (next == ULLONG_MAX) { + jobj = util_json_object_hex(-1, flags); + if (jobj) + json_object_object_add(jfirmware, "next_version", + jobj); + goto out; + } + + if (next != 0) { + jobj = util_json_object_hex(next, flags); + if (jobj) + json_object_object_add(jfirmware, + "next_version", jobj); + + jobj = json_object_new_boolean(true); + if (jobj) + json_object_object_add(jfirmware, + "need_powercycle", jobj); + } + + ndctl_cmd_unref(cmd); + return jfirmware; + +err: + json_object_put(jfirmware); + jfirmware = NULL; +out: + if (cmd) + ndctl_cmd_unref(cmd); + return jfirmware; +} + struct json_object *util_dimm_to_json(struct ndctl_dimm *dimm, unsigned long flags) { @@ -266,6 +342,14 @@ struct json_object *util_dimm_to_json(struct ndctl_dimm *dimm, json_object_object_add(jdimm, "security_frozen", jobj); } + if (flags & UTIL_JSON_FIRMWARE) { + struct json_object *jfirmware; + + jfirmware = util_dimm_firmware_to_json(dimm, flags); + if (jfirmware) + json_object_object_add(jdimm, "firmware", jfirmware); + } + return jdimm; err: json_object_put(jdimm); diff --git a/util/json.h b/util/json.h index 6d39d3aa4693..fc91a8db034f 100644 --- a/util/json.h +++ b/util/json.h @@ -18,14 +18,15 @@ #include <ccan/short_types/short_types.h> enum util_json_flags { - UTIL_JSON_IDLE = (1 << 0), - UTIL_JSON_MEDIA_ERRORS = (1 << 1), - UTIL_JSON_DAX = (1 << 2), - UTIL_JSON_DAX_DEVS = (1 << 3), - UTIL_JSON_HUMAN = (1 << 4), - UTIL_JSON_VERBOSE = (1 << 5), - UTIL_JSON_CAPABILITIES = (1 << 6), - UTIL_JSON_CONFIGURED = (1 << 7), + UTIL_JSON_IDLE = (1 << 0), + UTIL_JSON_MEDIA_ERRORS = (1 << 1), + UTIL_JSON_DAX = (1 << 2), + UTIL_JSON_DAX_DEVS = (1 << 3), + UTIL_JSON_HUMAN = (1 << 4), + UTIL_JSON_VERBOSE = (1 << 5), + UTIL_JSON_CAPABILITIES = (1 << 6), + UTIL_JSON_CONFIGURED = (1 << 7), + UTIL_JSON_FIRMWARE = (1 << 8), }; struct json_object; _______________________________________________ Linux-nvdimm mailing list -- [email protected] To unsubscribe send an email to [email protected]
