Module Name:    src
Committed By:   macallan
Date:           Thu Dec 26 10:44:11 UTC 2024

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

Log Message:
now that we can do ROPs, use them and enable all the lazy cursor update stuff


To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 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.19 src/sys/arch/hppa/dev/summitfb.c:1.20
--- src/sys/arch/hppa/dev/summitfb.c:1.19	Wed Dec 25 05:44:12 2024
+++ src/sys/arch/hppa/dev/summitfb.c	Thu Dec 26 10:44:11 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: summitfb.c,v 1.19 2024/12/25 05:44:12 macallan Exp $	*/
+/*	$NetBSD: summitfb.c,v 1.20 2024/12/26 10:44:11 macallan Exp $	*/
 
 /*	$OpenBSD: sti_pci.c,v 1.7 2009/02/06 22:51:04 miod Exp $	*/
 
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.19 2024/12/25 05:44:12 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: summitfb.c,v 1.20 2024/12/26 10:44:11 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -147,9 +147,7 @@ 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_fast(void *, int, int, u_int, long);
 static void	summitfb_loadfont(struct summitfb_softc *);
@@ -669,8 +667,7 @@ summitfb_write_mode(struct summitfb_soft
 	if (sc->sc_write_mode == mode) return;
 	summitfb_wait(sc);
 	summitfb_write4(sc, VISFX_VRAM_WRITE_MODE, mode);
-	summitfb_write4(sc, VISFX_VRAM_READ_MODE,
-	    (mode & 0x07fff000) | 0x400);
+	summitfb_write4(sc, VISFX_VRAM_READ_MODE,mode & 0x07fff000);
 	sc->sc_write_mode = mode;
 }
 
@@ -678,6 +675,7 @@ static inline void
 summitfb_setup_fb(struct summitfb_softc *sc)
 {
 
+	summitfb_wait(sc);
 	if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
 		summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
 		summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
@@ -686,7 +684,9 @@ summitfb_setup_fb(struct summitfb_softc 
 		summitfb_write_mode(sc, OTC01 | BIN8F | BUFFL);
 		summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_32);
 		summitfb_write4(sc, VISFX_OTR, OTR_A);	// all transparent
-	}		
+	}
+	summitfb_write4(sc, VISFX_IBO, RopSrc);
+	//summitfb_write4(sc, VISFX_CONTROL, CONTROL_WFC);	
 }
 
 void
