@@ -118,7 +118,7 @@ void AMDRyzenCPUPowerManagement::startWorkLoop() {
118
118
119
119
// Read PStateDef generated by EFI.
120
120
if (pmRyzen_cpu_is_master (cpu_num))
121
- provider->dumpPstate ();
121
+ provider->dumpPstate (nullptr );
122
122
123
123
124
124
if (!pmRyzen_cpu_primary_in_core (cpu_num)) return ;
@@ -374,12 +374,17 @@ IOReturn AMDRyzenCPUPowerManagement::setPowerState(unsigned long powerStateOrdin
374
374
if (0 == powerStateOrdinal) {
375
375
// Going to sleep
376
376
IOLog (" AMDCPUSupport::setPowerState preparing for sleep\n " );
377
- wentToSleep = true ;
377
+ sleepState.sleep = true ;
378
+ sleepState.cpb = getCPBState ();
379
+ dumpPstate (sleepState.pstate );
380
+
378
381
stopWorkLoop ();
379
- } else if (1 == powerStateOrdinal && wentToSleep ) {
382
+ } else if (1 == powerStateOrdinal && sleepState. sleep ) {
380
383
// Waking up
381
384
IOLog (" AMDCPUSupport::setPowerState preparing for wakeup\n " );
382
- wentToSleep = false ;
385
+ sleepState.sleep = false ;
386
+ setCPBState (sleepState.cpb );
387
+ writePstate (sleepState.pstate );
383
388
startWorkLoop ();
384
389
}
385
390
@@ -630,9 +635,8 @@ void AMDRyzenCPUPowerManagement::updatePackageEnergy(){
630
635
pwrLastTSC = rdtsc64 ();
631
636
}
632
637
633
- void AMDRyzenCPUPowerManagement::dumpPstate (){
638
+ void AMDRyzenCPUPowerManagement::dumpPstate (uint64_t buf[ 8 ] ){
634
639
635
- uint8_t len = 0 ;
636
640
for (uint32_t i = 0 ; i < kMSR_PSTATE_LEN ; i++) {
637
641
uint64_t msr_value_buf = 0 ;
638
642
bool err = !read_msr (kMSR_PSTATE_0 + i, &msr_value_buf);
@@ -651,17 +655,12 @@ void AMDRyzenCPUPowerManagement::dumpPstate(){
651
655
PStateDef_perCore[i] = msr_value_buf;
652
656
PStateDefClock_perCore[i] = clock;
653
657
654
- if (msr_value_buf & ((uint64_t )1 << 63 )) len++;
655
- // IOLog("a: %llu", msr_value_buf);
656
- }
657
-
658
- PStateEnabledLen = max (PStateEnabledLen, len);
658
+ if (buf != nullptr ) buf[i] = msr_value_buf;
659
+ };
659
660
}
660
661
661
662
void AMDRyzenCPUPowerManagement::writePstate (const uint64_t *buf){
662
663
663
- PStateEnabledLen = 0 ;
664
-
665
664
// A bit hacky but at least works for now.
666
665
void * args[] = {this , (void *)buf};
667
666
@@ -684,7 +683,7 @@ void AMDRyzenCPUPowerManagement::writePstate(const uint64_t *buf){
684
683
685
684
686
685
if (!pmRyzen_cpu_is_master (cpu_number ())) return ;
687
- provider->dumpPstate ();
686
+ provider->dumpPstate (nullptr );
688
687
689
688
}, nullptr , args);
690
689
0 commit comments