diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_gem.c')
-rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem.c | 36 |
1 files changed, 22 insertions, 14 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_gem.c b/drivers/gpu/drm/omapdrm/omap_gem.c index aeb91ed653c9..7ed08fdc4c42 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c | |||
@@ -17,9 +17,9 @@ | |||
17 | * this program. If not, see <http://www.gnu.org/licenses/>. | 17 | * this program. If not, see <http://www.gnu.org/licenses/>. |
18 | */ | 18 | */ |
19 | 19 | ||
20 | |||
21 | #include <linux/spinlock.h> | ||
22 | #include <linux/shmem_fs.h> | 20 | #include <linux/shmem_fs.h> |
21 | #include <linux/spinlock.h> | ||
22 | |||
23 | #include <drm/drm_vma_manager.h> | 23 | #include <drm/drm_vma_manager.h> |
24 | 24 | ||
25 | #include "omap_drv.h" | 25 | #include "omap_drv.h" |
@@ -808,10 +808,10 @@ fail: | |||
808 | /* Release physical address, when DMA is no longer being performed.. this | 808 | /* Release physical address, when DMA is no longer being performed.. this |
809 | * could potentially unpin and unmap buffers from TILER | 809 | * could potentially unpin and unmap buffers from TILER |
810 | */ | 810 | */ |
811 | int omap_gem_put_paddr(struct drm_gem_object *obj) | 811 | void omap_gem_put_paddr(struct drm_gem_object *obj) |
812 | { | 812 | { |
813 | struct omap_gem_object *omap_obj = to_omap_bo(obj); | 813 | struct omap_gem_object *omap_obj = to_omap_bo(obj); |
814 | int ret = 0; | 814 | int ret; |
815 | 815 | ||
816 | mutex_lock(&obj->dev->struct_mutex); | 816 | mutex_lock(&obj->dev->struct_mutex); |
817 | if (omap_obj->paddr_cnt > 0) { | 817 | if (omap_obj->paddr_cnt > 0) { |
@@ -821,19 +821,18 @@ int omap_gem_put_paddr(struct drm_gem_object *obj) | |||
821 | if (ret) { | 821 | if (ret) { |
822 | dev_err(obj->dev->dev, | 822 | dev_err(obj->dev->dev, |
823 | "could not unpin pages: %d\n", ret); | 823 | "could not unpin pages: %d\n", ret); |
824 | goto fail; | ||
825 | } | 824 | } |
826 | ret = tiler_release(omap_obj->block); | 825 | ret = tiler_release(omap_obj->block); |
827 | if (ret) { | 826 | if (ret) { |
828 | dev_err(obj->dev->dev, | 827 | dev_err(obj->dev->dev, |
829 | "could not release unmap: %d\n", ret); | 828 | "could not release unmap: %d\n", ret); |
830 | } | 829 | } |
830 | omap_obj->paddr = 0; | ||
831 | omap_obj->block = NULL; | 831 | omap_obj->block = NULL; |
832 | } | 832 | } |
833 | } | 833 | } |
834 | fail: | 834 | |
835 | mutex_unlock(&obj->dev->struct_mutex); | 835 | mutex_unlock(&obj->dev->struct_mutex); |
836 | return ret; | ||
837 | } | 836 | } |
838 | 837 | ||
839 | /* Get rotated scanout address (only valid if already pinned), at the | 838 | /* Get rotated scanout address (only valid if already pinned), at the |
@@ -1272,13 +1271,16 @@ unlock: | |||
1272 | void omap_gem_free_object(struct drm_gem_object *obj) | 1271 | void omap_gem_free_object(struct drm_gem_object *obj) |
1273 | { | 1272 | { |
1274 | struct drm_device *dev = obj->dev; | 1273 | struct drm_device *dev = obj->dev; |
1274 | struct omap_drm_private *priv = dev->dev_private; | ||
1275 | struct omap_gem_object *omap_obj = to_omap_bo(obj); | 1275 | struct omap_gem_object *omap_obj = to_omap_bo(obj); |
1276 | 1276 | ||
1277 | evict(obj); | 1277 | evict(obj); |
1278 | 1278 | ||
1279 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); | 1279 | WARN_ON(!mutex_is_locked(&dev->struct_mutex)); |
1280 | 1280 | ||
1281 | spin_lock(&priv->list_lock); | ||
1281 | list_del(&omap_obj->mm_list); | 1282 | list_del(&omap_obj->mm_list); |
1283 | spin_unlock(&priv->list_lock); | ||
1282 | 1284 | ||
1283 | drm_gem_free_mmap_offset(obj); | 1285 | drm_gem_free_mmap_offset(obj); |
1284 | 1286 | ||
@@ -1358,8 +1360,8 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
1358 | /* currently don't allow cached buffers.. there is some caching | 1360 | /* currently don't allow cached buffers.. there is some caching |
1359 | * stuff that needs to be handled better | 1361 | * stuff that needs to be handled better |
1360 | */ | 1362 | */ |
1361 | flags &= ~(OMAP_BO_CACHED|OMAP_BO_UNCACHED); | 1363 | flags &= ~(OMAP_BO_CACHED|OMAP_BO_WC|OMAP_BO_UNCACHED); |
1362 | flags |= OMAP_BO_WC; | 1364 | flags |= tiler_get_cpu_cache_flags(); |
1363 | 1365 | ||
1364 | /* align dimensions to slot boundaries... */ | 1366 | /* align dimensions to slot boundaries... */ |
1365 | tiler_align(gem2fmt(flags), | 1367 | tiler_align(gem2fmt(flags), |
@@ -1374,9 +1376,7 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
1374 | 1376 | ||
1375 | omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); | 1377 | omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); |
1376 | if (!omap_obj) | 1378 | if (!omap_obj) |
1377 | goto fail; | 1379 | return NULL; |
1378 | |||
1379 | list_add(&omap_obj->mm_list, &priv->obj_list); | ||
1380 | 1380 | ||
1381 | obj = &omap_obj->base; | 1381 | obj = &omap_obj->base; |
1382 | 1382 | ||
@@ -1386,11 +1386,19 @@ struct drm_gem_object *omap_gem_new(struct drm_device *dev, | |||
1386 | */ | 1386 | */ |
1387 | omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size, | 1387 | omap_obj->vaddr = dma_alloc_writecombine(dev->dev, size, |
1388 | &omap_obj->paddr, GFP_KERNEL); | 1388 | &omap_obj->paddr, GFP_KERNEL); |
1389 | if (omap_obj->vaddr) | 1389 | if (!omap_obj->vaddr) { |
1390 | flags |= OMAP_BO_DMA; | 1390 | kfree(omap_obj); |
1391 | 1391 | ||
1392 | return NULL; | ||
1393 | } | ||
1394 | |||
1395 | flags |= OMAP_BO_DMA; | ||
1392 | } | 1396 | } |
1393 | 1397 | ||
1398 | spin_lock(&priv->list_lock); | ||
1399 | list_add(&omap_obj->mm_list, &priv->obj_list); | ||
1400 | spin_unlock(&priv->list_lock); | ||
1401 | |||
1394 | omap_obj->flags = flags; | 1402 | omap_obj->flags = flags; |
1395 | 1403 | ||
1396 | if (flags & OMAP_BO_TILED) { | 1404 | if (flags & OMAP_BO_TILED) { |