diff options
Diffstat (limited to 'meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0732-drm-amd-display-Clean-up-cursor-code.patch')
-rw-r--r-- | meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0732-drm-amd-display-Clean-up-cursor-code.patch | 353 |
1 files changed, 0 insertions, 353 deletions
diff --git a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0732-drm-amd-display-Clean-up-cursor-code.patch b/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0732-drm-amd-display-Clean-up-cursor-code.patch deleted file mode 100644 index bd038211..00000000 --- a/meta-v1000/recipes-kernel/linux/linux-yocto-4.14.71/0732-drm-amd-display-Clean-up-cursor-code.patch +++ /dev/null @@ -1,353 +0,0 @@ -From 4f58082aaa5f35ce2d7150443b6f82743afbab8e Mon Sep 17 00:00:00 2001 -From: Harry Wentland <harry.wentland@amd.com> -Date: Mon, 31 Jul 2017 16:32:18 -0400 -Subject: [PATCH 0732/4131] drm/amd/display: Clean up cursor code - -This will also fix disappearing cursor after resume. - -With this change we'll set cursor attributes, as well as -cursor position on every update. The impact is minor. - -These are sample logs that show timestamps at beginning -and end of atomic_check, commit_tail, handle_cursor_update, -and before and after cursor_attribute and cursor_position -calls: - -[ 66.800353] hwhw: begin of check -[ 66.800377] hwhw: end of check -[ 66.800428] hwhw: begin of commit_tail -[ 66.800441] hwhw: begin of cursor -[ 66.800449] hwhw: begin of cursor_attr -[ 66.800468] hwhw: end of cursor_attr -[ 66.800484] hwhw: end of cursor_positionr -[ 66.800501] hwhw: end of commit_tail -[ 66.807139] hwhw: begin of check -[ 66.807160] hwhw: end of check -[ 66.807206] hwhw: begin of commit_tail -[ 66.807217] hwhw: begin of cursor -[ 66.807225] hwhw: begin of cursor_attr -[ 66.807357] hwhw: end of cursor_attr -[ 66.807374] hwhw: end of cursor_positionr -[ 66.807392] hwhw: end of commit_tail - -Signed-off-by: Harry Wentland <harry.wentland@amd.com> -Reviewed-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com> -Acked-by: Harry Wentland <Harry.Wentland@amd.com> -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> ---- - drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 283 +++++++--------------- - 1 file changed, 92 insertions(+), 191 deletions(-) - -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -index d81c0a0..031f31c 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -1652,178 +1652,6 @@ static const struct drm_encoder_funcs amdgpu_dm_encoder_funcs = { - .destroy = amdgpu_dm_encoder_destroy, - }; - --static void dm_set_cursor( -- struct amdgpu_crtc *amdgpu_crtc, -- uint64_t gpu_addr, -- uint32_t width, -- uint32_t height) --{ -- struct dc_cursor_attributes attributes; -- struct dc_cursor_position position; -- struct drm_crtc *crtc = &amdgpu_crtc->base; -- int x, y; -- int xorigin = 0, yorigin = 0; -- struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state); -- -- amdgpu_crtc->cursor_width = width; -- amdgpu_crtc->cursor_height = height; -- -- attributes.address.high_part = upper_32_bits(gpu_addr); -- attributes.address.low_part = lower_32_bits(gpu_addr); -- attributes.width = width; -- attributes.height = height; -- attributes.color_format = CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA; -- attributes.rotation_angle = 0; -- attributes.attribute_flags.value = 0; -- -- attributes.pitch = attributes.width; -- -- x = amdgpu_crtc->cursor_x; -- y = amdgpu_crtc->cursor_y; -- -- /* avivo cursor are offset into the total surface */ -- x += crtc->primary->state->src_x >> 16; -- y += crtc->primary->state->src_y >> 16; -- -- if (x < 0) { -- xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1); -- x = 0; -- } -- if (y < 0) { -- yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1); -- y = 0; -- } -- -- position.enable = true; -- position.x = x; -- position.y = y; -- -- position.x_hotspot = xorigin; -- position.y_hotspot = yorigin; -- -- if (!dc_stream_set_cursor_attributes( -- acrtc_state->stream, -- &attributes)) { -- DRM_ERROR("DC failed to set cursor attributes\n"); -- } -- -- if (!dc_stream_set_cursor_position( -- acrtc_state->stream, -- &position)) { -- DRM_ERROR("DC failed to set cursor position\n"); -- } --} -- --static int dm_crtc_cursor_set( -- struct drm_crtc *crtc, -- uint64_t address, -- uint32_t width, -- uint32_t height) --{ -- struct dc_cursor_position position; -- struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state); -- -- int ret; -- -- struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); -- ret = EINVAL; -- -- DRM_DEBUG_KMS("%s: crtc_id=%d with size %d to %d \n", -- __func__, -- amdgpu_crtc->crtc_id, -- width, -- height); -- -- if (!address) { -- /* turn off cursor */ -- position.enable = false; -- position.x = 0; -- position.y = 0; -- -- if (acrtc_state->stream) { -- /*set cursor visible false*/ -- dc_stream_set_cursor_position( -- acrtc_state->stream, -- &position); -- } -- goto release; -- -- } -- -- if ((width > amdgpu_crtc->max_cursor_width) || -- (height > amdgpu_crtc->max_cursor_height)) { -- DRM_ERROR( -- "%s: bad cursor width or height %d x %d\n", -- __func__, -- width, -- height); -- goto release; -- } -- -- /*program new cursor bo to hardware*/ -- dm_set_cursor(amdgpu_crtc, address, width, height); -- --release: -- return ret; -- --} -- --static int dm_crtc_cursor_move(struct drm_crtc *crtc, -- int x, int y) --{ -- struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); -- int xorigin = 0, yorigin = 0; -- struct dc_cursor_position position; -- struct dm_crtc_state *acrtc_state = to_dm_crtc_state(crtc->state); -- -- amdgpu_crtc->cursor_x = x; -- amdgpu_crtc->cursor_y = y; -- -- /* avivo cursor are offset into the total surface */ -- x += crtc->primary->state->src_x >> 16; -- y += crtc->primary->state->src_y >> 16; -- -- /* -- * TODO: for cursor debugging unguard the following -- */ --#if 0 -- DRM_DEBUG_KMS( -- "%s: x %d y %d c->x %d c->y %d\n", -- __func__, -- x, -- y, -- crtc->x, -- crtc->y); --#endif -- -- if (x < 0) { -- xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1); -- x = 0; -- } -- if (y < 0) { -- yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1); -- y = 0; -- } -- -- position.enable = true; -- position.x = x; -- position.y = y; -- -- position.x_hotspot = xorigin; -- position.y_hotspot = yorigin; -- -- if (acrtc_state->stream) { -- if (!dc_stream_set_cursor_position( -- acrtc_state->stream, -- &position)) { -- DRM_ERROR("DC failed to set cursor position\n"); -- return -EINVAL; -- } -- } -- -- return 0; --} -- - static bool fill_rects_from_plane_state( - const struct drm_plane_state *state, - struct dc_plane_state *plane_state) -@@ -3940,34 +3768,107 @@ static void remove_stream( - acrtc->enabled = false; - } - -+int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc, -+ struct dc_cursor_position *position) -+{ -+ struct amdgpu_crtc *amdgpu_crtc = amdgpu_crtc = to_amdgpu_crtc(crtc); -+ int x, y; -+ int xorigin = 0, yorigin = 0; -+ -+ if (!crtc || !plane->state->fb) { -+ position->enable = false; -+ position->x = 0; -+ position->y = 0; -+ return 0; -+ } -+ -+ if ((plane->state->crtc_w > amdgpu_crtc->max_cursor_width) || -+ (plane->state->crtc_h > amdgpu_crtc->max_cursor_height)) { -+ DRM_ERROR("%s: bad cursor width or height %d x %d\n", -+ __func__, -+ plane->state->crtc_w, -+ plane->state->crtc_h); -+ return -EINVAL; -+ } -+ -+ x = plane->state->crtc_x; -+ y = plane->state->crtc_y; -+ /* avivo cursor are offset into the total surface */ -+ x += crtc->primary->state->src_x >> 16; -+ y += crtc->primary->state->src_y >> 16; -+ if (x < 0) { -+ xorigin = min(-x, amdgpu_crtc->max_cursor_width - 1); -+ x = 0; -+ } -+ if (y < 0) { -+ yorigin = min(-y, amdgpu_crtc->max_cursor_height - 1); -+ y = 0; -+ } -+ position->enable = true; -+ position->x = x; -+ position->y = y; -+ position->x_hotspot = xorigin; -+ position->y_hotspot = yorigin; -+ -+ return 0; -+} -+ - static void handle_cursor_update( - struct drm_plane *plane, - struct drm_plane_state *old_plane_state) - { -+ struct amdgpu_framebuffer *afb = to_amdgpu_framebuffer(plane->state->fb); -+ struct drm_crtc *crtc = afb ? plane->state->crtc : old_plane_state->crtc; -+ struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) : NULL; -+ struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); -+ uint64_t address = afb ? afb->address : 0; -+ struct dc_cursor_position position; -+ struct dc_cursor_attributes attributes; -+ int ret; -+ - if (!plane->state->fb && !old_plane_state->fb) - return; - -- /* Check if it's a cursor on/off update or just cursor move*/ -- if (plane->state->fb == old_plane_state->fb) -- dm_crtc_cursor_move( -- plane->state->crtc, -- plane->state->crtc_x, -- plane->state->crtc_y); -- else { -- struct amdgpu_framebuffer *afb = -- to_amdgpu_framebuffer(plane->state->fb); -- dm_crtc_cursor_set( -- (!!plane->state->fb) ? -- plane->state->crtc : -- old_plane_state->crtc, -- (!!plane->state->fb) ? -- afb->address : -- 0, -- plane->state->crtc_w, -- plane->state->crtc_h); -+ DRM_DEBUG_KMS("%s: crtc_id=%d with size %d to %d\n", -+ __func__, -+ amdgpu_crtc->crtc_id, -+ plane->state->crtc_w, -+ plane->state->crtc_h); -+ -+ ret = get_cursor_position(plane, crtc, &position); -+ if (ret) -+ return; -+ -+ if (!position.enable) { -+ /* turn off cursor */ -+ if (crtc_state && crtc_state->stream) -+ dc_stream_set_cursor_position(crtc_state->stream, -+ &position); -+ return; - } --} - -+ amdgpu_crtc->cursor_width = plane->state->crtc_w; -+ amdgpu_crtc->cursor_height = plane->state->crtc_h; -+ -+ attributes.address.high_part = upper_32_bits(address); -+ attributes.address.low_part = lower_32_bits(address); -+ attributes.width = plane->state->crtc_w; -+ attributes.height = plane->state->crtc_h; -+ attributes.color_format = CURSOR_MODE_COLOR_PRE_MULTIPLIED_ALPHA; -+ attributes.rotation_angle = 0; -+ attributes.attribute_flags.value = 0; -+ -+ attributes.pitch = attributes.width; -+ -+ if (!dc_stream_set_cursor_attributes(crtc_state->stream, -+ &attributes)) -+ DRM_ERROR("DC failed to set cursor attributes\n"); -+ -+ if (crtc_state->stream) -+ if (!dc_stream_set_cursor_position(crtc_state->stream, -+ &position)) -+ DRM_ERROR("DC failed to set cursor position\n"); -+} - - static void prepare_flip_isr(struct amdgpu_crtc *acrtc) - { --- -2.7.4 - |