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

Annotation of sys/arch/sparc64/dev/fb.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: fb.c,v 1.16 2006/12/03 16:41:58 miod Exp $    */
                      2: /*     $NetBSD: fb.c,v 1.23 1997/07/07 23:30:22 pk Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 2002, 2004  Miodrag Vallat.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  *
                     17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     19:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
                     20:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
                     21:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     22:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     23:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
                     25:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
                     26:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     27:  * POSSIBILITY OF SUCH DAMAGE.
                     28:  *
                     29:  *
                     30:  * Copyright (c) 1992, 1993
                     31:  *     The Regents of the University of California.  All rights reserved.
                     32:  *
                     33:  * This software was developed by the Computer Systems Engineering group
                     34:  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
                     35:  * contributed to Berkeley.
                     36:  *
                     37:  * All advertising materials mentioning features or use of this software
                     38:  * must display the following acknowledgement:
                     39:  *     This product includes software developed by the University of
                     40:  *     California, Lawrence Berkeley Laboratory.
                     41:  *
                     42:  * Redistribution and use in source and binary forms, with or without
                     43:  * modification, are permitted provided that the following conditions
                     44:  * are met:
                     45:  * 1. Redistributions of source code must retain the above copyright
                     46:  *    notice, this list of conditions and the following disclaimer.
                     47:  * 2. Redistributions in binary form must reproduce the above copyright
                     48:  *    notice, this list of conditions and the following disclaimer in the
                     49:  *    documentation and/or other materials provided with the distribution.
                     50:  * 3. Neither the name of the University nor the names of its contributors
                     51:  *    may be used to endorse or promote products derived from this software
                     52:  *    without specific prior written permission.
                     53:  *
                     54:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
                     55:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     56:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     57:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
                     58:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     59:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     60:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     61:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     62:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     63:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     64:  * SUCH DAMAGE.
                     65:  *
                     66:  *     @(#)fb.c        8.1 (Berkeley) 6/11/93
                     67:  */
                     68:
                     69: /*
                     70:  * Common wsdisplay framebuffer drivers helpers.
                     71:  */
                     72:
                     73: #include <sys/param.h>
                     74: #include <sys/systm.h>
                     75: #include <sys/device.h>
                     76: #include <sys/proc.h>
                     77: #include <sys/conf.h>
                     78:
                     79: #include <machine/autoconf.h>
                     80: #include <machine/conf.h>
                     81:
                     82: #include <dev/wscons/wsdisplayvar.h>
                     83: #include <dev/rasops/rasops.h>
                     84: #include <machine/fbvar.h>
                     85:
                     86: #include "wsdisplay.h"
                     87:
                     88: /*
                     89:  * Sun specific color indexes.
                     90:  * Black is not really 7, but rather ~0; to fit within the 8 ANSI color
                     91:  * palette we are using on console, we pick (~0) & 0x07 instead.
                     92:  * This essentially swaps WSCOL_BLACK and WSCOL_WHITE.
                     93:  */
                     94: #define        WSCOL_SUN_WHITE         0
                     95: #define        WSCOL_SUN_BLACK         7
                     96:
                     97: /*
                     98:  * emergency unblank code
                     99:  * XXX should be somewhat moved to wscons MI code
                    100:  */
                    101:
                    102: void (*fb_burner)(void *, u_int, u_int);
                    103: void *fb_cookie;
                    104:
                    105: void
                    106: fb_unblank()
                    107: {
                    108:        if (fb_burner != NULL)
                    109:                (*fb_burner)(fb_cookie, 1, 0);
                    110: }
                    111:
                    112: #if NWSDISPLAY > 0
                    113:
                    114: static int a2int(char *, int);
                    115: static void fb_initwsd(struct sunfb *);
                    116: static void fb_updatecursor(struct rasops_info *);
                    117:
                    118: void
                    119: fb_setsize(struct sunfb *sf, int def_depth, int def_width, int def_height,
                    120:     int node, int unused)
                    121: {
                    122:        int def_linebytes;
                    123:
                    124:        sf->sf_depth = getpropint(node, "depth", def_depth);
                    125:        sf->sf_width = getpropint(node, "width", def_width);
                    126:        sf->sf_height = getpropint(node, "height", def_height);
                    127:
                    128:        def_linebytes =
                    129:            roundup(sf->sf_width, sf->sf_depth) * sf->sf_depth / 8;
                    130:        sf->sf_linebytes = getpropint(node, "linebytes", def_linebytes);
                    131:        /*
                    132:         * XXX If we are configuring a board in a wider depth level
                    133:         * than the mode it is currently operating in, the PROM will
                    134:         * return a linebytes property tied to the current depth value,
                    135:         * which is NOT what we are relying upon!
                    136:         */
                    137:        if (sf->sf_linebytes < (sf->sf_width * sf->sf_depth) / 8) {
                    138:                sf->sf_linebytes = def_linebytes;
                    139:        }
                    140:
                    141:        sf->sf_fbsize = sf->sf_height * sf->sf_linebytes;
                    142: }
                    143:
                    144: static int
                    145: a2int(char *cp, int deflt)
                    146: {
                    147:        int i = 0;
                    148:
                    149:        if (*cp == '\0')
                    150:                return (deflt);
                    151:        while (*cp != '\0')
                    152:                i = i * 10 + *cp++ - '0';
                    153:        return (i);
                    154: }
                    155:
                    156: /* setup the embedded wsscreen_descr structure from rasops settings */
                    157: static void
                    158: fb_initwsd(struct sunfb *sf)
                    159: {
                    160:        strlcpy(sf->sf_wsd.name, "std", sizeof(sf->sf_wsd.name));
                    161:        sf->sf_wsd.capabilities = sf->sf_ro.ri_caps;
                    162:        sf->sf_wsd.nrows = sf->sf_ro.ri_rows;
                    163:        sf->sf_wsd.ncols = sf->sf_ro.ri_cols;
                    164:        sf->sf_wsd.textops = &sf->sf_ro.ri_ops;
                    165: }
                    166:
                    167: static void
                    168: fb_updatecursor(struct rasops_info *ri)
                    169: {
                    170:        struct sunfb *sf = (struct sunfb *)ri->ri_hw;
                    171:
                    172:        if (sf->sf_crowp != NULL)
                    173:                *sf->sf_crowp = ri->ri_crow;
                    174:        if (sf->sf_ccolp != NULL)
                    175:                *sf->sf_ccolp = ri->ri_ccol;
                    176: }
                    177:
                    178: void
                    179: fbwscons_init(struct sunfb *sf, int flags)
                    180: {
                    181:        struct rasops_info *ri = &sf->sf_ro;
                    182:        int cols, rows;
                    183:
                    184:        /* ri_hw and ri_bits must have already been setup by caller */
                    185:        ri->ri_flg = RI_CENTER | RI_FULLCLEAR | flags;
                    186:        ri->ri_depth = sf->sf_depth;
                    187:        ri->ri_stride = sf->sf_linebytes;
                    188:        ri->ri_width = sf->sf_width;
                    189:        ri->ri_height = sf->sf_height;
                    190:
                    191:        rows = a2int(getpropstring(optionsnode, "screen-#rows"), 34);
                    192:        cols = a2int(getpropstring(optionsnode, "screen-#columns"), 80);
                    193:
                    194:        rasops_init(ri, rows, cols);
                    195:
                    196:        if (sf->sf_depth == 8) {
                    197:                /*
                    198:                 * If we are running with an indexed palette, compensate
                    199:                 * the swap of black and white through ri_devcmap.
                    200:                 */
                    201:                ri->ri_devcmap[WSCOL_SUN_BLACK] = 0;
                    202:                ri->ri_devcmap[WSCOL_SUN_WHITE] = 0xffffffff;
                    203:        } else if (sf->sf_depth > 8) {
                    204:                /*
                    205:                 * If we are running on a direct color frame buffer,
                    206:                 * make the ``normal'' white the same as the highlighted
                    207:                 * white.
                    208:                 */
                    209:                ri->ri_devcmap[WSCOL_WHITE] = ri->ri_devcmap[WSCOL_WHITE + 8];
                    210:        }
                    211: }
                    212:
                    213: void
                    214: fbwscons_console_init(struct sunfb *sf, int row)
                    215: {
                    216:        struct rasops_info *ri = &sf->sf_ro;
                    217:        long defattr;
                    218:
                    219:        if (romgetcursoraddr(&sf->sf_crowp, &sf->sf_ccolp))
                    220:                sf->sf_ccolp = sf->sf_crowp = NULL;
                    221:        if (sf->sf_ccolp != NULL)
                    222:                ri->ri_ccol = *sf->sf_ccolp;
                    223:
                    224:        if (row < 0) {
                    225:                if (sf->sf_crowp != NULL)
                    226:                        ri->ri_crow = *sf->sf_crowp;
                    227:                else
                    228:                        /* assume last row */
                    229:                        ri->ri_crow = ri->ri_rows - 1;
                    230:        } else {
                    231:                /*
                    232:                 * If we force the display row, this is because the screen
                    233:                 * has been cleared or the font has been changed.
                    234:                 * In this case, choose not to keep pointers to the PROM
                    235:                 * cursor position, as the values are likely to be inaccurate
                    236:                 * upon shutdown...
                    237:                 */
                    238:                sf->sf_crowp = sf->sf_ccolp = NULL;
                    239:                ri->ri_crow = row;
                    240:        }
                    241:
                    242:        /*
                    243:         * Scale back rows and columns if the font would not otherwise
                    244:         * fit on this display. Without this we would panic later.
                    245:         */
                    246:        if (ri->ri_crow >= ri->ri_rows)
                    247:                ri->ri_crow = ri->ri_rows - 1;
                    248:        if (ri->ri_ccol >= ri->ri_cols)
                    249:                ri->ri_ccol = ri->ri_cols - 1;
                    250:
                    251:        /*
                    252:         * Take care of updating the PROM cursor position as weel if we can.
                    253:         */
                    254:        if (ri->ri_updatecursor != NULL &&
                    255:            (sf->sf_ccolp != NULL || sf->sf_crowp != NULL))
                    256:                ri->ri_updatecursor = fb_updatecursor;
                    257:
                    258:        if (ISSET(ri->ri_caps, WSSCREEN_WSCOLORS))
                    259:                ri->ri_ops.alloc_attr(ri,
                    260:                    WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, &defattr);
                    261:        else
                    262:                ri->ri_ops.alloc_attr(ri, 0, 0, 0, &defattr);
                    263:
                    264:        fb_initwsd(sf);
                    265:        wsdisplay_cnattach(&sf->sf_wsd, ri, ri->ri_ccol, ri->ri_crow, defattr);
                    266: }
                    267:
                    268: void
                    269: fbwscons_setcolormap(struct sunfb *sf,
                    270:     void (*setcolor)(void *, u_int, u_int8_t, u_int8_t, u_int8_t))
                    271: {
                    272:        int i;
                    273:        const u_char *color;
                    274:
                    275:        if (sf->sf_depth <= 8 && setcolor != NULL) {
                    276:                for (i = 0; i < 16; i++) {
                    277:                        color = &rasops_cmap[i * 3];
                    278:                        setcolor(sf, i, color[0], color[1], color[2]);
                    279:                }
                    280:                for (i = 240; i < 256; i++) {
                    281:                        color = &rasops_cmap[i * 3];
                    282:                        setcolor(sf, i, color[0], color[1], color[2]);
                    283:                }
                    284:                /*
                    285:                 * Compensate for BoW default hardware palette: existing
                    286:                 * output (which we do not want to affect) is black on
                    287:                 * white with color index 0 being white and 0xff being
                    288:                 * black.
                    289:                 */
                    290:                setcolor(sf, WSCOL_SUN_WHITE, 0xff, 0xff, 0xff);
                    291:                setcolor(sf, 0xff ^ WSCOL_SUN_WHITE, 0, 0, 0);
                    292:                setcolor(sf, WSCOL_SUN_BLACK, 0, 0, 0);
                    293:                setcolor(sf, 0xff ^ (WSCOL_SUN_BLACK), 0xff, 0xff, 0xff);
                    294:        }
                    295: }
                    296:
                    297: void
                    298: fbwscons_attach(struct sunfb *sf, struct wsdisplay_accessops *op, int isconsole)
                    299: {
                    300:        struct wsemuldisplaydev_attach_args waa;
                    301:
                    302:        if (isconsole == 0) {
                    303:                /* done in wsdisplay_cnattach() earlier if console */
                    304:                fb_initwsd(sf);
                    305:        } else {
                    306:                /* remember screen burner routine */
                    307:                fb_burner = op->burn_screen;
                    308:                fb_cookie = sf;
                    309:        }
                    310:
                    311:        sf->sf_scrlist[0] = &sf->sf_wsd;
                    312:        sf->sf_wsl.nscreens = 1;
                    313:        sf->sf_wsl.screens = (const struct wsscreen_descr **)sf->sf_scrlist;
                    314:
                    315:        waa.console = isconsole;
                    316:        waa.scrdata = &sf->sf_wsl;
                    317:        waa.accessops = op;
                    318:        waa.accesscookie = sf;
                    319:        waa.defaultscreens = 0;
                    320:        config_found(&sf->sf_dev, &waa, wsemuldisplaydevprint);
                    321: }
                    322:
                    323: #endif /* NWSDISPLAY */

CVSweb