@@ -136,7 +136,7 @@ static void json_fw_activation_history(const struct fw_activation_history *fw_hi
136136 printf ("\n" );
137137}
138138
139- static void json_smart_extended_log (void * data )
139+ static void json_smart_extended_log_v1 (void * data )
140140{
141141 struct json_object * root ;
142142 struct json_object * pmuw ;
@@ -248,6 +248,129 @@ static void json_smart_extended_log(void *data)
248248 json_free_object (root );
249249}
250250
251+ static void json_smart_extended_log_v2 (void * data )
252+ {
253+ struct json_object * root ;
254+ struct json_object * pmuw ;
255+ struct json_object * pmur ;
256+ uint16_t smart_log_ver = 0 ;
257+ __u8 * log_data = data ;
258+ char guid [40 ];
259+
260+ root = json_create_object ();
261+ pmuw = json_create_object ();
262+ pmur = json_create_object ();
263+
264+ json_object_add_value_uint64 (pmuw , "hi" ,
265+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_PMUW + 8 ] & 0xFFFFFFFFFFFFFFFF ));
266+ json_object_add_value_uint64 (pmuw , "lo" ,
267+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_PMUW ] & 0xFFFFFFFFFFFFFFFF ));
268+ json_object_add_value_object (root , "physical_media_units_written" , pmuw );
269+ json_object_add_value_uint64 (pmur , "hi" ,
270+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_PMUR + 8 ] & 0xFFFFFFFFFFFFFFFF ));
271+ json_object_add_value_uint64 (pmur , "lo" ,
272+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_PMUR ] & 0xFFFFFFFFFFFFFFFF ));
273+ json_object_add_value_object (root , "physical_media_units_read" , pmur );
274+ json_object_add_value_uint64 (root , "bad_user_nand_blocks_raw" ,
275+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_BUNBR ] & 0x0000FFFFFFFFFFFF ));
276+ json_object_add_value_uint (root , "bad_user_nand_blocks_normalized" ,
277+ (uint16_t )le16_to_cpu (* (uint16_t * )& log_data [SCAO_BUNBN ]));
278+ json_object_add_value_uint64 (root , "bad_system_nand_blocks_raw" ,
279+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_BSNBR ] & 0x0000FFFFFFFFFFFF ));
280+ json_object_add_value_uint (root , "bad_system_nand_blocks_normalized" ,
281+ (uint16_t )le16_to_cpu (* (uint16_t * )& log_data [SCAO_BSNBN ]));
282+ json_object_add_value_uint64 (root , "xor_recovery_count" ,
283+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_XRC ]));
284+ json_object_add_value_uint64 (root , "uncorrectable_read_errors" ,
285+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_UREC ]));
286+ json_object_add_value_uint64 (root , "soft_ecc_error_count" ,
287+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_SEEC ]));
288+ json_object_add_value_uint (root , "end_to_end_detected_errors" ,
289+ (uint32_t )le32_to_cpu (* (uint32_t * )& log_data [SCAO_EEDC ]));
290+ json_object_add_value_uint (root , "end_to_end_corrected_errors" ,
291+ (uint32_t )le32_to_cpu (* (uint32_t * )& log_data [SCAO_EECE ]));
292+ json_object_add_value_uint (root , "system_data_percent_used" ,
293+ (__u8 )log_data [SCAO_SDPU ]);
294+ json_object_add_value_uint64 (root , "refresh_count" ,
295+ (uint64_t )(le64_to_cpu (* (uint64_t * )& log_data [SCAO_RFSC ]) & 0x00FFFFFFFFFFFFFF ));
296+ json_object_add_value_uint (root , "max_user_data_erase_count" ,
297+ (uint32_t )le32_to_cpu (* (uint32_t * )& log_data [SCAO_MXUDEC ]));
298+ json_object_add_value_uint (root , "min_user_data_erase_count" ,
299+ (uint32_t )le32_to_cpu (* (uint32_t * )& log_data [SCAO_MNUDEC ]));
300+ json_object_add_value_uint (root , "thermal_throttling_events" ,
301+ (__u8 )log_data [SCAO_NTTE ]);
302+ json_object_add_value_uint (root , "current_throttling_status" ,
303+ (__u8 )log_data [SCAO_CTS ]);
304+ json_object_add_value_uint64 (root , "pcie_correctable_errors" ,
305+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_PCEC ]));
306+ json_object_add_value_uint (root , "incomplete_shutdowns" ,
307+ (uint32_t )le32_to_cpu (* (uint32_t * )& log_data [SCAO_ICS ]));
308+ json_object_add_value_uint (root , "percent_free_blocks" ,
309+ (__u8 )log_data [SCAO_PFB ]);
310+ json_object_add_value_uint (root , "capacitor_health" ,
311+ (uint16_t )le16_to_cpu (* (uint16_t * )& log_data [SCAO_CPH ]));
312+ json_object_add_value_uint64 (root , "unaligned_io" ,
313+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_UIO ]));
314+ json_object_add_value_uint64 (root , "security_version_number" ,
315+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_SVN ]));
316+ json_object_add_value_uint64 (root , "nuse_namespace_utilization" ,
317+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_NUSE ]));
318+ json_object_add_value_uint128 (root , "plp_start_count" ,
319+ le128_to_cpu (& log_data [SCAO_PSC ]));
320+ json_object_add_value_uint128 (root , "endurance_estimate" ,
321+ le128_to_cpu (& log_data [SCAO_EEST ]));
322+ smart_log_ver = (uint16_t )le16_to_cpu (* (uint16_t * )& log_data [SCAO_LPV ]);
323+
324+ json_object_add_value_uint (root , "log_page_version" , smart_log_ver );
325+
326+ memset ((void * )guid , 0 , 40 );
327+ sprintf ((char * )guid , "0x%" PRIx64 "%" PRIx64 "" ,
328+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_LPG + 8 ]),
329+ (uint64_t )le64_to_cpu (* (uint64_t * )& log_data [SCAO_LPG ]));
330+ json_object_add_value_string (root , "log_page_guid" , guid );
331+
332+ switch (smart_log_ver ) {
333+ case 0 ... 1 :
334+ break ;
335+ default :
336+ case 4 :
337+ json_object_add_value_uint (root , "nvme_command_set_errata_version" ,
338+ (__u8 )log_data [SCAO_NCSEV ]);
339+ json_object_add_value_uint (root , "lowest_permitted_firmware_revision" ,
340+ le64_to_cpu (* (uint64_t * )& log_data [SCAO_PSCC ]));
341+ fallthrough ;
342+ case 2 ... 3 :
343+ json_object_add_value_uint (root , "errata_version_field" ,
344+ (__u8 )log_data [SCAO_EVF ]);
345+ json_object_add_value_uint (root , "point_version_field" ,
346+ le16_to_cpu (* (uint16_t * )& log_data [SCAO_PVF ]));
347+ json_object_add_value_uint (root , "minor_version_field" ,
348+ le16_to_cpu (* (uint16_t * )& log_data [SCAO_MIVF ]));
349+ json_object_add_value_uint (root , "major_version_field" ,
350+ (__u8 )log_data [SCAO_MAVF ]);
351+ json_object_add_value_uint (root , "nvme_base_errata_version" ,
352+ (__u8 )log_data [SCAO_NBEV ]);
353+ json_object_add_value_uint (root , "pcie_link_retraining_count" ,
354+ le64_to_cpu (* (uint64_t * )& log_data [SCAO_PLRC ]));
355+ json_object_add_value_uint (root , "power_state_change_count" ,
356+ le64_to_cpu (* (uint64_t * )& log_data [SCAO_PSCC ]));
357+ }
358+ json_print_object (root , NULL );
359+ printf ("\n" );
360+ json_free_object (root );
361+ }
362+
363+ static void json_smart_extended_log (void * data , unsigned int version )
364+ {
365+ switch (version ) {
366+ default :
367+ case 1 :
368+ json_smart_extended_log_v1 (data );
369+ break ;
370+ case 2 :
371+ json_smart_extended_log_v2 (data );
372+ }
373+ }
251374static void json_telemetry_log (struct ocp_telemetry_parse_options * options )
252375{
253376 print_ocp_telemetry_json (options );
0 commit comments