mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-24 04:18:55 -04:00
drm/amd/display: Skip HDR metadata update when Smart Power OLED enabled
[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>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user