vga_isa.c revision 62225
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 62225 2000-06-28 22:53:35Z peter $
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 = {
7248104Syokota	/* open */	isavga_open,
7348104Syokota	/* close */	isavga_close,
7448104Syokota	/* read */	isavga_read,
7548104Syokota	/* write */	isavga_write,
7648104Syokota	/* ioctl */	isavga_ioctl,
7747625Sphk	/* poll */	nopoll,
7848104Syokota	/* mmap */	isavga_mmap,
7947625Sphk	/* strategy */	nostrategy,
8048104Syokota	/* name */	VGA_DRIVER_NAME,
8147625Sphk	/* maj */	-1,
8247625Sphk	/* dump */	nodump,
8347625Sphk	/* psize */	nopsize,
8447625Sphk	/* flags */	0,
8547625Sphk	/* bmaj */	-1
8643105Sdfr};
8743105Sdfr
8843105Sdfr#endif /* FB_INSTALL_CDEV */
8943105Sdfr
9062225Speterstatic void
9162225Speterisavga_identify(driver_t *driver, device_t parent)
9262225Speter{
9362225Speter	BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, VGA_DRIVER_NAME, 0);
9462225Speter}
9562225Speter
9643105Sdfrstatic int
9743105Sdfrisavga_probe(device_t dev)
9843105Sdfr{
9948104Syokota	video_adapter_t adp;
10048104Syokota	device_t bus;
10148104Syokota	int error;
10243105Sdfr
10347618Sdfr	/* No pnp support */
10447618Sdfr	if (isa_get_vendorid(dev))
10547618Sdfr		return (ENXIO);
10647618Sdfr
10743105Sdfr	device_set_desc(dev, "Generic ISA VGA");
10851052Sdfr	error = vga_probe_unit(device_get_unit(dev), &adp, device_get_flags(dev));
10948104Syokota	if (error == 0) {
11048104Syokota		bus = device_get_parent(dev);
11152174Sdfr		bus_set_resource(dev, SYS_RES_IOPORT, 0,
11248104Syokota				 adp.va_io_base, adp.va_io_size);
11352174Sdfr		bus_set_resource(dev, SYS_RES_MEMORY, 0,
11448104Syokota				 adp.va_mem_base, adp.va_mem_size);
11548104Syokota#if 0
11648104Syokota		isa_set_port(dev, adp.va_io_base);
11748104Syokota		isa_set_portsize(dev, adp.va_io_size);
11848104Syokota		isa_set_maddr(dev, adp.va_mem_base);
11948104Syokota		isa_set_msize(dev, adp.va_mem_size);
12048104Syokota#endif
12148104Syokota	}
12248104Syokota	return error;
12343105Sdfr}
12443105Sdfr
12543105Sdfrstatic int
12643105Sdfrisavga_attach(device_t dev)
12743105Sdfr{
12848104Syokota	vga_softc_t *sc;
12948104Syokota	struct resource *port;
13048104Syokota	struct resource *mem;
13148104Syokota	int unit;
13248104Syokota	int rid;
13348104Syokota	int error;
13443105Sdfr
13548104Syokota	unit = device_get_unit(dev);
13643105Sdfr	sc = device_get_softc(dev);
13743105Sdfr
13848104Syokota	rid = 0;
13948104Syokota	port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
14048104Syokota				  0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
14148104Syokota	rid = 0;
14248104Syokota	mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
14348104Syokota				 0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
14443105Sdfr
14551052Sdfr	error = vga_attach_unit(unit, sc, device_get_flags(dev));
14643105Sdfr	if (error)
14748104Syokota		return error;
14843105Sdfr
14943105Sdfr#ifdef FB_INSTALL_CDEV
15043105Sdfr	/* attach a virtual frame buffer device */
15148104Syokota	error = fb_attach(makedev(0, VGA_MKMINOR(unit)), sc->adp, &isavga_cdevsw);
15243105Sdfr	if (error)
15343105Sdfr		return error;
15443105Sdfr#endif /* FB_INSTALL_CDEV */
15543105Sdfr
15643105Sdfr	if (bootverbose)
15743664Syokota		(*vidsw[sc->adp->va_index]->diag)(sc->adp, bootverbose);
15843105Sdfr
15948104Syokota#if experimental
16054073Smdodd	device_add_child(dev, "fb", -1);
16148104Syokota	bus_generic_attach(dev);
16243105Sdfr#endif
16343105Sdfr
16448104Syokota	return 0;
16543105Sdfr}
16643105Sdfr
16748104Syokota#ifdef FB_INSTALL_CDEV
16843105Sdfr
16943105Sdfrstatic int
17048104Syokotaisavga_open(dev_t dev, int flag, int mode, struct proc *p)
17143105Sdfr{
17248104Syokota	return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, p);
17343105Sdfr}
17443105Sdfr
17543105Sdfrstatic int
17648104Syokotaisavga_close(dev_t dev, int flag, int mode, struct proc *p)
17743105Sdfr{
17848104Syokota	return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, p);
17943105Sdfr}
18043105Sdfr
18143105Sdfrstatic int
18248104Syokotaisavga_read(dev_t dev, struct uio *uio, int flag)
18343105Sdfr{
18448104Syokota	return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
18543105Sdfr}
18643105Sdfr
18743105Sdfrstatic int
18848104Syokotaisavga_write(dev_t dev, struct uio *uio, int flag)
18943105Sdfr{
19048104Syokota	return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
19143105Sdfr}
19243105Sdfr
19343105Sdfrstatic int
19448104Syokotaisavga_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct proc *p)
19543105Sdfr{
19648104Syokota	return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, p);
19743105Sdfr}
19843105Sdfr
19943105Sdfrstatic int
20048104Syokotaisavga_mmap(dev_t dev, vm_offset_t offset, int prot)
20143105Sdfr{
20248104Syokota	return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, prot);
20343105Sdfr}
20443105Sdfr
20548104Syokota#endif /* FB_INSTALL_CDEV */
20662225Speter
20762225Speterstatic device_method_t isavga_methods[] = {
20862225Speter	DEVMETHOD(device_identify,	isavga_identify),
20962225Speter	DEVMETHOD(device_probe,		isavga_probe),
21062225Speter	DEVMETHOD(device_attach,	isavga_attach),
21162225Speter
21262225Speter	DEVMETHOD(bus_print_child,	bus_generic_print_child),
21362225Speter	{ 0, 0 }
21462225Speter};
21562225Speter
21662225Speterstatic driver_t isavga_driver = {
21762225Speter	VGA_DRIVER_NAME,
21862225Speter	isavga_methods,
21962225Speter	sizeof(vga_softc_t),
22062225Speter};
22162225Speter
22262225SpeterDRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0);
223