xref: /freebsd/sys/isa/vga_isa.c (revision 6e8394b8)
18a997770SDoug Rabson /*-
28a997770SDoug Rabson  * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
38a997770SDoug Rabson  * All rights reserved.
48a997770SDoug Rabson  *
58a997770SDoug Rabson  * Redistribution and use in source and binary forms, with or without
68a997770SDoug Rabson  * modification, are permitted provided that the following conditions
78a997770SDoug Rabson  * are met:
88a997770SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
98a997770SDoug Rabson  *    notice, this list of conditions and the following disclaimer as
108a997770SDoug Rabson  *    the first lines of this file unmodified.
118a997770SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
128a997770SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
138a997770SDoug Rabson  *    documentation and/or other materials provided with the distribution.
148a997770SDoug Rabson  *
158a997770SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
168a997770SDoug Rabson  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
178a997770SDoug Rabson  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
188a997770SDoug Rabson  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
198a997770SDoug Rabson  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
208a997770SDoug Rabson  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
218a997770SDoug Rabson  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
228a997770SDoug Rabson  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238a997770SDoug Rabson  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
248a997770SDoug Rabson  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258a997770SDoug Rabson  *
266e8394b8SKazutaka YOKOTA  * $Id: vga_isa.c,v 1.10 1999/05/30 16:52:49 phk Exp $
278a997770SDoug Rabson  */
288a997770SDoug Rabson 
298a997770SDoug Rabson #include "vga.h"
308a997770SDoug Rabson #include "opt_vga.h"
318a997770SDoug Rabson #include "opt_fb.h"
328a997770SDoug Rabson #include "opt_syscons.h"	/* should be removed in the future, XXX */
338a997770SDoug Rabson 
348a997770SDoug Rabson #if NVGA > 0
358a997770SDoug Rabson 
368a997770SDoug Rabson #include <sys/param.h>
378a997770SDoug Rabson #include <sys/systm.h>
388a997770SDoug Rabson #include <sys/kernel.h>
396e8394b8SKazutaka YOKOTA #include <sys/conf.h>
408a997770SDoug Rabson #include <sys/bus.h>
416e8394b8SKazutaka YOKOTA #include <sys/fbio.h>
426e8394b8SKazutaka YOKOTA 
436e8394b8SKazutaka YOKOTA #include <machine/bus.h>
446e8394b8SKazutaka YOKOTA #include <machine/resource.h>
456e8394b8SKazutaka YOKOTA 
466e8394b8SKazutaka YOKOTA #include <sys/rman.h>
478a997770SDoug Rabson 
488a997770SDoug Rabson #include <vm/vm.h>
498a997770SDoug Rabson #include <vm/pmap.h>
508a997770SDoug Rabson 
518a997770SDoug Rabson #include <machine/md_var.h>
528a997770SDoug Rabson #include <machine/pc/bios.h>
538a997770SDoug Rabson 
548a997770SDoug Rabson #include <dev/fb/fbreg.h>
558a997770SDoug Rabson #include <dev/fb/vgareg.h>
568a997770SDoug Rabson 
578a997770SDoug Rabson #include <isa/isareg.h>
588a997770SDoug Rabson #include <isa/isavar.h>
598a997770SDoug Rabson 
606e8394b8SKazutaka YOKOTA #define VGA_SOFTC(unit)		\
616e8394b8SKazutaka YOKOTA 	((vga_softc_t *)devclass_get_softc(isavga_devclass, unit))
628a997770SDoug Rabson 
636e8394b8SKazutaka YOKOTA static devclass_t	isavga_devclass;
648a997770SDoug Rabson 
658a997770SDoug Rabson static int		isavga_probe(device_t dev);
668a997770SDoug Rabson static int		isavga_attach(device_t dev);
678a997770SDoug Rabson 
688a997770SDoug Rabson static device_method_t isavga_methods[] = {
698a997770SDoug Rabson 	DEVMETHOD(device_probe,		isavga_probe),
708a997770SDoug Rabson 	DEVMETHOD(device_attach,	isavga_attach),
716e8394b8SKazutaka YOKOTA 
726e8394b8SKazutaka YOKOTA 	DEVMETHOD(bus_print_child,	bus_generic_print_child),
738a997770SDoug Rabson 	{ 0, 0 }
748a997770SDoug Rabson };
758a997770SDoug Rabson 
768a997770SDoug Rabson static driver_t isavga_driver = {
776e8394b8SKazutaka YOKOTA 	VGA_DRIVER_NAME,
788a997770SDoug Rabson 	isavga_methods,
796e8394b8SKazutaka YOKOTA 	sizeof(vga_softc_t),
808a997770SDoug Rabson };
818a997770SDoug Rabson 
828a997770SDoug Rabson DRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0);
838a997770SDoug Rabson 
848a997770SDoug Rabson #ifdef FB_INSTALL_CDEV
858a997770SDoug Rabson 
866e8394b8SKazutaka YOKOTA static d_open_t		isavga_open;
876e8394b8SKazutaka YOKOTA static d_close_t	isavga_close;
886e8394b8SKazutaka YOKOTA static d_read_t		isavga_read;
896e8394b8SKazutaka YOKOTA static d_write_t	isavga_write;
906e8394b8SKazutaka YOKOTA static d_ioctl_t	isavga_ioctl;
916e8394b8SKazutaka YOKOTA static d_mmap_t		isavga_mmap;
928a997770SDoug Rabson 
936e8394b8SKazutaka YOKOTA static struct cdevsw isavga_cdevsw = {
946e8394b8SKazutaka YOKOTA 	/* open */	isavga_open,
956e8394b8SKazutaka YOKOTA 	/* close */	isavga_close,
966e8394b8SKazutaka YOKOTA 	/* read */	isavga_read,
976e8394b8SKazutaka YOKOTA 	/* write */	isavga_write,
986e8394b8SKazutaka YOKOTA 	/* ioctl */	isavga_ioctl,
994e2f199eSPoul-Henning Kamp 	/* stop */	nostop,
1004e2f199eSPoul-Henning Kamp 	/* reset */	noreset,
1014e2f199eSPoul-Henning Kamp 	/* devtotty */	nodevtotty,
1024e2f199eSPoul-Henning Kamp 	/* poll */	nopoll,
1036e8394b8SKazutaka YOKOTA 	/* mmap */	isavga_mmap,
1044e2f199eSPoul-Henning Kamp 	/* strategy */	nostrategy,
1056e8394b8SKazutaka YOKOTA 	/* name */	VGA_DRIVER_NAME,
1064e2f199eSPoul-Henning Kamp 	/* parms */	noparms,
1074e2f199eSPoul-Henning Kamp 	/* maj */	-1,
1084e2f199eSPoul-Henning Kamp 	/* dump */	nodump,
1094e2f199eSPoul-Henning Kamp 	/* psize */	nopsize,
1104e2f199eSPoul-Henning Kamp 	/* flags */	0,
1114e2f199eSPoul-Henning Kamp 	/* maxio */	0,
1124e2f199eSPoul-Henning Kamp 	/* bmaj */	-1
1138a997770SDoug Rabson };
1148a997770SDoug Rabson 
1158a997770SDoug Rabson #endif /* FB_INSTALL_CDEV */
1168a997770SDoug Rabson 
1178a997770SDoug Rabson static int
1188a997770SDoug Rabson isavga_probe(device_t dev)
1198a997770SDoug Rabson {
1206e8394b8SKazutaka YOKOTA 	video_adapter_t adp;
1216e8394b8SKazutaka YOKOTA 	device_t bus;
1226e8394b8SKazutaka YOKOTA 	int error;
1238a997770SDoug Rabson 
124f7f2df54SDoug Rabson 	/* No pnp support */
125f7f2df54SDoug Rabson 	if (isa_get_vendorid(dev))
126f7f2df54SDoug Rabson 		return (ENXIO);
127f7f2df54SDoug Rabson 
1288a997770SDoug Rabson 	device_set_desc(dev, "Generic ISA VGA");
1296e8394b8SKazutaka YOKOTA 	error = vga_probe_unit(device_get_unit(dev), &adp, isa_get_flags(dev));
1306e8394b8SKazutaka YOKOTA 	if (error == 0) {
1316e8394b8SKazutaka YOKOTA 		bus = device_get_parent(dev);
1326e8394b8SKazutaka YOKOTA 		ISA_SET_RESOURCE(bus, dev, SYS_RES_IOPORT, 0,
1336e8394b8SKazutaka YOKOTA 				 adp.va_io_base, adp.va_io_size);
1346e8394b8SKazutaka YOKOTA 		ISA_SET_RESOURCE(bus, dev, SYS_RES_MEMORY, 0,
1356e8394b8SKazutaka YOKOTA 				 adp.va_mem_base, adp.va_mem_size);
1366e8394b8SKazutaka YOKOTA #if 0
1376e8394b8SKazutaka YOKOTA 		isa_set_port(dev, adp.va_io_base);
1386e8394b8SKazutaka YOKOTA 		isa_set_portsize(dev, adp.va_io_size);
1396e8394b8SKazutaka YOKOTA 		isa_set_maddr(dev, adp.va_mem_base);
1406e8394b8SKazutaka YOKOTA 		isa_set_msize(dev, adp.va_mem_size);
1416e8394b8SKazutaka YOKOTA #endif
1426e8394b8SKazutaka YOKOTA 	}
1436e8394b8SKazutaka YOKOTA 	return error;
1448a997770SDoug Rabson }
1458a997770SDoug Rabson 
1468a997770SDoug Rabson static int
1478a997770SDoug Rabson isavga_attach(device_t dev)
1488a997770SDoug Rabson {
1496e8394b8SKazutaka YOKOTA 	vga_softc_t *sc;
1506e8394b8SKazutaka YOKOTA 	struct resource *port;
1516e8394b8SKazutaka YOKOTA 	struct resource *mem;
1526e8394b8SKazutaka YOKOTA 	int unit;
1536e8394b8SKazutaka YOKOTA 	int rid;
1548a997770SDoug Rabson 	int error;
1558a997770SDoug Rabson 
1566e8394b8SKazutaka YOKOTA 	unit = device_get_unit(dev);
1576e8394b8SKazutaka YOKOTA 	sc = device_get_softc(dev);
1588a997770SDoug Rabson 
1596e8394b8SKazutaka YOKOTA 	rid = 0;
1606e8394b8SKazutaka YOKOTA 	port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
1616e8394b8SKazutaka YOKOTA 				  0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
1626e8394b8SKazutaka YOKOTA 	rid = 0;
1636e8394b8SKazutaka YOKOTA 	mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
1646e8394b8SKazutaka YOKOTA 				 0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
1656e8394b8SKazutaka YOKOTA 
1666e8394b8SKazutaka YOKOTA 	error = vga_attach_unit(unit, sc, isa_get_flags(dev));
1678a997770SDoug Rabson 	if (error)
1686e8394b8SKazutaka YOKOTA 		return error;
1698a997770SDoug Rabson 
1708a997770SDoug Rabson #ifdef FB_INSTALL_CDEV
1718a997770SDoug Rabson 	/* attach a virtual frame buffer device */
1726e8394b8SKazutaka YOKOTA 	error = fb_attach(makedev(0, VGA_MKMINOR(unit)), sc->adp, &isavga_cdevsw);
1738a997770SDoug Rabson 	if (error)
1748a997770SDoug Rabson 		return error;
1758a997770SDoug Rabson #endif /* FB_INSTALL_CDEV */
1768a997770SDoug Rabson 
1778a997770SDoug Rabson 	if (bootverbose)
1781c27745fSKazutaka YOKOTA 		(*vidsw[sc->adp->va_index]->diag)(sc->adp, bootverbose);
1798a997770SDoug Rabson 
1806e8394b8SKazutaka YOKOTA #if experimental
1816e8394b8SKazutaka YOKOTA 	device_add_child(dev, "fb", -1, NULL);
1826e8394b8SKazutaka YOKOTA 	bus_generic_attach(dev);
1838a997770SDoug Rabson #endif
1848a997770SDoug Rabson 
1858a997770SDoug Rabson 	return 0;
1868a997770SDoug Rabson }
1878a997770SDoug Rabson 
1886e8394b8SKazutaka YOKOTA #ifdef FB_INSTALL_CDEV
1896e8394b8SKazutaka YOKOTA 
1908a997770SDoug Rabson static int
1916e8394b8SKazutaka YOKOTA isavga_open(dev_t dev, int flag, int mode, struct proc *p)
1928a997770SDoug Rabson {
1936e8394b8SKazutaka YOKOTA 	return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, p);
1948a997770SDoug Rabson }
1958a997770SDoug Rabson 
1968a997770SDoug Rabson static int
1976e8394b8SKazutaka YOKOTA isavga_close(dev_t dev, int flag, int mode, struct proc *p)
1988a997770SDoug Rabson {
1996e8394b8SKazutaka YOKOTA 	return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, p);
2008a997770SDoug Rabson }
2018a997770SDoug Rabson 
2028a997770SDoug Rabson static int
2036e8394b8SKazutaka YOKOTA isavga_read(dev_t dev, struct uio *uio, int flag)
2048a997770SDoug Rabson {
2056e8394b8SKazutaka YOKOTA 	return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
2068a997770SDoug Rabson }
2078a997770SDoug Rabson 
2088a997770SDoug Rabson static int
2096e8394b8SKazutaka YOKOTA isavga_write(dev_t dev, struct uio *uio, int flag)
2108a997770SDoug Rabson {
2116e8394b8SKazutaka YOKOTA 	return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
2128a997770SDoug Rabson }
2138a997770SDoug Rabson 
2148a997770SDoug Rabson static int
2156e8394b8SKazutaka YOKOTA isavga_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *p)
2168a997770SDoug Rabson {
2176e8394b8SKazutaka YOKOTA 	return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, p);
2188a997770SDoug Rabson }
2198a997770SDoug Rabson 
2208a997770SDoug Rabson static int
2216e8394b8SKazutaka YOKOTA isavga_mmap(dev_t dev, vm_offset_t offset, int prot)
2228a997770SDoug Rabson {
2236e8394b8SKazutaka YOKOTA 	return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, prot);
2248a997770SDoug Rabson }
2258a997770SDoug Rabson 
2266e8394b8SKazutaka YOKOTA #endif /* FB_INSTALL_CDEV */
2278a997770SDoug Rabson 
2288a997770SDoug Rabson #endif /* NVGA > 0 */
229