mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			2.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From 8757ab629ec26bd78885c66ea24a65df2b48bd55 Mon Sep 17 00:00:00 2001
 | 
						|
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
 | 
						|
Date: Mon, 8 Nov 2021 17:32:45 +0000
 | 
						|
Subject: [PATCH] drm/vc4: Enable gamma block only when required.
 | 
						|
 | 
						|
With HVS5 the gamma block is now only reprogrammed with
 | 
						|
a disable/enable. Loading the table from vc4_hvs_init_channel
 | 
						|
(called from vc4_hvs_atomic_enable) appears to be at an
 | 
						|
invalid point in time and so isn't applied.
 | 
						|
 | 
						|
Switch to enabling and disabling the gamma table instead. This
 | 
						|
isn't safe if the pipeline is running, but it isn't now.
 | 
						|
For HVS4 it is safe to enable and disable dynamically, so
 | 
						|
adopt that approach there too.
 | 
						|
 | 
						|
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
 | 
						|
---
 | 
						|
 drivers/gpu/drm/vc4/vc4_hvs.c | 22 ++++++++++++++++------
 | 
						|
 1 file changed, 16 insertions(+), 6 deletions(-)
 | 
						|
 | 
						|
--- a/drivers/gpu/drm/vc4/vc4_hvs.c
 | 
						|
+++ b/drivers/gpu/drm/vc4/vc4_hvs.c
 | 
						|
@@ -546,8 +546,11 @@ static int vc4_hvs_init_channel(struct v
 | 
						|
 	dispbkgndx &= ~SCALER_DISPBKGND_GAMMA;
 | 
						|
 	dispbkgndx &= ~SCALER_DISPBKGND_INTERLACE;
 | 
						|
 
 | 
						|
+	if (crtc->state->gamma_lut)
 | 
						|
+		/* Enable gamma on if required */
 | 
						|
+		dispbkgndx |= SCALER_DISPBKGND_GAMMA;
 | 
						|
+
 | 
						|
 	HVS_WRITE(SCALER_DISPBKGNDX(chan), dispbkgndx |
 | 
						|
-		  ((!vc4->is_vc5) ? SCALER_DISPBKGND_GAMMA : 0) |
 | 
						|
 		  (interlace ? SCALER_DISPBKGND_INTERLACE : 0));
 | 
						|
 
 | 
						|
 	/* Reload the LUT, since the SRAMs would have been disabled if
 | 
						|
@@ -816,18 +819,25 @@ void vc4_hvs_atomic_flush(struct drm_crt
 | 
						|
 		u32 dispbkgndx = HVS_READ(SCALER_DISPBKGNDX(channel));
 | 
						|
 
 | 
						|
 		if (crtc->state->gamma_lut) {
 | 
						|
-			if (!vc4->is_vc5)
 | 
						|
+			if (!vc4->is_vc5) {
 | 
						|
 				vc4_hvs_update_gamma_lut(hvs, vc4_crtc);
 | 
						|
-			else
 | 
						|
+				dispbkgndx |= SCALER_DISPBKGND_GAMMA;
 | 
						|
+			} else {
 | 
						|
 				vc5_hvs_update_gamma_lut(hvs, vc4_crtc);
 | 
						|
-
 | 
						|
-			dispbkgndx |= SCALER_DISPBKGND_GAMMA;
 | 
						|
+			}
 | 
						|
 		} else {
 | 
						|
 			/* Unsetting DISPBKGND_GAMMA skips the gamma lut step
 | 
						|
 			 * in hardware, which is the same as a linear lut that
 | 
						|
 			 * DRM expects us to use in absence of a user lut.
 | 
						|
+			 *
 | 
						|
+			 * Do NOT change state dynamically for hvs5 as it
 | 
						|
+			 * inserts a delay in the pipeline that will cause
 | 
						|
+			 * stalls if enabled/disabled whilst running. The other
 | 
						|
+			 * should already be disabling/enabling the pipeline
 | 
						|
+			 * when gamma changes.
 | 
						|
 			 */
 | 
						|
-			dispbkgndx &= ~SCALER_DISPBKGND_GAMMA;
 | 
						|
+			if (!vc4->is_vc5)
 | 
						|
+				dispbkgndx &= ~SCALER_DISPBKGND_GAMMA;
 | 
						|
 		}
 | 
						|
 		HVS_WRITE(SCALER_DISPBKGNDX(channel), dispbkgndx);
 | 
						|
 	}
 |