1*53931Shibler /* 2*53931Shibler * Copyright (c) 1991 University of Utah. 3*53931Shibler * Copyright (c) 1990 The Regents of the University of California. 4*53931Shibler * All rights reserved. 5*53931Shibler * 6*53931Shibler * This code is derived from software contributed to Berkeley by 7*53931Shibler * the Systems Programming Group of the University of Utah Computer 8*53931Shibler * Science Department and Mark Davies of the Department of Computer 9*53931Shibler * Science, Victoria University of Wellington, New Zealand. 10*53931Shibler * 11*53931Shibler * %sccs.include.redist.c% 12*53931Shibler * 13*53931Shibler * from: Utah $Hdr: grf_hy.c 1.1 92/01/22$ 14*53931Shibler * 15*53931Shibler * @(#)grf_hy.c 7.1 (Berkeley) 06/05/92 16*53931Shibler */ 17*53931Shibler 18*53931Shibler #include "grf.h" 19*53931Shibler #if NGRF > 0 20*53931Shibler 21*53931Shibler /* 22*53931Shibler * Graphics routines for HYPERION frame buffer 23*53931Shibler */ 24*53931Shibler #include "sys/param.h" 25*53931Shibler #include "sys/errno.h" 26*53931Shibler 27*53931Shibler #include "hp/dev/grfioctl.h" 28*53931Shibler #include "hp/dev/grfvar.h" 29*53931Shibler #include "grf_hyreg.h" 30*53931Shibler 31*53931Shibler #include "../include/cpu.h" 32*53931Shibler 33*53931Shibler caddr_t badhyaddr = (caddr_t) -1; 34*53931Shibler 35*53931Shibler /* 36*53931Shibler * Initialize hardware. 37*53931Shibler * Must fill in the grfinfo structure in g_softc. 38*53931Shibler * Returns 0 if hardware not present, non-zero ow. 39*53931Shibler */ 40*53931Shibler hy_init(gp, addr) 41*53931Shibler struct grf_softc *gp; 42*53931Shibler caddr_t addr; 43*53931Shibler { 44*53931Shibler register struct hyboxfb *hy = (struct hyboxfb *) addr; 45*53931Shibler struct grfinfo *gi = &gp->g_display; 46*53931Shibler int fboff; 47*53931Shibler extern caddr_t sctopa(), iomap(); 48*53931Shibler 49*53931Shibler if (ISIIOVA(addr)) 50*53931Shibler gi->gd_regaddr = (caddr_t) IIOP(addr); 51*53931Shibler else 52*53931Shibler gi->gd_regaddr = sctopa(vatosc(addr)); 53*53931Shibler gi->gd_regsize = 0x20000; 54*53931Shibler gi->gd_fbwidth = (hy->fbwmsb << 8) | hy->fbwlsb; 55*53931Shibler gi->gd_fbheight = (hy->fbhmsb << 8) | hy->fbhlsb; 56*53931Shibler gi->gd_fbsize = (gi->gd_fbwidth * gi->gd_fbheight) >> 3; 57*53931Shibler fboff = (hy->fbomsb << 8) | hy->fbolsb; 58*53931Shibler gi->gd_fbaddr = (caddr_t) (*((u_char *)addr + fboff) << 16); 59*53931Shibler if (gi->gd_regaddr >= (caddr_t)DIOIIBASE) { 60*53931Shibler /* 61*53931Shibler * For DIO II space the fbaddr just computed is the offset 62*53931Shibler * from the select code base (regaddr) of the framebuffer. 63*53931Shibler * Hence it is also implicitly the size of the register set. 64*53931Shibler */ 65*53931Shibler gi->gd_regsize = (int) gi->gd_fbaddr; 66*53931Shibler gi->gd_fbaddr += (int) gi->gd_regaddr; 67*53931Shibler gp->g_regkva = addr; 68*53931Shibler gp->g_fbkva = addr + gi->gd_regsize; 69*53931Shibler } else { 70*53931Shibler /* 71*53931Shibler * For DIO space we need to map the seperate framebuffer. 72*53931Shibler */ 73*53931Shibler gp->g_regkva = addr; 74*53931Shibler gp->g_fbkva = iomap(gi->gd_fbaddr, gi->gd_fbsize); 75*53931Shibler } 76*53931Shibler gi->gd_dwidth = (hy->dwmsb << 8) | hy->dwlsb; 77*53931Shibler gi->gd_dheight = (hy->dhmsb << 8) | hy->dhlsb; 78*53931Shibler gi->gd_planes = hy->num_planes; 79*53931Shibler gi->gd_colors = 1 << gi->gd_planes; 80*53931Shibler 81*53931Shibler return(1); 82*53931Shibler } 83*53931Shibler 84*53931Shibler /* 85*53931Shibler * Change the mode of the display. 86*53931Shibler * Right now all we can do is grfon/grfoff. 87*53931Shibler * Return a UNIX error number or 0 for success. 88*53931Shibler * Function may not be needed anymore. 89*53931Shibler */ 90*53931Shibler hy_mode(gp, cmd) 91*53931Shibler struct grf_softc *gp; 92*53931Shibler { 93*53931Shibler int error = 0; 94*53931Shibler 95*53931Shibler switch (cmd) { 96*53931Shibler case GM_GRFON: 97*53931Shibler case GM_GRFOFF: 98*53931Shibler break; 99*53931Shibler default: 100*53931Shibler error = EINVAL; 101*53931Shibler break; 102*53931Shibler } 103*53931Shibler return(error); 104*53931Shibler } 105*53931Shibler #endif 106