ref: 8003f4f00f0645426a0694b0e5e915d26b7c7153
parent: 15e90cedc17dd2501708428da62c7e54086cf3b1
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sat Jun 6 12:16:03 EDT 2020
sdmv50xx: use 64-bit physical addresses and check pci membar type
--- a/sys/src/9/pc/sdmv50xx.c
+++ b/sys/src/9/pc/sdmv50xx.c
@@ -1131,8 +1131,9 @@
mv50pnp(void)
{
int i, nunit;
+ ulong n, *mem;
uchar *base;
- ulong io, n, *mem;
+ uvlong io;
Ctlr *ctlr;
Drive *d;
Pcidev *p;
@@ -1148,6 +1149,8 @@
while((p = pcimatch(p, 0x11ab, 0)) != nil){
if(p->ccrb != Pcibcstore || p->ccru + p->ccrp || p->did&0x0f00)
continue;
+ if(p->mem[0].size == 0 || (p->mem[0].bar & 1) != 0)
+ continue;
switch(p->did){
case 0x5040:
case 0x5041:
@@ -1169,18 +1172,16 @@
'E' + ctlrno, (ushort)p->did, nunit,
((p->did&0xf000)==0x6000? "II": "I"),
(p->did&1? "": "out"));
+ io = p->mem[0].bar & ~0xF;
+ mem = (ulong*)vmap(io, p->mem[0].size);
+ if(mem == nil){
+ print("sdmv50xx: can't map %llux\n", io);
+ continue;
+ }
if((sdev = malloc(sizeof *sdev)) == nil)
continue;
if((ctlr = malloc(sizeof *ctlr)) == nil){
free(sdev);
- continue;
- }
- io = p->mem[0].bar & ~0x0F;
- mem = (ulong*)vmap(io, p->mem[0].size);
- if(mem == 0){
- print("sdmv50xx: address 0x%luX in use\n", io);
- free(sdev);
- free(ctlr);
continue;
}
ctlr->rid = p->rid;