diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/0087-drm-amd-display-4k-split-black-out-due-to-incorrect-.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/0087-drm-amd-display-4k-split-black-out-due-to-incorrect-.patch | 222 |
1 files changed, 222 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/0087-drm-amd-display-4k-split-black-out-due-to-incorrect-.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/0087-drm-amd-display-4k-split-black-out-due-to-incorrect-.patch new file mode 100644 index 00000000..69eb6ed6 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/0087-drm-amd-display-4k-split-black-out-due-to-incorrect-.patch @@ -0,0 +1,222 @@ +From e32d4507e7991198cc7f6fd5c19c36d038dba038 Mon Sep 17 00:00:00 2001 +From: Tony Cheng <tony.cheng@amd.com> +Date: Mon, 19 Dec 2016 12:54:40 -0500 +Subject: [PATCH 0087/4131] drm/amd/display: 4k split black out due to + incorrect cursor + +- add handling to program both cursor for left and right pipe +- add guard to disable cursor in case where cursor isn't visible to prevent pipe hang + +Signed-off-by: Tony Cheng <tony.cheng@amd.com> +Reviewed-by: Yongqiang Sun <yongqiang.sun@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_target.c | 83 ++++++++++------------ + drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 9 +++ + drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h | 3 +- + .../drm/amd/display/dc/dce110/dce110_ipp_cursor.c | 3 +- + drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h | 3 +- + 5 files changed, 53 insertions(+), 48 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_target.c b/drivers/gpu/drm/amd/display/dc/core/dc_target.c +index 48eb7b0..2531df7 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_target.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_target.c +@@ -148,56 +148,49 @@ bool dc_target_set_cursor_attributes( + struct dc_target *dc_target, + const struct dc_cursor_attributes *attributes) + { +- uint8_t i, j; +- struct core_target *target; +- struct core_dc *core_dc; +- struct resource_context *res_ctx; ++ int i, j; ++ struct core_target *target = DC_TARGET_TO_CORE(dc_target); ++ struct core_dc *core_dc = DC_TO_CORE(target->ctx->dc); ++ struct resource_context *res_ctx = &core_dc->current_context->res_ctx; ++ bool ret = false; + + if (NULL == dc_target) { + dm_error("DC: dc_target is NULL!\n"); + return false; +- + } + if (NULL == attributes) { + dm_error("DC: attributes is NULL!\n"); + return false; +- + } + +- target = DC_TARGET_TO_CORE(dc_target); +- core_dc = DC_TO_CORE(target->ctx->dc); +- res_ctx = &core_dc->current_context->res_ctx; ++ for (i = 0; i < dc_target->stream_count; i++) { ++ const struct dc_stream *stream = dc_target->streams[i]; + +- for (i = 0; i < target->public.stream_count; i++) { + for (j = 0; j < MAX_PIPES; j++) { +- struct input_pixel_processor *ipp = +- res_ctx->pipe_ctx[j].ipp; ++ struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[j]; + +- if (res_ctx->pipe_ctx[j].stream != +- DC_STREAM_TO_CORE(target->public.streams[i])) +- continue; ++ if (&pipe_ctx->stream->public == stream) { ++ struct input_pixel_processor *ipp = pipe_ctx->ipp; + +- /* As of writing of this code cursor is on the top +- * plane so we only need to set it on first pipe we +- * find. May need to make this code dce specific later. +- */ +- if (ipp->funcs->ipp_cursor_set_attributes( +- ipp, attributes)) +- return true; ++ if (ipp->funcs->ipp_cursor_set_attributes( ++ ipp, attributes)) ++ ret = true; ++ } + } + } + +- return false; ++ return ret; + } + + bool dc_target_set_cursor_position( + struct dc_target *dc_target, + const struct dc_cursor_position *position) + { +- uint8_t i, j; +- struct core_target *target; +- struct core_dc *core_dc; +- struct resource_context *res_ctx; ++ int i, j; ++ struct core_target *target = DC_TARGET_TO_CORE(dc_target); ++ struct core_dc *core_dc = DC_TO_CORE(target->ctx->dc); ++ struct resource_context *res_ctx = &core_dc->current_context->res_ctx; ++ bool ret = false; + + if (NULL == dc_target) { + dm_error("DC: dc_target is NULL!\n"); +@@ -209,29 +202,29 @@ bool dc_target_set_cursor_position( + return false; + } + +- target = DC_TARGET_TO_CORE(dc_target); +- core_dc = DC_TO_CORE(target->ctx->dc); +- res_ctx = &core_dc->current_context->res_ctx; ++ for (i = 0; i < dc_target->stream_count; i++) { ++ const struct dc_stream *stream = dc_target->streams[i]; + +- for (i = 0; i < target->public.stream_count; i++) { + for (j = 0; j < MAX_PIPES; j++) { +- struct input_pixel_processor *ipp = +- res_ctx->pipe_ctx[j].ipp; +- +- if (res_ctx->pipe_ctx[j].stream != +- DC_STREAM_TO_CORE(target->public.streams[i])) +- continue; +- +- /* As of writing of this code cursor is on the top +- * plane so we only need to set it on first pipe we +- * find. May need to make this code dce specific later. +- */ +- ipp->funcs->ipp_cursor_set_position(ipp, position); +- return true; ++ struct pipe_ctx *pipe_ctx = &res_ctx->pipe_ctx[j]; ++ ++ if (&pipe_ctx->stream->public == stream) { ++ struct input_pixel_processor *ipp = pipe_ctx->ipp; ++ struct dc_cursor_mi_param param = { ++ .pixel_clk_khz = stream->timing.pix_clk_khz, ++ .ref_clk_khz = 48000,/*todo refclk*/ ++ .viewport_x_start = pipe_ctx->scl_data.viewport.x, ++ .viewport_width = pipe_ctx->scl_data.viewport.width, ++ .h_scale_ratio = pipe_ctx->scl_data.ratios.horz, ++ }; ++ ++ ipp->funcs->ipp_cursor_set_position(ipp, position, ¶m); ++ ret = true; ++ } + } + } + +- return false; ++ return ret; + } + + uint32_t dc_target_get_vblank_counter(const struct dc_target *dc_target) +diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +index 5605a5c..bd60337 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h +@@ -27,6 +27,7 @@ + #define DC_HW_TYPES_H + + #include "os_types.h" ++#include "fixed31_32.h" + + /****************************************************************************** + * Data types for Virtual HW Layer of DAL3. +@@ -359,6 +360,14 @@ struct dc_cursor_position { + bool hot_spot_enable; + }; + ++struct dc_cursor_mi_param { ++ unsigned int pixel_clk_khz; ++ unsigned int ref_clk_khz; ++ unsigned int viewport_x_start; ++ unsigned int viewport_width; ++ struct fixed31_32 h_scale_ratio; ++}; ++ + /* IPP related types */ + + /* Used by both ipp amd opp functions*/ +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h +index 60eebde..56fe327 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp.h +@@ -54,7 +54,8 @@ void dce110_ipp_destroy(struct input_pixel_processor **ipp); + /* CURSOR RELATED */ + void dce110_ipp_cursor_set_position( + struct input_pixel_processor *ipp, +- const struct dc_cursor_position *position); ++ const struct dc_cursor_position *position, ++ const struct dc_cursor_mi_param *param); + + bool dce110_ipp_cursor_set_attributes( + struct input_pixel_processor *ipp, +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c +index 95f6ca3..1cab12b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_ipp_cursor.c +@@ -72,7 +72,8 @@ static void program_address( + + void dce110_ipp_cursor_set_position( + struct input_pixel_processor *ipp, +- const struct dc_cursor_position *position) ++ const struct dc_cursor_position *position, ++ const struct dc_cursor_mi_param *param) + { + struct dce110_ipp *ipp110 = TO_DCE110_IPP(ipp); + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h b/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h +index 7e5f3e0..81de975 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/ipp.h +@@ -83,7 +83,8 @@ struct ipp_funcs { + /*** cursor ***/ + void (*ipp_cursor_set_position)( + struct input_pixel_processor *ipp, +- const struct dc_cursor_position *position); ++ const struct dc_cursor_position *position, ++ const struct dc_cursor_mi_param *param); + + bool (*ipp_cursor_set_attributes)( + struct input_pixel_processor *ipp, +-- +2.7.4 + |