Module Name:    src
Committed By:   macallan
Date:           Thu Sep 30 03:16:51 UTC 2010

Modified Files:
        src/sys/dev/pci: r128fb.c

Log Message:
use the drawing engine to draw characters so we don't have to sync after each
command and don't need to map the framebuffer anymore


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/dev/pci/r128fb.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/pci/r128fb.c
diff -u src/sys/dev/pci/r128fb.c:1.12 src/sys/dev/pci/r128fb.c:1.13
--- src/sys/dev/pci/r128fb.c:1.12	Tue Sep 14 02:11:06 2010
+++ src/sys/dev/pci/r128fb.c	Thu Sep 30 03:16:51 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: r128fb.c,v 1.12 2010/09/14 02:11:06 macallan Exp $	*/
+/*	$NetBSD: r128fb.c,v 1.13 2010/09/30 03:16:51 macallan Exp $	*/
 
 /*
  * Copyright (c) 2007 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.12 2010/09/14 02:11:06 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: r128fb.c,v 1.13 2010/09/30 03:16:51 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -76,14 +76,12 @@
 	bus_space_tag_t sc_memt;
 	bus_space_tag_t sc_iot;
 
-	bus_space_handle_t sc_fbh;
 	bus_space_handle_t sc_regh;
 	bus_addr_t sc_fb, sc_reg;
 	bus_size_t sc_fbsize, sc_regsize;
 
 	int sc_width, sc_height, sc_depth, sc_stride;
 	int sc_locked, sc_have_backlight, sc_bl_level;
-	void *sc_fbaddr;
 	struct vcons_screen sc_console_screen;
 	struct wsscreen_descr sc_defaultscreen_descr;
 	const struct wsscreen_descr *sc_screens[1];
@@ -124,9 +122,7 @@
 			    int, int);
 
 static void	r128fb_cursor(void *, int, int, int);
-#if 0
 static void	r128fb_putchar(void *, int, int, u_int, long);
-#endif
 static void	r128fb_copycols(void *, int, int, int, int);
 static void	r128fb_erasecols(void *, int, int, int, long);
 static void	r128fb_copyrows(void *, int, int, int);
@@ -203,7 +199,7 @@
 	unsigned long		defattr;
 	bool			is_console;
 	int i, j;
-	uint32_t reg;
+	uint32_t reg, flags;
 
 	sc->sc_pc = pa->pa_pc;
 	sc->sc_pcitag = pa->pa_tag;
@@ -236,13 +232,11 @@
 
 	prop_dictionary_get_bool(dict, "is_console", &is_console);
 
-	if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_MEM,
-	    BUS_SPACE_MAP_LINEAR,
-	    &sc->sc_memt, &sc->sc_fbh, &sc->sc_fb, &sc->sc_fbsize)) {
+	if (pci_mapreg_info(pa->pa_pc, pa->pa_tag, 0x10, PCI_MAPREG_TYPE_MEM,
+	    &sc->sc_fb, &sc->sc_fbsize, &flags)) {
 		aprint_error("%s: failed to map the frame buffer.\n",
 		    device_xname(sc->sc_dev));
 	}
-	sc->sc_fbaddr = bus_space_vaddr(sc->sc_memt, sc->sc_fbh);
 
 	if (pci_mapreg_map(pa, 0x18, PCI_MAPREG_TYPE_MEM, 0,
 	    &sc->sc_memt, &sc->sc_regh, &sc->sc_reg, &sc->sc_regsize)) {
@@ -250,10 +244,6 @@
 		    device_xname(sc->sc_dev));
 	}
 
-	/*
-	 * XXX yeah, casting the fb address to uint32_t is formally wrong
-	 * but as far as I know there are no mach64 with 64bit BARs
-	 */
 	aprint_normal("%s: %d MB aperture at 0x%08x\n", device_xname(self),
 	    (int)(sc->sc_fbsize >> 20), (uint32_t)sc->sc_fb);
 
