Home | History | Annotate | Line # | Download | only in gio
grtwo.c revision 1.4.2.6
      1  1.4.2.6  skrll /* $NetBSD: grtwo.c,v 1.4.2.6 2005/01/13 08:33:11 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.6  skrll __KERNEL_RCSID(0, "$NetBSD: grtwo.c,v 1.4.2.6 2005/01/13 08:33:11 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.6  skrll static int      grtwo_ioctl(void *, u_long, caddr_t, int, struct lwp *);
    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.6  skrll grtwo_ioctl(void *c, u_long cmd, caddr_t data, int flag, struct lwp *l)
    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