Preliminary support for PCI-PCI bridges. Recognize a PCI-PCI bridge
and attach the secondary pci bus as a 'pci' device. Note that this support is incomplete and will not yet work for ports other than that i386. (The i386 can rely on the PCI interrupt 'line' information to determine interrupt mapping, which is not necessarily possible on other systems.)
This commit is contained in:
parent
f1f9317dfb
commit
47e551efff
154
sys/dev/pci/ppb.c
Normal file
154
sys/dev/pci/ppb.c
Normal file
@ -0,0 +1,154 @@
|
||||
/* $NetBSD: ppb.c,v 1.1 1996/02/28 01:46:32 cgd Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Christopher G. Demetriou
|
||||
* for the NetBSD Project.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* XXX NOTE:
|
||||
* XXX PROPER OPERATION OF DEVICES BEHIND PPB'S WHICH USE INTERRUPTS
|
||||
* XXX ON SYSTEMS OTHER THAN THE i386 IS NOT POSSIBLE AT THIS TIME.
|
||||
* XXX There needs to be some support for 'swizzling' the interrupt
|
||||
* XXX pin. In general, pci_map_int() has to have a different
|
||||
* XXX interface.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/device.h>
|
||||
|
||||
#include <dev/pci/pcireg.h>
|
||||
#include <dev/pci/pcivar.h>
|
||||
#include <dev/pci/pcidevs.h>
|
||||
#include <dev/pci/ppbreg.h>
|
||||
|
||||
struct ppb_softc {
|
||||
struct device sc_dev;
|
||||
|
||||
/*
|
||||
* Primary bus information.
|
||||
*/
|
||||
pcitag_t sc_p_tag; /* tag of this device */
|
||||
|
||||
/*
|
||||
* Secondary bus information.
|
||||
*/
|
||||
int sc_s_num; /* secondary bus number */
|
||||
};
|
||||
|
||||
int ppbmatch __P((struct device *, void *, void *));
|
||||
void ppbattach __P((struct device *, struct device *, void *));
|
||||
|
||||
struct cfdriver ppbcd = {
|
||||
NULL, "ppb", ppbmatch, ppbattach, DV_DULL, sizeof(struct ppb_softc)
|
||||
};
|
||||
|
||||
static int ppbprint __P((void *, char *pnp));
|
||||
|
||||
int
|
||||
ppbmatch(parent, match, aux)
|
||||
struct device *parent;
|
||||
void *match, *aux;
|
||||
{
|
||||
struct cfdata *cf = match;
|
||||
struct pci_attach_args *pa = aux;
|
||||
|
||||
/*
|
||||
* Check the ID register to see that it's a PCI bridge.
|
||||
* If it is, we assume that we can deal with it; it _should_
|
||||
* work in a standardized way...
|
||||
*/
|
||||
if (PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE &&
|
||||
PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_PCI)
|
||||
return (1);
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
ppbattach(parent, self, aux)
|
||||
struct device *parent, *self;
|
||||
void *aux;
|
||||
{
|
||||
struct ppb_softc *sc = (struct ppb_softc *)self;
|
||||
struct pci_attach_args *pa = aux;
|
||||
struct pcibus_attach_args pba;
|
||||
pcireg_t data;
|
||||
char devinfo[256];
|
||||
|
||||
sc->sc_p_tag = pa->pa_tag;
|
||||
|
||||
pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo);
|
||||
printf(": %s (rev. 0x%02x)\n", devinfo, PCI_REVISION(pa->pa_class));
|
||||
|
||||
data = pci_conf_read(sc->sc_p_tag, PPB_REG_BUSINFO);
|
||||
|
||||
sc->sc_s_num = PPB_BUSINFO_SECONDARY(data);
|
||||
if (sc->sc_s_num == 0) {
|
||||
printf("%s: not configured by system firmware\n",
|
||||
self->dv_xname);
|
||||
return;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* XXX can't do this, because we're not given our bus number
|
||||
* (we shouldn't need it) and we can't decompose our tag.
|
||||
*/
|
||||
|
||||
/* sanity check. */
|
||||
if (pa->pa_bus != PPB_BUSINFO_PRIMARY(data))
|
||||
panic("ppbattach: bus in tag (%d) != bus in reg (%d)",
|
||||
pa->pa_bus, PPB_BUSINFO_PRIMARY(data));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Attach the PCI bus than hangs off of it.
|
||||
*/
|
||||
pba.pba_busname = "pci";
|
||||
pba.pba_bus = sc->sc_s_num;
|
||||
pba.pba_maxndevs = PPB_SECONDARY_DEVICES;
|
||||
|
||||
config_found(self, &pa, ppbprint);
|
||||
}
|
||||
|
||||
static int
|
||||
ppbprint(aux, pnp)
|
||||
void *aux;
|
||||
char *pnp;
|
||||
{
|
||||
struct pcibus_attach_args *pba = aux;
|
||||
|
||||
/* only PCIs can attach to PPBs; easy. */
|
||||
if (pnp)
|
||||
printf("pci at %s", pnp);
|
||||
printf(" bus %d", pba->pba_bus);
|
||||
return (UNCONF);
|
||||
}
|
78
sys/dev/pci/ppbreg.h
Normal file
78
sys/dev/pci/ppbreg.h
Normal file
@ -0,0 +1,78 @@
|
||||
/* $NetBSD: ppbreg.h,v 1.1 1996/02/28 01:46:33 cgd Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1996 Christopher G. Demetriou. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Christopher G. Demetriou
|
||||
* for the NetBSD Project.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* PCI-PCI Bridge chip register definitions and macros.
|
||||
* Derived from information found in the ``PCI to PCI Bridge
|
||||
* Architecture Specification, Revision 1.0, April 5, 1994.''
|
||||
*
|
||||
* XXX much is missing.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Register offsets
|
||||
*/
|
||||
#define PPB_REG_BASE0 0x10 /* Base Addr Reg. 0 */
|
||||
#define PPB_REG_BASE1 0x14 /* Base Addr Reg. 1 */
|
||||
#define PPB_REG_BUSINFO 0x18 /* Bus information */
|
||||
#define PPB_REG_IOSTATUS 0x1c /* I/O base+lim & sec stat */
|
||||
#define PPB_REG_MEM 0x20 /* Memory base/limit */
|
||||
#define PPB_REG_PREFMEM 0x24 /* Pref Mem base/limit */
|
||||
#define PPB_REG_PREFBASE_HI32 0x28 /* Pref Mem base high bits */
|
||||
#define PPB_REG_PREFLIM_HI32 0x2c /* Pref Mem lim high bits */
|
||||
#define PPB_REG_IO_HI 0x30 /* I/O base+lim high bits */
|
||||
#define PPB_REG_BRIDGECONTROL PCI_INTERRUPT_REG /* bridge control register */
|
||||
|
||||
/*
|
||||
* Macros to extract the contents of the "Bus Info" register.
|
||||
*/
|
||||
#define PPB_BUSINFO_PRIMARY(bir) \
|
||||
((bir >> 0) & 0xff)
|
||||
#define PPB_BUSINFO_SECONDARY(bir) \
|
||||
((bir >> 8) & 0xff)
|
||||
#define PPB_BUSINFO_SUBORDINATE(bir) \
|
||||
((bir >> 16) & 0xff)
|
||||
#define PPB_BUSINFO_SECLAT(bir) \
|
||||
((bir >> 24) & 0xff)
|
||||
|
||||
/*
|
||||
* Routine to translate between secondary bus interrupt pin/device number and
|
||||
* primary bus interrupt pin number.
|
||||
*/
|
||||
#define PPB_INTERRUPT_SWIZZLE(pin, device) \
|
||||
((((pin) + (device) - 1) % 4) + 1)
|
||||
|
||||
/*
|
||||
* Max number of devices on a secondary bus.
|
||||
* XXX really a "global" PCI constant.
|
||||
*/
|
||||
#define PPB_SECONDARY_DEVICES 32
|
Loading…
Reference in New Issue
Block a user