linux-nvdimm.lists.01.org archive mirror
 help / color / mirror / Atom feed
From: Dan Williams <dan.j.williams@intel.com>
To: Dave Jiang <dave.jiang@intel.com>
Cc: linux-nvdimm@lists.01.org
Subject: Re: [PATCH v3] ndctl: add option to list firmware information for a DIMM
Date: Tue, 13 Feb 2018 13:27:26 -0800	[thread overview]
Message-ID: <CAPcyv4jf1s3urq0GH1tn8oaN1w9UhDkhmmPB09GCyWLaVDCOew@mail.gmail.com> (raw)
In-Reply-To: <151855080982.41933.1906244270307534998.stgit@djiang5-desk3.ch.intel.com>

On Tue, Feb 13, 2018 at 11:41 AM, Dave Jiang <dave.jiang@intel.com> wrote:
> Adding firmware output of firmware information when ndctl list -D -F is used.
> Components displayed are current firmware version, updated firmware version,
> and if a coldboot is required (firmware updated).
>
> Signed-off-by: Dave Jiang <dave.jiang@intel.com>
> ---
> v3:
> - Fixed issue where it skips displaying rest of the details if there's no
>   firmware details.
>
> v2:
> - Added copyright
> - Added support for human readable option (hex) for versions
> - Removed check against CMD_CALL as it's not useful
>
>  Documentation/ndctl/ndctl-list.txt |   13 +++++
>  ndctl/Makefile.am                  |    1
>  ndctl/list.c                       |   13 +++++
>  ndctl/util/json-firmware.c         |   90 ++++++++++++++++++++++++++++++++++++
>  util/json.h                        |    2 +
>  5 files changed, 119 insertions(+)
>  create mode 100644 ndctl/util/json-firmware.c
>
> diff --git a/Documentation/ndctl/ndctl-list.txt b/Documentation/ndctl/ndctl-list.txt
> index fc07a71..85b87d4 100644
> --- a/Documentation/ndctl/ndctl-list.txt
> +++ b/Documentation/ndctl/ndctl-list.txt
> @@ -110,6 +110,19 @@ include::xable-region-options.txt[]
>    }
>  }
>
> +-F::
> +--firmware::
> +       Include dimm firmware info in the listing. For example:
> +[verse]
> +{
> +  "dev":"nmem0",
> +  "firmware":{
> +      "current_version":0,
> +      "next_version":1,
> +      "coldboot_required":true
> +  }
> +}
> +
>  -X::
>  --device-dax::
>         Include device-dax ("daxregion") details when a namespace is in
> diff --git a/ndctl/Makefile.am b/ndctl/Makefile.am
> index 2054c1a..e0db97b 100644
> --- a/ndctl/Makefile.am
> +++ b/ndctl/Makefile.am
> @@ -13,6 +13,7 @@ ndctl_SOURCES = ndctl.c \
>                 test.c \
>                 ../util/json.c \
>                 util/json-smart.c \
> +               util/json-firmware.c \
>                 inject-error.c \
>                 update.c \
>                 inject-smart.c
> diff --git a/ndctl/list.c b/ndctl/list.c
> index 37a224a..8bb9920 100644
> --- a/ndctl/list.c
> +++ b/ndctl/list.c
> @@ -35,6 +35,7 @@ static struct {
>         bool dax;
>         bool media_errors;
>         bool human;
> +       bool firmware;
>  } list;
>
>  static unsigned long listopts_to_flags(void)
> @@ -277,6 +278,7 @@ int cmd_list(int argc, const char **argv, void *ctx)
>                                 "filter by region-type"),
>                 OPT_BOOLEAN('B', "buses", &list.buses, "include bus info"),
>                 OPT_BOOLEAN('D', "dimms", &list.dimms, "include dimm info"),
> +               OPT_BOOLEAN('F', "firmware", &list.firmware, "include firmware info"),
>                 OPT_BOOLEAN('H', "health", &list.health, "include dimm health"),
>                 OPT_BOOLEAN('R', "regions", &list.regions,
>                                 "include region info"),
> @@ -420,6 +422,17 @@ int cmd_list(int argc, const char **argv, void *ctx)
>                                 }
>                         }
>
> +                       if (list.firmware) {
> +                               struct json_object *jfirmware;
> +
> +                               jfirmware = util_dimm_firmware_to_json(dimm,
> +                                               listopts_to_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
> new file mode 100644
> index 0000000..a6c33d8
> --- /dev/null
> +++ b/ndctl/util/json-firmware.c
> @@ -0,0 +1,90 @@
> +/* 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, updated;
> +       bool reboot = false;
> +
> +       if (!jfirmware)
> +               return NULL;
> +
> +       cmd = ndctl_dimm_cmd_new_fw_get_info(dimm);
> +       if (!cmd)
> +               goto err;
> +
> +       rc = ndctl_cmd_submit(cmd);
> +       if (rc || ndctl_cmd_fw_xlat_firmware_status(cmd) != FW_SUCCESS) {
> +               jobj = json_object_new_string("unknown");
> +               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 = json_object_new_string("unknown");
> +               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);
> +
> +       updated = ndctl_cmd_fw_info_get_updated_version(cmd);
> +       if (updated == ULLONG_MAX) {
> +               jobj = json_object_new_string("unknown");
> +               if (jobj)
> +                       json_object_object_add(jfirmware, "next_version",
> +                                       jobj);
> +               goto out;
> +       }
> +
> +       if (updated == 0) {
> +               jobj = json_object_new_string("none");
> +               if (jobj)
> +                       json_object_object_add(jfirmware, "next_version",
> +                                       jobj);

I think we should emit nothing in this case. Because now the data type
of this field changes whether there is data or not. I think that will
cause problems for operations tooling that may want to ingest this
json without per-field type handling.
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

      parent reply	other threads:[~2018-02-13 21:21 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-13 19:41 [PATCH v3] ndctl: add option to list firmware information for a DIMM Dave Jiang
2018-02-13 20:15 ` Jeff Moyer
2018-02-13 21:27 ` Dan Williams [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAPcyv4jf1s3urq0GH1tn8oaN1w9UhDkhmmPB09GCyWLaVDCOew@mail.gmail.com \
    --to=dan.j.williams@intel.com \
    --cc=dave.jiang@intel.com \
    --cc=linux-nvdimm@lists.01.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).