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 Jan 4, 2021
1 parent 7f7caf0 commit c3559df
Showing 1 changed file with 19 additions and 17 deletions.
36 changes: 19 additions & 17 deletions AMDRyzenCPUPowerManagement/AMDRyzenCPUPowerManagement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,20 +39,20 @@ bool AMDRyzenCPUPowerManagement::init(OSDictionary *dictionary){
IOLog("AMDCPUSupport v%s, init\n", xStringify(MODULE_VERSION));

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

pmRyzen_symtable_ready = 0;

retry:
find_mach_header_addr(getKernelVersion() >= KernelVersion::BigSur);
pmRyzen_symtable._wrmsr_carefully = lookup_symbol("_wrmsr_carefully");

if(!pmRyzen_symtable._wrmsr_carefully){
kextloadAlerts++;
IOSleep(2);
goto retry;
}


pmRyzen_symtable._KUNCUserNotificationDisplayAlert = lookup_symbol("_KUNCUserNotificationDisplayAlert");
pmRyzen_symtable._cpu_to_processor = lookup_symbol("_cpu_to_processor");
pmRyzen_symtable._tscFreq = lookup_symbol("_tscFreq");
Expand Down Expand Up @@ -320,11 +320,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 @@ -392,15 +392,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 @@ -515,18 +515,20 @@ 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;
float effFreq = ((float)deltaAPERF / (float)(MPERF - lastMPERF)) * freqP0;

effFreq_perCore[physical] = effFreq;


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

void AMDRyzenCPUPowerManagement::updateInstructionDelta(uint8_t cpu_num){
Expand Down Expand Up @@ -724,7 +726,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 @@ -740,7 +742,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 c3559df

Please sign in to comment.