141480Smckusick /* 241480Smckusick * Copyright (c) 1988 University of Utah. 341480Smckusick * Copyright (c) 1990 The Regents of the University of California. 441480Smckusick * All rights reserved. 541480Smckusick * 641480Smckusick * This code is derived from software contributed to Berkeley by 741480Smckusick * the Systems Programming Group of the University of Utah Computer 841480Smckusick * Science Department. 941480Smckusick * 1041480Smckusick * %sccs.include.redist.c% 1141480Smckusick * 1253929Shibler * from: Utah $Hdr: grf_tc.c 1.19 92/01/21$ 1341480Smckusick * 14*56507Sbostic * @(#)grf_tc.c 7.6 (Berkeley) 10/11/92 1541480Smckusick */ 1641480Smckusick 1741480Smckusick #include "grf.h" 1841480Smckusick #if NGRF > 0 1941480Smckusick 2041480Smckusick /* 2153929Shibler * Graphics routines for TOPCAT and CATSEYE frame buffers 2241480Smckusick */ 23*56507Sbostic #include <sys/param.h> 24*56507Sbostic #include <sys/errno.h> 2541480Smckusick 26*56507Sbostic #include <hp/dev/grfioctl.h> 27*56507Sbostic #include <hp/dev/grfvar.h> 28*56507Sbostic #include <hp300/dev/grf_tcreg.h> 2941480Smckusick 30*56507Sbostic #include <machine/cpu.h> 3141480Smckusick 3241480Smckusick /* 3341480Smckusick * Initialize hardware. 3441480Smckusick * Must fill in the grfinfo structure in g_softc. 3541480Smckusick * Returns 0 if hardware not present, non-zero ow. 3641480Smckusick */ 3741480Smckusick tc_init(gp, addr) 3841480Smckusick struct grf_softc *gp; 3949312Shibler caddr_t addr; 4041480Smckusick { 4141480Smckusick register struct tcboxfb *tp = (struct tcboxfb *) addr; 4241480Smckusick struct grfinfo *gi = &gp->g_display; 4341480Smckusick volatile u_char *fbp; 4441480Smckusick u_char save; 4541480Smckusick int fboff; 4649312Shibler extern caddr_t sctopa(), iomap(); 4741480Smckusick 4849312Shibler if (ISIIOVA(addr)) 4949312Shibler gi->gd_regaddr = (caddr_t) IIOP(addr); 5049312Shibler else 5149312Shibler gi->gd_regaddr = sctopa(vatosc(addr)); 5241480Smckusick gi->gd_regsize = 0x10000; 5341480Smckusick gi->gd_fbwidth = (tp->fbwmsb << 8) | tp->fbwlsb; 5441480Smckusick gi->gd_fbheight = (tp->fbhmsb << 8) | tp->fbhlsb; 5549312Shibler gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight; 5641480Smckusick fboff = (tp->fbomsb << 8) | tp->fbolsb; 5749312Shibler gi->gd_fbaddr = (caddr_t) (*((u_char *)addr + fboff) << 16); 5849312Shibler if (gi->gd_regaddr >= (caddr_t)DIOIIBASE) { 5949312Shibler /* 6049312Shibler * For DIO II space the fbaddr just computed is the offset 6149312Shibler * from the select code base (regaddr) of the framebuffer. 6249312Shibler * Hence it is also implicitly the size of the register set. 6349312Shibler */ 6449312Shibler gi->gd_regsize = (int) gi->gd_fbaddr; 6549312Shibler gi->gd_fbaddr += (int) gi->gd_regaddr; 6649312Shibler gp->g_regkva = addr; 6749312Shibler gp->g_fbkva = addr + gi->gd_regsize; 6849312Shibler } else { 6949312Shibler /* 7049312Shibler * For DIO space we need to map the seperate framebuffer. 7149312Shibler */ 7249312Shibler gp->g_regkva = addr; 7349312Shibler gp->g_fbkva = iomap(gi->gd_fbaddr, gi->gd_fbsize); 7449312Shibler } 7541480Smckusick gi->gd_dwidth = (tp->dwmsb << 8) | tp->dwlsb; 7641480Smckusick gi->gd_dheight = (tp->dhmsb << 8) | tp->dhlsb; 7741480Smckusick gi->gd_planes = tp->num_planes; 7841480Smckusick gi->gd_colors = 1 << gi->gd_planes; 7941480Smckusick if (gi->gd_colors == 1) { 8049312Shibler fbp = (u_char *) gp->g_fbkva; 8141480Smckusick tp->wen = ~0; 8241480Smckusick tp->prr = 0x3; 8341480Smckusick tp->fben = ~0; 8441480Smckusick save = *fbp; 8541480Smckusick *fbp = 0xFF; 8641480Smckusick gi->gd_colors = *fbp + 1; 8741480Smckusick *fbp = save; 8841480Smckusick } 8941480Smckusick return(1); 9041480Smckusick } 9141480Smckusick 9241480Smckusick /* 9341480Smckusick * Change the mode of the display. 9441480Smckusick * Right now all we can do is grfon/grfoff. 9541480Smckusick * Return a UNIX error number or 0 for success. 9641480Smckusick * Function may not be needed anymore. 9741480Smckusick */ 9841480Smckusick /*ARGSUSED*/ 9941480Smckusick tc_mode(gp, cmd) 10041480Smckusick struct grf_softc *gp; 10141480Smckusick { 10241480Smckusick int error = 0; 10341480Smckusick 10441480Smckusick switch (cmd) { 10541480Smckusick case GM_GRFON: 10641480Smckusick case GM_GRFOFF: 10741480Smckusick break; 10841480Smckusick default: 10941480Smckusick error = EINVAL; 11041480Smckusick break; 11141480Smckusick } 11241480Smckusick return(error); 11341480Smckusick } 11441480Smckusick #endif 115