Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci use the drawing engine to draw characters so we ...
details: https://anonhg.NetBSD.org/src/rev/62d501cb9e66
branches: trunk
changeset: 757868:62d501cb9e66
user: macallan <macallan%NetBSD.org@localhost>
date: Thu Sep 30 03:16:51 2010 +0000
description:
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
diffstat:
sys/dev/pci/r128fb.c | 183 +++++++++++++++++++++++++++++++++++++-------------
1 files changed, 133 insertions(+), 50 deletions(-)
diffs (truncated from 327 to 300 lines):
diff -r 5b9c021b7992 -r 62d501cb9e66 sys/dev/pci/r128fb.c
--- a/sys/dev/pci/r128fb.c Thu Sep 30 03:14:39 2010 +0000
+++ b/sys/dev/pci/r128fb.c Thu Sep 30 03:16:51 2010 +0000
@@ -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;
Home |
Main Index |
Thread Index |
Old Index