Skip to content

Commit

Permalink
Fixes potential cause of freezes after sleep
Browse files Browse the repository at this point in the history
  • Loading branch information
aluveitie committed Sep 3, 2020
1 parent d7028bc commit f358899
Showing 1 changed file with 17 additions and 13 deletions.
30 changes: 17 additions & 13 deletions AMDRyzenCPUPowerManagement/AMDRyzenCPUPowerManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ bool AMDRyzenCPUPowerManagement::init(OSDictionary *dictionary){
IOLog("AMDCPUSupport v%s, init\n", xStringify(MODULE_VERSION));

IOLog("AMDCPUSupport::enter dlinking..\n");

pmRyzen_symtable_ready = 0;

pmRyzen_symtable._wrmsr_carefully = lookup_symbol("_wrmsr_carefully");
pmRyzen_symtable._KUNCUserNotificationDisplayAlert = lookup_symbol("_KUNCUserNotificationDisplayAlert");
pmRyzen_symtable._cpu_to_processor = lookup_symbol("_cpu_to_processor");
Expand Down Expand Up @@ -309,11 +309,11 @@ bool AMDRyzenCPUPowerManagement::start(IOService *provider){
IOLog("AMDCPUSupport::start no PCI support found, failing...\n");
return false;
}

// while (!pmRyzen_symtable_ready) {
// IOSleep(200);
// }

void *safe_wrmsr = pmRyzen_symtable._wrmsr_carefully;
if(!safe_wrmsr){
IOLog("AMDCPUSupport::start WARN: Can't find _wrmsr_carefully, proceeding with unsafe wrmsr\n");
Expand Down Expand Up @@ -381,15 +381,15 @@ IOReturn AMDRyzenCPUPowerManagement::setPowerState(unsigned long powerStateOrdin
IOLog("AMDCPUSupport::setPowerState preparing for sleep\n");
sleepState.sleep = true;
sleepState.cpb = getCPBState();
dumpPstate(sleepState.pstate);
//dumpPstate(sleepState.pstate);

stopWorkLoop();
} else if (1 == powerStateOrdinal && sleepState.sleep) {
// Waking up
IOLog("AMDCPUSupport::setPowerState preparing for wakeup\n");
sleepState.sleep = false;
setCPBState(sleepState.cpb);
writePstate(sleepState.pstate);
//writePstate(sleepState.pstate);
startWorkLoop();
}

Expand Down Expand Up @@ -502,18 +502,22 @@ void AMDRyzenCPUPowerManagement::calculateEffectiveFrequency(uint8_t physical){
//If an overflow of either the MPERF or APERF register occurs between read of last MPERF and
//read of last APERF, the effective frequency calculated in is invalid.
if(APERF <= lastAPERF || MPERF <= lastMPERF) {
// IOLog("AMDCPUSupport::calculateEffectiveFrequency: frequency is invalid!!!");
IOLog("AMDCPUSupport::calculateEffectiveFrequency: frequency is invalid for %u", physical);
lastAPERF_PerCore[physical] = APERF;
lastMPERF_PerCore[physical] = MPERF;
return;
}

float freqP0 = PStateDefClock_perCore[0];

uint64_t deltaAPERF = APERF - lastAPERF;
uint64_t deltaMPERF = MPERF - lastMPERF;
deltaAPERF_PerCore[physical] = deltaAPERF;
deltaMPERF_PerCore[physical] = MPERF - lastMPERF;
float effFreq = ((float)deltaAPERF / (float)(MPERF - lastMPERF)) * freqP0;

effFreq_perCore[physical] = effFreq;
deltaMPERF_PerCore[physical] = deltaMPERF;
if (deltaMPERF != 0) {
float effFreq = ((float)deltaAPERF / (float)(deltaMPERF)) * freqP0;
effFreq_perCore[physical] = effFreq;
}

lastAPERF_PerCore[physical] = APERF;
lastMPERF_PerCore[physical] = MPERF;
Expand Down Expand Up @@ -714,7 +718,7 @@ EXPORT extern "C" kern_return_t amdryzencpupm_kern_start(kmod_info_t *, void *)
// This works better and increases boot speed in some cases.
PE_parse_boot_argn("liludelay", &ADDPR(debugPrintDelay), sizeof(ADDPR(debugPrintDelay)));
ADDPR(debugEnabled) = checkKernelArgument("-amdpdbg");

// IOLog("AMDCPUSupport::enter dlinking..\n");
//
// pmRyzen_symtable_ready = 0;
Expand All @@ -730,7 +734,7 @@ EXPORT extern "C" kern_return_t amdryzencpupm_kern_start(kmod_info_t *, void *)
// pmRyzen_symtable._i386_cpu_IPI = lookup_symbol("_i386_cpu_IPI");
// pmRyzen_symtable_ready = 1;
// IOLog("AMDCPUSupport::enter link finished.\n");

return KERN_SUCCESS;
}

Expand Down

0 comments on commit f358899

Please sign in to comment.