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