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