pass flags from device close to l_close
[unix-history] / usr / src / sys / hp300 / dev / grf_dv.c
CommitLineData
60f56dfc
KM
1/*
2 * Copyright (c) 1988 University of Utah.
3 * Copyright (c) 1990 The Regents of the University of California.
4 * All rights reserved.
5 *
6 * This code is derived from software contributed to Berkeley by
7 * the Systems Programming Group of the University of Utah Computer
8 * Science Department.
9 *
10 * %sccs.include.redist.c%
11 *
16a027eb 12 * from: Utah $Hdr: grf_dv.c 1.10 91/04/02$
60f56dfc 13 *
16a027eb 14 * @(#)grf_dv.c 7.4 (Berkeley) %G%
60f56dfc
KM
15 */
16
17#include "grf.h"
18#if NGRF > 0
19
20/*
21 * Graphics routines for the DaVinci, HP98730/98731 Graphics system.
22 */
b28b3a13
KB
23#include "sys/param.h"
24#include "sys/errno.h"
60f56dfc
KM
25
26#include "grfioctl.h"
27#include "grfvar.h"
28#include "grf_dvreg.h"
29
b28b3a13 30#include "../include/cpu.h"
60f56dfc
KM
31
32/*
33 * Initialize hardware.
34 * Must point g_display at a grfinfo structure describing the hardware.
35 * Returns 0 if hardware not present, non-zero ow.
36 */
37dv_init(gp, addr)
38 struct grf_softc *gp;
16a027eb 39 caddr_t addr;
60f56dfc
KM
40{
41 register struct dvboxfb *dbp;
42 struct grfinfo *gi = &gp->g_display;
43 int fboff;
16a027eb 44 extern caddr_t sctopa(), iomap();
60f56dfc
KM
45
46 dbp = (struct dvboxfb *) addr;
16a027eb
MH
47 if (ISIIOVA(addr))
48 gi->gd_regaddr = (caddr_t) IIOP(addr);
49 else
50 gi->gd_regaddr = sctopa(vatosc(addr));
60f56dfc
KM
51 gi->gd_regsize = 0x20000;
52 gi->gd_fbwidth = (dbp->fbwmsb << 8) | dbp->fbwlsb;
53 gi->gd_fbheight = (dbp->fbhmsb << 8) | dbp->fbhlsb;
60f56dfc 54 gi->gd_fbsize = gi->gd_fbwidth * gi->gd_fbheight;
16a027eb
MH
55 fboff = (dbp->fbomsb << 8) | dbp->fbolsb;
56 gi->gd_fbaddr = (caddr_t) (*((u_char *)addr + fboff) << 16);
57 if (gi->gd_regaddr >= (caddr_t)DIOIIBASE) {
58 /*
59 * For DIO II space the fbaddr just computed is the offset
60 * from the select code base (regaddr) of the framebuffer.
61 * Hence it is also implicitly the size of the register set.
62 */
63 gi->gd_regsize = (int) gi->gd_fbaddr;
64 gi->gd_fbaddr += (int) gi->gd_regaddr;
65 gp->g_regkva = addr;
66 gp->g_fbkva = addr + gi->gd_regsize;
67 } else {
68 /*
69 * For DIO space we need to map the seperate framebuffer.
70 */
71 gp->g_regkva = addr;
72 gp->g_fbkva = iomap(gi->gd_fbaddr, gi->gd_fbsize);
73 }
60f56dfc
KM
74 gi->gd_dwidth = (dbp->dwmsb << 8) | dbp->dwlsb;
75 gi->gd_dheight = (dbp->dwmsb << 8) | dbp->dwlsb;
76 gi->gd_planes = 0; /* ?? */
77 gi->gd_colors = 256;
78
79 dv_reset(dbp);
80 return(1);
81}
82
83/*
84 * Magic code herein.
85 */
86dv_reset(dbp)
87 register struct dvboxfb *dbp;
88{
89 dbp->reset = 0x80;
90 DELAY(100);
91
92 dbp->interrupt = 0x04;
93 dbp->en_scan = 0x01;
94 dbp->fbwen = ~0;
95 dbp->opwen = ~0;
96 dbp->fold = 0x01;
97 dbp->drive = 0x01;
98 dbp->rep_rule = 0x33;
99 dbp->alt_rr = 0x33;
100 dbp->zrr = 0x33;
101
102 dbp->fbvenp = 0xFF;
103 dbp->dispen = 0x01;
104 dbp->fbvens = 0x0;
105 dbp->fv_trig = 0x01;
106 DELAY(100);
107 dbp->vdrive = 0x0;
108 dbp->zconfig = 0x0;
109
110 while (dbp->wbusy & 0x01)
111 DELAY(100);
112
113 dbp->cmapbank = 0;
114
115 dbp->red0 = 0;
116 dbp->red1 = 0;
117 dbp->green0 = 0;
118 dbp->green1 = 0;
119 dbp->blue0 = 0;
120 dbp->blue1 = 0;
121
122 dbp->panxh = 0;
123 dbp->panxl = 0;
124 dbp->panyh = 0;
125 dbp->panyl = 0;
126 dbp->zoom = 0;
127 dbp->cdwidth = 0x50;
128 dbp->chstart = 0x52;
129 dbp->cvwidth = 0x22;
130 dbp->pz_trig = 1;
131}
132
133/*
134 * Change the mode of the display.
135 * Right now all we can do is grfon/grfoff.
136 * Return a UNIX error number or 0 for success.
137 */
138dv_mode(gp, cmd)
139 register struct grf_softc *gp;
140{
141 register struct dvboxfb *dbp;
142 int error = 0;
143
16a027eb 144 dbp = (struct dvboxfb *) gp->g_regkva;
60f56dfc
KM
145 switch (cmd) {
146 case GM_GRFON:
147 dbp->dispen = 0x01;
148 break;
149 case GM_GRFOFF:
150 break;
151 case GM_GRFOVON:
152 dbp->opwen = 0xF;
153 dbp->drive = 0x10;
154 break;
155 case GM_GRFOVOFF:
156 dbp->opwen = 0;
157 dbp->drive = 0x01;
158 break;
159 default:
160 error = EINVAL;
161 break;
162 }
163 return(error);
164}
165
166#endif