Module Name:    src
Committed By:   macallan
Date:           Tue Nov 26 14:58:00 UTC 2024

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

Log Message:
now that we know how, use the blitter to:
- draw characters
- scroll
- rectangle fills
no ROP support yet, so the cursor is drawn using putchar
while there get rid of some unused cargo-culted goop from gftfb
MUCH faster now

CV: ----------------------------------------------------------------------


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 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.5 src/sys/arch/hppa/dev/summitfb.c:1.6
--- src/sys/arch/hppa/dev/summitfb.c:1.5	Wed Nov 20 05:24:46 2024
+++ src/sys/arch/hppa/dev/summitfb.c	Tue Nov 26 14:58:00 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: summitfb.c,v 1.5 2024/11/20 05:24:46 macallan Exp $	*/
+/*	$NetBSD: summitfb.c,v 1.6 2024/11/26 14:58:00 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.5 2024/11/20 05:24:46 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.6 2024/11/26 14:58:00 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -84,7 +84,6 @@ struct	summitfb_softc {
 	u_char sc_cmap_red[256];
 	u_char sc_cmap_green[256];
 	u_char sc_cmap_blue[256];
-	kmutex_t sc_hwlock;
 	uint32_t sc_hwmode;
 #define HW_FB	0
 #define HW_FILL	1
@@ -141,7 +140,9 @@ static void	summitfb_rectfill(struct sum
 static void	summitfb_bitblt(void *, int, int, int, int, int,
 		    int, int);
 
+#if 0
 static void	summitfb_cursor(void *, int, int, int);
+#endif
 static void	summitfb_putchar(void *, int, int, u_int, long);
 static void	summitfb_putchar_aa(void *, int, int, u_int, long);
 static void	summitfb_copycols(void *, int, int, int, int);
@@ -202,26 +203,6 @@ summitfb_write4(struct summitfb_softc *s
 	bus_space_write_stream_4(memt, memh, offset - 0x400000, val);
 }
 
-static inline uint8_t
-summitfb_read1(struct summitfb_softc *sc, uint32_t offset)
-{
-	struct sti_rom *rom = sc->sc_base.sc_rom;
-	bus_space_tag_t memt = rom->memt;
-	bus_space_handle_t memh = rom->regh[2];
-
-	return bus_space_read_1(memt, memh, offset);
-}
-
-static inline void
-summitfb_write1(struct summitfb_softc *sc, uint32_t offset, uint8_t val)
-{
-	struct sti_rom *rom = sc->sc_base.sc_rom;
-	bus_space_tag_t memt = rom->memt;
-	bus_space_handle_t memh = rom->regh[2];
-
-	bus_space_write_1(memt, memh, offset, val);
-}
-
 void
 summitfb_attach(device_t parent, device_t self, void *aux)
 {
@@ -241,9 +222,6 @@ summitfb_attach(device_t parent, device_
 	sc->sc_base.sc_enable_rom = summitfb_enable_rom;
 	sc->sc_base.sc_disable_rom = summitfb_disable_rom;
 
-	/* we can *not* be interrupted when doing colour map accesses */
-	mutex_init(&sc->sc_hwlock, MUTEX_DEFAULT, IPL_HIGH);
-
 	aprint_normal("\n");
 
 	if (summitfb_check_rom(sc, paa) != 0)
