Module Name:    src
Committed By:   macallan
Date:           Tue Mar 16 21:27:02 UTC 2010

Modified Files:
        src/sys/dev/pci: pm2fb.c pm2reg.h

Log Message:
Implement character drawing by hardware so we don't need to map the framebuffer
anymore. Also do some cleanup, remove no longer relevant debugging code etc.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/pci/pm2fb.c
cvs rdiff -u -r1.3 -r1.4 src/sys/dev/pci/pm2reg.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/dev/pci/pm2fb.c
diff -u src/sys/dev/pci/pm2fb.c:1.2 src/sys/dev/pci/pm2fb.c:1.3
--- src/sys/dev/pci/pm2fb.c:1.2	Wed Oct 28 04:25:13 2009
+++ src/sys/dev/pci/pm2fb.c	Tue Mar 16 21:27:02 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pm2fb.c,v 1.2 2009/10/28 04:25:13 macallan Exp $	*/
+/*	$NetBSD: pm2fb.c,v 1.3 2010/03/16 21:27:02 macallan Exp $	*/
 
 /*
  * Copyright (c) 2009 Michael Lorenz
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.2 2009/10/28 04:25:13 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.3 2010/03/16 21:27:02 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -68,14 +68,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;
-	void *sc_fbaddr;
 	struct vcons_screen sc_console_screen;
 	struct wsscreen_descr sc_defaultscreen_descr;
 	const struct wsscreen_descr *sc_screens[1];
@@ -86,7 +84,7 @@
 	u_char sc_cmap_green[256];
 	u_char sc_cmap_blue[256];
 	/* engine stuff */
-	uint32_t sc_master_cntl;
+	uint32_t sc_pprod;
 };
 
 static int	pm2fb_match(device_t, cfdata_t, void *);
@@ -116,9 +114,7 @@
 			    int, int);
 
 static void	pm2fb_cursor(void *, int, int, int);
-#if 0
 static void	pm2fb_putchar(void *, int, int, u_int, long);
-#endif
 static void	pm2fb_copycols(void *, int, int, int, int);
 static void	pm2fb_erasecols(void *, int, int, int, long);
 static void	pm2fb_copyrows(void *, int, int, int);
@@ -191,6 +187,7 @@
 	unsigned long		defattr;
 	bool			is_console;
 	int i, j;
+	uint32_t flags;
 
 	sc->sc_pc = pa->pa_pc;
 	sc->sc_pcitag = pa->pa_tag;
@@ -223,13 +220,8 @@
 
 	prop_dictionary_get_bool(dict, "is_console", &is_console);
 
-	if (pci_mapreg_map(pa, 0x14, PCI_MAPREG_TYPE_MEM,
-	    BUS_SPACE_MAP_LINEAR,
-	    &sc->sc_memt, &sc->sc_fbh, &sc->sc_fb, &sc->sc_fbsize)) {
-		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);
+	pci_mapreg_info(pa->pa_pc, pa->pa_tag, 0x14, PCI_MAPREG_TYPE_MEM,
+	    &sc->sc_fb, &sc->sc_fbsize, &flags);
 
 	if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_MEM, 0,
 	    &sc->sc_memt, &sc->sc_regh, &sc->sc_reg, &sc->sc_regsize)) {
@@ -304,11 +296,7 @@
 	aa.accessops = &pm2fb_accessops;
 	aa.accesscookie = &sc->vd;
 
-	config_found(sc->sc_dev, &aa, wsemuldisplaydevprint);
-	
-	printf("ap1 register: %08x\n", bus_space_read_4(sc->sc_memt, 
-	    sc->sc_regh, PM2_APERTURE1_CONTROL));
-	
+	config_found(sc->sc_dev, &aa, wsemuldisplaydevprint);	
 }
 
 static int
@@ -358,13 +346,13 @@
 			{
 				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) {
 						pm2fb_restore_palette(sc);
 						vcons_redraw_screen(ms);
-					}
+					} else
+						pm2fb_flush_engine(sc);
 				}
 			}
 			return 0;
@@ -420,13 +408,6 @@
 	}
 #endif
 
-#ifdef OFB_ALLOW_OTHERS
-	if (offset >= 0x80000000) {
-		pa = bus_space_mmap(sc->sc_memt, offset, 0, prot,
-		    BUS_SPACE_MAP_LINEAR);
-		return pa;
-	}
-#endif
 	return -1;
 }
 
