]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/modeset: Handle tiled displays in pan_display_atomic.
authorMaarten Lankhorst <dev@lankhorst.se>
Thu, 16 Jan 2025 14:28:24 +0000 (15:28 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Mar 2025 11:47:05 +0000 (12:47 +0100)
commit f4a9dd57e549a17a7dac1c1defec26abd7e5c2d4 upstream.

Tiled displays have a different x/y offset to begin with. Instead of
attempting to remember this, just apply a delta instead.

This fixes the first tile being duplicated on other tiles when vt
switching.

Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20250116142825.3933-1-dev@lankhorst.se
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
Cc: <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/drm_fb_helper.c

index 04f2ec2254e9f0074a0945a1a2a03d4839dc66fe..8446bd6239c97a9bdc670b4de260cd89ac832e39 100644 (file)
@@ -1380,14 +1380,14 @@ int drm_fb_helper_set_par(struct fb_info *info)
 }
 EXPORT_SYMBOL(drm_fb_helper_set_par);
 
-static void pan_set(struct drm_fb_helper *fb_helper, int x, int y)
+static void pan_set(struct drm_fb_helper *fb_helper, int dx, int dy)
 {
        struct drm_mode_set *mode_set;
 
        mutex_lock(&fb_helper->client.modeset_mutex);
        drm_client_for_each_modeset(mode_set, &fb_helper->client) {
-               mode_set->x x;
-               mode_set->y y;
+               mode_set->x += dx;
+               mode_set->y += dy;
        }
        mutex_unlock(&fb_helper->client.modeset_mutex);
 }
@@ -1396,16 +1396,18 @@ static int pan_display_atomic(struct fb_var_screeninfo *var,
                              struct fb_info *info)
 {
        struct drm_fb_helper *fb_helper = info->par;
-       int ret;
+       int ret, dx, dy;
 
-       pan_set(fb_helper, var->xoffset, var->yoffset);
+       dx = var->xoffset - info->var.xoffset;
+       dy = var->yoffset - info->var.yoffset;
+       pan_set(fb_helper, dx, dy);
 
        ret = drm_client_modeset_commit_locked(&fb_helper->client);
        if (!ret) {
                info->var.xoffset = var->xoffset;
                info->var.yoffset = var->yoffset;
        } else
-               pan_set(fb_helper, info->var.xoffset, info->var.yoffset);
+               pan_set(fb_helper, -dx, -dy);
 
        return ret;
 }