aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorStefan Eßer <se@FreeBSD.org>1997-05-28 10:01:03 +0000
committerStefan Eßer <se@FreeBSD.org>1997-05-28 10:01:03 +0000
commita9ad9373624f0b729165b9c1f197ffad68a3ff14 (patch)
tree459856fd5bc25f116cc6d7c00d6bec68e01da010 /sys/dev
parent8e6361044d0eb8969dfe3e3c46cb1e4cdec8c591 (diff)
Notes
Diffstat (limited to 'sys/dev')
-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 618378443c51..244fb01b19cd 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 */
}