@@ -385,7 +375,6 @@
 			{
 				int new_mode = *(int*)data;
 
-				/* notify the bus backend */
 				if (new_mode != sc->sc_mode) {
 					sc->sc_mode = new_mode;
 					if(new_mode == WSDISPLAYIO_MODE_EMUL) {
@@ -396,25 +385,25 @@
 			}
 			return 0;
 
-	case WSDISPLAYIO_GETPARAM:
-		param = (struct wsdisplay_param *)data;
-		if ((param->param == WSDISPLAYIO_PARAM_BACKLIGHT) &&
-		    (sc->sc_have_backlight != 0)) {
-			param->min = 0;
-			param->max = 255;
-			param->curval = sc->sc_bl_level;
-			return 0;
-		}
-		return EPASSTHROUGH;
+		case WSDISPLAYIO_GETPARAM:
+			param = (struct wsdisplay_param *)data;
+			if ((param->param == WSDISPLAYIO_PARAM_BACKLIGHT) &&
+			    (sc->sc_have_backlight != 0)) {
+				param->min = 0;
+				param->max = 255;
+				param->curval = sc->sc_bl_level;
+				return 0;
+			}
+			return EPASSTHROUGH;
 
-	case WSDISPLAYIO_SETPARAM:
-		param = (struct wsdisplay_param *)data;
-		if ((param->param == WSDISPLAYIO_PARAM_BACKLIGHT) &&
-		    (sc->sc_have_backlight != 0)) {
-			r128fb_set_backlight(sc, param->curval);
-			return 0;
-		}
-		return EPASSTHROUGH;
+		case WSDISPLAYIO_SETPARAM:
+			param = (struct wsdisplay_param *)data;
+			if ((param->param == WSDISPLAYIO_PARAM_BACKLIGHT) &&
+			    (sc->sc_have_backlight != 0)) {
+				r128fb_set_backlight(sc, param->curval);
+				return 0;
+			}
+			return EPASSTHROUGH;
 	}
 	return EPASSTHROUGH;
 }
@@ -488,13 +477,7 @@
 	ri->ri_width = sc->sc_width;
 	ri->ri_height = sc->sc_height;
 	ri->ri_stride = sc->sc_stride;
-	ri->ri_flg = RI_CENTER | RI_FULLCLEAR;
-
-	ri->ri_bits = (char *)sc->sc_fbaddr;
-
-	if (existing) {
-		ri->ri_flg |= RI_CLEAR;
-	}
+	ri->ri_flg = RI_CENTER;
 
 	rasops_init(ri, sc->sc_height / 8, sc->sc_width / 8);
 	ri->ri_caps = WSSCREEN_WSCOLORS;
@@ -508,9 +491,7 @@
 	ri->ri_ops.eraserows = r128fb_eraserows;
 	ri->ri_ops.erasecols = r128fb_erasecols;
 	ri->ri_ops.cursor = r128fb_cursor;
-#if 0
 	ri->ri_ops.putchar = r128fb_putchar;
-#endif
 }
 
 static int
@@ -608,7 +589,7 @@
 
 	r128fb_flush_engine(sc);
 
-	r128fb_wait(sc, 8);
+	r128fb_wait(sc, 9);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_CRTC_OFFSET, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DEFAULT_OFFSET, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DEFAULT_PITCH,
@@ -620,8 +601,17 @@
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SC_TOP_LEFT, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SC_BOTTOM_RIGHT,
 	    R128_DEFAULT_SC_RIGHT_MAX | R128_DEFAULT_SC_BOTTOM_MAX);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+	    R128_DEFAULT_SC_BOTTOM_RIGHT,
+	    R128_DEFAULT_SC_RIGHT_MAX | R128_DEFAULT_SC_BOTTOM_MAX);
+
+#if BYTE_ORDER == BIG_ENDIAN
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_DATATYPE,
 	    R128_HOST_BIG_ENDIAN_EN);
+#else
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_DATATYPE,
+	    R128_HOST_LITTLE_ENDIAN_EN);
+#endif
 
 	r128fb_wait(sc, 5);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_SRC_PITCH,
