aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0285-drm-amd-display-changing-the-dc_update_surfaces_and_.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0285-drm-amd-display-changing-the-dc_update_surfaces_and_.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0285-drm-amd-display-changing-the-dc_update_surfaces_and_.patch303
1 files changed, 303 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0285-drm-amd-display-changing-the-dc_update_surfaces_and_.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0285-drm-amd-display-changing-the-dc_update_surfaces_and_.patch
new file mode 100644
index 00000000..7db03eaa
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0285-drm-amd-display-changing-the-dc_update_surfaces_and_.patch
@@ -0,0 +1,303 @@
+From 09d677249db3fa6a26966f606e07aeca792017d2 Mon Sep 17 00:00:00 2001
+From: Leon Elazar <leon.elazar@amd.com>
+Date: Tue, 14 Mar 2017 11:54:31 -0400
+Subject: [PATCH 0285/4131] drm/amd/display: changing the
+ dc_update_surfaces_and_stream
+
+1. Adding the ability to update the stream parameters during FULL_UPDATE type
+
+Signed-off-by: Leon Elazar <leon.elazar@amd.com>
+Acked-by: Harry Wentland <Harry.Wentland@amd.com>
+Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc.c | 129 +++++++++++++++----------------
+ drivers/gpu/drm/amd/display/dc/dc.h | 1 +
+ 2 files changed, 65 insertions(+), 65 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
+index 228ef6b..26f227d 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
+@@ -1245,6 +1245,7 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
+ struct dc *dc,
+ struct dc_surface_update *updates,
+ int surface_count,
++ struct dc_stream_update *stream_update,
+ const struct dc_stream_status *stream_status)
+ {
+ struct core_dc *core_dc = DC_TO_CORE(dc);
+@@ -1254,6 +1255,9 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
+ if (stream_status->surface_count != surface_count)
+ return UPDATE_TYPE_FULL;
+
++ if (stream_update)
++ return UPDATE_TYPE_FULL;
++
+ for (i = 0 ; i < surface_count; i++) {
+ enum surface_update_type type =
+ det_surface_update(core_dc, &updates[i]);
+@@ -1268,39 +1272,27 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
+ return overall_type;
+ }
+
+-void dc_update_surfaces_and_stream(struct dc *dc,
++void dc_update_surfaces_for_stream(struct dc *dc,
+ struct dc_surface_update *surface_updates, int surface_count,
+- const struct dc_stream *dc_stream,
+- struct dc_stream_update *stream_update)
++ const struct dc_stream *dc_stream)
+ {
+- const struct dc_stream_status *stream_status;
+-
+- stream_status = dc_stream_get_status(dc_stream);
+- ASSERT(stream_status);
+- if (!stream_status)
+- return; /* Cannot update stream that is not committed */
+-
+- if (stream_update) {
+- dc->stream_funcs.stream_update_scaling(dc, dc_stream,
+- &stream_update->src, &stream_update->dst);
+- }
+-
+- dc_update_surfaces_for_stream(dc, surface_updates,
+- surface_count, dc_stream);
++ dc_update_surfaces_and_stream(dc, surface_updates, surface_count,
++ dc_stream, NULL);
+ }
+
+ enum surface_update_type update_surface_trace_level = UPDATE_TYPE_FULL;
+
+-void dc_update_surfaces_for_stream(struct dc *dc,
+- struct dc_surface_update *updates, int surface_count,
+- const struct dc_stream *dc_stream)
++void dc_update_surfaces_and_stream(struct dc *dc,
++ struct dc_surface_update *srf_updates, int surface_count,
++ const struct dc_stream *dc_stream,
++ struct dc_stream_update *stream_update)
+ {
+ struct core_dc *core_dc = DC_TO_CORE(dc);
+ struct validate_context *context;
+ int i, j;
+-
+ enum surface_update_type update_type;
+ const struct dc_stream_status *stream_status;
++ struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream);
+
+ stream_status = dc_stream_get_status(dc_stream);
+ ASSERT(stream_status);
+@@ -1308,16 +1300,16 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ return; /* Cannot commit surface to stream that is not committed */
+
+ update_type = dc_check_update_surfaces_for_stream(
+- dc, updates, surface_count, stream_status);
++ dc, srf_updates, surface_count, stream_update, stream_status);
+
+ if (update_type >= update_surface_trace_level)
+- update_surface_trace(dc, updates, surface_count);
++ update_surface_trace(dc, srf_updates, surface_count);
+
+ if (update_type >= UPDATE_TYPE_FULL) {
+ const struct dc_surface *new_surfaces[MAX_SURFACES] = { 0 };
+
+ for (i = 0; i < surface_count; i++)
+- new_surfaces[i] = updates[i].surface;
++ new_surfaces[i] = srf_updates[i].surface;
+
+ /* initialize scratch memory for building context */
+ context = core_dc->temp_flip_context;
+@@ -1333,47 +1325,54 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ } else {
+ context = core_dc->current_context;
+ }
++
++ /* update current stream with the new updates */
++ if (stream_update) {
++ stream->public.src = stream_update->src;
++ stream->public.dst = stream_update->dst;
++ }
++
++ /* save update parameters into surface */
+ for (i = 0; i < surface_count; i++) {
+- /* save update param into surface */
+- struct core_surface *surface = DC_SURFACE_TO_CORE(updates[i].surface);
+- struct core_stream *stream = DC_STREAM_TO_CORE(dc_stream);
++ struct core_surface *surface =
++ DC_SURFACE_TO_CORE(srf_updates[i].surface);
+
+- if (updates[i].flip_addr) {
+- surface->public.address = updates[i].flip_addr->address;
++ if (srf_updates[i].flip_addr) {
++ surface->public.address = srf_updates[i].flip_addr->address;
+ surface->public.flip_immediate =
+- updates[i].flip_addr->flip_immediate;
++ srf_updates[i].flip_addr->flip_immediate;
+ }
+
+- if (updates[i].scaling_info) {
++ if (srf_updates[i].scaling_info) {
+ surface->public.scaling_quality =
+- updates[i].scaling_info->scaling_quality;
++ srf_updates[i].scaling_info->scaling_quality;
+ surface->public.dst_rect =
+- updates[i].scaling_info->dst_rect;
++ srf_updates[i].scaling_info->dst_rect;
+ surface->public.src_rect =
+- updates[i].scaling_info->src_rect;
++ srf_updates[i].scaling_info->src_rect;
+ surface->public.clip_rect =
+- updates[i].scaling_info->clip_rect;
++ srf_updates[i].scaling_info->clip_rect;
+ }
+
+- if (updates[i].plane_info) {
++ if (srf_updates[i].plane_info) {
+ surface->public.color_space =
+- updates[i].plane_info->color_space;
++ srf_updates[i].plane_info->color_space;
+ surface->public.format =
+- updates[i].plane_info->format;
++ srf_updates[i].plane_info->format;
+ surface->public.plane_size =
+- updates[i].plane_info->plane_size;
++ srf_updates[i].plane_info->plane_size;
+ surface->public.rotation =
+- updates[i].plane_info->rotation;
++ srf_updates[i].plane_info->rotation;
+ surface->public.horizontal_mirror =
+- updates[i].plane_info->horizontal_mirror;
++ srf_updates[i].plane_info->horizontal_mirror;
+ surface->public.stereo_format =
+- updates[i].plane_info->stereo_format;
++ srf_updates[i].plane_info->stereo_format;
+ surface->public.tiling_info =
+- updates[i].plane_info->tiling_info;
++ srf_updates[i].plane_info->tiling_info;
+ surface->public.visible =
+- updates[i].plane_info->visible;
++ srf_updates[i].plane_info->visible;
+ surface->public.dcc =
+- updates[i].plane_info->dcc;
++ srf_updates[i].plane_info->dcc;
+ }
+
+ /* not sure if we still need this */
+@@ -1388,40 +1387,40 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ }
+ }
+
+- if (updates[i].gamma &&
+- updates[i].gamma != surface->public.gamma_correction) {
++ if (srf_updates[i].gamma &&
++ srf_updates[i].gamma != surface->public.gamma_correction) {
+ if (surface->public.gamma_correction != NULL)
+ dc_gamma_release(&surface->public.
+ gamma_correction);
+
+- dc_gamma_retain(updates[i].gamma);
++ dc_gamma_retain(srf_updates[i].gamma);
+ surface->public.gamma_correction =
+- updates[i].gamma;
++ srf_updates[i].gamma;
+ }
+
+- if (updates[i].in_transfer_func &&
+- updates[i].in_transfer_func != surface->public.in_transfer_func) {
++ if (srf_updates[i].in_transfer_func &&
++ srf_updates[i].in_transfer_func != surface->public.in_transfer_func) {
+ if (surface->public.in_transfer_func != NULL)
+ dc_transfer_func_release(
+ surface->public.
+ in_transfer_func);
+
+ dc_transfer_func_retain(
+- updates[i].in_transfer_func);
++ srf_updates[i].in_transfer_func);
+ surface->public.in_transfer_func =
+- updates[i].in_transfer_func;
++ srf_updates[i].in_transfer_func;
+ }
+
+- if (updates[i].out_transfer_func &&
+- updates[i].out_transfer_func != dc_stream->out_transfer_func) {
++ if (srf_updates[i].out_transfer_func &&
++ srf_updates[i].out_transfer_func != dc_stream->out_transfer_func) {
+ if (dc_stream->out_transfer_func != NULL)
+ dc_transfer_func_release(dc_stream->out_transfer_func);
+- dc_transfer_func_retain(updates[i].out_transfer_func);
+- stream->public.out_transfer_func = updates[i].out_transfer_func;
++ dc_transfer_func_retain(srf_updates[i].out_transfer_func);
++ stream->public.out_transfer_func = srf_updates[i].out_transfer_func;
+ }
+- if (updates[i].hdr_static_metadata)
++ if (srf_updates[i].hdr_static_metadata)
+ surface->public.hdr_static_ctx =
+- *(updates[i].hdr_static_metadata);
++ *(srf_updates[i].hdr_static_metadata);
+ }
+
+ if (update_type == UPDATE_TYPE_FULL &&
+@@ -1434,7 +1433,7 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ core_dc->hwss.apply_ctx_for_surface(core_dc, NULL, context);
+
+ for (i = 0; i < surface_count; i++) {
+- struct core_surface *surface = DC_SURFACE_TO_CORE(updates[i].surface);
++ struct core_surface *surface = DC_SURFACE_TO_CORE(srf_updates[i].surface);
+
+ for (j = 0; j < context->res_ctx.pool->pipe_count; j++) {
+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[j];
+@@ -1460,7 +1459,7 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ true);
+ }
+
+- if (updates[i].flip_addr)
++ if (srf_updates[i].flip_addr)
+ core_dc->hwss.update_plane_addr(core_dc, pipe_ctx);
+
+ if (update_type == UPDATE_TYPE_FAST)
+@@ -1471,18 +1470,18 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ is_new_pipe_surface = false;
+
+ if (is_new_pipe_surface ||
+- updates[i].in_transfer_func)
++ srf_updates[i].in_transfer_func)
+ core_dc->hwss.set_input_transfer_func(
+ pipe_ctx, pipe_ctx->surface);
+
+ if (is_new_pipe_surface ||
+- updates[i].out_transfer_func)
++ srf_updates[i].out_transfer_func)
+ core_dc->hwss.set_output_transfer_func(
+ pipe_ctx,
+ pipe_ctx->surface,
+ pipe_ctx->stream);
+
+- if (updates[i].hdr_static_metadata) {
++ if (srf_updates[i].hdr_static_metadata) {
+ resource_build_info_frame(pipe_ctx);
+ core_dc->hwss.update_info_frame(pipe_ctx);
+ }
+@@ -1493,7 +1492,7 @@ void dc_update_surfaces_for_stream(struct dc *dc,
+ struct pipe_ctx *pipe_ctx = &context->res_ctx.pipe_ctx[i];
+
+ for (j = 0; j < surface_count; j++) {
+- if (updates[j].surface == &pipe_ctx->surface->public) {
++ if (srf_updates[j].surface == &pipe_ctx->surface->public) {
+ if (!pipe_ctx->tg->funcs->is_blanked(pipe_ctx->tg)) {
+ core_dc->hwss.pipe_control_lock(
+ core_dc,
+diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
+index b1bff59..8b033ba 100644
+--- a/drivers/gpu/drm/amd/display/dc/dc.h
++++ b/drivers/gpu/drm/amd/display/dc/dc.h
+@@ -556,6 +556,7 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
+ struct dc *dc,
+ struct dc_surface_update *updates,
+ int surface_count,
++ struct dc_stream_update *stream_update,
+ const struct dc_stream_status *stream_status);
+
+ /*******************************************************************************
+--
+2.7.4
+