diff --git a/source/devices/AM62LX/linux/Linux_Performance_Guide.rst b/source/devices/AM62LX/linux/Linux_Performance_Guide.rst index 647c1df85..fdd305d01 100644 --- a/source/devices/AM62LX/linux/Linux_Performance_Guide.rst +++ b/source/devices/AM62LX/linux/Linux_Performance_Guide.rst @@ -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)" diff --git a/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst b/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst index d80efec34..f3ba0b1f4 100644 --- a/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst +++ b/source/devices/AM62LX/linux/Release_Specific_Release_Notes.rst @@ -83,6 +83,7 @@ What's new - U-Boot: :ref:`Key writer lite Programming ` - Kernel: :ref:`DTHEv2 Crypto Accelerator ` - RT Kernel : Real-Time Linux Interrupt Latency numbers here - :ref:`RT Interrupt Latencies ` + - Power Management: DSS plus Deep Sleep mode - Display subsystem self-refresh with static image during suspend - :ref:`Low Power Modes ` - Support for Wifi with M2 CC33xx cards - :ref:`How to Enable M.2-CC33xx in Linux ` - 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 ` 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 f155e07ec..99b6255ba 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 Only Plus DDR #. Deep Sleep +#. DSS plus Deep Sleep RTC Only ******** @@ -172,36 +173,188 @@ In order to enter DeepSleep, [ 88.649913] PM: suspend exit root@am62lxx-evm:~# +DSS plus Deep Sleep +******************* + +DSS plus Deep Sleep is a low-power mode where the Display Subsystem (DSS) is kept on to display +a static image while the rest of the system enters Deep Sleep. This mode is useful for +applications that need to maintain 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 is retained 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 to be enabled together: + +**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, your static +image must fit within this buffer. The size is calculated as: + + **Frame Size = Width × Height × Bytes-per-pixel** + +For RGB format (3 bytes per pixel), this means: + + **Width × Height × 3 ≤ 20,480 bytes** + +For example, a 50×50 RGB image requires 50 × 50 × 3 = 7,500 bytes, which fits comfortably +within the limit. If your 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 powered off even if self-refresh is enabled. Together with self-refresh, +it ensures the static frame remains visible throughout the suspend period. + +Using both properties together enables DSS plus Deep Sleep mode: the display stays on showing +a static frame from internal memory while the rest of the system is suspended. + +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 may be actively managing the display: + +.. code-block:: console + + root@am62lxx-evm:~# systemctl stop emptty.service + +Next, enable the DSS self-refresh feature. This configures the display controller to fetch +the framebuffer from its internal memory instead of accessing DDR. The property ID 35 +corresponds to the SELF_REFRESH plane property: + +.. code-block:: console + + root@am62lxx-evm:~# modetest -M tidss -w 35:SELF_REFRESH:1 # 35 is the SELF_REFRESH plane property ID + opened device `TI Keystone DSS` on driver `tidss` (version 1.0.0 at 0) + +Display a static image on the screen that will remain visible during suspend. This example +uses GStreamer to display a test pattern: + +.. 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. +Enable the ALWAYS_ON_DISPLAY property to keep the display pipeline powered during suspend. +The property ID 42 corresponds to the ALWAYS_ON_DISPLAY CRTC property: + +.. code-block:: console + + root@am62lxx-evm:~# modetest -M tidss -w 42:ALWAYS_ON_DISPLAY:1 # 42 is the ALWAYS_ON_DISPLAY CRTC property ID + +Configure the system to use s2idle suspend mode, which allows the display to remain powered: + +.. code-block:: console + + root@am62lxx-evm:~# echo s2idle > /sys/power/mem_sleep + +Now the SoC can be suspended 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:~# + +Resuming from DSS plus Deep Sleep +================================= + +After the system resumes from DSS plus Deep Sleep, the static frame continues to be displayed +from the FIFO. The display does **not** automatically transition back to dynamic content. +To return to normal display operation, you must manually 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 these properties are 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 | ++--------+-------------+----------------------+------------------+-------------------------+-------------------+ diff --git a/source/linux/Foundational_Components/Power_Management/pm_overview.rst b/source/linux/Foundational_Components/Power_Management/pm_overview.rst index a24ec0102..0d447c5bd 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 Only Plus DDR #. Deep Sleep + #. DSS plus Deep Sleep 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 ee938eaee..210b7bf0a 100644 --- a/source/linux/Foundational_Components/Power_Management/pm_wakeup_sources.rst +++ b/source/linux/Foundational_Components/Power_Management/pm_wakeup_sources.rst @@ -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 | Yes | Yes | No | No | + +------------------------------------------------+---------------------+------------+----------------+----------+ + | USB Wakeup | Yes | Yes | No | No | + +------------------------------------------------+---------------------+------------+----------------+----------+ + | RTC Ext Pin | Yes | Yes | Yes | Yes | + +------------------------------------------------+---------------------+------------+----------------+----------+ ********************* Real-Time Clock (RTC)