@@ -2507,6 +2507,79 @@ static void dmi_memory_device_speed(u16 code)
2507
2507
printf (" %u MT/s" , code );
2508
2508
}
2509
2509
2510
+ static void dmi_memory_technology (u8 code )
2511
+ {
2512
+ /* 7.18.6 */
2513
+ static const char * const technology [] = {
2514
+ "Other" , /* 0x01 */
2515
+ "Unknown" ,
2516
+ "DRAM" ,
2517
+ "NVDIMM-N" ,
2518
+ "NVDIMM-F" ,
2519
+ "NVDIMM-P" ,
2520
+ "Intel persistent memory" /* 0x07 */
2521
+ };
2522
+ if (code >= 0x01 && code <= 0x07 )
2523
+ printf (" %s" , technology [code - 0x01 ]);
2524
+ else
2525
+ printf (" %s" , out_of_spec );
2526
+ }
2527
+
2528
+ static void dmi_memory_operating_mode_capability (u16 code )
2529
+ {
2530
+ /* 7.18.7 */
2531
+ static const char * const mode [] = {
2532
+ "Other" , /* 1 */
2533
+ "Unknown" ,
2534
+ "Volatile memory" ,
2535
+ "Byte-accessible persistent memory" ,
2536
+ "Block-accessible persistent memory" /* 5 */
2537
+ };
2538
+
2539
+ if ((code & 0xFFFE ) == 0 )
2540
+ printf (" None" );
2541
+ else {
2542
+ int i ;
2543
+
2544
+ for (i = 1 ; i <= 5 ; i ++ )
2545
+ if (code & (1 << i ))
2546
+ printf (" %s" , mode [i - 1 ]);
2547
+ }
2548
+ }
2549
+
2550
+ static void dmi_memory_manufacturer_id (u16 code )
2551
+ {
2552
+ /* 7.18.8 */
2553
+ /* 7.18.10 */
2554
+ /* LSB is 7-bit Odd Parity number of continuation codes */
2555
+ if (code == 0 )
2556
+ printf (" Unknown" );
2557
+ else
2558
+ printf (" Bank %d, Hex 0x%02X" , (code & 0x7F ) + 1 , code >> 8 );
2559
+ }
2560
+
2561
+ static void dmi_memory_product_id (u16 code )
2562
+ {
2563
+ /* 7.18.9 */
2564
+ /* 7.18.11 */
2565
+ if (code == 0 )
2566
+ printf (" Unknown" );
2567
+ else
2568
+ printf (" 0x%04X" , code );
2569
+ }
2570
+
2571
+ static void dmi_memory_size (u64 code )
2572
+ {
2573
+ /* 7.18.12 */
2574
+ /* 7.18.13 */
2575
+ if (code .h == 0xFFFFFFFF && code .l == 0xFFFFFFFF )
2576
+ printf (" Unknown" );
2577
+ else if (code .h == 0x0 && code .l == 0x0 )
2578
+ printf (" None" );
2579
+ else
2580
+ dmi_print_memory_size (code , 0 );
2581
+ }
2582
+
2510
2583
/*
2511
2584
* 7.19 32-bit Memory Error Information (Type 18)
2512
2585
*/
@@ -3907,6 +3980,43 @@ static void dmi_decode(const struct dmi_header *h, u16 ver)
3907
3980
printf ("\tConfigured Voltage:" );
3908
3981
dmi_memory_voltage_value (WORD (data + 0x26 ));
3909
3982
printf ("\n" );
3983
+ if (h -> length < 0x34 ) break ;
3984
+ printf ("\tMemory Technology:" );
3985
+ dmi_memory_technology (data [0x28 ]);
3986
+ printf ("\n" );
3987
+ printf ("\tMemory Operating Mode Capability:" );
3988
+ dmi_memory_operating_mode_capability (WORD (data + 0x29 ));
3989
+ printf ("\n" );
3990
+ printf ("\tFirmware Version: %s\n" ,
3991
+ dmi_string (h , data [0x2B ]));
3992
+ printf ("\tModule Manufacturer ID:" );
3993
+ dmi_memory_manufacturer_id (WORD (data + 0x2C ));
3994
+ printf ("\n" );
3995
+ printf ("\tModule Product ID:" );
3996
+ dmi_memory_product_id (WORD (data + 0x2E ));
3997
+ printf ("\n" );
3998
+ printf ("\tMemory Subsystem Controller Manufacturer ID:" );
3999
+ dmi_memory_manufacturer_id (WORD (data + 0x30 ));
4000
+ printf ("\n" );
4001
+ printf ("\tMemory Subsystem Controller Product ID:" );
4002
+ dmi_memory_product_id (WORD (data + 0x32 ));
4003
+ printf ("\n" );
4004
+ if (h -> length < 0x3C ) break ;
4005
+ printf ("\tNon-Volatile Size:" );
4006
+ dmi_memory_size (QWORD (data + 0x34 ));
4007
+ printf ("\n" );
4008
+ if (h -> length < 0x44 ) break ;
4009
+ printf ("\tVolatile Size:" );
4010
+ dmi_memory_size (QWORD (data + 0x3C ));
4011
+ printf ("\n" );
4012
+ if (h -> length < 0x4C ) break ;
4013
+ printf ("\tCache Size:" );
4014
+ dmi_memory_size (QWORD (data + 0x44 ));
4015
+ printf ("\n" );
4016
+ if (h -> length < 0x54 ) break ;
4017
+ printf ("\tLogical Size:" );
4018
+ dmi_memory_size (QWORD (data + 0x4C ));
4019
+ printf ("\n" );
3910
4020
break ;
3911
4021
3912
4022
case 18 : /* 7.19 32-bit Memory Error Information */
0 commit comments