drm/tegra: gem: Extract tegra_bo_alloc_object()
authorThierry Reding <treding@nvidia.com>
Thu, 16 Oct 2014 12:18:50 +0000 (14:18 +0200)
committerThierry Reding <treding@nvidia.com>
Thu, 13 Nov 2014 15:14:46 +0000 (16:14 +0100)
This function implements the common buffer object allocation used for
both allocation and import paths.

Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/tegra/gem.c

index ce023fa3e8ae14bdfc3557295d69a7d8d12f9cd3..d86ded79193568ef0cd0815551fdc6ced719beae 100644 (file)
@@ -91,6 +91,36 @@ static const struct host1x_bo_ops tegra_bo_ops = {
        .kunmap = tegra_bo_kunmap,
 };
 
+static struct tegra_bo *tegra_bo_alloc_object(struct drm_device *drm,
+                                             size_t size)
+{
+       struct tegra_bo *bo;
+       int err;
+
+       bo = kzalloc(sizeof(*bo), GFP_KERNEL);
+       if (!bo)
+               return ERR_PTR(-ENOMEM);
+
+       host1x_bo_init(&bo->base, &tegra_bo_ops);
+       size = round_up(size, PAGE_SIZE);
+
+       err = drm_gem_object_init(drm, &bo->gem, size);
+       if (err < 0)
+               goto free;
+
+       err = drm_gem_create_mmap_offset(&bo->gem);
+       if (err < 0)
+               goto release;
+
+       return bo;
+
+release:
+       drm_gem_object_release(&bo->gem);
+free:
+       kfree(bo);
+       return ERR_PTR(err);
+}
+
 static void tegra_bo_destroy(struct drm_device *drm, struct tegra_bo *bo)
 {
        dma_free_writecombine(drm->dev, bo->gem.size, bo->vaddr, bo->paddr);
@@ -102,12 +132,9 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size,
        struct tegra_bo *bo;
        int err;
 
-       bo = kzalloc(sizeof(*bo), GFP_KERNEL);
-       if (!bo)
-               return ERR_PTR(-ENOMEM);
-
-       host1x_bo_init(&bo->base, &tegra_bo_ops);
-       size = round_up(size, PAGE_SIZE);
+       bo = tegra_bo_alloc_object(drm, size);
+       if (IS_ERR(bo))
+               return bo;
 
        bo->vaddr = dma_alloc_writecombine(drm->dev, size, &bo->paddr,
                                           GFP_KERNEL | __GFP_NOWARN);
@@ -118,14 +145,6 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size,
                goto err_dma;
        }
 
-       err = drm_gem_object_init(drm, &bo->gem, size);
-       if (err)
-               goto err_init;
-
-       err = drm_gem_create_mmap_offset(&bo->gem);
-       if (err)
-               goto err_mmap;
-
        if (flags & DRM_TEGRA_GEM_CREATE_TILED)
                bo->tiling.mode = TEGRA_BO_TILING_MODE_TILED;
 
@@ -134,10 +153,6 @@ struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size,
 
        return bo;
 
-err_mmap:
-       drm_gem_object_release(&bo->gem);
-err_init:
-       tegra_bo_destroy(drm, bo);
 err_dma:
        kfree(bo);
 
@@ -175,28 +190,16 @@ static struct tegra_bo *tegra_bo_import(struct drm_device *drm,
 {
        struct dma_buf_attachment *attach;
        struct tegra_bo *bo;
-       ssize_t size;
        int err;
 
-       bo = kzalloc(sizeof(*bo), GFP_KERNEL);
-       if (!bo)
-               return ERR_PTR(-ENOMEM);
-
-       host1x_bo_init(&bo->base, &tegra_bo_ops);
-       size = round_up(buf->size, PAGE_SIZE);
-
-       err = drm_gem_object_init(drm, &bo->gem, size);
-       if (err < 0)
-               goto free;
-
-       err = drm_gem_create_mmap_offset(&bo->gem);
-       if (err < 0)
-               goto release;
+       bo = tegra_bo_alloc_object(drm, buf->size);
+       if (IS_ERR(bo))
+               return bo;
 
        attach = dma_buf_attach(buf, drm->dev);
        if (IS_ERR(attach)) {
                err = PTR_ERR(attach);
-               goto free_mmap;
+               goto free;
        }
 
        get_dma_buf(buf);
@@ -228,13 +231,9 @@ detach:
 
        dma_buf_detach(buf, attach);
        dma_buf_put(buf);
-free_mmap:
-       drm_gem_free_mmap_offset(&bo->gem);
-release:
-       drm_gem_object_release(&bo->gem);
 free:
+       drm_gem_object_release(&bo->gem);
        kfree(bo);
-
        return ERR_PTR(err);
 }