Fix sleep
This commit is contained in:
@@ -53,46 +53,6 @@ namespace board {
|
|||||||
|
|
||||||
u32 fd = 0, fd2 = 0;
|
u32 fd = 0, fd2 = 0;
|
||||||
|
|
||||||
constexpr u32 pscDependencies[] = {PscPmModuleId_Display}; // Our dependencies
|
|
||||||
constexpr PscPmModuleId pscModuleId = (PscPmModuleId)692; // Our ID
|
|
||||||
static PscPmModule pscModule; // Module to listen for events with
|
|
||||||
|
|
||||||
Thread SleepWakeListener;
|
|
||||||
|
|
||||||
void SleepWakeEventListener(void *ptr) {
|
|
||||||
while (true) {
|
|
||||||
Result rc = eventWait(&pscModule.event, 10'000'000);
|
|
||||||
if (R_VALUE(rc) == KERNELRESULT(TimedOut))
|
|
||||||
continue;
|
|
||||||
if (R_VALUE(rc) == KERNELRESULT(Cancelled))
|
|
||||||
break;
|
|
||||||
|
|
||||||
PscPmState eventState;
|
|
||||||
u32 flags;
|
|
||||||
if (R_FAILED(pscPmModuleGetRequest(&pscModule, &eventState, &flags)))
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (eventState) {
|
|
||||||
case PscPmState_ReadySleep:
|
|
||||||
fileUtils::LogLine("Sleep");
|
|
||||||
soctherm::StopSensors();
|
|
||||||
break;
|
|
||||||
case PscPmState_ReadyAwaken:
|
|
||||||
fileUtils::LogLine("Wake");
|
|
||||||
soctherm::StartSensors();
|
|
||||||
break;
|
|
||||||
case PscPmState_ReadyShutdown:
|
|
||||||
fileUtils::LogLine("Shutdown");
|
|
||||||
soctherm::StopSensors();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
pscPmModuleAcknowledge(&pscModule, eventState);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void FetchHardwareInfos() {
|
void FetchHardwareInfos() {
|
||||||
ReadFuses(fuseData);
|
ReadFuses(fuseData);
|
||||||
SetGpuBracket(fuseData.gpuSpeedo, speedoBracket);
|
SetGpuBracket(fuseData.gpuSpeedo, speedoBracket);
|
||||||
@@ -171,16 +131,6 @@ namespace board {
|
|||||||
rc = pmdmntInitialize();
|
rc = pmdmntInitialize();
|
||||||
ASSERT_RESULT_OK(rc, "pmdmntInitialize");
|
ASSERT_RESULT_OK(rc, "pmdmntInitialize");
|
||||||
|
|
||||||
rc = pscmInitialize();
|
|
||||||
ASSERT_RESULT_OK(rc, "pscmInitialize");
|
|
||||||
|
|
||||||
rc = pscmGetPmModule(&pscModule, pscModuleId, pscDependencies, sizeof(pscDependencies)/sizeof(u32), true);
|
|
||||||
ASSERT_RESULT_OK(rc, "pscmGetPmModule");
|
|
||||||
|
|
||||||
threadCreate(&SleepWakeListener, SleepWakeEventListener, NULL, NULL, 0x1000, 0x0, 3);
|
|
||||||
|
|
||||||
threadStart(&SleepWakeListener);
|
|
||||||
|
|
||||||
StartLoad(nvCheck, fd);
|
StartLoad(nvCheck, fd);
|
||||||
|
|
||||||
batteryInfoInitialize();
|
batteryInfoInitialize();
|
||||||
@@ -211,7 +161,7 @@ namespace board {
|
|||||||
|
|
||||||
void Exit() {
|
void Exit() {
|
||||||
|
|
||||||
soctherm::StopSensors();
|
//soctherm::StopSensors();
|
||||||
|
|
||||||
if (HOSSVC_HAS_CLKRST) {
|
if (HOSSVC_HAS_CLKRST) {
|
||||||
clkrstExit();
|
clkrstExit();
|
||||||
@@ -240,10 +190,6 @@ namespace board {
|
|||||||
pmdmntExit();
|
pmdmntExit();
|
||||||
display::Shutdown();
|
display::Shutdown();
|
||||||
nvExit();
|
nvExit();
|
||||||
threadClose(&SleepWakeListener);
|
|
||||||
pscPmModuleFinalize(&pscModule);
|
|
||||||
pscPmModuleClose(&pscModule);
|
|
||||||
pscmExit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SysClkSocType GetSocType() {
|
SysClkSocType GetSocType() {
|
||||||
@@ -290,4 +236,5 @@ namespace board {
|
|||||||
bool IsUsingRetroSuperDisplay() {
|
bool IsUsingRetroSuperDisplay() {
|
||||||
return false; /* stub for now. */
|
return false; /* stub for now. */
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ namespace board {
|
|||||||
s32 millis = 0;
|
s32 millis = 0;
|
||||||
BatteryChargeInfo info;
|
BatteryChargeInfo info;
|
||||||
|
|
||||||
soctherm::TSensorTemps temps;
|
soctherm::TSensorTemps temps = {};
|
||||||
soctherm::ReadSensors(temps);
|
soctherm::ReadSensors(temps);
|
||||||
|
|
||||||
switch(sensor) {
|
switch(sensor) {
|
||||||
|
|||||||
@@ -44,6 +44,12 @@ namespace soctherm {
|
|||||||
#define CAR_CLK_SOURCE_TSENSOR 0x3B8
|
#define CAR_CLK_SOURCE_TSENSOR 0x3B8
|
||||||
#define CAR_CLK_OUT_ENB_V 0x360
|
#define CAR_CLK_OUT_ENB_V 0x360
|
||||||
|
|
||||||
|
#define CLK_RST_CONTROLLER_RST_DEVICES 0xC
|
||||||
|
#define SWR_SOC_THERM_RST 1 << 14
|
||||||
|
|
||||||
|
#define CLK_RST_CONTROLLER_CLK_OUT_ENB 0x18
|
||||||
|
#define CLK_ENB_SOC_THERM 1 << 14
|
||||||
|
|
||||||
#define CAR_CLK_SOURCE_TSENSOR_VAL 0x8000005E
|
#define CAR_CLK_SOURCE_TSENSOR_VAL 0x8000005E
|
||||||
|
|
||||||
#define NOMINAL_CALIB_FT 105
|
#define NOMINAL_CALIB_FT 105
|
||||||
@@ -470,6 +476,14 @@ namespace soctherm {
|
|||||||
return r >> 16;
|
return r >> 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool IsDisabledThroughSleep() {
|
||||||
|
return (ReadReg(carVa, CLK_RST_CONTROLLER_RST_DEVICES) & SWR_SOC_THERM_RST) || !(ReadReg(carVa, CLK_RST_CONTROLLER_CLK_OUT_ENB) & CLK_ENB_SOC_THERM);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsSensorEnabled() {
|
||||||
|
return ReadReg(socthermVa, TSENSOR_TSENSOR_CLKEN);
|
||||||
|
}
|
||||||
|
|
||||||
void EnableSensor(const TSensor *sensor, u32 sensorIdx) {
|
void EnableSensor(const TSensor *sensor, u32 sensorIdx) {
|
||||||
u32 val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT;
|
u32 val = sensor->config->tall << SENSOR_CONFIG0_TALL_SHIFT;
|
||||||
WriteReg(socthermVa, sensor->base + SENSOR_CONFIG0, val);
|
WriteReg(socthermVa, sensor->base + SENSOR_CONFIG0, val);
|
||||||
@@ -497,7 +511,42 @@ namespace soctherm {
|
|||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StartSensors() {
|
||||||
|
u32 pdiv, hotspot;
|
||||||
|
|
||||||
|
if (isMariko) {
|
||||||
|
for (u32 i = 0; i < std::size(marikoTSensors); ++i) {
|
||||||
|
EnableSensor(&marikoTSensors[i], i);
|
||||||
|
}
|
||||||
|
|
||||||
|
pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210B0) | PDIV_RATE_T210B0;
|
||||||
|
hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210B0) | HOTSPOT_VAL;
|
||||||
|
} else {
|
||||||
|
for (u32 i = 0; i < std::size(eristaTSensors); ++i) {
|
||||||
|
EnableSensor(&eristaTSensors[i], i);
|
||||||
|
}
|
||||||
|
|
||||||
|
pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210) | PDIV_RATE_T210;
|
||||||
|
hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210) | HOTSPOT_VAL;
|
||||||
|
|
||||||
|
EnableSensor(&eristaTSensors[SocthermTSensor_MEM0], SocthermTSensor_MEM0);
|
||||||
|
EnableSensor(&eristaTSensors[SocthermTSensor_MEM1], SocthermTSensor_MEM1);
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteReg(socthermVa, SENSOR_PDIV, pdiv);
|
||||||
|
WriteReg(socthermVa, SENSOR_HOTSPOT_OFF, hotspot);
|
||||||
|
WriteReg(socthermVa, TSENSOR_TSENSOR_CLKEN, TSENSOR_TSENSOR_ENABLE);
|
||||||
|
}
|
||||||
|
|
||||||
void ReadSensors(TSensorTemps &temps) {
|
void ReadSensors(TSensorTemps &temps) {
|
||||||
|
if (IsDisabledThroughSleep()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsSensorEnabled()) {
|
||||||
|
StartSensors();
|
||||||
|
}
|
||||||
|
|
||||||
temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16);
|
temps.cpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) >> 16);
|
||||||
temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK);
|
temps.gpu = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP1) & SENSOR_TEMP1_GPU_TEMP_MASK);
|
||||||
temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK);
|
temps.pllx = TranslateTemp(ReadReg(socthermVa, SENSOR_TEMP2) & SENSOR_TEMP2_PLLX_TEMP_MASK);
|
||||||
@@ -509,51 +558,6 @@ namespace soctherm {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopSensors() {
|
|
||||||
const TSensor *sensors = isMariko ? marikoTSensors : eristaTSensors;
|
|
||||||
u32 count = isMariko ? std::size(marikoTSensors) : std::size(eristaTSensors);
|
|
||||||
|
|
||||||
for (u32 i = 0; i < count; ++i) {
|
|
||||||
SetBits(socthermVa, sensors[i].base + SENSOR_CONFIG0, SENSOR_CONFIG0_STOP);
|
|
||||||
ClearBits(socthermVa, sensors[i].base + SENSOR_CONFIG1, SENSOR_CONFIG1_TEMP_ENABLE);
|
|
||||||
WriteReg(socthermVa, sensors[i].base + SENSOR_CONFIG2, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteReg(socthermVa, TSENSOR_TSENSOR_CLKEN, 0);
|
|
||||||
WriteReg(carVa, CAR_CLK_SOURCE_TSENSOR, 0);
|
|
||||||
SetBits(carVa, CAR_CLK_OUT_ENB_V, 0);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartSensors() {
|
|
||||||
if (!ReadReg(socthermVa, TSENSOR_TSENSOR_CLKEN)) {
|
|
||||||
u32 pdiv, hotspot;
|
|
||||||
|
|
||||||
if (isMariko) {
|
|
||||||
for (u32 i = 0; i < std::size(marikoTSensors); ++i) {
|
|
||||||
EnableSensor(&marikoTSensors[i], i);
|
|
||||||
}
|
|
||||||
|
|
||||||
pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210B0) | PDIV_RATE_T210B0;
|
|
||||||
hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210B0) | HOTSPOT_VAL;
|
|
||||||
} else {
|
|
||||||
for (u32 i = 0; i < std::size(eristaTSensors); ++i) {
|
|
||||||
EnableSensor(&eristaTSensors[i], i);
|
|
||||||
}
|
|
||||||
|
|
||||||
pdiv = (ReadReg(socthermVa, SENSOR_PDIV) & PDIV_MASK_T210) | PDIV_RATE_T210;
|
|
||||||
hotspot = (ReadReg(socthermVa, SENSOR_HOTSPOT_OFF) & HOTSPOT_MASK_T210) | HOTSPOT_VAL;
|
|
||||||
|
|
||||||
EnableSensor(&eristaTSensors[SocthermTSensor_MEM0], SocthermTSensor_MEM0);
|
|
||||||
EnableSensor(&eristaTSensors[SocthermTSensor_MEM1], SocthermTSensor_MEM1);
|
|
||||||
}
|
|
||||||
|
|
||||||
WriteReg(socthermVa, SENSOR_PDIV, pdiv);
|
|
||||||
WriteReg(socthermVa, SENSOR_HOTSPOT_OFF, hotspot);
|
|
||||||
WriteReg(socthermVa, TSENSOR_TSENSOR_CLKEN, TSENSOR_TSENSOR_ENABLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CalcSharedCal(const TSensorFuse *tfuse, TSensorSharedCalib *shared, u64 fuseVa) {
|
void CalcSharedCal(const TSensorFuse *tfuse, TSensorSharedCalib *shared, u64 fuseVa) {
|
||||||
s32 shifted_cp, shifted_ft;
|
s32 shifted_cp, shifted_ft;
|
||||||
|
|
||||||
|
|||||||
@@ -130,8 +130,6 @@ namespace soctherm {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void Initialize();
|
void Initialize();
|
||||||
void StartSensors();
|
|
||||||
void StopSensors();
|
|
||||||
void ReadSensors(TSensorTemps &temps);
|
void ReadSensors(TSensorTemps &temps);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user