@@ -441,13 +422,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;
@@ -461,9 +436,7 @@
 	ri->ri_ops.cursor = pm2fb_cursor;
 	ri->ri_ops.eraserows = pm2fb_eraserows;
 	ri->ri_ops.erasecols = pm2fb_erasecols;
-#if 0
 	ri->ri_ops.putchar = pm2fb_putchar;
-#endif
 }
 
 static int
@@ -555,42 +528,59 @@
 static void
 pm2fb_init(struct pm2fb_softc *sc)
 {
-#if 0
-	uint32_t datatype;
-#endif
 	pm2fb_flush_engine(sc);
 
 	pm2fb_wait(sc, 8);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_SCREEN_BASE, 0);
 #if 0
-	switch (sc->sc_depth) {
-		case 8:
-			datatype = R128_GMC_DST_8BPP_CI;
-			break;
-		case 15:
-			datatype = R128_GMC_DST_15BPP;
-			break;
-		case 16:
-			datatype = R128_GMC_DST_16BPP;
-			break;
-		case 24:
-			datatype = R128_GMC_DST_24BPP;
-			break;
-		case 32:
-			datatype = R128_GMC_DST_32BPP;
-			break;
-		default:
-			aprint_error("%s: unsupported depth %d\n",
-			    device_xname(sc->sc_dev), sc->sc_depth);
-			return;
-	}
-	sc->sc_master_cntl = R128_GMC_CLR_CMP_CNTL_DIS |
-	    R128_GMC_AUX_CLIP_DIS | datatype;
-#endif
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_BYPASS_MASK, 
 		0xffffffff);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_FB_WRITE_MASK, 
 		0xffffffff);
+#endif
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_HW_WRITEMASK, 
+		0xffffffff);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_SW_WRITEMASK, 
+		0xffffffff);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_WRITE_MODE, 
+		PM2WM_WRITE_EN);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_SCREENSIZE,
+	    (sc->sc_height << 16) | sc->sc_width);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_SCISSOR_MODE, 
+	    PM2SC_SCREEN_EN);
+	pm2fb_wait(sc, 8);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DITHER_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_ALPHA_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DDA_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_TEX_COLOUR_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_TEX_ADDRESS_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_TEX_READ_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_TEX_LUT_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_YUV_MODE, 0);
+	pm2fb_wait(sc, 8);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DEPTH_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DEPTH, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_STENCIL_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_STIPPLE_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_ROP_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_WINDOW_ORIGIN, 0);
+	sc->sc_pprod = bus_space_read_4(sc->sc_memt, sc->sc_regh, 
+	    PM2_FB_READMODE) &
+	    (PM2FB_PP0_MASK | PM2FB_PP1_MASK | PM2FB_PP2_MASK);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_FB_READMODE, 
+	    sc->sc_pprod);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_TEXMAP_FORMAT, 
+	    sc->sc_pprod);
+	pm2fb_wait(sc, 8);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DY, 1 << 16);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DXDOM, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_STARTXDOM, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_STARTXSUB, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_STARTY, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_COUNT, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_SCISSOR_MINYX, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_SCISSOR_MAXYX,
+	    0x0fff0fff);
 	pm2fb_flush_engine(sc);
 }
 
@@ -599,9 +589,9 @@
      uint32_t colour)
 {
 
-	pm2fb_wait(sc, 6);
-	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DDA_MODE, 
-	    0);
+	pm2fb_wait(sc, 7);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DDA_MODE, 0);
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_MODE, 0);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_CONFIG,
 	    PM2RECFG_WRITE_EN);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_BLOCK_COLOUR,
@@ -612,8 +602,6 @@
 	    (he << 16) | wi);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_RENDER,
 	    PM2RE_RECTANGLE | PM2RE_INC_X | PM2RE_INC_Y | PM2RE_FASTFILL);
-	
-	pm2fb_flush_engine(sc);
 }
 
 static void
@@ -628,11 +616,18 @@
 	if (xd <= xs) {
 		dir |= PM2RE_INC_X;
 	}
-	pm2fb_wait(sc, 6);
+	pm2fb_wait(sc, 7);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DDA_MODE, 0);
-	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_CONFIG,
-	    PM2RECFG_READ_SRC | PM2RECFG_WRITE_EN | PM2RECFG_ROP_EN |
-	    (rop << 6));
+	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_MODE, 0);
+	if (rop == 3) {
+		bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_CONFIG,
+		    PM2RECFG_READ_SRC | PM2RECFG_WRITE_EN | PM2RECFG_ROP_EN |
+		    PM2RECFG_PACKED | (rop << 6));
+	} else {
+		bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_CONFIG,
+		    PM2RECFG_READ_SRC | PM2RECFG_READ_DST | PM2RECFG_WRITE_EN |
+		    PM2RECFG_PACKED | PM2RECFG_ROP_EN | (rop << 6));
+	}
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_RECT_START,
 	    (yd << 16) | xd);
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_RECT_SIZE,
@@ -641,7 +636,6 @@
 	    (((ys - yd) & 0xfff) << 16) | ((xs - xd) & 0xfff));
 	bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_RENDER,
 	    PM2RE_RECTANGLE | dir);
