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) { if (dev->irq) DRM(irq_uninstall) (dev); via_cleanup_futex(dev_priv); via_do_cleanup_map(dev); } #endif return 1; }
static int via_fb_free(drm_via_mem_t * mem) { drm_via_mm_t fb; int retval = 0; if (!FBHeap) { return -1; } fb.free = mem->index; fb.context = mem->context; if (!fb.free) { return -1; } via_mmFreeMem((PMemBlock) fb.free); if (!del_alloc_set(fb.context, VIA_MEM_VIDEO, fb.free)) { retval = -1; } DRM_DEBUG("free fb, free = %ld\n", fb.free); return retval; }
static int via_agp_alloc(drm_via_mem_t * mem) { drm_via_mm_t agp; PMemBlock block; int retval = 0; if (!AgpHeap) return -1; agp.size = mem->size; agp.context = mem->context; block = via_mmAllocMem(AgpHeap, agp.size, 5, 0); if (block) { agp.offset = block->ofs; agp.free = (unsigned long)block; if (!add_alloc_set(agp.context, VIA_MEM_AGP, agp.free)) { DRM_DEBUG("adding to allocation set fails\n"); via_mmFreeMem((PMemBlock) agp.free); retval = -1; } } else { agp.offset = 0; agp.size = 0; agp.free = 0; } mem->offset = agp.offset; mem->index = agp.free; DRM_DEBUG("alloc agp, size = %d, offset = %d\n", agp.size, (unsigned int)agp.offset); return retval; }
static int via_agp_free(drm_via_mem_t * mem) { drm_via_mm_t agp; int retval = 0; agp.free = mem->index; agp.context = mem->context; if (!agp.free) return -1; via_mmFreeMem((PMemBlock) agp.free); if (!del_alloc_set(agp.context, VIA_MEM_AGP, agp.free)) { retval = -1; } DRM_DEBUG("free agp, free = %ld\n", agp.nfree); return retval; }
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) { fb.offset = block->ofs; fb.free = (unsigned long)block; if (!add_alloc_set(fb.context, VIA_MEM_VIDEO, fb.free)) { DRM_DEBUG("adding to allocation set fails\n"); via_mmFreeMem((PMemBlock) fb.free); retval = -1; } } else { fb.offset = 0; fb.size = 0; fb.free = 0; retval = -1; } mem->offset = fb.offset; mem->index = fb.free; DRM_DEBUG("alloc fb, size = %d, offset = %d\n", fb.size, (int)fb.offset); return retval; }