Skip to content

Commit

Permalink
test read freq
Browse files Browse the repository at this point in the history
  • Loading branch information
Massimiliano Barbierato committed Jun 27, 2023
1 parent 27447fc commit 77eb545
Show file tree
Hide file tree
Showing 4 changed files with 271 additions and 8 deletions.
11 changes: 5 additions & 6 deletions SMCProcessorAMD/KeyImplementations.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

class SMCProcessorAMD;

class FreqKey : public VirtualSMCValue { };

class AMDSupportVsmcValue : public VirtualSMCValue {
protected:
Expand All @@ -21,11 +22,9 @@ class AMDSupportVsmcValue : public VirtualSMCValue {
AMDSupportVsmcValue(SMCProcessorAMD *provider, size_t package, size_t core=0) : provider(provider), package(package), core(core) {}
};


class TempPackage : public AMDSupportVsmcValue { using AMDSupportVsmcValue::AMDSupportVsmcValue; protected: SMC_RESULT readAccess() override; };
class TempCore : public AMDSupportVsmcValue { using AMDSupportVsmcValue::AMDSupportVsmcValue; protected: SMC_RESULT readAccess() override; };

class EnergyPackage: public AMDSupportVsmcValue
{ using AMDSupportVsmcValue::AMDSupportVsmcValue; protected: SMC_RESULT readAccess() override; };
class FREQ : public FreqKey { protected: SMC_RESULT readAccess() override; };
class TempPackage : public AMDSupportVsmcValue { using AMDSupportVsmcValue::AMDSupportVsmcValue; protected: SMC_RESULT readAccess() override; };
class TempCore : public AMDSupportVsmcValue { using AMDSupportVsmcValue::AMDSupportVsmcValue; protected: SMC_RESULT readAccess() override; };
class EnergyPackage: public AMDSupportVsmcValue { using AMDSupportVsmcValue::AMDSupportVsmcValue; protected: SMC_RESULT readAccess() override; };

#endif /* KeyImplementations_hpp */
9 changes: 7 additions & 2 deletions SMCProcessorAMD/SMCProcessorAMD.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ bool SMCProcessorAMD::setupKeysVsmc(){

bool suc = true;


suc &= VirtualSMCAPI::addKey(KeyFR0X, vsmcPlugin.data, VirtualSMCAPI::valueWithUint32(400, new FREQ(), SMC_KEY_ATTRIBUTE_PRIVATE_WRITE|SMC_KEY_ATTRIBUTE_WRITE|SMC_KEY_ATTRIBUTE_READ));

//Read watt cpu
suc &= VirtualSMCAPI::addKey(KeyPCPR, vsmcPlugin.data, VirtualSMCAPI::valueWithSp(0, SmcKeyTypeSp96, new EnergyPackage(this, 0)));
suc &= VirtualSMCAPI::addKey(KeyPCPT, vsmcPlugin.data, VirtualSMCAPI::valueWithSp(0, SmcKeyTypeSp96, new EnergyPackage(this, 0)));
Expand All @@ -49,9 +52,11 @@ bool SMCProcessorAMD::setupKeysVsmc(){
suc &= VirtualSMCAPI::addKey(KeyTCxP(0), vsmcPlugin.data, VirtualSMCAPI::valueWithSp(0, SmcKeyTypeSp78, new TempPackage(this, 0)));
suc &= VirtualSMCAPI::addKey(KeyTCxT(0), vsmcPlugin.data, VirtualSMCAPI::valueWithSp(0, SmcKeyTypeSp78, new TempPackage(this, 0)));
suc &= VirtualSMCAPI::addKey(KeyTCxp(0), vsmcPlugin.data, VirtualSMCAPI::valueWithSp(0, SmcKeyTypeSp78, new TempPackage(this, 0)));



if(!suc){
IOLog("SMCProcessorAMD::setupKeysVsmc: VirtualSMCAPI::addKey returned false. \n");
if(!suc){
IOLog("SMCProcessorAMD::setupKeysVsmc: VirtualSMCAPI::addKey returned false. \n");
}

return suc;
Expand Down
2 changes: 2 additions & 0 deletions SMCProcessorAMD/SMCProcessorAMD.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ class SMCProcessorAMD : public IOService {
static constexpr SMC_KEY KeyPCPR = SMC_MAKE_IDENTIFIER('P','C','P','R');
static constexpr SMC_KEY KeyPCPT = SMC_MAKE_IDENTIFIER('P','C','P','T');
static constexpr SMC_KEY KeyPCTR = SMC_MAKE_IDENTIFIER('P','C','T','R');
static constexpr SMC_KEY KeyFR0X = SMC_MAKE_IDENTIFIER('f','r','e','q');
//static constexpr SMC_KEY KeyTCxD(size_t i) { return SMC_MAKE_IDENTIFIER('T','C',KeyIndexes[i],'D'); }
static constexpr SMC_KEY KeyTCxE(size_t i) { return SMC_MAKE_IDENTIFIER('T','C',KeyIndexes[i],'E'); }
static constexpr SMC_KEY KeyTCxF(size_t i) { return SMC_MAKE_IDENTIFIER('T','C',KeyIndexes[i],'F'); }
Expand All @@ -109,6 +110,7 @@ class SMCProcessorAMD : public IOService {
static constexpr SMC_KEY KeyTCxT(size_t i) { return SMC_MAKE_IDENTIFIER('T','C',KeyIndexes[i],'T'); }
static constexpr SMC_KEY KeyTCxp(size_t i) { return SMC_MAKE_IDENTIFIER('T','C',KeyIndexes[i],'p'); }


public:
virtual bool init(OSDictionary *dictionary = 0) override;
virtual void free(void) override;
Expand Down
257 changes: 257 additions & 0 deletions SMCProcessorAMD/SMCProcessorAMDUserClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,263 @@ IOReturn SMCProcessorAMDUserClient::externalMethod(uint32_t selector, IOExternal
dataOut[0] = fProvider->PACKAGE_TEMPERATURE_perPackage[0];
break;
}


//Get all data like this: [power, temp, pstateCur, clock_core_1, 2, 3 .....]
//Yes, i am too lazy to write a struct
case 4: {
/*uint32_t numPhyCores = fProvider->totalNumberOfPhysicalCores;
arguments->scalarOutputCount = 1;
arguments->scalarOutput[0] = numPhyCores;
arguments->structureOutputSize = (numPhyCores + 3) * sizeof(float);
float *dataOut = (float*) arguments->structureOutput;
dataOut[0] = (float)fProvider->uniPackageEnegry;
dataOut[1] = fProvider->PACKAGE_TEMPERATURE_perPackage[0];
dataOut[2] = fProvider->PStateCtl;
for(uint32_t i = 0; i < numPhyCores; i++){
dataOut[i + 3] = fProvider->effFreq_perCore[i];
}*/
float *dataOut = (float*) arguments->structureOutput;

dataOut[0] = 40;
dataOut[1] = 41;
dataOut[2] = 42;
dataOut[3] = 43;
dataOut[4] = 44;
dataOut[5] = 45;
dataOut[6] = 46;
dataOut[7] = 47;
dataOut[8] = 48;
dataOut[9] = 49;

break;
}

//Get per core raw load index
case 5: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = (fProvider->totalNumberOfPhysicalCores) * sizeof(uint64_t);
uint64_t *dataOut = (uint64_t*) arguments->structureOutput;
for(uint32_t i = 0; i < fProvider->totalNumberOfPhysicalCores; i++){
dataOut[i] = fProvider->instructionDelta_PerCore[i];
}*/
uint64_t *dataOut = (uint64_t*) arguments->structureOutput;

dataOut[0] = 50;
dataOut[1] = 51;
dataOut[2] = 52;
dataOut[3] = 53;
dataOut[4] = 54;
dataOut[5] = 55;
dataOut[6] = 56;
dataOut[7] = 57;
dataOut[8] = 58;
dataOut[9] = 59;

break;
}

//Get per core load index
case 6: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = (fProvider->totalNumberOfPhysicalCores) * sizeof(float);
float *dataOut = (float*) arguments->structureOutput;
for(uint32_t i = 0; i < fProvider->totalNumberOfPhysicalCores; i++){
dataOut[i] = fProvider->loadIndex_PerCore[i];
}*/

uint64_t *dataOut = (uint64_t*) arguments->structureOutput;

dataOut[0] = 60;
dataOut[1] = 61;
dataOut[2] = 62;
dataOut[3] = 63;
dataOut[4] = 64;
dataOut[5] = 65;
dataOut[6] = 66;
dataOut[7] = 67;
dataOut[8] = 68;
dataOut[9] = 69;

break;
}

//Get basic CPUID
//[Family, Model, Physical, Logical, L1_perCore, L2_perCore, L3]
case 7: {
arguments->scalarOutputCount = 0;

arguments->structureOutputSize = (8) * sizeof(uint64_t);

uint64_t *dataOut = (uint64_t*) arguments->structureOutput;

dataOut[0] = (uint64_t)fProvider->cpuFamily;
dataOut[1] = (uint64_t)fProvider->cpuModel;
dataOut[2] = (uint64_t)fProvider->totalNumberOfPhysicalCores;
dataOut[3] = (uint64_t)fProvider->totalNumberOfLogicalCores;
dataOut[4] = (uint64_t)fProvider->cpuCacheL1_perCore;
dataOut[5] = (uint64_t)fProvider->cpuCacheL2_perCore;
dataOut[6] = (uint64_t)fProvider->cpuCacheL3;
dataOut[7] = (uint64_t)fProvider->cpuSupportedByCurrentVersion;

break;
}

//Get SMCAMDProcessor Version String
case 8: {
arguments->scalarOutputCount = 0;

arguments->structureOutputSize = (uint32_t)strlen(xStringify(MODULE_VERSION));
char *dataOut = (char*) arguments->structureOutput;

for(uint32_t i = 0; i < arguments->structureOutputSize; i++){
dataOut[i] = xStringify(MODULE_VERSION)[i];
}

break;
}

//Get PState
case 9: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = 1 * sizeof(uint64_t);
uint64_t *dataOut = (uint64_t*) arguments->structureOutput;
dataOut[0] = fProvider->PStateCtl;*/

uint64_t *dataOut = (uint64_t*) arguments->structureOutput;
dataOut[0] = 90;

break;
}

//Set PState
case 10: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = 0;
if(arguments->scalarInputCount != 1)
return kIOReturnBadArgument;
fProvider->PStateCtl = (uint8_t)arguments->scalarInput[0];
fProvider->applyPowerControl();*/


break;
}

//Get CPB
case 11: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = 2 * sizeof(uint64_t);
uint64_t *dataOut = (uint64_t*) arguments->structureOutput;
dataOut[0] = (uint64_t)fProvider->cpbSupported;
dataOut[1] = (uint64_t)fProvider->getCPBState();*/

uint64_t *dataOut = (uint64_t*) arguments->structureOutput;
dataOut[0] = 110;
dataOut[1] = 111;
break;
}

//Set CPB
case 12: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = 0;
if(arguments->scalarInputCount != 1)
return kIOReturnBadArgument;
if(!fProvider->cpbSupported)
return kIOReturnNoDevice;
fProvider->setCPBState(arguments->scalarInput[0]==1?true:false);
*/
break;
}

