diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0882-drm-amd-dal-Move-hw_init-into-hwss.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0882-drm-amd-dal-Move-hw_init-into-hwss.patch | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0882-drm-amd-dal-Move-hw_init-into-hwss.patch b/common/recipes-kernel/linux/files/0882-drm-amd-dal-Move-hw_init-into-hwss.patch new file mode 100644 index 00000000..13174eb2 --- /dev/null +++ b/common/recipes-kernel/linux/files/0882-drm-amd-dal-Move-hw_init-into-hwss.patch @@ -0,0 +1,291 @@ +From 8bea7ee56f14f0cfcc25373b35cc5907a1f03f79 Mon Sep 17 00:00:00 2001 +From: Jordan Lazare <Jordan.Lazare@amd.com> +Date: Mon, 7 Mar 2016 13:53:12 -0500 +Subject: [PATCH 0882/1110] drm/amd/dal: Move hw_init into hwss + +Also move hwss creation to the bottom of dc_resource + +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 | 81 ++++------------------ + .../gpu/drm/amd/dal/dc/dce100/dce100_resource.c | 4 ++ + .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 57 ++++++++++++++- + .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c | 4 ++ + drivers/gpu/drm/amd/dal/dc/dce80/dce80_resource.c | 4 ++ + drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h | 2 + + 6 files changed, 82 insertions(+), 70 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c +index 3a6d0c1..f6eccbd 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c +@@ -163,59 +163,7 @@ failed_alloc: + return false; + } + +-static void init_hw(struct core_dc *dc) +-{ +- int i; +- struct dc_bios *bp; +- struct transform *xfm; +- +- bp = dc->ctx->dc_bios; +- for (i = 0; i < dc->res_pool.pipe_count; i++) { +- xfm = dc->res_pool.transforms[i]; +- +- dc->hwss.enable_display_power_gating( +- dc->ctx, i, bp, +- PIPE_GATING_CONTROL_INIT); +- dc->hwss.enable_display_power_gating( +- dc->ctx, i, bp, +- PIPE_GATING_CONTROL_DISABLE); +- xfm->funcs->transform_power_up(xfm); +- dc->hwss.enable_display_pipe_clock_gating( +- dc->ctx, +- true); +- } +- +- dc->hwss.clock_gating_power_up(dc->ctx, false); +- bp->funcs->power_up(bp); +- /***************************************/ + +- for (i = 0; i < dc->link_count; i++) { +- /****************************************/ +- /* Power up AND update implementation according to the +- * required signal (which may be different from the +- * default signal on connector). */ +- struct core_link *link = dc->links[i]; +- link->link_enc->funcs->hw_init(link->link_enc); +- } +- +- for (i = 0; i < dc->res_pool.pipe_count; i++) { +- struct timing_generator *tg = dc->res_pool.timing_generators[i]; +- +- tg->funcs->disable_vga(tg); +- +- /* Blank controller using driver code instead of +- * command table. */ +- tg->funcs->set_blank(tg, true); +- } +- +- for(i = 0; i < dc->res_pool.audio_count; i++) { +- struct audio *audio = dc->res_pool.audios[i]; +- +- if (dal_audio_power_up(audio) != AUDIO_RESULT_OK) +- dm_error("Failed audio power up!\n"); +- } +- +-} + + static struct adapter_service *create_as( + const struct dc_init_data *init, +@@ -351,10 +299,6 @@ static bool construct(struct core_dc *dc, const struct dc_init_data *init_params + + dc_ctx->dc_bios = dal_adapter_service_get_bios_parser(as); + +- /* Create hardware sequencer */ +- if (!dc_construct_hw_sequencer(as, dc)) +- goto hwss_fail; +- + if (!dc_construct_resource_pool( + as, dc, init_params->num_virtual_links, dc_version)) + goto construct_resource_fail; +@@ -388,7 +332,6 @@ create_links_fail: + as_fail: + dal_logger_destroy(&dc_ctx->logger); + logger_fail: +-hwss_fail: + dm_free(dc_ctx); + ctx_fail: + return false; +@@ -480,31 +423,31 @@ struct dc *dc_create(const struct dc_init_data *init_params) + .driver_context = init_params->driver, + .cgs_device = init_params->cgs_device + }; +- struct core_dc *dc = dm_alloc(sizeof(*dc)); ++ struct core_dc *core_dc = dm_alloc(sizeof(*core_dc)); + +- if (NULL == dc) ++ if (NULL == core_dc) + goto alloc_fail; + +- ctx.dc = &dc->public; +- if (false == construct(dc, init_params)) ++ ctx.dc = &core_dc->public; ++ if (false == construct(core_dc, init_params)) + goto construct_fail; + + /*TODO: separate HW and SW initialization*/ +- init_hw(dc); ++ core_dc->hwss.init_hw(core_dc); + +- dc->public.caps.max_targets = dc->res_pool.pipe_count; +- dc->public.caps.max_links = dc->link_count; +- dc->public.caps.max_audios = dc->res_pool.audio_count; ++ core_dc->public.caps.max_targets = core_dc->res_pool.pipe_count; ++ core_dc->public.caps.max_links = core_dc->link_count; ++ core_dc->public.caps.max_audios = core_dc->res_pool.audio_count; + +- dal_logger_write(dc->ctx->logger, ++ dal_logger_write(core_dc->ctx->logger, + LOG_MAJOR_INTERFACE_TRACE, + LOG_MINOR_COMPONENT_DC, + "Display Core initialized\n"); + +- return &dc->public; ++ return &core_dc->public; + + construct_fail: +- dm_free(dc); ++ dm_free(core_dc); + + alloc_fail: + return NULL; +@@ -1182,7 +1125,7 @@ void dc_set_power_state( + + switch (power_state) { + case DC_ACPI_CM_POWER_STATE_D0: +- init_hw(core_dc); ++ core_dc->hwss.init_hw(core_dc); + break; + default: + /* NULL means "reset/release all DC targets" */ +diff --git a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c +index 6b8ae77..1911bbb 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce100/dce100_resource.c +@@ -1050,6 +1050,10 @@ bool dce100_construct_resource_pool( + pool->stream_enc_count++; + } + ++ /* Create hardware sequencer */ ++ if (!dc_construct_hw_sequencer(as, dc)) ++ goto stream_enc_create_fail; ++ + return true; + + stream_enc_create_fail: +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 e6d1c3a..defaac4 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 +@@ -1593,7 +1593,62 @@ static void enable_timing_synchronization( + DC_SYNC_INFO("GSL: Set-up complete.\n"); + } + ++static void init_hw(struct core_dc *dc) ++{ ++ int i; ++ struct dc_bios *bp; ++ struct transform *xfm; ++ ++ bp = dc->ctx->dc_bios; ++ for (i = 0; i < dc->res_pool.pipe_count; i++) { ++ xfm = dc->res_pool.transforms[i]; ++ ++ dc->hwss.enable_display_power_gating( ++ dc->ctx, i, bp, ++ PIPE_GATING_CONTROL_INIT); ++ dc->hwss.enable_display_power_gating( ++ dc->ctx, i, bp, ++ PIPE_GATING_CONTROL_DISABLE); ++ xfm->funcs->transform_power_up(xfm); ++ dc->hwss.enable_display_pipe_clock_gating( ++ dc->ctx, ++ true); ++ } ++ ++ dc->hwss.clock_gating_power_up(dc->ctx, false); ++ bp->funcs->power_up(bp); ++ /***************************************/ ++ ++ for (i = 0; i < dc->link_count; i++) { ++ /****************************************/ ++ /* Power up AND update implementation according to the ++ * required signal (which may be different from the ++ * default signal on connector). */ ++ struct core_link *link = dc->links[i]; ++ link->link_enc->funcs->hw_init(link->link_enc); ++ } ++ ++ for (i = 0; i < dc->res_pool.pipe_count; i++) { ++ struct timing_generator *tg = dc->res_pool.timing_generators[i]; ++ ++ tg->funcs->disable_vga(tg); ++ ++ /* Blank controller using driver code instead of ++ * command table. */ ++ tg->funcs->set_blank(tg, true); ++ } ++ ++ for (i = 0; i < dc->res_pool.audio_count; i++) { ++ struct audio *audio = dc->res_pool.audios[i]; ++ ++ if (dal_audio_power_up(audio) != AUDIO_RESULT_OK) ++ dm_error("Failed audio power up!\n"); ++ } ++ ++} ++ + 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, +@@ -1613,7 +1668,7 @@ static const struct hw_sequencer_funcs dce110_funcs = { + .set_blender_mode = dce110_set_blender_mode, + .clock_gating_power_up = dal_dc_clock_gating_dce110_power_up,/*todo*/ + .set_display_clock = set_display_clock, +- .set_displaymarks = set_displaymarks, ++ .set_displaymarks = set_displaymarks + }; + + bool dce110_hw_sequencer_construct(struct core_dc *dc) +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c +index b39e2af..ef3f502 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c +@@ -1188,6 +1188,10 @@ bool dce110_construct_resource_pool( + pool->stream_enc_count++; + } + ++ /* Create hardware sequencer */ ++ if (!dc_construct_hw_sequencer(as, dc)) ++ goto stream_enc_create_fail; ++ + return true; + + stream_enc_create_fail: +diff --git a/drivers/gpu/drm/amd/dal/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/dal/dc/dce80/dce80_resource.c +index 3b70643..078183b 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce80/dce80_resource.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce80/dce80_resource.c +@@ -1157,6 +1157,10 @@ bool dce80_construct_resource_pool( + pool->stream_enc_count++; + } + ++ /* Create hardware sequencer */ ++ if (!dc_construct_hw_sequencer(as, dc)) ++ goto stream_enc_create_fail; ++ + return true; + + stream_enc_create_fail: +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 490ee10..d801a60 100644 +--- a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h ++++ b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h +@@ -37,6 +37,8 @@ enum pipe_gating_control { + + struct hw_sequencer_funcs { + ++ void (*init_hw)(struct core_dc *dc); ++ + enum dc_status (*apply_ctx_to_hw)( + struct core_dc *dc, struct validate_context *context); + +-- +2.7.4 + |