git: 9front

Download patch

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)
--