//Get PPM
case 13: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = 1 * sizeof(uint64_t);
uint64_t *dataOut = (uint64_t*) arguments->structureOutput;
dataOut[0] = (uint64_t)fProvider->PPMEnabled;*/

uint64_t *dataOut = (uint64_t*) arguments->structureOutput;

dataOut[0] = 130;
break;
}

//Set PPM
case 14: {
/*arguments->scalarOutputCount = 0;
arguments->structureOutputSize = 0;
if(arguments->scalarInputCount != 1)
return kIOReturnBadArgument;
fProvider->PPMEnabled = arguments->scalarInput[0]==1?true:false;
if(!fProvider->PPMEnabled){
fProvider->PStateCtl = 0;
fProvider->applyPowerControl();
}
*/
break;
}

//Set PStateDef
case 15: {
/*if(!hasPrivilege())
return kIOReturnNotPrivileged;
if(arguments->scalarInputCount != 8)
return kIOReturnBadArgument;
fProvider->writePstate(arguments->scalarInput);
*/
break;
}

//get board info
case 16: {
arguments->scalarOutputCount = 1;
arguments->scalarOutput[0] = fProvider->boardInfoValid ? 1 : 0;

arguments->structureOutputSize = 128;

char *dataOut = (char*) arguments->structureOutput;

for(uint32_t i = 0; i < 64; i++){
dataOut[i] = fProvider->boardVender[i];
}

for(uint32_t i = 0; i < 64; i++){
dataOut[i+64] = fProvider->boardName[i];
}

break;
}

default: {
IOLog("SMCProcessorAMDUserClient::externalMethod: invalid method.\n");
Expand Down

0 comments on commit 77eb545

Please sign in to comment.