1/*- 2 * Copyright (c) 1994,1995 Stefan Esser, Wolfgang StanglMeier 3 * Copyright (c) 2000 Michael Smith <msmith@freebsd.org> 4 * Copyright (c) 2000 BSDi 5 * Copyright (c) 2001 - 2003 Thomas Moestl <tmm@FreeBSD.org> 6 * Copyright (c) 2009 by Marius Strobl <marius@FreeBSD.org> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. The name of the author may not be used to endorse or promote products 18 * derived from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * from: FreeBSD: src/sys/dev/pci/pci_pci.c,v 1.3 2000/12/13 33 */ 34 35#include <sys/cdefs.h>
|
36__FBSDID("$FreeBSD: head/sys/sparc64/pci/ofw_pcib.c 221393 2011-05-03 17:37:24Z jhb $");
|
36__FBSDID("$FreeBSD: head/sys/sparc64/pci/ofw_pcib.c 227848 2011-11-22 21:55:40Z marius $"); |
37 38#include "opt_ofw_pci.h" 39 40#include <sys/param.h> 41#include <sys/bus.h> 42#include <sys/kernel.h> 43#include <sys/libkern.h> 44#include <sys/module.h> 45#include <sys/rman.h> 46 47#include <dev/ofw/ofw_bus.h> 48#include <dev/ofw/openfirm.h> 49 50#include <machine/bus.h> 51 52#include <dev/pci/pcireg.h> 53#include <dev/pci/pcivar.h> 54#include <dev/pci/pcib_private.h> 55 56#include "pcib_if.h" 57 58#include <sparc64/pci/ofw_pci.h> 59#include <sparc64/pci/ofw_pcib_subr.h> 60 61static device_probe_t ofw_pcib_probe; 62static device_attach_t ofw_pcib_attach; 63 64static device_method_t ofw_pcib_methods[] = { 65 /* Device interface */ 66 DEVMETHOD(device_probe, ofw_pcib_probe), 67 DEVMETHOD(device_attach, ofw_pcib_attach), 68 69 /* Bus interface */ 70 71 /* pcib interface */ 72 DEVMETHOD(pcib_route_interrupt, ofw_pcib_gen_route_interrupt), 73 74 /* ofw_bus interface */ 75 DEVMETHOD(ofw_bus_get_node, ofw_pcib_gen_get_node), 76
|
77 KOBJMETHOD_END
|
77 DEVMETHOD_END |
78}; 79 80static devclass_t pcib_devclass; 81 82DEFINE_CLASS_1(pcib, ofw_pcib_driver, ofw_pcib_methods, 83 sizeof(struct ofw_pcib_gen_softc), pcib_driver); 84EARLY_DRIVER_MODULE(ofw_pcib, pci, ofw_pcib_driver, pcib_devclass, 0, 0, 85 BUS_PASS_BUS); 86MODULE_DEPEND(ofw_pcib, pci, 1, 1, 1); 87 88static int 89ofw_pcib_probe(device_t dev) 90{ 91 char desc[sizeof("OFW PCIe-PCIe bridge")]; 92 const char *dtype, *pbdtype; 93 94#define ISDTYPE(dtype, type) \ 95 (((dtype) != NULL) && strcmp((dtype), (type)) == 0) 96 97 if ((pci_get_class(dev) == PCIC_BRIDGE) && 98 (pci_get_subclass(dev) == PCIS_BRIDGE_PCI) && 99 ofw_bus_get_node(dev) != 0) { 100 dtype = ofw_bus_get_type(dev); 101 pbdtype = ofw_bus_get_type(device_get_parent( 102 device_get_parent(dev))); 103 snprintf(desc, sizeof(desc), "OFW PCI%s-PCI%s bridge", 104 ISDTYPE(pbdtype, OFW_TYPE_PCIE) ? "e" : "", 105 ISDTYPE(dtype, OFW_TYPE_PCIE) ? "e" : ""); 106 device_set_desc_copy(dev, desc); 107 return (0); 108 } 109 110#undef ISDTYPE 111 112 return (ENXIO); 113} 114 115static int 116ofw_pcib_attach(device_t dev) 117{ 118 struct ofw_pcib_gen_softc *sc; 119 120 sc = device_get_softc(dev); 121 122 /* Quirk handling */ 123 switch (pci_get_devid(dev)) { 124 /* 125 * The ALi M5249 found in Fire-based machines by definition must me 126 * subtractive as they have a ISA bridge on their secondary side but 127 * don't indicate this in the class code although the ISA I/O range 128 * isn't included in their bridge decode. 129 */ 130 case 0x524910b9: 131 sc->ops_pcib_sc.flags |= PCIB_SUBTRACTIVE; 132 break; 133 } 134 135 ofw_pcib_gen_setup(dev); 136 pcib_attach_common(dev); 137 device_add_child(dev, "pci", -1); 138 return (bus_generic_attach(dev)); 139}
|