aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch155
1 files changed, 155 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch
new file mode 100644
index 00000000..86c94b91
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0072-drm-amd-display-Refactor-to-move-gamma-correction-to.patch
@@ -0,0 +1,155 @@
+From d2e6be5c4c3414043a20cd5b1820a78c37e3dedd Mon Sep 17 00:00:00 2001
+From: Anthony Koo <Anthony.Koo@amd.com>
+Date: Fri, 16 Dec 2016 10:43:21 -0500
+Subject: [PATCH 0072/4131] drm/amd/display: Refactor to move gamma correction
+ to module
+
+Refactor part 4 - Moving input gamma correction programming into color module
+
+DM will translate to dc_gamma structure, but programming will be moved into
+the color module. Later, this will allow gamma correction to be added on top of
+in/out transfer function curves.
+
+Signed-off-by: Anthony Koo <anthony.koo@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/modules/color/color.c | 77 ++++++++++++++++++++++
+ .../gpu/drm/amd/display/modules/inc/mod_color.h | 4 ++
+ 2 files changed, 81 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/display/modules/color/color.c b/drivers/gpu/drm/amd/display/modules/color/color.c
+index 0610b82..6613ff9 100644
+--- a/drivers/gpu/drm/amd/display/modules/color/color.c
++++ b/drivers/gpu/drm/amd/display/modules/color/color.c
+@@ -69,6 +69,7 @@ struct color_state {
+ struct color_range saturation;
+ struct color_range brightness;
+ struct color_range hue;
++ struct dc_gamma *gamma;
+ enum dc_quantization_range preferred_quantization_range;
+ };
+
+@@ -1265,6 +1266,26 @@ static void calculate_csc_matrix(struct core_color *core_color,
+ }
+ }
+
++static struct dc_surface *dc_stream_to_surface_from_pipe_ctx(
++ struct core_color *core_color,
++ const struct dc_stream *stream)
++{
++ int i;
++ struct core_dc *core_dc = DC_TO_CORE(core_color->dc);
++ struct core_stream *core_stream = DC_STREAM_TO_CORE(stream);
++ struct dc_surface *out_surface = NULL;
++
++ for (i = 0; i < MAX_PIPES; i++) {
++ if (core_dc->current_context->res_ctx.pipe_ctx[i].stream
++ == core_stream) {
++ out_surface = &core_dc->current_context->res_ctx.
++ pipe_ctx[i].surface->public;
++ break;
++ }
++ }
++ return out_surface;
++}
++
+ struct mod_color *mod_color_create(struct dc *dc)
+ {
+ int i = 0;
+@@ -1369,6 +1390,10 @@ void mod_color_destroy(struct mod_color *mod_color)
+ struct core_color *core_color =
+ MOD_COLOR_TO_CORE(mod_color);
+
++ for (i = 0; i < core_color->num_sinks; i++)
++ if (core_color->state[i].gamma)
++ dc_gamma_release(core_color->state[i].gamma);
++
+ dm_free(core_color->state);
+
+ for (i = 0; i < core_color->num_sinks; i++)
+@@ -1552,6 +1577,9 @@ bool mod_color_remove_sink(struct mod_color *mod_color,
+
+ for (i = 0; i < core_color->num_sinks; i++) {
+ if (core_color->caps[i].sink == sink) {
++ if (core_color->state[i].gamma)
++ dc_gamma_release(core_color->state[i].gamma);
++
+ /* To remove this sink, shift everything after down */
+ for (j = i; j < core_color->num_sinks - 1; j++) {
+ core_color->caps[j].sink =
+@@ -2184,6 +2212,55 @@ bool mod_color_set_saturation(struct mod_color *mod_color,
+ return true;
+ }
+
++bool mod_color_set_input_gamma_correction(struct mod_color *mod_color,
++ const struct dc_stream **streams, int num_streams,
++ struct dc_gamma *gamma)
++{
++ struct core_color *core_color = MOD_COLOR_TO_CORE(mod_color);
++ unsigned int stream_index, sink_index;
++
++ for (stream_index = 0; stream_index < num_streams; stream_index++) {
++ sink_index = sink_index_from_sink(core_color,
++ streams[stream_index]->sink);
++
++ struct dc_surface *surface =
++ dc_stream_to_surface_from_pipe_ctx(core_color,
++ streams[stream_index]);
++
++ if (surface != NULL) {
++ struct dc_transfer_func *input_tf =
++ dc_create_transfer_func(core_color->dc);
++ struct dc_surface_update updates = {0};
++
++ if (input_tf != NULL) {
++ input_tf->type = TF_TYPE_PREDEFINED;
++ input_tf->tf = TRANSFER_FUNCTION_SRGB;
++ }
++
++ if (core_color->state[sink_index].gamma != gamma) {
++ if (core_color->state[sink_index].gamma)
++ dc_gamma_release(
++ core_color->state[sink_index].
++ gamma);
++
++ dc_gamma_retain(gamma);
++ core_color->state[sink_index].gamma = gamma;
++ }
++
++ updates.surface = surface;
++ updates.gamma = gamma;
++ updates.in_transfer_func = input_tf;
++ dc_update_surfaces_for_target(core_color->dc, &updates,
++ 1, NULL);
++
++ if (input_tf != NULL)
++ dc_transfer_func_release(input_tf);
++ }
++ }
++
++ return true;
++}
++
+ bool mod_color_persist_user_preferred_quantization_range(
+ struct mod_color *mod_color,
+ const struct dc_sink *sink,
+diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_color.h b/drivers/gpu/drm/amd/display/modules/inc/mod_color.h
+index 787c2c0..fbf9081 100644
+--- a/drivers/gpu/drm/amd/display/modules/inc/mod_color.h
++++ b/drivers/gpu/drm/amd/display/modules/inc/mod_color.h
+@@ -168,6 +168,10 @@ bool mod_color_set_saturation(struct mod_color *mod_color,
+ const struct dc_stream **streams, int num_streams,
+ int saturation_value);
+
++bool mod_color_set_input_gamma_correction(struct mod_color *mod_color,
++ const struct dc_stream **streams, int num_streams,
++ struct dc_gamma *gamma);
++
+ bool mod_color_persist_user_preferred_quantization_range(
+ struct mod_color *mod_color,
+ const struct dc_sink *sink,
+--
+2.7.4
+