Module Name:    src
Committed By:   macallan
Date:           Tue Sep 21 03:31:04 UTC 2010

Modified Files:
        src/sys/arch/sparc64/dev: ffb.c ffb_mainbus.c ffbvar.h

Log Message:
* implement hw acceleration for putchar()
* use VCONS for copycols()
* don't map the framebuffer now that we don't access it anymore
* make a bunch of drawing engine syncs optional


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/arch/sparc64/dev/ffb.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/sparc64/dev/ffb_mainbus.c \
    src/sys/arch/sparc64/dev/ffbvar.h

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/sparc64/dev/ffb.c
diff -u src/sys/arch/sparc64/dev/ffb.c:1.37 src/sys/arch/sparc64/dev/ffb.c:1.38
--- src/sys/arch/sparc64/dev/ffb.c:1.37	Thu Aug 20 02:50:46 2009
+++ src/sys/arch/sparc64/dev/ffb.c	Tue Sep 21 03:31:04 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffb.c,v 1.37 2009/08/20 02:50:46 macallan Exp $	*/
+/*	$NetBSD: ffb.c,v 1.38 2010/09/21 03:31:04 macallan Exp $	*/
 /*	$OpenBSD: creator.c,v 1.20 2002/07/30 19:48:15 jason Exp $	*/
 
 /*
@@ -33,7 +33,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffb.c,v 1.37 2009/08/20 02:50:46 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffb.c,v 1.38 2010/09/21 03:31:04 macallan Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -60,11 +60,20 @@
 #include <sparc64/dev/ffbreg.h>
 #include <sparc64/dev/ffbvar.h>
 
+#include "opt_wsdisplay_compat.h"
+#include "opt_ffb.h"
+
 #ifndef WS_DEFAULT_BG
 /* Sun -> background should be white */
 #define WS_DEFAULT_BG 0xf
 #endif
 
+#ifdef FFB_SYNC
+#define SYNC ffb_ras_wait(sc)
+#else
+#define SYNC
+#endif
+
 extern struct cfdriver ffb_cd;
 
 struct wsscreen_descr ffb_stdscreen = {
@@ -99,7 +108,8 @@
 void	ffb_ras_eraserows(void *, int, int, long int);
 void	ffb_ras_do_cursor(struct rasops_info *);
 void	ffb_ras_fill(struct ffb_softc *);
-void	ffb_ras_setfg(struct ffb_softc *, int32_t);
+static void	ffb_ras_setfg(struct ffb_softc *, int32_t);
+static void	ffb_ras_setbg(struct ffb_softc *, int32_t);
 
 void	ffb_clearscreen(struct ffb_softc *);
 int	ffb_load_font(void *, void *, struct wsdisplay_font *);
@@ -140,9 +150,7 @@
 	char buf[6+1];
 
 	printf(":");
-	
-	sc->putchar = NULL;
-	
+		
 	if (sc->sc_type == FFB_CREATOR) {
 		btype = prom_getpropint(sc->sc_node, "board_type", 0);
 		if ((btype & 7) == 3)
@@ -261,7 +269,7 @@
 	struct wsdisplay_fbinfo *wdf;
 	struct vcons_screen *ms = vd->active;
 	
-#ifdef FFBDEBUG
+#ifdef FFB_DEBUG
 	printf("ffb_ioctl: %s cmd _IO%s%s('%c', %lu)\n",
 	       device_xname(&sc->sc_dv),
 	       (cmd & IOC_IN) ? "W" : "", (cmd & IOC_OUT) ? "R" : "",
@@ -471,8 +479,8 @@
 {
 	ffb_ras_fifo_wait(sc, 7);
 	FBC_WRITE(sc, FFB_FBC_PPC,
-	    FBC_PPC_VCE_DIS | FBC_PPC_TBE_OPAQUE |
-	    FBC_PPC_APE_DIS | FBC_PPC_CS_CONST);
+	    FBC_PPC_VCE_DIS | FBC_PPC_TBE_OPAQUE | FBC_PPC_ACE_DIS | 
+	    FBC_PPC_APE_DIS | FBC_PPC_DCE_DIS | FBC_PPC_CS_CONST);
 	FBC_WRITE(sc, FFB_FBC_FBC,
 	    FFB_FBC_WB_A | FFB_FBC_RB_A | FFB_FBC_SB_BOTH |
 	    FFB_FBC_XE_OFF | FFB_FBC_RGBE_MASK);
@@ -516,7 +524,7 @@
 		FBC_WRITE(sc, FFB_FBC_BH, n * ri->ri_font->fontheight);
 		FBC_WRITE(sc, FFB_FBC_BW, ri->ri_emuwidth);
 	}
-	ffb_ras_wait(sc);
+	SYNC;
 }
 
 void
@@ -547,7 +555,7 @@
 	FBC_WRITE(sc, FFB_FBC_BX, ri->ri_xorigin + col);
 	FBC_WRITE(sc, FFB_FBC_BH, ri->ri_font->fontheight);
 	FBC_WRITE(sc, FFB_FBC_BW, n - 1);
-	ffb_ras_wait(sc);
+	SYNC;
 }
 
 void
