Module Name:    src
Committed By:   jakllsch
Date:           Wed Jan 25 17:31:55 UTC 2017

Modified Files:
        src/sys/dev/ic: igsfb.c igsfb_subr.c

Log Message:
Improve/fix igsfb(4) support for 15BPP.

Use howmany(depth, NBBY) instead of (depth >> 3), so that 15 bits maps
to 2 bytes instead of 1.

While here, in a nearly-identical change, don't hard-code 8BPP into the
CyberPro blitter.


To generate a diff of this commit:
cvs rdiff -u -r1.55 -r1.56 src/sys/dev/ic/igsfb.c
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/ic/igsfb_subr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ic/igsfb.c
diff -u src/sys/dev/ic/igsfb.c:1.55 src/sys/dev/ic/igsfb.c:1.56
--- src/sys/dev/ic/igsfb.c:1.55	Wed Jan 25 16:11:54 2017
+++ src/sys/dev/ic/igsfb.c	Wed Jan 25 17:31:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: igsfb.c,v 1.55 2017/01/25 16:11:54 jakllsch Exp $ */
+/*	$NetBSD: igsfb.c,v 1.56 2017/01/25 17:31:55 jakllsch Exp $ */
 
 /*
  * Copyright (c) 2002, 2003 Valeriy E. Ushakov
@@ -31,7 +31,7 @@
  * Integraphics Systems IGA 168x and CyberPro series.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: igsfb.c,v 1.55 2017/01/25 16:11:54 jakllsch Exp $");
+__KERNEL_RCSID(0, "$NetBSD: igsfb.c,v 1.56 2017/01/25 17:31:55 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -359,7 +359,6 @@ igsfb_init_video(struct igsfb_devconfig 
 	 * Init graphic coprocessor for accelerated rasops.
 	 */
 	if (dc->dc_id >= 0x2000) { /* XXX */
-		/* XXX: hardcoded 8bpp */
 		bus_space_write_2(dc->dc_iot, dc->dc_coph,
 				  IGS_COP_SRC_MAP_WIDTH_REG,
 				  dc->dc_width - 1);
@@ -369,7 +368,7 @@ igsfb_init_video(struct igsfb_devconfig 
 
 		bus_space_write_1(dc->dc_iot, dc->dc_coph,
 				  IGS_COP_MAP_FMT_REG,
-				  IGS_COP_MAP_8BPP);
+				  howmany(dc->dc_depth, NBBY) - 1);
 	}
 
 	/* make sure screen is not blanked */
@@ -635,7 +634,7 @@ igsfb_ioctl(void *v, void *vs, u_long cm
 		return 0;
 
 	case WSDISPLAYIO_LINEBYTES:
-		*(int *)data = dc->dc_width * (dc->dc_maxdepth >> 3);
+		*(int *)data = dc->dc_width * howmany(dc->dc_maxdepth, NBBY);
 		return 0;
 
 	case WSDISPLAYIO_SMODE:
@@ -1192,7 +1191,8 @@ igsfb_accel_wait(struct igsfb_devconfig 
 	int timo = 100000;
 	uint8_t reg;
 
-	bus_space_write_1(t, h, IGS_COP_MAP_FMT_REG, (dc->dc_depth >> 3) - 1);
+	bus_space_write_1(t, h, IGS_COP_MAP_FMT_REG,
+	    howmany(dc->dc_depth, NBBY) - 1);
 	while (timo--) {
 		reg = bus_space_read_1(t, h, IGS_COP_CTL_REG);
 		if ((reg & IGS_COP_CTL_BUSY) == 0)

Index: src/sys/dev/ic/igsfb_subr.c
diff -u src/sys/dev/ic/igsfb_subr.c:1.12 src/sys/dev/ic/igsfb_subr.c:1.13
--- src/sys/dev/ic/igsfb_subr.c:1.12	Wed Nov 18 21:59:38 2009
+++ src/sys/dev/ic/igsfb_subr.c	Wed Jan 25 17:31:55 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: igsfb_subr.c,v 1.12 2009/11/18 21:59:38 macallan Exp $ */
+/*	$NetBSD: igsfb_subr.c,v 1.13 2017/01/25 17:31:55 jakllsch Exp $ */
 
 /*
  * Copyright (c) 2002 Valeriy E. Ushakov
@@ -32,7 +32,7 @@
  * Integraphics Systems IGA 168x and CyberPro series.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: igsfb_subr.c,v 1.12 2009/11/18 21:59:38 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: igsfb_subr.c,v 1.13 2017/01/25 17:31:55 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -511,7 +511,7 @@ igsfb_set_mode(struct igsfb_devconfig *d
 			depth = 8;
 			seq_mode = IGS_EXT_SEQ_8BPP;
 	}
-	bytes_per_pixel = depth >> 3;
+	bytes_per_pixel = howmany(depth, NBBY);
 
 	hoffset = (mode->hdisplay >> 3) * bytes_per_pixel;
 	memfetch = hoffset + 1;
@@ -660,7 +660,7 @@ igsfb_set_mode(struct igsfb_devconfig *d
 	dc->dc_width = mode->hdisplay;
 	dc->dc_height = mode->vdisplay;
 	dc->dc_depth = depth;
-	dc->dc_stride = dc->dc_width * (depth >> 3);
+	dc->dc_stride = dc->dc_width * howmany(depth, NBBY);
 
 	igsfb_video_on(dc);
 }

Reply via email to