From f381c3b0ff3fc60f4fc7f0fe5b5aa9ad70056880 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Thu, 20 Mar 2025 23:00:07 +0900 Subject: [PATCH 1/4] types: add performance attribute structures These for the performance characteristics feature: 1Ch. Signed-off-by: Tokunori Ikegami --- src/nvme/types.h | 72 ++++++++++++++++++++++++++++++++++++++++++++++++ src/nvme/util.h | 3 -- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/nvme/types.h b/src/nvme/types.h index f3afd7015..423ca21c8 100644 --- a/src/nvme/types.h +++ b/src/nvme/types.h @@ -21,6 +21,9 @@ * NVMe standard definitions */ +#define NVME_UUID_LEN 16 +#define NVME_UUID_LEN_STRING 37 /* 1b4e28ba-2fa1-11d2-883f-0016d3cca427 + \0 */ + /** * NVME_GET() - extract field from complex value * @value: The original value of a complex field @@ -5997,6 +6000,75 @@ enum nvme_apst_entry { NVME_APST_ENTRY_ITPT_MASK = 0xffffff, }; +/** + * struct nvme_std_perf_attr - Standard performance attribute structure + * @rsvd0: Reserved + * @r4karl: Random 4 KiB average read latency + * @rsvd5: Reserved + */ +struct nvme_std_perf_attr { + __u8 rsvd0[4]; + __u8 r4karl; + __u8 rsvd5[4091]; +}; + +/** + * struct nvme_perf_attr_id - Performance attribute identifier structure + * @id: Performance attribute identifier + */ +struct nvme_perf_attr_id { + __u8 id[NVME_UUID_LEN]; +}; + +/** + * struct nvme_perf_attr_id_list - Performance attribute identifier list structure + * @attrtyp: Bits 7-3: Reserved + * Bits 2-0: Attribute type + * @msvspa: Maximum saveable vendor specific performance attributes + * @usvspa: Unused saveable vendor specific performance attributes + * @rsvd3: Reserved + * @id_list: Performance attribute identifier list + * @rsvd1024: Reserved + */ +struct nvme_perf_attr_id_list { + __u8 attrtyp; + __u8 msvspa; + __u8 usvspa; + __u8 rsvd3[13]; + struct nvme_perf_attr_id id_list[63]; + __u8 rsvd1024[3072]; +}; + +/** + * struct nvme_vs_perf_attr - Vendor specific performance attribute structure + * @paid: Performance attribute identifier + * @rsvd16: Reserved + * @attrl: Attribute Length + * @vs: Vendor specific + */ +struct nvme_vs_perf_attr { + __u8 paid[16]; + __u8 rsvd16[14]; + __le16 attrl; + __u8 vs[4064]; +}; + +/** + * struct nvme_perf_characteristics - Performance attribute structure + * @std_perf: Standard performance attribute + * @id_list: Performance attribute identifier list + * @vs_perf: Vendor specific performance attribute + * @attr_buf: Attribute buffer + */ +struct nvme_perf_characteristics { + union { + struct nvme_std_perf_attr std_perf[0]; + struct nvme_perf_attr_id_list id_list[0]; + struct nvme_vs_perf_attr vs_perf[0]; + __u8 attr_buf[4096]; + }; +}; + /** * struct nvme_metadata_element_desc - Metadata Element Descriptor * @type: Element Type (ET) diff --git a/src/nvme/util.h b/src/nvme/util.h index ffbea7ff1..f4be664bf 100644 --- a/src/nvme/util.h +++ b/src/nvme/util.h @@ -646,9 +646,6 @@ enum nvme_version { */ const char *nvme_get_version(enum nvme_version type); -#define NVME_UUID_LEN_STRING 37 /* 1b4e28ba-2fa1-11d2-883f-0016d3cca427 + \0 */ -#define NVME_UUID_LEN 16 - /** * nvme_uuid_to_string - Return string represenation of encoded UUID * @uuid: Binary encoded input UUID From 8bb84079a3304e0ce3dd0b21c6b560b7ac80e549 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Fri, 21 Mar 2025 23:55:28 +0900 Subject: [PATCH 2/4] types: add performance characteristics feature access values The feature command dword 11 shifts and masks values. Signed-off-by: Tokunori Ikegami --- src/nvme/types.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/nvme/types.h b/src/nvme/types.h index 423ca21c8..19cda9a99 100644 --- a/src/nvme/types.h +++ b/src/nvme/types.h @@ -8894,6 +8894,10 @@ enum nvme_features_id { * @NVME_FEAT_SPINUP_CONTROL_MASK: * @NVME_FEAT_PLS_MODE_SHIFT: * @NVME_FEAT_PLS_MODE_MASK: + * @NVME_FEAT_PERFC_ATTRI_SHIFT: + * @NVME_FEAT_PERFC_ATTRI_MASK: + * @NVME_FEAT_PERFC_RVSPA_SHIFT: + * @NVME_FEAT_PERFC_RVSPA_MASK: * @NVME_FEAT_FDP_ENABLED_SHIFT: * @NVME_FEAT_FDP_ENABLED_MASK: * @NVME_FEAT_FDP_INDEX_SHIFT: @@ -9028,6 +9032,10 @@ enum nvme_feat { NVME_FEAT_SPINUP_CONTROL_MASK = 0x1, NVME_FEAT_PLS_MODE_SHIFT = 0, NVME_FEAT_PLS_MODE_MASK = 0x3, + NVME_FEAT_PERFC_ATTRI_SHIFT = 0, + NVME_FEAT_PERFC_ATTRI_MASK = 0xff, + NVME_FEAT_PERFC_RVSPA_SHIFT = 8, + NVME_FEAT_PERFC_RVSPA_MASK = 0x1, NVME_FEAT_FDP_ENABLED_SHIFT = 0, NVME_FEAT_FDP_ENABLED_MASK = 0x1, NVME_FEAT_FDP_INDEX_SHIFT = 8, From 95f55578bcb8fbc1f5d0754175cf68f557b334c2 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 22 Mar 2025 00:15:07 +0900 Subject: [PATCH 3/4] util: add performance characteristics feature decode function Decodes the feature command dword 11 fields values. Signed-off-by: Tokunori Ikegami --- src/nvme/util.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/nvme/util.h b/src/nvme/util.h index f4be664bf..60865fa03 100644 --- a/src/nvme/util.h +++ b/src/nvme/util.h @@ -448,6 +448,15 @@ static inline void nvme_feature_decode_endurance_group_event_config(__u32 value, *endgcw = NVME_FEAT_EG_EGCW(value); } +#define NVME_FEAT_PERFC_ATTRI(v) NVME_GET(v, FEAT_PERFC_ATTRI) +#define NVME_FEAT_PERFC_RVSPA(v) NVME_GET(v, FEAT_PERFC_RVSPA) + +static inline void nvme_feature_decode_perf_characteristics(__u32 value, __u8 *attri, bool *rvspa) +{ + *attri = NVME_FEAT_PERFC_ATTRI(value); + *rvspa = NVME_FEAT_PERFC_RVSPA(value); +} + #define NVME_FEAT_SPM_PBSLC(v) NVME_GET(v, FEAT_SPM_PBSLC) static inline void nvme_feature_decode_software_progress_marker(__u32 value, From 50471e0c6bc02ff49cd5f3ed38c2570d75914c33 Mon Sep 17 00:00:00 2001 From: Tokunori Ikegami Date: Sat, 22 Mar 2025 22:17:51 +0900 Subject: [PATCH 4/4] types: add performance characteristics attribute type values The attribute type shifts and masks values. Signed-off-by: Tokunori Ikegami --- src/nvme/types.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/nvme/types.h b/src/nvme/types.h index 19cda9a99..62da6c4d1 100644 --- a/src/nvme/types.h +++ b/src/nvme/types.h @@ -8898,6 +8898,8 @@ enum nvme_features_id { * @NVME_FEAT_PERFC_ATTRI_MASK: * @NVME_FEAT_PERFC_RVSPA_SHIFT: * @NVME_FEAT_PERFC_RVSPA_MASK: + * @NVME_FEAT_PERFC_ATTRTYP_SHIFT: + * @NVME_FEAT_PERFC_ATTRTYP_MASK: * @NVME_FEAT_FDP_ENABLED_SHIFT: * @NVME_FEAT_FDP_ENABLED_MASK: * @NVME_FEAT_FDP_INDEX_SHIFT: @@ -9036,6 +9038,8 @@ enum nvme_feat { NVME_FEAT_PERFC_ATTRI_MASK = 0xff, NVME_FEAT_PERFC_RVSPA_SHIFT = 8, NVME_FEAT_PERFC_RVSPA_MASK = 0x1, + NVME_FEAT_PERFC_ATTRTYP_SHIFT = 0, + NVME_FEAT_PERFC_ATTRTYP_MASK = 0x3, NVME_FEAT_FDP_ENABLED_SHIFT = 0, NVME_FEAT_FDP_ENABLED_MASK = 0x1, NVME_FEAT_FDP_INDEX_SHIFT = 8,