@@ -118,7 +118,7 @@ void AMDRyzenCPUPowerManagement::startWorkLoop() {
118118
119119 // Read PStateDef generated by EFI.
120120 if (pmRyzen_cpu_is_master (cpu_num))
121- provider->dumpPstate ();
121+ provider->dumpPstate (nullptr );
122122
123123
124124 if (!pmRyzen_cpu_primary_in_core (cpu_num)) return ;
@@ -381,12 +381,17 @@ IOReturn AMDRyzenCPUPowerManagement::setPowerState(unsigned long powerStateOrdin
381381 if (0 == powerStateOrdinal) {
382382 // Going to sleep
383383 IOLog (" AMDCPUSupport::setPowerState preparing for sleep\n " );
384- wentToSleep = true ;
384+ sleepState.sleep = true ;
385+ sleepState.cpb = getCPBState ();
386+ dumpPstate (sleepState.pstate );
387+
385388 stopWorkLoop ();
386- } else if (1 == powerStateOrdinal && wentToSleep ) {
389+ } else if (1 == powerStateOrdinal && sleepState. sleep ) {
387390 // Waking up
388391 IOLog (" AMDCPUSupport::setPowerState preparing for wakeup\n " );
389- wentToSleep = false ;
392+ sleepState.sleep = false ;
393+ setCPBState (sleepState.cpb );
394+ dumpPstate (sleepState.pstate );
390395 startWorkLoop ();
391396 }
392397
@@ -637,9 +642,8 @@ void AMDRyzenCPUPowerManagement::updatePackageEnergy(){
637642 pwrLastTSC = rdtsc64 ();
638643}
639644
640- void AMDRyzenCPUPowerManagement::dumpPstate (){
645+ void AMDRyzenCPUPowerManagement::dumpPstate (uint64_t buf[ 8 ] ){
641646
642- uint8_t len = 0 ;
643647 for (uint32_t i = 0 ; i < kMSR_PSTATE_LEN ; i++) {
644648 uint64_t msr_value_buf = 0 ;
645649 bool err = !read_msr (kMSR_PSTATE_0 + i, &msr_value_buf);
@@ -658,17 +662,12 @@ void AMDRyzenCPUPowerManagement::dumpPstate(){
658662 PStateDef_perCore[i] = msr_value_buf;
659663 PStateDefClock_perCore[i] = clock;
660664
661- if (msr_value_buf & ((uint64_t )1 << 63 )) len++;
662- // IOLog("a: %llu", msr_value_buf);
663- }
664-
665- PStateEnabledLen = max (PStateEnabledLen, len);
665+ if (buf != nullptr ) buf[i] = msr_value_buf;
666+ };
666667}
667668
668669void AMDRyzenCPUPowerManagement::writePstate (const uint64_t *buf){
669670
670- PStateEnabledLen = 0 ;
671-
672671 // A bit hacky but at least works for now.
673672 void * args[] = {this , (void *)buf};
674673
@@ -691,7 +690,7 @@ void AMDRyzenCPUPowerManagement::writePstate(const uint64_t *buf){
691690
692691
693692 if (!pmRyzen_cpu_is_master (cpu_number ())) return ;
694- provider->dumpPstate ();
693+ provider->dumpPstate (nullptr );
695694
696695 }, nullptr , args);
697696
0 commit comments