diff options
Diffstat (limited to 'sys/arch/sun3/dev/cg4.c')
-rw-r--r-- | sys/arch/sun3/dev/cg4.c | 624 |
1 files changed, 0 insertions, 624 deletions
diff --git a/sys/arch/sun3/dev/cg4.c b/sys/arch/sun3/dev/cg4.c deleted file mode 100644 index 3b04679854d..00000000000 --- a/sys/arch/sun3/dev/cg4.c +++ /dev/null @@ -1,624 +0,0 @@ -/* $OpenBSD: cg4.c,v 1.12 2002/08/02 16:13:07 millert Exp $ */ -/* $NetBSD: cg4.c,v 1.11 1996/10/29 19:54:19 gwr Exp $ */ - -/* - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This software was developed by the Computer Systems Engineering group - * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and - * contributed to Berkeley. - * - * 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, Lawrence Berkeley Laboratory. - * - * 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. - * - * 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. - * - * from: @(#)cgthree.c 8.2 (Berkeley) 10/30/93 - */ - -/* - * color display (cg4) driver. - * - * Credits, history: - * Gordon Ross created this driver based on the cg3 driver from - * the sparc port as distributed in BSD 4.4 Lite, but included - * support for only the "type B" adapter (Brooktree DACs). - * Ezra Story added support for the "type A" (AMD DACs). - * - * Todo: - * Make this driver handle video interrupts. - * Defer colormap updates to vertical retrace interrupts. - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/device.h> -#include <sys/ioctl.h> -#include <sys/malloc.h> -#include <sys/mman.h> -#include <sys/tty.h> -#include <sys/conf.h> - -#include <uvm/uvm_extern.h> - -#include <machine/conf.h> -#include <machine/cpu.h> -#include <machine/fbio.h> -#include <machine/autoconf.h> -#include <machine/pmap.h> - -#include "fbvar.h" -#include "btreg.h" -#include "btvar.h" -#include "cg4reg.h" - -#define CG4_MMAP_SIZE (CG4_OVERLAY_SIZE + CG4_ENABLE_SIZE + CG4_PIXMAP_SIZE) - -extern unsigned char cpu_machine_id; - -#define CMAP_SIZE 256 -struct soft_cmap { - u_char r[CMAP_SIZE]; - u_char g[CMAP_SIZE]; - u_char b[CMAP_SIZE]; -}; - -/* per-display variables */ -struct cg4_softc { - struct device sc_dev; /* base device */ - struct fbdevice sc_fb; /* frame buffer device */ - int sc_cg4type; /* A or B */ - void *sc_va_cmap; /* Colormap h/w (mapped KVA) */ - int sc_pa_overlay; /* phys. addr. of overlay plane */ - int sc_pa_enable; /* phys. addr. of enable plane */ - int sc_pa_pixmap; /* phys. addr. of color plane */ - int sc_blanked; /* true if blanked */ - - union bt_cmap *sc_btcm; /* Brooktree color map */ - struct soft_cmap sc_cmap; /* Generic soft colormap. */ -}; - -/* autoconfiguration driver */ -static void cg4attach(struct device *, struct device *, void *); -static int cg4match(struct device *, void *, void *); - -struct cfattach cgfour_ca = { - sizeof(struct cg4_softc), cg4match, cg4attach -}; - -struct cfdriver cgfour_cd = { - NULL, "cgfour", DV_DULL -}; - -/* frame buffer generic driver */ - -static int cg4gattr(struct fbdevice *, struct fbgattr *); -static int cg4gvideo(struct fbdevice *, int *); -static int cg4svideo(struct fbdevice *, int *); -static int cg4getcmap(struct fbdevice *, struct fbcmap *); -static int cg4putcmap(struct fbdevice *, struct fbcmap *); - -static void cg4a_init(struct cg4_softc *); -static void cg4a_svideo(struct cg4_softc *, int); -static void cg4a_ldcmap(struct cg4_softc *); - -static void cg4b_init(struct cg4_softc *); -static void cg4b_svideo(struct cg4_softc *, int); -static void cg4b_ldcmap(struct cg4_softc *); - -static struct fbdriver cg4_fbdriver = { - cg4open, cg4close, cg4mmap, cg4gattr, - cg4gvideo, cg4svideo, - cg4getcmap, cg4putcmap -}; - -/* - * Match a cg4. - */ -static int -cg4match(parent, vcf, args) - struct device *parent; - void *vcf, *args; -{ - struct confargs *ca = args; - int paddr; - - /* XXX: Huge hack due to lack of probe info... */ - /* XXX: Machines that might have a cg4 (gag). */ - /* XXX: Need info on the "P4" register... */ - switch (cpu_machine_id) { - - case SUN3_MACH_110: - /* XXX: Assume type A. */ - if (ca->ca_paddr == -1) - ca->ca_paddr = CG4A_DEF_BASE; - if (bus_peek(ca->ca_bustype, ca->ca_paddr, 1) == -1) - return (0); - if (bus_peek(BUS_OBIO, CG4A_OBIO_CMAP, 1) == -1) - return (0); - break; - - case SUN3_MACH_60: - /* XXX: Assume type A. */ - if (ca->ca_paddr == -1) - ca->ca_paddr = CG4B_DEF_BASE; - paddr = ca->ca_paddr; - if (bus_peek(ca->ca_bustype, paddr, 1) == -1) - return (0); - /* Make sure we're color */ - paddr += CG4B_OFF_PIXMAP; - if (bus_peek(ca->ca_bustype, paddr, 1) == -1) - return (0); - break; - - default: - return (0); - } - - return (1); -} - -/* - * Attach a display. We need to notice if it is the console, too. - */ -static void -cg4attach(parent, self, args) - struct device *parent, *self; - void *args; -{ - struct cg4_softc *sc = (struct cg4_softc *)self; - struct fbdevice *fb = &sc->sc_fb; - struct confargs *ca = args; - struct fbtype *fbt; - - /* XXX: should do better than this... */ - switch (cpu_machine_id) { - case SUN3_MACH_110: - sc->sc_cg4type = CG4_TYPE_A; - break; - case SUN3_MACH_60: - default: - sc->sc_cg4type = CG4_TYPE_B; - } - - fb->fb_driver = &cg4_fbdriver; - fb->fb_private = sc; - fb->fb_name = sc->sc_dev.dv_xname; - - fbt = &fb->fb_fbtype; - fbt->fb_type = FBTYPE_SUN4COLOR; - fbt->fb_depth = 8; - fbt->fb_cmsize = 256; - - fbt->fb_width = 1152; - fbt->fb_height = 900; - fbt->fb_size = CG4_MMAP_SIZE; - - switch (sc->sc_cg4type) { - case CG4_TYPE_A: /* Sun3/110 */ - sc->sc_va_cmap = bus_mapin(BUS_OBIO, CG4A_OBIO_CMAP, - sizeof(struct amd_regs)); - sc->sc_pa_overlay = ca->ca_paddr + CG4A_OFF_OVERLAY; - sc->sc_pa_enable = ca->ca_paddr + CG4A_OFF_ENABLE; - sc->sc_pa_pixmap = ca->ca_paddr + CG4A_OFF_PIXMAP; - sc->sc_btcm = NULL; - cg4a_init(sc); - break; - - case CG4_TYPE_B: /* Sun3/60 */ - default: - sc->sc_va_cmap = (struct bt_regs *) - bus_mapin(ca->ca_bustype, ca->ca_paddr, - sizeof(struct bt_regs *)); - sc->sc_pa_overlay = ca->ca_paddr + CG4B_OFF_OVERLAY; - sc->sc_pa_enable = ca->ca_paddr + CG4B_OFF_ENABLE; - sc->sc_pa_pixmap = ca->ca_paddr + CG4B_OFF_PIXMAP; - sc->sc_btcm = malloc(sizeof(union bt_cmap), M_DEVBUF, M_WAITOK); - cg4b_init(sc); - break; - } - - printf(" (%dx%d)\n", fbt->fb_width, fbt->fb_height); - fb_attach(fb, 4); -} - -int -cg4open(dev, flags, mode, p) - dev_t dev; - int flags, mode; - struct proc *p; -{ - int unit = minor(dev); - - if (unit >= cgfour_cd.cd_ndevs || cgfour_cd.cd_devs[unit] == NULL) - return (ENXIO); - return (0); -} - -int -cg4close(dev, flags, mode, p) - dev_t dev; - int flags, mode; - struct proc *p; -{ - - return (0); -} - -int -cg4ioctl(dev, cmd, data, flags, p) - dev_t dev; - u_long cmd; - caddr_t data; - int flags; - struct proc *p; -{ - struct cg4_softc *sc = cgfour_cd.cd_devs[minor(dev)]; - - return (fbioctlfb(&sc->sc_fb, cmd, data)); -} - -/* - * Return the address that would map the given device at the given - * offset, allowing for the given protection, or return -1 for error. - * - * X11 expects its mmap'd region to look like this: - * 128k overlay data memory - * 128k overlay enable bitmap - * 1024k color memory - * - * The hardware really looks like this (starting at ca_paddr) - * 4 bytes Brooktree DAC registers - * 2MB-4 gap - * 128k overlay memory - * 1920k gap - * 128k overlay-enable bitmap - * 1920k gap - * 1024k color memory - */ -paddr_t -cg4mmap(dev, off, prot) - dev_t dev; - off_t off; - int prot; -{ - struct cg4_softc *sc = cgfour_cd.cd_devs[minor(dev)]; - register int physbase; - - if (off & PGOFSET) - panic("cg4mmap"); - - if ((unsigned)off >= CG4_MMAP_SIZE) - return (-1); - - if (off < 0x40000) { - if (off < 0x20000) { - physbase = sc->sc_pa_overlay; - } else { - /* enable plane */ - off -= 0x20000; - physbase = sc->sc_pa_enable; - } - } else { - /* pixel map */ - off -= 0x40000; - physbase = sc->sc_pa_pixmap; - } - - /* - * I turned on PMAP_NC here to disable the cache as I was - * getting horribly broken behaviour with it on. - */ - return ((physbase + off) | PMAP_NC); -} - -/* - * Internal ioctl functions. - */ - -/* FBIOGATTR: */ -static int -cg4gattr(fb, fba) - struct fbdevice *fb; - struct fbgattr *fba; -{ - - fba->real_type = fb->fb_fbtype.fb_type; - fba->owner = 0; /* XXX - TIOCCONS stuff? */ - fba->fbtype = fb->fb_fbtype; - fba->sattr.flags = 0; - fba->sattr.emu_type = fb->fb_fbtype.fb_type; - fba->sattr.dev_specific[0] = -1; - fba->emu_types[0] = fb->fb_fbtype.fb_type; - fba->emu_types[1] = -1; - return (0); -} - -/* FBIOGVIDEO: */ -static int -cg4gvideo(fb, on) - struct fbdevice *fb; - int *on; -{ - struct cg4_softc *sc = fb->fb_private; - - *on = !sc->sc_blanked; - return (0); -} - -/* FBIOSVIDEO: */ -static int -cg4svideo(fb, on) - struct fbdevice *fb; - int *on; -{ - struct cg4_softc *sc = fb->fb_private; - int state; - - state = *on; - if (sc->sc_cg4type == CG4_TYPE_A) - cg4a_svideo(sc, state); - else - cg4b_svideo(sc, state); - return (0); -} - -/* - * FBIOGETCMAP: - * Copy current colormap out to user space. - */ -static int -cg4getcmap(fb, fbcm) - struct fbdevice *fb; - struct fbcmap *fbcm; -{ - struct cg4_softc *sc = fb->fb_private; - struct soft_cmap *cm = &sc->sc_cmap; - u_int start, count; - int error; - - start = fbcm->index; - count = fbcm->count; - if (start >= CMAP_SIZE || count > CMAP_SIZE - start) - return (EINVAL); - - if ((error = copyout(&cm->r[start], fbcm->red, count)) != 0) - return (error); - - if ((error = copyout(&cm->g[start], fbcm->green, count)) != 0) - return (error); - - if ((error = copyout(&cm->b[start], fbcm->blue, count)) != 0) - return (error); - - return (0); -} - -/* - * FBIOPUTCMAP: - * Copy new colormap from user space and load. - */ -static int -cg4putcmap(fb, fbcm) - struct fbdevice *fb; - struct fbcmap *fbcm; -{ - struct cg4_softc *sc = fb->fb_private; - struct soft_cmap *cm = &sc->sc_cmap; - u_int start, count; - int error; - - start = fbcm->index; - count = fbcm->count; - if (start >= CMAP_SIZE || count > CMAP_SIZE - start) - return (EINVAL); - - if ((error = copyin(fbcm->red, &cm->r[start], count)) != 0) - return (error); - - if ((error = copyin(fbcm->green, &cm->g[start], count)) != 0) - return (error); - - if ((error = copyin(fbcm->blue, &cm->b[start], count)) != 0) - return (error); - - if (sc->sc_cg4type == CG4_TYPE_A) - cg4a_ldcmap(sc); - else - cg4b_ldcmap(sc); - - return (0); -} - -/**************************************************************** - * Routines for the "Type A" hardware - ****************************************************************/ - -static void -cg4a_init(sc) - struct cg4_softc *sc; -{ - volatile struct amd_regs *ar = sc->sc_va_cmap; - struct soft_cmap *cm = &sc->sc_cmap; - int i; - - /* grab initial (current) color map */ - for(i = 0; i < 256; i++) { - cm->r[i] = ar->r[i]; - cm->g[i] = ar->g[i]; - cm->b[i] = ar->b[i]; - } -} - -static void -cg4a_ldcmap(sc) - struct cg4_softc *sc; -{ - volatile struct amd_regs *ar = sc->sc_va_cmap; - struct soft_cmap *cm = &sc->sc_cmap; - int i; - - /* - * Now blast them into the chip! - * XXX Should use retrace interrupt! - * Just set a "need load" bit and let the - * retrace interrupt handler do the work. - */ - for(i = 0; i < 256; i++) { - ar->r[i] = cm->r[i]; - ar->g[i] = cm->g[i]; - ar->b[i] = cm->b[i]; - } -} - -static void -cg4a_svideo(sc, on) - struct cg4_softc *sc; - int on; -{ - volatile struct amd_regs *ar = sc->sc_va_cmap; - int i; - - if ((on == 0) && (sc->sc_blanked == 0)) { - /* Turn OFF video (make it blank). */ - sc->sc_blanked = 1; - /* Load fake "all zero" colormap. */ - for (i = 0; i < 256; i++) { - ar->r[i] = 0; - ar->g[i] = 0; - ar->b[i] = 0; - } - } - - if ((on != 0) && (sc->sc_blanked != 0)) { - /* Turn video back ON (unblank). */ - sc->sc_blanked = 0; - /* Restore normal colormap. */ - cg4a_ldcmap(sc); - } -} - - -/**************************************************************** - * Routines for the "Type B" hardware - ****************************************************************/ - -static void -cg4b_init(sc) - struct cg4_softc *sc; -{ - volatile struct bt_regs *bt = sc->sc_va_cmap; - struct soft_cmap *cm = &sc->sc_cmap; - union bt_cmap *btcm = sc->sc_btcm; - int i; - - /* - * BT458 chip initialization as described in Brooktree's - * 1993 Graphics and Imaging Product Databook (DB004-1/93). - */ - bt->bt_addr = 0x04; /* select read mask register */ - bt->bt_ctrl = 0xff; /* all planes on */ - bt->bt_addr = 0x05; /* select blink mask register */ - bt->bt_ctrl = 0x00; /* all planes non-blinking */ - bt->bt_addr = 0x06; /* select command register */ - bt->bt_ctrl = 0x43; /* palette enabled, overlay planes enabled */ - bt->bt_addr = 0x07; /* select test register */ - bt->bt_ctrl = 0x00; /* set test mode */ - - /* grab initial (current) color map */ - bt->bt_addr = 0; - for (i = 0; i < (256 * 3 / 4); i++) { - btcm->cm_chip[i] = bt->bt_cmap; - } - - /* Transpose into S/W form. */ - for (i = 0; i < 256; i++) { - cm->r[i] = btcm->cm_map[i][0]; - cm->g[i] = btcm->cm_map[i][1]; - cm->b[i] = btcm->cm_map[i][2]; - } -} - -static void -cg4b_ldcmap(sc) - struct cg4_softc *sc; -{ - volatile struct bt_regs *bt = sc->sc_va_cmap; - struct soft_cmap *cm = &sc->sc_cmap; - union bt_cmap *btcm = sc->sc_btcm; - int i; - - /* - * Now blast them into the chip! - * XXX Should use retrace interrupt! - * Just set a "need load" bit and let the - * retrace interrupt handler do the work. - */ - - /* Transpose into H/W form. */ - for (i = 0; i < 256; i++) { - btcm->cm_map[i][0] = cm->r[i]; - btcm->cm_map[i][1] = cm->g[i]; - btcm->cm_map[i][2] = cm->b[i]; - } - - bt->bt_addr = 0; - for (i = 0; i < (256 * 3 / 4); i++) { - bt->bt_cmap = btcm->cm_chip[i]; - } -} - -static void -cg4b_svideo(sc, on) - struct cg4_softc *sc; - int on; -{ - volatile struct bt_regs *bt = sc->sc_va_cmap; - int i; - - if ((on == 0) && (sc->sc_blanked == 0)) { - /* Turn OFF video (make it blank). */ - sc->sc_blanked = 1; - /* Load fake "all zero" colormap. */ - bt->bt_addr = 0; - for (i = 0; i < (256 * 3 / 4); i++) - bt->bt_cmap = 0; - } - - if ((on != 0) && (sc->sc_blanked != 0)) { - /* Turn video back ON (unblank). */ - sc->sc_blanked = 0; - /* Restore normal colormap. */ - cg4b_ldcmap(sc); - } -} - |