summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2009-09-24 21:26:26 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2009-09-24 21:26:26 +0000
commit884f7bb688f5a8e1025a3e438856b7fc3287505c (patch)
tree961f907c61977c945f7d7dc95139e54f4d7cfaa9
parenta356134ea75111af3926f5ec0be07351bbbae429 (diff)
Handle the upper 32 bits of the prefetchable memory range when setting up
the ppb resource extents, on LP64 systems. Found the hard way on an alpha. ok kettenis@
-rw-r--r--sys/dev/pci/ppb.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/dev/pci/ppb.c b/sys/dev/pci/ppb.c
index 1f16800d02f..1ba62828c96 100644
--- a/sys/dev/pci/ppb.c
+++ b/sys/dev/pci/ppb.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ppb.c,v 1.34 2009/05/30 18:46:06 jsg Exp $ */
+/* $OpenBSD: ppb.c,v 1.35 2009/09/24 21:26:25 miod Exp $ */
/* $NetBSD: ppb.c,v 1.16 1997/06/06 23:48:05 thorpej Exp $ */
/*
@@ -215,11 +215,17 @@ ppbattach(struct device *parent, struct device *self, void *aux)
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... */
+ 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);
+ sc->sc_pmemlimit |= ((uint64_t)blr) << 32;
+#endif
if (sc->sc_pmemlimit > sc->sc_pmembase) {
name = malloc(32, M_DEVBUF, M_NOWAIT);
if (name) {
snprintf(name, 32, "%s pcipmem", sc->sc_dev.dv_xname);
- sc->sc_pmemex = extent_create(name, 0, 0xffffffff,
+ sc->sc_pmemex = extent_create(name, 0, (u_long)-1L,
M_DEVBUF, NULL, 0, EX_NOWAIT | EX_FILLED);
extent_free(sc->sc_pmemex, sc->sc_pmembase,
sc->sc_pmemlimit - sc->sc_pmembase + 1,