@@ -342,6 +320,19 @@ summitfb_attach(device_t parent, device_
 	aa.accesscookie = &sc->vd;
 
 	config_found(sc->sc_dev, &aa, wsemuldisplaydevprint, CFARGS_NONE);
+
+#if 0	
+	summitfb_rectfill(sc, 10, 850, 100, 100, 1);
+	summitfb_rectfill(sc, 120, 850, 10, 100, 1);
+	summitfb_rectfill(sc, 200, 840, 1000, 120, 14);
+	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xf0f0cc88);
+	summitfb_bitblt(sc, 0, 845, 205, 845, 150, 110,  0x00000830);
+	//summitfb_bitblt(sc, 0, 845, 405, 845, 150, 110,  0x04000000);
+	summitfb_bitblt(sc, 0, 845, 605, 845, 150, 110,  0x01000000);
+	//summitfb_bitblt(sc, 0, 845, 805, 845, 150, 110,  0x0000020c);
+	//summitfb_bitblt(sc, 0, 845, 1005, 845, 150, 110, 0x04000000);
+	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+#endif
 }
 
 /*
@@ -652,6 +643,7 @@ summitfb_setup_fb(struct summitfb_softc 
 	sc->sc_hwmode = HW_FB;
 	summitfb_wait(sc);
 	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN);
+	summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
 }
 
 void
@@ -679,7 +671,9 @@ summitfb_setup(struct summitfb_softc *sc
 	summitfb_write4(sc, 0xa0086c, 0);
 	summitfb_write4(sc, 0x921114, 0);
 	summitfb_write4(sc, 0xac1050, 0);
-	summitfb_write4(sc, 0xa00858, 0xb0);
+	summitfb_write4(sc, 0xa00858, 0xb0);	/* 0 on fx4 */
+	summitfb_write4(sc, 0xa00850, 0);	/* fx4 */
+	summitfb_write4(sc, 0xa0081c, 0);	/* fx4 */
 #endif
 
 	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
@@ -849,25 +843,25 @@ summitfb_init_screen(void *cookie, struc
 	rasops_init(ri, 0, 0);
 	ri->ri_caps = WSSCREEN_WSCOLORS | WSSCREEN_HILIT | WSSCREEN_UNDERLINE |
 	    WSSCREEN_RESIZE;
-	scr->scr_flags |= VCONS_LOADFONT | VCONS_DONT_READ;
+	scr->scr_flags |= VCONS_LOADFONT | VCONS_NO_CURSOR;
 
 	rasops_reconfig(ri, sc->sc_height / ri->ri_font->fontheight,
 	    sc->sc_width / ri->ri_font->fontwidth);
 
 	ri->ri_hw = scr;
-if (0) {
+
 	sc->sc_putchar = ri->ri_ops.putchar;
+
 	ri->ri_ops.copyrows = summitfb_copyrows;
 	ri->ri_ops.copycols = summitfb_copycols;
 	ri->ri_ops.eraserows = summitfb_eraserows;
 	ri->ri_ops.erasecols = summitfb_erasecols;
-	ri->ri_ops.cursor = summitfb_cursor;
+	//ri->ri_ops.cursor = summitfb_cursor;
 	if (FONT_IS_ALPHA(ri->ri_font)) {
 		ri->ri_ops.putchar = summitfb_putchar_aa;
 	} else
 		ri->ri_ops.putchar = summitfb_putchar;
 }
-}
 
 static int
 summitfb_putcmap(struct summitfb_softc *sc, struct wsdisplay_cmap *cm)
@@ -952,13 +946,11 @@ summitfb_putpalreg(struct summitfb_softc
     uint8_t r, uint8_t g, uint8_t b)
 {
 
-	mutex_enter(&sc->sc_hwlock);
 	summitfb_write4(sc, VISFX_COLOR_INDEX, 0xc0005100 + idx);
 	summitfb_write4(sc, VISFX_COLOR_VALUE, (r << 16) | ( g << 8) | b);
 	summitfb_write4(sc, VISFX_COLOR_MASK, 0xff);
 	summitfb_write4(sc, 0x80004c, 0xc);
 	summitfb_write4(sc, 0x800000, 0);
-	mutex_exit(&sc->sc_hwlock);
 	return 0;
 }
 
@@ -981,6 +973,7 @@ summitfb_rectfill(struct summitfb_softc 
 
 	summitfb_wait(sc);
 	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_FILL);
