BSD 4_4 release
[unix-history] / usr / src / sys / hp300 / dev / grf_tc.c
index 3a3d14a..d4461ce 100644 (file)
@@ -1,33 +1,59 @@
 /*
  * Copyright (c) 1988 University of Utah.
 /*
  * Copyright (c) 1988 University of Utah.
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ *     The Regents of the University of California.  All rights reserved.
  *
  * This code is derived from software contributed to Berkeley by
  * the Systems Programming Group of the University of Utah Computer
  * Science Department.
  *
  *
  * This code is derived from software contributed to Berkeley by
  * the Systems Programming Group of the University of Utah Computer
  * Science Department.
  *
- * %sccs.include.redist.c%
+ * 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.
  *
  *
- * from: Utah $Hdr: grf_tc.c 1.13 89/08/25$
+ * 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.
  *
  *
- *     @(#)grf_tc.c    7.1 (Berkeley) %G%
+ * from: Utah $Hdr: grf_tc.c 1.19 92/01/21$
+ *
+ *     @(#)grf_tc.c    8.1 (Berkeley) 6/10/93
  */
 
 #include "grf.h"
 #if NGRF > 0
 
 /*
  */
 
 #include "grf.h"
 #if NGRF > 0
 
 /*
- * Graphics routines for TOPCAT frame buffer
+ * Graphics routines for TOPCAT and CATSEYE frame buffers
  */
  */
-#include "param.h"
-#include "errno.h"
+#include <sys/param.h>
+#include <sys/errno.h>
 
 
-#include "grfioctl.h"
-#include "grfvar.h"
-#include "grf_tcreg.h"
+#include <hp/dev/grfioctl.h>
+#include <hp/dev/grfvar.h>
+#include <hp300/dev/grf_tcreg.h>
 
 
-#include "machine/cpu.h"
+#include <machine/cpu.h>
 
 /*
  * Initialize hardware.
 
 /*
  * Initialize hardware.
  */
 tc_init(gp, addr)
        struct grf_softc *gp;
  */
 tc_init(gp, addr)
        struct grf_softc *gp;
-       u_char *addr;
+       caddr_t addr;
 {
        register struct tcboxfb *tp = (struct tcboxfb *) addr;
        struct grfinfo *gi = &gp->g_display;
        volatile u_char *fbp;
        u_char save;
        int fboff;
 {
        register struct tcboxfb *tp = (struct tcboxfb *) addr;
        struct grfinfo *gi = &gp->g_display;
        volatile u_char *fbp;
        u_char save;
        int fboff;
+       extern caddr_t sctopa(), iomap();
 
 
-#if defined(HP360) || defined(HP370)
-       extern char grfregs[];
-       if (addr == (u_char *)grfregs)
-               gi->gd_regaddr = (caddr_t) DIOIIBASE;
+       if (ISIIOVA(addr))
+               gi->gd_regaddr = (caddr_t) IIOP(addr);
        else
        else
-#endif
-       gi->gd_regaddr = (caddr_t) UNIOV(addr);
+               gi->gd_regaddr = sctopa(vatosc(addr));
        gi->gd_regsize = 0x10000;
        gi->gd_fbwidth = (tp->fbwmsb << 8) | tp->fbwlsb;
        gi->gd_fbheight = (tp->fbhmsb << 8) | tp->fbhlsb;
        gi->gd_regsize = 0x10000;
        gi->gd_fbwidth = (tp->fbwmsb << 8) | tp->fbwlsb;
        gi->gd_fbheight = (tp->fbhmsb << 8) | tp->fbhlsb;
+       gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight;
        fboff = (tp->fbomsb << 8) | tp->fbolsb;
        fboff = (tp->fbomsb << 8) | tp->fbolsb;
-       gi->gd_fbaddr = (caddr_t) (*(addr + fboff) << 16);
-#if defined(HP360) || defined(HP370)
-       /*
-        * For DIO II space addresses offset is relative to the DIO II space.
-        * XXX: this should apply to all frame buffer types.
-        */
-       if (gi->gd_regaddr >= (caddr_t)DIOIIBASE)
+       gi->gd_fbaddr = (caddr_t) (*((u_char *)addr + fboff) << 16);
+       if (gi->gd_regaddr >= (caddr_t)DIOIIBASE) {
+               /*
+                * For DIO II space the fbaddr just computed is the offset
+                * from the select code base (regaddr) of the framebuffer.
+                * Hence it is also implicitly the size of the register set.
+                */
+               gi->gd_regsize = (int) gi->gd_fbaddr;
                gi->gd_fbaddr += (int) gi->gd_regaddr;
                gi->gd_fbaddr += (int) gi->gd_regaddr;
-#endif
-       gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight;
+               gp->g_regkva = addr;
+               gp->g_fbkva = addr + gi->gd_regsize;
+       } else {
+               /*
+                * For DIO space we need to map the seperate framebuffer.
+                */
+               gp->g_regkva = addr;
+               gp->g_fbkva = iomap(gi->gd_fbaddr, gi->gd_fbsize);
+       }
        gi->gd_dwidth = (tp->dwmsb << 8) | tp->dwlsb;
        gi->gd_dheight = (tp->dhmsb << 8) | tp->dhlsb;
        gi->gd_planes = tp->num_planes;
        gi->gd_colors = 1 << gi->gd_planes;
        if (gi->gd_colors == 1) {
        gi->gd_dwidth = (tp->dwmsb << 8) | tp->dwlsb;
        gi->gd_dheight = (tp->dhmsb << 8) | tp->dhlsb;
        gi->gd_planes = tp->num_planes;
        gi->gd_colors = 1 << gi->gd_planes;
        if (gi->gd_colors == 1) {
-               fbp = (u_char *) IOV(gi->gd_fbaddr);
+               fbp = (u_char *) gp->g_fbkva;
                tp->wen = ~0;
                tp->prr = 0x3;
                tp->fben = ~0;
                tp->wen = ~0;
                tp->prr = 0x3;
                tp->fben = ~0;