|
@@ -808,10 +808,10 @@ fail:
|
|
/* Release physical address, when DMA is no longer being performed.. this
|
|
/* Release physical address, when DMA is no longer being performed.. this
|
|
* could potentially unpin and unmap buffers from TILER
|
|
* could potentially unpin and unmap buffers from TILER
|
|
*/
|
|
*/
|
|
-int omap_gem_put_paddr(struct drm_gem_object *obj)
|
|
|
|
|
|
+void omap_gem_put_paddr(struct drm_gem_object *obj)
|
|
{
|
|
{
|
|
struct omap_gem_object *omap_obj = to_omap_bo(obj);
|
|
struct omap_gem_object *omap_obj = to_omap_bo(obj);
|
|
- int ret = 0;
|
|
|
|
|
|
+ int ret;
|
|
|
|
|
|
mutex_lock(&obj->dev->struct_mutex);
|
|
mutex_lock(&obj->dev->struct_mutex);
|
|
if (omap_obj->paddr_cnt > 0) {
|
|
if (omap_obj->paddr_cnt > 0) {
|
|
@@ -821,7 +821,6 @@ int omap_gem_put_paddr(struct drm_gem_object *obj)
|
|
if (ret) {
|
|
if (ret) {
|
|
dev_err(obj->dev->dev,
|
|
dev_err(obj->dev->dev,
|
|
"could not unpin pages: %d\n", ret);
|
|
"could not unpin pages: %d\n", ret);
|
|
- goto fail;
|
|
|
|
}
|
|
}
|
|
ret = tiler_release(omap_obj->block);
|
|
ret = tiler_release(omap_obj->block);
|
|
if (ret) {
|
|
if (ret) {
|
|
@@ -832,9 +831,8 @@ int omap_gem_put_paddr(struct drm_gem_object *obj)
|
|
omap_obj->block = NULL;
|
|
omap_obj->block = NULL;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-fail:
|
|
|
|
|
|
+
|
|
mutex_unlock(&obj->dev->struct_mutex);
|
|
mutex_unlock(&obj->dev->struct_mutex);
|
|
- return ret;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/* Get rotated scanout address (only valid if already pinned), at the
|
|
/* Get rotated scanout address (only valid if already pinned), at the
|
|
@@ -1378,11 +1376,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
|
|
|
|
|
|
omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL);
|
|
omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL);
|
|
if (!omap_obj)
|
|
if (!omap_obj)
|
|
- goto fail;
|
|
|
|
-
|
|
|
|
- spin_lock(&priv->list_lock);
|
|
|
|
- list_add(&omap_obj->mm_list, &priv->obj_list);
|
|
|
|
- spin_unlock(&priv->list_lock);
|
|
|
|
|
|
+ return NULL;
|
|
|
|
|
|
obj = &omap_obj->base;
|
|
obj = &omap_obj->base;
|
|
|
|
|
|
@@ -1392,11 +1386,19 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev,
|
|
*/
|
|
*/
|
|
omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size,
|
|
omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size,
|
|
&omap_obj->paddr, GFP_KERNEL);
|
|
&omap_obj->paddr, GFP_KERNEL);
|
|
- if (omap_obj->vaddr)
|
|
|
|
- flags |= OMAP_BO_DMA;
|
|
|
|
|
|
+ if (!omap_obj->vaddr) {
|
|
|
|
+ kfree(omap_obj);
|
|
|
|
+
|
|
|
|
+ return NULL;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ flags |= OMAP_BO_DMA;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ spin_lock(&priv->list_lock);
|
|
|
|
+ list_add(&omap_obj->mm_list, &priv->obj_list);
|
|
|
|
+ spin_unlock(&priv->list_lock);
|
|
|
|
+
|
|
omap_obj->flags = flags;
|
|
omap_obj->flags = flags;
|
|
|
|
|
|
if (flags & OMAP_BO_TILED) {
|
|
if (flags & OMAP_BO_TILED) {
|