Michael Cardenas writes: > Unfortunately, I edited i810_memory.c and changed > > if (xf86AgpGARTSupported() && !pI810->directRenderingEnabled > && pI810->GttBound) { > > to > > if (xf86AgpGARTSupported() && pI810->GttBound) { > > and it still produces the same error when I launch a second X server. > > (WW) xf86AcquireGART: AGPIOC_ACQUIRE failed (Device or resource busy) > (EE) GARTInit: AGPIOC_INFO failed (Invalid argument) > (EE) I810(0): AGP GART support is not available. Make sure your kernel has > agpgart support or that the agpgart kernel module is loaded. > > Any suggestions on how to proceed? >
This is not so easy to fix. Only when used *without* DRI I810UnbindGARTMemory() unbinds the GART memory. In this case unbinding works well, starting a second server is no problem. With DRI unbinding has to be done thru a different interface. In this case the drm functions drmAgpUnbind(), drmAgpRelease(), drmAcquire() and drmBind() need to take care of unbinding/releaseing and reacquiring/rebinding the AGP memory. The current driver contains no code doing this. The patch in attachment 1 fixes this. There is one bug in the agpgart module and another one in agp_unbind() in the drm kernel driver which prevent a VT switch when direct rendering is enabled. Attachment 2 has patches. One last problem remains: These patches don't help starting a second Xserver: This second Xserver hangs in the lock created by the first one. The release() in the drm kernel driver tries to obtain a lock, when __HAVE_RELEASE is set. This lock is however held by the first Xsever. Only the i810 and i830 drivers have __HAVE_RELEASE set therefore other Xservers aren't affected. I've added Keith Whitwell, the original author of the i810 driver, to Cc. Maybe he can help me to find out how to fix this. Egbert.
diff.i810_vtswitch
Description: Binary data
diff.i810_vtswitch_kernel
Description: Binary data