diff mbox series

[v4,4/7] drm/mgag200: Add dedicated variables for blanking fields

Message ID 20240705114900.572-5-tzimmermann@suse.de (mailing list archive)
State New, archived
Headers show
Series drm/mgag200: Implement VBLANK support | expand

Commit Message

Thomas Zimmermann July 5, 2024, 11:47 a.m. UTC
Represent fields for horizontal and vertical blanking with <hblkstr>,
<hblkend>, <vblkstr> and <vblkend>. Aligns the code with the Matrox
programming manuals.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
 drivers/gpu/drm/mgag200/mgag200_mode.c | 29 ++++++++++++++------------
 1 file changed, 16 insertions(+), 13 deletions(-)

Comments

Jocelyn Falempe July 8, 2024, 12:16 p.m. UTC | #1
On 05/07/2024 13:47, Thomas Zimmermann wrote:
> Represent fields for horizontal and vertical blanking with <hblkstr>,
> <hblkend>, <vblkstr> and <vblkend>. Aligns the code with the Matrox
> programming manuals.

Thanks, it looks good to me.

Reviewed-by: Jocelyn Falempe <jfalempe@redhat.com>

> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
>   drivers/gpu/drm/mgag200/mgag200_mode.c | 29 ++++++++++++++------------
>   1 file changed, 16 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
> index ccad5bd5960d..1cd28e7bea32 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_mode.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
> @@ -204,23 +204,26 @@ void mgag200_init_registers(struct mga_device *mdev)
>   void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mode *mode)
>   {
>   	const struct mgag200_device_info *info = mdev->info;
> -	unsigned int hdispend, hsyncstr, hsyncend, htotal;
> -	unsigned int vdispend, vsyncstr, vsyncend, vtotal;
> +	unsigned int hdispend, hsyncstr, hsyncend, htotal, hblkstr, hblkend;
> +	unsigned int vdispend, vsyncstr, vsyncend, vtotal, vblkstr, vblkend;
>   	u8 misc, crtcext1, crtcext2, crtcext5;
>   
>   	hdispend = mode->crtc_hdisplay / 8 - 1;
>   	hsyncstr = mode->crtc_hsync_start / 8 - 1;
>   	hsyncend = mode->crtc_hsync_end / 8 - 1;
>   	htotal = mode->crtc_htotal / 8 - 1;
> -
>   	/* Work around hardware quirk */
>   	if ((htotal & 0x07) == 0x06 || (htotal & 0x07) == 0x04)
>   		htotal++;
> +	hblkstr = mode->crtc_hblank_start / 8 - 1;
> +	hblkend = htotal;
>   
>   	vdispend = mode->crtc_vdisplay - 1;
>   	vsyncstr = mode->crtc_vsync_start - 1;
>   	vsyncend = mode->crtc_vsync_end - 1;
>   	vtotal = mode->crtc_vtotal - 2;
> +	vblkstr = mode->crtc_vblank_start;
> +	vblkend = vtotal + 1;
>   
>   	misc = RREG8(MGA_MISC_IN);
>   
> @@ -235,43 +238,43 @@ void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mod
>   		misc &= ~MGAREG_MISC_VSYNCPOL;
>   
>   	crtcext1 = (((htotal - 4) & 0x100) >> 8) |
> -		    ((hdispend & 0x100) >> 7) |
> +		    ((hblkstr & 0x100) >> 7) |
>   		    ((hsyncstr & 0x100) >> 6) |
> -		     (htotal & 0x40);
> +		     (hblkend & 0x40);
>   	if (info->has_vidrst)
>   		crtcext1 |= MGAREG_CRTCEXT1_VRSTEN |
>   			    MGAREG_CRTCEXT1_HRSTEN;
>   
>   	crtcext2 = ((vtotal & 0xc00) >> 10) |
>   		   ((vdispend & 0x400) >> 8) |
> -		   ((vdispend & 0xc00) >> 7) |
> +		   ((vblkstr & 0xc00) >> 7) |
>   		   ((vsyncstr & 0xc00) >> 5) |
>   		   ((vdispend & 0x400) >> 3);
>   	crtcext5 = 0x00;
>   
>   	WREG_CRT(0x00, htotal - 4);
>   	WREG_CRT(0x01, hdispend);
> -	WREG_CRT(0x02, hdispend);
> -	WREG_CRT(0x03, (htotal & 0x1f) | 0x80);
> +	WREG_CRT(0x02, hblkstr);
> +	WREG_CRT(0x03, (hblkend & 0x1f) | 0x80);
>   	WREG_CRT(0x04, hsyncstr);
> -	WREG_CRT(0x05, ((htotal & 0x20) << 2) | (hsyncend & 0x1f));
> +	WREG_CRT(0x05, ((hblkend & 0x20) << 2) | (hsyncend & 0x1f));
>   	WREG_CRT(0x06, vtotal & 0xff);
>   	WREG_CRT(0x07, ((vtotal & 0x100) >> 8) |
>   		       ((vdispend & 0x100) >> 7) |
>   		       ((vsyncstr & 0x100) >> 6) |
> -		       ((vdispend & 0x100) >> 5) |
> +		       ((vblkstr & 0x100) >> 5) |
>   		       ((vdispend & 0x100) >> 4) | /* linecomp */
>   		       ((vtotal & 0x200) >> 4) |
>   		       ((vdispend & 0x200) >> 3) |
>   		       ((vsyncstr & 0x200) >> 2));
> -	WREG_CRT(0x09, ((vdispend & 0x200) >> 4) |
> +	WREG_CRT(0x09, ((vblkstr & 0x200) >> 4) |
>   		       ((vdispend & 0x200) >> 3));
>   	WREG_CRT(0x10, vsyncstr & 0xff);
>   	WREG_CRT(0x11, (vsyncend & 0x0f) | 0x20);
>   	WREG_CRT(0x12, vdispend & 0xff);
>   	WREG_CRT(0x14, 0);
> -	WREG_CRT(0x15, vdispend & 0xff);
> -	WREG_CRT(0x16, (vtotal + 1) & 0xff);
> +	WREG_CRT(0x15, vblkstr & 0xff);
> +	WREG_CRT(0x16, vblkend & 0xff);
>   	WREG_CRT(0x17, 0xc3);
>   	WREG_CRT(0x18, vdispend & 0xff);
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/mgag200/mgag200_mode.c b/drivers/gpu/drm/mgag200/mgag200_mode.c
index ccad5bd5960d..1cd28e7bea32 100644
--- a/drivers/gpu/drm/mgag200/mgag200_mode.c
+++ b/drivers/gpu/drm/mgag200/mgag200_mode.c
@@ -204,23 +204,26 @@  void mgag200_init_registers(struct mga_device *mdev)
 void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mode *mode)
 {
 	const struct mgag200_device_info *info = mdev->info;
-	unsigned int hdispend, hsyncstr, hsyncend, htotal;
-	unsigned int vdispend, vsyncstr, vsyncend, vtotal;
+	unsigned int hdispend, hsyncstr, hsyncend, htotal, hblkstr, hblkend;
+	unsigned int vdispend, vsyncstr, vsyncend, vtotal, vblkstr, vblkend;
 	u8 misc, crtcext1, crtcext2, crtcext5;
 
 	hdispend = mode->crtc_hdisplay / 8 - 1;
 	hsyncstr = mode->crtc_hsync_start / 8 - 1;
 	hsyncend = mode->crtc_hsync_end / 8 - 1;
 	htotal = mode->crtc_htotal / 8 - 1;
-
 	/* Work around hardware quirk */
 	if ((htotal & 0x07) == 0x06 || (htotal & 0x07) == 0x04)
 		htotal++;
+	hblkstr = mode->crtc_hblank_start / 8 - 1;
+	hblkend = htotal;
 
 	vdispend = mode->crtc_vdisplay - 1;
 	vsyncstr = mode->crtc_vsync_start - 1;
 	vsyncend = mode->crtc_vsync_end - 1;
 	vtotal = mode->crtc_vtotal - 2;
+	vblkstr = mode->crtc_vblank_start;
+	vblkend = vtotal + 1;
 
 	misc = RREG8(MGA_MISC_IN);
 
@@ -235,43 +238,43 @@  void mgag200_set_mode_regs(struct mga_device *mdev, const struct drm_display_mod
 		misc &= ~MGAREG_MISC_VSYNCPOL;
 
 	crtcext1 = (((htotal - 4) & 0x100) >> 8) |
-		    ((hdispend & 0x100) >> 7) |
+		    ((hblkstr & 0x100) >> 7) |
 		    ((hsyncstr & 0x100) >> 6) |
-		     (htotal & 0x40);
+		     (hblkend & 0x40);
 	if (info->has_vidrst)
 		crtcext1 |= MGAREG_CRTCEXT1_VRSTEN |
 			    MGAREG_CRTCEXT1_HRSTEN;
 
 	crtcext2 = ((vtotal & 0xc00) >> 10) |
 		   ((vdispend & 0x400) >> 8) |
-		   ((vdispend & 0xc00) >> 7) |
+		   ((vblkstr & 0xc00) >> 7) |
 		   ((vsyncstr & 0xc00) >> 5) |
 		   ((vdispend & 0x400) >> 3);
 	crtcext5 = 0x00;
 
 	WREG_CRT(0x00, htotal - 4);
 	WREG_CRT(0x01, hdispend);
-	WREG_CRT(0x02, hdispend);
-	WREG_CRT(0x03, (htotal & 0x1f) | 0x80);
+	WREG_CRT(0x02, hblkstr);
+	WREG_CRT(0x03, (hblkend & 0x1f) | 0x80);
 	WREG_CRT(0x04, hsyncstr);
-	WREG_CRT(0x05, ((htotal & 0x20) << 2) | (hsyncend & 0x1f));
+	WREG_CRT(0x05, ((hblkend & 0x20) << 2) | (hsyncend & 0x1f));
 	WREG_CRT(0x06, vtotal & 0xff);
 	WREG_CRT(0x07, ((vtotal & 0x100) >> 8) |
 		       ((vdispend & 0x100) >> 7) |
 		       ((vsyncstr & 0x100) >> 6) |
-		       ((vdispend & 0x100) >> 5) |
+		       ((vblkstr & 0x100) >> 5) |
 		       ((vdispend & 0x100) >> 4) | /* linecomp */
 		       ((vtotal & 0x200) >> 4) |
 		       ((vdispend & 0x200) >> 3) |
 		       ((vsyncstr & 0x200) >> 2));
-	WREG_CRT(0x09, ((vdispend & 0x200) >> 4) |
+	WREG_CRT(0x09, ((vblkstr & 0x200) >> 4) |
 		       ((vdispend & 0x200) >> 3));
 	WREG_CRT(0x10, vsyncstr & 0xff);
 	WREG_CRT(0x11, (vsyncend & 0x0f) | 0x20);
 	WREG_CRT(0x12, vdispend & 0xff);
 	WREG_CRT(0x14, 0);
-	WREG_CRT(0x15, vdispend & 0xff);
-	WREG_CRT(0x16, (vtotal + 1) & 0xff);
+	WREG_CRT(0x15, vblkstr & 0xff);
+	WREG_CRT(0x16, vblkend & 0xff);
 	WREG_CRT(0x17, 0xc3);
 	WREG_CRT(0x18, vdispend & 0xff);