]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amd/display: Reject too small viewport size when validating plane
authorNikola Cornij <nikola.cornij@amd.com>
Fri, 22 Jan 2021 03:35:54 +0000 (22:35 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 2 Feb 2021 17:12:22 +0000 (12:12 -0500)
[why]
Overlay won't move to a new positon if viewport size is smaller than
what can be handled. It'd either disappear or stay at the old
position. This condition is for example hit if overlay is moved too
much outside of left or top edge of the screen, but it applies to
any non-cursor plane type.

[how]
Reject this contidion at validation time. This gives the calling
level a chance to handle this gracefully and avoid inconsistent
behaivor.

Signed-off-by: Nikola Cornij <nikola.cornij@amd.com>
Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com>
Acked-by: Anson Jacob <Anson.Jacob@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/dc.h

index 8ff10d1b633f32f9d28452939b3443c5dcf5fe89..f47551c9b2f15c9a7a610a0e929d93740e330585 100644 (file)
@@ -6411,8 +6411,33 @@ static int dm_plane_helper_check_state(struct drm_plane_state *state,
        int min_scale = 0;
        int max_scale = INT_MAX;
 
-       /* Plane enabled? Get min/max allowed scaling factors from plane caps. */
+       /* Plane enabled? Validate viewport and get scaling factors from plane caps. */
        if (fb && state->crtc) {
+               /* Validate viewport to cover the case when only the position changes */
+               if (state->plane->type != DRM_PLANE_TYPE_CURSOR) {
+                       int viewport_width = state->crtc_w;
+                       int viewport_height = state->crtc_h;
+
+                       if (state->crtc_x < 0)
+                               viewport_width += state->crtc_x;
+                       else if (state->crtc_x + state->crtc_w > new_crtc_state->mode.crtc_hdisplay)
+                               viewport_width = new_crtc_state->mode.crtc_hdisplay - state->crtc_x;
+
+                       if (state->crtc_y < 0)
+                               viewport_height += state->crtc_y;
+                       else if (state->crtc_y + state->crtc_h > new_crtc_state->mode.crtc_vdisplay)
+                               viewport_height = new_crtc_state->mode.crtc_vdisplay - state->crtc_y;
+
+                       /* If completely outside of screen, viewport_width and/or viewport_height will be negative,
+                        * which is still OK to satisfy the condition below, thereby also covering these cases
+                        * (when plane is completely outside of screen).
+                        * x2 for width is because of pipe-split.
+                        */
+                       if (viewport_width < MIN_VIEWPORT_SIZE*2 || viewport_height < MIN_VIEWPORT_SIZE)
+                               return -EINVAL;
+               }
+
+               /* Get min/max allowed scaling factors from plane caps. */
                get_min_max_dc_plane_scaling(state->crtc->dev, fb,
                                             &min_downscale, &max_upscale);
                /*
index 68b65a090d1708ca2fe401d4116e883125242209..0c26c2ade782c4ea69713e814d186e06ca755e39 100644 (file)
@@ -1153,8 +1153,8 @@ bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx)
 
        calculate_viewport(pipe_ctx);
 
-       if (pipe_ctx->plane_res.scl_data.viewport.height < 12 ||
-               pipe_ctx->plane_res.scl_data.viewport.width < 12) {
+       if (pipe_ctx->plane_res.scl_data.viewport.height < MIN_VIEWPORT_SIZE ||
+               pipe_ctx->plane_res.scl_data.viewport.width < MIN_VIEWPORT_SIZE) {
                if (store_h_border_left) {
                        restore_border_left_from_dst(pipe_ctx,
                                store_h_border_left);
index d5105924c9e0e939ef31e235fe4140b0f483a117..be9adddfac964ca8de45e741c987e60475decbeb 100644 (file)
@@ -48,6 +48,7 @@
 #define MAX_PLANES 6
 #define MAX_STREAMS 6
 #define MAX_SINKS_PER_LINK 4
+#define MIN_VIEWPORT_SIZE 12
 
 /*******************************************************************************
  * Display Core Interfaces