Index: sbin/nvmecontrol/modules/intel/intel.c =================================================================== --- sbin/nvmecontrol/modules/intel/intel.c +++ sbin/nvmecontrol/modules/intel/intel.c @@ -181,6 +181,96 @@ } } +static void +print_intel_max_lba(uint32_t cdw0, void *buf __unused, uint32_t len __unused) +{ + + printf(" Max LBA: %u\n", cdw0); +} + +static void +print_intel_native_max_lba(uint32_t cdw0, void *buf __unused, uint32_t len __unused) +{ + + printf(" Native Max LBA: %u\n", cdw0); +} + +static void +print_intel_power_governor_setting(uint32_t cdw0, void *buf __unused, uint32_t len __unused) +{ + uint8_t pg = cdw0 & 0xff; /* Power Governor */ + + printf(" Power Governor Setting (PGS): "); + switch (pg) { + case 0x00: + printf("25W(typ)\n"); + break; + case 0x01: + printf("20W(typ)\n"); + break; + case 0x02: + printf("10W(typ)\n"); + break; + default: + printf("%d\n", pg); + break; + } +} + +static void +interpret_intel_max_lba(uint8_t status) +{ + + switch (status) { + case 0xc0: + printf("Requested MAX LBA exceeds Available capacity\n"); + break; + case 0xc1: + printf("Requested MAX LBA smaller than minimum allowable limit\n"); + break; + case 0xc2: + printf("Requested MAX LBA is smaller than allocated Namespace requirements\n"); + break; + default: + printf("Unknown Status Code: %u\n", status); + break; + } +} + +static void +interpret_intel_power_governor_setting(uint8_t status) +{ + + switch (status) { + case 0xc0: + printf("Invalid Setting\n"); + break; + default: + printf("Unknown Status Code: %u\n", status); + break; + break; + } +} + +static void +interpret_intel_reset_timed_workload_counters(uint8_t status) +{ + + switch (status) { + case 0xc0: + printf("Invalid Setting\n"); + break; + default: + printf("Unknown Status Code: %u\n", status); + break; + } +} + +#define INTEL_FEAT_MAX_LBA 0xc1 +#define INTEL_FEAT_NATIVE_MAX_LBA 0xc2 +#define INTEL_FEAT_POWER_GOVERNOR_SETTING 0xc6 +#define INTEL_FEAT_RESET_TIMED_WORKLOAD_COUNTERS 0xd5 + NVME_LOGPAGE(intel_temp, INTEL_LOG_TEMP_STATS, "intel", "Temperature Stats", print_intel_temp_stats, sizeof(struct intel_log_temp_stats)); @@ -193,3 +283,15 @@ NVME_LOGPAGE(intel_smart, INTEL_LOG_ADD_SMART, "intel", "Extra Health/SMART Data", print_intel_add_smart, DEFAULT_SIZE); +NVME_FEATURE(intel_max_lba, + INTEL_FEAT_MAX_LBA, "intel", "Max LBA", + print_intel_max_lba, interpret_intel_max_lba, 0); +NVME_FEATURE(intel_native_max_lba, + INTEL_FEAT_NATIVE_MAX_LBA, "intel", "Native Max LBA", + print_intel_native_max_lba, NULL, 0); +NVME_FEATURE(intel_power_governor_setting, + INTEL_FEAT_POWER_GOVERNOR_SETTING, "intel", "Power Governor Setting", + print_intel_power_governor_setting, interpret_intel_power_governor_setting, 0); +NVME_FEATURE(intel_reset_timed_workload_counters, + INTEL_FEAT_RESET_TIMED_WORKLOAD_COUNTERS, "intel", "Reset Timed Workload Counters", + get_feature_not_support, interpret_intel_reset_timed_workload_counters, 0);