@@ -665,7 +655,7 @@
      uint32_t colour)
 {
 
-	r128fb_wait(sc, 6);
+	r128fb_wait(sc, 5);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DP_GUI_MASTER_CNTL,
 	    R128_GMC_BRUSH_SOLID_COLOR |
 	    R128_GMC_SRC_DATATYPE_COLOR |
@@ -681,7 +671,6 @@
 	    (x << 16) | y);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_WIDTH_HEIGHT,
 	    (wi << 16) | he);
-	r128fb_flush_engine(sc);
 }
 
 static void
@@ -719,7 +708,6 @@
 	    (xd << 16) | yd);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, R128_DST_WIDTH_HEIGHT,
 	    (wi << 16) | he);
-	r128fb_flush_engine(sc);
 }
 
 static void
@@ -756,12 +744,107 @@
 
 }
 
-#if 0
 static void
 r128fb_putchar(void *cookie, int row, int col, u_int c, long attr)
 {
+	struct rasops_info *ri = cookie;
+	struct wsdisplay_font *font = PICK_FONT(ri, c);
+	struct vcons_screen *scr = ri->ri_hw;
+	struct r128fb_softc *sc = scr->scr_cookie;
+
+	if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
+		void *data;
+		uint32_t fg, bg;
+		int uc, i;
+		int x, y, wi, he, offset;
+
+		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;
+		if (c == 0x20) {
+			r128fb_rectfill(sc, x, y, wi, he, bg);
+		} else {
+			uc = c - font->firstchar;
+			data = (uint8_t *)font->data + uc * ri->ri_fontscale;
+
+			r128fb_wait(sc, 8);
+
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_DP_GUI_MASTER_CNTL,
+			    R128_GMC_BRUSH_SOLID_COLOR |
+			    R128_GMC_SRC_DATATYPE_MONO_FG_BG |
+			    R128_ROP3_S |
+			    R128_DP_SRC_SOURCE_HOST_DATA |
+			    R128_GMC_DST_CLIPPING |
+			    sc->sc_master_cntl);
+
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_DP_CNTL, 
+			    R128_DST_Y_TOP_TO_BOTTOM | 
+			    R128_DST_X_LEFT_TO_RIGHT);
+
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_DP_SRC_FRGD_CLR, fg);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_DP_SRC_BKGD_CLR, bg);
+
+			/*
+			 * The Rage 128 doesn't have anything to skip pixels
+			 * when colour expanding but all coordinates
+			 * are signed so we just clip the leading bytes and 
+			 * trailing bits away
+			 */
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_SC_RIGHT, x + wi - 1);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_SC_LEFT, x);
+
+			/* needed? */
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_SRC_X_Y, 0);
+
+			offset = 32 - (ri->ri_font->stride << 3);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_DST_X_Y, ((x - offset) << 16) | y);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    R128_DST_WIDTH_HEIGHT, (32 << 16) | he);
+
+			r128fb_wait(sc, he);
+			switch (ri->ri_font->stride) {
+			case 1: {
+				uint8_t *data8 = data;
+				uint32_t reg;
+				for (i = 0; i < he; i++) {
+					reg = *data8;
+					bus_space_write_stream_4(sc->sc_memt, 
+					    sc->sc_regh,
+					    R128_HOST_DATA0, reg);
+					data8++;
+				}
+			break;
+			}
+			case 2: {
+				uint16_t *data16 = data;
+				uint32_t reg;
+				for (i = 0; i < he; i++) {
+					reg = *data16;
+					bus_space_write_stream_4(sc->sc_memt, 
+					    sc->sc_regh,
+					    R128_HOST_DATA0, reg);
+					data16++;
+				}
+				break;
+			}
+			}
+		}
+	}
 }
-#endif
 
 static void
 r128fb_copycols(void *cookie, int row, int srccol, int dstcol, int ncols)
@@ -813,7 +896,7 @@
 		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;
+		height = ri->ri_font->fontheight * nrows;
 		r128fb_bitblt(sc, x, ys, x, yd, width, height, R128_ROP3_S);
 	}
 }

Reply via email to