grtwo.c revision 1.4.2.5 1 1.4.2.5 skrll /* $NetBSD: grtwo.c,v 1.4.2.5 2004/10/19 15:56:38 skrll Exp $ */
2 1.4.2.2 skrll
3 1.4.2.2 skrll /*
4 1.4.2.2 skrll * Copyright (c) 2004 Christopher SEKIYA
5 1.4.2.2 skrll * All rights reserved.
6 1.4.2.2 skrll *
7 1.4.2.2 skrll * Redistribution and use in source and binary forms, with or without
8 1.4.2.2 skrll * modification, are permitted provided that the following conditions
9 1.4.2.2 skrll * are met:
10 1.4.2.2 skrll * 1. Redistributions of source code must retain the above copyright
11 1.4.2.2 skrll * notice, this list of conditions and the following disclaimer.
12 1.4.2.2 skrll * 2. Redistributions in binary form must reproduce the above copyright
13 1.4.2.2 skrll * notice, this list of conditions and the following disclaimer in the
14 1.4.2.2 skrll * documentation and/or other materials provided with the distribution.
15 1.4.2.2 skrll * 3. The name of the author may not be used to endorse or promote products
16 1.4.2.2 skrll * derived from this software without specific prior written permission.
17 1.4.2.2 skrll *
18 1.4.2.2 skrll * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 1.4.2.2 skrll * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 1.4.2.2 skrll * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 1.4.2.2 skrll * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 1.4.2.2 skrll * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 1.4.2.2 skrll * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 1.4.2.2 skrll * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 1.4.2.2 skrll * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 1.4.2.2 skrll * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 1.4.2.2 skrll * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 1.4.2.2 skrll *
29 1.4.2.2 skrll * <<Id: LICENSE_GC,v 1.1 2001/10/01 23:24:05 cgd Exp>>
30 1.4.2.2 skrll */
31 1.4.2.2 skrll
32 1.4.2.2 skrll /* wscons driver for SGI GR2 family of framebuffers
33 1.4.2.2 skrll *
34 1.4.2.2 skrll * Heavily based on the newport wscons driver.
35 1.4.2.2 skrll */
36 1.4.2.2 skrll
37 1.4.2.2 skrll #include <sys/cdefs.h>
38 1.4.2.5 skrll __KERNEL_RCSID(0, "$NetBSD: grtwo.c,v 1.4.2.5 2004/10/19 15:56:38 skrll Exp $");
39 1.4.2.2 skrll
40 1.4.2.2 skrll #include <sys/param.h>
41 1.4.2.2 skrll #include <sys/systm.h>
42 1.4.2.2 skrll #include <sys/device.h>
43 1.4.2.2 skrll #include <sys/malloc.h>
44 1.4.2.2 skrll
45 1.4.2.2 skrll #include <dev/wscons/wsconsio.h>
46 1.4.2.2 skrll #include <dev/wscons/wsdisplayvar.h>
47 1.4.2.2 skrll #include <dev/wsfont/wsfont.h>
48 1.4.2.2 skrll
49 1.4.2.2 skrll #include <sgimips/gio/giovar.h>
50 1.4.2.2 skrll #include <sgimips/gio/grtwovar.h>
51 1.4.2.2 skrll #include <sgimips/gio/grtworeg.h>
52 1.4.2.2 skrll
53 1.4.2.2 skrll #include <sgimips/dev/int2var.h>
54 1.4.2.2 skrll
55 1.4.2.2 skrll struct grtwo_softc {
56 1.4.2.2 skrll struct device sc_dev;
57 1.4.2.2 skrll
58 1.4.2.2 skrll struct grtwo_devconfig *sc_dc;
59 1.4.2.2 skrll };
60 1.4.2.2 skrll
61 1.4.2.2 skrll struct grtwo_devconfig {
62 1.4.2.2 skrll u_int32_t dc_addr;
63 1.4.2.2 skrll
64 1.4.2.2 skrll bus_space_tag_t iot;
65 1.4.2.2 skrll bus_space_handle_t ioh;
66 1.4.2.2 skrll
67 1.4.2.2 skrll u_int8_t boardrev;
68 1.4.2.2 skrll u_int8_t backendrev;
69 1.4.2.2 skrll int hq2rev;
70 1.4.2.2 skrll int ge7rev;
71 1.4.2.2 skrll int vc1rev;
72 1.4.2.2 skrll int zbuffer;
73 1.4.2.2 skrll int cmaprev;
74 1.4.2.2 skrll int xmaprev;
75 1.4.2.2 skrll int rexrev;
76 1.4.2.2 skrll int xres;
77 1.4.2.2 skrll int yres;
78 1.4.2.2 skrll int depth;
79 1.4.2.2 skrll int monitor;
80 1.4.2.2 skrll
81 1.4.2.2 skrll int dc_font;
82 1.4.2.2 skrll struct wsdisplay_font *dc_fontdata;
83 1.4.2.2 skrll };
84 1.4.2.2 skrll
85 1.4.2.2 skrll static int grtwo_match(struct device *, struct cfdata *, void *);
86 1.4.2.2 skrll static void grtwo_attach(struct device *, struct device *, void *);
87 1.4.2.2 skrll
88 1.4.2.2 skrll CFATTACH_DECL(grtwo, sizeof(struct grtwo_softc),
89 1.4.2.2 skrll grtwo_match, grtwo_attach, NULL, NULL);
90 1.4.2.2 skrll
91 1.4.2.2 skrll /* textops */
92 1.4.2.2 skrll static void grtwo_cursor(void *, int, int, int);
93 1.4.2.2 skrll static int grtwo_mapchar(void *, int, unsigned int *);
94 1.4.2.2 skrll static void grtwo_putchar(void *, int, int, u_int, long);
95 1.4.2.2 skrll static void grtwo_copycols(void *, int, int, int, int);
96 1.4.2.2 skrll static void grtwo_erasecols(void *, int, int, int, long);
97 1.4.2.2 skrll static void grtwo_copyrows(void *, int, int, int);
98 1.4.2.2 skrll static void grtwo_eraserows(void *, int, int, long);
99 1.4.2.2 skrll static int grtwo_allocattr(void *, int, int, int, long *);
100 1.4.2.2 skrll
101 1.4.2.2 skrll /* accessops */
102 1.4.2.2 skrll static int grtwo_ioctl(void *, u_long, caddr_t, int, struct proc *);
103 1.4.2.2 skrll static paddr_t grtwo_mmap(void *, off_t, int);
104 1.4.2.2 skrll static int
105 1.4.2.2 skrll grtwo_alloc_screen(void *, const struct wsscreen_descr *,
106 1.4.2.2 skrll void **, int *, int *, long *);
107 1.4.2.2 skrll static void grtwo_free_screen(void *, void *);
108 1.4.2.2 skrll static int
109 1.4.2.2 skrll grtwo_show_screen(void *, void *, int, void (*) (void *, int, int), void *);
110 1.4.2.2 skrll
111 1.4.2.2 skrll static int grtwo_intr0(void *);
112 1.4.2.2 skrll static int grtwo_intr6(void *);
113 1.4.2.2 skrll
114 1.4.2.2 skrll static const struct wsdisplay_emulops grtwo_textops = {
115 1.4.2.2 skrll .cursor = grtwo_cursor,
116 1.4.2.2 skrll .mapchar = grtwo_mapchar,
117 1.4.2.2 skrll .putchar = grtwo_putchar,
118 1.4.2.2 skrll .copycols = grtwo_copycols,
119 1.4.2.2 skrll .erasecols = grtwo_erasecols,
120 1.4.2.2 skrll .copyrows = grtwo_copyrows,
121 1.4.2.2 skrll .eraserows = grtwo_eraserows,
122 1.4.2.2 skrll .allocattr = grtwo_allocattr
123 1.4.2.2 skrll };
124 1.4.2.2 skrll
125 1.4.2.2 skrll static const struct wsdisplay_accessops grtwo_accessops = {
126 1.4.2.2 skrll .ioctl = grtwo_ioctl,
127 1.4.2.2 skrll .mmap = grtwo_mmap,
128 1.4.2.2 skrll .alloc_screen = grtwo_alloc_screen,
129 1.4.2.2 skrll .free_screen = grtwo_free_screen,
130 1.4.2.2 skrll .show_screen = grtwo_show_screen,
131 1.4.2.2 skrll };
132 1.4.2.2 skrll
133 1.4.2.2 skrll static const struct wsscreen_descr grtwo_screen = {
134 1.4.2.2 skrll .name = "1280x1024",
135 1.4.2.2 skrll .ncols = 160,
136 1.4.2.2 skrll .nrows = 64, /* 40 */
137 1.4.2.2 skrll .textops = &grtwo_textops,
138 1.4.2.2 skrll .fontwidth = 8,
139 1.4.2.2 skrll .fontheight = 16,
140 1.4.2.2 skrll .capabilities = WSSCREEN_WSCOLORS | WSSCREEN_HILIT | WSSCREEN_REVERSE
141 1.4.2.2 skrll };
142 1.4.2.2 skrll
143 1.4.2.2 skrll static const struct wsscreen_descr *_grtwo_screenlist[] = {
144 1.4.2.2 skrll &grtwo_screen
145 1.4.2.2 skrll };
146 1.4.2.2 skrll
147 1.4.2.2 skrll static const struct wsscreen_list grtwo_screenlist = {
148 1.4.2.2 skrll sizeof(_grtwo_screenlist) / sizeof(struct wsscreen_descr *),
149 1.4.2.2 skrll _grtwo_screenlist
150 1.4.2.2 skrll };
151 1.4.2.2 skrll
152 1.4.2.2 skrll static struct grtwo_devconfig grtwo_console_dc;
153 1.4.2.2 skrll static int grtwo_is_console = 0;
154 1.4.2.2 skrll
155 1.4.2.2 skrll #define GR2_ATTR_ENCODE(fg,bg) (((fg) << 8) | (bg))
156 1.4.2.2 skrll #define GR2_ATTR_BG(a) ((a) & 0xff)
157 1.4.2.2 skrll #define GR2_ATTR_FG(a) (((a) >> 8) & 0xff)
158 1.4.2.2 skrll
159 1.4.2.2 skrll static const u_int16_t grtwo_cursor_data[128] = {
160 1.4.2.2 skrll /* Bit 0 */
161 1.4.2.2 skrll 0xff00, 0x0000,
162 1.4.2.2 skrll 0xff00, 0x0000,
163 1.4.2.2 skrll 0xff00, 0x0000,
164 1.4.2.2 skrll 0xff00, 0x0000,
165 1.4.2.2 skrll 0xff00, 0x0000,
166 1.4.2.2 skrll 0xff00, 0x0000,
167 1.4.2.2 skrll 0xff00, 0x0000,
168 1.4.2.2 skrll 0xff00, 0x0000,
169 1.4.2.2 skrll 0xff00, 0x0000,
170 1.4.2.2 skrll 0xff00, 0x0000,
171 1.4.2.2 skrll 0xff00, 0x0000,
172 1.4.2.2 skrll 0xff00, 0x0000,
173 1.4.2.2 skrll 0xff00, 0x0000,
174 1.4.2.2 skrll 0xff00, 0x0000,
175 1.4.2.2 skrll 0xff00, 0x0000,
176 1.4.2.2 skrll 0xff00, 0x0000,
177 1.4.2.2 skrll 0x0000, 0x0000,
178 1.4.2.2 skrll 0x0000, 0x0000,
179 1.4.2.2 skrll 0x0000, 0x0000,
180 1.4.2.2 skrll 0x0000, 0x0000,
181 1.4.2.2 skrll 0x0000, 0x0000,
182 1.4.2.2 skrll 0x0000, 0x0000,
183 1.4.2.2 skrll 0x0000, 0x0000,
184 1.4.2.2 skrll 0x0000, 0x0000,
185 1.4.2.2 skrll 0x0000, 0x0000,
186 1.4.2.2 skrll 0x0000, 0x0000,
187 1.4.2.2 skrll 0x0000, 0x0000,
188 1.4.2.2 skrll 0x0000, 0x0000,
189 1.4.2.2 skrll 0x0000, 0x0000,
190 1.4.2.2 skrll 0x0000, 0x0000,
191 1.4.2.2 skrll 0x0000, 0x0000,
192 1.4.2.2 skrll 0x0000, 0x0000,
193 1.4.2.2 skrll
194 1.4.2.2 skrll /* Bit 1 */
195 1.4.2.2 skrll 0x0000, 0x0000,
196 1.4.2.2 skrll 0x0000, 0x0000,
197 1.4.2.2 skrll 0x0000, 0x0000,
198 1.4.2.2 skrll 0x0000, 0x0000,
199 1.4.2.2 skrll 0x0000, 0x0000,
200 1.4.2.2 skrll 0x0000, 0x0000,
201 1.4.2.2 skrll 0x0000, 0x0000,
202 1.4.2.2 skrll 0x0000, 0x0000,
203 1.4.2.2 skrll 0x0000, 0x0000,
204 1.4.2.2 skrll 0x0000, 0x0000,
205 1.4.2.2 skrll 0x0000, 0x0000,
206 1.4.2.2 skrll 0x0000, 0x0000,
207 1.4.2.2 skrll 0x0000, 0x0000,
208 1.4.2.2 skrll 0x0000, 0x0000,
209 1.4.2.2 skrll 0x0000, 0x0000,
210 1.4.2.2 skrll 0x0000, 0x0000,
211 1.4.2.2 skrll 0x0000, 0x0000,
212 1.4.2.2 skrll 0x0000, 0x0000,
213 1.4.2.2 skrll 0x0000, 0x0000,
214 1.4.2.2 skrll 0x0000, 0x0000,
215 1.4.2.2 skrll 0x0000, 0x0000,
216 1.4.2.2 skrll 0x0000, 0x0000,
217 1.4.2.2 skrll 0x0000, 0x0000,
218 1.4.2.2 skrll 0x0000, 0x0000,
219 1.4.2.2 skrll 0x0000, 0x0000,
220 1.4.2.2 skrll 0x0000, 0x0000,
221 1.4.2.2 skrll 0x0000, 0x0000,
222 1.4.2.2 skrll 0x0000, 0x0000,
223 1.4.2.2 skrll 0x0000, 0x0000,
224 1.4.2.2 skrll 0x0000, 0x0000,
225 1.4.2.2 skrll 0x0000, 0x0000,
226 1.4.2.2 skrll 0x0000, 0x0000,
227 1.4.2.2 skrll };
228 1.4.2.2 skrll
229 1.4.2.2 skrll static const u_int8_t grtwo_defcmap[8 * 3] = {
230 1.4.2.2 skrll /* Normal colors */
231 1.4.2.2 skrll 0x00, 0x00, 0x00, /* black */
232 1.4.2.2 skrll 0x7f, 0x00, 0x00, /* red */
233 1.4.2.2 skrll 0x00, 0x7f, 0x00, /* green */
234 1.4.2.2 skrll 0x7f, 0x7f, 0x00, /* brown */
235 1.4.2.2 skrll 0x00, 0x00, 0x7f, /* blue */
236 1.4.2.2 skrll 0x7f, 0x00, 0x7f, /* magenta */
237 1.4.2.2 skrll 0x00, 0x7f, 0x7f, /* cyan */
238 1.4.2.2 skrll 0xc7, 0xc7, 0xc7, /* white - XXX too dim? */
239 1.4.2.2 skrll };
240 1.4.2.2 skrll
241 1.4.2.2 skrll static void
242 1.4.2.2 skrll grtwo_wait_gfifo(struct grtwo_devconfig * dc)
243 1.4.2.2 skrll {
244 1.4.2.2 skrll int2_wait_fifo(1);
245 1.4.2.2 skrll }
246 1.4.2.2 skrll
247 1.4.2.2 skrll static inline void
248 1.4.2.2 skrll grtwo_set_color(bus_space_tag_t iot, bus_space_handle_t ioh, int color)
249 1.4.2.2 skrll {
250 1.4.2.2 skrll bus_space_write_4(iot, ioh, GR2_FIFO_COLOR, color);
251 1.4.2.2 skrll }
252 1.4.2.2 skrll
253 1.4.2.2 skrll /* Helper functions */
254 1.4.2.2 skrll static void
255 1.4.2.2 skrll grtwo_fill_rectangle(struct grtwo_devconfig * dc, int x1, int y1, int x2,
256 1.4.2.2 skrll int y2, u_int8_t color)
257 1.4.2.2 skrll {
258 1.4.2.2 skrll int remaining;
259 1.4.2.2 skrll int from_y;
260 1.4.2.2 skrll int to_y;
261 1.4.2.2 skrll
262 1.4.2.2 skrll /* gr2 sees coordinate 0,0 as the lower left corner, and 1279,1023
263 1.4.2.2 skrll as the upper right. To keep things consistent, we shall flip the
264 1.4.2.2 skrll y axis. */
265 1.4.2.2 skrll
266 1.4.2.2 skrll /* There appears to be a limit to the number of vertical lines that we
267 1.4.2.2 skrll can run through the the graphics engine at one go. This probably has
268 1.4.2.2 skrll something to do with vertical refresh. Single-row fills are okay,
269 1.4.2.2 skrll multiple-row screw up the board in exciting ways. The copy_rectangle
270 1.4.2.2 skrll workaround doesn't work for fills. */
271 1.4.2.2 skrll
272 1.4.2.2 skrll /* Coordinates, not length. Remember that! */
273 1.4.2.2 skrll
274 1.4.2.2 skrll to_y = min(dc->yres - 1 - y1, dc->yres - 1 - y2);
275 1.4.2.2 skrll from_y = max(dc->yres - 1 - y1, dc->yres - 1 - y2);
276 1.4.2.2 skrll
277 1.4.2.2 skrll remaining = to_y - from_y;
278 1.4.2.2 skrll
279 1.4.2.2 skrll grtwo_wait_gfifo(dc);
280 1.4.2.2 skrll grtwo_set_color(dc->iot, dc->ioh, color);
281 1.4.2.2 skrll
282 1.4.2.2 skrll while (remaining) {
283 1.4.2.2 skrll if (remaining <= 32)
284 1.4.2.2 skrll {
285 1.4.2.2 skrll delay(10000);
286 1.4.2.2 skrll grtwo_wait_gfifo(dc);
287 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_RECTI2D, x1);
288 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, from_y);
289 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, x2);
290 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, from_y + remaining);
291 1.4.2.2 skrll break;
292 1.4.2.2 skrll } else {
293 1.4.2.2 skrll delay(100000);
294 1.4.2.2 skrll grtwo_wait_gfifo(dc);
295 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_RECTI2D, x1);
296 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, from_y);
297 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, x2);
298 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, from_y + remaining);
299 1.4.2.2 skrll from_y += 32;
300 1.4.2.2 skrll remaining -=32;
301 1.4.2.2 skrll }
302 1.4.2.2 skrll }
303 1.4.2.2 skrll }
304 1.4.2.2 skrll
305 1.4.2.2 skrll static void
306 1.4.2.2 skrll grtwo_copy_rectangle(struct grtwo_devconfig * dc, int x1, int y1, int x2,
307 1.4.2.2 skrll int y2, int width, int height)
308 1.4.2.2 skrll {
309 1.4.2.2 skrll int length = (width + 3) >> 2;
310 1.4.2.2 skrll int lines = 4864 / length;
311 1.4.2.2 skrll int from_y;
312 1.4.2.2 skrll int to_y;
313 1.4.2.2 skrll int temp_height;
314 1.4.2.2 skrll
315 1.4.2.2 skrll if ((y2 <= y1) || (height < lines)) {
316 1.4.2.2 skrll grtwo_wait_gfifo(dc);
317 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_RECTCOPY, length);
318 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, lines);
319 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, x1);
320 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, y1);
321 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, width);
322 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, height);
323 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, x2);
324 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, y2);
325 1.4.2.2 skrll } else {
326 1.4.2.2 skrll from_y = y1 + height - lines;
327 1.4.2.2 skrll to_y = y2 + height - lines;
328 1.4.2.2 skrll temp_height = MIN(height, lines);
329 1.4.2.2 skrll
330 1.4.2.2 skrll while (temp_height) {
331 1.4.2.2 skrll grtwo_wait_gfifo(dc);
332 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_RECTCOPY, length);
333 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, lines);
334 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, x1);
335 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, from_y);
336 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, width);
337 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, temp_height);
338 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, x2);
339 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, to_y);
340 1.4.2.2 skrll height -= temp_height;
341 1.4.2.2 skrll height = MIN(height, lines);
342 1.4.2.2 skrll from_y -= temp_height;
343 1.4.2.2 skrll to_y -= temp_height;
344 1.4.2.2 skrll }
345 1.4.2.2 skrll }
346 1.4.2.2 skrll }
347 1.4.2.2 skrll
348 1.4.2.2 skrll static void
349 1.4.2.2 skrll grtwo_cmap_setrgb(struct grtwo_devconfig * dc, int index, u_int8_t r, u_int8_t g, u_int8_t b)
350 1.4.2.2 skrll {
351 1.4.2.2 skrll grtwo_wait_gfifo(dc);
352 1.4.2.2 skrll bus_space_write_1(dc->iot, dc->ioh, XMAPALL_ADDRHI,
353 1.4.2.2 skrll ((index & 0x1f00) >> 8) );
354 1.4.2.2 skrll bus_space_write_1(dc->iot, dc->ioh, XMAPALL_ADDRLO,
355 1.4.2.2 skrll (index & 0xff));
356 1.4.2.2 skrll bus_space_write_1(dc->iot, dc->ioh, XMAPALL_CLUT, r);
357 1.4.2.2 skrll bus_space_write_1(dc->iot, dc->ioh, XMAPALL_CLUT, g);
358 1.4.2.2 skrll bus_space_write_1(dc->iot, dc->ioh, XMAPALL_CLUT, b);
359 1.4.2.2 skrll }
360 1.4.2.2 skrll
361 1.4.2.2 skrll static void
362 1.4.2.2 skrll grtwo_setup_hw(struct grtwo_devconfig * dc)
363 1.4.2.2 skrll {
364 1.4.2.2 skrll int i = 0;
365 1.4.2.2 skrll
366 1.4.2.2 skrll /* Get various revisions */
367 1.4.2.2 skrll dc->boardrev = (~(bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD0))) & GR2_REVISION_RD0_VERSION_MASK;
368 1.4.2.2 skrll
369 1.4.2.2 skrll /*
370 1.4.2.2 skrll * boards prior to rev 4 have a pretty whacky config scheme.
371 1.4.2.2 skrll * what is doubly weird is that i have a rev 2 board, but the rev 4
372 1.4.2.2 skrll * probe routines work just fine.
373 1.4.2.2 skrll * we'll trust SGI, though, and separate things a bit. it's only
374 1.4.2.2 skrll * critical for the display depth calculation.
375 1.4.2.2 skrll */
376 1.4.2.2 skrll
377 1.4.2.2 skrll if (dc->boardrev < 4) {
378 1.4.2.2 skrll dc->backendrev = ~(bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD2) & GR2_REVISION_RD2_BACKEND_REV) >> 2;
379 1.4.2.2 skrll if (dc->backendrev == 0)
380 1.4.2.2 skrll return;
381 1.4.2.2 skrll dc->zbuffer = !(bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD1) & GR2_REVISION_RD1_ZBUFFER);
382 1.4.2.2 skrll if ( (bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD3) & GR2_REVISION_RD3_VMA) != 3)
383 1.4.2.2 skrll i++;
384 1.4.2.2 skrll if ( (bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD3) & GR2_REVISION_RD3_VMB) != 0x0c)
385 1.4.2.2 skrll i++;
386 1.4.2.2 skrll if ( (bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD3) & GR2_REVISION_RD3_VMC) != 0x30)
387 1.4.2.2 skrll i++;
388 1.4.2.2 skrll dc->depth = 8 * i;
389 1.4.2.2 skrll dc->monitor =
390 1.4.2.2 skrll ((bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD2) & 0x03) << 1) |
391 1.4.2.2 skrll (bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD1) & 0x01);
392 1.4.2.2 skrll } else {
393 1.4.2.2 skrll dc->backendrev = ~(bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD1)) & 0x03;
394 1.4.2.2 skrll if (dc->backendrev == 0)
395 1.4.2.2 skrll return;
396 1.4.2.2 skrll dc->zbuffer = bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD1) & GR2_REVISION4_RD1_ZBUFFER;
397 1.4.2.2 skrll dc->depth = ((bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD1) & GR2_REVISION4_RD1_24BPP) >> 4) ? 24 : 8;
398 1.4.2.2 skrll dc->monitor = (bus_space_read_4(dc->iot, dc->ioh, GR2_REVISION_RD0) & GR2_REVISION4_RD0_MONITOR_MASK) >> 4;
399 1.4.2.2 skrll }
400 1.4.2.2 skrll
401 1.4.2.2 skrll dc->hq2rev = (bus_space_read_4(dc->iot, dc->ioh, HQ2_VERSION) & HQ2_VERSION_MASK) >> HQ2_VERSION_SHIFT;
402 1.4.2.2 skrll dc->ge7rev = (bus_space_read_4(dc->iot, dc->ioh, GE7_REVISION) & GE7_REVISION_MASK) >> 5;
403 1.4.2.2 skrll /* dc->vc1rev = vc1_read_ireg(dc, 5) & 0x07; */
404 1.4.2.2 skrll
405 1.4.2.2 skrll /* gr2 supports 1280x1024 only */
406 1.4.2.2 skrll dc->xres = 1280;
407 1.4.2.2 skrll dc->yres = 1024;
408 1.4.2.2 skrll
409 1.4.2.2 skrll #if 0
410 1.4.2.2 skrll /* Setup cursor glyph */
411 1.4.2.2 skrll
412 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_ADDRHI,
413 1.4.2.2 skrll (VC1_SRAM_CURSOR0_BASE >> 8) & 0xff);
414 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_ADDRLO,
415 1.4.2.2 skrll VC1_SRAM_CURSOR0_BASE & 0xff);
416 1.4.2.2 skrll for (i = 0; i < 128; i++)
417 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_SRAM, grtwo_cursor_data[i]);
418 1.4.2.2 skrll
419 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_ADDRHI,
420 1.4.2.2 skrll (VC1_CURSOR_EP >> 8) & 0xff);
421 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_ADDRLO,
422 1.4.2.2 skrll VC1_CURSOR_EP & 0xff);
423 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_COMMAND, VC1_SRAM_CURSOR0_BASE);
424 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_COMMAND, 0);
425 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_COMMAND, 0);
426 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_COMMAND, 0);
427 1.4.2.2 skrll
428 1.4.2.2 skrll /* Turn on cursor function, display, DID */
429 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_SYSCTL,
430 1.4.2.2 skrll VC1_SYSCTL_VC1 | VC1_SYSCTL_DID |
431 1.4.2.2 skrll VC1_SYSCTL_CURSOR | VC1_SYSCTL_CURSOR_DISPLAY);
432 1.4.2.2 skrll #endif
433 1.4.2.2 skrll
434 1.4.2.2 skrll /* Setup CMAP */
435 1.4.2.2 skrll for (i = 0; i < 8; i++)
436 1.4.2.2 skrll grtwo_cmap_setrgb(dc, i, grtwo_defcmap[i * 3],
437 1.4.2.2 skrll grtwo_defcmap[i * 3 + 1], grtwo_defcmap[i * 3 + 2]);
438 1.4.2.2 skrll }
439 1.4.2.2 skrll
440 1.4.2.2 skrll /* Attach routines */
441 1.4.2.2 skrll static int
442 1.4.2.2 skrll grtwo_match(struct device * parent, struct cfdata * self, void *aux)
443 1.4.2.2 skrll {
444 1.4.2.2 skrll struct gio_attach_args *ga = aux;
445 1.4.2.2 skrll
446 1.4.2.2 skrll /*
447 1.4.2.2 skrll * grtwo doesn't have anything that even vaguely resembles a product
448 1.4.2.2 skrll * ID. Instead, we determine presence by looking at the HQ2 "mystery"
449 1.4.2.2 skrll * register, which contains a magic number.
450 1.4.2.2 skrll */
451 1.4.2.2 skrll if ( badaddr((void *) (ga->ga_ioh + HQ2_MYSTERY), sizeof(u_int32_t)) )
452 1.4.2.2 skrll return 0;
453 1.4.2.2 skrll
454 1.4.2.2 skrll if ( (bus_space_read_4(ga->ga_iot, ga->ga_ioh, HQ2_MYSTERY)) != 0xdeadbeef)
455 1.4.2.2 skrll return 0;
456 1.4.2.2 skrll
457 1.4.2.2 skrll return 1;
458 1.4.2.2 skrll }
459 1.4.2.2 skrll
460 1.4.2.2 skrll static void
461 1.4.2.2 skrll grtwo_attach_common(struct grtwo_devconfig * dc, struct gio_attach_args * ga)
462 1.4.2.2 skrll {
463 1.4.2.2 skrll dc->dc_addr = ga->ga_addr;
464 1.4.2.2 skrll
465 1.4.2.2 skrll dc->iot = ga->ga_iot;
466 1.4.2.2 skrll dc->ioh = ga->ga_ioh;
467 1.4.2.2 skrll int i = 0;
468 1.4.2.2 skrll
469 1.4.2.2 skrll wsfont_init();
470 1.4.2.2 skrll
471 1.4.2.2 skrll dc->dc_font = wsfont_find(NULL, 8, 16, 0, WSDISPLAY_FONTORDER_L2R,
472 1.4.2.2 skrll WSDISPLAY_FONTORDER_L2R);
473 1.4.2.2 skrll
474 1.4.2.2 skrll if (dc->dc_font < 0)
475 1.4.2.2 skrll panic("grtwo_attach_common: no suitable fonts");
476 1.4.2.2 skrll
477 1.4.2.2 skrll if (wsfont_lock(dc->dc_font, &dc->dc_fontdata))
478 1.4.2.2 skrll panic("grtwo_attach_common: unable to lock font data");
479 1.4.2.2 skrll
480 1.4.2.2 skrll grtwo_setup_hw(dc);
481 1.4.2.2 skrll
482 1.4.2.2 skrll /* Large fills are broken. For now, clear the screen line-by-line. */
483 1.4.2.2 skrll for (i = 0; i < 64; i++)
484 1.4.2.2 skrll grtwo_eraserows(dc, i, 1, 0);
485 1.4.2.2 skrll
486 1.4.2.2 skrll /* If large fills worked, we'd do this instead:
487 1.4.2.2 skrll grtwo_fill_rectangle(dc, 0, 0, dc->xres - 1, dc->yres - 1, 0);
488 1.4.2.2 skrll */
489 1.4.2.2 skrll }
490 1.4.2.2 skrll
491 1.4.2.2 skrll static void
492 1.4.2.2 skrll grtwo_attach(struct device * parent, struct device * self, void *aux)
493 1.4.2.2 skrll {
494 1.4.2.2 skrll struct gio_attach_args *ga = aux;
495 1.4.2.2 skrll struct grtwo_softc *sc = (void *) self;
496 1.4.2.2 skrll struct wsemuldisplaydev_attach_args wa;
497 1.4.2.2 skrll
498 1.4.2.2 skrll if (grtwo_is_console && ga->ga_addr == grtwo_console_dc.dc_addr) {
499 1.4.2.2 skrll wa.console = 1;
500 1.4.2.2 skrll sc->sc_dc = &grtwo_console_dc;
501 1.4.2.2 skrll } else {
502 1.4.2.2 skrll wa.console = 0;
503 1.4.2.2 skrll sc->sc_dc = malloc(sizeof(struct grtwo_devconfig),
504 1.4.2.2 skrll M_DEVBUF, M_WAITOK | M_ZERO);
505 1.4.2.2 skrll if (sc->sc_dc == NULL)
506 1.4.2.2 skrll panic("grtwo_attach: out of memory");
507 1.4.2.2 skrll
508 1.4.2.2 skrll grtwo_attach_common(sc->sc_dc, ga);
509 1.4.2.2 skrll }
510 1.4.2.2 skrll
511 1.4.2.2 skrll aprint_naive(": Display adapter\n");
512 1.4.2.2 skrll
513 1.4.2.5 skrll aprint_normal(": GR2 (board rev %x, monitor %d, depth %d)\n",
514 1.4.2.2 skrll sc->sc_dc->boardrev, sc->sc_dc->monitor, sc->sc_dc->depth);
515 1.4.2.2 skrll
516 1.4.2.2 skrll wa.scrdata = &grtwo_screenlist;
517 1.4.2.2 skrll wa.accessops = &grtwo_accessops;
518 1.4.2.2 skrll wa.accesscookie = sc->sc_dc;
519 1.4.2.2 skrll
520 1.4.2.2 skrll if ((cpu_intr_establish(0, IPL_TTY, grtwo_intr0, sc)) == NULL)
521 1.4.2.2 skrll printf(": unable to establish interrupt!\n");
522 1.4.2.2 skrll
523 1.4.2.2 skrll if ((cpu_intr_establish(6, IPL_TTY, grtwo_intr6, sc)) == NULL)
524 1.4.2.2 skrll printf(": unable to establish interrupt!\n");
525 1.4.2.2 skrll
526 1.4.2.2 skrll config_found(&sc->sc_dev, &wa, wsemuldisplaydevprint);
527 1.4.2.2 skrll }
528 1.4.2.2 skrll
529 1.4.2.2 skrll int
530 1.4.2.2 skrll grtwo_cnattach(struct gio_attach_args * ga)
531 1.4.2.2 skrll {
532 1.4.2.2 skrll long defattr = GR2_ATTR_ENCODE(WSCOL_WHITE, WSCOL_BLACK);
533 1.4.2.2 skrll
534 1.4.2.2 skrll if (!grtwo_match(NULL, NULL, ga)) {
535 1.4.2.2 skrll return ENXIO;
536 1.4.2.2 skrll }
537 1.4.2.2 skrll
538 1.4.2.2 skrll grtwo_attach_common(&grtwo_console_dc, ga);
539 1.4.2.2 skrll wsdisplay_cnattach(&grtwo_screen, &grtwo_console_dc, 0, 0, defattr);
540 1.4.2.2 skrll
541 1.4.2.2 skrll grtwo_is_console = 1;
542 1.4.2.2 skrll
543 1.4.2.2 skrll return 0;
544 1.4.2.2 skrll }
545 1.4.2.2 skrll
546 1.4.2.2 skrll /* wsdisplay textops */
547 1.4.2.2 skrll static void
548 1.4.2.2 skrll grtwo_cursor(void *c, int on, int row, int col)
549 1.4.2.2 skrll {
550 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
551 1.4.2.2 skrll u_int32_t control;
552 1.4.2.2 skrll control = bus_space_read_4(dc->iot, dc->ioh, VC1_SYSCTL);
553 1.4.2.2 skrll
554 1.4.2.2 skrll if (!on) {
555 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_SYSCTL,
556 1.4.2.2 skrll control & ~VC1_SYSCTL_CURSOR_DISPLAY);
557 1.4.2.2 skrll } else {
558 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_ADDRHI, (VC1_CURSOR_XL & 0xff00) >> 8
559 1.4.2.2 skrll );
560 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_ADDRLO, VC1_CURSOR_XL & 0xff);
561 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_COMMAND,
562 1.4.2.2 skrll col * dc->dc_fontdata->fontwidth);
563 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_COMMAND,
564 1.4.2.2 skrll row * dc->dc_fontdata->fontheight);
565 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, VC1_SYSCTL,
566 1.4.2.2 skrll control | VC1_SYSCTL_CURSOR_DISPLAY);
567 1.4.2.2 skrll }
568 1.4.2.2 skrll }
569 1.4.2.2 skrll
570 1.4.2.2 skrll static int
571 1.4.2.2 skrll grtwo_mapchar(void *c, int ch, unsigned int *cp)
572 1.4.2.2 skrll {
573 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
574 1.4.2.2 skrll
575 1.4.2.2 skrll if (dc->dc_fontdata->encoding != WSDISPLAY_FONTENC_ISO) {
576 1.4.2.2 skrll ch = wsfont_map_unichar(dc->dc_fontdata, ch);
577 1.4.2.2 skrll
578 1.4.2.2 skrll if (ch < 0)
579 1.4.2.2 skrll goto fail;
580 1.4.2.2 skrll }
581 1.4.2.2 skrll if (ch < dc->dc_fontdata->firstchar ||
582 1.4.2.2 skrll ch >= dc->dc_fontdata->firstchar + dc->dc_fontdata->numchars)
583 1.4.2.2 skrll goto fail;
584 1.4.2.2 skrll
585 1.4.2.2 skrll *cp = ch;
586 1.4.2.2 skrll return 5;
587 1.4.2.2 skrll
588 1.4.2.2 skrll fail:
589 1.4.2.2 skrll *cp = ' ';
590 1.4.2.2 skrll return 0;
591 1.4.2.2 skrll }
592 1.4.2.2 skrll
593 1.4.2.2 skrll static void
594 1.4.2.2 skrll grtwo_putchar(void *c, int row, int col, u_int ch, long attr)
595 1.4.2.2 skrll {
596 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
597 1.4.2.2 skrll struct wsdisplay_font *font = dc->dc_fontdata;
598 1.4.2.2 skrll u_int8_t *bitmap = (u_int8_t *) font->data + (ch - font->firstchar + 1) * font->fontheight * font->stride;
599 1.4.2.2 skrll u_int32_t pattern;
600 1.4.2.2 skrll int i;
601 1.4.2.2 skrll int x = col * font->fontwidth;
602 1.4.2.2 skrll int y = dc->yres - ( (row + 1) * font->fontheight);
603 1.4.2.2 skrll
604 1.4.2.2 skrll /* Set the drawing color */
605 1.4.2.2 skrll grtwo_wait_gfifo(dc);
606 1.4.2.2 skrll grtwo_set_color(dc->iot, dc->ioh, (((attr) >> 8) & 0xff));
607 1.4.2.2 skrll grtwo_wait_gfifo(dc);
608 1.4.2.2 skrll
609 1.4.2.2 skrll /* Set drawing coordinates */
610 1.4.2.2 skrll grtwo_wait_gfifo(dc);
611 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_CMOV2I, x);
612 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, y);
613 1.4.2.2 skrll
614 1.4.2.2 skrll /* This works for font sizes < 18 */
615 1.4.2.2 skrll grtwo_wait_gfifo(dc);
616 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DRAWCHAR, font->fontwidth);
617 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, font->fontheight);
618 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, 2);
619 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, 0); /* x offset */
620 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, 0); /* y offset */
621 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, 0);
622 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, 0);
623 1.4.2.2 skrll
624 1.4.2.2 skrll for (i = 0; i < font->fontheight; i++) {
625 1.4.2.2 skrll /* It appears that writes have to be 16 bits. An "I tell you
626 1.4.2.2 skrll two times" sort of thing? Thanks, SGI */
627 1.4.2.2 skrll pattern = *bitmap | (*bitmap << 8);
628 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, pattern);
629 1.4.2.2 skrll bitmap -= font->stride;
630 1.4.2.2 skrll }
631 1.4.2.2 skrll
632 1.4.2.2 skrll /* pad up to 18 */
633 1.4.2.2 skrll for (i = font->fontheight; i < 18; i++)
634 1.4.2.2 skrll bus_space_write_4(dc->iot, dc->ioh, GR2_FIFO_DATA, 0x0000);
635 1.4.2.2 skrll }
636 1.4.2.2 skrll
637 1.4.2.2 skrll static void
638 1.4.2.2 skrll grtwo_copycols(void *c, int row, int srccol, int dstcol, int ncols)
639 1.4.2.2 skrll {
640 1.4.2.2 skrll #if 1
641 1.4.2.2 skrll printf("grtwo_copycols: %i %i %i %i\n", row, srccol, dstcol, ncols);
642 1.4.2.2 skrll #else
643 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
644 1.4.2.2 skrll struct wsdisplay_font *font = dc->dc_fontdata;
645 1.4.2.2 skrll grtwo_copy_rectangle(dc,
646 1.4.2.2 skrll srccol * font->fontwidth, /* x1 */
647 1.4.2.2 skrll 0, /* y1 */
648 1.4.2.2 skrll dstcol * font->fontwidth, /* x2 */
649 1.4.2.2 skrll 0, /* y2 */
650 1.4.2.2 skrll ncols * font->fontwidth, /* dx */
651 1.4.2.2 skrll dc->yres ); /* dy */
652 1.4.2.2 skrll #endif
653 1.4.2.2 skrll }
654 1.4.2.2 skrll
655 1.4.2.2 skrll static void
656 1.4.2.2 skrll grtwo_erasecols(void *c, int row, int startcol, int ncols, long attr)
657 1.4.2.2 skrll {
658 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
659 1.4.2.2 skrll struct wsdisplay_font *font = dc->dc_fontdata;
660 1.4.2.2 skrll
661 1.4.2.2 skrll grtwo_fill_rectangle(dc,
662 1.4.2.2 skrll startcol * font->fontwidth, /* x1 */
663 1.4.2.2 skrll 0, /* y1 */
664 1.4.2.2 skrll (startcol * font->fontwidth) + ncols * font->fontwidth, /* x2 */
665 1.4.2.2 skrll dc->yres, /* y2 */
666 1.4.2.2 skrll GR2_ATTR_BG(attr));
667 1.4.2.2 skrll }
668 1.4.2.2 skrll
669 1.4.2.2 skrll static void
670 1.4.2.2 skrll grtwo_copyrows(void *c, int srcrow, int dstrow, int nrows)
671 1.4.2.2 skrll {
672 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
673 1.4.2.2 skrll struct wsdisplay_font *font = dc->dc_fontdata;
674 1.4.2.2 skrll
675 1.4.2.2 skrll grtwo_copy_rectangle(dc,
676 1.4.2.2 skrll 0, /* x1 */
677 1.4.2.2 skrll srcrow * font->fontheight, /* y1 */
678 1.4.2.2 skrll 0, /* x2 */
679 1.4.2.2 skrll dstrow * font->fontheight, /* y2 */
680 1.4.2.2 skrll dc->xres, /* dx */
681 1.4.2.2 skrll nrows * font->fontheight);
682 1.4.2.2 skrll }
683 1.4.2.2 skrll
684 1.4.2.2 skrll static void
685 1.4.2.2 skrll grtwo_eraserows(void *c, int startrow, int nrows, long attr)
686 1.4.2.2 skrll {
687 1.4.2.2 skrll struct grtwo_devconfig *dc = (void *) c;
688 1.4.2.2 skrll struct wsdisplay_font *font = dc->dc_fontdata;
689 1.4.2.2 skrll grtwo_fill_rectangle(dc,
690 1.4.2.2 skrll 0, /* x1 */
691 1.4.2.2 skrll startrow * font->fontheight, /* y1 */
692 1.4.2.2 skrll dc->xres, /* x2 */
693 1.4.2.2 skrll (startrow * font->fontheight) + nrows * font->fontheight, /* y2 */
694 1.4.2.2 skrll GR2_ATTR_BG(attr));
695 1.4.2.2 skrll }
696 1.4.2.2 skrll
697 1.4.2.2 skrll static int
698 1.4.2.2 skrll grtwo_allocattr(void *c, int fg, int bg, int flags, long *attr)
699 1.4.2.2 skrll {
700 1.4.2.2 skrll if (flags & WSATTR_BLINK)
701 1.4.2.2 skrll return EINVAL;
702 1.4.2.2 skrll
703 1.4.2.2 skrll if ((flags & WSATTR_WSCOLORS) == 0) {
704 1.4.2.2 skrll fg = WSCOL_WHITE;
705 1.4.2.2 skrll bg = WSCOL_BLACK;
706 1.4.2.2 skrll }
707 1.4.2.2 skrll if (flags & WSATTR_HILIT)
708 1.4.2.2 skrll fg += 8;
709 1.4.2.2 skrll
710 1.4.2.2 skrll if (flags & WSATTR_REVERSE) {
711 1.4.2.2 skrll int tmp = fg;
712 1.4.2.2 skrll fg = bg;
713 1.4.2.2 skrll bg = tmp;
714 1.4.2.2 skrll }
715 1.4.2.2 skrll *attr = GR2_ATTR_ENCODE(fg, bg);
716 1.4.2.2 skrll
717 1.4.2.2 skrll return 0;
718 1.4.2.2 skrll }
719 1.4.2.2 skrll
720 1.4.2.2 skrll /* wsdisplay accessops */
721 1.4.2.2 skrll
722 1.4.2.2 skrll static int
723 1.4.2.2 skrll grtwo_ioctl(void *c, u_long cmd, caddr_t data, int flag, struct proc * p)
724 1.4.2.2 skrll {
725 1.4.2.2 skrll struct grtwo_softc *sc = c;
726 1.4.2.2 skrll
727 1.4.2.2 skrll #define FBINFO (*(struct wsdisplay_fbinfo*)data)
728 1.4.2.2 skrll
729 1.4.2.2 skrll switch (cmd) {
730 1.4.2.2 skrll case WSDISPLAYIO_GINFO:
731 1.4.2.2 skrll FBINFO.width = sc->sc_dc->xres;
732 1.4.2.2 skrll FBINFO.height = sc->sc_dc->yres;
733 1.4.2.2 skrll FBINFO.depth = sc->sc_dc->depth;
734 1.4.2.2 skrll FBINFO.cmsize = 1 << FBINFO.depth;
735 1.4.2.2 skrll return 0;
736 1.4.2.2 skrll case WSDISPLAYIO_GTYPE:
737 1.4.2.2 skrll *(u_int *) data = WSDISPLAY_TYPE_GR2;
738 1.4.2.2 skrll return 0;
739 1.4.2.2 skrll }
740 1.4.2.2 skrll return EPASSTHROUGH;
741 1.4.2.2 skrll }
742 1.4.2.2 skrll
743 1.4.2.2 skrll static paddr_t
744 1.4.2.2 skrll grtwo_mmap(void *c, off_t offset, int prot)
745 1.4.2.2 skrll {
746 1.4.2.2 skrll struct grtwo_devconfig *dc = c;
747 1.4.2.2 skrll
748 1.4.2.2 skrll if (offset >= 0xfffff)
749 1.4.2.2 skrll return -1;
750 1.4.2.2 skrll
751 1.4.2.2 skrll return mips_btop(dc->dc_addr + offset);
752 1.4.2.2 skrll }
753 1.4.2.2 skrll
754 1.4.2.2 skrll static int
755 1.4.2.2 skrll grtwo_alloc_screen(void *c, const struct wsscreen_descr * type, void **cookiep,
756 1.4.2.2 skrll int *cursxp, int *cursyp, long *attrp)
757 1.4.2.2 skrll {
758 1.4.2.2 skrll /*
759 1.4.2.2 skrll * This won't get called for console screen and we don't support
760 1.4.2.2 skrll * virtual screens
761 1.4.2.2 skrll */
762 1.4.2.2 skrll
763 1.4.2.2 skrll return ENOMEM;
764 1.4.2.2 skrll }
765 1.4.2.2 skrll
766 1.4.2.2 skrll static void
767 1.4.2.2 skrll grtwo_free_screen(void *c, void *cookie)
768 1.4.2.2 skrll {
769 1.4.2.2 skrll panic("grtwo_free_screen");
770 1.4.2.2 skrll }
771 1.4.2.2 skrll static int
772 1.4.2.2 skrll grtwo_show_screen(void *c, void *cookie, int waitok,
773 1.4.2.2 skrll void (*cb) (void *, int, int), void *cbarg)
774 1.4.2.2 skrll {
775 1.4.2.2 skrll return 0;
776 1.4.2.2 skrll }
777 1.4.2.2 skrll
778 1.4.2.2 skrll static int
779 1.4.2.2 skrll grtwo_intr0(void *arg)
780 1.4.2.2 skrll {
781 1.4.2.2 skrll /* struct grtwo_devconfig *dc = arg; */
782 1.4.2.2 skrll return 1;
783 1.4.2.2 skrll }
784 1.4.2.2 skrll
785 1.4.2.2 skrll
786 1.4.2.2 skrll static int
787 1.4.2.2 skrll grtwo_intr6(void *arg)
788 1.4.2.2 skrll {
789 1.4.2.2 skrll /* struct grtwo_devconfig *dc = arg; */
790 1.4.2.2 skrll return 1;
791 1.4.2.2 skrll }
792 1.4.2.2 skrll
793