working on a 2950. will put try it on a r710 soon. dlg
> On 20 Nov 2014, at 19:10, Mark Kettenis <mark.kette...@xs4all.nl> wrote: > > 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); >