@@ -556,7 +564,7 @@
 	ffb_ras_fifo_wait(sc, 2);
 	FBC_WRITE(sc, FFB_FBC_ROP, FBC_ROP_NEW);
 	FBC_WRITE(sc, FFB_FBC_DRAWOP, FBC_DRAWOP_RECTANGLE);
-	ffb_ras_wait(sc);
+	SYNC;
 }
 
 void
@@ -595,10 +603,10 @@
 	FBC_WRITE(sc, FFB_FBC_DX, ri->ri_xorigin);
 	FBC_WRITE(sc, FFB_FBC_BH, n);
 	FBC_WRITE(sc, FFB_FBC_BW, ri->ri_emuwidth);
-	ffb_ras_wait(sc);
+	SYNC;
 }
 
-void
+static void
 ffb_ras_setfg(struct ffb_softc *sc, int32_t fg)
 {
 	ffb_ras_fifo_wait(sc, 1);
@@ -606,7 +614,18 @@
 		return;
 	sc->sc_fg_cache = fg;
 	FBC_WRITE(sc, FFB_FBC_FG, fg);
-	ffb_ras_wait(sc);
+	SYNC;
+}
+
+static void
+ffb_ras_setbg(struct ffb_softc *sc, int32_t bg)
+{
+	ffb_ras_fifo_wait(sc, 1);
+	if (bg == sc->sc_bg_cache)
+		return;
+	sc->sc_bg_cache = bg;
+	FBC_WRITE(sc, FFB_FBC_BG, bg);
+	SYNC;
 }
 
 /* frame buffer generic driver support functions */   
@@ -794,7 +813,7 @@
 				coffset += scr->scr_offset_to_zero;
 #endif
 				ffb_ras_wait(sc);
-				sc->putchar(cookie, ri->ri_crow, 
+				ffb_putchar(cookie, ri->ri_crow, 
 				    ri->ri_ccol, scr->scr_chars[coffset], 
 				    scr->scr_attrs[coffset]);
 				ri->ri_flg &= ~RI_CURSOR;
@@ -818,7 +837,7 @@
 				revattr = attr ^ 0xffff0000;
 #endif
 				ffb_ras_wait(sc);
-				sc->putchar(cookie, ri->ri_crow, ri->ri_ccol,
+				ffb_putchar(cookie, ri->ri_crow, ri->ri_ccol,
 				    scr->scr_chars[coffset], revattr);
 				ri->ri_flg |= RI_CURSOR;
 			}
@@ -835,16 +854,62 @@
 {
 	struct rasops_info *ri = cookie;
 	struct vcons_screen *scr = ri->ri_hw;
+	struct wsdisplay_font *font = PICK_FONT(ri, c);
 	struct ffb_softc *sc = scr->scr_cookie;
 	
-	if (sc->putchar != NULL) {
-		/* 
-		 * the only reason why we need to hook putchar - wait for
-		 * the drawing engine to be idle so we don't interfere
-		 * ( and we should really use the colour expansion hardware )
-		 */
-		ffb_ras_wait(sc);
-		sc->putchar(cookie, row, col, c, attr);
+	/*
+	 * font operations don't use the blitter so we have to wait here
+	 * in case we were scrolling
+	 */
+	
+	if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
+		void *data;
+		uint32_t fg, bg;
+		int uc, i;
+		int x, y, wi, he;
+
+		wi = font->fontwidth;
+		he = font->fontheight;
+
+		if (!CHAR_IN_FONT(c, font))
+			return;
+		bg = ri->ri_devcmap[(attr >> 16) & 0xf];
+		fg = ri->ri_devcmap[(attr >> 24) & 0xf];
+		x = ri->ri_xorigin + col * wi;
+		y = ri->ri_yorigin + row * he;
+
+		uc = c - font->firstchar;
+		data = (uint8_t *)font->data + uc * ri->ri_fontscale;
+
+		ffb_ras_setbg(sc, bg);
+		ffb_ras_setfg(sc, fg);
+		ffb_ras_fifo_wait(sc, 3);
+		FBC_WRITE(sc, FFB_FBC_ROP, FBC_ROP_NEW);
+		FBC_WRITE(sc, FFB_FBC_FONTXY, (y << 16) | x);
+		FBC_WRITE(sc, FFB_FBC_FONTW, wi);
+
+		switch (ri->ri_font->stride) {
+			case 1: {
+				uint8_t *data8 = data;
+				uint32_t reg;
+				for (i = 0; i < he; i++) {
+					reg = *data8;
+					FBC_WRITE(sc, FFB_FBC_FONT, reg << 24);
+					data8++;
+				}
+				break;
+			}
+			case 2: {
+				uint16_t *data16 = data;
+				uint32_t reg;
+				for (i = 0; i < he; i++) {
+					reg = *data16;
+					FBC_WRITE(sc, FFB_FBC_FONT, reg << 16);
+					data16++;
+				}
+				break;
+			}
+		}
 	}
 }
 
@@ -878,9 +943,13 @@
 	ri->ri_stride = sc->sc_linebytes;
 	ri->ri_flg = RI_CENTER;
 
-	ri->ri_bits = bus_space_vaddr(sc->sc_bt, sc->sc_pixel_h);
-	
-#ifdef FFBDEBUG
+	/*
+	 * we can't accelerate copycols() so instead of falling back to
+	 * software use vcons' putchar() based implementation
+	 */
+	scr->scr_flags |= VCONS_NO_COPYCOLS;
+
+#ifdef FFB_DEBUG
 	printf("addr: %08lx\n",(ulong)ri->ri_bits);
 #endif
 	rasops_init(ri, sc->sc_height/8, sc->sc_width/8);
@@ -894,7 +963,5 @@
 	ri->ri_ops.erasecols = ffb_ras_erasecols;
 	ri->ri_ops.cursor = ffb_cursor;
 	ri->ri_ops.allocattr = ffb_allocattr;
-	if (sc->putchar == NULL)
-		sc->putchar = ri->ri_ops.putchar;
 	ri->ri_ops.putchar = ffb_putchar;
 }