+	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
 	summitfb_write4(sc, VISFX_FG_COLOUR, bg);
 	summitfb_write4(sc, VISFX_BG_COLOUR, bg);
 	summitfb_write4(sc, VISFX_START, (x << 16) | y);
@@ -991,11 +984,21 @@ static void
 summitfb_bitblt(void *cookie, int xs, int ys, int xd, int yd, int wi,
     int he, int rop)
 {
-#if 0
 	struct summitfb_softc *sc = cookie;
-#endif
+
+	/* XXX no ROP support yet */
+	summitfb_wait(sc);
+	if ((rop == 3) || (rop == 0xc)) rop = 0;
+	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, VISFX_WRITE_MODE_PLAIN | rop);
+	summitfb_write4(sc, VISFX_VRAM_READ_MODE, VISFX_READ_MODE_COPY);
+	//summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
+	summitfb_write4(sc, VISFX_COPY_SRC, (xs << 16) | ys);
+	summitfb_write4(sc, VISFX_COPY_WH, (wi << 16) | he);
+	summitfb_write4(sc, VISFX_COPY_DST, (xd << 16) | yd);
+
 }
 
+#if 0
 static void
 summitfb_nuke_cursor(struct rasops_info *ri)
 {
@@ -1008,7 +1011,7 @@ summitfb_nuke_cursor(struct rasops_info 
 		he = ri->ri_font->fontheight;
 		x = ri->ri_ccol * wi + ri->ri_xorigin;
 		y = ri->ri_crow * he + ri->ri_yorigin;
-		summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
+		if (0) summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
 		ri->ri_flg &= ~RI_CURSOR;
 	}
 }
@@ -1043,17 +1046,17 @@ summitfb_cursor(void *cookie, int on, in
 	}
 
 }
