[BACK]Return to rbox.c CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / dev

Annotation of sys/arch/hp300/dev/rbox.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: rbox.c,v 1.14 2006/08/11 18:33:13 miod Exp $  */
                      2:
                      3: /*
                      4:  * Copyright (c) 2005, Miodrag Vallat
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  * 1. Redistributions of source code must retain the above copyright
                     10:  *    notice, this list of conditions and the following disclaimer.
                     11:  * 2. Redistributions in binary form must reproduce the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer in the
                     13:  *    documentation and/or other materials provided with the distribution.
                     14:  *
                     15:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     16:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     17:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     18:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     19:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     20:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     21:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     22:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     23:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     24:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     25:  * POSSIBILITY OF SUCH DAMAGE.
                     26:  */
                     27: /*
                     28:  * Copyright (c) 1996 Jason R. Thorpe.  All rights reserved.
                     29:  * Copyright (c) 1988 University of Utah.
                     30:  * Copyright (c) 1990, 1993
                     31:  *     The Regents of the University of California.  All rights reserved.
                     32:  *
                     33:  * This code is derived from software contributed to Berkeley by
                     34:  * the Systems Programming Group of the University of Utah Computer
                     35:  * Science Department.
                     36:  *
                     37:  * Redistribution and use in source and binary forms, with or without
                     38:  * modification, are permitted provided that the following conditions
                     39:  * are met:
                     40:  * 1. Redistributions of source code must retain the above copyright
                     41:  *    notice, this list of conditions and the following disclaimer.
                     42:  * 2. Redistributions in binary form must reproduce the above copyright
                     43:  *    notice, this list of conditions and the following disclaimer in the
                     44:  *    documentation and/or other materials provided with the distribution.
                     45:  * 3. Neither the name of the University nor the names of its contributors
                     46:  *    may be used to endorse or promote products derived from this software
                     47:  *    without specific prior written permission.
                     48:  *
                     49:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     50:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     51:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     52:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     53:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     54:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     55:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     56:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     57:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     58:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     59:  * SUCH DAMAGE.
                     60:  *
                     61:  * from: Utah $Hdr: grf_rb.c 1.15 93/08/13$
                     62:  *
                     63:  *     @(#)grf_rb.c    8.4 (Berkeley) 1/12/94
                     64:  */
                     65:
                     66: /*
                     67:  * Graphics routines for the Renaissance, HP98720 Graphics system.
                     68:  */
                     69:
                     70: #include <sys/param.h>
                     71: #include <sys/systm.h>
                     72: #include <sys/conf.h>
                     73: #include <sys/device.h>
                     74: #include <sys/proc.h>
                     75: #include <sys/ioctl.h>
                     76:
                     77: #include <machine/autoconf.h>
                     78: #include <machine/bus.h>
                     79: #include <machine/cpu.h>
                     80:
                     81: #include <hp300/dev/dioreg.h>
                     82: #include <hp300/dev/diovar.h>
                     83: #include <hp300/dev/diodevs.h>
                     84: #include <hp300/dev/intiovar.h>
                     85:
                     86: #include <dev/wscons/wsconsio.h>
                     87: #include <dev/wscons/wsdisplayvar.h>
                     88: #include <dev/rasops/rasops.h>
                     89:
                     90: #include <hp300/dev/diofbreg.h>
                     91: #include <hp300/dev/diofbvar.h>
                     92: #include <hp300/dev/rboxreg.h>
                     93:
                     94: struct rbox_softc {
                     95:        struct device   sc_dev;
                     96:        struct diofb    *sc_fb;
                     97:        struct diofb    sc_fb_store;
                     98:        int             sc_scode;
                     99: };
                    100:
                    101: int    rbox_dio_match(struct device *, void *, void *);
                    102: void   rbox_dio_attach(struct device *, struct device *, void *);
                    103: int    rbox_intio_match(struct device *, void *, void *);
                    104: void   rbox_intio_attach(struct device *, struct device *, void *);
                    105:
                    106: struct cfattach rbox_dio_ca = {
                    107:        sizeof(struct rbox_softc), rbox_dio_match, rbox_dio_attach
                    108: };
                    109:
                    110: struct cfattach rbox_intio_ca = {
                    111:        sizeof(struct rbox_softc), rbox_intio_match, rbox_intio_attach
                    112: };
                    113:
                    114: struct cfdriver rbox_cd = {
                    115:        NULL, "rbox", DV_DULL
                    116: };
                    117:
                    118: int    rbox_reset(struct diofb *, int, struct diofbreg *);
                    119: void   rbox_restore(struct diofb *);
                    120: void   rbox_setcolor(struct diofb *, u_int,
                    121:            u_int8_t, u_int8_t, u_int8_t);
                    122: int    rbox_windowmove(struct diofb *, u_int16_t, u_int16_t, u_int16_t,
                    123:            u_int16_t, u_int16_t, u_int16_t, int16_t, int16_t);
                    124:
                    125: int    rbox_ioctl(void *, u_long, caddr_t, int, struct proc *);
                    126: void   rbox_burner(void *, u_int, u_int);
                    127:
                    128: struct wsdisplay_accessops     rbox_accessops = {
                    129:        rbox_ioctl,
                    130:        diofb_mmap,
                    131:        diofb_alloc_screen,
                    132:        diofb_free_screen,
                    133:        diofb_show_screen,
                    134:        NULL,   /* load_font */
                    135:        NULL,   /* scrollback */
                    136:        NULL,   /* getchar */
                    137:        rbox_burner
                    138: };
                    139:
                    140: /*
                    141:  * Attachment glue
                    142:  */
                    143:
                    144: int
                    145: rbox_intio_match(struct device *parent, void *match, void *aux)
                    146: {
                    147:        struct intio_attach_args *ia = aux;
                    148:        struct diofbreg *fbr;
                    149:
                    150:        fbr = (struct diofbreg *)IIOV(GRFIADDR);
                    151:
                    152:        if (badaddr((caddr_t)fbr))
                    153:                return (0);
                    154:
                    155:        if (fbr->id == GRFHWID && fbr->fbid == GID_RENAISSANCE) {
                    156:                ia->ia_addr = (caddr_t)GRFIADDR;
                    157:                return (1);
                    158:        }
                    159:
                    160:        return (0);
                    161: }
                    162:
                    163: void
                    164: rbox_intio_attach(struct device *parent, struct device *self, void *aux)
                    165: {
                    166:        struct rbox_softc *sc = (struct rbox_softc *)self;
                    167:        struct diofbreg *fbr;
                    168:
                    169:        fbr = (struct diofbreg *)IIOV(GRFIADDR);
                    170:        sc->sc_scode = CONSCODE_INTERNAL;
                    171:
                    172:        if (sc->sc_scode == conscode) {
                    173:                sc->sc_fb = &diofb_cn;
                    174:        } else {
                    175:                sc->sc_fb = &sc->sc_fb_store;
                    176:                rbox_reset(sc->sc_fb, sc->sc_scode, fbr);
                    177:        }
                    178:
                    179:        diofb_end_attach(sc, &rbox_accessops, sc->sc_fb,
                    180:            sc->sc_scode == conscode, NULL);
                    181: }
                    182:
                    183: int
                    184: rbox_dio_match(struct device *parent, void *match, void *aux)
                    185: {
                    186:        struct dio_attach_args *da = aux;
                    187:
                    188:        if (da->da_id == DIO_DEVICE_ID_FRAMEBUFFER &&
                    189:            da->da_secid == DIO_DEVICE_SECID_RENAISSANCE)
                    190:                return (1);
                    191:
                    192:        return (0);
                    193: }
                    194:
                    195: void
                    196: rbox_dio_attach(struct device *parent, struct device *self, void *aux)
                    197: {
                    198:        struct rbox_softc *sc = (struct rbox_softc *)self;
                    199:        struct dio_attach_args *da = aux;
                    200:        struct diofbreg *fbr;
                    201:
                    202:        sc->sc_scode = da->da_scode;
                    203:        if (sc->sc_scode == conscode) {
                    204:                fbr = (struct diofbreg *)conaddr;       /* already mapped */
                    205:                sc->sc_fb = &diofb_cn;
                    206:        } else {
                    207:                sc->sc_fb = &sc->sc_fb_store;
                    208:                fbr = (struct diofbreg *)
                    209:                    iomap(dio_scodetopa(sc->sc_scode), da->da_size);
                    210:                if (fbr == NULL ||
                    211:                    rbox_reset(sc->sc_fb, sc->sc_scode, fbr) != 0) {
                    212:                        printf(": can't map framebuffer\n");
                    213:                        return;
                    214:                }
                    215:        }
                    216:
                    217:        diofb_end_attach(sc, &rbox_accessops, sc->sc_fb,
                    218:            sc->sc_scode == conscode, NULL);
                    219: }
                    220:
                    221: /*
                    222:  * Initialize hardware and display routines.
                    223:  */
                    224: int
                    225: rbox_reset(struct diofb *fb, int scode, struct diofbreg *fbr)
                    226: {
                    227:        int rc;
                    228:
                    229:        if ((rc = diofb_fbinquire(fb, scode, fbr)) != 0)
                    230:                return (rc);
                    231:
                    232:        /*
                    233:         * Restrict the framebuffer to a monochrome view for now, until
                    234:         * I know better how to detect and frob overlay planes, and
                    235:         * setup a proper colormap. -- miod
                    236:         */
                    237:        fb->planes = fb->planemask = 1;
                    238:
                    239:        fb->bmv = rbox_windowmove;
                    240:        rbox_restore(fb);
                    241:        diofb_fbsetup(fb);
                    242:
                    243:        return (0);
                    244: }
                    245:
                    246: void
                    247: rbox_restore(struct diofb *fb)
                    248: {
                    249:        volatile struct rboxfb *rb = (struct rboxfb *)fb->regkva;
                    250:        u_int i;
                    251:
                    252:        rb_waitbusy(rb);
                    253:
                    254:        rb->regs.id = GRFHWID;          /* trigger reset */
                    255:        DELAY(1000);
                    256:
                    257:        rb->regs.interrupt = 0x04;
                    258:        rb->video_enable = 0x01;
                    259:        rb->drive = 0x01;
                    260:        rb->vdrive = 0x0;
                    261:
                    262:        rb->opwen = 0xFF;
                    263:
                    264:        /*
                    265:         * Clear color map
                    266:         */
                    267:        rb_waitbusy(fb->regkva);
                    268:        for (i = 0; i < 16; i++) {
                    269:                *(fb->regkva + 0x63c3 + i*4) = 0x0;
                    270:                *(fb->regkva + 0x6403 + i*4) = 0x0;
                    271:                *(fb->regkva + 0x6803 + i*4) = 0x0;
                    272:                *(fb->regkva + 0x6c03 + i*4) = 0x0;
                    273:                *(fb->regkva + 0x73c3 + i*4) = 0x0;
                    274:                *(fb->regkva + 0x7403 + i*4) = 0x0;
                    275:                *(fb->regkva + 0x7803 + i*4) = 0x0;
                    276:                *(fb->regkva + 0x7c03 + i*4) = 0x0;
                    277:        }
                    278:
                    279:        rb->rep_rule = RBOX_DUALROP(RR_COPY);
                    280:
                    281:        /*
                    282:         * I cannot figure out how to make the blink planes stop. So, we
                    283:         * must set both colormaps so that when the planes blink, and
                    284:         * the secondary colormap is active, we still get text.
                    285:         */
                    286:        CM1RED(fb)[0x00].value = 0x00;
                    287:        CM1GRN(fb)[0x00].value = 0x00;
                    288:        CM1BLU(fb)[0x00].value = 0x00;
                    289:        CM1RED(fb)[0x01].value = 0xFF;
                    290:        CM1GRN(fb)[0x01].value = 0xFF;
                    291:        CM1BLU(fb)[0x01].value = 0xFF;
                    292:
                    293:        CM2RED(fb)[0x00].value = 0x00;
                    294:        CM2GRN(fb)[0x00].value = 0x00;
                    295:        CM2BLU(fb)[0x00].value = 0x00;
                    296:        CM2RED(fb)[0x01].value = 0xFF;
                    297:        CM2GRN(fb)[0x01].value = 0xFF;
                    298:        CM2BLU(fb)[0x01].value = 0xFF;
                    299:
                    300:        rb->blink = 0x00;
                    301:        rb->write_enable = 0x01;
                    302:        rb->opwen = 0x00;
                    303:
                    304:        /* enable display */
                    305:        rb->display_enable = 0x01;
                    306: }
                    307:
                    308: int
                    309: rbox_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p)
                    310: {
                    311:        struct diofb *fb = v;
                    312:        struct wsdisplay_fbinfo *wdf;
                    313:
                    314:        switch (cmd) {
                    315:        case WSDISPLAYIO_GTYPE:
                    316:                *(u_int *)data = WSDISPLAY_TYPE_RBOX;
                    317:                break;
                    318:        case WSDISPLAYIO_SMODE:
                    319:                fb->mapmode = *(u_int *)data;
                    320:                if (fb->mapmode == WSDISPLAYIO_MODE_EMUL)
                    321:                        rbox_restore(fb);
                    322:                break;
                    323:        case WSDISPLAYIO_GINFO:
                    324:                wdf = (void *)data;
                    325:                wdf->width = fb->ri.ri_width;
                    326:                wdf->height = fb->ri.ri_height;
                    327:                wdf->depth = fb->ri.ri_depth;
                    328:                wdf->cmsize = 0;        /* XXX */
                    329:                break;
                    330:        case WSDISPLAYIO_LINEBYTES:
                    331:                *(u_int *)data = fb->ri.ri_stride;
                    332:                break;
                    333:        case WSDISPLAYIO_GETCMAP:
                    334:        case WSDISPLAYIO_PUTCMAP:
                    335:                break;          /* XXX until color support is implemented */
                    336:                break;
                    337:        case WSDISPLAYIO_GVIDEO:
                    338:        case WSDISPLAYIO_SVIDEO:
                    339:                break;
                    340:        default:
                    341:                return (-1);
                    342:        }
                    343:
                    344:        return (0);
                    345: }
                    346:
                    347: void
                    348: rbox_burner(void *v, u_int on, u_int flags)
                    349: {
                    350:        struct diofb *fb = v;
                    351:        volatile struct rboxfb *rb = (struct rboxfb *)fb->regkva;
                    352:
                    353:        if (on) {
                    354:                rb->display_enable = 0x01;
                    355:        } else {
                    356:                rb->display_enable = 0x00;
                    357:        }
                    358: }
                    359:
                    360: int
                    361: rbox_windowmove(struct diofb *fb, u_int16_t sx, u_int16_t sy,
                    362:     u_int16_t dx, u_int16_t dy, u_int16_t cx, u_int16_t cy, int16_t rop,
                    363:     int16_t planemask)
                    364: {
                    365:        volatile struct rboxfb *rb = (struct rboxfb *)fb->regkva;
                    366:
                    367:        if (planemask != 0xff)
                    368:                return (EINVAL);
                    369:
                    370:        rb_waitbusy(rb);
                    371:
                    372:        rb->rep_rule = RBOX_DUALROP(rop);
                    373:        rb->source_y = sy;
                    374:        rb->source_x = sx;
                    375:        rb->dest_y = dy;
                    376:        rb->dest_x = dx;
                    377:        rb->wheight = cy;
                    378:        rb->wwidth  = cx;
                    379:        rb->wmove = 1;
                    380:
                    381:        rb_waitbusy(rb);
                    382:
                    383:        return (0);
                    384: }
                    385:
                    386: /*
                    387:  * Renaissance console support
                    388:  */
                    389:
                    390: void
                    391: rboxcninit()
                    392: {
                    393:        rbox_reset(&diofb_cn, conscode, (struct diofbreg *)conaddr);
                    394:        diofb_cnattach(&diofb_cn);
                    395: }

CVSweb