Index: src/sys/arch/sparc64/dev/ffb_mainbus.c
diff -u src/sys/arch/sparc64/dev/ffb_mainbus.c:1.8 src/sys/arch/sparc64/dev/ffb_mainbus.c:1.9
--- src/sys/arch/sparc64/dev/ffb_mainbus.c:1.8	Sun Dec 11 12:19:09 2005
+++ src/sys/arch/sparc64/dev/ffb_mainbus.c	Tue Sep 21 03:31:04 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffb_mainbus.c,v 1.8 2005/12/11 12:19:09 christos Exp $	*/
+/*	$NetBSD: ffb_mainbus.c,v 1.9 2010/09/21 03:31:04 macallan Exp $	*/
 /*	$OpenBSD: creator_mainbus.c,v 1.4 2002/07/26 16:39:04 jason Exp $	*/
 
 /*
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffb_mainbus.c,v 1.8 2005/12/11 12:19:09 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffb_mainbus.c,v 1.9 2010/09/21 03:31:04 macallan Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -88,17 +88,11 @@
 		goto fail1;
 	}
 
-	if (bus_space_map(sc->sc_bt, ma->ma_reg[FFB_REG_DFB24].ur_paddr,
-	    ma->ma_reg[FFB_REG_DFB24].ur_len, BUS_SPACE_MAP_LINEAR,
-	    &sc->sc_pixel_h)) {
-		printf(": failed to map dfb24\n");
-		goto fail1;
-	}
 
 	if (bus_space_map(sc->sc_bt, ma->ma_reg[FFB_REG_FBC].ur_paddr,
 	    ma->ma_reg[FFB_REG_FBC].ur_len, 0, &sc->sc_fbc_h)) {
 		printf(": failed to map fbc\n");
-		goto unmap_dfb24;
+		goto fail1;
 	}
 
 	if (bus_space_map(sc->sc_bt, ma->ma_reg[FFB_REG_DAC].ur_paddr,
@@ -131,9 +125,6 @@
 unmap_fbc:
 	bus_space_unmap(sc->sc_bt, sc->sc_fbc_h,
 		    ma->ma_reg[FFB_REG_FBC].ur_len);
-unmap_dfb24:
-	bus_space_unmap(sc->sc_bt, sc->sc_pixel_h,
-		    ma->ma_reg[FFB_REG_DFB24].ur_len);
 fail1:
 	return;
 }
Index: src/sys/arch/sparc64/dev/ffbvar.h
diff -u src/sys/arch/sparc64/dev/ffbvar.h:1.8 src/sys/arch/sparc64/dev/ffbvar.h:1.9
--- src/sys/arch/sparc64/dev/ffbvar.h:1.8	Thu Sep 14 16:05:18 2006
+++ src/sys/arch/sparc64/dev/ffbvar.h	Tue Sep 21 03:31:04 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffbvar.h,v 1.8 2006/09/14 16:05:18 martin Exp $	*/
+/*	$NetBSD: ffbvar.h,v 1.9 2010/09/21 03:31:04 macallan Exp $	*/
 /*	$OpenBSD: creatorvar.h,v 1.6 2002/07/30 19:48:15 jason Exp $	*/
 
 /*
@@ -44,7 +44,6 @@
 	struct device sc_dv;
 	struct fbdevice sc_fb;
 	bus_space_tag_t sc_bt;
-	bus_space_handle_t sc_pixel_h;
 	bus_space_handle_t sc_dac_h;
 	bus_space_handle_t sc_fbc_h;
 	bus_addr_t sc_addrs[FFB_NREGS];
@@ -58,10 +57,9 @@
 	u_int sc_locked;
 	int sc_mode;
 	int sc_accel, sc_needredraw;
-	int32_t sc_fifo_cache, sc_fg_cache;
-
+	int32_t sc_fifo_cache, sc_fg_cache, sc_bg_cache;
+	
 	/* virtual console stuff */
-	void (*putchar)(void *c, int row, int col, u_int uc, long attr);
 	struct vcons_data vd;
 };
 

Reply via email to