]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
plugins/inspur: Add Inspur plugin extension.
authorwangmengmeng <wangmengmeng02@inspur.com>
Fri, 28 Oct 2022 07:30:16 +0000 (15:30 +0800)
committerDaniel Wagner <dwagner@suse.de>
Mon, 7 Nov 2022 09:51:38 +0000 (10:51 +0100)
Add sub-command to retrieve Inspur device Vendor log.

[dwagner: added a few newlines, changed iterator types to int]
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Documentation/cmd-plugins.txt
Documentation/meson.build
Documentation/nvme-inspur-nvme-vendor-log.txt [new file with mode: 0644]
completions/bash-nvme-completion.sh
plugins/inspur/inspur-nvme.c [new file with mode: 0644]
plugins/inspur/inspur-nvme.h [new file with mode: 0644]
plugins/inspur/inspur-utils.h [new file with mode: 0644]
plugins/meson.build

index 2ab6c6821de231e8d5003cc3e911b558202fa62d..f7676039326fbcdbf8eecf82d521efbd549397f4 100644 (file)
@@ -198,3 +198,6 @@ linknvme:nvme-zns-zone-mgmt-send[1]::
 
 linknvme:nvme-zns-zrwa-flush-zone[1]::
        Flush LBAs associated with a ZRWA to a zone
