BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / hp300 / dev / grf_rb.c
index 57262bb..9e78763 100644 (file)
@@ -7,11 +7,37 @@
  * the Systems Programming Group of the University of Utah Computer
  * Science Department.
  *
  * 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_rb.c 1.1 90/07/09$
+ * 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_rb.c    7.4 (Berkeley) %G%
+ * from: Utah $Hdr: grf_rb.c 1.13 91/04/02$
+ *
+ *     @(#)grf_rb.c    7.5 (Berkeley) 5/7/91
  */
 
 #include "grf.h"
  */
 
 #include "grf.h"
  */
 rb_init(gp, addr)
        struct grf_softc *gp;
  */
 rb_init(gp, addr)
        struct grf_softc *gp;
-       u_char *addr;
+       caddr_t addr;
 {
        register struct rboxfb *rbp;
        struct grfinfo *gi = &gp->g_display;
        int fboff;
 {
        register struct rboxfb *rbp;
        struct grfinfo *gi = &gp->g_display;
        int fboff;
+       extern caddr_t sctopa(), iomap();
 
        rbp = (struct rboxfb *) addr;
 
        rbp = (struct rboxfb *) addr;
-       gi->gd_regaddr = (caddr_t) UNIOV(addr);
+       if (ISIIOVA(addr))
+               gi->gd_regaddr = (caddr_t) IIOP(addr);
+       else
+               gi->gd_regaddr = sctopa(vatosc(addr));
        gi->gd_regsize = 0x20000;
        gi->gd_fbwidth = (rbp->fbwmsb << 8) | rbp->fbwlsb;
        gi->gd_fbheight = (rbp->fbhmsb << 8) | rbp->fbhlsb;
        gi->gd_regsize = 0x20000;
        gi->gd_fbwidth = (rbp->fbwmsb << 8) | rbp->fbwlsb;
        gi->gd_fbheight = (rbp->fbhmsb << 8) | rbp->fbhlsb;
-       fboff = (rbp->fbomsb << 8) | rbp->fbolsb;
-       gi->gd_fbaddr = (caddr_t) (*(addr + fboff) << 16);
        gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight;
        gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight;
+       fboff = (rbp->fbomsb << 8) | rbp->fbolsb;
+       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;
+               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 = (rbp->dwmsb << 8) | rbp->dwlsb;
        gi->gd_dheight = (rbp->dwmsb << 8) | rbp->dwlsb;
        gi->gd_planes = 0;      /* ?? */
        gi->gd_dwidth = (rbp->dwmsb << 8) | rbp->dwlsb;
        gi->gd_dheight = (rbp->dwmsb << 8) | rbp->dwlsb;
        gi->gd_planes = 0;      /* ?? */
@@ -68,7 +115,7 @@ rb_mode(gp, cmd)
        register struct rboxfb *rbp;
        int error = 0;
 
        register struct rboxfb *rbp;
        int error = 0;
 
-       rbp = (struct rboxfb *) IOV(gp->g_display.gd_regaddr);
+       rbp = (struct rboxfb *) gp->g_regkva;
        switch (cmd) {
        /*
         * The minimal register info here is from the Renaissance X driver.
        switch (cmd) {
        /*
         * The minimal register info here is from the Renaissance X driver.