aboutsummaryrefslogtreecommitdiff
path: root/sbin/nvmecontrol
diff options
context:
space:
mode:
Diffstat (limited to 'sbin/nvmecontrol')
-rw-r--r--sbin/nvmecontrol/modules/Makefile5
-rw-r--r--sbin/nvmecontrol/modules/intel/intel.c15
-rw-r--r--sbin/nvmecontrol/modules/micron/Makefile6
-rw-r--r--sbin/nvmecontrol/modules/micron/micron.c129
-rw-r--r--sbin/nvmecontrol/nvmecontrol.87
5 files changed, 159 insertions, 3 deletions
diff --git a/sbin/nvmecontrol/modules/Makefile b/sbin/nvmecontrol/modules/Makefile
index 70d1ba40a1e2..f3c3572acb34 100644
--- a/sbin/nvmecontrol/modules/Makefile
+++ b/sbin/nvmecontrol/modules/Makefile
@@ -1,3 +1,6 @@
-SUBDIR= intel wdc samsung
+SUBDIR= intel
+SUBDIR+=micron
+SUBDIR+=samsung
+SUBDIR+=wdc
.include <bsd.subdir.mk>
diff --git a/sbin/nvmecontrol/modules/intel/intel.c b/sbin/nvmecontrol/modules/intel/intel.c
index 4229a48e4153..6ffe2c4c1563 100644
--- a/sbin/nvmecontrol/modules/intel/intel.c
+++ b/sbin/nvmecontrol/modules/intel/intel.c
@@ -195,6 +195,18 @@ print_intel_add_smart(const struct nvme_controller_data *cdata __unused, void *b
}
}
+static void
+print_intel_drive_marketing_name(const struct nvme_controller_data *cdata __unused, void *buf, uint32_t size __unused)
+{
+ const char *p = buf;
+
+ printf("Intel Drive Marketing Name Log\n");
+ printf("=======================\n");
+ printf("%.*s\n", 29, p);
+}
+
+#define INTEL_LOG_DRIVE_MARKETING_NAME 0xdd
+
NVME_LOGPAGE(intel_temp,
INTEL_LOG_TEMP_STATS, "intel", "Temperature Stats",
print_intel_temp_stats, sizeof(struct intel_log_temp_stats));
@@ -207,3 +219,6 @@ NVME_LOGPAGE(intel_wlat,
NVME_LOGPAGE(intel_smart, /* Note: Samsung and Micron also use this */
INTEL_LOG_ADD_SMART, "intel", "Extra Health/SMART Data",
print_intel_add_smart, DEFAULT_SIZE);
+NVME_LOGPAGE(intel_dmn,
+ INTEL_LOG_DRIVE_MARKETING_NAME, "intel", "Drive Marketing Name Log",
+ print_intel_drive_marketing_name, DEFAULT_SIZE);
diff --git a/sbin/nvmecontrol/modules/micron/Makefile b/sbin/nvmecontrol/modules/micron/Makefile
new file mode 100644
index 000000000000..3cefd455f711
--- /dev/null
+++ b/sbin/nvmecontrol/modules/micron/Makefile
@@ -0,0 +1,6 @@
+# $FreeBSD$
+
+LIB= micron
+SRCS= micron.c
+
+.include <bsd.lib.mk>
diff --git a/sbin/nvmecontrol/modules/micron/micron.c b/sbin/nvmecontrol/modules/micron/micron.c
new file mode 100644
index 000000000000..2d4731e7da47
--- /dev/null
+++ b/sbin/nvmecontrol/modules/micron/micron.c
@@ -0,0 +1,129 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2022 Wanpeng Qian <wanpengqian@gmail.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/ioccom.h>
+
+#include <ctype.h>
+#include <err.h>
+#include <fcntl.h>
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/endian.h>
+
+#include "nvmecontrol.h"
+
+static void
+print_micron_unique_smart(const struct nvme_controller_data *cdata __unused, void *buf, uint32_t size __unused)
+{
+ uint8_t *walker = buf;
+ uint8_t *end = walker + 150;
+ const char *name;
+ uint64_t raw;
+ uint8_t normalized;
+
+ static struct kv_name kv[] =
+ {
+ { 0xf9, "NAND Writes 1GiB" },
+ { 0xfa, "NAND Reads 1GiB" },
+ { 0xea, "Thermal Throttle Status" },
+ { 0xe7, "Temperature" },
+ { 0xe8, "Power Consumption" },
+ { 0xaf, "Power Loss Protection" },
+ };
+
+ printf("Vendor Unique SMART Information\n");
+ printf("=========================\n");
+ /*
+ * walker[0] = Key
+ * walker[1,2] = reserved
+ * walker[3] = Normalized Value
+ * walker[4] = reserved
+ * walker[5..10] = Little Endian Raw value
+ * (or other represenations)
+ * walker[11] = reserved
+ */
+ while (walker < end) {
+ name = kv_lookup(kv, nitems(kv), *walker);
+ normalized = walker[3];
+ raw = le48dec(walker + 5);
+ switch (*walker){
+ case 0:
+ break;
+ case 0xf9:
+ /* FALLTHOUGH */
+ case 0xfa:
+ printf("%2X %-24s: %ju GiB\n", *walker, name, (uintmax_t)raw);
+ break;
+ case 0xea:
+ printf("%2X %-24s:", *walker, name);
+ if (*(walker + 5) == 0)
+ printf(" inactive\n");
+ if (*(walker + 5) == 1)
+ printf(" active, total throttling time %u mins\n", le32dec(walker + 6));
+ break;
+ case 0xe7:
+ printf("%2X %-24s: max ", *walker, name);
+ print_temp_C(le16dec(walker + 5));
+ printf(" : min ");
+ print_temp_C(le16dec(walker + 7));
+ printf(" : cur ");
+ print_temp_C(le16dec(walker + 9));
+ break;
+ case 0xe8:
+ printf("%2X %-24s: max %u W, min %u W, ave %u W\n",
+ *walker, name, le16dec(walker + 5), le16dec(walker + 7), le16dec(walker + 9));
+ break;
+ case 0xaf:
+ printf("%2X %-24s:", *walker, name);
+ if (normalized == 100)
+ printf(" success");
+ if (normalized == 0)
+ printf(" failed");
+ printf(" %3d\n", normalized);
+ break;
+ default:
+ printf("%2X %-24s: %3d %ju\n",
+ *walker, name, normalized, (uintmax_t)raw);
+ break;
+ }
+ walker += 12;
+ }
+}
+
+#define MICRON_LOG_UNIQUE_SMART 0xca
+
+NVME_LOGPAGE(micron_smart,
+ MICRON_LOG_UNIQUE_SMART, "micron", "Vendor Unique SMART Information",
+ print_micron_unique_smart, DEFAULT_SIZE);
diff --git a/sbin/nvmecontrol/nvmecontrol.8 b/sbin/nvmecontrol/nvmecontrol.8
index 624a0c93719b..dc757bcf90c3 100644
--- a/sbin/nvmecontrol/nvmecontrol.8
+++ b/sbin/nvmecontrol/nvmecontrol.8
@@ -303,7 +303,8 @@ data associated with that drive.
.El
.Ss logpage
The logpage command knows how to print log pages of various types.
-It also knows about vendor specific log pages from hgst/wdc, samsung and intel.
+It also knows about vendor specific log pages from HGST/WDC, Samsung,
+Micron and Intel.
Note that some vendors use the same log page numbers for different data.
.Pp
.Bl -tag -compact -width "Page 0x00"
@@ -328,13 +329,15 @@ Advanced SMART information (WDC/HGST)
.It Dv Page 0xc1
Read latency stats (Intel)
.It Dv Page 0xc2
-Wite latency stats (Intel)
+Write latency stats (Intel)
.It Dv Page 0xc5
Temperature stats (Intel)
.It Dv Page 0xca
Advanced SMART information (Intel)
.It Dv Page 0xca
Extended SMART information (Samsung)
+.It Dv Page 0xca
+Vendor Unique SMART information (Micron)
.El
.Pp
Specifying