diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0420-drm-amd-display-Move-output-transfer-function-to-str.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0420-drm-amd-display-Move-output-transfer-function-to-str.patch | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0420-drm-amd-display-Move-output-transfer-function-to-str.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0420-drm-amd-display-Move-output-transfer-function-to-str.patch new file mode 100644 index 00000000..58e45c5d --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0420-drm-amd-display-Move-output-transfer-function-to-str.patch @@ -0,0 +1,201 @@ +From cc8fc45003e17e5471d2d76e30c52d3c73bb395c Mon Sep 17 00:00:00 2001 +From: Amy Zhang <Amy.Zhang@amd.com> +Date: Tue, 9 May 2017 14:45:54 -0400 +Subject: [PATCH 0420/4131] drm/amd/display: Move output transfer function to + stream updates + +Signed-off-by: Amy Zhang <Amy.Zhang@amd.com> +Reviewed-by: Anthony Koo <Anthony.Koo@amd.com> +Acked-by: Harry Wentland <Harry.Wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/display/dc/core/dc.c | 46 ++++++++++++++-------- + drivers/gpu/drm/amd/display/dc/dc.h | 14 +++---- + .../amd/display/dc/dce110/dce110_hw_sequencer.c | 1 - + .../drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 4 +- + drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | 1 - + 5 files changed, 37 insertions(+), 29 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 3c25543..1e6952bde 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -201,11 +201,10 @@ static bool stream_get_crtc_position(struct dc *dc, + return ret; + } + +-static bool set_gamut_remap(struct dc *dc, +- const struct dc_stream **stream, int num_streams) ++static bool set_gamut_remap(struct dc *dc, const struct dc_stream *stream) + { + struct core_dc *core_dc = DC_TO_CORE(dc); +- struct core_stream *core_stream = DC_STREAM_TO_CORE(stream[0]); ++ struct core_stream *core_stream = DC_STREAM_TO_CORE(stream); + int i = 0; + bool ret = false; + struct pipe_ctx *pipes; +@@ -1182,7 +1181,6 @@ static enum surface_update_type det_surface_update( + overall_type = type; + + if (u->in_transfer_func || +- u->out_transfer_func || + u->hdr_static_metadata) { + if (overall_type < UPDATE_TYPE_MED) + overall_type = UPDATE_TYPE_MED; +@@ -1279,8 +1277,28 @@ void dc_update_surfaces_and_stream(struct dc *dc, + + /* update current stream with the new updates */ + if (stream_update) { +- stream->public.src = stream_update->src; +- stream->public.dst = stream_update->dst; ++ if ((stream_update->src.height != 0) && ++ (stream_update->src.width != 0)) ++ stream->public.src = stream_update->src; ++ ++ if ((stream_update->dst.height != 0) && ++ (stream_update->dst.width != 0)) ++ stream->public.dst = stream_update->dst; ++ ++ if (stream_update->out_transfer_func && ++ stream_update->out_transfer_func != ++ dc_stream->out_transfer_func) { ++ if (stream_update->out_transfer_func->type != ++ TF_TYPE_UNKNOWN) { ++ if (dc_stream->out_transfer_func != NULL) ++ dc_transfer_func_release ++ (dc_stream->out_transfer_func); ++ dc_transfer_func_retain(stream_update-> ++ out_transfer_func); ++ stream->public.out_transfer_func = ++ stream_update->out_transfer_func; ++ } ++ } + } + + /* save update parameters into surface */ +@@ -1361,13 +1379,6 @@ void dc_update_surfaces_and_stream(struct dc *dc, + srf_updates[i].in_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(srf_updates[i].out_transfer_func); +- stream->public.out_transfer_func = srf_updates[i].out_transfer_func; +- } + if (srf_updates[i].hdr_static_metadata) + surface->public.hdr_static_ctx = + *(srf_updates[i].hdr_static_metadata); +@@ -1436,11 +1447,12 @@ void dc_update_surfaces_and_stream(struct dc *dc, + pipe_ctx, pipe_ctx->surface); + + if (is_new_pipe_surface || +- srf_updates[i].out_transfer_func) ++ (stream_update != NULL && ++ stream_update->out_transfer_func != ++ NULL)) { + core_dc->hwss.set_output_transfer_func( +- pipe_ctx, +- pipe_ctx->surface, +- pipe_ctx->stream); ++ pipe_ctx, pipe_ctx->stream); ++ } + + if (srf_updates[i].hdr_static_metadata) { + resource_build_info_frame(pipe_ctx); +diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h +index c7e503a..7dd145b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc.h ++++ b/drivers/gpu/drm/amd/display/dc/dc.h +@@ -122,7 +122,7 @@ struct dc_stream_funcs { + const struct rect *dst); + + bool (*set_gamut_remap)(struct dc *dc, +- const struct dc_stream **stream, int num_streams); ++ const struct dc_stream *stream); + + void (*set_static_screen_events)(struct dc *dc, + const struct dc_stream **stream, +@@ -265,7 +265,8 @@ struct dc_hdr_static_metadata { + enum dc_transfer_func_type { + TF_TYPE_PREDEFINED, + TF_TYPE_DISTRIBUTED_POINTS, +- TF_TYPE_BYPASS ++ TF_TYPE_BYPASS, ++ TF_TYPE_UNKNOWN + }; + + struct dc_transfer_func_distributed_points { +@@ -349,11 +350,8 @@ struct dc_surface_update { + */ + /* gamma TO BE REMOVED */ + struct dc_gamma *gamma; +- struct dc_hdr_static_metadata *hdr_static_metadata; + struct dc_transfer_func *in_transfer_func; +- struct dc_transfer_func *out_transfer_func; +- +- ++ struct dc_hdr_static_metadata *hdr_static_metadata; + }; + /* + * This structure is filled in by dc_surface_get_status and contains +@@ -473,11 +471,9 @@ struct dc_stream { + }; + + struct dc_stream_update { +- + struct rect src; +- + struct rect dst; +- ++ struct dc_transfer_func *out_transfer_func; + }; + + +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 150c8a4..8a66300 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 +@@ -631,7 +631,6 @@ static bool dce110_translate_regamma_to_hw_format(const struct dc_transfer_func + + static bool dce110_set_output_transfer_func( + struct pipe_ctx *pipe_ctx, +- const struct core_surface *surface, /* Surface - To be removed */ + const struct core_stream *stream) + { + struct output_pixel_processor *opp = pipe_ctx->opp; +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 f5638ad..6cb3924 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 +@@ -1301,11 +1301,13 @@ static bool dcn10_translate_regamma_to_hw_format(const struct dc_transfer_func + + static bool dcn10_set_output_transfer_func( + struct pipe_ctx *pipe_ctx, +- const struct core_surface *surface, + const struct core_stream *stream) + { + struct output_pixel_processor *opp = pipe_ctx->opp; + ++ if (opp == NULL) ++ return false; ++ + opp->regamma_params.hw_points_num = GAMMA_HW_POINTS_NUM; + + if (stream->public.out_transfer_func && +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 afdb860..b53e120 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h +@@ -80,7 +80,6 @@ struct hw_sequencer_funcs { + + bool (*set_output_transfer_func)( + struct pipe_ctx *pipe_ctx, +- const struct core_surface *surface, + const struct core_stream *stream); + + void (*power_down)(struct core_dc *dc); +-- +2.7.4 + |