From df1df331a073f496f8192d8c816a918e65ff0253 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 8 Aug 2026 12:51:29 +0900 Subject: [PATCH 1/4] nvme-print-stdout: use libnvme TMPTHH print getter Replace open coded field decoding. Signed-off-by: Tokunori Ikegami --- src/nvme-print-stdout.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nvme-print-stdout.c b/src/nvme-print-stdout.c index 933a90f58e..b3a9acabf2 100644 --- a/src/nvme-print-stdout.c +++ b/src/nvme-print-stdout.c @@ -5401,7 +5401,7 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, stdout_lba_range((struct nvme_lba_range_type *)buf, field); break; case NVME_FEAT_FID_TEMP_THRESH: - field = (result & 0x1c00000) >> 22; + field = NVME_FEAT_TT_TMPTHH(result); printf("\tTemperature Threshold Hysteresis(TMPTHH): %s (%u K, %s)\n", nvme_degrees_string(field), field, nvme_degrees_fahrenheit_string(field)); field = NVME_FEAT_TT_THSEL(result); From 4c3dcf88147862c200cd149b9a8bf28055445099 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 8 Aug 2026 12:55:03 +0900 Subject: [PATCH 2/4] nvme-types-base: fix FDPCIDX mask value Since actually the field described as 8 bits value by the spec. Signed-off-by: Tokunori Ikegami --- libnvme/src/nvme/nvme-types-base.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libnvme/src/nvme/nvme-types-base.h b/libnvme/src/nvme/nvme-types-base.h index 577b164907..94bb9a8e46 100644 --- a/libnvme/src/nvme/nvme-types-base.h +++ b/libnvme/src/nvme/nvme-types-base.h @@ -7817,7 +7817,7 @@ enum nvme_feat { NVME_FEAT_FDP_ENABLED_SHIFT = 0, NVME_FEAT_FDP_ENABLED_MASK = 0x1, NVME_FEAT_FDP_INDEX_SHIFT = 8, - NVME_FEAT_FDP_INDEX_MASK = 0xf, + NVME_FEAT_FDP_INDEX_MASK = 0xff, NVME_FEAT_FDP_EVENTS_ENABLE_SHIFT = 0, NVME_FEAT_FDP_EVENTS_ENABLE_MASK = 0x1, NVME_FEAT_HOST_ID_EXHID_SHIFT = 0, From ba64a4298797532557626854d2d31ac88209e738 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 8 Aug 2026 13:01:23 +0900 Subject: [PATCH 3/4] nvme-print-stdout: use libnvme FDP feature print getters Replace open coded field decoding. Signed-off-by: Tokunori Ikegami --- libnvme/src/nvme/nvme-types-base.h | 3 +++ src/nvme-print-stdout.c | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/libnvme/src/nvme/nvme-types-base.h b/libnvme/src/nvme/nvme-types-base.h index 94bb9a8e46..c94316dd90 100644 --- a/libnvme/src/nvme/nvme-types-base.h +++ b/libnvme/src/nvme/nvme-types-base.h @@ -9178,6 +9178,9 @@ nvme_feature_decode_perf_characteristics(__u32 value, __u8 *attri, bool *rvspa) *rvspa = NVME_FEAT_PERFC_RVSPA(value); } +#define NVME_FEAT_FDPE(v) NVME_GET(v, FEAT_FDP_ENABLED) +#define NVME_FEAT_FDPCIDX(v) NVME_GET(v, FEAT_FDP_INDEX) + #define NVME_FEAT_HOST_ID_EXHID(v) NVME_GET(v, FEAT_HOST_ID_EXHID) static inline void diff --git a/src/nvme-print-stdout.c b/src/nvme-print-stdout.c index b3a9acabf2..e2b91609c4 100644 --- a/src/nvme-print-stdout.c +++ b/src/nvme-print-stdout.c @@ -5603,9 +5603,9 @@ static void stdout_feature_show_fields(enum nvme_features_id fid, break; case NVME_FEAT_FID_FDP: printf("\tFlexible Direct Placement Enable (FDPE) : %s\n", - (result & 0x1) ? "Yes" : "No"); + NVME_FEAT_FDPE(result) ? "Yes" : "No"); printf("\tFlexible Direct Placement Configuration Index : %u\n", - (result >> 8) & 0xf); + NVME_FEAT_FDPCIDX(result)); break; case NVME_FEAT_FID_FDP_EVENTS: for (unsigned int i = 0; i < result; i++) { From 52cf19cf7e0c9248d1e3c38a2ea1768d2387a671 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 8 Aug 2026 13:43:04 +0900 Subject: [PATCH 4/4] nvme-print-stdout: use libnvme LBA range type feature print getters Replace open coded field decoding. Signed-off-by: Tokunori Ikegami --- libnvme/src/nvme/nvme-types-base.h | 27 +++++++++++++++++++-------- src/nvme-print-stdout.c | 23 +++++++++++++---------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/libnvme/src/nvme/nvme-types-base.h b/libnvme/src/nvme/nvme-types-base.h index c94316dd90..f2504c7e0f 100644 --- a/libnvme/src/nvme/nvme-types-base.h +++ b/libnvme/src/nvme/nvme-types-base.h @@ -6051,18 +6051,29 @@ struct nvme_lba_range_type_entry { * @NVME_LBART_TYPE_RAID: RAID * @NVME_LBART_TYPE_CACHE: Cache * @NVME_LBART_TYPE_SWAP: Page / swap file + * @NVME_LBART_ATTRB_LBARO_SHIFT: LBA range overwriteable shift + * @NVME_LBART_ATTRB_HLBAR_SHIFT: Hide LBA range shift + * @NVME_LBART_ATTRB_LBARO_MASK: LBA range overwriteable mask + * @NVME_LBART_ATTRB_HLBAR_MASK: Hide LBA range mask * @NVME_LBART_ATTRIB_TEMP: Temp * @NVME_LBART_ATTRIB_HIDE: Hidden */ enum nvme_lbart { - NVME_LBART_TYPE_GP = 0, - NVME_LBART_TYPE_FS = 1, - NVME_LBART_TYPE_RAID = 2, - NVME_LBART_TYPE_CACHE = 3, - NVME_LBART_TYPE_SWAP = 4, - NVME_LBART_ATTRIB_TEMP = 1 << 0, - NVME_LBART_ATTRIB_HIDE = 1 << 1, -}; + NVME_LBART_TYPE_GP = 0, + NVME_LBART_TYPE_FS = 1, + NVME_LBART_TYPE_RAID = 2, + NVME_LBART_TYPE_CACHE = 3, + NVME_LBART_TYPE_SWAP = 0, + NVME_LBART_ATTRB_LBARO_SHIFT = 0, + NVME_LBART_ATTRB_HLBAR_SHIFT = 1, + NVME_LBART_ATTRB_LBARO_MASK = 0x1, + NVME_LBART_ATTRB_HLBAR_MASK = 0x1, + NVME_LBART_ATTRIB_TEMP = NVME_VAL(LBART_ATTRB_LBARO), + NVME_LBART_ATTRIB_HIDE = NVME_VAL(LBART_ATTRB_HLBAR), +}; + +#define NVME_LBART_ATTRB_LBARO(attrb) NVME_GET(attrb, LBART_ATTRB_LBARO) +#define NVME_LBART_ATTRB_HLBAR(attrb) NVME_GET(attrb, LBART_ATTRB_HLBAR) /** * struct nvme_lba_range_type - LBA Range Type diff --git a/src/nvme-print-stdout.c b/src/nvme-print-stdout.c index e2b91609c4..cd71a544a0 100644 --- a/src/nvme-print-stdout.c +++ b/src/nvme-print-stdout.c @@ -5018,16 +5018,19 @@ static void stdout_lba_range(struct nvme_lba_range_type *lbrt, int nr_ranges) for (i = 0; i <= nr_ranges; i++) { printf("\ttype : %#x - %s\n", lbrt->entry[i].type, - nvme_feature_lba_type_to_string(lbrt->entry[i].type)); - printf("\tattributes : %#x - %s, %s\n", lbrt->entry[i].attributes, - (lbrt->entry[i].attributes & 0x0001) ? - "LBA range may be overwritten" : - "LBA range should not be overwritten", - ((lbrt->entry[i].attributes & 0x0002) >> 1) ? - "LBA range should be hidden from the OS/EFI/BIOS" : - "LBA range should be visible from the OS/EFI/BIOS"); - printf("\tslba : %#"PRIx64"\n", le64_to_cpu(lbrt->entry[i].slba)); - printf("\tnlb : %#"PRIx64"\n", le64_to_cpu(lbrt->entry[i].nlb)); + nvme_feature_lba_type_to_string(lbrt->entry[i].type)); + printf("\tattributes : %#x - %s, %s\n", + lbrt->entry[i].attributes, + NVME_LBART_ATTRB_LBARO(lbrt->entry[i].attributes) ? + "LBA range may be overwritten" : + "LBA range should not be overwritten", + NVME_LBART_ATTRB_HLBAR(lbrt->entry[i].attributes) ? + "LBA range should be hidden from the OS/EFI/BIOS" : + "LBA range should be visible from the OS/EFI/BIOS"); + printf("\tslba : %#"PRIx64"\n", + le64_to_cpu(lbrt->entry[i].slba)); + printf("\tnlb : %#"PRIx64"\n", + le64_to_cpu(lbrt->entry[i].nlb)); printf("\tguid : "); for (j = 0; j < ARRAY_SIZE(lbrt->entry[i].guid); j++) printf("%02x", lbrt->entry[i].guid[j]);