vga_isa.c revision 111462
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 111462 2003-02-25 03:21:22Z mux $
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,
8543105Sdfr};
8643105Sdfr
8743105Sdfr#endif /* FB_INSTALL_CDEV */
8843105Sdfr
8962225Speterstatic void
9062225Speterisavga_identify(driver_t *driver, device_t parent)
9162225Speter{
9262225Speter	BUS_ADD_CHILD(parent, ISA_ORDER_SPECULATIVE, VGA_DRIVER_NAME, 0);
9362225Speter}
9462225Speter
9543105Sdfrstatic int
9643105Sdfrisavga_probe(device_t dev)
9743105Sdfr{
9848104Syokota	video_adapter_t adp;
9948104Syokota	device_t bus;
10048104Syokota	int error;
10143105Sdfr
10247618Sdfr	/* No pnp support */
10347618Sdfr	if (isa_get_vendorid(dev))
10447618Sdfr		return (ENXIO);
10547618Sdfr
10643105Sdfr	device_set_desc(dev, "Generic ISA VGA");
10751052Sdfr	error = vga_probe_unit(device_get_unit(dev), &adp, device_get_flags(dev));
10848104Syokota	if (error == 0) {
10948104Syokota		bus = device_get_parent(dev);
11052174Sdfr		bus_set_resource(dev, SYS_RES_IOPORT, 0,
11148104Syokota				 adp.va_io_base, adp.va_io_size);
11252174Sdfr		bus_set_resource(dev, SYS_RES_MEMORY, 0,
11348104Syokota				 adp.va_mem_base, adp.va_mem_size);
11448104Syokota#if 0
11548104Syokota		isa_set_port(dev, adp.va_io_base);
11648104Syokota		isa_set_portsize(dev, adp.va_io_size);
11748104Syokota		isa_set_maddr(dev, adp.va_mem_base);
11848104Syokota		isa_set_msize(dev, adp.va_mem_size);
11948104Syokota#endif
12048104Syokota	}
12148104Syokota	return error;
12243105Sdfr}
12343105Sdfr
12443105Sdfrstatic int
12543105Sdfrisavga_attach(device_t dev)
12643105Sdfr{
12748104Syokota	vga_softc_t *sc;
12848104Syokota	struct resource *port;
12948104Syokota	struct resource *mem;
13048104Syokota	int unit;
13148104Syokota	int rid;
13248104Syokota	int error;
13343105Sdfr
13448104Syokota	unit = device_get_unit(dev);
13543105Sdfr	sc = device_get_softc(dev);
13643105Sdfr
13748104Syokota	rid = 0;
13848104Syokota	port = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
13948104Syokota				  0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
14048104Syokota	rid = 0;
14148104Syokota	mem = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
14248104Syokota				 0, ~0, 0, RF_ACTIVE | RF_SHAREABLE);
14343105Sdfr
14451052Sdfr	error = vga_attach_unit(unit, sc, device_get_flags(dev));
14543105Sdfr	if (error)
14648104Syokota		return error;
14743105Sdfr
14843105Sdfr#ifdef FB_INSTALL_CDEV
14943105Sdfr	/* attach a virtual frame buffer device */
15048104Syokota	error = fb_attach(makedev(0, VGA_MKMINOR(unit)), sc->adp, &isavga_cdevsw);
15143105Sdfr	if (error)
15243105Sdfr		return error;
15343105Sdfr#endif /* FB_INSTALL_CDEV */
15443105Sdfr
15543105Sdfr	if (bootverbose)
15643664Syokota		(*vidsw[sc->adp->va_index]->diag)(sc->adp, bootverbose);
15743105Sdfr
15848104Syokota#if experimental
15954073Smdodd	device_add_child(dev, "fb", -1);
16048104Syokota	bus_generic_attach(dev);
16143105Sdfr#endif
16243105Sdfr
16348104Syokota	return 0;
16443105Sdfr}
16543105Sdfr
16648104Syokota#ifdef FB_INSTALL_CDEV
16743105Sdfr
16843105Sdfrstatic int
16983366Sjulianisavga_open(dev_t dev, int flag, int mode, struct thread *td)
17043105Sdfr{
17183366Sjulian	return vga_open(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td);
17243105Sdfr}
17343105Sdfr
17443105Sdfrstatic int
17583366Sjulianisavga_close(dev_t dev, int flag, int mode, struct thread *td)
17643105Sdfr{
17783366Sjulian	return vga_close(dev, VGA_SOFTC(VGA_UNIT(dev)), flag, mode, td);
17843105Sdfr}
17943105Sdfr
18043105Sdfrstatic int
18148104Syokotaisavga_read(dev_t dev, struct uio *uio, int flag)
18243105Sdfr{
18348104Syokota	return vga_read(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
18443105Sdfr}
18543105Sdfr
18643105Sdfrstatic int
18748104Syokotaisavga_write(dev_t dev, struct uio *uio, int flag)
18843105Sdfr{
18948104Syokota	return vga_write(dev, VGA_SOFTC(VGA_UNIT(dev)), uio, flag);
19043105Sdfr}
19143105Sdfr
19243105Sdfrstatic int
19383366Sjulianisavga_ioctl(dev_t dev, u_long cmd, caddr_t arg, int flag, struct thread *td)
19443105Sdfr{
19583366Sjulian	return vga_ioctl(dev, VGA_SOFTC(VGA_UNIT(dev)), cmd, arg, flag, td);
19643105Sdfr}
19743105Sdfr
19843105Sdfrstatic int
199111462Smuxisavga_mmap(dev_t dev, vm_offset_t offset, vm_offset_t *paddr, int prot)
20043105Sdfr{
201111462Smux	return vga_mmap(dev, VGA_SOFTC(VGA_UNIT(dev)), offset, paddr, prot);
20243105Sdfr}
20343105Sdfr
20448104Syokota#endif /* FB_INSTALL_CDEV */
20562225Speter
20662225Speterstatic device_method_t isavga_methods[] = {
20762225Speter	DEVMETHOD(device_identify,	isavga_identify),
20862225Speter	DEVMETHOD(device_probe,		isavga_probe),
20962225Speter	DEVMETHOD(device_attach,	isavga_attach),
21062225Speter
21162225Speter	DEVMETHOD(bus_print_child,	bus_generic_print_child),
21262225Speter	{ 0, 0 }
21362225Speter};
21462225Speter
21562225Speterstatic driver_t isavga_driver = {
21662225Speter	VGA_DRIVER_NAME,
21762225Speter	isavga_methods,
21862225Speter	sizeof(vga_softc_t),
21962225Speter};
22062225Speter
22162225SpeterDRIVER_MODULE(vga, isa, isavga_driver, isavga_devclass, 0, 0);
222