Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion source/devices/AM62LX/linux/Linux_Performance_Guide.rst
Original file line number Diff line number Diff line change
Expand Up @@ -854,7 +854,19 @@ Power Performance
^^^^^^^^^^^^^^^^^

These are power measurements taken while the device is in various low power modes like
Deep Sleep, RTC Only + DDR, and RTC Only.
DSS plus Deep Sleep, Deep Sleep, RTC Only + DDR, and RTC Only.

.. csv-table:: DSS plus Deep Sleep 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:: Deep Sleep Power Performance
:header: "Rail name","Rail voltage(V)","Power (mW)"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ What's new
- U-Boot: :ref:`Key writer lite Programming <key-writer-lite-label>`
- Kernel: :ref:`DTHEv2 Crypto Accelerator <DTHEv2-Crypto-Accelerator>`
- RT Kernel : Real-Time Linux Interrupt Latency numbers here - :ref:`RT Interrupt Latencies <RT-linux-performance>`
- Power Management: DSS plus Deep Sleep mode - Display subsystem self-refresh with static image during suspend - :ref:`Low Power Modes <lpm_modes>`
- Support for Wifi with M2 CC33xx cards - :ref:`How to Enable M.2-CC33xx in Linux <enable_m2cc3301>`
- Out-of-Box experience based on LVGL (Light and Versatile Graphics Library) - :ref:`TI LVGL Demo - User Guide <TI-LVGL-Demo-User-Guide-label>`
- 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 <post_quantum_cryptography>`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ to highest power consumption):
#. RTC Only
#. RTC Only Plus DDR
#. Deep Sleep
#. DSS plus Deep Sleep
Comment thread
akashdeep-ti marked this conversation as resolved.

RTC Only
********
Expand Down Expand Up @@ -172,36 +173,185 @@ In order to enter DeepSleep,
[ 88.649913] PM: suspend exit
root@am62lxx-evm:~#

DSS plus Deep Sleep

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Always On Display?

@akashdeep-ti akashdeep-ti Jul 15, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This cannot be renamed as it is the same terminology used in TIFS documentation also. Also, deep sleep needs to be there in name to make it easily understandable

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIFS Documentation released already ? Hmm i understand deep sleep is more understandable from TI POV but externally from user pov maybe always on display sounds more familiar. Documentation can mention that it is same as deep sleep albeit with display ON.

*******************

DSS plus Deep Sleep is a low-power mode where the Display Subsystem (DSS) is **ON** to display
a static image while the rest of the system enters Deep Sleep. 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 Deep Sleep mode, the system state stays in RAM with DDR in self-refresh,
similar to standard Deep Sleep. 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 Deep Sleep 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 Deep Sleep Mode
=================================

Entering DSS plus Deep Sleep 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.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mention that user can press ctrl-c and pipeline will terminate

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added

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

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think better to try show a more relevant use-case similar to Active Display and Low Power Display use-case we showed in TIEM.

For e.g.

  1. User power on the EVM run HMI Application (this should be present and run by default in procSDK drop)
  2. Now user want to suspend the system and show a static logo,
    we set dss to self refresh and we play a command to show a static logo i.e one frame only. (we can play ti logo here I think its present in sdcard)
  3. Then we set always on display and go to dss plus deep sleep mode.
  4. This shows the static logo.
  5. Then we resume back reset the drm props and relaunch the HMI Application.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be a separate how to guide too i think if we want to keep this one simple.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IMO for the SDK docs we want as simple as possible so users can understand how to use it easily. However, if the example you wrote is simple to show in the docs, it would probably be the better example to use.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also agree, we can keep it as a separate guide later. Lets keep this section simple

[ 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 Deep Sleep, 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 | Deep Sleep | RTC Only + 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 | Deep Sleep / | RTC Only + DDR |
| | | | | DSS plus Deep Sleep | |
+========+=============+======================+==================+=========================+===================+
| 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 |
+--------+-------------+----------------------+------------------+-------------------------+-------------------+
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,4 @@ supported by the Linux kernel.
#. RTC Only
#. RTC Only Plus DDR
#. Deep Sleep
#. DSS plus Deep Sleep
Comment thread
akashdeep-ti marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -53,21 +53,21 @@ valid for given low power modes:

.. ifconfig:: CONFIG_part_variant in ('AM62LX')

+------------------------------------------------+------------+----------------+----------+
| Wakeup Source | Deep Sleep | RTC Only + 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 UART | Yes | No | No |
+------------------------------------------------+------------+----------------+----------+
| USB Wakeup | Yes | No | No |
+------------------------------------------------+------------+----------------+----------+
| RTC Ext Pin | Yes | Yes | Yes |
+------------------------------------------------+------------+----------------+----------+
+------------------------------------------------+---------------------+------------+----------------+----------+
| Wakeup Source | DSS plus Deep Sleep | Deep Sleep | RTC Only + 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 UART | No | Yes | No | No |
+------------------------------------------------+---------------------+------------+----------------+----------+
| USB Wakeup | Yes | Yes | No | No |
+------------------------------------------------+---------------------+------------+----------------+----------+
| RTC Ext Pin | Yes | Yes | Yes | Yes |
+------------------------------------------------+---------------------+------------+----------------+----------+

*********************
Real-Time Clock (RTC)
Expand Down
Loading