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 */