etnaviv: drm: add softpin interface
[mesa.git] / src / etnaviv / drm / etnaviv_bo.c
index 6e952fa478582bc58b3faf00214dfdbc00489bec..0ec64b780f5d2fb1f4afefc8486faffc0e50a420 100644 (file)
@@ -44,17 +44,22 @@ static void set_name(struct etna_bo *bo, uint32_t name)
 /* Called under etna_drm_table_lock */
 void _etna_bo_del(struct etna_bo *bo)
 {
+       VG_BO_FREE(bo);
+
+       if (bo->va)
+               util_vma_heap_free(&bo->dev->address_space, bo->va, bo->size);
+
        if (bo->map)
                os_munmap(bo->map, bo->size);
 
-       if (bo->name)
-               _mesa_hash_table_remove_key(bo->dev->name_table, &bo->name);
-
        if (bo->handle) {
                struct drm_gem_close req = {
                        .handle = bo->handle,
                };
 
+               if (bo->name)
+                       _mesa_hash_table_remove_key(bo->dev->name_table, &bo->name);
+
                _mesa_hash_table_remove_key(bo->dev->handle_table, &bo->handle);
                drmIoctl(bo->dev->fd, DRM_IOCTL_GEM_CLOSE, &req);
        }
@@ -104,6 +109,9 @@ static struct etna_bo *bo_from_handle(struct etna_device *dev,
        /* add ourselves to the handle table: */
        _mesa_hash_table_insert(dev->handle_table, &bo->handle, bo);
 
+       if (dev->use_softpin)
+               bo->va = util_vma_heap_alloc(&dev->address_space, bo->size, 4096);
+
        return bo;
 }
 
@@ -132,6 +140,8 @@ struct etna_bo *etna_bo_new(struct etna_device *dev, uint32_t size,
        bo->reuse = 1;
        pthread_mutex_unlock(&etna_drm_table_lock);
 
+       VG_BO_ALLOC(bo);
+
        return bo;
 }
 
@@ -188,8 +198,10 @@ struct etna_bo *etna_bo_from_name(struct etna_device *dev,
                goto out_unlock;
 
        bo = bo_from_handle(dev, req.size, req.handle, 0);
-       if (bo)
+       if (bo) {
                set_name(bo, name);
+               VG_BO_ALLOC(bo);
+       }
 
 out_unlock:
        pthread_mutex_unlock(&etna_drm_table_lock);
@@ -229,6 +241,8 @@ struct etna_bo *etna_bo_from_dmabuf(struct etna_device *dev, int fd)
 
        bo = bo_from_handle(dev, size, handle, 0);
 
+       VG_BO_ALLOC(bo);
+
 out_unlock:
        pthread_mutex_unlock(&etna_drm_table_lock);
 
@@ -238,11 +252,11 @@ out_unlock:
 /* destroy a buffer object */
 void etna_bo_del(struct etna_bo *bo)
 {
-       struct etna_device *dev = bo->dev;
-
        if (!bo)
                return;
 
+       struct etna_device *dev = bo->dev;
+
        if (!p_atomic_dec_zero(&bo->refcnt))
                return;
 
@@ -311,6 +325,11 @@ uint32_t etna_bo_size(struct etna_bo *bo)
        return bo->size;
 }
 
+uint32_t etna_bo_gpu_va(struct etna_bo *bo)
+{
+       return bo->va;
+}
+
 void *etna_bo_map(struct etna_bo *bo)
 {
        if (!bo->map) {