Annotation of sys/arch/sparc/dev/cgeight.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: cgeight.c,v 1.28 2006/12/03 22:13:05 miod Exp $ */
! 2: /* $NetBSD: cgeight.c,v 1.13 1997/05/24 20:16:04 pk Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 2002 Miodrag Vallat. All rights reserved.
! 6: * Copyright (c) 1996 Jason R. Thorpe. All rights reserved.
! 7: * Copyright (c) 1995 Theo de Raadt
! 8: * Copyright (c) 1992, 1993
! 9: * The Regents of the University of California. All rights reserved.
! 10: *
! 11: * This software was developed by the Computer Systems Engineering group
! 12: * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
! 13: * contributed to Berkeley.
! 14: *
! 15: * All advertising materials mentioning features or use of this software
! 16: * must display the following acknowledgement:
! 17: * This product includes software developed by the University of
! 18: * California, Lawrence Berkeley Laboratory.
! 19: *
! 20: * Redistribution and use in source and binary forms, with or without
! 21: * modification, are permitted provided that the following conditions
! 22: * are met:
! 23: * 1. Redistributions of source code must retain the above copyright
! 24: * notice, this list of conditions and the following disclaimer.
! 25: * 2. Redistributions in binary form must reproduce the above copyright
! 26: * notice, this list of conditions and the following disclaimer in the
! 27: * documentation and/or other materials provided with the distribution.
! 28: * 3. Neither the name of the University nor the names of its contributors
! 29: * may be used to endorse or promote products derived from this software
! 30: * without specific prior written permission.
! 31: *
! 32: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
! 33: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 34: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 35: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
! 36: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 37: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 38: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 39: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 40: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 41: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 42: * SUCH DAMAGE.
! 43: *
! 44: * from @(#)cgthree.c 8.2 (Berkeley) 10/30/93
! 45: */
! 46:
! 47: /*
! 48: * color display (cgeight) driver.
! 49: *
! 50: * For performance reasons, we run the emulation mode in the (monochrome)
! 51: * overlay plane, but X11 in the 24-bit color plane.
! 52: *
! 53: * Does not handle interrupts, even though they can occur.
! 54: */
! 55:
! 56: #include <sys/param.h>
! 57: #include <sys/systm.h>
! 58: #include <sys/buf.h>
! 59: #include <sys/device.h>
! 60: #include <sys/ioctl.h>
! 61: #include <sys/malloc.h>
! 62: #include <sys/mman.h>
! 63: #include <sys/tty.h>
! 64: #include <sys/conf.h>
! 65:
! 66: #include <uvm/uvm_extern.h>
! 67:
! 68: #include <machine/autoconf.h>
! 69: #include <machine/pmap.h>
! 70: #include <machine/eeprom.h>
! 71: #include <machine/conf.h>
! 72:
! 73: #include <dev/wscons/wsconsio.h>
! 74: #include <dev/wscons/wsdisplayvar.h>
! 75: #include <dev/rasops/rasops.h>
! 76: #include <machine/fbvar.h>
! 77:
! 78: #include <sparc/dev/btreg.h>
! 79: #include <sparc/dev/btvar.h>
! 80: #include <sparc/dev/pfourreg.h>
! 81:
! 82: /* per-display variables */
! 83: struct cgeight_softc {
! 84: struct sunfb sc_sunfb; /* common base device */
! 85: struct rom_reg sc_phys;
! 86: volatile struct fbcontrol *sc_fbc; /* Brooktree registers */
! 87: volatile u_char *sc_enable; /* enable plane */
! 88: };
! 89:
! 90: int cgeight_ioctl(void *, u_long, caddr_t, int, struct proc *);
! 91: paddr_t cgeight_mmap(void *, off_t, int);
! 92: void cgeight_reset(struct cgeight_softc *, int);
! 93:
! 94: struct wsdisplay_accessops cgeight_accessops = {
! 95: cgeight_ioctl,
! 96: cgeight_mmap,
! 97: NULL, /* alloc_screen */
! 98: NULL, /* free_screen */
! 99: NULL, /* show_screen */
! 100: NULL, /* load_font */
! 101: NULL, /* scrollback */
! 102: NULL, /* getchar */
! 103: fb_pfour_burner,
! 104: NULL /* pollc */
! 105: };
! 106:
! 107: void cgeightattach(struct device *, struct device *, void *);
! 108: int cgeightmatch(struct device *, void *, void *);
! 109:
! 110: struct cfattach cgeight_ca = {
! 111: sizeof(struct cgeight_softc), cgeightmatch, cgeightattach
! 112: };
! 113:
! 114: struct cfdriver cgeight_cd = {
! 115: NULL, "cgeight", DV_DULL
! 116: };
! 117:
! 118: int
! 119: cgeightmatch(struct device *parent, void *vcf, void *aux)
! 120: {
! 121: struct cfdata *cf = vcf;
! 122: struct confargs *ca = aux;
! 123: struct romaux *ra = &ca->ca_ra;
! 124:
! 125: if (strcmp(cf->cf_driver->cd_name, ra->ra_name))
! 126: return (0);
! 127:
! 128: if (!CPU_ISSUN4 || ca->ca_bustype != BUS_OBIO)
! 129: return (0);
! 130:
! 131: /*
! 132: * Make sure there's hardware there.
! 133: */
! 134: if (probeget(ra->ra_vaddr, 4) == -1)
! 135: return (0);
! 136:
! 137: /*
! 138: * Check the pfour register.
! 139: */
! 140: if (fb_pfour_id(ra->ra_vaddr) == PFOUR_ID_COLOR24)
! 141: return (1);
! 142:
! 143: return (0);
! 144: }
! 145:
! 146: void
! 147: cgeightattach(struct device *parent, struct device *self, void *args)
! 148: {
! 149: struct cgeight_softc *sc = (struct cgeight_softc *)self;
! 150: struct confargs *ca = args;
! 151: int node = 0;
! 152: volatile struct bt_regs *bt;
! 153: int isconsole = 0;
! 154:
! 155: /* Map the pfour register. */
! 156: SET(sc->sc_sunfb.sf_flags, FB_PFOUR);
! 157: sc->sc_sunfb.sf_pfour = (volatile u_int32_t *)
! 158: mapiodev(ca->ca_ra.ra_reg, 0, sizeof(u_int32_t));
! 159:
! 160: if (cputyp == CPU_SUN4) {
! 161: struct eeprom *eep = (struct eeprom *)eeprom_va;
! 162:
! 163: /*
! 164: * Assume this is the console if there's no eeprom info
! 165: * to be found.
! 166: */
! 167: if (eep == NULL || eep->eeConsole == EE_CONS_P4OPT)
! 168: isconsole = 1;
! 169: }
! 170:
! 171: /* Map the Brooktree. */
! 172: sc->sc_fbc = (volatile struct fbcontrol *)
! 173: mapiodev(ca->ca_ra.ra_reg,
! 174: PFOUR_COLOR_OFF_CMAP, sizeof(struct fbcontrol));
! 175:
! 176: sc->sc_phys = ca->ca_ra.ra_reg[0];
! 177:
! 178: /* enable video */
! 179: fb_pfour_burner(sc, 1, 0);
! 180: bt = &sc->sc_fbc->fbc_dac;
! 181: BT_INIT(bt, 0);
! 182:
! 183: fb_setsize(&sc->sc_sunfb, 1, 1152, 900, node, ca->ca_bustype);
! 184: sc->sc_sunfb.sf_ro.ri_hw = sc;
! 185:
! 186: /*
! 187: * Map the overlay and overlay enable planes.
! 188: */
! 189: sc->sc_enable = (volatile u_char *)mapiodev(ca->ca_ra.ra_reg,
! 190: PFOUR_COLOR_OFF_ENABLE, round_page(sc->sc_sunfb.sf_fbsize));
! 191: sc->sc_sunfb.sf_ro.ri_bits = mapiodev(ca->ca_ra.ra_reg,
! 192: PFOUR_COLOR_OFF_OVERLAY, round_page(sc->sc_sunfb.sf_fbsize));
! 193:
! 194: cgeight_reset(sc, WSDISPLAYIO_MODE_EMUL);
! 195: fbwscons_init(&sc->sc_sunfb, isconsole ? 0 : RI_CLEAR);
! 196: printf(": p4, %dx%d", sc->sc_sunfb.sf_width,
! 197: sc->sc_sunfb.sf_height);
! 198:
! 199: if (isconsole) {
! 200: fbwscons_console_init(&sc->sc_sunfb, -1);
! 201: }
! 202:
! 203: fbwscons_attach(&sc->sc_sunfb, &cgeight_accessops, isconsole);
! 204: }
! 205:
! 206: void
! 207: cgeight_reset(struct cgeight_softc *sc, int mode)
! 208: {
! 209: volatile struct bt_regs *bt;
! 210: union bt_cmap cm;
! 211: u_int c;
! 212:
! 213: bt = &sc->sc_fbc->fbc_dac;
! 214:
! 215: /*
! 216: * Depending on the mode requested, disable or enable
! 217: * the overlay plane.
! 218: */
! 219: if (mode == WSDISPLAYIO_MODE_EMUL) {
! 220: memset((void *)sc->sc_enable, 0xff,
! 221: round_page(sc->sc_sunfb.sf_fbsize));
! 222:
! 223: /* Setup a strict mono colormap */
! 224: cm.cm_map[0][0] = cm.cm_map[0][1] = cm.cm_map[0][2] = 0x00;
! 225: for (c = 1; c < 256; c++) {
! 226: cm.cm_map[c][0] = cm.cm_map[c][1] = cm.cm_map[c][2] =
! 227: 0xff;
! 228: }
! 229: } else {
! 230: memset((void *)sc->sc_enable, 0x00,
! 231: round_page(sc->sc_sunfb.sf_fbsize));
! 232:
! 233: /* Setup a ramp colormap (direct color) */
! 234: for (c = 0; c < 256; c++) {
! 235: cm.cm_map[c][0] = cm.cm_map[c][1] = cm.cm_map[c][2] = c;
! 236: }
! 237: }
! 238:
! 239: /* Upload the colormap into the DAC */
! 240: bt_loadcmap(&cm, bt, 0, 256, 0);
! 241: }
! 242:
! 243: int
! 244: cgeight_ioctl(void *v, u_long cmd, caddr_t data, int flags, struct proc *p)
! 245: {
! 246: struct cgeight_softc *sc = v;
! 247: struct wsdisplay_fbinfo *wdf;
! 248:
! 249: switch (cmd) {
! 250: case WSDISPLAYIO_GTYPE:
! 251: *(u_int *)data = WSDISPLAY_TYPE_SUNCG8;
! 252: break;
! 253: case WSDISPLAYIO_GINFO:
! 254: wdf = (struct wsdisplay_fbinfo *)data;
! 255: wdf->height = sc->sc_sunfb.sf_height;
! 256: wdf->width = sc->sc_sunfb.sf_width;
! 257: wdf->depth = 24;
! 258: wdf->cmsize = 0;
! 259: break;
! 260: case WSDISPLAYIO_SMODE:
! 261: cgeight_reset(sc, *(int *)data);
! 262: break;
! 263: case WSDISPLAYIO_SVIDEO:
! 264: case WSDISPLAYIO_GVIDEO:
! 265: break;
! 266:
! 267: case WSDISPLAYIO_GETCMAP: /* nothing to do */
! 268: case WSDISPLAYIO_PUTCMAP: /* nothing to do */
! 269: case WSDISPLAYIO_GCURPOS: /* not supported */
! 270: case WSDISPLAYIO_SCURPOS: /* not supported */
! 271: case WSDISPLAYIO_GCURMAX: /* not supported */
! 272: case WSDISPLAYIO_GCURSOR: /* not supported */
! 273: case WSDISPLAYIO_SCURSOR: /* not supported */
! 274: default:
! 275: return (-1);
! 276: }
! 277:
! 278: return (0);
! 279: }
! 280:
! 281: paddr_t
! 282: cgeight_mmap(void *v, off_t offset, int prot)
! 283: {
! 284: struct cgeight_softc *sc = v;
! 285:
! 286: if (offset & PGOFSET)
! 287: return (-1);
! 288:
! 289: /* Allow mapping of the 24-bit color planes */
! 290: if (offset >= 0 && offset < round_page(24 * sc->sc_sunfb.sf_fbsize)) {
! 291: return (REG2PHYS(&sc->sc_phys,
! 292: offset + PFOUR_COLOR_OFF_COLOR) | PMAP_NC);
! 293: }
! 294:
! 295: return (-1);
! 296: }
CVSweb