aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_gem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_gem.c')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_gem.c36
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 */
811int omap_gem_put_paddr(struct drm_gem_object *obj) 811void 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 }
834fail: 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:
1272void omap_gem_free_object(struct drm_gem_object *obj) 1271void 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) {