Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci - clean up some testing & debugging goop



details:   https://anonhg.NetBSD.org/src/rev/b530764d3560
branches:  trunk
changeset: 822525:b530764d3560
user:      macallan <macallan%NetBSD.org@localhost>
date:      Fri Mar 24 00:51:43 2017 +0000

description:
- clean up some testing & debugging goop
- 0xff is transparent, so restrict ourself to just 4 bit colour, all we need
  for wscons
- support WSDISPLAYIO_GET_FBINFO etc. for wsfb, allow mmap()ing the fb etc.

diffstat:

 sys/dev/pci/wcfb.c |  162 +++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 126 insertions(+), 36 deletions(-)

diffs (277 lines):

diff -r 99d0f81aebba -r b530764d3560 sys/dev/pci/wcfb.c
--- a/sys/dev/pci/wcfb.c        Fri Mar 24 00:45:27 2017 +0000
+++ b/sys/dev/pci/wcfb.c        Fri Mar 24 00:51:43 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: wcfb.c,v 1.14 2016/07/14 10:19:06 msaitoh Exp $ */
+/*     $NetBSD: wcfb.c,v 1.15 2017/03/24 00:51:43 macallan Exp $ */
 
 /*
  * Copyright (c) 2007, 2008, 2009 Miodrag Vallat.
@@ -20,7 +20,7 @@
 /* a driver for (some) 3DLabs Wildcat cards, based on OpenBSD's ifb driver */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wcfb.c,v 1.14 2016/07/14 10:19:06 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wcfb.c,v 1.15 2017/03/24 00:51:43 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -72,10 +72,10 @@
        bus_space_tag_t sc_regt, sc_wtft;
        bus_space_tag_t sc_iot;
 
-       bus_space_handle_t sc_fbh, sc_wtfh;
+       bus_space_handle_t sc_fbh;
        bus_space_handle_t sc_regh;
-       bus_addr_t sc_fb, sc_reg, sc_wtf;
-       bus_size_t sc_fbsize, sc_regsize, sc_wtfsize;
+       bus_addr_t sc_fb, sc_reg;
+       bus_size_t sc_fbsize, sc_regsize;
 
        int sc_width, sc_height, sc_stride;
        int sc_locked;
@@ -89,7 +89,7 @@
        u_char sc_cmap_red[256];
        u_char sc_cmap_green[256];
        u_char sc_cmap_blue[256];
-       uint32_t sc_fb0off, sc_fb1off;
+       uint32_t sc_fb0off, sc_fb1off, sc_fb8size;
 
        void (*copycols)(void *, int, int, int, int);
        void (*erasecols)(void *, int, int, int, long);
@@ -165,7 +165,6 @@
        uint32_t                reg;
        unsigned long           defattr;
        bool                    is_console = 0;
-       void                    *wtf;
        uint32_t                sub;
 
        sc->sc_dev = self;
@@ -188,22 +187,17 @@
                    device_xname(sc->sc_dev));
        }
 
-       if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_MEM, BUS_SPACE_MAP_LINEAR,
+       if (pci_mapreg_map(pa, 0x10, PCI_MAPREG_TYPE_MEM,
+           BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE,
            &sc->sc_memt, &sc->sc_fbh, &sc->sc_fb, &sc->sc_fbsize)) {
                aprint_error("%s: failed to map framebuffer.\n",
                    device_xname(sc->sc_dev));
        }
 
-       if (pci_mapreg_map(pa, 0x18, PCI_MAPREG_TYPE_MEM, BUS_SPACE_MAP_LINEAR,
-           &sc->sc_wtft, &sc->sc_wtfh, &sc->sc_wtf, &sc->sc_wtfsize)) {
-               aprint_error("%s: failed to map wtf.\n",
-                   device_xname(sc->sc_dev));
-       }
-       wtf = bus_space_vaddr(sc->sc_wtft, sc->sc_wtfh);
-       memset(wtf, 0, 0x100000);
-
        sc->sc_fbaddr = bus_space_vaddr(sc->sc_memt, sc->sc_fbh);
