ref: 61c035ed19595fdaa728fcb3633588ed48616a93
parent: 237fc1891624748d135657d67248879659ee22f9
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Sat Nov 26 16:24:01 EST 2011
vgavesa: some nvidia cards start the framebuffer in the middle of a pci membar
--- a/sys/src/9/pc/vgavesa.c
+++ b/sys/src/9/pc/vgavesa.c
@@ -130,7 +130,6 @@
paddr = LONG(p+40);
size = WORD(p+20)*WORD(p+16);
- size = PGROUND(size);
/*
* figure out max size of memory so that we have
@@ -141,23 +140,25 @@
while(!havesize && (pci = pcimatch(pci, 0, 0)) != nil){if(pci->ccrb != Pcibcdisp)
continue;
- for(i=0; i<nelem(pci->mem); i++)
- if(paddr == (pci->mem[i].bar&~0x0F)){- if(pci->mem[i].size > size)
- size = pci->mem[i].size;
+ for(i=0; i<nelem(pci->mem); i++){+ ulong a, e;
+
+ a = pci->mem[i].bar & ~0xF;
+ e = a + pci->mem[i].size;
+ if(paddr >= a && (paddr+size) <= e){+ size = e - paddr;
havesize = 1;
break;
}
+ }
}
/* no pci - heuristic guess */
- if (!havesize)
+ if(!havesize)
if(size < 4*1024*1024)
size = 4*1024*1024;
else
size = ROUND(size, 1024*1024);
- if(size > 16*1024*1024) /* arbitrary */
- size = 16*1024*1024;
vgalinearaddr(scr, paddr, size);
if(scr->apsize)
--
⑨