summaryrefslogtreecommitdiff
AgeCommit message (Expand)Author
2007-10-25Fix buffer object flag / mask checking.Thomas Hellstrom
2007-10-25Merge branch 'master' into drm-ttm-finalizeThomas Hellstrom
2007-10-25i915: relocate buffers before validation add memory barrier between twoDave Airlie
2007-10-25i915: remove relocatee kernel mapping sooner stops mutex taking during sleepDave Airlie
2007-10-25missing mutex unlock bugRoel Kluin
2007-10-24Fix missing \n on some DRM_ERROR in i915_dma.cEric Anholt
2007-10-24i915: use a drm memory barrier defineDave Airlie
2007-10-23Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm into mode...Alan Hourihane
2007-10-23Need fb attachedAlan Hourihane
2007-10-23i915: require mfence before submitting batchbufferDave Airlie
2007-10-23nouveau: fix IGPStephane Marchesin
2007-10-22Remove duplicate file.Thomas Hellstrom
2007-10-22Don't clobber the unfenced list with DONT_FENCE operations.Thomas Hellstrom
2007-10-22A cmdbuf mutex to implement validate-submit-fence atomicity in the absenceThomas Hellstrom
2007-10-22Setstatus header.Thomas Hellstrom
2007-10-22i915: split reloc execution into separate functionDave Airlie
2007-10-21Get the lock flags right in libdrm.Thomas Hellstrom
2007-10-21Disable i915 accelerated blit copy moves for now until we canThomas Hellstrom
2007-10-21Adapt i915 super-ioctl for lock-free operation.Thomas Hellstrom
2007-10-21Remove the need for the hardware lock in the buffer manager.Thomas Hellstrom
2007-10-20Simple replacement for hardware lock in some cases.Thomas Hellstrom
2007-10-19Some comment updates pending removal of the init mutex.Thomas Hellstrom
2007-10-19No fence_class argument on drmBOSetStatus since it's notThomas Hellstrom
2007-10-19Remove the clean_unfenced function.Thomas Hellstrom
2007-10-17Bug #12838: Fix lock test client vs. server master race and misplaced closes.Robert Noland
2007-10-17Fix a race in the auth test where client prevents server from being master.Robert Noland
2007-10-17Bug #11870: FreeBSD hardware lock cleanup fix with multiple opens by a process.Jung-uk Kim
2007-10-17Only allow creator to change shared buffer mask.Thomas Hellstrom
2007-10-17Remove the op ioctl, and replace it with a setuser ioctl.Thomas Hellstrom
2007-10-17Revert "Replace NO_MOVE/NO_EVICT flags to buffer objects with an ioctl to set...Thomas Hellstrom
2007-10-17Revert "Copy the important parts of object_validate into object_create()."Thomas Hellstrom
2007-10-17Revert "Remove the pinned buffer from the LRU when pinning."Thomas Hellstrom
2007-10-17Revert "Add some more verbosity to drm_bo_set_pin_req comments."Thomas Hellstrom
2007-10-17Fix a crash on X startupAlan Hourihane
2007-10-17i915: lock struct mutex about buffer object lookupsDave Airlie
2007-10-16Merge branch 'master' of git+ssh://git.freedesktop.org/git/mesa/drm into mode...Alan Hourihane
2007-10-16Revert part of earlier commit that caused an unresolved symbol for i915.Michel Dänzer
2007-10-16drm: drop drm bo list handling codeDave Airlie
2007-10-16drm: rename drmBOUnReference to drmBOUnreference for consistencyDave Airlie
2007-10-16Drop destroy ioctls for fences and buffer objects.Kristian Høgsberg
2007-10-16Take bo type argument out of the ioctl interface.Kristian Høgsberg
2007-10-16Eliminate support for fake buffers.[utf-8] Kristian Høgsberg
2007-10-16nouveau: revert unintended change.Ben Skeggs
2007-10-16nouveau: Cleanup PGRAPH handler, attempt to survive PGRAPH exceptions.Ben Skeggs
2007-10-16nouveau: Survive PFIFO_CACHE_ERROR.Ben Skeggs
2007-10-16nouveau: Handle multiple PFIFO exceptions per irq, cleanup output.Ben Skeggs
2007-10-15should be unlockedAlan Hourihane
2007-10-15Fix some buffer teardown problems.Alan Hourihane
2007-10-14nouveau: PPC fixes. These regs are very touchy.Stephane Marchesin
2007-10-14nouveau: fix warning.Jeremy Kolb
IND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include "drmP.h" #include "via_drm.h" #include "via_drv.h" #include "via_ds.h" #include "via_mm.h" #define MAX_CONTEXT 100 typedef struct { int used; int context; set_t *sets[2]; /* 0 for frame buffer, 1 for AGP , 2 for System */ } via_context_t; static via_context_t global_ppriv[MAX_CONTEXT]; static int via_agp_alloc(drm_via_mem_t * mem); static int via_agp_free(drm_via_mem_t * mem); static int via_fb_alloc(drm_via_mem_t * mem); static int via_fb_free(drm_via_mem_t * mem); static int add_alloc_set(int context, int type, unsigned long val) { int i, retval = 0; for (i = 0; i < MAX_CONTEXT; i++) { if (global_ppriv[i].used && global_ppriv[i].context == context) { retval = via_setAdd(global_ppriv[i].sets[type], val); break; } } return retval; } static int del_alloc_set(int context, int type, unsigned long val) { int i, retval = 0; for (i = 0; i < MAX_CONTEXT; i++) if (global_ppriv[i].used && global_ppriv[i].context == context) { retval = via_setDel(global_ppriv[i].sets[type], val); break; } return retval; } /* agp memory management */ static memHeap_t *AgpHeap = NULL; int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_via_agp_t *agp = data; AgpHeap = via_mmInit(agp->offset, agp->size); DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)agp->offset, (unsigned long)agp->size); return 0; } /* fb memory management */ static memHeap_t *FBHeap = NULL; int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_via_fb_t *fb = data; FBHeap = via_mmInit(fb.offset, fb.size); DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)fb.offset, (unsigned long)fb.size); return 0; } int via_init_context(struct drm_device *dev, int context) { int i; for (i = 0; i < MAX_CONTEXT; i++) if (global_ppriv[i].used && (global_ppriv[i].context == context)) break; if (i >= MAX_CONTEXT) { for (i = 0; i < MAX_CONTEXT; i++) { if (!global_ppriv[i].used) { global_ppriv[i].context = context; global_ppriv[i].used = 1; global_ppriv[i].sets[0] = via_setInit(); global_ppriv[i].sets[1] = via_setInit(); DRM_DEBUG("init allocation set, socket=%d," " context = %d\n", i, context); break; } } if ((i >= MAX_CONTEXT) || (global_ppriv[i].sets[0] == NULL) || (global_ppriv[i].sets[1] == NULL)) { return 0; } } return 1; } int via_final_context(struct drm_device *dev, int context) { int i; drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; for (i = 0; i < MAX_CONTEXT; i++) if (global_ppriv[i].used && (global_ppriv[i].context == context)) break; if (i < MAX_CONTEXT) { set_t *set; ITEM_TYPE item; int retval; DRM_DEBUG("find socket %d, context = %d\n", i, context); /* Video Memory */ set = global_ppriv[i].sets[0]; retval = via_setFirst(set, &item); while (retval) { DRM_DEBUG("free video memory 0x%lx\n", item); via_mmFreeMem((PMemBlock) item); retval = via_setNext(set, &item); } via_setDestroy(set); /* AGP Memory */ set = global_ppriv[i].sets[1]; retval = via_setFirst(set, &item); while (retval) { DRM_DEBUG("free agp memory 0x%lx\n", item); via_mmFreeMem((PMemBlock) item); retval = via_setNext(set, &item); } via_setDestroy(set); global_ppriv[i].used = 0; } via_release_futex(dev_priv, context); #if defined(__linux__) /* Linux specific until context tracking code gets ported to BSD */ /* Last context, perform cleanup */ if (dev->ctx_count == 1 && dev->dev_private) { DRM_DEBUG("Last Context\n"); if (dev->irq) drm_irq_uninstall(dev); via_cleanup_futex(dev_priv); via_do_cleanup_map(dev); } #endif return 1; } int via_mem_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) { drm_via_mem_t *mem = data; switch (mem.type) { case VIA_MEM_VIDEO: if (via_fb_alloc(mem) < 0) return -EFAULT; return 0; case VIA_MEM_AGP: if (via_agp_alloc(mem) < 0) return -EFAULT; return 0; } return -EFAULT; } static int via_fb_alloc(drm_via_mem_t * mem) { drm_via_mm_t fb; PMemBlock block; int retval = 0; if (!FBHeap) return -1; fb.size = mem->size; fb.context = mem->context; block = via_mmAllocMem(FBHeap, fb.size, 5, 0); if (block) {