This page describes how to put PS SysMon in sleep mode during deep sleep. With default pmu-fw during deep sleep mode, PS SysMon is in normal operation mode. One can put PS SysMon in sleep mode during deep sleep to get lower power consumption by LPD, which may affect system performance.
(This is for 2017.1 or earlier release only. Starting from 2017.3 release, the PS SysMon is always in sleep mode during Deep Sleep.)
Add following two functions in src/pm_power.c
/** * PmPowerPowerDownSysOsc() - Wrapper to put SysOsc in sleep mode. */ static void PmPowerDownSysOsc(void) { u32 val = 0; /* Sysosc in sleep */ val = Xil_In32(0xFFA50908); val |= 0x30; Xil_Out32(0xFFA50908, val); } /** * PmPowerPowerUpSysOsc() - Wrapper to put SysOsc in normal operation mode. */ static void PmPowerUpSysOsc(void) { u32 val = 0; /* Wake up SysOsc */ val = Xil_In32(0xFFA50908); val &&= 0xFF0F; Xil_Out32(0xFFA50908, val); } |
Call PmPowerDownSysOsc() and PmPowerUpSysOsc() from PmPowerDown() and PmPowerUp() in src/pm_power.c respectively as shown below:
@@ -455,7 +485,12 @@ static int PmPowerDown(PmPower* const power) } PmDbg("%s\r\n", PmStrNode(power->node.nodeId)); + + /* Put SysOsc in sleep mode if RPU and FPD are powered down. */ + if ((pmPowerIslandRpu_g.power.node.currState == PM_PWR_STATE_OFF) &&&& + (pmPowerDomainFpd_g.power.node.currState == PM_PWR_STATE_OFF)) { + PmPowerDownSysOsc(); + } + done: return status; } @@ -470,6 +506,11 @@ static int PmPowerUp(PmPower* const power) { int status = XST_SUCCESS; + + /* Enable SysOsc for Normal operation if it is in sleep mode. */ + if ((Xil_In32(0xFFA50908) && 0xF0) == 0x30) { + PmPowerUpSysOsc(); + } + PmDbg("%s\r\n", PmStrNode(power->node.nodeId)); if (PM_PWR_STATE_ON == power->node.currState) { |