Zynq UltraScale+ MPSoC has certain blocks, which have high static power consumption designated as power islands. These power islands can be power gated when not in use, to eliminate static power consumption. For example, on-chip memories like OCM and TCM , processors like A53 and RPU cluster are power islands. In addition to complete power gating, RAMs have a “Retention” mode where the contents are still retained, but static power is reduced by lowering the voltage. All of these power controls are abstracted out and can be controlled by the EEMI APIs.
Using EEMI to power down blocks
EEMI supports request_node, release_node and set_requirements APIs to move unused blocks to lower power states. Linux PM Framework automatically takes care of powering down the unused blocks, provided the drivers are loaded correctly for all blocks. However, there are a few blocks which can be inspected specifically for further optimization.
Here is an example on using debugfs to power down un-used blocks:
# Power Down PP0
echo pm_release_node 20 >/sys/kernel/debug/zynqmp-firmware/pm
Major Power Islands
RPU is a separate power island and can be turned-off when an application is only running on APU and doesn’t need any resources like TCMs in the RPU block. EEMI provides force_powerdown API to power down unused blocks. For applications that don’t use runtime PM, RPU can be turned off at boot time.
Powering down RPU block which is already idle saves around 70mW of power.
GPU has two pixel processors which can be powered down when not in use. If the end application is not using GPU, then GPU can be shut down completely. The Clock can be gated, Pixel Processors can be power gated, and the logic can be held in reset. This will provide a huge power saving opportunity of around 118mW (@500MHz).
When GPU driver is enabled in Linux, the runtime PM is automatically taken care and the pixel processors are powered down when GPU is idle. However, in systems where the GPU driver is not loaded, GPU power domains can be powered down explicitly by using PM debugfs interface as shown below or using the boot time PM technique.