aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0882-drm-amd-dal-Move-hw_init-into-hwss.patch
diff options
context:
space:
mode:
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.patch291
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
+