1*41480Smckusick /* 2*41480Smckusick * Copyright (c) 1988 University of Utah. 3*41480Smckusick * Copyright (c) 1990 The Regents of the University of California. 4*41480Smckusick * All rights reserved. 5*41480Smckusick * 6*41480Smckusick * This code is derived from software contributed to Berkeley by 7*41480Smckusick * the Systems Programming Group of the University of Utah Computer 8*41480Smckusick * Science Department. 9*41480Smckusick * 10*41480Smckusick * %sccs.include.redist.c% 11*41480Smckusick * 12*41480Smckusick * from: Utah $Hdr: grf_tc.c 1.13 89/08/25$ 13*41480Smckusick * 14*41480Smckusick * @(#)grf_tc.c 7.1 (Berkeley) 05/08/90 15*41480Smckusick */ 16*41480Smckusick 17*41480Smckusick #include "grf.h" 18*41480Smckusick #if NGRF > 0 19*41480Smckusick 20*41480Smckusick /* 21*41480Smckusick * Graphics routines for TOPCAT frame buffer 22*41480Smckusick */ 23*41480Smckusick #include "param.h" 24*41480Smckusick #include "errno.h" 25*41480Smckusick 26*41480Smckusick #include "grfioctl.h" 27*41480Smckusick #include "grfvar.h" 28*41480Smckusick #include "grf_tcreg.h" 29*41480Smckusick 30*41480Smckusick #include "machine/cpu.h" 31*41480Smckusick 32*41480Smckusick /* 33*41480Smckusick * Initialize hardware. 34*41480Smckusick * Must fill in the grfinfo structure in g_softc. 35*41480Smckusick * Returns 0 if hardware not present, non-zero ow. 36*41480Smckusick */ 37*41480Smckusick tc_init(gp, addr) 38*41480Smckusick struct grf_softc *gp; 39*41480Smckusick u_char *addr; 40*41480Smckusick { 41*41480Smckusick register struct tcboxfb *tp = (struct tcboxfb *) addr; 42*41480Smckusick struct grfinfo *gi = &gp->g_display; 43*41480Smckusick volatile u_char *fbp; 44*41480Smckusick u_char save; 45*41480Smckusick int fboff; 46*41480Smckusick 47*41480Smckusick #if defined(HP360) || defined(HP370) 48*41480Smckusick extern char grfregs[]; 49*41480Smckusick if (addr == (u_char *)grfregs) 50*41480Smckusick gi->gd_regaddr = (caddr_t) DIOIIBASE; 51*41480Smckusick else 52*41480Smckusick #endif 53*41480Smckusick gi->gd_regaddr = (caddr_t) UNIOV(addr); 54*41480Smckusick gi->gd_regsize = 0x10000; 55*41480Smckusick gi->gd_fbwidth = (tp->fbwmsb << 8) | tp->fbwlsb; 56*41480Smckusick gi->gd_fbheight = (tp->fbhmsb << 8) | tp->fbhlsb; 57*41480Smckusick fboff = (tp->fbomsb << 8) | tp->fbolsb; 58*41480Smckusick gi->gd_fbaddr = (caddr_t) (*(addr + fboff) << 16); 59*41480Smckusick #if defined(HP360) || defined(HP370) 60*41480Smckusick /* 61*41480Smckusick * For DIO II space addresses offset is relative to the DIO II space. 62*41480Smckusick * XXX: this should apply to all frame buffer types. 63*41480Smckusick */ 64*41480Smckusick if (gi->gd_regaddr >= (caddr_t)DIOIIBASE) 65*41480Smckusick gi->gd_fbaddr += (int) gi->gd_regaddr; 66*41480Smckusick #endif 67*41480Smckusick gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight; 68*41480Smckusick gi->gd_dwidth = (tp->dwmsb << 8) | tp->dwlsb; 69*41480Smckusick gi->gd_dheight = (tp->dhmsb << 8) | tp->dhlsb; 70*41480Smckusick gi->gd_planes = tp->num_planes; 71*41480Smckusick gi->gd_colors = 1 << gi->gd_planes; 72*41480Smckusick if (gi->gd_colors == 1) { 73*41480Smckusick fbp = (u_char *) IOV(gi->gd_fbaddr); 74*41480Smckusick tp->wen = ~0; 75*41480Smckusick tp->prr = 0x3; 76*41480Smckusick tp->fben = ~0; 77*41480Smckusick save = *fbp; 78*41480Smckusick *fbp = 0xFF; 79*41480Smckusick gi->gd_colors = *fbp + 1; 80*41480Smckusick *fbp = save; 81*41480Smckusick } 82*41480Smckusick return(1); 83*41480Smckusick } 84*41480Smckusick 85*41480Smckusick /* 86*41480Smckusick * Change the mode of the display. 87*41480Smckusick * Right now all we can do is grfon/grfoff. 88*41480Smckusick * Return a UNIX error number or 0 for success. 89*41480Smckusick * Function may not be needed anymore. 90*41480Smckusick */ 91*41480Smckusick /*ARGSUSED*/ 92*41480Smckusick tc_mode(gp, cmd) 93*41480Smckusick struct grf_softc *gp; 94*41480Smckusick { 95*41480Smckusick int error = 0; 96*41480Smckusick 97*41480Smckusick switch (cmd) { 98*41480Smckusick case GM_GRFON: 99*41480Smckusick case GM_GRFOFF: 100*41480Smckusick break; 101*41480Smckusick default: 102*41480Smckusick error = EINVAL; 103*41480Smckusick break; 104*41480Smckusick } 105*41480Smckusick return(error); 106*41480Smckusick } 107*41480Smckusick #endif 108