-
+#ifdef DEBUG
+       memset(sc->sc_fbaddr, 0, sc->sc_fbsize);
+#endif
        sc->sc_fb0off =
            bus_space_read_4(sc->sc_regt, sc->sc_regh,
                WC_FB8_ADDR0) - sc->sc_fb;
@@ -212,6 +206,8 @@
            bus_space_read_4(sc->sc_regt, sc->sc_regh,
                WC_FB8_ADDR1) - sc->sc_fb;
        sc->sc_fb1 = sc->sc_fbaddr + sc->sc_fb1off;
+       sc->sc_fb8size = 2 * (sc->sc_fb1off - sc->sc_fb0off);
+printf("fb %08x %08x %08x\n", sc->sc_fb0off, sc->sc_fb1off, sc->sc_fb8size);
 
        sub = pci_conf_read(sc->sc_pc, sc->sc_pcitag, PCI_SUBSYS_ID_REG);
        aprint_normal("subsys: %08x\n", sub);
@@ -257,6 +253,18 @@
        /* make sure video output is on */
        bus_space_write_4(sc->sc_regt, sc->sc_regh, WC_DPMS_STATE, WC_DPMS_ON);
 
+#if 0
+       /* testing & debugging voodoo */
+       memset(sc->sc_fb0, 0x01, 0x00100000);
+       memset(sc->sc_fb1, 0x00, 0x00100000);
+       wcfb_rop_wait(sc);
+       wcfb_rop_jfb(sc, 0, 0, 0, 0, 600, 600, WC_ROP_SET, 0xffffffff);
+       wcfb_rop_wait(sc);
+       delay(4000000);
+       bus_space_write_4(sc->sc_regt, sc->sc_regh, WC_FB8_ADDR1,
+           bus_space_read_4(sc->sc_regt, sc->sc_regh, WC_FB8_ADDR0));
+       delay(8000000);
+#endif
        sc->sc_defaultscreen_descr = (struct wsscreen_descr){
                "default",
                0, 0,
@@ -336,10 +344,72 @@
 }
 
 static int
+wcfb_putcmap(struct wcfb_softc *sc, struct wsdisplay_cmap *cm)
+{
+       u_char *r, *g, *b;
+       u_int index = cm->index;
+       u_int count = cm->count;
+       int i, error;
+       u_char rbuf[256], gbuf[256], bbuf[256];
+
+       if (cm->index >= 256 || cm->count > 256 ||
+           (cm->index + cm->count) > 256)
+               return EINVAL;
+       error = copyin(cm->red, &rbuf[index], count);
+       if (error)
+               return error;
+       error = copyin(cm->green, &gbuf[index], count);
+       if (error)
+               return error;
+       error = copyin(cm->blue, &bbuf[index], count);
+       if (error)
+               return error;
+
+       memcpy(&sc->sc_cmap_red[index], &rbuf[index], count);
+       memcpy(&sc->sc_cmap_green[index], &gbuf[index], count);
+       memcpy(&sc->sc_cmap_blue[index], &bbuf[index], count);
+
+       r = &sc->sc_cmap_red[index];
+       g = &sc->sc_cmap_green[index];
+       b = &sc->sc_cmap_blue[index];
+
+       for (i = 0; i < count; i++) {
+               wcfb_putpalreg(sc, index, *r, *g, *b);
+               index++;
+               r++, g++, b++;
+       }
+       return 0;
+}
+
+static int
+wcfb_getcmap(struct wcfb_softc *sc, struct wsdisplay_cmap *cm)
+{
+       u_int index = cm->index;
+       u_int count = cm->count;
+       int error;
+
+       if (index >= 255 || count > 256 || index + count > 256)
+               return EINVAL;
+
+       error = copyout(&sc->sc_cmap_red[index],   cm->red,   count);
+       if (error)
+               return error;
+       error = copyout(&sc->sc_cmap_green[index], cm->green, count);
+       if (error)
+               return error;
+       error = copyout(&sc->sc_cmap_blue[index],  cm->blue,  count);
+       if (error)
+               return error;
+
+       return 0;
+}
+
+static int
 wcfb_ioctl(void *v, void *vs, u_long cmd, void *data, int flag,
     struct lwp *l)
 {
-       struct wcfb_softc *sc = v;
+       struct vcons_data *vd = v;
+       struct wcfb_softc *sc = vd->cookie;
 
        switch (cmd) {
        case WSDISPLAYIO_GTYPE:
@@ -360,17 +430,45 @@
                /*int new_mode = *(int*)data, i;*/
                }
                return 0;
+
+       case WSDISPLAYIO_GETCMAP:
+               return wcfb_getcmap(sc,
+                   (struct wsdisplay_cmap *)data);
+
+       case WSDISPLAYIO_PUTCMAP:
+               return wcfb_putcmap(sc,
+                   (struct wsdisplay_cmap *)data);
+
+       case WSDISPLAYIO_GET_FBINFO: {
+               struct wsdisplayio_fbinfo *fbi = data;
+
+               fbi->fbi_fbsize = sc->sc_fb8size;
+               fbi->fbi_fboffset = 0;
+               fbi->fbi_width = sc->sc_width;
+               fbi->fbi_height = sc->sc_height;
+               fbi->fbi_bitsperpixel = 8;
+               fbi->fbi_stride = sc->sc_stride;
+               fbi->fbi_pixeltype = WSFB_CI;
+               fbi->fbi_subtype.fbi_cmapinfo.cmap_entries = 256;
+               fbi->fbi_flags = WSFB_VRAM_IS_SPLIT;
+               return 0;
+               }
        }
