eisa_pci.c revision 129879
150276Speter/*- 2184989Srafan * Copyright (c) 1994,1995 Stefan Esser, Wolfgang StanglMeier 350276Speter * Copyright (c) 2000 Michael Smith <msmith@freebsd.org> 450276Speter * Copyright (c) 2000 BSDi 550276Speter * All rights reserved. 650276Speter * 750276Speter * Redistribution and use in source and binary forms, with or without 850276Speter * modification, are permitted provided that the following conditions 950276Speter * are met: 1050276Speter * 1. Redistributions of source code must retain the above copyright 1150276Speter * notice, this list of conditions and the following disclaimer. 1250276Speter * 2. Redistributions in binary form must reproduce the above copyright 1350276Speter * notice, this list of conditions and the following disclaimer in the 1450276Speter * documentation and/or other materials provided with the distribution. 1550276Speter * 3. The name of the author may not be used to endorse or promote products 1650276Speter * derived from this software without specific prior written permission. 1750276Speter * 1850276Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1950276Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2050276Speter * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2150276Speter * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 2250276Speter * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2350276Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2450276Speter * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2550276Speter * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2650276Speter * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2750276Speter * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2850276Speter * SUCH DAMAGE. 2950276Speter */ 3050276Speter 3150276Speter#include <sys/cdefs.h> 3250276Speter__FBSDID("$FreeBSD: head/sys/dev/pci/eisa_pci.c 129879 2004-05-30 20:08:47Z phk $"); 3350276Speter 3450276Speter/* 3550276Speter * PCI:EISA bridge support 3650276Speter */ 3750276Speter 3850276Speter#include <sys/param.h> 3950276Speter#include <sys/kernel.h> 4050276Speter#include <sys/module.h> 41174993Srafan#include <sys/bus.h> 4250276Speter 4366963Speter#include <dev/pci/pcivar.h> 4466963Speter#include <dev/pci/pcireg.h> 45184989Srafan 4650276Speterstatic int eisab_probe(device_t dev); 4750276Speterstatic int eisab_attach(device_t dev); 4866963Speter 4950276Speterstatic device_method_t eisab_methods[] = { 50184989Srafan /* Device interface */ 5150276Speter DEVMETHOD(device_probe, eisab_probe), 5250276Speter DEVMETHOD(device_attach, eisab_attach), 5350276Speter DEVMETHOD(device_shutdown, bus_generic_shutdown), 5450276Speter DEVMETHOD(device_suspend, bus_generic_suspend), 5550276Speter DEVMETHOD(device_resume, bus_generic_resume), 5666963Speter 5766963Speter /* Bus interface */ 5866963Speter DEVMETHOD(bus_print_child, bus_generic_print_child), 5966963Speter DEVMETHOD(bus_alloc_resource, bus_generic_alloc_resource), 6066963Speter DEVMETHOD(bus_release_resource, bus_generic_release_resource), 6166963Speter DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), 6250276Speter DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), 6366963Speter DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), 6466963Speter DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), 6550276Speter 6662449Speter { 0, 0 } 6762449Speter}; 6850276Speter 6962449Speterstatic driver_t eisab_driver = { 7050276Speter "eisab", 7162449Speter eisab_methods, 72166124Srafan 0, 7362449Speter}; 7462449Speter 7562449Speterstatic devclass_t eisab_devclass; 76166124Srafan 7750276SpeterDRIVER_MODULE(eisab, pci, eisab_driver, eisab_devclass, 0, 0); 7850276Speter 7962449Speterstatic int 8062449Spetereisab_probe(device_t dev) 8150276Speter{ 8266963Speter int matched = 0; 83166124Srafan 8450276Speter /* 8550276Speter * Generic match by class/subclass. 8666963Speter */ 8766963Speter if ((pci_get_class(dev) == PCIC_BRIDGE) && 8866963Speter (pci_get_subclass(dev) == PCIS_BRIDGE_EISA)) 8966963Speter matched = 1; 9066963Speter 9166963Speter /* 9266963Speter * Some bridges don't correctly report their class. 9366963Speter */ 9466963Speter switch (pci_get_devid(dev)) { 9566963Speter case 0x04828086: /* may show up as PCI-HOST or 0:0 */ 9666963Speter matched = 1; 9766963Speter break; 9866963Speter default: 9966963Speter break; 10066963Speter } 10166963Speter 10276726Speter if (matched) { 10366963Speter device_set_desc(dev, "PCI-EISA bridge"); 10466963Speter return(-10000); 10566963Speter } 10666963Speter return(ENXIO); 10766963Speter} 10866963Speter 10966963Speterstatic int 11066963Spetereisab_attach(device_t dev) 11166963Speter{ 11266963Speter /* 11366963Speter * Attach an EISA bus. Note that we can only have one EISA bus. 11466963Speter */ 11566963Speter if (!devclass_get_device(devclass_find("eisa"), 0)) 11666963Speter device_add_child(dev, "eisa", -1); 11766963Speter 11866963Speter /* 11966963Speter * Attach an ISA bus as well, since the EISA bus may have ISA 12066963Speter * cards installed, and we may have no EISA support in the system. 12166963Speter */ 12266963Speter if (!devclass_get_device(devclass_find("isa"), 0)) 12366963Speter device_add_child(dev, "isa", -1); 12466963Speter 12566963Speter bus_generic_attach(dev); 12666963Speter 12766963Speter return(0); 12866963Speter} 12962449Speter