]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Skip HDR metadata update when Smart Power OLED enabled
authorIan Chen <ian.chen@amd.com>
Wed, 15 Apr 2026 03:25:22 +0000 (11:25 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 5 May 2026 13:56:52 +0000 (09:56 -0400)
[Why & How]
While smart power oled is enabled,
the infopacket contents are tied to the frame histogram,
so it does not need driver side to update the hdr metadata.

Reviewed-by: Aric Cyr <aric.cyr@amd.com>
Reviewed-by: Anthony Koo <anthony.koo@amd.com>
Signed-off-by: Ian Chen <ian.chen@amd.com>
Signed-off-by: James Lin <pinglei.lin@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c
drivers/gpu/drm/amd/display/dc/dc_stream.h
drivers/gpu/drm/amd/display/dc/dio/dcn30/dcn30_dio_stream_encoder.c
drivers/gpu/drm/amd/display/dc/hpo/dcn31/dcn31_hpo_dp_stream_encoder.c
drivers/gpu/drm/amd/display/dc/hwss/dcn31/dcn31_hwseq.c
drivers/gpu/drm/amd/display/dc/inc/hw/stream_encoder.h

index dbce5291109ade864a53c94a7696aed2986b64fe..77bbaf414082c67988c1c06e24f0ca9d44451076 100644 (file)
@@ -6533,6 +6533,10 @@ bool dc_smart_power_oled_enable(const struct dc_link *link, bool enable, uint16_
        // send cmd
        status = dc_wake_and_execute_dmub_cmd(dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT);
 
+       // Update firmware_controlled_hdr_info_packet state on successful command execution
+       if (status && pipe_ctx)
+               pipe_ctx->stream->firmware_controlled_hdr_info_packet = enable;
+
        return status;
 }
 
index 25552f21faf3a4d1f2667948ae716a87420a9d92..32f7c7c076c85c73f9cb687a53fb8a2a91203b6b 100644 (file)
@@ -304,6 +304,7 @@ struct dc_stream_state {
        enum dc_drr_trigger_mode drr_trigger_mode;
 
        struct dc_update_scratch_space *update_scratch;
+       bool firmware_controlled_hdr_info_packet;
 };
 
 #define ABM_LEVEL_IMMEDIATE_DISABLE 255
index e93be7b6d9b03bbc9dea411eb20f3fdc1d99a277..c14fb51c261165875e9b0231fd29a87d549f008d 100644 (file)
@@ -470,7 +470,11 @@ void enc3_stream_encoder_update_dp_info_packets(
                                &info_frame->spd,
                                true);
        }
-       if (info_frame->hdrsmd.valid) {
+       /* While smart power oled is enabled DMUB is scanning the contents of each frame
+        * and updating the HDR infopacket contents. Therefore we transition the infopacket
+        * programming control to DMUB while Smart Power OLED is enabled.
+        */
+       if (info_frame->hdrsmd.valid && !info_frame->firmware_controlled_hdr_info_packet) {
                enc->vpg->funcs->update_generic_info_packet(
                                enc->vpg,
                                3,  /* packetIndex */
index 92ed130aeaec970f4bde22d982af951799ee05af..79d6ab8ed71c44be224e52069c7daebf82e8e87a 100644 (file)
@@ -468,7 +468,7 @@ static void dcn31_hpo_dp_stream_enc_update_dp_info_packets(
                                &info_frame->spd,
                                true);
 
-       if (info_frame->hdrsmd.valid)
+       if (info_frame->hdrsmd.valid && !info_frame->firmware_controlled_hdr_info_packet)
                enc->vpg->funcs->update_generic_info_packet(
                                enc->vpg,
                                3,  /* packetIndex */
index b4afb2bc4493442cccdd4ff3a9cc068a6b51d3cc..5a90ff83b65ce7b3dd0dfd88859bc96f922a9ce7 100644 (file)
@@ -399,6 +399,9 @@ void dcn31_update_info_frame(struct pipe_ctx *pipe_ctx)
                                pipe_ctx->stream_res.hpo_dp_stream_enc,
                                &pipe_ctx->stream_res.encoder_info_frame);
 
+               pipe_ctx->stream_res.encoder_info_frame.firmware_controlled_hdr_info_packet
+                       = pipe_ctx->stream->firmware_controlled_hdr_info_packet;
+
                pipe_ctx->stream_res.hpo_dp_stream_enc->funcs->update_dp_info_packets(
                                pipe_ctx->stream_res.hpo_dp_stream_enc,
                                &pipe_ctx->stream_res.encoder_info_frame);
@@ -409,6 +412,9 @@ void dcn31_update_info_frame(struct pipe_ctx *pipe_ctx)
                                pipe_ctx->stream_res.stream_enc,
                                &pipe_ctx->stream_res.encoder_info_frame);
 
+               pipe_ctx->stream_res.encoder_info_frame.firmware_controlled_hdr_info_packet
+                       = pipe_ctx->stream->firmware_controlled_hdr_info_packet;
+
                pipe_ctx->stream_res.stream_enc->funcs->update_dp_info_packets(
                        pipe_ctx->stream_res.stream_enc,
                        &pipe_ctx->stream_res.encoder_info_frame);
index 27f950ae45ee51bc3687635b02ca25a3591bfd97..a9bf960dacbceef11dbb0d9a8dde5ccccb937ef4 100644 (file)
@@ -93,6 +93,7 @@ struct encoder_info_frame {
        /* Adaptive Sync SDP*/
        struct dc_info_packet adaptive_sync;
        struct enc_sdp_line_num sdp_line_num;
+       bool firmware_controlled_hdr_info_packet;
 };
 
 struct encoder_unblank_param {