svn commit: r202401 - stable/7/sys/sparc64/pci
Marius Strobl
marius at FreeBSD.org
Fri Jan 15 16:46:06 UTC 2010
Author: marius
Date: Fri Jan 15 16:46:06 2010
New Revision: 202401
URL: http://svn.freebsd.org/changeset/base/202401
Log:
MFC: r201395
- Preserve the PROM IOMMU in order to allow OFW drivers to continue to
work.
- Sanity check the parameters passed to the implementations of the
pcib_{read,write}_config() methods. Using illegal values can cause
no real harm but it doesn't hurt to avoid unnecessary data error
traps requiring to flush and re-enable the level 1 caches.
Modified:
stable/7/sys/sparc64/pci/psycho.c
stable/7/sys/sparc64/pci/psychovar.h
stable/7/sys/sparc64/pci/schizo.c
stable/7/sys/sparc64/pci/schizovar.h
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/sparc64/pci/psycho.c
==============================================================================
--- stable/7/sys/sparc64/pci/psycho.c Fri Jan 15 16:46:03 2010 (r202400)
+++ stable/7/sys/sparc64/pci/psycho.c Fri Jan 15 16:46:06 2010 (r202401)
@@ -555,6 +555,7 @@ psycho_attach(device_t dev)
M_NOWAIT | M_ZERO);
if (sc->sc_is == NULL)
panic("%s: malloc iommu_state failed", __func__);
+ sc->sc_is->is_flags = IOMMU_PRESERVE_PROM;
if (sc->sc_mode == PSYCHO_MODE_SABRE)
sc->sc_is->is_pmaxaddr =
IOMMU_MAXADDR(SABRE_IOMMU_BITS);
@@ -592,10 +593,11 @@ psycho_attach(device_t dev)
panic("%s: could not get bus-range", __func__);
if (i != sizeof(prop_array))
panic("%s: broken bus-range (%d)", __func__, i);
+ sc->sc_pci_secbus = prop_array[0];
+ sc->sc_pci_subbus = prop_array[1];
if (bootverbose)
device_printf(dev, "bus range %u to %u; PCI bus %d\n",
- prop_array[0], prop_array[1], prop_array[0]);
- sc->sc_pci_secbus = prop_array[0];
+ sc->sc_pci_secbus, sc->sc_pci_subbus, sc->sc_pci_secbus);
/* Clear any pending PCI error bits. */
PCIB_WRITE_CONFIG(dev, sc->sc_pci_secbus, PCS_DEVICE, PCS_FUNC,
@@ -924,6 +926,10 @@ psycho_read_config(device_t dev, u_int b
int i;
sc = device_get_softc(dev);
+ if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus ||
+ slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX)
+ return (-1);
+
bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG];
/*
@@ -1004,6 +1010,10 @@ psycho_write_config(device_t dev, u_int
u_long offset = 0;
sc = device_get_softc(dev);
+ if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus ||
+ slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX)
+ return;
+
offset = PSYCHO_CONF_OFF(bus, slot, func, reg);
bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG];
switch (width) {
Modified: stable/7/sys/sparc64/pci/psychovar.h
==============================================================================
--- stable/7/sys/sparc64/pci/psychovar.h Fri Jan 15 16:46:03 2010 (r202400)
+++ stable/7/sys/sparc64/pci/psychovar.h Fri Jan 15 16:46:06 2010 (r202401)
@@ -75,6 +75,7 @@ struct psycho_softc {
struct rman sc_pci_io_rman;
uint8_t sc_pci_secbus;
+ uint8_t sc_pci_subbus;
uint8_t sc_pci_hpbcfg[16];
Modified: stable/7/sys/sparc64/pci/schizo.c
==============================================================================
--- stable/7/sys/sparc64/pci/schizo.c Fri Jan 15 16:46:03 2010 (r202400)
+++ stable/7/sys/sparc64/pci/schizo.c Fri Jan 15 16:46:06 2010 (r202401)
@@ -455,6 +455,7 @@ schizo_attach(device_t dev)
* buffer, in Schizo version < 5 (i.e. revision < 2.3) it's
* affected by several errata and basically unusable though.
*/
+ sc->sc_is.is_flags = IOMMU_PRESERVE_PROM;
sc->sc_is.is_pmaxaddr = IOMMU_MAXADDR(STX_IOMMU_BITS);
sc->sc_is.is_sb[0] = sc->sc_is.is_sb[1] = 0;
if (OF_getproplen(node, "no-streaming-cache") < 0 &&
@@ -549,10 +550,11 @@ schizo_attach(device_t dev)
panic("%s: could not get bus-range", __func__);
if (i != sizeof(prop_array))
panic("%s: broken bus-range (%d)", __func__, i);
+ sc->sc_pci_secbus = prop_array[0];
+ sc->sc_pci_subbus = prop_array[1];
if (bootverbose)
device_printf(dev, "bus range %u to %u; PCI bus %d\n",
- prop_array[0], prop_array[1], prop_array[0]);
- sc->sc_pci_secbus = prop_array[0];
+ sc->sc_pci_secbus, sc->sc_pci_subbus, sc->sc_pci_secbus);
/* Clear any pending PCI error bits. */
PCIB_WRITE_CONFIG(dev, sc->sc_pci_secbus, STX_CS_DEVICE, STX_CS_FUNC,
@@ -928,6 +930,9 @@ schizo_read_config(device_t dev, u_int b
uint8_t byte;
sc = device_get_softc(dev);
+ if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus ||
+ slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX)
+ return (-1);
/*
* The Schizo bridges contain a dupe of their header at 0x80.
@@ -976,6 +981,10 @@ schizo_write_config(device_t dev, u_int
u_long offset = 0;
sc = device_get_softc(dev);
+ if (bus < sc->sc_pci_secbus || bus > sc->sc_pci_subbus ||
+ slot > PCI_SLOTMAX || func > PCI_FUNCMAX || reg > PCI_REGMAX)
+ return;
+
offset = STX_CONF_OFF(bus, slot, func, reg);
bh = sc->sc_pci_bh[OFW_PCI_CS_CONFIG];
switch (width) {
Modified: stable/7/sys/sparc64/pci/schizovar.h
==============================================================================
--- stable/7/sys/sparc64/pci/schizovar.h Fri Jan 15 16:46:03 2010 (r202400)
+++ stable/7/sys/sparc64/pci/schizovar.h Fri Jan 15 16:46:06 2010 (r202401)
@@ -71,6 +71,7 @@ struct schizo_softc {
bus_dma_tag_t sc_pci_dmat;
uint8_t sc_pci_secbus;
+ uint8_t sc_pci_subbus;
struct ofw_bus_iinfo sc_pci_iinfo;
More information about the svn-src-all
mailing list