Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/sgimips/dev support ioctl() WSDISPLAYIO_SVIDEO, _GV...



details:   https://anonhg.NetBSD.org/src/rev/b7fb256d4dac
branches:  trunk
changeset: 331961:b7fb256d4dac
user:      macallan <macallan%NetBSD.org@localhost>
date:      Tue Sep 02 15:44:44 2014 +0000

description:
support ioctl() WSDISPLAYIO_SVIDEO, _GVIDEO and _GET_EDID
now xf86-video-crime can actually turn the monitor off

diffstat:

 sys/arch/sgimips/dev/crmfb.c |  88 ++++++++++++++++++++++++++++++++-----------
 1 files changed, 65 insertions(+), 23 deletions(-)

diffs (244 lines):

diff -r 841bea1bfc80 -r b7fb256d4dac sys/arch/sgimips/dev/crmfb.c
--- a/sys/arch/sgimips/dev/crmfb.c      Tue Sep 02 14:55:56 2014 +0000
+++ b/sys/arch/sgimips/dev/crmfb.c      Tue Sep 02 15:44:44 2014 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: crmfb.c,v 1.37 2013/12/16 15:45:29 mrg Exp $ */
+/* $NetBSD: crmfb.c,v 1.38 2014/09/02 15:44:44 macallan Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcneill%invisible.ca@localhost>
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crmfb.c,v 1.37 2013/12/16 15:45:29 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crmfb.c,v 1.38 2014/09/02 15:44:44 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -153,10 +153,13 @@
        int                     sc_mte_direction;
        int                     sc_mte_x_shift;
        uint32_t                sc_mte_mode;
+       uint32_t                sc_de_mode;
        uint8_t                 *sc_scratch;
        paddr_t                 sc_linear;
-       int                     sc_wsmode;
-       struct edid_info sc_edid_info;
+       uint32_t                sc_vtflags;
+       int                     sc_wsmode, sc_video_on;
+       uint8_t                 sc_edid_data[128];
+       struct edid_info        sc_edid_info;
 
        /* cursor stuff */
        int                     sc_cur_x;
@@ -283,6 +286,10 @@
                sc->sc_depth = 32;
 
        if (sc->sc_width == 0 || sc->sc_height == 0) {
+               /*
+                * XXX
+                * actually, these days we probably could
+                */
                aprint_error_dev(sc->sc_dev,
                    "device unusable if not setup by firmware\n");
                bus_space_unmap(sc->sc_iot, sc->sc_ioh, 0 /* XXX */);
@@ -367,6 +374,7 @@
        crmfb_setup_video(sc, sc->sc_console_depth);
        ri = &crmfb_console_screen.scr_ri;
        memset(ri, 0, sizeof(struct rasops_info));
+       sc->sc_video_on = 1;
 
        vcons_init(&sc->sc_vd, sc, &crmfb_defaultscreen, &crmfb_accessops);
        sc->sc_vd.init_screen = crmfb_init_screen;
@@ -428,7 +436,7 @@
        switch (cmd) {
        case WSDISPLAYIO_GTYPE:
                /* not really, but who cares? */
-               /* wsfb does */
+               /* xf86-video-crime does */
                *(u_int *)data = WSDISPLAY_TYPE_CRIME;
                return 0;
        case WSDISPLAYIO_GINFO:
@@ -468,8 +476,27 @@
                }
                return 0;
        case WSDISPLAYIO_SVIDEO:
+               {
+                       int d = *(int *)data;
+                       if (d == sc->sc_video_on)
+                               return 0;
+                       sc->sc_video_on = d;
+                       if (d == WSDISPLAYIO_VIDEO_ON) {
+                               crmfb_write_reg(sc,
+                                   CRMFB_VT_FLAGS, sc->sc_vtflags);
+                       } else {
+                               /* turn all SYNCs off */
+                               crmfb_write_reg(sc, CRMFB_VT_FLAGS,
+                                   sc->sc_vtflags | CRMFB_VT_FLAGS_VDRV_LOW |
+                                    CRMFB_VT_FLAGS_HDRV_LOW |
+                                    CRMFB_VT_FLAGS_SYNC_LOW);
+                       }
+               }
+               return 0;
+                                       
        case WSDISPLAYIO_GVIDEO:
-               return ENODEV;  /* not supported yet */
+               *(int *)data = sc->sc_video_on;
+               return 0;
 
        case WSDISPLAYIO_GCURPOS:
                {
@@ -511,6 +538,16 @@
                        cu = (struct wsdisplay_cursor *)data;
                        return crmfb_scursor(sc, cu);
                }
+       case WSDISPLAYIO_GET_EDID: {
+               struct wsdisplayio_edid_info *d = data;
+
+               d->data_size = 128;
+               if (d->buffer_size < 128)
+                       return EAGAIN;
+               if (sc->sc_edid_data[1] == 0)
+                       return ENODATA;
+               return copyout(sc->sc_edid_data, d->edid_data, 128);
+       }
        }
        return EPASSTHROUGH;
 }