-
        return EPASSTHROUGH;
 }
 
 static paddr_t
 wcfb_mmap(void *v, void *vs, off_t offset, int prot)
 {
-       struct wcfb_softc *sc = v;
+       struct vcons_data *vd = v;
+       struct wcfb_softc *sc = vd->cookie;
+
+       /* XXX in theory the order is not fixed... */
 
-       /* no point in allowing a wsfb map if we can't provide one */
+       if (offset < sc->sc_fb8size)
+               return bus_space_mmap(sc->sc_memt, sc->sc_fb + sc->sc_fb0off,
+                   offset, prot,
+                   BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE);
        /*
         * restrict all other mappings to processes with superuser privileges
         * or the kernel itself
@@ -382,13 +480,7 @@
                return -1;
        }
 
-#ifdef WSFB_FAKE_VGA_FB
-       if ((offset >= 0xa0000) && (offset < 0xbffff)) {
-
-               return bus_space_mmap(sc->sc_memt, sc->sc_gen.sc_fboffset,
-                  offset - 0xa0000, prot, BUS_SPACE_MAP_LINEAR);
-       }
-#endif
+       /* may want to mmap() registers at some point */
 
        return -1;
 }
@@ -626,7 +718,7 @@
                 int h, uint32_t rop)
 {
        wcfb_rop_wait(sc);
-       wcfb_rop_jfb(sc, sx, sy, dx, dy, w, h, rop, 0xff);
+       wcfb_rop_jfb(sc, sx, sy, dx, dy, w, h, rop, 0x0f);
 }
 
 static void
@@ -634,19 +726,17 @@
 {
        int32_t mask;
 
+       /* clear everything just in case... */
+       wcfb_rop_wait(sc);
+       wcfb_rop_jfb(sc, x, y, x, y, w, h, WC_ROP_CLEAR, 0xffffffff);
+
        /* pixels to set... */
-       mask = 0xff & bg;
+       mask = 0x0f & bg;
        if (mask != 0) {
                wcfb_rop_wait(sc);
                wcfb_rop_jfb(sc, x, y, x, y, w, h, WC_ROP_SET, mask);
        }
 
-       /* pixels to clear... */
-       mask = 0xff & ~bg;
-       if (mask != 0) {
-               wcfb_rop_wait(sc);
-               wcfb_rop_jfb(sc, x, y, x, y, w, h, WC_ROP_CLEAR, mask);
-       }
 }
 
 void



Home | Main Index | Thread Index | Old Index