+#endif
 
 static void
 summitfb_putchar(void *cookie, int row, int col, u_int c, long attr)
 {
-#if 0
 	struct rasops_info *ri = cookie;
 	struct wsdisplay_font *font = PICK_FONT(ri, c);
 	struct vcons_screen *scr = ri->ri_hw;
 	struct summitfb_softc *sc = scr->scr_cookie;
-	//void *data;
-	int x, y, wi, he, rv = GC_NOPE;
+	void *data;
+	int i, x, y, wi, he/*, rv = GC_NOPE*/;
 	uint32_t bg, fg, mask;
 
 	if (sc->sc_mode != WSDISPLAYIO_MODE_EMUL)
@@ -1062,10 +1065,11 @@ summitfb_putchar(void *cookie, int row, 
 	if (!CHAR_IN_FONT(c, font))
 		return;
 
+#if 0
 	if (row == ri->ri_crow && col == ri->ri_ccol) {
 		ri->ri_flg &= ~RI_CURSOR;
 	}
-
+#endif
 	wi = font->fontwidth;
 	he = font->fontheight;
 
@@ -1082,15 +1086,39 @@ summitfb_putchar(void *cookie, int row, 
 
 	fg = ri->ri_devcmap[(attr >> 24) & 0x0f];
 
+#if 0
 	rv = glyphcache_try(&sc->sc_gc, c, x, y, attr);
 	if (rv == GC_OK)
 		return;
+#endif
 
-	/* clear the character cell */
-	summitfb_rectfill(sc, x, y, wi, he, bg);
-
-	//data = WSFONT_GLYPH(c, font);
-/* ... */
+	summitfb_wait(sc);	
+	summitfb_write4(sc, VISFX_FG_COLOUR, fg);
+	summitfb_write4(sc, VISFX_BG_COLOUR, bg);
+	mask = 0xffffffff << (32 - wi);
+	summitfb_write4(sc, VISFX_PIXEL_MASK, mask);
+	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, 0x050000c0);
+	/* not a tpyo, coordinates *are* backwards for this register */
+	summitfb_write4(sc, VISFX_VRAM_WRITE_DEST, (y << 16) | x);
+
+	data = WSFONT_GLYPH(c, font);
+
+	if (ri->ri_font->stride == 1) {
+		uint8_t *data8 = data;
+		for (i = 0; i < he; i++) {
+			mask = *data8;
+			summitfb_write4(sc, VISFX_VRAM_WRITE_DATA_INCRY, mask << 24);	
+			data8++;
+		}
+	} else {
+		uint16_t *data16 = data;
+		for (i = 0; i < he; i++) {
+			mask = *data16;
+			summitfb_write4(sc, VISFX_VRAM_WRITE_DATA_INCRY, mask << 16);	
+			data16++;
+		}
+	}
+#if 0
 	if (rv == GC_ADD)
 		glyphcache_add(&sc->sc_gc, c, x, y);
 #endif
@@ -1149,18 +1177,20 @@ summitfb_copycols(void *cookie, int row,
 	int32_t xs, xd, y, width, height;
 
 	if ((sc->sc_locked == 0) && (sc->sc_mode == WSDISPLAYIO_MODE_EMUL)) {
+#if 0
 		if (ri->ri_crow == row &&
 		    ri->ri_ccol >= srccol && ri->ri_ccol < (srccol + ncols) &&
 		    (ri->ri_flg & RI_CURSOR)) {
 			summitfb_nuke_cursor(ri);
 		}
-
+#endif
 		xs = ri->ri_xorigin + ri->ri_font->fontwidth * srccol;
 		xd = ri->ri_xorigin + ri->ri_font->fontwidth * dstcol;
 		y = ri->ri_yorigin + ri->ri_font->fontheight * row;
 		width = ri->ri_font->fontwidth * ncols;
 		height = ri->ri_font->fontheight;
 		summitfb_bitblt(sc, xs, y, xd, y, width, height, RopSrc);
+
 		if (ri->ri_crow == row &&
 		    ri->ri_ccol >= dstcol && ri->ri_ccol < (dstcol + ncols))
 			ri->ri_flg &= ~RI_CURSOR;
@@ -1184,6 +1214,7 @@ summitfb_erasecols(void *cookie, int row
 		rasops_unpack_attr(fillattr, &fg, &bg, &ul);
 
 		summitfb_rectfill(sc, x, y, width, height, ri->ri_devcmap[bg]);
+
 		if (ri->ri_crow == row &&
 		    ri->ri_ccol >= startcol &&
 		    ri->ri_ccol < (startcol + ncols))
@@ -1200,16 +1231,19 @@ summitfb_copyrows(void *cookie, int srcr
 	int32_t x, ys, yd, width, height;
 
 	if ((sc->sc_locked == 0) && (sc->sc_mode == WSDISPLAYIO_MODE_EMUL)) {
+#if 0
 		if (ri->ri_crow >= srcrow && ri->ri_crow < (srcrow + nrows) &&
 		    (ri->ri_flg & RI_CURSOR)) {
 			summitfb_nuke_cursor(ri);
 		}
+#endif
 		x = ri->ri_xorigin;
 		ys = ri->ri_yorigin + ri->ri_font->fontheight * srcrow;
 		yd = ri->ri_yorigin + ri->ri_font->fontheight * dstrow;
 		width = ri->ri_emuwidth;
 		height = ri->ri_font->fontheight * nrows;
 		summitfb_bitblt(sc, x, ys, x, yd, width, height, RopSrc);
+
 		if (ri->ri_crow >= dstrow && ri->ri_crow < (dstrow + nrows))
 			ri->ri_flg &= ~RI_CURSOR;
 	}
@@ -1277,13 +1311,13 @@ summitfb_do_cursor(struct summitfb_softc
 		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];
+		/* this isn't right */
 		summitfb_write4(sc, VISFX_CURSOR_COLOR + 4, rgb);
-		mutex_exit(&sc->sc_hwlock);
+
 	}
 	if (cur->which & WSDISPLAY_CURSOR_DOSHAPE) {
 

Reply via email to