OSDN Git Service

nouveau: install libdrm_nouveau with libdrm
[android-x86/external-libdrm.git] / shared-core / via_mm.c
index 5940de7..45790dc 100644 (file)
@@ -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;
 }