summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2007-06-30 21:51:15 -0700
committerAaron Plattner <aplattner@nvidia.com>2007-06-30 21:51:15 -0700
commit63eb1a4aa402ac3bf117634c3c9270261c6a4258 (patch)
treeafe9bfce7eb53ef34f45ddf0637991f73a8461ee
parent209c84e788faf3c4d0ce053e5f29ff5f5b798628 (diff)
Support configs with BAR1 < total RAM < 256 MB.
-rw-r--r--src/g80_driver.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/src/g80_driver.c b/src/g80_driver.c
index c81388c..e703ea8 100644
--- a/src/g80_driver.c
+++ b/src/g80_driver.c
@@ -194,6 +194,7 @@ G80PreInit(ScrnInfoPtr pScrn, int flags)
const Gamma gzeros = {0.0, 0.0, 0.0};
char *s;
CARD32 tmp;
+ memType BAR1sizeKB;
if(flags & PROBE_DETECT) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
@@ -341,18 +342,35 @@ G80PreInit(ScrnInfoPtr pScrn, int flags)
pNv->architecture = pNv->reg[0] >> 20 & 0x1ff;
pNv->RamAmountKBytes = pNv->RamAmountKBytes = (pNv->reg[0x0010020C/4] & 0xFFF00000) >> 10;
pNv->videoRam = pNv->RamAmountKBytes;
- /* Limit videoRam to the max BAR1 size of 256MB */
- if(pNv->videoRam <= 1024) {
+
+ /* Determine the size of BAR1 */
+ /* Some configs have BAR1 < total RAM < 256 MB */
+ BAR1sizeKB = 1UL << (pPci->size[1] - 10);
+ if(BAR1sizeKB > 256 * 1024) {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "BAR1 is > 256 MB, which is "
+ "probably wrong. Clamping to 256 MB.\n");
+ BAR1sizeKB = 256 * 1024;
+ }
+
+ /* Limit videoRam to the size of BAR1 */
+ if(pNv->videoRam <= 1024 || BAR1sizeKB == 0) {
xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to determine the amount of "
"available video memory\n");
goto fail;
}
pNv->videoRam -= 1024;
- if(pNv->videoRam > 256 * 1024)
- pNv->videoRam = 256 * 1024;
+ if(pNv->videoRam > BAR1sizeKB)
+ pNv->videoRam = BAR1sizeKB;
+
pScrn->videoRam = pNv->videoRam;
- xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Mapping %.1f of %.1f MB of video RAM\n",
- pScrn->videoRam / 1024.0, pNv->RamAmountKBytes / 1024.0);
+
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Total video RAM: %.1f MB\n",
+ pNv->RamAmountKBytes / 1024.0);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, " BAR1 size: %.1f MB\n",
+ BAR1sizeKB / 1024.0);
+ xf86DrvMsg(pScrn->scrnIndex, X_PROBED, " Mapped memory: %.1f MB\n",
+ pScrn->videoRam / 1024.0);
+
pNv->mem = xf86MapPciMem(pScrn->scrnIndex,
VIDMEM_MMIO | VIDMEM_READSIDEEFFECT,
pcitag, pPci->memBase[1], pScrn->videoRam * 1024);