diff options
-rw-r--r-- | sys/arch/sparc64/conf/files.sparc64 | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/consinit.c | 4 | ||||
-rw-r--r-- | sys/arch/sparc64/dev/fb.c | 240 | ||||
-rw-r--r-- | sys/arch/sparc64/include/fbvar.h | 71 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/db_interface.c | 6 | ||||
-rw-r--r-- | sys/arch/sparc64/sparc64/machdep.c | 4 |
6 files changed, 321 insertions, 10 deletions
diff --git a/sys/arch/sparc64/conf/files.sparc64 b/sys/arch/sparc64/conf/files.sparc64 index ffcb0e2a05d..1ceb1ce8e94 100644 --- a/sys/arch/sparc64/conf/files.sparc64 +++ b/sys/arch/sparc64/conf/files.sparc64 @@ -1,4 +1,4 @@ -# $OpenBSD: files.sparc64,v 1.44 2003/05/06 09:14:39 miod Exp $ +# $OpenBSD: files.sparc64,v 1.45 2003/06/16 20:46:13 miod Exp $ # $NetBSD: files.sparc64,v 1.50 2001/08/10 20:53:50 eeh Exp $ # maxpartitions must be first item in files.${ARCH} @@ -26,9 +26,13 @@ file dev/ic/hme.c hme device uperf file arch/sparc64/dev/uperf.c uperf needs-flag +# Framebuffer support + +file arch/sparc64/dev/fb.c include "dev/wscons/files.wscons" include "dev/rasops/files.rasops" include "dev/wsfont/files.wsfont" + include "dev/sbus/files.sbus" include "dev/i2o/files.i2o" include "dev/mii/files.mii" diff --git a/sys/arch/sparc64/dev/consinit.c b/sys/arch/sparc64/dev/consinit.c index df1dbac2f52..f088b6321eb 100644 --- a/sys/arch/sparc64/dev/consinit.c +++ b/sys/arch/sparc64/dev/consinit.c @@ -1,4 +1,4 @@ -/* $OpenBSD: consinit.c,v 1.7 2002/03/14 01:26:44 millert Exp $ */ +/* $OpenBSD: consinit.c,v 1.8 2003/06/16 20:46:10 miod Exp $ */ /* $NetBSD: consinit.c,v 1.9 2000/10/20 05:32:35 mrg Exp $ */ /*- @@ -161,9 +161,7 @@ prom_cnpollc(dev, on) { if (on) { /* Entering debugger. */ -#if NFB > 0 fb_unblank(); -#endif } else { /* Resuming kernel. */ } diff --git a/sys/arch/sparc64/dev/fb.c b/sys/arch/sparc64/dev/fb.c new file mode 100644 index 00000000000..ff4962027fa --- /dev/null +++ b/sys/arch/sparc64/dev/fb.c @@ -0,0 +1,240 @@ +/* $OpenBSD: fb.c,v 1.1 2003/06/16 20:46:10 miod Exp $ */ +/* $NetBSD: fb.c,v 1.23 1997/07/07 23:30:22 pk Exp $ */ + +/* + * Copyright (c) 2002 Miodrag Vallat + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + * + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fb.c 8.1 (Berkeley) 6/11/93 + */ + +/* + * Common wsdisplay framebuffer drivers helpers. + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> +#include <sys/proc.h> +#include <sys/conf.h> + +#include <machine/autoconf.h> +#include <machine/conf.h> + +#include <dev/wscons/wsdisplayvar.h> +#include <dev/wscons/wscons_raster.h> +#include <dev/rasops/rasops.h> +#include <machine/fbvar.h> + +#include "wsdisplay.h" + +/* + * emergency unblank code + * XXX should be somewhat moved to wscons MI code + */ + +void (*fb_burner)(void *, u_int, u_int); +void *fb_cookie; + +void +fb_unblank() +{ + if (fb_burner != NULL) + (*fb_burner)(fb_cookie, 1, 0); +} + +#if NWSDISPLAY > 0 + +void +fb_setsize(struct sunfb *sf, int def_depth, int def_width, int def_height, + int node, int unused) +{ + int def_linebytes; + + sf->sf_depth = getpropint(node, "depth", def_depth); + sf->sf_width = getpropint(node, "width", def_width); + sf->sf_height = getpropint(node, "height", def_height); + + def_linebytes = + roundup(sf->sf_width, sf->sf_depth) * sf->sf_depth / 8; + sf->sf_linebytes = getpropint(node, "linebytes", def_linebytes); + /* + * XXX If we are configuring a board in a wider depth level + * than the mode it is currently operating in, the PROM will + * return a linebytes property tied to the current depth value, + * which is NOT what we are relying upon! + */ + if (sf->sf_linebytes < (sf->sf_width * sf->sf_depth) / 8) { + sf->sf_linebytes = def_linebytes; + } + + sf->sf_fbsize = sf->sf_height * sf->sf_linebytes; +} + +int a2int(char *, int); + +int +a2int(char *cp, int deflt) +{ + int i = 0; + + if (*cp == '\0') + return (deflt); + while (*cp != '\0') + i = i * 10 + *cp++ - '0'; + return (i); +} + +void +fbwscons_init(struct sunfb *sf, int flags) +{ + int cols, rows; + + /* ri_hw and ri_bits must have already been setup by caller */ + sf->sf_ro.ri_flg = RI_CENTER | flags; + sf->sf_ro.ri_depth = sf->sf_depth; + sf->sf_ro.ri_stride = sf->sf_linebytes; + sf->sf_ro.ri_width = sf->sf_width; + sf->sf_ro.ri_height = sf->sf_height; + + rows = a2int(getpropstring(optionsnode, "screen-#rows"), 34); + cols = a2int(getpropstring(optionsnode, "screen-#columns"), 80); + + rasops_init(&sf->sf_ro, rows, cols); +} + +void +fbwscons_console_init(struct sunfb *sf, struct wsscreen_descr *wsc, int row, + void (*burner)(void *, u_int, u_int)) +{ + long defattr; + int *ccolp, *crowp; + + if (romgetcursoraddr(&crowp, &ccolp)) + ccolp = crowp = NULL; + if (ccolp != NULL) + sf->sf_ro.ri_ccol = *ccolp; + + if (row < 0) { + if (crowp != NULL) + sf->sf_ro.ri_crow = *crowp; + else + /* assume last row */ + sf->sf_ro.ri_crow = sf->sf_ro.ri_rows - 1; + } else + sf->sf_ro.ri_crow = row; + + /* + * Scale back rows and columns if the font would not otherwise + * fit on this display. Without this we would panic later. + */ + if (sf->sf_ro.ri_crow >= wsc->nrows) + sf->sf_ro.ri_crow = wsc->nrows - 1; + if (sf->sf_ro.ri_ccol >= wsc->ncols) + sf->sf_ro.ri_ccol = wsc->ncols - 1; + + /* + * Select appropriate color settings to mimic a + * black on white Sun console. + */ + if (sf->sf_depth > 8) { + wscol_white = 0; + wscol_black = 255; + wskernel_bg = 0; + wskernel_fg = 255; + } + + if (ISSET(wsc->capabilities, WSSCREEN_WSCOLORS) && + sf->sf_depth == 8) { + sf->sf_ro.ri_ops.alloc_attr(&sf->sf_ro, + WSCOL_BLACK, WSCOL_WHITE, WSATTR_WSCOLORS, &defattr); + } else { + sf->sf_ro.ri_ops.alloc_attr(&sf->sf_ro, 0, 0, 0, &defattr); + } + + wsdisplay_cnattach(wsc, &sf->sf_ro, + sf->sf_ro.ri_ccol, sf->sf_ro.ri_crow, defattr); + + /* remember screen burner routine */ + fb_burner = burner; + fb_cookie = sf; +} + +void +fbwscons_setcolormap(struct sunfb *sf, + void (*setcolor)(void *, u_int, u_int8_t, u_int8_t, u_int8_t)) +{ + int i; + u_char *color; + + if (sf->sf_depth <= 8 && setcolor != NULL) { + for (i = 0; i < 16; i++) { + color = (u_char *)&rasops_cmap[i * 3]; + setcolor(sf, i, color[0], color[1], color[2]); + } + /* compensate for BoW palette */ + setcolor(sf, WSCOL_BLACK, 0, 0, 0); + setcolor(sf, 255, 0, 0, 0); /* cursor */ + setcolor(sf, WSCOL_WHITE, 255, 255, 255); + } +} + +#endif /* NWSDISPLAY */ diff --git a/sys/arch/sparc64/include/fbvar.h b/sys/arch/sparc64/include/fbvar.h new file mode 100644 index 00000000000..2431726858c --- /dev/null +++ b/sys/arch/sparc64/include/fbvar.h @@ -0,0 +1,71 @@ +/* $OpenBSD: fbvar.h,v 1.1 2003/06/16 20:46:13 miod Exp $ */ +/* $NetBSD: fbvar.h,v 1.9 1997/07/07 23:31:30 pk Exp $ */ + +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. All rights reserved. + * + * This software was developed by the Computer Systems Engineering group + * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and + * contributed to Berkeley. + * + * All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Lawrence Berkeley Laboratory. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)fbvar.h 8.1 (Berkeley) 6/11/93 + */ + +/* + * Common frame buffer variables. + * All framebuffer softc structures must start with such a structure. + */ +struct sunfb { + struct device sf_dev; /* base device */ + + int sf_width; + int sf_height; + int sf_depth; + int sf_linebytes; + + int sf_fbsize; /* sf_height * sf_linebytes */ + + struct rasops_info sf_ro; +}; + +/* + * Selected framebuffer node on OBP systems if k/d console. + */ +extern int fbnode; + +void fb_setsize(struct sunfb*, int, int, int, int, int); +void fbwscons_init(struct sunfb *, int); +void fbwscons_console_init(struct sunfb *, struct wsscreen_descr *, int, + void (*)(void *, u_int, u_int)); +void fbwscons_setcolormap(struct sunfb *, + void (*)(void *, u_int, u_int8_t, u_int8_t, u_int8_t)); diff --git a/sys/arch/sparc64/sparc64/db_interface.c b/sys/arch/sparc64/sparc64/db_interface.c index f0510e09de8..86dd3126929 100644 --- a/sys/arch/sparc64/sparc64/db_interface.c +++ b/sys/arch/sparc64/sparc64/db_interface.c @@ -1,4 +1,4 @@ -/* $OpenBSD: db_interface.c,v 1.14 2003/02/12 06:33:00 jason Exp $ */ +/* $OpenBSD: db_interface.c,v 1.15 2003/06/16 20:46:14 miod Exp $ */ /* $NetBSD: db_interface.c,v 1.61 2001/07/31 06:55:47 eeh Exp $ */ /* @@ -279,9 +279,9 @@ kdb_trap(type, tf) extern int trap_trace_dis; trap_trace_dis++; -#if NFB > 0 + fb_unblank(); -#endif + switch (type) { case T_BREAKPOINT: /* breakpoint */ printf("kdb breakpoint at %llx\n", diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c index a7b15a97d16..6ca80ad2130 100644 --- a/sys/arch/sparc64/sparc64/machdep.c +++ b/sys/arch/sparc64/sparc64/machdep.c @@ -1,4 +1,4 @@ -/* $OpenBSD: machdep.c,v 1.63 2003/06/06 11:17:48 henric Exp $ */ +/* $OpenBSD: machdep.c,v 1.64 2003/06/16 20:46:14 miod Exp $ */ /* $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */ /*- @@ -788,9 +788,7 @@ boot(howto) goto haltsys; } -#if NFB > 0 fb_unblank(); -#endif boothowto = howto; if ((howto & RB_NOSYNC) == 0 && waittime < 0) { extern struct proc proc0; |