vga_isa.c revision 111815
143105Sdfr/*-
243105Sdfr * Copyright (c) 1999 Kazutaka YOKOTA <yokota@zodiac.mech.utsunomiya-u.ac.jp>
343105Sdfr * All rights reserved.
443105Sdfr *
543105Sdfr * Redistribution and use in source and binary forms, with or without
643105Sdfr * modification, are permitted provided that the following conditions
743105Sdfr * are met:
843105Sdfr * 1. Redistributions of source code must retain the above copyright
943105Sdfr *    notice, this list of conditions and the following disclaimer as
1043105Sdfr *    the first lines of this file unmodified.
1143105Sdfr * 2. Redistributions in binary form must reproduce the above copyright
1243105Sdfr *    notice, this list of conditions and the following disclaimer in the
1343105Sdfr *    documentation and/or other materials provided with the distribution.
1443105Sdfr *
1543105Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
1643105Sdfr * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1743105Sdfr * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1843105Sdfr * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
1943105Sdfr * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2043105Sdfr * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2143105Sdfr * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2243105Sdfr * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2343105Sdfr * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2443105Sdfr * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2543105Sdfr *
2650477Speter * $FreeBSD: head/sys/isa/vga_isa.c 111815 2003-03-03 12:15:54Z phk $
2743105Sdfr */
2843105Sdfr
2943105Sdfr#include "opt_vga.h"
3043105Sdfr#include "opt_fb.h"
3143105Sdfr#include "opt_syscons.h"	/* should be removed in the future, XXX */
3243105Sdfr
3343105Sdfr#include <sys/param.h>
3443105Sdfr#include <sys/systm.h>
3543105Sdfr#include <sys/kernel.h>
3648104Syokota#include <sys/conf.h>
3743105Sdfr#include <sys/bus.h>
3848104Syokota#include <sys/fbio.h>
3943105Sdfr
4048104Syokota#include <machine/bus.h>
4148104Syokota#include <machine/resource.h>
4248104Syokota
4348104Syokota#include <sys/rman.h>
4448104Syokota
4543105Sdfr#include <vm/vm.h>
4643105Sdfr#include <vm/pmap.h>
4743105Sdfr
4843105Sdfr#include <machine/md_var.h>
4943105Sdfr#include <machine/pc/bios.h>
5043105Sdfr
5143105Sdfr#include <dev/fb/fbreg.h>
5243105Sdfr#include <dev/fb/vgareg.h>
5343105Sdfr
5443105Sdfr#include <isa/isareg.h>
5543105Sdfr#include <isa/isavar.h>
5643105Sdfr
5748104Syokota#define VGA_SOFTC(unit)		\
5848104Syokota	((vga_softc_t *)devclass_get_softc(isavga_devclass, unit))
5943105Sdfr
6048104Syokotastatic devclass_t	isavga_devclass;
6143105Sdfr
6243105Sdfr#ifdef FB_INSTALL_CDEV
6343105Sdfr
6448104Syokotastatic d_open_t		isavga_open;
6548104Syokotastatic d_close_t	isavga_close;
6648104Syokotastatic d_read_t		isavga_read;
6748104Syokotastatic d_write_t	isavga_write;
6848104Syokotastatic d_ioctl_t	isavga_ioctl;
6948104Syokotastatic d_mmap_t		isavga_mmap;
7043105Sdfr
7148104Syokotastatic struct cdevsw isavga_cdevsw = {
72111815Sphk	.d_open =	isavga_open,
73111815Sphk	.d_close =	isavga_close,
74111815Sphk	.d_read =	isavga_read,
75111815Sphk	.d_write =	isavga_write,
76111815Sphk	.d_ioctl =	isavga_ioctl,
77111815Sphk	.d_mmap =	isavga_mmap,
78111815Sphk	.d_name =	VGA_DRIVER_NAME,
79111815Sphk	.d_maj =	-1,
8043105Sdfr};
8143105Sdfr
8243105Sdfr#endif /* FB_INSTALL_CDEV */
8343105Sdfr
8462225Speterstatic void
8562225Speterisavga_identify(driver_t *driver, device_t parent)
8662225Speter{
8762225Speter	BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, VGA_DRIVER_NAME, 0);
8862225Speter}
8962225Speter
9043105Sdfrstatic int
9143105Sdfrisavga_probe(device_t dev)
9243105Sdfr{
9348104Syokota	video_adapter_t adp;
9448104Syokota	device_t bus;
9548104Syokota	int error;
9643105Sdfr
9747618Sdfr	/* No pnp support */
9847618Sdfr	if (isa_get_vendorid(dev))
9947618Sdfr		return (ENXIO);
10047618Sdfr
10143105Sdfr	device_set_desc(dev, "Generic ISA VGA");
10251052Sdfr	error = vga_probe_unit(device_get_unit(dev), &adp, device_get_flags(dev));
10348104Syokota	if (error == 0) {
10448104Syokota		bus = device_get_parent(dev);
10552174Sdfr		bus_set_resource(dev, SYS_RES_IOPORT, 0,
10648104Syokota				 adp.va_io_base, adp.va_io_size);
10752174Sdfr		bus_set_resource(dev, SYS_RES_MEMORY, 0,
10848104Syokota				 adp.va_mem_base, adp.va_mem_size);
10948104Syokota#if 0
11048104Syokota		isa_set_port(dev, adp.va_io_base);
11148104Syokota		isa_set_portsize(dev, adp.va_io_size);
11248104Syokota		isa_set_maddr(dev, adp.va_mem_base);
11348104Syokota		isa_set_msize(dev, adp.va_mem_size);
11448104Syokota#endif
11548104Syokota	}
11648104Syokota	return error;
11743105Sdfr}
11843105Sdfr
11943105Sdfrstatic int
12043105Sdfrisavga_attach(device_t dev)
12143105Sdfr{
12248104Syokota	vga_softc_t *sc;
12348104Syokota	struct resource *port;
12448104Syokota	struct resource *mem;
12548104Syokota	int unit;
12648104Syokota	int rid;
12748104Syokota	int error;
12843105Sdfr
12948104Syokota	unit = device_get_unit(dev);
13043105Sdfr	sc = device_get_softc(dev);
13143105Sdfr
13248104Syokota	rid = 0;
13348104Syokota	port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
13448104Syokota				  0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
13548104Syokota	rid = 0;
13648104Syokota	mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
13748104Syokota				 0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
13843105Sdfr
13951052Sdfr	error = vga_attach_unit(unit, sc, device_get_flags(dev));
14043105Sdfr	if (error)
14148104Syokota		return error;
14243105Sdfr
14343105Sdfr#ifdef FB_INSTALL_CDEV
14443105Sdfr	/* attach a virtual frame buffer device */
14548104Syokota	error = fb_attach(makedev(0, VGA_MKMINOR(unit)), sc->adp, &isavga_cdevsw);
14643105Sdfr	if (error)
14743105Sdfr		return error;
14843105Sdfr#endif /* FB_INSTALL_CDEV */
14943105Sdfr
15043105Sdfr	if (bootverbose)
15143664Syokota		(*vidsw[sc->adp->va_index]->diag)(sc->adp, bootverbose);
15243105Sdfr
15348104Syokota#if experimental
15454073Smdodd	device_add_child(dev, "fb", -1);
15548104Syokota	bus_generic_attach(dev);
15643105Sdfr#endif
15743105Sdfr
15848104Syokota	return 0;
15943105Sdfr}
16043105Sdfr
16148104Syokota#ifdef FB_INSTALL_CDEV
16243105Sdfr
16343105Sdfrstatic int
16483366Sjulianisavga_open(dev_t dev, int flag, int mode, struct thread *td)
16543105Sdfr{
16683366Sjulian	return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td);
16743105Sdfr}
16843105Sdfr
16943105Sdfrstatic int
17083366Sjulianisavga_close(dev_t dev, int flag, int mode, struct thread *td)
17143105Sdfr{
17283366Sjulian	return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td);
17343105Sdfr}
17443105Sdfr
17543105Sdfrstatic int
17648104Syokotaisavga_read(dev_t dev, struct uio *uio, int flag)
17743105Sdfr{
17848104Syokota	return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
17943105Sdfr}
18043105Sdfr
18143105Sdfrstatic int
18248104Syokotaisavga_write(dev_t dev, struct uio *uio, int flag)
18343105Sdfr{
18448104Syokota	return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
18543105Sdfr}
18643105Sdfr
18743105Sdfrstatic int
18883366Sjulianisavga_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
18943105Sdfr{
19083366Sjulian	return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td);
19143105Sdfr}
19243105Sdfr
19343105Sdfrstatic int
194111462Smuxisavga_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
19543105Sdfr{
196111462Smux	return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot);
19743105Sdfr}
19843105Sdfr
19948104Syokota#endif /* FB_INSTALL_CDEV */
20062225Speter
20162225Speterstatic device_method_t isavga_methods[] = {
20262225Speter	DEVMETHOD(device_identify,	isavga_identify),
20362225Speter	DEVMETHOD(device_probe,		isavga_probe),
20462225Speter	DEVMETHOD(device_attach,	isavga_attach),
20562225Speter
20662225Speter	DEVMETHOD(bus_print_child,	bus_generic_print_child),
20762225Speter	{ 0, 0 }
20862225Speter};
20962225Speter
21062225Speterstatic driver_t isavga_driver = {
21162225Speter	VGA_DRIVER_NAME,
21262225Speter	isavga_methods,
21362225Speter	sizeof(vga_softc_t),
21462225Speter};
21562225Speter
21662225SpeterDRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0);
217