mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From e8bb5f7a69eeb3493659a72a6fc003eabfc005b1 Mon Sep 17 00:00:00 2001
 | 
						|
From: Phil Elwell <8911409+pelwell@users.noreply.github.com>
 | 
						|
Date: Wed, 24 Aug 2022 11:14:40 +0100
 | 
						|
Subject: [PATCH] drm/vc4: Add async update support for cursor planes
 | 
						|
 | 
						|
Now that cursors are implemented as regular planes, all cursor
 | 
						|
movements result in atomic updates. As the firmware-kms driver
 | 
						|
doesn't support asynchronous updates, these are synchronous, which
 | 
						|
limits the update rate to the screen refresh rate. Xorg seems unaware
 | 
						|
of this (or at least of the effect of this), because if the mouse is
 | 
						|
configured with a higher update rate than the screen then continuous
 | 
						|
mouse movement results in an increasing backlog of mouse events -
 | 
						|
cue extreme lag.
 | 
						|
 | 
						|
Add minimal support for asynchronous updates - limited to cursor
 | 
						|
planes - to eliminate the lag.
 | 
						|
 | 
						|
See: https://github.com/raspberrypi/linux/pull/4971
 | 
						|
     https://github.com/raspberrypi/linux/issues/4988
 | 
						|
 | 
						|
Signed-off-by: Phil Elwell <phil@raspberrypi.com>
 | 
						|
---
 | 
						|
 drivers/gpu/drm/vc4/vc4_firmware_kms.c | 46 ++++++++++++++++++++++++++
 | 
						|
 1 file changed, 46 insertions(+)
 | 
						|
 | 
						|
--- a/drivers/gpu/drm/vc4/vc4_firmware_kms.c
 | 
						|
+++ b/drivers/gpu/drm/vc4/vc4_firmware_kms.c
 | 
						|
@@ -675,6 +675,50 @@ static int vc4_plane_atomic_check(struct
 | 
						|
 	return vc4_plane_to_mb(plane, &vc4_plane->mb, new_plane_state);
 | 
						|
 }
 | 
						|
 
 | 
						|
+static void vc4_plane_atomic_async_update(struct drm_plane *plane,
 | 
						|
+					  struct drm_atomic_state *state)
 | 
						|
+{
 | 
						|
+	struct drm_plane_state *new_plane_state =
 | 
						|
+		drm_atomic_get_new_plane_state(state, plane);
 | 
						|
+
 | 
						|
+	swap(plane->state->fb, new_plane_state->fb);
 | 
						|
+	plane->state->crtc_x = new_plane_state->crtc_x;
 | 
						|
+	plane->state->crtc_y = new_plane_state->crtc_y;
 | 
						|
+	plane->state->crtc_w = new_plane_state->crtc_w;
 | 
						|
+	plane->state->crtc_h = new_plane_state->crtc_h;
 | 
						|
+	plane->state->src_x = new_plane_state->src_x;
 | 
						|
+	plane->state->src_y = new_plane_state->src_y;
 | 
						|
+	plane->state->src_w = new_plane_state->src_w;
 | 
						|
+	plane->state->src_h = new_plane_state->src_h;
 | 
						|
+	plane->state->alpha = new_plane_state->alpha;
 | 
						|
+	plane->state->pixel_blend_mode = new_plane_state->pixel_blend_mode;
 | 
						|
+	plane->state->rotation = new_plane_state->rotation;
 | 
						|
+	plane->state->zpos = new_plane_state->zpos;
 | 
						|
+	plane->state->normalized_zpos = new_plane_state->normalized_zpos;
 | 
						|
+	plane->state->color_encoding = new_plane_state->color_encoding;
 | 
						|
+	plane->state->color_range = new_plane_state->color_range;
 | 
						|
+	plane->state->src = new_plane_state->src;
 | 
						|
+	plane->state->dst = new_plane_state->dst;
 | 
						|
+	plane->state->visible = new_plane_state->visible;
 | 
						|
+
 | 
						|
+	vc4_plane_set_blank(plane, false);
 | 
						|
+}
 | 
						|
+
 | 
						|
+static int vc4_plane_atomic_async_check(struct drm_plane *plane,
 | 
						|
+					struct drm_atomic_state *state)
 | 
						|
+{
 | 
						|
+	struct drm_plane_state *new_plane_state =
 | 
						|
+		drm_atomic_get_new_plane_state(state, plane);
 | 
						|
+	int ret = -EINVAL;
 | 
						|
+
 | 
						|
+	if (plane->type == 2 &&
 | 
						|
+	    plane->state->fb &&
 | 
						|
+	    new_plane_state->crtc->state->active)
 | 
						|
+		ret = 0;
 | 
						|
+
 | 
						|
+	return ret;
 | 
						|
+}
 | 
						|
+
 | 
						|
 /* Called during init to allocate the plane's atomic state. */
 | 
						|
 static void vc4_plane_reset(struct drm_plane *plane)
 | 
						|
 {
 | 
						|
@@ -769,6 +813,8 @@ static const struct drm_plane_helper_fun
 | 
						|
 	.atomic_check = vc4_plane_atomic_check,
 | 
						|
 	.atomic_update = vc4_plane_atomic_update,
 | 
						|
 	.atomic_disable = vc4_plane_atomic_disable,
 | 
						|
+	.atomic_async_check = vc4_plane_atomic_async_check,
 | 
						|
+	.atomic_async_update = vc4_plane_atomic_async_update,
 | 
						|
 };
 | 
						|
 
 | 
						|
 static struct drm_plane *vc4_fkms_plane_init(struct drm_device *dev,
 |