X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=shared-core%2Fvia_mm.c;h=45790dc27afff6065ea69b41f67e578f4969a375;hb=225e7e274f49d5e01fa1ad3fbbb9f1499865fe67;hp=5940de70a81f2fbfd7d233611ef721d2b3511d60;hpb=e34b5601912ce4b611d429304d5271fcf6f9f457;p=android-x86%2Fexternal-libdrm.git diff --git a/shared-core/via_mm.c b/shared-core/via_mm.c index 5940de70..45790dc2 100644 --- a/shared-core/via_mm.c +++ b/shared-core/via_mm.c @@ -29,8 +29,6 @@ #define MAX_CONTEXT 100 -unsigned int VIA_DEBUG = 1; - typedef struct { int used; int context; @@ -39,7 +37,12 @@ typedef struct { static via_context_t global_ppriv[MAX_CONTEXT]; -static int add_alloc_set(int context, int type, unsigned int val) +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; @@ -53,7 +56,7 @@ static int add_alloc_set(int context, int type, unsigned int val) return retval; } -static int del_alloc_set(int context, int type, unsigned int val) +static int del_alloc_set(int context, int type, unsigned long val) { int i, retval = 0; @@ -69,15 +72,14 @@ static int del_alloc_set(int context, int type, unsigned int val) /* agp memory management */ static memHeap_t *AgpHeap = NULL; -int via_agp_init(DRM_IOCTL_ARGS) +int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_via_agp_t agp; - - DRM_COPY_FROM_USER_IOCTL(agp, (drm_via_agp_t *) data, sizeof(agp)); + drm_via_agp_t *agp = data; - AgpHeap = via_mmInit(agp.offset, agp.size); + AgpHeap = via_mmInit(agp->offset, agp->size); - DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)agp.offset, (unsigned long)agp.size); + DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)agp->offset, + (unsigned long)agp->size); return 0; } @@ -85,15 +87,14 @@ int via_agp_init(DRM_IOCTL_ARGS) /* fb memory management */ static memHeap_t *FBHeap = NULL; -int via_fb_init(DRM_IOCTL_ARGS) +int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_via_fb_t fb; - - DRM_COPY_FROM_USER_IOCTL(fb, (drm_via_fb_t *) data, sizeof(fb)); + 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); + DRM_DEBUG("offset = %lu, size = %lu", (unsigned long)fb.offset, + (unsigned long)fb.size); return 0; } @@ -132,9 +133,7 @@ int via_init_context(struct drm_device *dev, int context) int via_final_context(struct drm_device *dev, int context) { int i; - volatile int *lock; drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private; - drm_via_sarea_t *sAPriv = dev_priv->sarea_priv; for (i = 0; i < MAX_CONTEXT; i++) if (global_ppriv[i].used && @@ -143,7 +142,7 @@ int via_final_context(struct drm_device *dev, int context) if (i < MAX_CONTEXT) { set_t *set; - unsigned int item; + ITEM_TYPE item; int retval; DRM_DEBUG("find socket %d, context = %d\n", i, context); @@ -152,7 +151,7 @@ int via_final_context(struct drm_device *dev, int context) set = global_ppriv[i].sets[0]; retval = via_setFirst(set, &item); while (retval) { - DRM_DEBUG("free video memory 0x%x\n", item); + DRM_DEBUG("free video memory 0x%lx\n", item); via_mmFreeMem((PMemBlock) item); retval = via_setNext(set, &item); } @@ -162,30 +161,15 @@ int via_final_context(struct drm_device *dev, int context) set = global_ppriv[i].sets[1]; retval = via_setFirst(set, &item); while (retval) { - DRM_DEBUG("free agp memory 0x%x\n", item); + 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); - /* - * Release futex locks. - */ - - for (i=0; i < VIA_NR_XVMC_LOCKS; ++i) { - lock = XVMCLOCKPTR(sAPriv, i); - if ( (_DRM_LOCKING_CONTEXT( *lock ) == i) && - (_DRM_LOCK_IS_HELD( *lock ))) { - if ( *lock & _DRM_LOCK_CONT) { - DRM_WAKEUP( &(dev_priv->decoder_queue[i])); - } - *lock &= ~( _DRM_LOCK_HELD | _DRM_LOCK_CONT ); - } - } - #if defined(__linux__) /* Linux specific until context tracking code gets ported to BSD */ /* Last context, perform cleanup */ @@ -194,6 +178,7 @@ int via_final_context(struct drm_device *dev, int context) if (dev->irq) drm_irq_uninstall(dev); + via_cleanup_futex(dev_priv); via_do_cleanup_map(dev); } #endif @@ -201,30 +186,25 @@ int via_final_context(struct drm_device *dev, int context) return 1; } -int via_mem_alloc(DRM_IOCTL_ARGS) +int via_mem_alloc(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_via_mem_t mem; + drm_via_mem_t *mem = data; - DRM_COPY_FROM_USER_IOCTL(mem, (drm_via_mem_t *) data, sizeof(mem)); switch (mem.type) { - case VIDEO: - if (via_fb_alloc(&mem) < 0) + case VIA_MEM_VIDEO: + if (via_fb_alloc(mem) < 0) return -EFAULT; - DRM_COPY_TO_USER_IOCTL((drm_via_mem_t *) data, mem, - sizeof(mem)); return 0; - case AGP: - if (via_agp_alloc(&mem) < 0) + case VIA_MEM_AGP: + if (via_agp_alloc(mem) < 0) return -EFAULT; - DRM_COPY_TO_USER_IOCTL((drm_via_mem_t *) data, mem, - sizeof(mem)); return 0; } return -EFAULT; } -int via_fb_alloc(drm_via_mem_t * mem) +static int via_fb_alloc(drm_via_mem_t * mem) { drm_via_mm_t fb; PMemBlock block; @@ -239,8 +219,8 @@ int via_fb_alloc(drm_via_mem_t * mem) block = via_mmAllocMem(FBHeap, fb.size, 5, 0); if (block) { fb.offset = block->ofs; - fb.free = (unsigned int)block; - if (!add_alloc_set(fb.context, VIDEO, fb.free)) { + 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; @@ -261,7 +241,7 @@ int via_fb_alloc(drm_via_mem_t * mem) return retval; } -int via_agp_alloc(drm_via_mem_t * mem) +static int via_agp_alloc(drm_via_mem_t * mem) { drm_via_mm_t agp; PMemBlock block; @@ -276,8 +256,8 @@ int via_agp_alloc(drm_via_mem_t * mem) block = via_mmAllocMem(AgpHeap, agp.size, 5, 0); if (block) { agp.offset = block->ofs; - agp.free = (unsigned int)block; - if (!add_alloc_set(agp.context, AGP, agp.free)) { + 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; @@ -296,20 +276,18 @@ int via_agp_alloc(drm_via_mem_t * mem) return retval; } -int via_mem_free(DRM_IOCTL_ARGS) +int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv) { - drm_via_mem_t mem; + drm_via_mem_t *mem = data; - DRM_COPY_FROM_USER_IOCTL(mem, (drm_via_mem_t *) data, sizeof(mem)); - - switch (mem.type) { + switch (mem->type) { - case VIDEO: - if (via_fb_free(&mem) == 0) + case VIA_MEM_VIDEO: + if (via_fb_free(mem) == 0) return 0; break; - case AGP: - if (via_agp_free(&mem) == 0) + case VIA_MEM_AGP: + if (via_agp_free(mem) == 0) return 0; break; } @@ -317,7 +295,7 @@ int via_mem_free(DRM_IOCTL_ARGS) return -EFAULT; } -int via_fb_free(drm_via_mem_t * mem) +static int via_fb_free(drm_via_mem_t * mem) { drm_via_mm_t fb; int retval = 0; @@ -336,16 +314,16 @@ int via_fb_free(drm_via_mem_t * mem) via_mmFreeMem((PMemBlock) fb.free); - if (!del_alloc_set(fb.context, VIDEO, fb.free)) { + if (!del_alloc_set(fb.context, VIA_MEM_VIDEO, fb.free)) { retval = -1; } - DRM_DEBUG("free fb, free = %d\n", fb.free); + DRM_DEBUG("free fb, free = %ld\n", fb.free); return retval; } -int via_agp_free(drm_via_mem_t * mem) +static int via_agp_free(drm_via_mem_t * mem) { drm_via_mm_t agp; @@ -359,11 +337,11 @@ int via_agp_free(drm_via_mem_t * mem) via_mmFreeMem((PMemBlock) agp.free); - if (!del_alloc_set(agp.context, AGP, agp.free)) { + if (!del_alloc_set(agp.context, VIA_MEM_AGP, agp.free)) { retval = -1; } - DRM_DEBUG("free agp, free = %d\n", agp.free); + DRM_DEBUG("free agp, free = %ld\n", agp.nfree); return retval; }