deal with 64-bit bars the way we're handling them now. Reference: /n/atom/patch/applied/pci164bitbar Date: Tue Jan 14 16:59:49 CET 2014 Signed-off-by: quanstro@quanstro.net --- /sys/src/cmd/pci/dat.h Tue Jan 14 16:59:30 2014 +++ /sys/src/cmd/pci/dat.h Tue Jan 14 16:59:30 2014 @@ -47,7 +47,7 @@ }; struct Bar { - uintptr bar; + u64int bar; /* wrong */ uint size; }; --- /sys/src/cmd/pci/pci.c Tue Jan 14 16:59:31 2014 +++ /sys/src/cmd/pci/pci.c Tue Jan 14 16:59:31 2014 @@ -455,7 +455,7 @@ for(i = 0; i < nelem(p->mem); i++){ if(b[i].size == 0) continue; - Bprint(&o, " %d:%.8p %d", i, b[i].bar, b[i].size); + Bprint(&o, " %d:%.8llux %d", i, b[i].bar, b[i].size); } Bprint(&o, "\n"); } --- /sys/src/cmd/pci/pciifc.c Tue Jan 14 16:59:31 2014 +++ /sys/src/cmd/pci/pciifc.c Tue Jan 14 16:59:31 2014 @@ -224,11 +224,11 @@ b = p->mem + floor; u = strtoull(r+1, &r, 16); if(u != b->bar) - print("%T: mismatched bar %d %.8p %.8llux\n", p->tbdf, floor, b->bar, u); + fprint(2, "%T: mismatched bar %d %.8llux %.8llux\n", p->tbdf, floor, b->bar, u); i++; u = strtoull(f[i], &r, 0); if(u > 256*1024*1024) - print("%T: bogus bar size %llud\n", p->tbdf, u); + fprint(2, "%T: bogus bar size %llud\n", p->tbdf, u); b->size = u; } close(fd); @@ -262,6 +262,11 @@ rno = PciBAR0; for(i = 0; i < nelem(p->mem); i++) { p->mem[i].bar = pcicfgr32(p, rno); + if(p->mem[i].bar & 2<<1){ + rno += 4; + p->mem[i].bar |= (u64int)pcicfgr32(p, rno)<<32; + i++; + } // p->mem[i].size = pcibarsize(p, rno); rno += 4; }