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