diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2522-drm-amd-display-audio-dynamic-resource-acquired-rela.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2522-drm-amd-display-audio-dynamic-resource-acquired-rela.patch | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2522-drm-amd-display-audio-dynamic-resource-acquired-rela.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2522-drm-amd-display-audio-dynamic-resource-acquired-rela.patch new file mode 100644 index 00000000..507c0c4b --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2522-drm-amd-display-audio-dynamic-resource-acquired-rela.patch @@ -0,0 +1,241 @@ +From 831c2f115765ce04b00c0618654d83800b2c2964 Mon Sep 17 00:00:00 2001 +From: Charlene Liu <charlene.liu@amd.com> +Date: Wed, 27 Sep 2017 23:23:16 -0400 +Subject: [PATCH 2522/4131] drm/amd/display: audio dynamic resource acquired + related + +Signed-off-by: Charlene Liu <charlene.liu@amd.com> +Reviewed-by: Anthony Koo <Anthony.Koo@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 4 ++-- + drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | 2 +- + drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 24 ++++++++++++++++------ + drivers/gpu/drm/amd/display/dc/dc.h | 1 + + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 12 +++++++++-- + .../amd/display/dc/dce110/dce110_hw_sequencer.h | 2 +- + .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 2 +- + drivers/gpu/drm/amd/display/dc/inc/core_types.h | 7 ++++++- + drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | 3 ++- + drivers/gpu/drm/amd/display/dc/inc/resource.h | 5 +++++ + 10 files changed, 47 insertions(+), 15 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index e414e47..2d59f77 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -2323,14 +2323,14 @@ void core_link_enable_stream( + allocate_mst_payload(pipe_ctx); + } + +-void core_link_disable_stream(struct pipe_ctx *pipe_ctx) ++void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option) + { + struct dc *core_dc = pipe_ctx->stream->ctx->dc; + + if (pipe_ctx->stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) + deallocate_mst_payload(pipe_ctx); + +- core_dc->hwss.disable_stream(pipe_ctx); ++ core_dc->hwss.disable_stream(pipe_ctx, option); + + disable_link(pipe_ctx->stream->sink->link, pipe_ctx->stream->signal); + } +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c +index 34b6d1c..9a33b47 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c +@@ -282,7 +282,7 @@ void dp_retrain_link_dp_test(struct dc_link *link, + + dp_receiver_power_ctrl(link, false); + +- link->dc->hwss.disable_stream(&pipes[i]); ++ link->dc->hwss.disable_stream(&pipes[i], KEEP_ACQUIRED_RESOURCE); + + link->link_enc->funcs->disable_output( + link->link_enc, +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +index bbfec7c..68c6132 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +@@ -242,7 +242,10 @@ bool resource_construct( + pool->stream_enc_count++; + } + } +- ++ dc->caps.dynamic_audio = false; ++ if (pool->audio_count < pool->stream_enc_count) { ++ dc->caps.dynamic_audio = true; ++ } + for (i = 0; i < num_virtual_links; i++) { + pool->stream_enc[pool->stream_enc_count] = + virtual_stream_encoder_create( +@@ -1330,7 +1333,7 @@ static void update_stream_engine_usage( + } + + /* TODO: release audio object */ +-static void update_audio_usage( ++void update_audio_usage( + struct resource_context *res_ctx, + const struct resource_pool *pool, + struct audio *audio, +@@ -1414,12 +1417,21 @@ static struct audio *find_first_free_audio( + const struct resource_pool *pool) + { + int i; +- for (i = 0; i < pool->audio_count; i++) { +- if (res_ctx->is_audio_acquired[i] == false) { +- return pool->audios[i]; ++ if (pool->audio_count >= pool->stream_enc_count) { ++ for (i = 0; i < pool->audio_count; i++) { ++ if ((res_ctx->is_audio_acquired[i] == false) && (res_ctx->is_stream_enc_acquired[i] == true)) { ++ /*we have enough audio endpoint, no need to do dynamic distribution*/ ++ return pool->audios[i]; ++ } + } +- } ++ } else { /*first come first serve*/ ++ for (i = 0; i < pool->audio_count; i++) { ++ if (res_ctx->is_audio_acquired[i] == false) { + ++ return pool->audios[i]; ++ } ++ } ++ } + return 0; + } + +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index e26dc71..fa9dda2 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -58,6 +58,7 @@ struct dc_caps { + uint32_t i2c_speed_in_khz; + unsigned int max_cursor_size; + bool dcc_const_color; ++ bool dynamic_audio; + }; + + struct dc_dcc_surface_param { +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +index 3ced84c..40a46f1 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +@@ -985,10 +985,11 @@ void hwss_edp_backlight_control( + link_transmitter_control(link->dc->ctx->dc_bios, &cntl); + } + +-void dce110_disable_stream(struct pipe_ctx *pipe_ctx) ++void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option) + { + struct dc_stream_state *stream = pipe_ctx->stream; + struct dc_link *link = stream->sink->link; ++ struct dc *dc = pipe_ctx->stream->ctx->dc; + + if (pipe_ctx->stream_res.audio) { + pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio); +@@ -999,6 +1000,13 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx) + else + pipe_ctx->stream_res.stream_enc->funcs->hdmi_audio_disable( + pipe_ctx->stream_res.stream_enc); ++ /*don't free audio if it is from retrain or internal disable stream*/ ++ if (option == FREE_ACQUIRED_RESOURCE && dc->caps.dynamic_audio == true) { ++ /*we have to dynamic arbitrate the audio endpoints*/ ++ pipe_ctx->stream_res.audio = NULL; ++ /*we free the resource, need reset is_audio_acquired*/ ++ update_audio_usage(&dc->current_state->res_ctx, dc->res_pool, pipe_ctx->stream_res.audio, false); ++ } + + /* TODO: notify audio driver for if audio modes list changed + * add audio mode list change flag */ +@@ -1866,7 +1874,7 @@ static void dce110_reset_hw_ctx_wrap( + pipe_need_reprogram(pipe_ctx_old, pipe_ctx)) { + struct clock_source *old_clk = pipe_ctx_old->clock_source; + +- core_link_disable_stream(pipe_ctx_old); ++ core_link_disable_stream(pipe_ctx_old, FREE_ACQUIRED_RESOURCE); + pipe_ctx_old->stream_res.tg->funcs->set_blank(pipe_ctx_old->stream_res.tg, true); + if (!hwss_wait_for_blank_complete(pipe_ctx_old->stream_res.tg)) { + dm_error("DC: failed to blank crtc!\n"); +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h +index a1e964a..4d72bb9 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.h +@@ -47,7 +47,7 @@ void dce110_set_displaymarks( + + void dce110_enable_stream(struct pipe_ctx *pipe_ctx); + +-void dce110_disable_stream(struct pipe_ctx *pipe_ctx); ++void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option); + + void dce110_unblank_stream(struct pipe_ctx *pipe_ctx, + struct dc_link_settings *link_settings); +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index 84d9d20..072c481 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -1025,7 +1025,7 @@ static void reset_back_end_for_pipe( + * which is used by otg. Move disable_link after disable_crtc + */ + if (!IS_FPGA_MAXIMUS_DC(dc->ctx->dce_environment)) +- core_link_disable_stream(pipe_ctx); ++ core_link_disable_stream(pipe_ctx, FREE_ACQUIRED_RESOURCE); + + /* by upper caller loop, parent pipe: pipe0, will be reset last. + * back end share by all pipes and will be disable only when disable +diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +index ff23f26..5230ddd 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +@@ -58,6 +58,11 @@ struct link_init_data { + TODO: remove it when DC is complete. */ + }; + ++enum { ++ FREE_ACQUIRED_RESOURCE = 0, ++ KEEP_ACQUIRED_RESOURCE = 1, ++}; ++ + struct dc_link *link_create(const struct link_init_data *init_params); + void link_destroy(struct dc_link **link); + +@@ -72,7 +77,7 @@ void core_link_enable_stream( + struct dc_state *state, + struct pipe_ctx *pipe_ctx); + +-void core_link_disable_stream(struct pipe_ctx *pipe_ctx); ++void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option); + + void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable); + /********** DAL Core*********************/ +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h +index bf3ab5d..8734689 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h +@@ -134,7 +134,8 @@ struct hw_sequencer_funcs { + + void (*enable_stream)(struct pipe_ctx *pipe_ctx); + +- void (*disable_stream)(struct pipe_ctx *pipe_ctx); ++ void (*disable_stream)(struct pipe_ctx *pipe_ctx, ++ int option); + + void (*unblank_stream)(struct pipe_ctx *pipe_ctx, + struct dc_link_settings *link_settings); +diff --git a/drivers/gpu/drm/amd/display/dc/inc/resource.h b/drivers/gpu/drm/amd/display/dc/inc/resource.h +index 614bb69..5467332f 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/resource.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/resource.h +@@ -164,4 +164,9 @@ bool pipe_need_reprogram( + void resource_build_bit_depth_reduction_params(struct dc_stream_state *stream, + struct bit_depth_reduction_params *fmt_bit_depth); + ++void update_audio_usage( ++ struct resource_context *res_ctx, ++ const struct resource_pool *pool, ++ struct audio *audio, ++ bool acquired); + #endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_RESOURCE_H_ */ +-- +2.7.4 + |