Commit f4a9dd57 authored by Maarten Lankhorst's avatar Maarten Lankhorst
Browse files

drm/modeset: Handle tiled displays in pan_display_atomic.



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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/20250116142825.3933-1-dev@lankhorst.se


Signed-off-by: default avatarMaarten Lankhorst <dev@lankhorst.se>
Cc: <stable@vger.kernel.org>
parent ef84aee1
Loading
Loading
Loading
Loading
+8 −6
Original line number Diff line number Diff line
@@ -1354,14 +1354,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);
}
@@ -1370,16 +1370,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;
}