[BACK]Return to cfb.c CVS log [TXT][DIR] Up to [local] / sys / arch / alpha / tc

Annotation of sys/arch/alpha/tc/cfb.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: cfb.c,v 1.18 2006/11/29 12:13:51 miod Exp $   */
                      2: /*     $NetBSD: cfb.c,v 1.7 1996/12/05 01:39:39 cgd Exp $      */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995, 1996 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Chris G. Demetriou
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31: #include <sys/param.h>
                     32: #include <sys/systm.h>
                     33: #include <sys/kernel.h>
                     34: #include <sys/device.h>
                     35: #include <sys/malloc.h>
                     36: #include <sys/buf.h>
                     37: #include <sys/conf.h>
                     38: #include <sys/ioctl.h>
                     39:
                     40: #include <uvm/uvm_extern.h>
                     41:
                     42: #include <machine/bus.h>
                     43: #include <machine/intr.h>
                     44:
                     45: #include <dev/tc/tcvar.h>
                     46: #include <machine/cfbreg.h>
                     47: #include <alpha/tc/cfbvar.h>
                     48:
                     49: #include <dev/rcons/raster.h>
                     50: #include <dev/wscons/wscons_raster.h>
                     51: #include <dev/wscons/wsdisplayvar.h>
                     52: #include <machine/fbio.h>
                     53:
                     54: #include <machine/autoconf.h>
                     55: #include <machine/pte.h>
                     56:
                     57: int    cfbmatch(struct device *, void *, void *);
                     58: void   cfbattach(struct device *, struct device *, void *);
                     59:
                     60: struct cfattach cfb_ca = {
                     61:        sizeof(struct cfb_softc), cfbmatch, cfbattach,
                     62: };
                     63:
                     64: struct cfdriver cfb_cd = {
                     65:        NULL, "cfb", DV_DULL,
                     66: };
                     67:
                     68: void   cfb_getdevconfig(tc_addr_t dense_addr, struct cfb_devconfig *dc);
                     69: struct cfb_devconfig cfb_console_dc;
                     70: tc_addr_t cfb_consaddr;
                     71:
                     72: struct wsdisplay_emulops cfb_emulfuncs = {
                     73:        rcons_cursor,                   /* could use hardware cursor; punt */
                     74:        rcons_mapchar,
                     75:        rcons_putchar,
                     76:        rcons_copycols,
                     77:        rcons_erasecols,
                     78:        rcons_copyrows,
                     79:        rcons_eraserows,
                     80:        rcons_alloc_attr
                     81: };
                     82:
                     83: struct wsscreen_descr cfb_stdscreen = {
                     84:         "std",
                     85:         0, 0,        /* will be filled in -- XXX shouldn't, it's global */
                     86:         &cfb_emulfuncs,
                     87:         0, 0
                     88: };
                     89:
                     90: const struct wsscreen_descr *_cfb_scrlist[] = {
                     91:         &cfb_stdscreen,
                     92:         /* XXX other formats, graphics screen? */
                     93: };
                     94:
                     95: struct wsscreen_list cfb_screenlist = {
                     96:         sizeof(_cfb_scrlist) / sizeof(struct wsscreen_descr *), _cfb_scrlist
                     97: };
                     98:
                     99: int    cfbioctl(void *, u_long, caddr_t, int, struct proc *);
                    100: paddr_t        cfbmmap(void *, off_t, int);
                    101:
                    102: int    cfbintr(void *);
                    103: static int      cfb_alloc_screen(void *, const struct wsscreen_descr *,
                    104:                    void **, int *, int *, long *);
                    105: static void     cfb_free_screen(void *, void *);
                    106: static int      cfb_show_screen(void *, void *, int,
                    107:                    void (*) (void *, int, int), void *);
                    108:
                    109: struct wsdisplay_accessops cfb_accessops = {
                    110:        cfbioctl,
                    111:        cfbmmap,
                    112:        cfb_alloc_screen,
                    113:        cfb_free_screen,
                    114:        cfb_show_screen,
                    115: };
                    116:
                    117: int
                    118: cfbmatch(parent, match, aux)
                    119:        struct device *parent;
                    120:        void *match;
                    121:        void *aux;
                    122: {
                    123:        struct tc_attach_args *ta = aux;
                    124:
                    125:        if (strncmp("PMAG-BA ", ta->ta_modname, TC_ROM_LLEN) != 0)
                    126:                return (0);
                    127:
                    128:        return (10);
                    129: }
                    130:
                    131: void
                    132: cfb_getdevconfig(dense_addr, dc)
                    133:        tc_addr_t dense_addr;
                    134:        struct cfb_devconfig *dc;
                    135: {
                    136:        struct raster *rap;
                    137:        struct rcons *rcp;
                    138:        char *ramdacregp;
                    139:        int i;
                    140:
                    141:        dc->dc_vaddr = dense_addr;
                    142:        dc->dc_paddr = ALPHA_K0SEG_TO_PHYS(dc->dc_vaddr);       /* XXX */
                    143:        dc->dc_size = CFB_SIZE;
                    144:
                    145:        ramdacregp = (char *)dc->dc_vaddr + CFB_RAMDAC_OFFSET;
                    146:
                    147:        dc->dc_wid = 1024;
                    148:        dc->dc_ht = 864;
                    149:        dc->dc_depth = 8;                       /* 8 plane */
                    150:        dc->dc_rowbytes = dc->dc_wid * (dc->dc_depth / 8);
                    151:
                    152:        dc->dc_videobase = dc->dc_vaddr + CFB_FB_OFFSET;
                    153:
                    154:        /* Initialize the RAMDAC/colormap */
                    155:        /* start XXX XXX XXX */
                    156:        (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_ADDRLOW)) = 0;
                    157:        (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_ADDRHIGH)) = 0;
                    158:        tc_wmb();
                    159:        for (i = 0; i < 256; i++) {
                    160:                (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_CMAPDATA)) =
                    161:                    i ? 0xff : 0;
                    162:                tc_wmb();
                    163:                (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_CMAPDATA)) =
                    164:                    i ? 0xff : 0;
                    165:                tc_wmb();
                    166:                (*(volatile u_int32_t *)(ramdacregp + CFB_RAMDAC_CMAPDATA)) =
                    167:                    i ? 0xff : 0;
                    168:                tc_wmb();
                    169:        }
                    170:        /* end XXX XXX XXX */
                    171:
                    172:        /* clear the screen */
                    173:        for (i = 0; i < dc->dc_ht * dc->dc_rowbytes; i += sizeof(u_int32_t))
                    174:                *(u_int32_t *)(dc->dc_videobase + i) = 0x00000000;
                    175:
                    176:        rap = &dc->dc_raster;
                    177:        rap->width = dc->dc_wid;
                    178:        rap->height = dc->dc_ht;
                    179:        rap->depth = 8;
                    180:        rap->linelongs = dc->dc_rowbytes / sizeof(u_int32_t);
                    181:        rap->pixels = (u_int32_t *)dc->dc_videobase;
                    182:
                    183:        /* initialize the raster console blitter */
                    184:        rcp = &dc->dc_rcons;
                    185:        rcp->rc_sp = rap;
                    186:        rcp->rc_crow = rcp->rc_ccol = -1;
                    187:        rcp->rc_crowp = &rcp->rc_crow;
                    188:        rcp->rc_ccolp = &rcp->rc_ccol;
                    189:        rcons_init(rcp, 34, 80);
                    190:
                    191:        cfb_stdscreen.nrows = dc->dc_rcons.rc_maxrow;
                    192:        cfb_stdscreen.ncols = dc->dc_rcons.rc_maxcol;
                    193: }
                    194:
                    195: void
                    196: cfbattach(parent, self, aux)
                    197:        struct device *parent, *self;
                    198:        void *aux;
                    199: {
                    200:        struct cfb_softc *sc = (struct cfb_softc *)self;
                    201:        struct tc_attach_args *ta = aux;
                    202:        struct wsemuldisplaydev_attach_args waa;
                    203:        int console;
                    204:
                    205:        console = (ta->ta_addr == cfb_consaddr);
                    206:        if (console) {
                    207:                sc->sc_dc = &cfb_console_dc;
                    208:                sc->nscreens = 1;
                    209:        } else {
                    210:                sc->sc_dc = (struct cfb_devconfig *)
                    211:                    malloc(sizeof(struct cfb_devconfig), M_DEVBUF, M_WAITOK);
                    212:                cfb_getdevconfig(ta->ta_addr, sc->sc_dc);
                    213:        }
                    214:        if (sc->sc_dc->dc_vaddr == NULL) {
                    215:                printf(": couldn't map memory space; punt!\n");
                    216:                return;
                    217:        }
                    218:        printf(": %d x %d, %dbpp\n", sc->sc_dc->dc_wid, sc->sc_dc->dc_ht,
                    219:            sc->sc_dc->dc_depth);
                    220:
                    221:        /* Establish an interrupt handler, and clear any pending interrupts */
                    222:         tc_intr_establish(parent, ta->ta_cookie, TC_IPL_TTY, cfbintr, sc);
                    223:        *(volatile u_int32_t *)(sc->sc_dc->dc_vaddr + CFB_IREQCTRL_OFFSET) = 0;
                    224:
                    225:        /* initialize the raster */
                    226:        waa.console = console;
                    227:        waa.scrdata = &cfb_screenlist;
                    228:        waa.accessops = &cfb_accessops;
                    229:        waa.accesscookie = sc;
                    230:        waa.defaultscreens = 0;
                    231:
                    232:        config_found(self, &waa, wsemuldisplaydevprint);
                    233: }
                    234:
                    235: int
                    236: cfbioctl(v, cmd, data, flag, p)
                    237:        void *v;
                    238:        u_long cmd;
                    239:        caddr_t data;
                    240:        int flag;
                    241:        struct proc *p;
                    242: {
                    243:        struct cfb_softc *sc = v;
                    244:        struct cfb_devconfig *dc = sc->sc_dc;
                    245:
                    246:        switch (cmd) {
                    247:        case FBIOGTYPE:
                    248: #define fbt ((struct fbtype *)data)
                    249:                fbt->fb_type = FBTYPE_CFB;
                    250:                fbt->fb_height = sc->sc_dc->dc_ht;
                    251:                fbt->fb_width = sc->sc_dc->dc_wid;
                    252:                fbt->fb_depth = sc->sc_dc->dc_depth;
                    253:                fbt->fb_cmsize = 256;           /* XXX ??? */
                    254:                fbt->fb_size = sc->sc_dc->dc_size;
                    255: #undef fbt
                    256:                return (0);
                    257:
                    258: #if 0
                    259:        case FBIOPUTCMAP:
                    260:                return (*tgar->tgar_set_cmap)(dc, (struct fbcmap *)data);
                    261:
                    262:        case FBIOGETCMAP:
                    263:                return (*tgar->tgar_get_cmap)(dc, (struct fbcmap *)data);
                    264: #endif
                    265:
                    266:        case FBIOGATTR:
                    267:                return (ENOTTY);                        /* XXX ? */
                    268:
                    269: #if 0
                    270:        case FBIOSVIDEO:
                    271:                if (*(int *)data == FBVIDEO_OFF)
                    272:                        cfb_blank(sc->sc_dc);
                    273:                else
                    274:                        cfb_unblank(sc->sc_dc);
                    275:                return (0);
                    276: #endif
                    277:
                    278:        case FBIOGVIDEO:
                    279:                *(int *)data = dc->dc_blanked ? FBVIDEO_OFF : FBVIDEO_ON;
                    280:                return (0);
                    281:
                    282: #if 0
                    283:        case FBIOSCURSOR:
                    284:                return (*tgar->tgar_set_cursor)(dc, (struct fbcursor *)data);
                    285:
                    286:        case FBIOGCURSOR:
                    287:                return (*tgar->tgar_get_cursor)(dc, (struct fbcursor *)data);
                    288:
                    289:        case FBIOSCURPOS:
                    290:                return (*tgar->tgar_set_curpos)(dc, (struct fbcurpos *)data);
                    291:
                    292:        case FBIOGCURPOS:
                    293:                return (*tgar->tgar_get_curpos)(dc, (struct fbcurpos *)data);
                    294:
                    295:        case FBIOGCURMAX:
                    296:                return (*tgar->tgar_get_curmax)(dc, (struct fbcurpos *)data);
                    297: #endif
                    298:        }
                    299:        return (-1);
                    300: }
                    301:
                    302: paddr_t
                    303: cfbmmap(v, offset, prot)
                    304:        void *v;
                    305:        off_t offset;
                    306:        int prot;
                    307: {
                    308:        struct cfb_softc *sc = v;
                    309:
                    310:        if (offset > CFB_SIZE)
                    311:                return (-1);
                    312:        return atop(sc->sc_dc->dc_paddr + offset);
                    313: }
                    314:
                    315: int
                    316: cfbintr(v)
                    317:        void *v;
                    318: {
                    319:        struct cfb_softc *sc = v;
                    320:
                    321:        *(volatile u_int32_t *)(sc->sc_dc->dc_vaddr + CFB_IREQCTRL_OFFSET) = 0;
                    322:
                    323:        return (1);
                    324: }
                    325:
                    326: int
                    327: cfb_alloc_screen(v, type, cookiep, curxp, curyp, attrp)
                    328:        void *v;
                    329:        const struct wsscreen_descr *type;
                    330:        void **cookiep;
                    331:        int *curxp, *curyp;
                    332:        long *attrp;
                    333: {
                    334:        struct cfb_softc *sc = v;
                    335:        long defattr;
                    336:
                    337:        if (sc->nscreens > 0)
                    338:                return (ENOMEM);
                    339:
                    340:        *cookiep = &sc->sc_dc->dc_rcons; /* one and only for now */
                    341:        *curxp = 0;
                    342:        *curyp = 0;
                    343:        rcons_alloc_attr(&sc->sc_dc->dc_rcons, 0, 0, 0, &defattr);
                    344:        *attrp = defattr;
                    345:        sc->nscreens++;
                    346:        return(0);
                    347: }
                    348:
                    349: void
                    350: cfb_free_screen(v, cookie)
                    351:        void *v;
                    352:        void *cookie;
                    353: {
                    354:        struct cfb_softc *sc = v;
                    355:
                    356:        if (sc->sc_dc == &cfb_console_dc)
                    357:                panic("cfb_free_screen: console");
                    358:
                    359:        sc->nscreens--;
                    360: }
                    361:
                    362: int
                    363: cfb_show_screen(v, cookie, waitok, cb, cbarg)
                    364:        void *v;
                    365:        void *cookie;
                    366:        int waitok;
                    367:        void (*cb)(void *, int, int);
                    368:        void *cbarg;
                    369: {
                    370:        return (0);
                    371: }
                    372:
                    373: #if 0
                    374: int
                    375: cfb_cnattach(addr)
                    376:        tc_addr_t addr;
                    377: {
                    378:        struct cfb_devconfig *dc = &cfb_console_dc;
                    379:        long defattr;
                    380:
                    381:        cfb_getdevconfig(addr, dcp);
                    382:
                    383:        rcons_alloc_attr(&dcp->dc_rcons, 0, 0, 0, &defattr);
                    384:
                    385:        wsdisplay_cnattach(&cfb_stdscreen, &dcp->dc_rcons,
                    386:                0,0, defattr;);
                    387:
                    388:        cfb_consaddr = addr;
                    389:        return (0);
                    390: }
                    391: #endif

CVSweb