Commit | Line | Data |
---|---|---|
60f56dfc KM |
1 | /* |
2 | * Copyright (c) 1988 University of Utah. | |
030a8056 KB |
3 | * Copyright (c) 1990, 1993 |
4 | * The Regents of the University of California. All rights reserved. | |
60f56dfc KM |
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 | * | |
6f16b9c3 | 12 | * from: Utah $Hdr: grf_dv.c 1.12 93/08/13$ |
60f56dfc | 13 | * |
2c0f281d | 14 | * @(#)grf_dv.c 8.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 | */ | |
38a01dbe KB |
23 | #include <sys/param.h> |
24 | #include <sys/errno.h> | |
60f56dfc | 25 | |
38a01dbe KB |
26 | #include <hp/dev/grfioctl.h> |
27 | #include <hp/dev/grfvar.h> | |
28 | #include <hp300/dev/grf_dvreg.h> | |
60f56dfc | 29 | |
38a01dbe | 30 | #include <machine/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 | */ | |
37 | dv_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 | */ | |
86 | dv_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 | */ | |
6f16b9c3 | 138 | dv_mode(gp, cmd, data) |
60f56dfc | 139 | register struct grf_softc *gp; |
2c0f281d | 140 | int cmd; |
6f16b9c3 | 141 | caddr_t data; |
60f56dfc KM |
142 | { |
143 | register struct dvboxfb *dbp; | |
144 | int error = 0; | |
145 | ||
16a027eb | 146 | dbp = (struct dvboxfb *) gp->g_regkva; |
60f56dfc KM |
147 | switch (cmd) { |
148 | case GM_GRFON: | |
149 | dbp->dispen = 0x01; | |
150 | break; | |
6f16b9c3 | 151 | |
60f56dfc KM |
152 | case GM_GRFOFF: |
153 | break; | |
6f16b9c3 | 154 | |
60f56dfc KM |
155 | case GM_GRFOVON: |
156 | dbp->opwen = 0xF; | |
157 | dbp->drive = 0x10; | |
158 | break; | |
6f16b9c3 | 159 | |
60f56dfc KM |
160 | case GM_GRFOVOFF: |
161 | dbp->opwen = 0; | |
162 | dbp->drive = 0x01; | |
163 | break; | |
6f16b9c3 MH |
164 | |
165 | /* | |
166 | * Remember UVA of mapping for GCDESCRIBE. | |
167 | * XXX this should be per-process. | |
168 | */ | |
169 | case GM_MAP: | |
170 | gp->g_data = data; | |
171 | break; | |
172 | ||
173 | case GM_UNMAP: | |
174 | gp->g_data = 0; | |
175 | break; | |
176 | ||
177 | #ifdef HPUXCOMPAT | |
178 | case GM_DESCRIBE: | |
179 | { | |
180 | struct grf_fbinfo *fi = (struct grf_fbinfo *)data; | |
181 | struct grfinfo *gi = &gp->g_display; | |
57ffde05 | 182 | int i; |
6f16b9c3 MH |
183 | |
184 | /* feed it what HP-UX expects */ | |
185 | fi->id = gi->gd_id; | |
186 | fi->mapsize = gi->gd_fbsize; | |
187 | fi->dwidth = gi->gd_dwidth; | |
188 | fi->dlength = gi->gd_dheight; | |
189 | fi->width = gi->gd_fbwidth; | |
190 | fi->length = gi->gd_fbheight; | |
191 | fi->bpp = NBBY; | |
192 | fi->xlen = (fi->width * fi->bpp) / NBBY; | |
193 | fi->npl = gi->gd_planes; | |
194 | fi->bppu = fi->npl; | |
195 | fi->nplbytes = fi->xlen * ((fi->length * fi->bpp) / NBBY); | |
196 | bcopy("HP98730", fi->name, 8); | |
197 | fi->attr = 2; /* HW block mover */ | |
198 | /* | |
199 | * If mapped, return the UVA where mapped. | |
200 | */ | |
201 | if (gp->g_data) { | |
202 | fi->regbase = gp->g_data; | |
203 | fi->fbbase = fi->regbase + gp->g_display.gd_regsize; | |
204 | } else { | |
205 | fi->fbbase = 0; | |
206 | fi->regbase = 0; | |
207 | } | |
208 | for (i = 0; i < 6; i++) | |
209 | fi->regions[i] = 0; | |
210 | break; | |
211 | } | |
212 | #endif | |
213 | ||
60f56dfc KM |
214 | default: |
215 | error = EINVAL; | |
216 | break; | |
217 | } | |
218 | return(error); | |
219 | } | |
220 | ||
221 | #endif |