xref: /original-bsd/sys/hp300/dev/grf_gb.c (revision aa8eeac8)
16df4657fSmckusick /*
26df4657fSmckusick  * Copyright (c) 1988 University of Utah.
39639f1d4Sbostic  * Copyright (c) 1990, 1993
49639f1d4Sbostic  *	The Regents of the University of California.  All rights reserved.
56df4657fSmckusick  *
66df4657fSmckusick  * This code is derived from software contributed to Berkeley by
76df4657fSmckusick  * the Systems Programming Group of the University of Utah Computer
86df4657fSmckusick  * Science Department.
96df4657fSmckusick  *
106df4657fSmckusick  * %sccs.include.redist.c%
116df4657fSmckusick  *
125dd6449fShibler  * from: Utah $Hdr: grf_gb.c 1.18 93/08/13$
136df4657fSmckusick  *
14*aa8eeac8Sbostic  *	@(#)grf_gb.c	8.4 (Berkeley) 01/12/94
156df4657fSmckusick  */
166df4657fSmckusick 
176df4657fSmckusick #include "grf.h"
186df4657fSmckusick #if NGRF > 0
196df4657fSmckusick 
206df4657fSmckusick /*
216df4657fSmckusick  * Graphics routines for the Gatorbox.
226df4657fSmckusick  *
236df4657fSmckusick  * Note: In the context of this system, "gator" and "gatorbox" both refer to
246df4657fSmckusick  *       HP 987x0 graphics systems.  "Gator" is not used for high res mono.
256df4657fSmckusick  *       (as in 9837 Gator systems)
266df4657fSmckusick  */
2730edb9b0Sbostic #include <sys/param.h>
2830edb9b0Sbostic #include <sys/errno.h>
296df4657fSmckusick 
3030edb9b0Sbostic #include <hp/dev/grfioctl.h>
3130edb9b0Sbostic #include <hp/dev/grfvar.h>
326df4657fSmckusick 
3330edb9b0Sbostic #include <hp300/dev/grf_gbreg.h>
3430edb9b0Sbostic #include <machine/cpu.h>
356df4657fSmckusick 
366df4657fSmckusick #define CRTC_DATA_LENGTH  0x0e
376df4657fSmckusick u_char crtc_init_data[CRTC_DATA_LENGTH] = {
386df4657fSmckusick     0x29, 0x20, 0x23, 0x04, 0x30, 0x0b, 0x30,
396df4657fSmckusick     0x30, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00
406df4657fSmckusick };
416df4657fSmckusick 
426df4657fSmckusick /*
436df4657fSmckusick  * Initialize hardware.
446df4657fSmckusick  * Must point g_display at a grfinfo structure describing the hardware.
456df4657fSmckusick  * Returns 0 if hardware not present, non-zero ow.
466df4657fSmckusick  */
476df4657fSmckusick gb_init(gp, addr)
486df4657fSmckusick 	struct grf_softc *gp;
495ceb2328Shibler 	caddr_t addr;
506df4657fSmckusick {
516df4657fSmckusick 	register struct gboxfb *gbp;
526df4657fSmckusick 	struct grfinfo *gi = &gp->g_display;
536df4657fSmckusick 	u_char *fbp, save;
546df4657fSmckusick 	int fboff;
555ceb2328Shibler 	extern caddr_t sctopa(), iomap();
566df4657fSmckusick 
576df4657fSmckusick 	gbp = (struct gboxfb *) addr;
585ceb2328Shibler 	if (ISIIOVA(addr))
595ceb2328Shibler 		gi->gd_regaddr = (caddr_t) IIOP(addr);
605ceb2328Shibler 	else
615ceb2328Shibler 		gi->gd_regaddr = sctopa(vatosc(addr));
626df4657fSmckusick 	gi->gd_regsize = 0x10000;
636df4657fSmckusick 	gi->gd_fbwidth = 1024;		/* XXX */
646df4657fSmckusick 	gi->gd_fbheight = 1024;		/* XXX */
656df4657fSmckusick 	gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight;
665ceb2328Shibler 	fboff = (gbp->fbomsb << 8) | gbp->fbolsb;
675ceb2328Shibler 	gi->gd_fbaddr = (caddr_t) (*((u_char *)addr + fboff) << 16);
685ceb2328Shibler 	gp->g_regkva = addr;
695ceb2328Shibler 	gp->g_fbkva = iomap(gi->gd_fbaddr, gi->gd_fbsize);
706df4657fSmckusick 	gi->gd_dwidth = 1024;		/* XXX */
716df4657fSmckusick 	gi->gd_dheight = 768;		/* XXX */
726df4657fSmckusick 	gi->gd_planes = 0;		/* how do we do this? */
736df4657fSmckusick 	/*
746df4657fSmckusick 	 * The minimal register info here is from the Gatorbox X driver.
756df4657fSmckusick 	 */
765ceb2328Shibler 	fbp = (u_char *) gp->g_fbkva;
776df4657fSmckusick 	gbp->write_protect = 0;
786df4657fSmckusick 	gbp->interrupt = 4;		/** fb_enable ? **/
796df4657fSmckusick 	gbp->rep_rule = 3;		/* GXcopy */
806df4657fSmckusick 	gbp->blink1 = 0xff;
816df4657fSmckusick 	gbp->blink2 = 0xff;
826df4657fSmckusick 
836df4657fSmckusick 	gb_microcode(gbp);
846df4657fSmckusick 
856df4657fSmckusick 	/*
866df4657fSmckusick 	 * Find out how many colors are available by determining
876df4657fSmckusick 	 * which planes are installed.  That is, write all ones to
886df4657fSmckusick 	 * a frame buffer location, see how many ones are read back.
896df4657fSmckusick 	 */
906df4657fSmckusick 	save = *fbp;
916df4657fSmckusick 	*fbp = 0xFF;
926df4657fSmckusick 	gi->gd_colors = *fbp + 1;
936df4657fSmckusick 	*fbp = save;
946df4657fSmckusick 	return(1);
956df4657fSmckusick }
966df4657fSmckusick 
976df4657fSmckusick /*
986df4657fSmckusick  * Program the 6845.
996df4657fSmckusick  */
gb_microcode(gbp)1006df4657fSmckusick gb_microcode(gbp)
1016df4657fSmckusick 	register struct gboxfb *gbp;
1026df4657fSmckusick {
1036df4657fSmckusick 	register int i;
1046df4657fSmckusick 
1056df4657fSmckusick 	for (i = 0; i < CRTC_DATA_LENGTH; i++) {
1066df4657fSmckusick 		gbp->crtc_address = i;
1076df4657fSmckusick 		gbp->crtc_data = crtc_init_data[i];
1086df4657fSmckusick 	}
1096df4657fSmckusick }
1106df4657fSmckusick 
1116df4657fSmckusick /*
1126df4657fSmckusick  * Change the mode of the display.
1136df4657fSmckusick  * Right now all we can do is grfon/grfoff.
1146df4657fSmckusick  * Return a UNIX error number or 0 for success.
1156df4657fSmckusick  */
gb_mode(gp,cmd,data)1165dd6449fShibler gb_mode(gp, cmd, data)
1176df4657fSmckusick 	register struct grf_softc *gp;
118*aa8eeac8Sbostic 	int cmd;
1195dd6449fShibler 	caddr_t data;
1206df4657fSmckusick {
1216df4657fSmckusick 	struct gboxfb *gbp;
1226df4657fSmckusick 	int error = 0;
1236df4657fSmckusick 
1245ceb2328Shibler 	gbp = (struct gboxfb *) gp->g_regkva;
1256df4657fSmckusick 	switch (cmd) {
1266df4657fSmckusick 	case GM_GRFON:
1276df4657fSmckusick 		gbp->sec_interrupt = 1;
1286df4657fSmckusick 		break;
1295dd6449fShibler 
1306df4657fSmckusick 	case GM_GRFOFF:
1316df4657fSmckusick 		break;
1325dd6449fShibler 
1335dd6449fShibler 	/*
1345dd6449fShibler 	 * Remember UVA of mapping for GCDESCRIBE.
1355dd6449fShibler 	 * XXX this should be per-process.
1365dd6449fShibler 	 */
1375dd6449fShibler 	case GM_MAP:
1385dd6449fShibler 		gp->g_data = data;
1395dd6449fShibler 		break;
1405dd6449fShibler 
1415dd6449fShibler 	case GM_UNMAP:
1425dd6449fShibler 		gp->g_data = 0;
1435dd6449fShibler 		break;
1445dd6449fShibler 
1455dd6449fShibler #ifdef HPUXCOMPAT
1465dd6449fShibler 	case GM_DESCRIBE:
1475dd6449fShibler 	{
1485dd6449fShibler 		struct grf_fbinfo *fi = (struct grf_fbinfo *)data;
1495dd6449fShibler 		struct grfinfo *gi = &gp->g_display;
150177da8ddSbostic 		int i;
1515dd6449fShibler 
1525dd6449fShibler 		/* feed it what HP-UX expects */
1535dd6449fShibler 		fi->id = gi->gd_id;
1545dd6449fShibler 		fi->mapsize = gi->gd_fbsize;
1555dd6449fShibler 		fi->dwidth = gi->gd_dwidth;
1565dd6449fShibler 		fi->dlength = gi->gd_dheight;
1575dd6449fShibler 		fi->width = gi->gd_fbwidth;
1585dd6449fShibler 		fi->length = gi->gd_fbheight;
1595dd6449fShibler 		fi->bpp = NBBY;
1605dd6449fShibler 		fi->xlen = (fi->width * fi->bpp) / NBBY;
1615dd6449fShibler 		fi->npl = gi->gd_planes;
1625dd6449fShibler 		fi->bppu = fi->npl;
1635dd6449fShibler 		fi->nplbytes = fi->xlen * ((fi->length * fi->bpp) / NBBY);
1645dd6449fShibler 		bcopy("HP98700", fi->name, 8);
1655dd6449fShibler 		fi->attr = 2;	/* HW block mover */
1665dd6449fShibler 		/*
1675dd6449fShibler 		 * If mapped, return the UVA where mapped.
1685dd6449fShibler 		 */
1695dd6449fShibler 		if (gp->g_data) {
1705dd6449fShibler 			fi->regbase = gp->g_data;
1715dd6449fShibler 			fi->fbbase = fi->regbase + gp->g_display.gd_regsize;
1725dd6449fShibler 		} else {
1735dd6449fShibler 			fi->fbbase = 0;
1745dd6449fShibler 			fi->regbase = 0;
1755dd6449fShibler 		}
1765dd6449fShibler 		for (i = 0; i < 6; i++)
1775dd6449fShibler 			fi->regions[i] = 0;
1785dd6449fShibler 		break;
1795dd6449fShibler 	}
1805dd6449fShibler #endif
1815dd6449fShibler 
1826df4657fSmckusick 	default:
1836df4657fSmckusick 		error = EINVAL;
1846df4657fSmckusick 		break;
1856df4657fSmckusick 	}
1866df4657fSmckusick 	return(error);
1876df4657fSmckusick }
1886df4657fSmckusick 
1896df4657fSmckusick #endif
190