-
Notifications
You must be signed in to change notification settings - Fork 85
Dss ds docs #732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Dss ds docs #732
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -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,185 @@ In order to enter DeepSleep, | |
| [ 88.649913] PM: suspend exit | ||
| root@am62lxx-evm:~# | ||
|
|
||
| DSS plus Deep Sleep | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Always On Display?
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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. | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Mention that user can press ctrl-c and pipeline will terminate
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | | ||
| +--------+-------------+----------------------+------------------+-------------------------+-------------------+ | ||
Uh oh!
There was an error while loading. Please reload this page.