[BACK]Return to ite_sti.c CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / stand / common

Annotation of sys/arch/hp300/stand/common/ite_sti.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: ite_sti.c,v 1.1 2006/08/17 06:31:10 miod Exp $        */
                      2: /*
                      3:  * Copyright (c) 2006, Miodrag Vallat
                      4:  * Copyright (c) 2000-2003 Michael Shalayeff
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     17:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     18:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     19:  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
                     20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     22:  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
                     25:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
                     26:  * THE POSSIBILITY OF SUCH DAMAGE.
                     27:  */
                     28:
                     29: #ifdef ITECONSOLE
                     30: #include <sys/param.h>
                     31:
                     32: #include <lib/libsa/stand.h>
                     33:
                     34: #include "samachdep.h"
                     35: #include "consdefs.h"
                     36: #include "itevar.h"
                     37:
                     38: #include <hp300/dev/sgcreg.h>
                     39: #include <dev/ic/stireg.h>
                     40:
                     41: /*
                     42:  * sti-specific data not available in the ite_data structure.
                     43:  * Since we will only configure one sti display, it is ok to use a global.
                     44:  */
                     45: static struct {
                     46:        u_int32_t       codeptr[STI_CODECNT];
                     47:        u_int8_t        *code;
                     48:        u_int32_t       fontbase;
                     49:        u_int           firstchar, lastchar;
                     50:        struct sti_cfg  cfg;
                     51:        struct sti_ecfg ecfg;
                     52: } sti;
                     53:
                     54: #define parseshort1(addr, ofs) \
                     55:        (((addr)[(ofs) +  3] << 8) | ((addr)[(ofs) +  7]))
                     56: #define parseword1(addr, ofs) \
                     57:        (((addr)[(ofs) +  3] << 24) | ((addr)[(ofs) +  7] << 16) | \
                     58:         ((addr)[(ofs) + 11] <<  8) | ((addr)[(ofs) + 15]))
                     59:
                     60: void   sti_do_cursor(struct ite_data *);
                     61: void   sti_fontinfo(struct ite_data *);
                     62: void   sti_init(int);
                     63: void   sti_inqcfg(struct sti_inqconfout *);
                     64:
                     65: /*
                     66:  * Initialize the sti device for ite's needs.
                     67:  * We don't bother to check for failures since
                     68:  * - we are in tight space already
                     69:  * - since romputchar() does not work with sti devices, there is no way we
                     70:  *   can report errors (although we could switch to serial...)
                     71:  */
                     72: void
                     73: sti_iteinit(struct ite_data *ip)
                     74: {
                     75:        int slotno, i;
                     76:        size_t codesize, memsize;
                     77:        u_int8_t *va, *code;
                     78:        u_int addr, eaddr, reglist, tmp;
                     79:        struct sti_inqconfout cfg;
                     80:        struct sti_einqconfout ecfg;
                     81:
                     82:        bzero(&sti, sizeof sti);
                     83:        slotno = (int)ip->fbbase;
                     84:        ip->fbbase = va = (u_int8_t *)IIOV(SGC_BASE + (slotno * SGC_DEVSIZE));
                     85:
                     86:        /*
                     87:         * Read the microcode.
                     88:         */
                     89:
                     90:        for (i = 0; i < STI_CODECNT; i++)
                     91:                sti.codeptr[i] =
                     92:                    parseword1(va, (STI_CODEBASE_M68K << 2) + i * 0x10);
                     93:
                     94:        for (i = STI_END; sti.codeptr[i] == 0; i--);
                     95:        codesize = sti.codeptr[i] - sti.codeptr[STI_BEGIN];
                     96:        codesize = (codesize + 3) / 4;
                     97:
                     98:        sti.code = (u_int8_t *)alloc(codesize);
                     99:        code = sti.code;
                    100:        addr = (u_int)va + sti.codeptr[STI_BEGIN];
                    101:        eaddr = addr + codesize * 4;
                    102:        for (; addr < eaddr; addr += 4)
                    103:                *code++ = *(u_int8_t *)addr;
                    104:
                    105:        for (i = STI_CODECNT - 1; i != 0; i--)
                    106:                if (sti.codeptr[i] != 0) {
                    107:                        sti.codeptr[i] -= sti.codeptr[0];
                    108:                        sti.codeptr[i] /= 4;
                    109:                }
                    110:
                    111:        sti.codeptr[0] = 0;
                    112:        for (i = STI_END; sti.codeptr[i] == 0; i--);
                    113:        sti.codeptr[i] = 0;
                    114:
                    115:        /*
                    116:         * Read the regions list.
                    117:         */
                    118:
                    119:        reglist = parseword1(va, 0x60);
                    120:        for (i = 0; i < STI_REGION_MAX; i++) {
                    121:                tmp = parseword1(va, (reglist & ~3) + i * 0x10);
                    122:                sti.cfg.regions[i] = (u_int)va + ((tmp >> 18) << 12);
                    123:                if (tmp & 0x4000)
                    124:                        break;
                    125:        }
                    126:
                    127:        /*
                    128:         * Allocate scratch memory for the microcode if it needs it.
                    129:         */
                    130:
                    131:        sti.cfg.ext_cfg = &sti.ecfg;
                    132:        memsize = parseword1(va, 0xa0);
                    133:        if (memsize != 0)
                    134:                sti.ecfg.addr = alloc(memsize);
                    135:
                    136:        /*
                    137:         * Initialize the display, and get geometry information.
                    138:         */
                    139:
                    140:        sti_init(0);
                    141:
                    142:        bzero(&cfg, sizeof cfg);
                    143:        bzero(&ecfg, sizeof ecfg);
                    144:        cfg.ext = &ecfg;
                    145:        sti_inqcfg(&cfg);
                    146:
                    147:        if (cfg.owidth == cfg.width && cfg.oheight == cfg.height) {
                    148:                sti.cfg.oscr_width = cfg.owidth = cfg.fbwidth - cfg.width;
                    149:                sti.cfg.oscr_height = cfg.oheight = cfg.fbheight - cfg.height;
                    150:        }
                    151:
                    152:        ip->dheight = cfg.height;
                    153:        ip->dwidth = cfg.width;
                    154:        ip->fbheight = cfg.fbheight;
                    155:        ip->fbwidth = cfg.fbwidth;
                    156:
                    157:        /*
                    158:         * Get ready for ite operation!
                    159:         */
                    160:
                    161:        sti_init(1);
                    162:        sti_fontinfo(ip);
                    163:        sti_clear(ip, 0, 0, ip->rows, ip->cols);        /* necessary? */
                    164: }
                    165:
                    166: void
                    167: sti_putc(struct ite_data *ip, int c, int dy, int dx)
                    168: {
                    169:        sti_unpmv_t unpmv;
                    170:        struct {
                    171:                struct sti_unpmvflags flags;
                    172:                struct sti_unpmvin in;
                    173:                struct sti_unpmvout out;
                    174:        } a;
                    175:
                    176:        bzero(&a, sizeof a);
                    177:        a.flags.flags = STI_UNPMVF_WAIT;
                    178:        a.in.bg_colour = STI_COLOUR_BLACK;
                    179:        a.in.fg_colour = STI_COLOUR_WHITE;
                    180:        a.in.x = dx * ip->ftwidth;
                    181:        a.in.y = dy * ip->ftheight;
                    182:        a.in.font_addr = (u_int32_t *)(ip->fbbase + sti.fontbase);
                    183:        a.in.index = c;
                    184:
                    185:        unpmv = (sti_unpmv_t)(sti.code + sti.codeptr[STI_FONT_UNPMV]);
                    186:        (*unpmv)(&a.flags, &a.in, &a.out, &sti.cfg);
                    187: }
                    188:
                    189: void
                    190: sti_cursor(struct ite_data *ip, int flag)
                    191: {
                    192:        switch (flag) {
                    193:        case MOVE_CURSOR:
                    194:                sti_do_cursor(ip);
                    195:                /* FALLTHROUGH */
                    196:        case DRAW_CURSOR:
                    197:                ip->cursorx = ip->curx;
                    198:                ip->cursory = ip->cury;
                    199:                /* FALLTHROUGH */
                    200:        default:
                    201:                sti_do_cursor(ip);
                    202:                break;
                    203:        }
                    204: }
                    205:
                    206: void
                    207: sti_do_cursor(struct ite_data *ip)
                    208: {
                    209:        sti_blkmv_t blkmv;
                    210:        struct {
                    211:                struct sti_blkmvflags flags;
                    212:                struct sti_blkmvin in;
                    213:                struct sti_blkmvout out;
                    214:        } a;
                    215:
                    216:        bzero(&a, sizeof a);
                    217:        a.flags.flags = STI_BLKMVF_WAIT | STI_BLKMVF_COLR;
                    218:        a.in.fg_colour = STI_COLOUR_BLACK;
                    219:        a.in.bg_colour = STI_COLOUR_WHITE;
                    220:        a.in.dstx = a.in.srcx = ip->cursorx * ip->ftwidth;
                    221:        a.in.dsty = a.in.srcy = ip->cursory * ip->ftheight;
                    222:        a.in.width = ip->ftwidth;
                    223:        a.in.height = ip->ftheight;
                    224:
                    225:        blkmv = (sti_blkmv_t)(sti.code + sti.codeptr[STI_BLOCK_MOVE]);
                    226:        (*blkmv)(&a.flags, &a.in, &a.out, &sti.cfg);
                    227: }
                    228:
                    229: void
                    230: sti_clear(struct ite_data *ip, int sy, int sx, int h, int w)
                    231: {
                    232:        sti_blkmv_t blkmv;
                    233:        struct {
                    234:                struct sti_blkmvflags flags;
                    235:                struct sti_blkmvin in;
                    236:                struct sti_blkmvout out;
                    237:        } a;
                    238:
                    239:        bzero(&a, sizeof a);
                    240:        a.flags.flags = STI_BLKMVF_WAIT | STI_BLKMVF_CLR;
                    241:        a.in.bg_colour = STI_COLOUR_BLACK;
                    242:        a.in.dstx = a.in.srcx = sx * ip->ftwidth;
                    243:        a.in.dsty = a.in.srcy = sy * ip->ftheight;
                    244:        a.in.width = w * ip->ftwidth;
                    245:        a.in.height = h * ip->ftheight;
                    246:
                    247:        blkmv = (sti_blkmv_t)(sti.code + sti.codeptr[STI_BLOCK_MOVE]);
                    248:        (*blkmv)(&a.flags, &a.in, &a.out, &sti.cfg);
                    249: }
                    250:
                    251: void
                    252: sti_scroll(struct ite_data *ip)
                    253: {
                    254:        sti_blkmv_t blkmv;
                    255:        struct {
                    256:                struct sti_blkmvflags flags;
                    257:                struct sti_blkmvin in;
                    258:                struct sti_blkmvout out;
                    259:        } a;
                    260:
                    261:        bzero(&a, sizeof a);
                    262:        a.flags.flags = STI_BLKMVF_WAIT;
                    263:        a.in.bg_colour = STI_COLOUR_BLACK;
                    264:        a.in.fg_colour = STI_COLOUR_WHITE;
                    265:        a.in.dstx = a.in.srcx = 0;
                    266:        a.in.dsty = 0;
                    267:        a.in.srcy = ip->ftheight;
                    268:        a.in.width = ip->dwidth;
                    269:        a.in.height = (ip->rows - 1) * ip->ftheight;
                    270:
                    271:        blkmv = (sti_blkmv_t)(sti.code + sti.codeptr[STI_BLOCK_MOVE]);
                    272:        (*blkmv)(&a.flags, &a.in, &a.out, &sti.cfg);
                    273: }
                    274:
                    275: void
                    276: sti_fontinfo(struct ite_data *ip)
                    277: {
                    278:        u_int32_t fontbase;
                    279:
                    280:        fontbase = sti.fontbase = parseword1((u_int8_t *)ip->fbbase, 0x30) & ~3;
                    281:        ip->ftwidth = (u_int8_t)ip->fbbase[fontbase + 0x13];
                    282:        ip->ftheight = (u_int8_t)ip->fbbase[fontbase + 0x17];
                    283:        ip->rows = ip->dheight / ip->ftheight;
                    284:        ip->cols = ip->dwidth / ip->ftwidth;
                    285: }
                    286:
                    287: void
                    288: sti_init(int full)
                    289: {
                    290:        sti_init_t init;
                    291:        struct {
                    292:                struct sti_initflags flags;
                    293:                struct sti_initin in;
                    294:                struct sti_initout out;
                    295:        } a;
                    296:
                    297:        bzero(&a, sizeof a);
                    298:        a.flags.flags = STI_INITF_WAIT | STI_INITF_CMB | STI_INITF_EBET;
                    299:        if (full)
                    300:                a.flags.flags |= STI_INITF_TEXT | STI_INITF_PBET |
                    301:                    STI_INITF_PBETI | STI_INITF_ICMT;
                    302:        a.in.text_planes = 1;
                    303:
                    304:        init = (sti_init_t)(sti.code + sti.codeptr[STI_INIT_GRAPH]);
                    305:        (*init)(&a.flags, &a.in, &a.out, &sti.cfg);
                    306: }
                    307:
                    308: void
                    309: sti_inqcfg(struct sti_inqconfout *ico)
                    310: {
                    311:        sti_inqconf_t inqconf;
                    312:        struct {
                    313:                struct sti_inqconfflags flags;
                    314:                struct sti_inqconfin in;
                    315:        } a;
                    316:
                    317:        bzero(&a, sizeof a);
                    318:        a.flags.flags = STI_INQCONFF_WAIT;
                    319:
                    320:        inqconf = (sti_inqconf_t)(sti.code + sti.codeptr[STI_INQ_CONF]);
                    321:        (*inqconf)(&a.flags, &a.in, ico, &sti.cfg);
                    322: }
                    323:
                    324: #endif

CVSweb