@@ -301,8 +301,114 @@ pub fn print_sensors(ec: &CrosEc) {
301
301
// Sensor 2: 00.00 X 00.00 Y 00.00 Z
302
302
}
303
303
304
+ pub fn print_expansion_bay_info ( ec : & CrosEc ) {
305
+ let platform = smbios:: get_platform ( ) ;
306
+ if !matches ! (
307
+ platform,
308
+ Some ( Platform :: Framework13Amd7080 ) | Some ( Platform :: Framework16Amd7080 )
309
+ ) {
310
+ println ! ( "Only applicable to Framework 16 and Framework AMD systems" ) ;
311
+ return ;
312
+ }
313
+
314
+ println ! ( "AMD" ) ;
315
+ // TODO: This is also on Azalea?
316
+ let power_slider = ec. read_memory ( 0x151 , 0x02 ) . unwrap ( ) [ 0 ] ;
317
+ let dc_ac = if power_slider <= 0b1000 { "DC" } else { "AC" } ;
318
+ let mode = match power_slider {
319
+ 0b0000_0001 | 0b0001_0000 => "Best Performance" ,
320
+ 0b0000_0010 | 0b0010_0000 => "Balanced" ,
321
+ 0b0000_0100 | 0b0100_0000 => "Best Power Efficiency" ,
322
+ 0b0000_1000 => "Battery Saver" ,
323
+ _ => "Unknown Mode" ,
324
+ } ;
325
+ println ! (
326
+ " Power Slider: {}, {} ({:#09b})" ,
327
+ dc_ac, mode, power_slider
328
+ ) ;
329
+
330
+ // TODO: This is also on Azalea?
331
+ let stt_table = ec. read_memory ( 0x154 , 0x01 ) . unwrap ( ) [ 0 ] ;
332
+ println ! ( " STT Table: {:?}" , stt_table) ;
333
+
334
+ // TODO: What's this? Always [0x00, 0x00] so far
335
+ // TODO: This is also on Azalea?
336
+ // Core Performance Boost
337
+ let cbp = ec. read_memory ( 0x155 , 0x02 ) . unwrap ( ) ;
338
+ println ! ( " CBP: {} ({:?})" , cbp == [ 0x00 , 0x00 ] , cbp) ;
339
+
340
+ // TODO: When is this changed?
341
+ // TODO: This is also on Azalea?
342
+ let dtt_temp = ec. read_memory ( 0x160 , 0x0F ) . unwrap ( ) ;
343
+ println ! ( " DTT Temp: {:?}" , dtt_temp) ;
344
+
345
+ if !matches ! ( platform, Some ( Platform :: Framework16Amd7080 ) ) {
346
+ return ;
347
+ }
348
+
349
+ println ! ( "Expansion Bay" ) ;
350
+
351
+ // TODO: This is the serial struct in the Expansion Bay?
352
+ let serial_struct = ec. read_memory ( 0x140 , 0x04 ) . unwrap ( ) ;
353
+ println ! ( " Serial Struct: {:?}" , serial_struct) ;
354
+
355
+ // TODO: Why is this in the same namespace?
356
+ // let batt_manuf_day = ec.read_memory(0x144, 0x01).unwrap()[0];
357
+ // let batt_manuf_month = ec.read_memory(0x145, 0x01).unwrap()[0];
358
+ // let batt_manuf_year = ec.read_memory(0x146, 0x02).unwrap();
359
+ // let batt_manuf_year = u16::from_le_bytes([batt_manuf_year[0], batt_manuf_year[1]]);
360
+ // println!(" Batt Manuf {:?}-{:?}-{:?}", batt_manuf_year, batt_manuf_month, batt_manuf_day);
361
+
362
+ // TODO: This is the PD in the dGPU module?
363
+ let pd_ver = ec. read_memory ( 0x14C , 0x04 ) . unwrap ( ) ;
364
+ println ! ( " PD Version: {:?}" , pd_ver) ;
365
+
366
+ let gpu_ctrl = ec. read_memory ( 0x150 , 0x01 ) . unwrap ( ) [ 0 ] ;
367
+ // Unused, this is for the BIOS to set
368
+ let _set_mux_status = match gpu_ctrl & 0b11 {
369
+ 0b00 => "EC Received and Clear" ,
370
+ 0b01 => "BIOS Set APU" ,
371
+ 0b10 => "BIOS Set GPU" ,
372
+ _ => "Unknown" ,
373
+ } ;
374
+ let mux_status = if ( gpu_ctrl & 0b100 ) > 0 { "APU" } else { "GPU" } ;
375
+ let board_status = if ( gpu_ctrl & 0b1000 ) > 0 {
376
+ "Present"
377
+ } else {
378
+ "Absent"
379
+ } ;
380
+ // Unused, set by BIOS: (gpu_ctrl & 0b10000)
381
+ let pcie_config = match gpu_ctrl & 0b01100000 {
382
+ 0b00 => "8x1" ,
383
+ 0b01 => "4x1" ,
384
+ 0b10 => "4x2" ,
385
+ 0b11 => "Disabled" ,
386
+ _ => "Unknown" ,
387
+ } ;
388
+ println ! ( " GPU CTRL: {:#x}" , gpu_ctrl) ;
389
+ println ! ( " MUX Status: {}" , mux_status) ;
390
+ println ! ( " Board Status: {}" , board_status) ;
391
+ println ! ( " PCIe Config: {}" , pcie_config) ;
392
+
393
+ // TODO: This seems like it's not correctly working? It's always false
394
+ let display_on = ec. read_memory ( 0x153 , 0x01 ) . unwrap ( ) [ 0 ] ;
395
+ println ! ( " Display On: {:?}" , display_on == 0x01 ) ;
396
+
397
+ let gpu_type = ec. read_memory ( 0x157 , 0x01 ) . unwrap ( ) [ 0 ] ;
398
+ let gpu_name = match gpu_type {
399
+ 0x00 => "Initializing" ,
400
+ 0x01 => "Fan Only" ,
401
+ 0x02 => "AMD R23M" ,
402
+ 0x03 => "SSD" ,
403
+ 0x04 => "PCIe Accessory" ,
404
+ _ => "Unknown" ,
405
+ } ;
406
+ println ! ( " GPU Type: {} ({:?})" , gpu_name, gpu_type) ;
407
+ }
408
+
304
409
pub fn print_thermal ( ec : & CrosEc ) {
305
410
let temps = ec. read_memory ( EC_MEMMAP_TEMP_SENSOR , 0x0F ) . unwrap ( ) ;
411
+ println ! ( "Temps: {:?}" , temps) ;
306
412
let fans = ec. read_memory ( EC_MEMMAP_FAN , 0x08 ) . unwrap ( ) ;
307
413
308
414
let platform = smbios:: get_platform ( ) ;
@@ -346,6 +452,8 @@ pub fn print_thermal(ec: &CrosEc) {
346
452
println ! ( " F75303_CPU: {:>4}" , TempSensor :: from( temps[ 1 ] ) ) ;
347
453
println ! ( " F75303_DDR: {:>4}" , TempSensor :: from( temps[ 2 ] ) ) ;
348
454
println ! ( " APU: {:>4}" , TempSensor :: from( temps[ 3 ] ) ) ;
455
+ // TODO: Only display if dGPU is present
456
+ // TODO: Sometimes these show 0 even if the GPU is present. Why?
349
457
if matches ! ( platform, Some ( Platform :: Framework16Amd7080 ) ) {
350
458
println ! ( " dGPU VR: {:>4}" , TempSensor :: from( temps[ 4 ] ) ) ;
351
459
println ! ( " dGPU VRAM: {:>4}" , TempSensor :: from( temps[ 5 ] ) ) ;
@@ -374,7 +482,13 @@ pub fn print_thermal(ec: &CrosEc) {
374
482
}
375
483
376
484
let fan0 = u16:: from_le_bytes ( [ fans[ 0 ] , fans[ 1 ] ] ) ;
377
- println ! ( " Fan Speed: {:>4} RPM" , fan0) ;
485
+ let fan1 = u16:: from_le_bytes ( [ fans[ 2 ] , fans[ 3 ] ] ) ;
486
+ if matches ! ( platform, Some ( Platform :: Framework16Amd7080 ) ) {
487
+ println ! ( " Fan L Speed: {:>4} RPM" , fan0) ;
488
+ println ! ( " Fan R Speed: {:>4} RPM" , fan1) ;
489
+ } else {
490
+ println ! ( " Fan Speed: {:>4} RPM" , fan0) ;
491
+ }
378
492
}
379
493
380
494
// TODO: Use Result
0 commit comments