Module Name:    src
Committed By:   macallan
Date:           Tue Nov 19 16:13:20 UTC 2024

Modified Files:
        src/sys/arch/hppa/dev: summitfb.c

Log Message:
add hardware cursor support
while there remove debug goop, fix ioctl(GCID)


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/hppa/dev/summitfb.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/arch/hppa/dev/summitfb.c
diff -u src/sys/arch/hppa/dev/summitfb.c:1.3 src/sys/arch/hppa/dev/summitfb.c:1.4
--- src/sys/arch/hppa/dev/summitfb.c:1.3	Tue Nov 19 15:50:41 2024
+++ src/sys/arch/hppa/dev/summitfb.c	Tue Nov 19 16:13:20 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: summitfb.c,v 1.3 2024/11/19 15:50:41 riastradh Exp $	*/
+/*	$NetBSD: summitfb.c,v 1.4 2024/11/19 16:13:20 macallan Exp $	*/
 
 /*	$OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $	*/
 
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.3 2024/11/19 15:50:41 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.4 2024/11/19 16:13:20 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -192,6 +192,12 @@ static inline void summitfb_wait_fifo(st
 #define VISFX_COLOR_INDEX	0x800020
 #define VISFX_COLOR_VALUE	0x800024
 
+#define VISFX_CURSOR_POS	0x400000
+#define VISFX_CURSOR_INDEX	0x400004
+#define VISFX_CURSOR_DATA	0x400008
+#define VISFX_CURSOR_COLOR	0x400010
+#define VISFX_CURSOR_ENABLE	0x80000000
+
 int
 summitfb_match(device_t parent, cfdata_t cf, void *aux)
 {
@@ -366,16 +372,6 @@ summitfb_attach(device_t parent, device_
 	aa.accesscookie = &sc->vd;
 
 	config_found(sc->sc_dev, &aa, wsemuldisplaydevprint, CFARGS_NONE);
-
-	printf("pmask  %08x\n", summitfb_read4(sc, 0xa0084c));
-	printf("vmask  %08x\n", summitfb_read4(sc, 0xa0082c));
-	printf("status %08x\n", summitfb_read4(sc, 0x249000));
-	printf("stat   %08x\n", summitfb_read4(sc, 0x641400));
-	printf("size   %08x\n", summitfb_read4(sc, 0xac1054));
-	printf("mode   %08x\n", summitfb_read4(sc, VISFX_VRAM_WRITE_MODE));
-	printf("colour %08x\n", summitfb_read4(sc, 0xa00844));
-	printf("cursor %08x\n", summitfb_read4(sc, 0x400000));
-	printf("cindex %08x\n", summitfb_read4(sc, 0x800020));
 }
 
 /*
@@ -737,7 +733,7 @@ summitfb_ioctl(void *v, void *vs, u_long
 		return 0;
 
 	case GCID:
-		*(u_int *)data = STI_DD_EG;
+		*(u_int *)data = sc->sc_scr.scr_rom->rom_dd.dd_grid[0];
 		return 0;
 
 	/* PCI config read/write passthrough. */
@@ -780,10 +776,11 @@ summitfb_ioctl(void *v, void *vs, u_long
 			if(new_mode == WSDISPLAYIO_MODE_EMUL) {
 				summitfb_setup(sc);
 				summitfb_restore_palette(sc);
-				glyphcache_wipe(&sc->sc_gc);
+				//glyphcache_wipe(&sc->sc_gc);
 				summitfb_rectfill(sc, 0, 0, sc->sc_width,
 				    sc->sc_height, ms->scr_ri.ri_devcmap[
 				    (ms->scr_defattr >> 16) & 0xff]);
+				summitfb_setup_fb(sc);
 				vcons_redraw_screen(ms);
 				summitfb_set_video(sc, 1);
 			}
@@ -857,7 +854,7 @@ summitfb_mmap(void *v, void *vs, off_t o
 		    prot, BUS_SPACE_MAP_LINEAR);
 	} else if (offset >= 0x80000000 && offset < 0x80400000) {
 		/* blitter registers etc. */
-		pa = bus_space_mmap(rom->memt, rom->regh[2],
+		pa = bus_space_mmap(rom->memt, rom->regh[0],
 		    offset - 0x80000000, prot, BUS_SPACE_MAP_LINEAR);
 	}
 
@@ -1270,20 +1267,9 @@ summitfb_eraserows(void *cookie, int row
 	}
 }
 
-/*
- * cursor sprite handling
- * like most hw info, xf86 3.3 -> nglehdw.h was used as documentation
- * problem is, the PCI EG doesn't quite behave like an S9000_ID_ARTIST
- * the cursor position register bahaves like the one on HCRX while using
- * the same address as Artist, incuding the enable bit and weird handling
- * of negative coordinates. The rest of it, colour map, sprite image etc.,
- * behave like Artist.
- */
-
 static void
 summitfb_move_cursor(struct summitfb_softc *sc, int x, int y)
 {
-#if 0
 	uint32_t pos;
 
 	sc->sc_cursor_x = x;
@@ -1295,10 +1281,7 @@ summitfb_move_cursor(struct summitfb_sof
 	if (y < 0) y = 0x1000 - y;
 	pos = (x << 16) | y;
 	if (sc->sc_enabled) pos |= 0x80000000;
-	gftfb_wait(sc);
-	gftfb_write4(sc, NGLE_REG_17, pos);
-	gftfb_write4(sc, NGLE_REG_18, 0x80);
-#endif
+	summitfb_write4(sc, VISFX_CURSOR_POS, pos);
 }
 
 static int
@@ -1318,29 +1301,27 @@ summitfb_do_cursor(struct summitfb_softc
 		summitfb_move_cursor(sc, cur->pos.x, cur->pos.y);
 	}
 	if (cur->which & WSDISPLAY_CURSOR_DOCMAP) {
-		//uint32_t rgb;
+		uint32_t rgb;
 		uint8_t r[2], g[2], b[2];
 
 		copyin(cur->cmap.blue, b, 2);
 		copyin(cur->cmap.green, g, 2);
 		copyin(cur->cmap.red, r, 2);
 		mutex_enter(&sc->sc_hwlock);
-/* ... */
+		summitfb_write4(sc, VISFX_CURSOR_INDEX, 0);
+		rgb = r[0] << 16 | g[0] << 8 | b[0];
+		summitfb_write4(sc, VISFX_CURSOR_COLOR, rgb);
+		rgb = r[1] << 16 | g[1] << 8 | b[1];
+		summitfb_write4(sc, VISFX_CURSOR_COLOR + 4, rgb);
 		mutex_exit(&sc->sc_hwlock);
-
 	}
 	if (cur->which & WSDISPLAY_CURSOR_DOSHAPE) {
-#if 0
+
 		uint32_t buffer[128], latch, tmp;
 		int i;
 
 		copyin(cur->mask, buffer, 512);
-		gftfb_wait(sc);
-		gftfb_write4(sc, NGLE_REG_14, 0x300);
-		gftfb_write4(sc, NGLE_REG_13, 0xffffffff);
-		gftfb_write4(sc, NGLE_REG_11,
-		    BA(IndexedDcd, Otc32, 0, AddrLong, 0, BINcmask, 0));
-		gftfb_write4(sc, NGLE_REG_3, 0);
+		summitfb_write4(sc, VISFX_CURSOR_INDEX, 0);
 		for (i = 0; i < 128; i += 2) {
 			latch = 0;
 			tmp = buffer[i] & 0x80808080;
@@ -1359,7 +1340,7 @@ summitfb_do_cursor(struct summitfb_softc
 			latch |= tmp << 5;
 			tmp = buffer[i] & 0x01010101;
 			latch |= tmp << 7;
-			gftfb_write4(sc, NGLE_REG_4, latch);
+			summitfb_write4(sc, VISFX_CURSOR_DATA, latch);
 			latch = 0;
 			tmp = buffer[i + 1] & 0x80808080;
 			latch |= tmp >> 7;
@@ -1377,16 +1358,11 @@ summitfb_do_cursor(struct summitfb_softc
 			latch |= tmp << 5;
 			tmp = buffer[i + 1] & 0x01010101;
 			latch |= tmp << 7;
-			gftfb_write4(sc, NGLE_REG_5, latch);
+			summitfb_write4(sc, VISFX_CURSOR_DATA, latch);
 		}
 
+		summitfb_write4(sc, VISFX_CURSOR_INDEX, 0x80);
 		copyin(cur->image, buffer, 512);
-		gftfb_wait(sc);
-		gftfb_write4(sc, NGLE_REG_14, 0x300);
-		gftfb_write4(sc, NGLE_REG_13, 0xffffffff);
-		gftfb_write4(sc, NGLE_REG_11,
-		    BA(IndexedDcd, Otc32, 0, AddrLong, 0, BINcursor, 0));
-		gftfb_write4(sc, NGLE_REG_3, 0);
 		for (i = 0; i < 128; i += 2) {
 			latch = 0;
 			tmp = buffer[i] & 0x80808080;
@@ -1405,7 +1381,7 @@ summitfb_do_cursor(struct summitfb_softc
 			latch |= tmp << 5;
 			tmp = buffer[i] & 0x01010101;
 			latch |= tmp << 7;
-			gftfb_write4(sc, NGLE_REG_4, latch);
+			summitfb_write4(sc, VISFX_CURSOR_DATA, latch);
 			latch = 0;
 			tmp = buffer[i + 1] & 0x80808080;
 			latch |= tmp >> 7;
@@ -1423,10 +1399,9 @@ summitfb_do_cursor(struct summitfb_softc
 			latch |= tmp << 5;
 			tmp = buffer[i + 1] & 0x01010101;
 			latch |= tmp << 7;
-			gftfb_write4(sc, NGLE_REG_5, latch);
+			summitfb_write4(sc, VISFX_CURSOR_DATA, latch);
 		}
-		gftfb_setup_fb(sc);
-#endif
+		summitfb_setup_fb(sc);
 	}
 
 	return 0;

Reply via email to