Bool I810BindGARTMemory(ScrnInfoPtr pScrn) { I810Ptr pI810 = I810PTR(pScrn); if (xf86AgpGARTSupported() && !pI810->directRenderingEnabled && !pI810->GttBound) { if (!xf86AcquireGART(pScrn->scrnIndex)) return FALSE; if (pI810->VramKey != -1 && !xf86BindGARTMemory(pScrn->scrnIndex, pI810->VramKey, pI810->VramOffset)) return FALSE; if (pI810->DcacheKey != -1 && !xf86BindGARTMemory(pScrn->scrnIndex, pI810->DcacheKey, pI810->DcacheOffset)) return FALSE; if (pI810->HwcursKey != -1 && !xf86BindGARTMemory(pScrn->scrnIndex, pI810->HwcursKey, pI810->HwcursOffset)) return FALSE; if (pI810->ARGBHwcursKey != -1 && !xf86BindGARTMemory(pScrn->scrnIndex, pI810->ARGBHwcursKey, pI810->ARGBHwcursOffset)) return FALSE; pI810->GttBound = 1; } return TRUE; }
static Bool BindMemRange(ScrnInfoPtr pScrn, I830MemRange *mem) { if (!mem) return FALSE; if (mem->Key == -1) return TRUE; return xf86BindGARTMemory(pScrn->scrnIndex, mem->Key, mem->Offset); }
int I810AllocateGARTMemory(ScrnInfoPtr pScrn) { unsigned long size = pScrn->videoRam * 1024; I810Ptr pI810 = I810PTR(pScrn); int key; long tom = 0; unsigned long physical; if (!xf86AgpGARTSupported() || !xf86AcquireGART(pScrn->scrnIndex)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "AGP GART support is either not available or cannot be used.\n" "\tMake sure your kernel has agpgart support or has the\n" "\tagpgart module loaded.\n"); return FALSE; } /* This allows the 2d only Xserver to regen */ pI810->agpAcquired2d = TRUE; /* * I810/I815 * * Treat the gart like video memory - we assume we own all that is * there, so ignore EBUSY errors. Don't try to remove it on * failure, either, as other X server may be using it. */ if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 0, NULL)) == -1) return FALSE; pI810->VramOffset = 0; pI810->VramKey = key; if (!xf86BindGARTMemory(pScrn->scrnIndex, key, 0)) return FALSE; pI810->SysMem.Start = 0; pI810->SysMem.Size = size; pI810->SysMem.End = size; pI810->SavedSysMem = pI810->SysMem; tom = pI810->SysMem.End; pI810->DcacheMem.Start = 0; pI810->DcacheMem.End = 0; pI810->DcacheMem.Size = 0; pI810->CursorPhysical = 0; pI810->CursorARGBPhysical = 0; /* * Dcache - half the speed of normal ram, so not really useful for * a 2d server. Don't bother reporting its presence. This is * mapped in addition to the requested amount of system ram. */ size = 1024 * 4096; /* * Keep it 512K aligned for the sake of tiled regions. */ tom += 0x7ffff; tom &= ~0x7ffff; if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 1, NULL)) != -1) { pI810->DcacheOffset = tom; pI810->DcacheKey = key; if (!xf86BindGARTMemory(pScrn->scrnIndex, key, tom)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocation of %ld bytes for DCACHE failed\n", size); pI810->DcacheKey = -1; } else { pI810->DcacheMem.Start = tom; pI810->DcacheMem.Size = size; pI810->DcacheMem.End = pI810->DcacheMem.Start + pI810->DcacheMem.Size; tom = pI810->DcacheMem.End; } } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No physical memory available for %ld bytes of DCACHE\n", size); pI810->DcacheKey = -1; } /* * Mouse cursor -- The i810 (crazy) needs a physical address in * system memory from which to upload the cursor. We get this from * the agpgart module using a special memory type. */ /* * 4k for the cursor is excessive, I'm going to steal 3k for * overlay registers later */ size = 4096; if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 2, &physical)) == -1) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No physical memory available for HW cursor\n"); pI810->HwcursKey = -1; pI810->CursorStart = 0; } else { pI810->HwcursOffset = tom; pI810->HwcursKey = key; if (!xf86BindGARTMemory(pScrn->scrnIndex, key, tom)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocation of %ld bytes for HW cursor failed\n", size); pI810->HwcursKey = -1; } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated of %ld bytes for HW cursor\n", size); pI810->CursorPhysical = physical; pI810->CursorStart = tom; tom += size; } } /* * 16k for the ARGB cursor */ size = 16384; if ((key = xf86AllocateGARTMemory(pScrn->scrnIndex, size, 2, &physical)) == -1) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "No physical memory available for ARGB HW cursor\n"); pI810->ARGBHwcursKey = -1; pI810->CursorARGBStart = 0; } else { pI810->ARGBHwcursOffset = tom; pI810->ARGBHwcursKey = key; if (!xf86BindGARTMemory(pScrn->scrnIndex, key, tom)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocation of %ld bytes for ARGB HW cursor failed\n", size); pI810->ARGBHwcursKey = -1; } else { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Allocated of %ld bytes for ARGB HW cursor\n", size); pI810->CursorARGBPhysical = physical; pI810->CursorARGBStart = tom; tom += size; } } /* * Overlay register buffer -- Just like the cursor, the i810 needs a * physical address in system memory from which to upload the overlay * registers. */ if (pI810->CursorStart != 0) { pI810->OverlayPhysical = pI810->CursorPhysical + 1024; pI810->OverlayStart = pI810->CursorStart + 1024; } pI810->GttBound = 1; return TRUE; }