diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0988-drm-amd-dal-Fix-clock-source-remapping-issue-when-DR.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0988-drm-amd-dal-Fix-clock-source-remapping-issue-when-DR.patch | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/common/recipes-kernel/linux/files/0988-drm-amd-dal-Fix-clock-source-remapping-issue-when-DR.patch b/common/recipes-kernel/linux/files/0988-drm-amd-dal-Fix-clock-source-remapping-issue-when-DR.patch deleted file mode 100644 index adc167be..00000000 --- a/common/recipes-kernel/linux/files/0988-drm-amd-dal-Fix-clock-source-remapping-issue-when-DR.patch +++ /dev/null @@ -1,201 +0,0 @@ -From 21ae403b786fa9b0d156f58ba2a058d72364a537 Mon Sep 17 00:00:00 2001 -From: Jordan Lazare <Jordan.Lazare@amd.com> -Date: Tue, 29 Mar 2016 15:33:52 -0400 -Subject: [PATCH 0988/1110] drm/amd/dal: Fix clock source remapping issue when - DRM swaps crtcs - -When disabling and enabling monitors in a specific order, eventually we'll get -to a point where the clock sources will be swapped. - -BIOS appears to have an optimization where the updated phy on enable_output -doesn't take affect if it hasn't been disabled. - -To fix this, reset the pipe if the clock sources change. - -Signed-off-by: Jordan Lazare <Jordan.Lazare@amd.com> -Acked-by: Harry Wentland <harry.wentland@amd.com> -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> ---- - drivers/gpu/drm/amd/dal/dc/core/dc.c | 5 +- - .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 114 +++++++++++---------- - drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h | 2 - - 3 files changed, 61 insertions(+), 60 deletions(-) - -diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c -index da50d25..7d234cf 100644 ---- a/drivers/gpu/drm/amd/dal/dc/core/dc.c -+++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c -@@ -740,10 +740,7 @@ bool dc_commit_targets( - } - - if (result == DC_OK) { -- core_dc->hwss.reset_hw_ctx(core_dc, context); -- -- if (context->target_count > 0) -- result = core_dc->hwss.apply_ctx_to_hw(core_dc, context); -+ result = core_dc->hwss.apply_ctx_to_hw(core_dc, context); - } - - for (i = 0; i < context->target_count; i++) { -diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c -index a21fcbd..fa282c0 100644 ---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c -@@ -1224,6 +1224,43 @@ static void switch_dp_clock_sources( - * Public functions - ******************************************************************************/ - -+ -+static void reset_single_pipe_hw_ctx( -+ const struct core_dc *dc, -+ struct pipe_ctx *pipe_ctx, -+ struct validate_context *context) -+{ -+ struct dc_bios *dcb; -+ -+ if (pipe_ctx->pipe_idx == DCE110_UNDERLAY_IDX) -+ return; -+ -+ dcb = dal_adapter_service_get_bios_parser( -+ context->res_ctx.pool.adapter_srv); -+ if (pipe_ctx->audio) { -+ dal_audio_disable_output(pipe_ctx->audio, -+ pipe_ctx->stream_enc->id, -+ pipe_ctx->signal); -+ pipe_ctx->audio = NULL; -+ } -+ -+ core_link_disable_stream(pipe_ctx); -+ if (!pipe_ctx->tg->funcs->set_blank(pipe_ctx->tg, true)) { -+ dm_error("DC: failed to blank crtc!\n"); -+ BREAK_TO_DEBUGGER(); -+ } -+ pipe_ctx->tg->funcs->disable_crtc(pipe_ctx->tg); -+ pipe_ctx->mi->funcs->free_mem_input( -+ pipe_ctx->mi, context->target_count); -+ pipe_ctx->xfm->funcs->transform_set_scaler_bypass(pipe_ctx->xfm); -+ resource_unreference_clock_source(&context->res_ctx, pipe_ctx->clock_source); -+ dc->hwss.enable_display_power_gating( -+ pipe_ctx->stream->ctx, pipe_ctx->pipe_idx, dcb, -+ PIPE_GATING_CONTROL_ENABLE); -+ -+ pipe_ctx->stream = NULL; -+} -+ - /*TODO: const validate_context*/ - static enum dc_status apply_ctx_to_hw( - struct core_dc *dc, -@@ -1232,6 +1269,29 @@ static enum dc_status apply_ctx_to_hw( - enum dc_status status; - uint8_t i; - -+ /* Reset old context */ -+ /* look up the targets that have been removed since last commit */ -+ for (i = 0; i < MAX_PIPES; i++) { -+ struct pipe_ctx *pipe_ctx_old = -+ &dc->current_context.res_ctx.pipe_ctx[i]; -+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i]; -+ -+ /* Note: We need to disable output if clock sources change, -+ * since bios does optimization and doesn't apply if changing -+ * PHY when not already disabled. -+ */ -+ if (pipe_ctx_old->stream && pipe_ctx_old->stream != pipe_ctx->stream) -+ reset_single_pipe_hw_ctx( -+ dc, pipe_ctx_old, &dc->current_context); -+ else if (pipe_ctx_old->clock_source != pipe_ctx->clock_source) -+ core_link_disable_stream(pipe_ctx); -+ } -+ -+ /* Skip applying if no targets */ -+ if (context->target_count <= 0) -+ return DC_OK; -+ -+ /* Apply new context */ - update_bios_scratch_critical_state(context->res_ctx.pool.adapter_srv, - true); - -@@ -1438,59 +1498,6 @@ static void update_plane_addrs(struct core_dc *dc, struct resource_context *res_ - } - } - --static void reset_single_pipe_hw_ctx( -- const struct core_dc *dc, -- struct pipe_ctx *pipe_ctx, -- struct validate_context *context) --{ -- struct dc_bios *dcb; -- -- if (pipe_ctx->pipe_idx == DCE110_UNDERLAY_IDX) -- return; -- -- dcb = dal_adapter_service_get_bios_parser( -- context->res_ctx.pool.adapter_srv); -- if (pipe_ctx->audio) { -- dal_audio_disable_output(pipe_ctx->audio, -- pipe_ctx->stream_enc->id, -- pipe_ctx->signal); -- pipe_ctx->audio = NULL; -- } -- -- core_link_disable_stream(pipe_ctx); -- if (!pipe_ctx->tg->funcs->set_blank(pipe_ctx->tg, true)) { -- dm_error("DC: failed to blank crtc!\n"); -- BREAK_TO_DEBUGGER(); -- } -- pipe_ctx->tg->funcs->disable_crtc(pipe_ctx->tg); -- pipe_ctx->mi->funcs->free_mem_input( -- pipe_ctx->mi, context->target_count); -- pipe_ctx->xfm->funcs->transform_set_scaler_bypass(pipe_ctx->xfm); -- resource_unreference_clock_source(&context->res_ctx, pipe_ctx->clock_source); -- dc->hwss.enable_display_power_gating( -- pipe_ctx->stream->ctx, pipe_ctx->pipe_idx, dcb, -- PIPE_GATING_CONTROL_ENABLE); -- -- pipe_ctx->stream = NULL; --} -- --static void reset_hw_ctx( -- struct core_dc *dc, -- struct validate_context *new_context) --{ -- uint8_t i; -- -- /* look up the targets that have been removed since last commit */ -- for (i = 0; i < MAX_PIPES; i++) { -- struct pipe_ctx *pipe_ctx_old = -- &dc->current_context.res_ctx.pipe_ctx[i]; -- struct pipe_ctx *pipe_ctx = &new_context->res_ctx.pipe_ctx[i]; -- -- if (pipe_ctx_old->stream && !pipe_ctx->stream) -- reset_single_pipe_hw_ctx( -- dc, pipe_ctx_old, &dc->current_context); -- } --} - - static void power_down(struct core_dc *dc) - { -@@ -1643,7 +1650,6 @@ static void init_hw(struct core_dc *dc) - static const struct hw_sequencer_funcs dce110_funcs = { - .init_hw = init_hw, - .apply_ctx_to_hw = apply_ctx_to_hw, -- .reset_hw_ctx = reset_hw_ctx, - .set_plane_config = set_plane_config, - .update_plane_addrs = update_plane_addrs, - .set_gamma_correction = set_gamma_ramp, -diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h -index d801a60..a38c6f5 100644 ---- a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h -+++ b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h -@@ -42,8 +42,6 @@ struct hw_sequencer_funcs { - enum dc_status (*apply_ctx_to_hw)( - struct core_dc *dc, struct validate_context *context); - -- void (*reset_hw_ctx)(struct core_dc *dc, struct validate_context *context); -- - void (*set_plane_config)( - const struct core_dc *dc, - struct pipe_ctx *pipe_ctx, --- -2.7.4 - |