-	pm2fb_flush_engine(sc);
 }
 
 static void
@@ -678,12 +672,99 @@
 
 }
 
-#if 0
 static void
 pm2fb_putchar(void *cookie, int row, int col, u_int c, long attr)
 {
+	struct rasops_info *ri = cookie;
+	struct vcons_screen *scr = ri->ri_hw;
+	struct pm2fb_softc *sc = scr->scr_cookie;
+	uint32_t mode;
+
+	if (sc->sc_mode == WSDISPLAYIO_MODE_EMUL) {
+		void *data;
+		uint32_t fg, bg;
+		int uc, i;
+		int x, y, wi, he;
+
+		wi = ri->ri_font->fontwidth;
+		he = ri->ri_font->fontheight;
+
+		if (!CHAR_IN_FONT(c, ri->ri_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) {
+			pm2fb_rectfill(sc, x, y, wi, he, bg);
+		} else {
+			uc = c - ri->ri_font->firstchar;
+			data = (uint8_t *)ri->ri_font->data + uc * 
+			    ri->ri_fontscale;
+
+			mode = PM2RM_MASK_MIRROR;
+			switch (ri->ri_font->stride) {
+				case 1:
+					mode |= 3 << 7;
+					break;
+				case 2:
+					mode |= 2 << 7;
+					break;
+			}
+
+			pm2fb_wait(sc, 8);
+
+			bus_space_write_4(sc->sc_memt, sc->sc_regh,
+			    PM2_RE_MODE, mode);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_CONFIG, PM2RECFG_WRITE_EN);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_BLOCK_COLOUR, bg);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_RECT_START, (y << 16) | x);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_RECT_SIZE, (he << 16) | wi);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_RENDER,
+			    PM2RE_RECTANGLE |
+			    PM2RE_INC_X | PM2RE_INC_Y | PM2RE_FASTFILL);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_BLOCK_COLOUR, fg);
+			bus_space_write_4(sc->sc_memt, sc->sc_regh, 
+			    PM2_RE_RENDER,
+			    PM2RE_RECTANGLE | PM2RE_SYNC_ON_MASK |
+			    PM2RE_INC_X | PM2RE_INC_Y | PM2RE_FASTFILL);
+
+			pm2fb_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_4(sc->sc_memt, 
+					    sc->sc_regh,
+					    PM2_RE_BITMASK, reg);
+					data8++;
+				}
+				break;
+				}
+			case 2: {
+				uint16_t *data16 = data;
+				uint32_t reg;
+				for (i = 0; i < he; i++) {
+					reg = *data16;
+					bus_space_write_4(sc->sc_memt, 
+					    sc->sc_regh,
+					    PM2_RE_BITMASK, reg);
+					data16++;
+				}
+				break;
+			}
+			}
+		}
+	}
 }
-#endif
 
 static void
 pm2fb_copycols(void *cookie, int row, int srccol, int dstcol, int ncols)

Index: src/sys/dev/pci/pm2reg.h
diff -u src/sys/dev/pci/pm2reg.h:1.3 src/sys/dev/pci/pm2reg.h:1.4
--- src/sys/dev/pci/pm2reg.h:1.3	Fri Oct 30 01:57:48 2009
+++ src/sys/dev/pci/pm2reg.h	Tue Mar 16 21:27:02 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: pm2reg.h,v 1.3 2009/10/30 01:57:48 christos Exp $	*/
+/*	$NetBSD: pm2reg.h,v 1.4 2010/03/16 21:27:02 macallan Exp $	*/
 
 /*
  * Copyright (c) 2009 Michael Lorenz
@@ -76,6 +76,12 @@
 #define PM2_DAC_CURSOR_Y_HIGH	0x00004078
 
 /* drawing engine */
