[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     ! 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