summaryrefslogtreecommitdiffstats
path: root/sys/dev/pci
diff options
context:
space:
mode:
authorse <se@FreeBSD.org>1997-05-28 10:01:03 +0000
committerse <se@FreeBSD.org>1997-05-28 10:01:03 +0000
commit81eaba2daab411ca662d2e9821cc80040a400b76 (patch)
tree8a40639ae4f06761dbbf789fe3ccb0286037976c /sys/dev/pci
parent07d5bdb4cf7810eccb1e91cf936fbc6d6efba20e (diff)
downloadFreeBSD-src-81eaba2daab411ca662d2e9821cc80040a400b76.zip
FreeBSD-src-81eaba2daab411ca662d2e9821cc80040a400b76.tar.gz
Two minor changes to the code that builds the pci map array:
1) Stop at the first map register that contains a zero value. 2) When testing for the map size work up from low values, since this works around a bug in some BusLogic SCSI card, which has the 16 upper port base address bits hardwired to zero. The config register dump printed in the bootverbose case has been slightly rearranged.
Diffstat (limited to 'sys/dev/pci')
-rw-r--r--sys/dev/pci/pci.c59
1 files changed, 30 insertions, 29 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 6183784..244fb01 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: pci.c,v 1.73 1997/05/27 04:09:01 fsmp Exp $
+ * $Id: pci.c,v 1.74 1997/05/27 19:24:36 fsmp Exp $
*
*/
@@ -99,11 +99,13 @@ pci_mapsize(unsigned testval)
int ln2size;
testval = pci_mapbase(testval);
- ln2size = 32;
- while ((testval & 0x80000000) != 0)
- {
- ln2size--;
- testval <<= 1;
+ ln2size = 0;
+ if (testval != 0) {
+ while ((testval & 1) == 0)
+ {
+ ln2size++;
+ testval >>= 1;
+ }
}
return (ln2size);
}
@@ -139,9 +141,19 @@ pci_readmaps(pcicfgregs *cfg, int maxmaps)
pcimap *map;
int map64 = 0;
- while (maxmaps > 0
- && pci_cfgread(cfg, PCIR_MAPS + (maxmaps -1) *4, 4) == 0)
- maxmaps--;
+ for (i = 0; i < maxmaps; i++) {
+ int reg = PCIR_MAPS + i*4;
+ u_int32_t base;
+ u_int32_t ln2range;
+
+ base = pci_cfgread(cfg, reg, 4);
+ ln2range = pci_maprange(base);
+
+ if (base == 0 || ln2range == 0)
+ maxmaps = i;
+ else if (ln2range > 32)
+ i++;
+ }
map = malloc(maxmaps * sizeof (pcimap), M_DEVBUF, M_WAITOK);
if (map != NULL) {
@@ -169,16 +181,6 @@ pci_readmaps(pcicfgregs *cfg, int maxmaps)
map[i].base = base;
map64 = 0;
}
- if (map[i].type == 0) {
- /*
- * This indicates, that some config space register
- * was mistaken to contain a map, while it in fact
- * contains unrelated information!
- * Ignore this map and all that might have been
- * expected to follow ...
- */
- maxmaps = i;
- }
}
cfg->nummaps = maxmaps;
}
@@ -373,29 +375,28 @@ pci_freecfg(pcicfgregs *cfg)
static void
pci_addcfg(pcicfgregs *cfg)
{
-#ifdef PCI_DEBUG
if (bootverbose) {
int i;
- printf("new pci: vendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
+ printf("found->\tvendor=0x%04x, dev=0x%04x, revid=0x%02x\n",
cfg->vendor, cfg->device, cfg->revid);
- printf("\t cmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n",
- cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
- printf("\t class=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
+ printf("\tclass=%02x-%02x-%02x, hdrtype=0x%02x, mfdev=%d\n",
cfg->class, cfg->subclass, cfg->progif, cfg->hdrtype, cfg->mfdev);
- printf("\t lattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n",
+#ifdef PCI_DEBUG
+ printf("\tcmdreg=0x%04x, statreg=0x%04x, cachelnsz=%d (dwords)\n",
+ cfg->cmdreg, cfg->statreg, cfg->cachelnsz);
+ printf("\tlattimer=0x%02x (%d ns), mingnt=0x%02x (%d ns), maxlat=0x%02x (%d ns)\n",
cfg->lattimer, cfg->lattimer * 30,
cfg->mingnt, cfg->mingnt * 250, cfg->maxlat, cfg->maxlat * 250);
-
+#endif /* PCI_DEBUG */
if (cfg->intpin > 0)
- printf("\t intpin=%c, irq=%d\n", cfg->intpin +'a' -1, cfg->intline);
+ printf("\tintpin=%c, irq=%d\n", cfg->intpin +'a' -1, cfg->intline);
for (i = 0; i < cfg->nummaps; i++) {
pcimap *m = &cfg->map[i];
- printf("\t map[%d]: type %x, range %2d, base %08x, size %2d\n",
+ printf("\tmap[%d]: type %x, range %2d, base %08x, size %2d\n",
i, m->type, m->ln2range, m->base, m->ln2size);
}
}
-#endif /* PCI_DEBUG */
pci_drvattach(cfg); /* XXX currently defined in pci_compat.c */
}
OpenPOWER on IntegriCloud