@@ -567,8 +604,11 @@
        ri->ri_width = sc->sc_width;
        ri->ri_height = sc->sc_height;
        ri->ri_stride = ri->ri_width * (ri->ri_depth / 8);
-#if 1
+
        switch (ri->ri_depth) {
+       case 8:
+               ri->ri_flg |= RI_8BIT_IS_RGB;
+               break;
        case 16:
                ri->ri_rnum = ri->ri_gnum = ri->ri_bnum = 5;
                ri->ri_rpos = 11;
@@ -582,7 +622,7 @@
                ri->ri_bpos = 24;
                break;
        }
-#endif
+
        ri->ri_bits = KERNADDR(sc->sc_dma);
 
        if (existing)
@@ -814,7 +854,7 @@
 crmfb_setup_video(struct crmfb_softc *sc, int depth)
 {
        uint64_t reg;
-       uint32_t d, h, mode, page;
+       uint32_t d, h, page;
        int i, bail, tile_width, tlbptr, lptr, j, tx, shift, overhang;
        const char *wantsync;
        uint16_t v;
@@ -862,7 +902,7 @@
        /* setup colour mode */
        switch (depth) {
        case 8:
-               h = CRMFB_MODE_TYP_I8;
+               h = CRMFB_MODE_TYP_RG3B2;
                tile_width = 512;
                break;
        case 16:
@@ -943,9 +983,7 @@
 
        wantsync = arcbios_GetEnvironmentVariable("SyncOnGreen");
        if ( (wantsync != NULL) && (wantsync[0] == 'n') ) {
-               d = ( 1 << CRMFB_VT_FLAGS_SYNC_LOW_LSB) & 
-                   CRMFB_REG_MASK(CRMFB_VT_FLAGS_SYNC_LOW_MSB, 
-                   CRMFB_VT_FLAGS_SYNC_LOW_LSB);
+               sc->sc_vtflags |= CRMFB_VT_FLAGS_SYNC_LOW;
                crmfb_write_reg(sc, CRMFB_VT_FLAGS, d);
        }
 
@@ -1013,7 +1051,7 @@
        
        switch (depth) {
                case 8:
-                       mode = DE_MODE_TLB_A | DE_MODE_BUFDEPTH_8 |
+                       sc->sc_de_mode = DE_MODE_TLB_A | DE_MODE_BUFDEPTH_8 |
                            DE_MODE_TYPE_CI | DE_MODE_PIXDEPTH_8;
                        sc->sc_mte_mode = MTE_MODE_DST_ECC |
                            (MTE_TLB_A << MTE_DST_TLB_SHIFT) |
@@ -1022,7 +1060,7 @@
                        sc->sc_mte_x_shift = 0;
                        break;
                case 16:
-                       mode = DE_MODE_TLB_A | DE_MODE_BUFDEPTH_16 |
+                       sc->sc_de_mode = DE_MODE_TLB_A | DE_MODE_BUFDEPTH_16 |
                            DE_MODE_TYPE_RGBA | DE_MODE_PIXDEPTH_16;
                        sc->sc_mte_mode = MTE_MODE_DST_ECC |
                            (MTE_TLB_A << MTE_DST_TLB_SHIFT) |
@@ -1031,7 +1069,7 @@
                        sc->sc_mte_x_shift = 1;
                        break;
                case 32:
-                       mode = DE_MODE_TLB_A | DE_MODE_BUFDEPTH_32 |
+                       sc->sc_de_mode = DE_MODE_TLB_A | DE_MODE_BUFDEPTH_32 |
                            DE_MODE_TYPE_RGBA | DE_MODE_PIXDEPTH_32;
                        break;
                        sc->sc_mte_mode = MTE_MODE_DST_ECC |
@@ -1043,8 +1081,10 @@
                        panic("%s: unsuported colour depth %d\n", __func__,
                            depth);
        }
-       bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_MODE_DST, mode);
-       bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_MODE_SRC, mode);
+       bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_MODE_DST,
+           sc->sc_de_mode);
+       bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_MODE_SRC,
+           sc->sc_de_mode);
        bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_XFER_STEP_X, 1);
        bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_XFER_STEP_Y, 1);
 
