From 1f706b7bbcef4512b3db39cb85c02e003d26b250 Mon Sep 17 00:00:00 2001 From: Akashdeep Kaur Date: Fri, 3 Jul 2026 14:04:34 +0530 Subject: [PATCH 1/3] feat(pm_low_power_modes): add DSS plus Deep Sleep mode for AM62LX Add DSS plus Deep Sleep low power mode, a new suspend mode where the Display Subsystem remains powered to show a static image while the rest of the system enters Deep Sleep. Signed-off-by: Akashdeep Kaur --- .../pm_am62lx_low_power_modes.rst | 206 +++++++++++++++--- .../Power_Management/pm_overview.rst | 1 + .../Power_Management/pm_wakeup_sources.rst | 34 +-- 3 files changed, 197 insertions(+), 44 deletions(-) diff --git a/source/linux/Foundational_Components/Power_Management/pm_am62lx_low_power_modes.rst b/source/linux/Foundational_Components/Power_Management/pm_am62lx_low_power_modes.rst index 1ac32524b..cb5c21925 100644 --- a/source/linux/Foundational_Components/Power_Management/pm_am62lx_low_power_modes.rst +++ b/source/linux/Foundational_Components/Power_Management/pm_am62lx_low_power_modes.rst @@ -18,6 +18,7 @@ to highest power consumption): #. RTC Only #. RTC + I/O + DDR #. DeepSleep +#. DSS plus DeepSleep RTC Only ******** @@ -172,36 +173,187 @@ In order to enter DeepSleep, [ 88.649913] PM: suspend exit root@am62lxx-evm:~# +.. _lpm_dss_ds: + +DSS plus DeepSleep +****************** + +DSS plus DeepSleep is a low-power mode where the Display Subsystem (DSS) is **ON** to display +a static image while the rest of the system enters DeepSleep. This mode is useful for +applications that need to keep visual output during system suspend, such as displaying +status information, warnings, or other static content while minimizing overall power consumption. + +In DSS plus DeepSleep mode, the system state stays in RAM with DDR in self-refresh, +similar to standard DeepSleep. The key difference is that the DSS remains active and +powered to continue driving the display with a static framebuffer. The DSS has a self-refresh +feature that allows it to fetch the framebuffer from its internal memory instead of accessing +DDR, which helps reduce power consumption while maintaining display output. + +How It Works +============ + +DSS plus DeepSleep requires two display properties: + +**SELF_REFRESH** + +This property enables the DSS hardware to replay the last displayed frame from its internal +on-chip memory (a small FIFO buffer) instead of continuously fetching from DDR. This +significantly reduces memory bandwidth and power consumption during suspend. + +The AM62L-DSS has a 20 KB FIFO buffer. For the self-refresh feature to work, the static +image must fit within this buffer. The size is: + + **Frame Size = Width × Height × Bytes-per-pixel** + +For NV12 format (1.5 bytes per pixel), this means: + + **Width × Height × 1.5 ≤ 20,480 bytes** + + **Width × Height ≤ 13,653 pixels** + +For example, a 116×116 NV12 image requires 116 × 116 × 1.5 = 20,184 bytes, which is the +maximum size that fits within the 20 KB limit. If the frame is too large, self-refresh will +not activate. + +**ALWAYS_ON_DISPLAY** + +This property keeps the display pipeline powered on during system suspend. Without this, +the display would be turned off even if self-refresh is active. Together with self-refresh, +it ensures the static frame remains visible throughout the suspend period. + +Entering DSS plus DeepSleep Mode +================================ + +Entering DSS plus DeepSleep requires several steps to configure the display subsystem properly. +First, stop any display manager service that might be actively managing the display: + +.. code-block:: console + + root@am62lxx-evm:~# systemctl stop emptty + +Next, enable always on display to keep the screen active and the DSS self-refresh feature. +This configures the display controller to fetch the framebuffer from its internal memory +instead of accessing DDR. Use ``modetest -M tidss -p`` or ``kmsprint`` to check the CRTC ID +(for ALWAYS_ON_DISPLAY) and plane ID (for SELF_REFRESH) on your system: + +.. code-block:: console + + root@am62lxx-evm:~# modetest -M tidss -w 42:ALWAYS_ON_DISPLAY:1 # 42 is the CRTC ID + root@am62lxx-evm:~# modetest -M tidss -w 35:SELF_REFRESH:1 # 35 is the plane ID + +Display a static image on the screen that remains visible during suspend. This example +uses GStreamer to display a test pattern. Press Ctrl+C to terminate the pipeline. This +keeps the last frame on the screen, allowing the system to enter low power mode: + +.. code-block:: console + + root@am62lxx-evm:~# gst-launch-1.0 videotestsrc pattern=ball ! video/x-raw, width=50, height=50, framerate=60/1, format=RGB ! fpsdisplaysink text-overlay=false video-sink="kmssink can-scale=false sync=false" sync=false -v + Setting pipeline to PAUSED ... + Pipeline is PREROLLING ... + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstKMSSink:kmssink0: display-width = 800 + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstKMSSink:kmssink0: display-height = 480 + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstKMSSink:kmssink0: sync = false + /GstPipeline:pipeline0/GstVideoTestSrc:videotestsrc0.GstPad:src: caps = video/x-raw, format=(string)RGB, width=(int)50, height=(int)50, framerate=(fraction)60/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)16/15, interlace-mode=(string)progressive + /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:src: caps = video/x-raw, format=(string)RGB, width=(int)50, height=(int)50, framerate=(fraction)60/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)16/15, interlace-mode=(string)progressive + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink.GstProxyPad:proxypad0: caps = video/x-raw, format=(string)RGB, width=(int)50, height=(int)50, framerate=(fraction)60/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)16/15, interlace-mode=(string)progressive + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstKMSSink:kmssink0.GstPad:sink: caps = video/x-raw, format=(string)RGB, width=(int)50, height=(int)50, framerate=(fraction)60/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)16/15, interlace-mode=(string)progressive + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0.GstGhostPad:sink: caps = video/x-raw, format=(string)RGB, width=(int)50, height=(int)50, framerate=(fraction)60/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)16/15, interlace-mode=(string)progressive + /GstPipeline:pipeline0/GstCapsFilter:capsfilter0.GstPad:sink: caps = video/x-raw, format=(string)RGB, width=(int)50, height=(int)50, framerate=(fraction)60/1, multiview-mode=(string)mono, pixel-aspect-ratio=(fraction)16/15, interlace-mode=(string)progressive + Pipeline is PREROLLED ... + Setting pipeline to PLAYING ... + Redistribute latency... + New clock: GstSystemClock + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0/GstKMSSink:kmssink0: sync = false + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 16, dropped: 0, current: 30.68, average: 30.68 + /GstPipeline:pipeline0/GstFPSDisplaySink:fpsdisplaysink0: last-message = rendered: 32, dropped: 0, current: 30.05, average: 30.36 + handling interrupt.:99. + Interrupt: Stopping pipeline ... + Execution ended after 0:00:01.497017765 + Setting pipeline to NULL ... + Freeing pipeline ... + +After the GStreamer pipeline terminates, the last displayed frame remains on the screen. +Configure the system to use s2idle suspend which will allow the system to enter the lowest +power state available. Since the display is configured to be ALWAYS ON, DeepSleep + DSS is +the lowest available power state: + +.. code-block:: console + + root@am62lxx-evm:~# echo s2idle > /sys/power/mem_sleep + +The SoC can now suspend using the following command: + +.. code-block:: console + + root@am62lxx-evm:~# echo mem > /sys/power/state + [ 101.964352] PM: suspend entry (s2idle) + [ 101.968392] Filesystems sync: 0.000 seconds + [ 101.973713] Freezing user space processes + [ 101.980059] Freezing user space processes completed (elapsed 0.002 seconds) + [ 101.987068] OOM killer disabled. + [ 101.990296] Freezing remaining freezable tasks + [ 101.996139] Freezing remaining freezable tasks completed (elapsed 0.001 seconds) + [ 102.027260] k3_wkup_src_notify wkup-src-notify: wakeup source:0x10000, pin:0x6d, mode:0x8 + [ 102.060012] am65-cpsw-nuss 8000000.ethernet: set new flow-id-base 96 + [ 102.080175] am65-cpsw-nuss 8000000.ethernet eth0: PHY [8000f00.mdio:00] driver [TI DP83867] (irq=POLL) + [ 102.090380] am65-cpsw-nuss 8000000.ethernet eth0: configuring for phy/rgmii-rxid link mode + [ 102.112383] am65-cpsw-nuss 8000000.ethernet eth1: PHY [8000f00.mdio:01] driver [TI DP83867] (irq=POLL) + [ 102.122586] am65-cpsw-nuss 8000000.ethernet eth1: configuring for phy/rgmii-rxid link mode + [ 102.474090] OOM killer enabled. + [ 102.477363] Restarting tasks: Starting + [ 102.499994] Restarting tasks: Done + [ 102.503505] random: crng reseeded on system resumption + [ 102.509008] PM: suspend exit + root@am62lxx-evm:~# + +Changing from Always-On Static Display to Active Dynamic Display +================================================================ + +After the system resumes from DSS plus DeepSleep, the static frame continues to be displayed +from the FIFO. The display does **not** automatically change back to dynamic content. +To return to normal active display operation, disable the SELF_REFRESH and ALWAYS_ON_DISPLAY +properties: + +.. code-block:: console + + root@am62lxx-evm:~# modetest -M tidss -w 35:SELF_REFRESH:0 # Disable FIFO replay + root@am62lxx-evm:~# modetest -M tidss -w 42:ALWAYS_ON_DISPLAY:0 # Allow display pipeline to be powered off + +Once disabled, the display subsystem returns to fetching framebuffers +from DDR and can display dynamic content normally. Any display manager or application can +then take control of the display again. + Memory Usage ************ The following table summarizes the usage of memory in different modes of operation of the device. -+--------+-------------+----------------------+------------------+-----------+-------------------+ -| Domain | Memory | Boot Operation | Normal Operation | DeepSleep | RTC + I/O + DDR | -+========+=============+======================+==================+===========+===================+ -| WKUP | TIFS SRAM | TIFS load (144 KB) | TIFS (144 KB) | TIFS | TIFS (144 KB) | -| | (196 KB) | + Sec ROM (20 KB) | | (144 KB) | | -| | | | | | SEC ROM (20 KB) | -| | | | | | | -| | | | | | TIFS_STUB (32 KB) | -+--------+-------------+----------------------+------------------+-----------+-------------------+ -| WKUP | WKUP PSRAM | Pub ROM (64 KB) | | A53 Stub, | Pub ROM (64 KB) | -| | (512 KB) | or (exclusively) | | TF-A Stub | | -| | | PreBL Stack & | | (64 KB) | | -| | | runtime data (64 KB) | | | | -+--------+-------------+----------------------+------------------+-----------+-------------------+ -| Main | MAIN MSRAM | PreBL (64 KB) | TIFS IPC (24 KB) | TIFS IPC | PreBL (64 KB) | -| | (96 KB) | DDR initialization | | (24 KB) | Non-destructive | -| | | | | | DDR initializtion | -| | | Pub ROM (8 KB) | | | | -| | | | | | TIFS IPC + | -| | | ROM IPC (8 KB) | | | ROM IPC (24 KB) | -| | | | | | | -| | | | | | Pub ROM (8 KB) | -+--------+-------------+----------------------+------------------+-----------+-------------------+ -| Main | DDR | Linux | Linux | Linux | Linux | -| | | | | | | -| | | TF-A | TF-A | TF-A | TF-A | -+--------+-------------+----------------------+------------------+-----------+-------------------+ ++--------+-------------+----------------------+------------------+------------------------+-------------------+ +| Domain | Memory | Boot Operation | Normal Operation | DeepSleep / | RTC + I/O + DDR | +| | | | | DSS plus DeepSleep | | ++========+=============+======================+==================+========================+===================+ +| WKUP | TIFS SRAM | TIFS load (144 KB) | TIFS (144 KB) | TIFS | TIFS (144 KB) | +| | (196 KB) | + Sec ROM (20 KB) | | (144 KB) | | +| | | | | | SEC ROM (20 KB) | +| | | | | | | +| | | | | | TIFS_STUB (32 KB) | ++--------+-------------+----------------------+------------------+------------------------+-------------------+ +| WKUP | WKUP PSRAM | Pub ROM (64 KB) | | A53 Stub, | Pub ROM (64 KB) | +| | (512 KB) | or (exclusively) | | TF-A Stub | | +| | | PreBL Stack & | | (64 KB) | | +| | | runtime data (64 KB) | | | | ++--------+-------------+----------------------+------------------+------------------------+-------------------+ +| Main | MAIN MSRAM | PreBL (64 KB) | TIFS IPC (24 KB) | TIFS IPC | PreBL (64 KB) | +| | (96 KB) | DDR initialization | | (24 KB) | Non-destructive | +| | | | | | DDR initializtion | +| | | Pub ROM (8 KB) | | | | +| | | | | | TIFS IPC + | +| | | ROM IPC (8 KB) | | | ROM IPC (24 KB) | +| | | | | | | +| | | | | | Pub ROM (8 KB) | ++--------+-------------+----------------------+------------------+------------------------+-------------------+ +| Main | DDR | Linux | Linux | Linux | Linux | +| | | | | | | +| | | TF-A | TF-A | TF-A | TF-A | ++--------+-------------+----------------------+------------------+------------------------+-------------------+ diff --git a/source/linux/Foundational_Components/Power_Management/pm_overview.rst b/source/linux/Foundational_Components/Power_Management/pm_overview.rst index 19b0908a8..cc1c041d9 100644 --- a/source/linux/Foundational_Components/Power_Management/pm_overview.rst +++ b/source/linux/Foundational_Components/Power_Management/pm_overview.rst @@ -72,3 +72,4 @@ supported by the Linux kernel. #. RTC Only #. RTC + I/O + DDR #. DeepSleep + #. DSS plus DeepSleep diff --git a/source/linux/Foundational_Components/Power_Management/pm_wakeup_sources.rst b/source/linux/Foundational_Components/Power_Management/pm_wakeup_sources.rst index 66373551f..cefee1ba1 100644 --- a/source/linux/Foundational_Components/Power_Management/pm_wakeup_sources.rst +++ b/source/linux/Foundational_Components/Power_Management/pm_wakeup_sources.rst @@ -53,23 +53,23 @@ valid for given low power modes: .. ifconfig:: CONFIG_part_variant in ('AM62LX') - +------------------------------------------------+-----------+-----------------+----------+ - | Wakeup Source | DeepSleep | RTC + I/O + DDR | RTC Only | - +================================================+===========+=================+==========+ - | Real-Time Clock (RTC) | Yes | Yes | Yes | - +------------------------------------------------+-----------+-----------------+----------+ - | WKUP GPIO | Yes | No | No | - +------------------------------------------------+-----------+-----------------+----------+ - | Main I/O Daisy Chain (Main GPIO and Main UART) | Yes | No | No | - +------------------------------------------------+-----------+-----------------+----------+ - | WKUP I/O Daisy Chain | Yes | Yes | No | - +------------------------------------------------+-----------+-----------------+----------+ - | WKUP UART | Yes | No | No | - +------------------------------------------------+-----------+-----------------+----------+ - | USB Wakeup | Yes | No | No | - +------------------------------------------------+-----------+-----------------+----------+ - | RTC I/O | Yes | Yes | Yes | - +------------------------------------------------+-----------+-----------------+----------+ + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | Wakeup Source | DSS plus DeepSleep | DeepSleep | RTC + I/O + DDR | RTC Only | + +================================================+=====================+============+=================+==========+ + | Real-Time Clock (RTC) | Yes | Yes | Yes | Yes | + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | WKUP GPIO | Yes | Yes | No | No | + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | Main I/O Daisy Chain (Main GPIO and Main UART) | Yes | Yes | No | No | + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | WKUP I/O Daisy Chain | Yes | Yes | Yes | No | + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | WKUP UART | No | Yes | No | No | + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | USB Wakeup | Yes | Yes | No | No | + +------------------------------------------------+---------------------+------------+-----------------+----------+ + | RTC I/O | Yes | Yes | Yes | Yes | + +------------------------------------------------+---------------------+------------+-----------------+----------+ ********************* Real-Time Clock (RTC) From d975ddd105ae30227ed980d7886103888ad1a50e Mon Sep 17 00:00:00 2001 From: Akashdeep Kaur Date: Fri, 3 Jul 2026 14:05:19 +0530 Subject: [PATCH 2/3] feat(linux): add DSS plus Deep Sleep power measurements Add power consumption data for DSS plus Deep Sleep mode. This mode consumes more power than standard Deep Sleep (14.07 mW) due to the active display subsystem with FIFO replay. Signed-off-by: Akashdeep Kaur --- .../AM62LX/linux/Linux_Performance_Guide.rst | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/source/devices/AM62LX/linux/Linux_Performance_Guide.rst b/source/devices/AM62LX/linux/Linux_Performance_Guide.rst index b4e4a0e27..60966d1d1 100644 --- a/source/devices/AM62LX/linux/Linux_Performance_Guide.rst +++ b/source/devices/AM62LX/linux/Linux_Performance_Guide.rst @@ -802,7 +802,19 @@ Power Performance ^^^^^^^^^^^^^^^^^ These are power measurements taken while the device is in various low power modes like -DeepSleep, RTC + I/O + DDR, and RTC Only. +DSS plus DeepSleep, DeepSleep, RTC + I/O + DDR, and RTC Only. + +.. csv-table:: DSS plus DeepSleep Power Performance + :header: "Rail name","Rail voltage(V)","Power (mW)" + + "vdd_core", "0.75", "44.66" + "soc_dvdd_1v8", "1.80", "1.77" + "soc_dvdd_3v3", "3.30", "3.64" + "vdda_1v8", "1.80", "18.82" + "vdd_lpddr4_pmic2", "1.10", "1.06" + "vdd_rtc", "0.75", "0.03" + "vdd_rtc_1v8", "1.80", "0.01" + "Total"," ","69.99" .. csv-table:: DeepSleep Power Performance :header: "Rail name","Rail voltage(V)","Power (mW)" From aea48577021985fc3550fed7ce5e7572c5289972 Mon Sep 17 00:00:00 2001 From: Akashdeep Kaur Date: Fri, 3 Jul 2026 14:05:39 +0530 Subject: [PATCH 3/3] feat(linux): add DSS plus Deep Sleep mode to release notes Add DSS plus Deep Sleep mode to Key Release References section, highlighting the new display subsystem self-refresh capability that allows showing static images during system suspend. Signed-off-by: Akashdeep Kaur --- source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst b/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst index b6a044692..64225d825 100644 --- a/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst +++ b/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst @@ -84,6 +84,7 @@ What's new - Out-of-Box experience based on LVGL (Light and Versatile Graphics Library) - :ref:`TI LVGL Demo - User Guide ` - Security: Post Quantum Cryptography using Module Lattice (ML) Key Encapsulation Mechanism (KEM) or ML-KEM, ML Digital Signature Algorithm (DSA) or ML-DSA, and Stateless Hash-Based (SLH) DSA or SLH-DSA - :ref:`Post Quantum Cryptography ` - Power Management: Active power saving using Standby and Deep Standby Mode - :ref:`Standby Mode ` + - Power Management: Display static image with SoC in low power - :ref:`DSS plus DeepSleep mode ` **Component version:**