Home | History | Annotate | Line # | Download | only in dev
grf.c revision 1.34.12.1
      1  1.34.12.1    simonb /*	$NetBSD: grf.c,v 1.34.12.1 2000/06/30 16:27:14 simonb Exp $	*/
      2       1.15       cgd 
      3        1.1        mw /*
      4        1.1        mw  * Copyright (c) 1988 University of Utah.
      5        1.1        mw  * Copyright (c) 1990 The Regents of the University of California.
      6        1.1        mw  * All rights reserved.
      7        1.1        mw  *
      8        1.1        mw  * This code is derived from software contributed to Berkeley by
      9        1.1        mw  * the Systems Programming Group of the University of Utah Computer
     10        1.1        mw  * Science Department.
     11        1.1        mw  *
     12        1.1        mw  * Redistribution and use in source and binary forms, with or without
     13        1.1        mw  * modification, are permitted provided that the following conditions
     14        1.1        mw  * are met:
     15        1.1        mw  * 1. Redistributions of source code must retain the above copyright
     16        1.1        mw  *    notice, this list of conditions and the following disclaimer.
     17        1.1        mw  * 2. Redistributions in binary form must reproduce the above copyright
     18        1.1        mw  *    notice, this list of conditions and the following disclaimer in the
     19        1.1        mw  *    documentation and/or other materials provided with the distribution.
     20        1.1        mw  * 3. All advertising materials mentioning features or use of this software
     21        1.1        mw  *    must display the following acknowledgement:
     22        1.1        mw  *	This product includes software developed by the University of
     23        1.1        mw  *	California, Berkeley and its contributors.
     24        1.1        mw  * 4. Neither the name of the University nor the names of its contributors
     25        1.1        mw  *    may be used to endorse or promote products derived from this software
     26        1.1        mw  *    without specific prior written permission.
     27        1.1        mw  *
     28        1.1        mw  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     29        1.1        mw  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30        1.1        mw  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31        1.1        mw  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     32        1.1        mw  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33        1.1        mw  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34        1.1        mw  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35        1.1        mw  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36        1.1        mw  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37        1.1        mw  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38        1.1        mw  * SUCH DAMAGE.
     39        1.1        mw  *
     40        1.4        mw  * from: Utah $Hdr: grf.c 1.31 91/01/21$
     41        1.4        mw  *
     42        1.4        mw  *	@(#)grf.c	7.8 (Berkeley) 5/7/91
     43        1.1        mw  */
     44        1.1        mw 
     45        1.1        mw /*
     46       1.11    chopps  * Graphics display driver for the Amiga
     47        1.1        mw  * This is the hardware-independent portion of the driver.
     48       1.11    chopps  * Hardware access is through the grf_softc->g_mode routine.
     49        1.1        mw  */
     50        1.1        mw 
     51        1.8    chopps #include <sys/param.h>
     52        1.8    chopps #include <sys/proc.h>
     53        1.8    chopps #include <sys/ioctl.h>
     54       1.11    chopps #include <sys/device.h>
     55        1.8    chopps #include <sys/file.h>
     56        1.8    chopps #include <sys/malloc.h>
     57        1.9    chopps #include <sys/systm.h>
     58       1.11    chopps #include <sys/vnode.h>
     59       1.11    chopps #include <sys/mman.h>
     60       1.30    mhitch #include <sys/poll.h>
     61        1.8    chopps #include <vm/vm.h>
     62        1.8    chopps #include <vm/vm_kern.h>
     63        1.8    chopps #include <vm/vm_page.h>
     64        1.8    chopps #include <vm/vm_pager.h>
     65       1.11    chopps #include <machine/cpu.h>
     66       1.27        is #include <machine/fbio.h>
     67       1.11    chopps #include <amiga/amiga/color.h>	/* DEBUG */
     68       1.11    chopps #include <amiga/amiga/device.h>
     69       1.11    chopps #include <amiga/dev/grfioctl.h>
     70       1.11    chopps #include <amiga/dev/grfvar.h>
     71       1.11    chopps #include <amiga/dev/itevar.h>
     72       1.26     veego #include <amiga/dev/viewioctl.h>
     73       1.26     veego 
     74       1.26     veego #include <sys/conf.h>
     75       1.26     veego #include <machine/conf.h>
     76        1.8    chopps 
     77       1.21    chopps #include "view.h"
     78       1.26     veego #include "grf.h"
     79       1.21    chopps 
     80       1.11    chopps #if NGRF > 0
     81        1.1        mw #include "ite.h"
     82        1.1        mw #if NITE == 0
     83        1.9    chopps #define	ite_on(u,f)
     84        1.9    chopps #define	ite_off(u,f)
     85        1.9    chopps #define ite_reinit(d)
     86        1.1        mw #endif
     87        1.1        mw 
     88       1.11    chopps int grfon __P((dev_t));
     89       1.11    chopps int grfoff __P((dev_t));
     90       1.11    chopps int grfsinfo __P((dev_t, struct grfdyninfo *));
     91       1.11    chopps #ifdef BANKEDDEVPAGER
     92       1.11    chopps int grfbanked_get __P((dev_t, off_t, int));
     93       1.11    chopps int grfbanked_cur __P((dev_t));
     94       1.11    chopps int grfbanked_set __P((dev_t, int));
     95        1.1        mw #endif
     96        1.1        mw 
     97       1.11    chopps void grfattach __P((struct device *, struct device *, void *));
     98       1.32     veego int grfmatch __P((struct device *, struct cfdata *, void *));
     99       1.28       cgd int grfprint __P((void *, const char *));
    100        1.1        mw /*
    101       1.11    chopps  * pointers to grf drivers device structs
    102        1.1        mw  */
    103       1.11    chopps struct grf_softc *grfsp[NGRF];
    104       1.11    chopps 
    105       1.25   thorpej struct cfattach grf_ca = {
    106       1.25   thorpej 	sizeof(struct device), grfmatch, grfattach
    107       1.25   thorpej };
    108       1.11    chopps 
    109       1.11    chopps /*
    110       1.11    chopps  * only used in console init.
    111       1.11    chopps  */
    112       1.11    chopps static struct cfdata *cfdata;
    113       1.11    chopps 
    114       1.11    chopps /*
    115       1.11    chopps  * match if the unit of grf matches its perspective
    116       1.11    chopps  * low level board driver.
    117       1.11    chopps  */
    118       1.11    chopps int
    119       1.32     veego grfmatch(pdp, cfp, auxp)
    120       1.11    chopps 	struct device *pdp;
    121       1.32     veego 	struct cfdata *cfp;
    122       1.32     veego 	void *auxp;
    123        1.1        mw {
    124       1.25   thorpej 
    125       1.11    chopps 	if (cfp->cf_unit != ((struct grf_softc *)pdp)->g_unit)
    126       1.11    chopps 		return(0);
    127       1.11    chopps 	cfdata = cfp;
    128       1.11    chopps 	return(1);
    129        1.1        mw }
    130        1.1        mw 
    131        1.1        mw /*
    132       1.11    chopps  * attach.. plug pointer in and print some info.
    133       1.11    chopps  * then try and attach an ite to us. note: dp is NULL
    134       1.11    chopps  * durring console init.
    135        1.1        mw  */
    136       1.11    chopps void
    137       1.11    chopps grfattach(pdp, dp, auxp)
    138       1.11    chopps 	struct device *pdp, *dp;
    139       1.11    chopps 	void *auxp;
    140        1.1        mw {
    141       1.11    chopps 	struct grf_softc *gp;
    142       1.11    chopps 	int maj;
    143       1.11    chopps 
    144       1.11    chopps 	gp = (struct grf_softc *)pdp;
    145       1.11    chopps 	grfsp[gp->g_unit] = (struct grf_softc *)pdp;
    146        1.1        mw 
    147       1.11    chopps 	/*
    148       1.11    chopps 	 * find our major device number
    149       1.11    chopps 	 */
    150       1.11    chopps 	for(maj = 0; maj < nchrdev; maj++)
    151       1.17    chopps 		if (cdevsw[maj].d_open == grfopen)
    152       1.11    chopps 			break;
    153       1.11    chopps 
    154       1.11    chopps 	gp->g_grfdev = makedev(maj, gp->g_unit);
    155       1.11    chopps 	if (dp != NULL) {
    156       1.31  christos 		printf(": width %d height %d", gp->g_display.gd_dwidth,
    157       1.11    chopps 		    gp->g_display.gd_dheight);
    158       1.11    chopps 		if (gp->g_display.gd_colors == 2)
    159       1.31  christos 			printf(" monochrome\n");
    160       1.11    chopps 		else
    161       1.31  christos 			printf(" colors %d\n", gp->g_display.gd_colors);
    162       1.11    chopps 	}
    163       1.11    chopps 
    164       1.11    chopps 	/*
    165       1.11    chopps 	 * try and attach an ite
    166       1.11    chopps 	 */
    167       1.11    chopps 	amiga_config_found(cfdata, dp, gp, grfprint);
    168        1.1        mw }
    169        1.1        mw 
    170       1.11    chopps int
    171       1.11    chopps grfprint(auxp, pnp)
    172       1.11    chopps 	void *auxp;
    173       1.28       cgd 	const char *pnp;
    174       1.11    chopps {
    175       1.11    chopps 	if (pnp)
    176       1.31  christos 		printf("ite at %s", pnp);
    177       1.11    chopps 	return(UNCONF);
    178        1.1        mw }
    179        1.1        mw 
    180        1.1        mw /*ARGSUSED*/
    181       1.11    chopps int
    182       1.11    chopps grfopen(dev, flags, devtype, p)
    183        1.1        mw 	dev_t dev;
    184       1.11    chopps 	int flags, devtype;
    185       1.11    chopps 	struct proc *p;
    186        1.1        mw {
    187       1.11    chopps 	struct grf_softc *gp;
    188       1.11    chopps 
    189       1.24       jtc 	if (GRFUNIT(dev) >= NGRF || (gp = grfsp[GRFUNIT(dev)]) == NULL)
    190       1.11    chopps 		return(ENXIO);
    191       1.11    chopps 
    192       1.11    chopps 	if ((gp->g_flags & GF_ALIVE) == 0)
    193        1.1        mw 		return(ENXIO);
    194       1.11    chopps 
    195        1.1        mw 	if ((gp->g_flags & (GF_OPEN|GF_EXCLUDE)) == (GF_OPEN|GF_EXCLUDE))
    196        1.1        mw 		return(EBUSY);
    197       1.11    chopps 
    198       1.11    chopps 	return(0);
    199        1.1        mw }
    200        1.1        mw 
    201        1.1        mw /*ARGSUSED*/
    202       1.11    chopps int
    203       1.26     veego grfclose(dev, flags, mode, p)
    204        1.1        mw 	dev_t dev;
    205       1.11    chopps 	int flags;
    206       1.26     veego 	int mode;
    207       1.26     veego 	struct proc *p;
    208        1.1        mw {
    209       1.11    chopps 	struct grf_softc *gp;
    210        1.1        mw 
    211       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    212       1.11    chopps 	(void)grfoff(dev);
    213        1.1        mw 	gp->g_flags &= GF_ALIVE;
    214        1.1        mw 	return(0);
    215        1.1        mw }
    216        1.1        mw 
    217        1.1        mw /*ARGSUSED*/
    218       1.11    chopps int
    219        1.1        mw grfioctl(dev, cmd, data, flag, p)
    220        1.1        mw 	dev_t dev;
    221       1.16    chopps 	u_long cmd;
    222        1.1        mw 	caddr_t data;
    223       1.16    chopps 	int flag;
    224        1.1        mw 	struct proc *p;
    225        1.1        mw {
    226       1.11    chopps 	struct grf_softc *gp;
    227        1.1        mw 	int error;
    228        1.1        mw 
    229       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    230        1.1        mw 	error = 0;
    231       1.11    chopps 
    232        1.1        mw 	switch (cmd) {
    233        1.5        mw 	case OGRFIOCGINFO:
    234        1.5        mw 	        /* argl.. no bank-member.. */
    235        1.5        mw 	  	bcopy((caddr_t)&gp->g_display, data, sizeof(struct grfinfo)-4);
    236        1.5        mw 		break;
    237        1.1        mw 	case GRFIOCGINFO:
    238        1.1        mw 		bcopy((caddr_t)&gp->g_display, data, sizeof(struct grfinfo));
    239        1.1        mw 		break;
    240        1.1        mw 	case GRFIOCON:
    241        1.1        mw 		error = grfon(dev);
    242        1.1        mw 		break;
    243        1.1        mw 	case GRFIOCOFF:
    244        1.1        mw 		error = grfoff(dev);
    245        1.1        mw 		break;
    246        1.1        mw 	case GRFIOCSINFO:
    247       1.11    chopps 		error = grfsinfo(dev, (struct grfdyninfo *) data);
    248        1.1        mw 		break;
    249        1.3        mw 	case GRFGETVMODE:
    250       1.26     veego 		return(gp->g_mode(gp, GM_GRFGETVMODE, data, 0, 0));
    251        1.3        mw 	case GRFSETVMODE:
    252       1.26     veego 		error = gp->g_mode(gp, GM_GRFSETVMODE, data, 0, 0);
    253       1.18    chopps 		if (error == 0 && gp->g_itedev && !(gp->g_flags & GF_GRFON))
    254       1.11    chopps 			ite_reinit(gp->g_itedev);
    255        1.3        mw 		break;
    256        1.3        mw 	case GRFGETNUMVM:
    257       1.26     veego 		return(gp->g_mode(gp, GM_GRFGETNUMVM, data, 0, 0));
    258       1.11    chopps 	/*
    259       1.11    chopps 	 * these are all hardware dependant, and have to be resolved
    260       1.11    chopps 	 * in the respective driver.
    261       1.11    chopps 	 */
    262        1.5        mw 	case GRFIOCPUTCMAP:
    263        1.5        mw 	case GRFIOCGETCMAP:
    264        1.5        mw 	case GRFIOCSSPRITEPOS:
    265        1.5        mw 	case GRFIOCGSPRITEPOS:
    266        1.5        mw 	case GRFIOCSSPRITEINF:
    267        1.5        mw 	case GRFIOCGSPRITEINF:
    268        1.5        mw 	case GRFIOCGSPRITEMAX:
    269       1.18    chopps 	case GRFIOCBITBLT:
    270       1.20    chopps     	case GRFIOCSETMON:
    271       1.17    chopps 	case GRFTOGGLE: /* Toggles between Cirrus boards and native ECS on
    272       1.17    chopps                      Amiga. 15/11/94 ill */
    273       1.22    chopps 		/*
    274       1.22    chopps 		 * We need the minor dev number to get the overlay/image
    275       1.22    chopps 		 * information for grf_ul.
    276       1.22    chopps 		 */
    277       1.26     veego 		return(gp->g_mode(gp, GM_GRFIOCTL, data, cmd, dev));
    278       1.27        is 
    279       1.34        is 	case GRFIOCBLANK:	/* blank ioctl, IOCON/OFF will turn ite on */
    280       1.27        is 	case FBIOSVIDEO:
    281       1.34        is 		error = gp->g_mode(gp, GM_GRFIOCTL, data, GRFIOCBLANK, dev);
    282       1.34        is 		if (!error)
    283       1.34        is 			gp->g_blank = *(int *)data;
    284       1.34        is 		return (error);
    285       1.34        is 
    286       1.34        is 	case FBIOGVIDEO:
    287       1.34        is 		*(int *)data = gp->g_blank;
    288       1.34        is 		return (0);
    289       1.27        is 
    290        1.1        mw 	default:
    291       1.21    chopps #if NVIEW > 0
    292       1.11    chopps 		/*
    293       1.11    chopps 		 * check to see whether it's a command recognized by the
    294       1.11    chopps 		 * view code if the unit is 0
    295       1.11    chopps 		 * XXX
    296       1.11    chopps 		 */
    297        1.5        mw 		if (GRFUNIT(dev) == 0)
    298       1.11    chopps 			return(viewioctl(dev, cmd, data, flag, p));
    299       1.21    chopps #endif
    300        1.1        mw 		error = EINVAL;
    301        1.1        mw 		break;
    302        1.1        mw 
    303        1.1        mw 	}
    304        1.1        mw 	return(error);
    305        1.1        mw }
    306        1.1        mw 
    307        1.1        mw /*ARGSUSED*/
    308       1.11    chopps int
    309       1.30    mhitch grfpoll(dev, events, p)
    310        1.1        mw 	dev_t dev;
    311       1.30    mhitch 	int events;
    312       1.26     veego 	struct proc *p;
    313        1.1        mw {
    314       1.30    mhitch 	return(events & (POLLOUT | POLLWRNORM));
    315        1.1        mw }
    316        1.1        mw 
    317       1.11    chopps /*
    318       1.11    chopps  * map the contents of a graphics display card into process'
    319       1.11    chopps  * memory space.
    320       1.11    chopps  */
    321  1.34.12.1    simonb paddr_t
    322       1.19   mycroft grfmmap(dev, off, prot)
    323       1.11    chopps 	dev_t dev;
    324  1.34.12.1    simonb 	off_t off;
    325  1.34.12.1    simonb 	int prot;
    326        1.1        mw {
    327       1.11    chopps 	struct grf_softc *gp;
    328       1.11    chopps 	struct grfinfo *gi;
    329       1.11    chopps 
    330       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    331       1.11    chopps 	gi = &gp->g_display;
    332        1.1        mw 
    333       1.11    chopps 	/*
    334       1.11    chopps 	 * control registers
    335       1.11    chopps 	 */
    336       1.11    chopps 	if (off >= 0 && off < gi->gd_regsize)
    337  1.34.12.1    simonb 		return(((paddr_t)gi->gd_regaddr + off) >> PGSHIFT);
    338        1.1        mw 
    339       1.11    chopps 	/*
    340       1.11    chopps 	 * frame buffer
    341       1.11    chopps 	 */
    342       1.11    chopps 	if (off >= gi->gd_regsize && off < gi->gd_regsize+gi->gd_fbsize) {
    343       1.11    chopps 		off -= gi->gd_regsize;
    344       1.11    chopps #ifdef BANKEDDEVPAGER
    345       1.11    chopps 		if (gi->gd_bank_size)
    346       1.11    chopps 			off %= gi->gd_bank_size;
    347        1.1        mw #endif
    348  1.34.12.1    simonb 		return(((paddr_t)gi->gd_fbaddr + off) >> PGSHIFT);
    349        1.1        mw 	}
    350       1.11    chopps 	/* bogus */
    351       1.11    chopps 	return(-1);
    352        1.1        mw }
    353        1.1        mw 
    354       1.11    chopps int
    355       1.11    chopps grfon(dev)
    356        1.1        mw 	dev_t dev;
    357        1.1        mw {
    358       1.11    chopps 	struct grf_softc *gp;
    359        1.1        mw 
    360       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    361        1.1        mw 
    362        1.3        mw 	if (gp->g_flags & GF_GRFON)
    363       1.11    chopps 		return(0);
    364       1.11    chopps 
    365        1.3        mw 	gp->g_flags |= GF_GRFON;
    366       1.11    chopps 	if (gp->g_itedev != NODEV)
    367       1.11    chopps 		ite_off(gp->g_itedev, 3);
    368        1.3        mw 
    369       1.26     veego 	return(gp->g_mode(gp, (dev & GRFOVDEV) ? GM_GRFOVON : GM_GRFON,
    370       1.26     veego 							NULL, 0, 0));
    371        1.1        mw }
    372        1.1        mw 
    373       1.11    chopps int
    374        1.1        mw grfoff(dev)
    375        1.1        mw 	dev_t dev;
    376        1.1        mw {
    377       1.11    chopps 	struct grf_softc *gp;
    378        1.1        mw 	int error;
    379        1.3        mw 
    380       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    381       1.11    chopps 
    382       1.11    chopps 	if ((gp->g_flags & GF_GRFON) == 0)
    383       1.11    chopps 		return(0);
    384       1.11    chopps 
    385        1.3        mw 	gp->g_flags &= ~GF_GRFON;
    386       1.26     veego 	error = gp->g_mode(gp, (dev & GRFOVDEV) ? GM_GRFOVOFF : GM_GRFOFF,
    387       1.26     veego 							NULL, 0, 0);
    388       1.11    chopps 
    389       1.11    chopps 	/*
    390       1.11    chopps 	 * Closely tied together no X's
    391       1.11    chopps 	 */
    392       1.11    chopps 	if (gp->g_itedev != NODEV)
    393       1.11    chopps 		ite_on(gp->g_itedev, 2);
    394        1.1        mw 
    395        1.1        mw 	return(error);
    396        1.1        mw }
    397        1.1        mw 
    398       1.11    chopps int
    399        1.1        mw grfsinfo(dev, dyninfo)
    400        1.1        mw 	dev_t dev;
    401        1.1        mw 	struct grfdyninfo *dyninfo;
    402        1.1        mw {
    403       1.11    chopps 	struct grf_softc *gp;
    404        1.1        mw 	int error;
    405        1.1        mw 
    406       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    407       1.26     veego 	error = gp->g_mode(gp, GM_GRFCONFIG, dyninfo, 0, 0);
    408        1.1        mw 
    409       1.11    chopps 	/*
    410       1.11    chopps 	 * Closely tied together no X's
    411       1.11    chopps 	 */
    412       1.11    chopps 	if (gp->g_itedev != NODEV)
    413       1.11    chopps 		ite_reinit(gp->g_itedev);
    414        1.1        mw 	return(error);
    415        1.1        mw }
    416        1.1        mw 
    417        1.5        mw #ifdef BANKEDDEVPAGER
    418        1.5        mw 
    419        1.5        mw int
    420        1.5        mw grfbanked_get (dev, off, prot)
    421        1.5        mw      dev_t dev;
    422        1.5        mw      off_t off;
    423        1.5        mw      int   prot;
    424        1.5        mw {
    425       1.11    chopps 	struct grf_softc *gp;
    426       1.11    chopps 	struct grfinfo *gi;
    427       1.11    chopps 	int error, bank;
    428       1.11    chopps 
    429       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    430       1.11    chopps 	gi = &gp->g_display;
    431       1.11    chopps 
    432       1.11    chopps 	off -= gi->gd_regsize;
    433       1.11    chopps 	if (off < 0 || off >= gi->gd_fbsize)
    434       1.11    chopps 		return -1;
    435        1.5        mw 
    436       1.11    chopps 	error = gp->g_mode(gp, GM_GRFGETBANK, &bank, off, prot);
    437       1.11    chopps 	return error ? -1 : bank;
    438        1.5        mw }
    439        1.5        mw 
    440        1.5        mw int
    441        1.5        mw grfbanked_cur (dev)
    442       1.11    chopps 	dev_t dev;
    443        1.5        mw {
    444       1.11    chopps 	struct grf_softc *gp;
    445       1.11    chopps 	int error, bank;
    446        1.5        mw 
    447       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    448       1.11    chopps 
    449       1.26     veego 	error = gp->g_mode(gp, GM_GRFGETCURBANK, &bank, 0, 0);
    450       1.11    chopps 	return(error ? -1 : bank);
    451        1.5        mw }
    452        1.5        mw 
    453        1.5        mw int
    454        1.5        mw grfbanked_set (dev, bank)
    455       1.11    chopps 	dev_t dev;
    456       1.11    chopps 	int bank;
    457        1.5        mw {
    458       1.11    chopps 	struct grf_softc *gp;
    459        1.5        mw 
    460       1.11    chopps 	gp = grfsp[GRFUNIT(dev)];
    461       1.26     veego 	return(gp->g_mode(gp, GM_GRFSETBANK, &bank, 0, 0) ? -1 : 0);
    462        1.5        mw }
    463        1.5        mw 
    464        1.5        mw #endif /* BANKEDDEVPAGER */
    465        1.1        mw #endif	/* NGRF > 0 */
    466