@@ -1123,6 +1163,8 @@
        uint32_t prim = DE_PRIM_RECTANGLE;
        int rxa, rya, rxe, rye, rxs, rys;
        crmfb_wait_idle(sc);
+       bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_MODE_SRC,
+           sc->sc_de_mode);
        bus_space_write_4(sc->sc_iot, sc->sc_reh, CRIME_DE_DRAWMODE,
            DE_DRAWMODE_PLANEMASK | DE_DRAWMODE_BYTEMASK | DE_DRAWMODE_ROP |
            DE_DRAWMODE_XFER_EN);
@@ -1384,9 +1426,8 @@
 crmfb_setup_ddc(struct crmfb_softc *sc)
 {
        int i;
-       char edid_data[128];
 
-       memset(edid_data, 0, 128);
+       memset(sc->sc_edid_data, 0, 128);
        sc->sc_i2c.ic_cookie = sc;
        sc->sc_i2c.ic_acquire_bus = crmfb_i2c_acquire_bus;
        sc->sc_i2c.ic_release_bus = crmfb_i2c_release_bus;
@@ -1397,13 +1438,13 @@
        sc->sc_i2c.ic_write_byte = crmfb_i2c_write_byte;
        sc->sc_i2c.ic_exec = NULL;
        i = 0;
-       while (edid_data[1] == 0 && i++ < 10)
-               ddc_read_edid(&sc->sc_i2c, edid_data, 128);
+       while (sc->sc_edid_data[1] == 0 && i++ < 10)
+               ddc_read_edid(&sc->sc_i2c, sc->sc_edid_data, 128);
        if (i > 1)
                aprint_debug_dev(sc->sc_dev,
                    "had to try %d times to get EDID data\n", i);
        if (i < 11) {
-               edid_parse(edid_data, &sc->sc_edid_info);
+               edid_parse(sc->sc_edid_data, &sc->sc_edid_info);
                edid_print(&sc->sc_edid_info);
        }
 }
@@ -1610,6 +1651,7 @@
        if (mode->flags & VID_NHSYNC) d |= CRMFB_VT_FLAGS_HDRV_INVERT;
        if (mode->flags & VID_NVSYNC) d |= CRMFB_VT_FLAGS_VDRV_INVERT;
        crmfb_write_reg(sc, CRMFB_VT_FLAGS, d);
+       sc->sc_vtflags = d;
 
        diff = -abs(mode->vtotal - mode->vdisplay - 1);
        d = ((uint32_t)diff << 12) & 0x00fff000;



Home | Main Index | Thread Index | Old Index