@@ -699,6 +699,7 @@ summitfb_setup(struct summitfb_softc *sc
 	sc->sc_enabled = 0;
 	sc->sc_video_on = 1;
 
+	summitfb_wait(sc);
 #if 1
 	summitfb_write4(sc, 0xb08044, 0x1b);
 	summitfb_write4(sc, 0xb08048, 0x1b);
@@ -731,14 +732,19 @@ summitfb_setup(struct summitfb_softc *sc
 	/* turn off force attr so the above takes effect */
 	summitfb_write4(sc, VISFX_FATTR, 0);
 
+	summitfb_write4(sc, VISFX_TCR, 0x10001000);	/* disable throttling */
+
 	summitfb_wait(sc);
+	summitfb_write4(sc, VISFX_CONTROL, 0);	// clear WFC
 	summitfb_write4(sc, VISFX_APERTURE_ACCESS, VISFX_DEPTH_8);
 	summitfb_write4(sc, VISFX_PIXEL_MASK, 0xffffffff);
 	summitfb_write4(sc, VISFX_PLANE_MASK, 0xffffffff);
+	summitfb_write4(sc, VISFX_FOE, FOE_BLEND_ROP);
+	summitfb_write4(sc, VISFX_IBO, RopSrc);
 	summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
 	summitfb_write4(sc, VISFX_CLIP_TL, 0);
 	summitfb_write4(sc, VISFX_CLIP_WH,
-	    ((sc->sc_scr.fbwidth + 1) << 16) | (sc->sc_scr.fbheight + 1));
+	    ((sc->sc_scr.fbwidth) << 16) | (sc->sc_scr.fbheight));
 	/* turn off the cursor sprite */
 	summitfb_write4(sc, VISFX_CURSOR_POS, 0);
 	summitfb_setup_fb(sc);
@@ -922,7 +928,7 @@ 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_NO_CURSOR;
+	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);
@@ -933,7 +939,7 @@ summitfb_init_screen(void *cookie, struc
 	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;
 #ifdef SUMMITFB_ENABLE_GC
 	sc->sc_putchar = ri->ri_ops.putchar;
 	if (FONT_IS_ALPHA(ri->ri_font)) {
@@ -1048,13 +1054,11 @@ summitfb_putpalreg(struct summitfb_softc
 static inline void
 summitfb_wait_fifo(struct summitfb_softc *sc, uint32_t slots)
 {
-#if 0
 	uint32_t reg;
 
 	do {
-		reg = summitfb_read4(sc, NGLE_REG_34);
+		reg = summitfb_read4(sc, VISFX_FIFO);
 	} while (reg < slots);
-#endif
 }
 
 static void
@@ -1063,6 +1067,8 @@ summitfb_rectfill(struct summitfb_softc 
 {
 
 	summitfb_write_mode(sc, VISFX_WRITE_MODE_FILL);
+	summitfb_wait_fifo(sc, 4);
+	summitfb_write4(sc, VISFX_IBO, RopSrc);
 	summitfb_write4(sc, VISFX_FG_COLOUR, bg);
 	summitfb_write4(sc, VISFX_START, (x << 16) | y);
 	summitfb_write4(sc, VISFX_SIZE, (wi << 16) | he);
@@ -1074,18 +1080,15 @@ summitfb_bitblt(void *cookie, int xs, in
 {
 	struct summitfb_softc *sc = cookie;
 
-	/* XXX no ROP support yet */
-	if (rop != RopSrc) {
-		summitfb_write_mode(sc, rop);
-	} else
-		summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+	summitfb_write_mode(sc, VISFX_WRITE_MODE_PLAIN);
+	summitfb_wait_fifo(sc, 4);
+	summitfb_write4(sc, VISFX_IBO, rop);
 	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)
 {
@@ -1098,7 +1101,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;
-		if (0) summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
+		summitfb_bitblt(sc, x, y, x, y, wi, he, RopInv);
 		ri->ri_flg &= ~RI_CURSOR;
 	}
 }
@@ -1133,7 +1136,6 @@ summitfb_cursor(void *cookie, int on, in
 	}
 
 }
-#endif
 
 static void
 summitfb_putchar(void *cookie, int row, int col, u_int c, long attr)
@@ -1152,12 +1154,10 @@ summitfb_putchar(void *cookie, int row, 
 	if (!CHAR_IN_FONT(c, font))
 		return;
 
-	/* XXX as long as we use putchar() to draw the cursor */
-#if 0
 	if (row == ri->ri_crow && col == ri->ri_ccol) {
 		ri->ri_flg &= ~RI_CURSOR;
 	}
-#endif
+
 	wi = font->fontwidth;
 	he = font->fontheight;
 
@@ -1175,6 +1175,8 @@ summitfb_putchar(void *cookie, int row, 
 	fg = ri->ri_devcmap[(attr >> 24) & 0x0f];
 
 	summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
+	summitfb_wait_fifo(sc, 6);
+	summitfb_write4(sc, VISFX_IBO, RopSrc);
 	summitfb_write4(sc, VISFX_FG_COLOUR, fg);
 	summitfb_write4(sc, VISFX_BG_COLOUR, bg);
 	mask = 0xffffffff << (32 - wi);
@@ -1213,7 +1215,7 @@ summitfb_loadfont(struct summitfb_softc 
 
 	summitfb_setup(sc);
 	summitfb_write_mode(sc, VISFX_WRITE_MODE_EXPAND);
-
+	summitfb_write4(sc, VISFX_IBO, RopSrc);
 	summitfb_write4(sc, VISFX_FG_COLOUR, 0xffffffff);
 	summitfb_write4(sc, VISFX_BG_COLOUR, 0);
 
@@ -1266,12 +1268,10 @@ summitfb_putchar_fast(void *cookie, int 
 		return;
 	}
 
-	/* XXX as long as we use putchar() to draw the cursor */
-#if 0
 	if (row == ri->ri_crow && col == ri->ri_ccol) {
 		ri->ri_flg &= ~RI_CURSOR;
 	}
-#endif
+
 	wi = font->fontwidth;
 	he = font->fontheight;
 
@@ -1289,6 +1289,8 @@ summitfb_putchar_fast(void *cookie, int 
 	fg = ri->ri_devcmap[(attr >> 24) & 0x0f];
 
 	summitfb_write_mode(sc, 0x050000c0);
+	summitfb_wait_fifo(sc, 6);
+	summitfb_write4(sc, VISFX_IBO, RopSrc);
 	summitfb_write4(sc, VISFX_FG_COLOUR, fg);
 	summitfb_write4(sc, VISFX_BG_COLOUR, bg);
 
@@ -1358,13 +1360,13 @@ 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;
@@ -1412,12 +1414,12 @@ 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;

Reply via email to