The branch main has been updated by imp:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=72170a4174e0ba50e349918667973a158a94ed8f

commit 72170a4174e0ba50e349918667973a158a94ed8f
Author:     Wanpeng Qian <wanpengq...@gmail.com>
AuthorDate: 2025-08-10 03:11:22 +0000
Commit:     Warner Losh <i...@freebsd.org>
CommitDate: 2025-08-10 04:11:09 +0000

    nvmecontrol: Add Micron Vendor Unique SMART logpage support
    
    Micron 9200 SSD has a 0xca logpage. It is different from other vendors
    this patch tested on 9200 SSD and works as expected.
    
    Product Datasheet can be found here:
    
https://www.micron.com/-/media/client/global/documents/products/data-sheet/ssd/9200_u_2_pcie_ssd.pdf
    
    Signed-off-by: Wanpeng Qian <wanpengq...@gmail.com>
    Reviewed by: imp
    Differential Revsion: https://reviews.freebsd.org/D33866
---
 sbin/nvmecontrol/modules/Makefile        |   5 +-
 sbin/nvmecontrol/modules/micron/Makefile |   6 ++
 sbin/nvmecontrol/modules/micron/micron.c | 129 +++++++++++++++++++++++++++++++
 sbin/nvmecontrol/nvmecontrol.8           |   7 +-
 4 files changed, 144 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/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 <wanpengq...@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

Reply via email to