Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/sun Common framebuffer functions.
details: https://anonhg.NetBSD.org/src/rev/202eb06a8177
branches: trunk
changeset: 496440:202eb06a8177
user: pk <pk%NetBSD.org@localhost>
date: Wed Aug 23 13:41:15 2000 +0000
description:
Common framebuffer functions.
(currently includes a special cased fb_isconsole() for sun4u).
diffstat:
sys/dev/sun/fb.c | 474 ++++++++++++++++++++++++++++++++++++++++++++++++++
sys/dev/sun/files.sun | 3 +-
2 files changed, 476 insertions(+), 1 deletions(-)
diffs (truncated from 495 to 300 lines):
diff -r 22b824203a99 -r 202eb06a8177 sys/dev/sun/fb.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/sun/fb.c Wed Aug 23 13:41:15 2000 +0000
@@ -0,0 +1,474 @@
+/* $NetBSD: fb.c,v 1.1 2000/08/23 13:41:15 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. 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, Berkeley and its contributors.
+ * 4. 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
+ */
+
+/*
+ * /dev/fb (indirect frame buffer driver). This is gross; we should
+ * just build cdevsw[] dynamically.
+ */
+
+#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/kbd.h>
+#include <machine/conf.h>
+#include <machine/eeprom.h>
+#include <sparc/dev/cons.h>
+
+#include <dev/sun/fbio.h>
+#include <dev/sun/fbvar.h>
+
+#include "pfour.h"
+
+static struct fbdevice *devfb;
+
+void
+fb_unblank()
+{
+
+ if (devfb)
+ (*devfb->fb_driver->fbd_unblank)(devfb->fb_device);
+}
+
+/*
+ * Helper function for frame buffer devices. Decides whether
+ * the device can be the console output device according to
+ * PROM info. The result from this function may not be conclusive
+ * on machines with old PROMs; in that case, drivers should consult
+ * other sources of configuration information (e.g. EEPROM entries).
+ */
+#if defined(SUN4U)
+/* Temporary special case for sun4u */
+int
+fb_is_console(node)
+ int node;
+{
+ extern int fbnode;
+ return (node == fbnode);
+}
+#else
+int
+fb_is_console(node)
+ int node;
+{
+ int fbnode;
+
+ switch (prom_version()) {
+ case PROM_OLDMON:
+ /* `node' is not valid; just check for any fb device */
+ return (prom_stdout() == PROMDEV_SCREEN);
+
+ case PROM_OBP_V0:
+ /*
+ * Prefer the `fb' property on the root node.
+ * Fall back on prom_stdout() cookie if not present.
+ */
+ fbnode = getpropint(findroot(), "fb", 0);
+ if (fbnode == 0)
+ return (prom_stdout() == PROMDEV_SCREEN);
+ else
+ return (node == fbnode);
+
+ case PROM_OBP_V2:
+ case PROM_OBP_V3:
+ case PROM_OPENFIRM:
+ /* Just match the nodes */
+ return (node == prom_stdout_node);
+ }
+
+ return (0);
+}
+#endif /* SUN4U */
+
+void
+fb_attach(fb, isconsole)
+ struct fbdevice *fb;
+ int isconsole;
+{
+ static int no_replace, seen_force;
+
+ /*
+ * We've already had a framebuffer forced into /dev/fb. Don't
+ * allow any more, even if this is the console.
+ */
+ if (seen_force) {
+ if (devfb) { /* sanity */
+ printf("%s: /dev/fb already full\n",
+ fb->fb_device->dv_xname);
+ return;
+ } else
+ seen_force = 0;
+ }
+
+ /*
+ * Check to see if we're being forced into /dev/fb.
+ */
+ if (fb->fb_flags & FB_FORCE) {
+ if (devfb)
+ printf("%s: forcefully replacing %s\n",
+ fb->fb_device->dv_xname,
+ devfb->fb_device->dv_xname);
+ devfb = fb;
+ seen_force = no_replace = 1;
+ goto attached;
+ }
+
+ /*
+ * Check to see if we're the console. If we are, then replace
+ * any currently existing framebuffer.
+ */
+ if (isconsole) {
+ if (devfb)
+ printf("%s: replacing %s\n", fb->fb_device->dv_xname,
+ devfb->fb_device->dv_xname);
+ devfb = fb;
+ no_replace = 1;
+ goto attached;
+ }
+
+ /*
+ * For the final case, we check to see if we can replace an
+ * existing framebuffer, if not, say so and return.
+ */
+ if (no_replace) {
+ if (devfb) { /* sanity */
+ printf("%s: /dev/fb already full\n",
+ fb->fb_device->dv_xname);
+ return;
+ } else
+ no_replace = 0;
+ }
+
+ if (devfb)
+ printf("%s: replacing %s\n", fb->fb_device->dv_xname,
+ devfb->fb_device->dv_xname);
+ devfb = fb;
+
+ attached:
+ printf("%s: attached to /dev/fb\n", devfb->fb_device->dv_xname);
+}
+
+int
+fbopen(dev, flags, mode, p)
+ dev_t dev;
+ int flags, mode;
+ struct proc *p;
+{
+
+ if (devfb == NULL)
+ return (ENXIO);
+ return (devfb->fb_driver->fbd_open)(dev, flags, mode, p);
+}
+
+int
+fbclose(dev, flags, mode, p)
+ dev_t dev;
+ int flags, mode;
+ struct proc *p;
+{
+
+ return (devfb->fb_driver->fbd_close)(dev, flags, mode, p);
+}
+
+int
+fbioctl(dev, cmd, data, flags, p)
+ dev_t dev;
+ u_long cmd;
+ caddr_t data;
+ int flags;
+ struct proc *p;
+{
+
+ return (devfb->fb_driver->fbd_ioctl)(dev, cmd, data, flags, p);
+}
+
+int
+fbpoll(dev, events, p)
+ dev_t dev;
+ int events;
+ struct proc *p;
+{
+
+ return (devfb->fb_driver->fbd_poll)(dev, events, p);
+}
+
+paddr_t
+fbmmap(dev, off, prot)
+ dev_t dev;
+ off_t off;
+ int prot;
+{
+ paddr_t (*map)__P((dev_t, off_t, int)) = devfb->fb_driver->fbd_mmap;
+
+ if (map == NULL)
+ return (-1);
+ return (map(dev, off, prot));
+}
+
+void
+fb_setsize_obp(fb, depth, def_width, def_height, node)
+ struct fbdevice *fb;
+ int depth, def_width, def_height, node;
+{
+ fb->fb_type.fb_width = getpropint(node, "width", def_width);
+ fb->fb_type.fb_height = getpropint(node, "height", def_height);
+ fb->fb_linebytes = getpropint(node, "linebytes",
+ (fb->fb_type.fb_width * depth) / 8);
+}
+
+void
+fb_setsize_eeprom(fb, depth, def_width, def_height)
+ struct fbdevice *fb;
+ int depth, def_width, def_height;
+{
+#if defined(SUN4)
+ struct eeprom *eep = (struct eeprom *)eeprom_va;
+
+ if (!CPU_ISSUN4) {
+ printf("fb_setsize_eeprom: not sun4\n");
+ return;
+ }
+
+ /* Set up some defaults. */
+ fb->fb_type.fb_width = def_width;
+ fb->fb_type.fb_height = def_height;
+
+ if (fb->fb_flags & FB_PFOUR) {
+#if NPFOUR > 0
+ fb_setsize_pfour(fb);
+#endif
+ } else if (eep != NULL) {
+ switch (eep->eeScreenSize) {
+ case EE_SCR_1152X900:
+ fb->fb_type.fb_width = 1152;
+ fb->fb_type.fb_height = 900;
+ break;
+
+ case EE_SCR_1024X1024:
+ fb->fb_type.fb_width = 1024;
+ fb->fb_type.fb_height = 1024;
+ break;
Home |
Main Index |
Thread Index |
Old Index