Hi All,
dlg@ managed to get access to a machine that actually uses 64-bit PCI
addresses behind a bridge. This triggered some bugs in the so far
untested code. Quelle suprprise!
I'd appreciate it if some people can verify that this doesn't break
other systems. In particular I'm looking for testers on server-type
machines, both i386 and amd64.
Thanks,
Mark
Index: pci.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/pci.c,v
retrieving revision 1.106
diff -u -p -r1.106 pci.c
--- pci.c 26 Oct 2014 16:18:42 -0000 1.106
+++ pci.c 20 Nov 2014 09:04:51 -0000
@@ -936,6 +936,12 @@ pci_reserve_resources(struct pci_attach_
blr = pci_conf_read(pc, tag, PPB_REG_PREFMEM);
base = (blr & 0x0000fff0) << 16;
limit = (blr & 0xfff00000) | 0x000fffff;
+#ifdef __LP64__
+ blr = pci_conf_read(pc, pa->pa_tag, PPB_REG_PREFBASE_HI32);
+ base |= ((uint64_t)blr) << 32;
+ blr = pci_conf_read(pc, pa->pa_tag, PPB_REG_PREFLIM_HI32);
+ limit |= ((uint64_t)blr) << 32;
+#endif
if (limit > base)
size = (limit - base + 1);
else
Index: ppb.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/ppb.c,v
retrieving revision 1.59
diff -u -p -r1.59 ppb.c
--- ppb.c 15 Sep 2014 14:22:07 -0000 1.59
+++ ppb.c 20 Nov 2014 09:04:51 -0000
@@ -261,7 +261,7 @@ ppbattach(struct device *parent, struct
name = malloc(32, M_DEVBUF, M_NOWAIT);
if (name) {
snprintf(name, 32, "%s pcimem", sc->sc_dev.dv_xname);
- sc->sc_memex = extent_create(name, 0, 0xffffffff,
+ sc->sc_memex = extent_create(name, 0, (u_long)-1L,
M_DEVBUF, NULL, 0, EX_NOWAIT | EX_FILLED);
extent_free(sc->sc_memex, sc->sc_membase,
sc->sc_memlimit - sc->sc_membase + 1,
@@ -273,7 +273,7 @@ ppbattach(struct device *parent, struct
blr = pci_conf_read(pc, pa->pa_tag, PPB_REG_PREFMEM);
sc->sc_pmembase = (blr & 0x0000fff0) << 16;
sc->sc_pmemlimit = (blr & 0xfff00000) | 0x000fffff;
-#ifdef __LP64__ /* XXX because extents use long... */
+#ifdef __LP64__
blr = pci_conf_read(pc, pa->pa_tag, PPB_REG_PREFBASE_HI32);
sc->sc_pmembase |= ((uint64_t)blr) << 32;
blr = pci_conf_read(pc, pa->pa_tag, PPB_REG_PREFLIM_HI32);