@@ -39,20 +39,20 @@ bool AMDRyzenCPUPowerManagement::init(OSDictionary *dictionary){
39
39
IOLog (" AMDCPUSupport v%s, init\n " , xStringify (MODULE_VERSION));
40
40
41
41
IOLog (" AMDCPUSupport::enter dlinking..\n " );
42
-
42
+
43
43
pmRyzen_symtable_ready = 0 ;
44
-
44
+
45
45
retry:
46
46
find_mach_header_addr (getKernelVersion () >= KernelVersion::BigSur);
47
47
pmRyzen_symtable._wrmsr_carefully = lookup_symbol (" _wrmsr_carefully" );
48
-
48
+
49
49
if (!pmRyzen_symtable._wrmsr_carefully ){
50
50
kextloadAlerts++;
51
51
IOSleep (2 );
52
52
goto retry;
53
53
}
54
-
55
-
54
+
55
+
56
56
pmRyzen_symtable._KUNCUserNotificationDisplayAlert = lookup_symbol (" _KUNCUserNotificationDisplayAlert" );
57
57
pmRyzen_symtable._cpu_to_processor = lookup_symbol (" _cpu_to_processor" );
58
58
pmRyzen_symtable._tscFreq = lookup_symbol (" _tscFreq" );
@@ -320,11 +320,11 @@ bool AMDRyzenCPUPowerManagement::start(IOService *provider){
320
320
IOLog (" AMDCPUSupport::start no PCI support found, failing...\n " );
321
321
return false ;
322
322
}
323
-
323
+
324
324
// while (!pmRyzen_symtable_ready) {
325
325
// IOSleep(200);
326
326
// }
327
-
327
+
328
328
void *safe_wrmsr = pmRyzen_symtable._wrmsr_carefully ;
329
329
if (!safe_wrmsr){
330
330
IOLog (" AMDCPUSupport::start WARN: Can't find _wrmsr_carefully, proceeding with unsafe wrmsr\n " );
@@ -392,15 +392,15 @@ IOReturn AMDRyzenCPUPowerManagement::setPowerState(unsigned long powerStateOrdin
392
392
IOLog (" AMDCPUSupport::setPowerState preparing for sleep\n " );
393
393
sleepState.sleep = true ;
394
394
sleepState.cpb = getCPBState ();
395
- dumpPstate (sleepState.pstate );
395
+ // dumpPstate(sleepState.pstate);
396
396
397
397
stopWorkLoop ();
398
398
} else if (1 == powerStateOrdinal && sleepState.sleep ) {
399
399
// Waking up
400
400
IOLog (" AMDCPUSupport::setPowerState preparing for wakeup\n " );
401
401
sleepState.sleep = false ;
402
402
setCPBState (sleepState.cpb );
403
- writePstate (sleepState.pstate );
403
+ // writePstate(sleepState.pstate);
404
404
startWorkLoop ();
405
405
}
406
406
@@ -515,18 +515,20 @@ void AMDRyzenCPUPowerManagement::calculateEffectiveFrequency(uint8_t physical){
515
515
// If an overflow of either the MPERF or APERF register occurs between read of last MPERF and
516
516
// read of last APERF, the effective frequency calculated in is invalid.
517
517
if (APERF <= lastAPERF || MPERF <= lastMPERF) {
518
- // IOLog("AMDCPUSupport::calculateEffectiveFrequency: frequency is invalid!!!");
518
+ IOLog (" AMDCPUSupport::calculateEffectiveFrequency: frequency is invalid for %u" , physical);
519
+ lastAPERF_PerCore[physical] = APERF;
520
+ lastMPERF_PerCore[physical] = MPERF;
519
521
return ;
520
522
}
521
523
522
524
float freqP0 = PStateDefClock_perCore[0 ];
523
525
524
526
uint64_t deltaAPERF = APERF - lastAPERF;
525
- float effFreq = (( float )deltaAPERF / ( float )( MPERF - lastMPERF)) * freqP0 ;
526
-
527
- effFreq_perCore[physical] = effFreq;
528
-
529
-
527
+ uint64_t deltaMPERF = MPERF - lastMPERF;
528
+ if (deltaMPERF != 0 ) {
529
+ float effFreq = (( float )deltaAPERF / ( float )(deltaMPERF)) * freqP0 ;
530
+ effFreq_perCore[physical] = effFreq;
531
+ }
530
532
}
531
533
532
534
void AMDRyzenCPUPowerManagement::updateInstructionDelta (uint8_t cpu_num){
@@ -724,7 +726,7 @@ EXPORT extern "C" kern_return_t amdryzencpupm_kern_start(kmod_info_t *, void *)
724
726
// This works better and increases boot speed in some cases.
725
727
PE_parse_boot_argn (" liludelay" , &ADDPR (debugPrintDelay), sizeof (ADDPR (debugPrintDelay)));
726
728
ADDPR (debugEnabled) = checkKernelArgument (" -amdpdbg" );
727
-
729
+
728
730
// IOLog("AMDCPUSupport::enter dlinking..\n");
729
731
//
730
732
// pmRyzen_symtable_ready = 0;
@@ -740,7 +742,7 @@ EXPORT extern "C" kern_return_t amdryzencpupm_kern_start(kmod_info_t *, void *)
740
742
// pmRyzen_symtable._i386_cpu_IPI = lookup_symbol("_i386_cpu_IPI");
741
743
// pmRyzen_symtable_ready = 1;
742
744
// IOLog("AMDCPUSupport::enter link finished.\n");
743
-
745
+
744
746
return KERN_SUCCESS;
745
747
}
746
748
0 commit comments