@@ -686,6 +686,23 @@ fail:
return ERR_PTR(ret);
}
+int etnaviv_gem_new_private(struct drm_device *dev, size_t size, uint32_t flags,
+ struct etnaviv_gem_object **res)
+{
+ struct drm_gem_object *obj;
+ int ret;
+
+ ret = etnaviv_gem_new_impl(dev, size, flags, &obj);
+ if (ret)
+ return ret;
+
+ drm_gem_private_object_init(dev, obj, size);
+
+ *res = to_etnaviv_bo(obj);
+
+ return 0;
+}
+
static void etnaviv_gem_prime_release(struct etnaviv_gem_object *etnaviv_obj)
{
if (etnaviv_obj->vaddr)
@@ -709,20 +726,16 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
uint32_t size, struct sg_table *sgt)
{
struct etnaviv_gem_object *etnaviv_obj;
- struct drm_gem_object *obj;
int ret, npages;
size = PAGE_ALIGN(size);
- ret = etnaviv_gem_new_impl(dev, size, ETNA_BO_WC, &obj);
- if (ret)
- goto fail;
-
- drm_gem_private_object_init(dev, obj, size);
+ ret = etnaviv_gem_new_private(dev, size, ETNA_BO_WC, &etnaviv_obj);
+ if (ret < 0)
+ return ERR_PTR(ret);
npages = size / PAGE_SIZE;
- etnaviv_obj = to_etnaviv_bo(obj);
etnaviv_obj->ops = &etnaviv_gem_prime_ops;
etnaviv_obj->sgt = sgt;
etnaviv_obj->pages = drm_malloc_ab(npages, sizeof(struct page *));
@@ -736,11 +749,10 @@ struct drm_gem_object *msm_gem_import(struct drm_device *dev,
if (ret)
goto fail;
- return obj;
+ return &etnaviv_obj->base;
fail:
- if (obj)
- drm_gem_object_unreference_unlocked(obj);
+ drm_gem_object_unreference_unlocked(&etnaviv_obj->base);
return ERR_PTR(ret);
}
@@ -105,4 +105,7 @@ struct etnaviv_gem_submit {
} bos[0];
};
+int etnaviv_gem_new_private(struct drm_device *dev, size_t size, uint32_t flags,
+ struct etnaviv_gem_object **res);
+
#endif /* __ETNAVIV_GEM_H__ */