+
+linknvme:nvme-inspur-nvme-vendor-log[1]::
+       NVMe Inspur Device Vendor log page request
index bb0c97244602e6e0a20bd18a94e8c2cec0d2851d..a15d1e4b87f589fcea413ec0afba08bc8d3edf32 100644 (file)
@@ -176,6 +176,7 @@ adoc_sources = [
   'nvme-zns-zone-append',
   'nvme-zns-zone-mgmt-recv',
   'nvme-zns-zone-mgmt-send',
+  'nvme-inspur-nvme-vendor-log',
 ]
 
 adoc_includes = [
diff --git a/Documentation/nvme-inspur-nvme-vendor-log.txt b/Documentation/nvme-inspur-nvme-vendor-log.txt
new file mode 100644 (file)
index 0000000..5029e04
--- /dev/null
@@ -0,0 +1,37 @@
+nvme-inspur-nvme-vendor-log(1)
+=================
+
+NAME
+----
+nvme-inspur-nvme-vendor-log - Send NVMe Inspur Device Vendor log page request, returns result
+
+SYNOPSIS
+--------
+[verse]
+'nvme inspur nvme-vendor-log' <device> 
+
+DESCRIPTION
+-----------
+Retrieves the NVMe Inspur Device Vendor log page from the device and provides the returned structure.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+On success, vendor log structure are printed in a readable format.
+
+OPTIONS
+-------
+none
+
+
+EXAMPLES
+--------
+* Print the Inspur Device Vendor log page in a human readable format:
++
+------------
+# nvme inspur nvme-vendor-log /dev/nvme0
+------------
+
+NVME
+----
+Part of the nvme-user suite
index f067940a3309e82ff457c929892acd21e8360f55..00033f1e20fa8b70983b06fd7f47e9ac0ac09d54 100644 (file)
@@ -54,6 +54,7 @@ typeset -Ar _plugin_subcmds=(
                set-zone-desc zone-append changed-zone-list"
        [nvidia]="id-ctrl"
        [ymtc]="smart-log-add"
+       [inspur]="nvme-vendor-log"
 )
 readonly _plugin_subcmds
 
@@ -75,6 +76,7 @@ typeset -Ar _plugin_funcs=(
        [zns]="plugin_zns_opts"
        [nvidia]="plugin_nvidia_opts"
        [ymtc]="plugin_ymtc_opts"
+       [inspur]="plugin_inspur_opts"
 )
 readonly _plugin_funcs
 
@@ -1342,6 +1344,37 @@ plugin_ymtc_opts () {
        return 0
 }
 
+plugin_inspur_opts () {
+    local opts=""
+       local compargs=""
+
+       local nonopt_args=0
+       for (( i=0; i < ${#words[@]}-1; i++ )); do
+               if [[ ${words[i]} != -* ]]; then
+                       let nonopt_args+=1
+               fi
+       done
+
+       if [ $nonopt_args -eq 3 ]; then
+               opts="/dev/nvme* "
+       fi
+
+       opts+=" "
+
+       case "$1" in
+               "nvme-vendor-log")
+               opts+=$NO_OPTS
+                       ;;
+               "help")
+               opts+=$NO_OPTS
+                       ;;
+       esac
+
+       COMPREPLY+=( $( compgen $compargs -W "$opts" -- $cur ) )
+
+       return 0
+}
+
 _nvme_subcmds () {
        local cur prev words cword
        _init_completion || return
diff --git a/plugins/inspur/inspur-nvme.c b/plugins/inspur/inspur-nvme.c
new file mode 100644 (file)
index 0000000..9d7bb4d
--- /dev/null
@@ -0,0 +1,235 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/stat.h>
+
+#include "common.h"
+#include "nvme.h"
+#include "libnvme.h"
+#include "plugin.h"
+#include "nvme-print.h"
+#include "util/suffix.h"
+
+#define CREATE_CMD
+#include "inspur-nvme.h"
+#include "inspur-utils.h"
+
+void show_r1_vendor_log(r1_cli_vendor_log_t *vendorlog)
+{
+    int i = 0;
+
+    if (vendorlog->device_state == 0) {
+        printf("device_state              : [healthy]\n");
+    } else {
+        printf("device_state              : [warning]\n");
+    }
+
+    printf("commit id          : %s\n", vendorlog->commit_id);
+    printf("mcu data id(mcu)          : 0x%x\n", le32_to_cpu(vendorlog->mcu_data_id));
+    printf("power_info(mcu)           : %u mW\n", le32_to_cpu(vendorlog->power_info));
+    printf("voltage_info(mcu)         : %u mV\n", le32_to_cpu(vendorlog->voltage_info));
+    printf("current_info(mcu)         : %u mA\n", le32_to_cpu(vendorlog->current_info));
+    printf("history max_power(mcu)         : %u mW\n", le32_to_cpu(vendorlog->max_power));
+    printf("disk_max_temper(mcu)           : %d C\n", le32_to_cpu(vendorlog->disk_max_temper) - 273);
+    printf("disk_overtemper_cout(mcu)      : %u\n", le32_to_cpu(vendorlog->disk_overtemper_cout));
+    printf("ctrl_max_temper(mcu)           : %d C\n", le32_to_cpu(vendorlog->ctrl_max_temper) - 273);
+    printf("ctrl_overtemper_cout(mcu)      : %u\n", le32_to_cpu(vendorlog->ctrl_overtemper_cout));
+    printf("nand_max_temper(mcu)           : %d C\n", le32_to_cpu(vendorlog->nand_max_temper) - 273);
+    printf("nand_overtemper_cout(mcu)      : %u\n", le32_to_cpu(vendorlog->nand_overtemper_cout));
+
+    for (i = 0; i < 4; i++) {
+        printf("temperature[%d](mcu)           : %d C\n", i, le32_to_cpu(vendorlog->current_temp[i]) - 273);
+    }
+
+    printf("CAP Time from 32v to 27v(mcu)  : %u ms\n", le32_to_cpu(vendorlog->cap_transtime.cap_trans_time1));
+    printf("CAP Time from 27v to 10v(mcu)  : %u ms\n", le32_to_cpu(vendorlog->cap_transtime.cap_trans_time2));
+    printf("cap_health_state(mcu)          : %u\n", le32_to_cpu(vendorlog->cap_health_state));
+    printf("warning bit(mcu)               : 0x%x%08x\n", le32_to_cpu(vendorlog->detail_warning[1]),
+           le32_to_cpu(vendorlog->detail_warning[0]));
+    printf("-->high_format_fail       : %x\n", vendorlog->detail_warning_bit.high_format_fail);
+    printf("-->low_format_fail        : %x\n", vendorlog->detail_warning_bit.low_format_fail);
+    printf("-->current sensor         : %x\n", vendorlog->detail_warning_bit.self_test_fail1);
+    printf("-->nand temp sensor       : %x\n", vendorlog->detail_warning_bit.self_test_fail2);
+    printf("-->board temp sensor      : %x\n", vendorlog->detail_warning_bit.self_test_fail3);
+    printf("-->cntl temp sensor       : %x\n", vendorlog->detail_warning_bit.self_test_fail4);
+    printf("-->cap_timer_test_fail    : %x\n", vendorlog->detail_warning_bit.capacitance_test_fail);
+    printf("-->readOnly_after_rebuild : %x\n", vendorlog->detail_warning_bit.readOnly_after_rebuild);
+    printf("-->firmware_loss          : %x\n", vendorlog->detail_warning_bit.firmware_loss);
+    printf("-->cap_self_test          : %x\n", vendorlog->detail_warning_bit.cap_unsupply);
+    printf("-->spare_space_warning    : %x\n", vendorlog->detail_warning_bit.spare_space_warning);
+    printf("-->lifetime_warning       : %x\n", vendorlog->detail_warning_bit.lifetime_warning);
+    printf("-->temp_high_warning      : %x\n", vendorlog->detail_warning_bit.temp_high_warning);
+    printf("-->temp_low_warning       : %x\n", vendorlog->detail_warning_bit.temp_low_warning);
+    printf("-->mcu_disable(mcu)       : %x\n", vendorlog->detail_warning_bit.mcu_disable);
+    printf("warning history bit(mcu)  : 0x%x%08x\n", le32_to_cpu(vendorlog->detail_warning_his[1]),
+           le32_to_cpu(vendorlog->detail_warning_his[0]));
+    printf("-->high_format_fail       : %x\n", vendorlog->detail_warning_his_bit.high_format_fail);
+    printf("-->low_format_fail        : %x\n", vendorlog->detail_warning_his_bit.low_format_fail);
+    printf("-->current sensor         : %x\n", vendorlog->detail_warning_his_bit.self_test_fail1);
+    printf("-->nand temp sensor       : %x\n", vendorlog->detail_warning_his_bit.self_test_fail2);
+    printf("-->board temp sensor      : %x\n", vendorlog->detail_warning_his_bit.self_test_fail3);
+    printf("-->cntl temp sensor       : %x\n", vendorlog->detail_warning_his_bit.self_test_fail4);
+    printf("-->cap_timer_test_fail    : %x\n", vendorlog->detail_warning_his_bit.capacitance_test_fail);
+    printf("-->readOnly_after_rebuild : %x\n", vendorlog->detail_warning_his_bit.readOnly_after_rebuild);
+    printf("-->firmware_loss          : %x\n", vendorlog->detail_warning_his_bit.firmware_loss);
+    printf("-->cap_self_test          : %x\n", vendorlog->detail_warning_his_bit.cap_unsupply);
+    printf("-->spare_space_warning    : %x\n", vendorlog->detail_warning_his_bit.spare_space_warning);
+    printf("-->lifetime_warning       : %x\n", vendorlog->detail_warning_his_bit.lifetime_warning);
+    printf("-->temp_high_warning      : %x\n", vendorlog->detail_warning_his_bit.temp_high_warning);
+    printf("-->temp_low_warning       : %x\n", vendorlog->detail_warning_his_bit.temp_low_warning);
+    printf("-->mcu_disable(mcu)       : %x\n", vendorlog->detail_warning_his_bit.mcu_disable);
+
+    for (i = 0; i < 4; i++) {
+        printf("[%d]nand_bytes_written        : %" PRIu64 " GB\n", i, le64_to_cpu(vendorlog->nand_bytes_written[i]));
+    }
+
+    for (i = 0; i < 4; i++) {
+        printf("[%d]io_apptag_err         : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_apptag_err));
+        printf("[%d]io_guard_err          : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_guard_err));
+        printf("[%d]io_reftag_err         : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_reftag_err));
+        printf("[%d]io_read_fail_cout     : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_read_fail_cout));
+        printf("[%d]io_write_fail_cout    : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_write_fail_cout));
+        printf("[%d]io_dma_disable_err    : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_disable_err));
+        printf("[%d]io_dma_fatal_err      : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_fatal_err));
+        printf("[%d]io_dma_linkdown_err   : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_linkdown_err));
+        printf("[%d]io_dma_timeout_err    : %u\n", i, le32_to_cpu(vendorlog->io_err[i].io_dma_timeout_err));
+        printf("[%d]lba_err[0]            : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[0]));
+        printf("[%d]lba_err[1]            : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[1]));
+        printf("[%d]lba_err[2]            : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[2]));
+        printf("[%d]lba_err[3]            : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[3]));
+        printf("[%d]lba_err[4]            : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[4]));
+        printf("[%d]lba_err[5]            : %u\n", i, le32_to_cpu(vendorlog->io_err[i].lba_err[5]));
+    }
+
+    printf("temp_throttle_per         : %u\n", le32_to_cpu(vendorlog->temp_throttle_per));
+    printf("port0_flreset_cnt         : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_fundamental_reset_cnt));
+    printf("port0_hot_reset_cnt       : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_hot_reset_cnt));
+    printf("port0_func_reset_cnt      : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_func_reset_cnt));
+    printf("port0_linkdown_cnt        : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_linkdown_cnt));
+    printf("port0_ctrl_reset_cnt      : %" PRIu64 "\n", le64_to_cpu(vendorlog->port0_ctrl_reset_cnt));
+    printf("ces_RcvErr_cnt            : %u\n", le32_to_cpu(vendorlog->ces_RcvErr_cnt));
+    printf("ces_BadTlp_cnt            : %u\n", le32_to_cpu(vendorlog->ces_BadTlp_cnt));
+    printf("ces_BadDllp_cnt           : %u\n", le32_to_cpu(vendorlog->ces_BadDllp_cnt));
+    printf("ces_Rplyover_cnt          : %u\n", le32_to_cpu(vendorlog->ces_Rplyover_cnt));
+    printf("ces_RplyTo_cnt            : %u\n", le32_to_cpu(vendorlog->ces_RplyTo_cnt));
+    printf("ces_Hlo_cnt               : %u\n", le32_to_cpu(vendorlog->ces_Hlo_cnt));
+    printf("scan doorbell err cnt        : %u\n", le32_to_cpu(vendorlog->scan_db_err_cnt));
+    printf("doorbell interrupt err cnt   : %u\n", le32_to_cpu(vendorlog->db_int_err_cnt));
+
+    printf("------------ncm-----------------------\n");
+    for (i = 0; i < 4; i++) {
+        printf("------------part%d-----------------------\n", i);
+        printf("[%d]nand_rd_unc_count         : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_unc_cnt));
+        printf("[%d]nand_rd_srr_count         : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_srr_cnt));
+        printf("[%d]nand_rd_sdecode_count     : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_soft_decode_cnt));
+        printf("[%d]nand_rd_rb_fail_count     : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_rebuild_fail_cnt));
+        printf("[%d]nand_prg_fail_count       : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_prg_fail_cnt));
+        printf("[%d]nand_eras_fail_count      : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_eras_fail_cnt));
+        printf("[%d]nand_rd_count             : %" PRIu64 "\n", i,
+               le64_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_rd_cnt));
+        printf("[%d]nand_prg_count            : %" PRIu64 "\n", i,
+               le64_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_prg_cnt));
+        printf("[%d]nand_eras_count           : %" PRIu64 "\n", i,
+               le64_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].nand_eras_cnt));
+        printf("[%d]BE_scan_unc_count         : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].BE_scan_unc_cnt));
+        printf("[%d]rebuild_req_cnt           : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].rebuild_req_cnt));
+        printf("[%d]retry_req_cnt             : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].retry_req_cnt));
+        printf("[%d]retry_success_cnt         : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].retry_success_cnt));
+        printf("[%d]prg_badblk_num            : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].prg_badblk_num));
+        printf("[%d]eras_badblk_num           : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].eras_badblk_num));
+        printf("[%d]read_badblk_num           : %u\n", i,
+               le32_to_cpu(vendorlog->vendor_log_nandctl_cnt[i].unc_badblk_num));
+    }
+
+    printf("[%d]temp_ctrl_limit_count         : %u\n", i, le32_to_cpu(vendorlog->temp_ctrl_limit_cnt));
+    printf("[%d]temp_ctrl_stop_count          : %u\n", i, le32_to_cpu(vendorlog->temp_ctrl_stop_cnt));
+    printf("------------wlm-----------------------\n");
+    for (i = 0; i < 4; i++) {
+        printf("------------part%d-----------------------\n", i);
+        printf("[%d]fbb_count                 : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].fbb_count));
+        printf("[%d]ebb_count                 : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].ebb_count));
+        printf("[%d]lbb_count                 : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].lbb_count));
+        printf("[%d]gc_read_count             : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].gc_read_count));
+        printf("[%d]gc_write_count            : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].gc_write_count));
+        printf("[%d]gc_write_fail_count       : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].gc_write_fail_count));
+        printf("[%d]force_gc_count            : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].force_gc_count));
+        printf("[%d]avg_pe_count              : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].avg_pe_count));
+        printf("[%d]max_pe_count              : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].max_pe_count));
+        printf("[%d]free_blk_num1             : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].free_blk_num1));
+        printf("[%d]free_blk_num2             : %u\n", i,
+               le32_to_cpu(vendorlog->wearlvl_vendor_log_count[i].free_blk_num2));
+    }
+
+    printf("------------lkm-----------------------\n");
+    printf("[%d]e2e_check_err_count1          : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt1));
+    printf("[%d]e2e_check_err_count2          : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt2));
+    printf("[%d]e2e_check_err_count3          : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt3));
+    printf("[%d]e2e_check_err_count4          : %u\n", i, le32_to_cpu(vendorlog->e2e_check_err_cnt4));
+}
+
+void show_r1_media_err_log(r1_cli_vendor_log_t *vendorlog)
+{
+    int i, j;
+
+    for (i = 0; i < 4; i++) {
+        printf("DM%d read err lba:\n", i);
+        for (j = 0; j < 10; j++) {
+            printf("[%d]lba : %" PRIu64 "\n", j, le64_to_cpu(vendorlog->media_err[i].lba_err[j]));
+        }
+    }
+}
+
+static int nvme_get_vendor_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+    __u8 local_mem[BYTE_OF_4K];
+    char *desc = "Get the Inspur vendor log";
+    struct nvme_dev *dev;
+    int err;
+
+    OPT_ARGS(opts) = { OPT_END() };
+
+    err = parse_and_open(&dev, argc, argv, desc, opts);
+    if (err)
+        return err;
+
+    memset(local_mem, 0, BYTE_OF_4K);
+    err = nvme_get_log_simple(dev_fd(dev), VENDOR_SMART_LOG_PAGE, sizeof(r1_cli_vendor_log_t), local_mem);
+    if (!err) {
+        show_r1_vendor_log((r1_cli_vendor_log_t *)local_mem);
+        show_r1_media_err_log((r1_cli_vendor_log_t *)local_mem);
+    } else {
+        nvme_show_status(err);
+    }
+
+    dev_close(dev);
+    return err;
+}
diff --git a/plugins/inspur/inspur-nvme.h b/plugins/inspur/inspur-nvme.h
new file mode 100644 (file)
index 0000000..14a5e76
--- /dev/null
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#undef CMD_INC_FILE
+#define CMD_INC_FILE plugins/inspur/inspur-nvme
+
+#if !defined(INSPUR_NVME) || defined(CMD_HEADER_MULTI_READ)
+#define INSPUR_NVME
+
+#include "cmd.h"
+
+PLUGIN(NAME("inspur", "Inspur vendor specific extensions", NVME_VERSION),
+       COMMAND_LIST(
+               ENTRY("nvme-vendor-log", "Retrieve Inspur Vendor Log, show it", nvme_get_vendor_log)
+       )
+);
+
+#endif
+
+#include "define_cmd.h"
diff --git a/plugins/inspur/inspur-utils.h b/plugins/inspur/inspur-utils.h
new file mode 100644 (file)
index 0000000..d411bf0
--- /dev/null
@@ -0,0 +1,175 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef __INSPUR_UTILS_H__
+#define __INSPUR_UTILS_H__
+
+#define BYTE_OF_64K 65536UL
+#define BYTE_OF_32K 32768UL
+#define BYTE_OF_16K 16384UL
+#define BYTE_OF_4K 4096UL
+#define BYTE_OF_512 512UL
+#define BYTE_OF_256 256UL
+#define BYTE_OF_128 128UL
+
+/* Inspur specific LOG_PAGE_ID */
+typedef enum {
+    VENDOR_SMART_LOG_PAGE = 0xc0,
+} vendor_sepc_log_page_id_e;
+
+#pragma pack(push, 1)
+typedef struct r1_am_cap_transtime {
+    __u32 cap_trans_time1 : 16;
+    __u32 cap_trans_time2 : 16;
+} r1_cap_transtime_t;
+
+typedef struct vendor_warning_bit {
+    __u32 high_format_fail : 1;
+    __u32 low_format_fail : 1;
+    __u32 rebuild_fail1 : 1;
+    __u32 rebuild_fail2 : 1;
+    __u32 rebuild_fail3 : 1;
+    __u32 rebuild_fail4 : 1;
+    __u32 rebuild_fail5 : 1;
+    __u32 rebuild_fail6 : 1;
+    __u32 self_test_fail1 : 1;
+    __u32 self_test_fail2 : 1;
+    __u32 self_test_fail3 : 1;
+    __u32 self_test_fail4 : 1;
+    __u32 internal_err1 : 1;
+    __u32 internal_err2 : 1;
+    __u32 internal_err3 : 1;
+    __u32 internal_err4 : 1;
+    __u32 internal_err5 : 1;
+    __u32 internal_err6 : 1;
+    __u32 internal_err7 : 1;
+    __u32 internal_err8 : 1;
+    __u32 internal_err9 : 1;
+    __u32 internal_err10 : 1;
+    __u32 internal_err11 : 1;
+    __u32 internal_err12 : 1;
+    __u32 internal_err13 : 1;
+    __u32 internal_err14 : 1;
+    __u32 internal_err15 : 1;
+    __u32 internal_err16 : 1;
+    __u32 capacitance_test_fail : 1;
+    __u32 IO_read_fail : 1;
+    __u32 IO_write_fail : 1;
+    __u32 readOnly_after_rebuild : 1;
+    __u32 firmware_loss : 1;
+    __u32 cap_unsupply : 1;
+    __u32 spare_space_warning : 1;
+    __u32 lifetime_warning : 1;
+    __u32 temp_high_warning : 1;
+    __u32 temp_low_warning : 1;
+    __u32 mcu_disable : 1;
+    __u32 rsv : 25;
+} vendor_warning_str;
+
+typedef struct r1_vendor_log_ncm_cout {
+    __u32 nand_rd_unc_cnt;
+    __u32 nand_rd_srr_cnt;
+    __u32 nand_rd_soft_decode_cnt;
+    __u32 nand_rd_rebuild_fail_cnt;
+    __u32 nand_prg_fail_cnt;
+    __u32 nand_eras_fail_cnt;
+    __u64 nand_rd_cnt;
+    __u64 nand_prg_cnt;
+    __u64 nand_eras_cnt;
+    __u32 BE_scan_unc_cnt;
+    __u32 rebuild_req_cnt;
+    __u16 retry_req_cnt;
+    __u16 retry_success_cnt;
+    __u32 prg_badblk_num;
+    __u32 eras_badblk_num;
+    __u32 unc_badblk_num;
+} r1_vendor_log_nandctl_count_t;
+
+typedef struct r1_wearlvl_vendor_log_count {
+    __u32 fbb_count;
+    __u32 ebb_count;
+    __u32 lbb_count;
+    __u32 gc_read_count;
+    __u32 gc_write_count;
+    __u32 gc_write_fail_count;
+    __u32 force_gc_count;
+    __u32 avg_pe_count;
+    __u32 max_pe_count;
+    __u32 free_blk_num1;
+    __u32 free_blk_num2;
+} r1_wearlvl_vendor_log_count_t;
+
+typedef struct vendor_media_err {
+    __u64 lba_err[10];
+} vendor_media_err_t;
+
+typedef struct r1_vendor_log_io_err {
+    __u32 io_guard_err;
+    __u32 io_apptag_err;
+    __u32 io_reftag_err;
+    __u32 io_dma_linkdown_err;
+    __u32 io_dma_disable_err;
+    __u32 io_dma_timeout_err;
+    __u32 io_dma_fatal_err;
+    __u32 io_write_fail_cout;
+    __u32 io_read_fail_cout;
+    __u32 lba_err[6];
+} r1_vendor_log_io_err_t;
+
+typedef struct r1_vendor_log_s {
+    __u32 max_power;
+    __u32 disk_max_temper;
+    __u32 disk_overtemper_cout;
+    __u32 ctrl_max_temper;
+    __u32 ctrl_overtemper_cout;
+    r1_cap_transtime_t cap_transtime;
+    __u32 cap_health_state;
+    __u32 device_state;
+    r1_vendor_log_io_err_t io_err[4];
+    union {
+        vendor_warning_str detail_warning_bit;
+        __u32 detail_warning[2];
+    };
+    union {
+        vendor_warning_str detail_warning_his_bit;
+        __u32 detail_warning_his[2];
+    };
+    __u32 ddr_bit_err_cout;
+    __u32 temp_throttle_per;
+    __u64 port0_fundamental_reset_cnt;
+    __u64 port0_hot_reset_cnt;
+    __u64 port0_func_reset_cnt;
+    __u64 port0_linkdown_cnt;
+    __u64 port0_ctrl_reset_cnt;
+    __u64 nand_bytes_written[4];
+    __u32 power_info;
+    __u32 voltage_info;
+    __u32 current_info;
+    __u32 current_temp[4];
+    __u32 nand_max_temper;
+    __u32 nand_overtemper_cout;
+    __u32 mcu_data_id;
+    __u8 commit_id[16];
+    __u32 ces_RcvErr_cnt;
+    __u32 ces_BadTlp_cnt;
+    __u32 ces_BadDllp_cnt;
+    __u32 ces_Rplyover_cnt;
+    __u32 ces_RplyTo_cnt;
+    __u32 ces_Hlo_cnt;
+    __u32 scan_db_err_cnt;
+    __u32 db_int_err_cnt;
+    __u8 rsvFE[56];
+    r1_vendor_log_nandctl_count_t vendor_log_nandctl_cnt[4];
+    __u32 temp_ctrl_limit_cnt;
+    __u32 temp_ctrl_stop_cnt;
+    __u8 rsvncm[216];
+    r1_wearlvl_vendor_log_count_t wearlvl_vendor_log_count[4];
+    __u8 rsvwlm[512 - sizeof(r1_wearlvl_vendor_log_count_t) * 4 % 512];
+    __u32 e2e_check_err_cnt1;
+    __u32 e2e_check_err_cnt2;
+    __u32 e2e_check_err_cnt3;
+    __u32 e2e_check_err_cnt4;
+    vendor_media_err_t media_err[4];
+    __u8 rsvlkm[176];
+} r1_cli_vendor_log_t;
+#pragma pack(pop)
+
+#endif // __INSPUR_UTILS_H__
index b3af39bb9c2a605013ab36a959950f040aa875ca..e6d9aaab6e77f867852d4b5a9f8bc0f976f8b15c 100644 (file)
@@ -23,5 +23,6 @@ sources += [
   'plugins/ymtc/ymtc-nvme.c',
   'plugins/zns/zns.c',
   'plugins/ocp/ocp-nvme.c',
+  'plugins/inspur/inspur-nvme.c',
 ]
 subdir('solidigm')