+#define PM2_RE_STARTXDOM	0x00008000
+#define	PM2_RE_DXDOM		0x00008008
+#define PM2_RE_STARTXSUB	0x00008010
+#define PM2_RE_STARTY		0x00008020
+#define PM2_RE_DY		0x00008028
+#define PM2_RE_COUNT		0x00008030
 #define PM2_RE_BITMASK		0x00008068 /* for colour expansion */
 #define PM2_RE_COLOUR		0x000087f0
 #define PM2_RE_CONFIG		0x00008d90
@@ -94,13 +100,14 @@
 #define PM2_RE_SOURCE_DELTA	0x00008d88 /* offset in coordinates */
 #define PM2_RE_SOURCE_OFFSET	0x00008a88 /* same in pixels */
 #define PM2_RE_WINDOW_BASE	0x00008ab0
+#define PM2_RE_WINDOW_ORIGIN	0x000081c8
 #define PM2_RE_WRITE_MODE	0x00008ab8
 #define		PM2WM_WRITE_EN		0x00000001
 #define		PM2WM_TO_HOST		0x00000008
 
 #define PM2_RE_MODE		0x000080a0
 #define		PM2RM_MASK_MIRROR	0x00000001 /* mask is right-to-left */
-#define		PM2RM_MASK_INVERT
+#define		PM2RM_MASK_INVERT	0x00000002
 #define		PM2RM_MASK_OPAQUE	0x00000040 /* BG in TEXEL0 */
 #define		PM2RM_MASK_SWAP		0x00000180
 #define		PM2RM_MASK_PAD		0x00000200 /* new line new mask */
@@ -134,4 +141,48 @@
 #define		PM2DDA_ENABLE		0x00000001
 #define		PM2DDA_GOURAUD		0x00000002 /* flat otherwise */
 #define PM2_RE_BLOCK_COLOUR	0x00008ac8
+#define PM2_RE_STIPPLE_MODE	0x000081a0
+#define 	PM2ST_ENABLE		0x00000001
+#define 	PM2ST_XOFFSET_MASK	0x00000380
+#define 	PM2ST_YOFFSET_MASK	0x00007000
+#define 	PM2ST_INVERT		0x00020000
+#define 	PM2ST_MIRROR_X		0x00040000
+#define 	PM2ST_MIRROR_Y		0x00080000
+#define 	PM2ST_OPAQUE		0x00100000
+#define PM2_HW_WRITEMASK	0x00008ac0
+#define PM2_SW_WRITEMASK	0x00008820
+#define PM2_FB_READMODE		0x00008a80
+#define		PM2FB_PP0_MASK	0x00000007
+#define		PM2FB_PP1_MASK	0x00000038
+#define		PM2FB_PP2_MASK	0x000001c0
+#define		PM2FB_READ_SRC	0x00000200
+#define		PM2FB_READ_DST	0x00000400
+#define		PM2FB_FBCOLOR	0x00008000 /* for uploads */
+#define		PM2FB_ORIGIN_BL	0x00010000 /* window origin, TL otherwise */
+#define		PM2FB_PATCH_EN	0x00020000
+#define		PM2FB_PACKED	0x00040000
+#define		PM2FB_OFFSET_M	0x00380000
+#define		PM2FB_PM_PATCH	0x00000000
+#define		PM2FB_PM_SUB	0x02000000
+#define		PM2FB_PM_SUBP	0x04000000
+
+#define PM2_RE_SCISSOR_MODE	0x00008180
+#define		PM2SC_USER_EN		0x00000001 /* from scissor reg */
+#define		PM2SC_SCREEN_EN		0x00000002 /* screensize reg */
+#define PM2_RE_SCREENSIZE	0x00008198
+#define PM2_RE_SCISSOR_MINYX	0x00008188
+#define PM2_RE_SCISSOR_MAXYX	0x00008190
+#define PM2_RE_TEXMAP_FORMAT	0x00008588
+#define PM2_RE_DITHER_MODE	0x00008818
+#define PM2_RE_ALPHA_MODE	0x00008810
+#define PM2_RE_TEX_COLOUR_MODE	0x00008680
+#define PM2_RE_TEX_READ_MODE	0x00008670
+#define PM2_RE_TEX_LUT_MODE	0x00008678
+#define PM2_RE_TEX_ADDRESS_MODE	0x00008380
+#define PM2_RE_YUV_MODE		0x00008f00
+#define PM2_RE_DEPTH_MODE	0x000089a0
+#define PM2_RE_DEPTH		0x000089a8
+#define PM2_RE_STENCIL_MODE	0x00008988
+#define PM2_RE_ROP_MODE		0x00008828
+
 #endif /* PM2_REG_H */

Reply via email to