works on an alpha es45 as well. theo made me do it.

> On 21 Nov 2014, at 13:49, David Gwynne <da...@gwynne.id.au> wrote:
> 
> 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);
>> 
> 

Reply via email to