User manual

Table Of Contents
Zynq-7000 AP SoC Technical Reference Manual www.xilinx.com 676
UG585 (v1.11) September 27, 2016
Chapter 24: Power Management
The location of the currently used translation table(s) and stacks are controllable through the TTBR
and SP registers, respectively. This allows switching between different structures for normal running
mode and standby mode if needed.
During the standby sequence interrupts are disabled in the CPUs. This way execution cannot be
interrupted while entering standby mode and once the wake-up event occurs execution resumes
right after the wfi instruction instead of jumping to a vector table. The wake-up interrupt must be
enabled in the corresponding wake-up device and in the GIC interrupt controller to cause a qualified
wake-up event. Once interrupts are re-enabled after waking up, the wake-up interrupt is still pending
and causes the CPU to jump to its interrupt handler, as usual.
Enter Sleep Mode
A CPU must execute the following steps to enter sleep mode from normal run mode:
1. Disable interrupts. Execute cpsid if.
2. Configure wake-up device.
3. Enable L2 cache dynamic clock gating. Set l2cpl310.reg15_power_ctrl[dynamic_clk_gating_en]
= 1.
4. Enable SCU standby mode. Set mpcore.SCU_CONTROL_REGISTER[SCU_standby_enable] = 1.
5. Enable topswitch clock stop. Set slcr.TOPSW_CLK_CTRL[CLK_DIS] = 1.
6. Enable Cortex-A9 dynamic clock gating. Set
cp15.power_control_register[dynamic_clock_gating] = 1.
7. Put the external DDR memory into self-refresh mode. Refer to section 10.9.6 DDR Power
Reduction.
8. Put the PLLs into bypass mode. Set slcr.{ARM, DDR, IO}_PLL_CTRL[PLL_BYPASS_FORCE] = 1.
9. Shut down the PLLs. Set slcr.{ARM, DDR, IO}_PLL_CTRL[PLL_PWRDWN] = 1.
10. Increase the clock divisor to slow down the CPU clock. Set slcr.ARM_CLK_CTRL[DIVISOR] =
0x3f.
11. Execute the wfi instruction to enter WFI mode.
Exit Sleep Mode
Exiting sleep mode is triggered by the configured interrupt occurring. The interrupt wakes up the
CPU which resumes execution. The newly starting activity also triggers the topswitch, SCU, and L2
cache controller to leave their idle states and continue normal operation. The procedure for waking
up is outlined below.
To exit from sleep mode:
1. Restore CPU clock divisor setting. Set slcr.ARM_CLK_CTRL[DIVISOR] = <original value>.
2. Power on the PLLs. Set slcr.{ARM, DDR, IO}_PLL_CTRL[PLL_PWRDWN] = 0.
3. Wait for PLL power-on and lock. Wait for slcr.PLL_STATUS[{ARM, DDR, IO}_PLL_LOCK] == 1.
4. Disable PLL bypass mode. Set slcr.{ARM, DDR, IO}_PLL_CTRL[PLL_BYPASS_FORCE] = 0.