aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-10-14 03:39:08 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-10-14 03:39:08 -0400
commit2d65a9f48fcdf7866aab6457bc707ca233e0c791 (patch)
treef93e5838d6ac2e59434367f4ff905f7d9c45fc2b /drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
parentda92da3638a04894afdca8b99e973ddd20268471 (diff)
parentdfda0df3426483cf5fc7441f23f318edbabecb03 (diff)
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "This is the main git pull for the drm, I pretty much froze major pulls at -rc5/6 time, and haven't had much fallout, so will probably continue doing that. Lots of changes all over, big internal header cleanup to make it clear drm features are legacy things and what are things that modern KMS drivers should be using. Also big move to use the new generic fences in all the TTM drivers. core: atomic prep work, vblank rework changes, allows immediate vblank disables major header reworking and cleanups to better delinate legacy interfaces from what KMS drivers should be using. cursor planes locking fixes ttm: move to generic fences (affects all TTM drivers) ppc64 caching fixes radeon: userptr support, uvd for old asics, reset rework for fence changes better buffer placement changes, dpm feature enablement hdmi audio support fixes intel: Cherryview work, 180 degree rotation, skylake prep work, execlist command submission full ppgtt prep work cursor improvements edid caching, vdd handling improvements nouveau: fence reworking kepler memory clock work gt21x clock work fan control improvements hdmi infoframe fixes DP audio ast: ppc64 fixes caching fix rcar: rcar-du DT support ipuv3: prep work for capture support msm: LVDS support for mdp4, new panel, gpu refactoring exynos: exynos3250 SoC support, drop bad mmap interface, mipi dsi changes, and component match support" * 'drm-next' of git://people.freedesktop.org/~airlied/linux: (640 commits) drm/mst: rework payload table allocation to conform better. drm/ast: Fix HW cursor image drm/radeon/kv: add uvd/vce info to dpm debugfs output drm/radeon/ci: add uvd/vce info to dpm debugfs output drm/radeon: export reservation_object from dmabuf to ttm drm/radeon: cope with foreign fences inside the reservation object drm/radeon: cope with foreign fences inside display drm/core: use helper to check driver features drm/radeon/cik: write gfx ucode version to ucode addr reg drm/radeon/si: print full CS when we hit a packet 0 drm/radeon: remove unecessary includes drm/radeon/combios: declare legacy_connector_convert as static drm/radeon/atombios: declare connector convert tables as static drm/radeon: drop btc_get_max_clock_from_voltage_dependency_table drm/radeon/dpm: drop clk/voltage dependency filters for BTC drm/radeon/dpm: drop clk/voltage dependency filters for CI drm/radeon/dpm: drop clk/voltage dependency filters for SI drm/radeon/dpm: drop clk/voltage dependency filters for NI drm/radeon: disable audio when we disable hdmi (v2) drm/radeon: split audio enable between eg and r600 (v2) ...
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_resource.c')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_resource.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
index a432c0db257c..026de7cea0f6 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c
@@ -133,6 +133,7 @@ static void vmw_resource_release(struct kref *kref)
133 struct ttm_validate_buffer val_buf; 133 struct ttm_validate_buffer val_buf;
134 134
135 val_buf.bo = bo; 135 val_buf.bo = bo;
136 val_buf.shared = false;
136 res->func->unbind(res, false, &val_buf); 137 res->func->unbind(res, false, &val_buf);
137 } 138 }
138 res->backup_dirty = false; 139 res->backup_dirty = false;
@@ -429,7 +430,7 @@ int vmw_dmabuf_init(struct vmw_private *dev_priv,
429 ret = ttm_bo_init(bdev, &vmw_bo->base, size, 430 ret = ttm_bo_init(bdev, &vmw_bo->base, size,
430 ttm_bo_type_device, placement, 431 ttm_bo_type_device, placement,
431 0, interruptible, 432 0, interruptible,
432 NULL, acc_size, NULL, bo_free); 433 NULL, acc_size, NULL, NULL, bo_free);
433 return ret; 434 return ret;
434} 435}
435 436
@@ -567,13 +568,18 @@ static int vmw_user_dmabuf_synccpu_grab(struct vmw_user_dma_buffer *user_bo,
567 int ret; 568 int ret;
568 569
569 if (flags & drm_vmw_synccpu_allow_cs) { 570 if (flags & drm_vmw_synccpu_allow_cs) {
570 struct ttm_bo_device *bdev = bo->bdev; 571 bool nonblock = !!(flags & drm_vmw_synccpu_dontblock);
572 long lret;
571 573
572 spin_lock(&bdev->fence_lock); 574 if (nonblock)
573 ret = ttm_bo_wait(bo, false, true, 575 return reservation_object_test_signaled_rcu(bo->resv, true) ? 0 : -EBUSY;
574 !!(flags & drm_vmw_synccpu_dontblock)); 576
575 spin_unlock(&bdev->fence_lock); 577 lret = reservation_object_wait_timeout_rcu(bo->resv, true, true, MAX_SCHEDULE_TIMEOUT);
576 return ret; 578 if (!lret)
579 return -EBUSY;
580 else if (lret < 0)
581 return lret;
582 return 0;
577 } 583 }
578 584
579 ret = ttm_bo_synccpu_write_grab 585 ret = ttm_bo_synccpu_write_grab
@@ -1214,8 +1220,9 @@ vmw_resource_check_buffer(struct vmw_resource *res,
1214 1220
1215 INIT_LIST_HEAD(&val_list); 1221 INIT_LIST_HEAD(&val_list);
1216 val_buf->bo = ttm_bo_reference(&res->backup->base); 1222 val_buf->bo = ttm_bo_reference(&res->backup->base);
1223 val_buf->shared = false;
1217 list_add_tail(&val_buf->head, &val_list); 1224 list_add_tail(&val_buf->head, &val_list);
1218 ret = ttm_eu_reserve_buffers(NULL, &val_list); 1225 ret = ttm_eu_reserve_buffers(NULL, &val_list, interruptible);
1219 if (unlikely(ret != 0)) 1226 if (unlikely(ret != 0))
1220 goto out_no_reserve; 1227 goto out_no_reserve;
1221 1228
@@ -1307,6 +1314,7 @@ int vmw_resource_do_evict(struct vmw_resource *res, bool interruptible)
1307 BUG_ON(!func->may_evict); 1314 BUG_ON(!func->may_evict);
1308 1315
1309 val_buf.bo = NULL; 1316 val_buf.bo = NULL;
1317 val_buf.shared = false;
1310 ret = vmw_resource_check_buffer(res, interruptible, &val_buf); 1318 ret = vmw_resource_check_buffer(res, interruptible, &val_buf);
1311 if (unlikely(ret != 0)) 1319 if (unlikely(ret != 0))
1312 return ret; 1320 return ret;
@@ -1352,6 +1360,7 @@ int vmw_resource_validate(struct vmw_resource *res)
1352 return 0; 1360 return 0;
1353 1361
1354 val_buf.bo = NULL; 1362 val_buf.bo = NULL;
1363 val_buf.shared = false;
1355 if (res->backup) 1364 if (res->backup)
1356 val_buf.bo = &res->backup->base; 1365 val_buf.bo = &res->backup->base;
1357 do { 1366 do {
@@ -1419,25 +1428,16 @@ void vmw_fence_single_bo(struct ttm_buffer_object *bo,
1419 struct vmw_fence_obj *fence) 1428 struct vmw_fence_obj *fence)
1420{ 1429{
1421 struct ttm_bo_device *bdev = bo->bdev; 1430 struct ttm_bo_device *bdev = bo->bdev;
1422 struct ttm_bo_driver *driver = bdev->driver; 1431
1423 struct vmw_fence_obj *old_fence_obj;
1424 struct vmw_private *dev_priv = 1432 struct vmw_private *dev_priv =
1425 container_of(bdev, struct vmw_private, bdev); 1433 container_of(bdev, struct vmw_private, bdev);
1426 1434
1427 if (fence == NULL) 1435 if (fence == NULL) {
1428 vmw_execbuf_fence_commands(NULL, dev_priv, &fence, NULL); 1436 vmw_execbuf_fence_commands(NULL, dev_priv, &fence, NULL);
1429 else 1437 reservation_object_add_excl_fence(bo->resv, &fence->base);
1430 driver->sync_obj_ref(fence); 1438 fence_put(&fence->base);
1431 1439 } else
1432 spin_lock(&bdev->fence_lock); 1440 reservation_object_add_excl_fence(bo->resv, &fence->base);
1433
1434 old_fence_obj = bo->sync_obj;
1435 bo->sync_obj = fence;
1436
1437 spin_unlock(&bdev->fence_lock);
1438
1439 if (old_fence_obj)
1440 vmw_fence_obj_unreference(&old_fence_obj);
1441} 1441}
1442 1442
1443/** 1443/**
@@ -1475,10 +1475,10 @@ void vmw_resource_move_notify(struct ttm_buffer_object *bo,
1475 1475
1476 if (mem->mem_type != VMW_PL_MOB) { 1476 if (mem->mem_type != VMW_PL_MOB) {
1477 struct vmw_resource *res, *n; 1477 struct vmw_resource *res, *n;
1478 struct ttm_bo_device *bdev = bo->bdev;
1479 struct ttm_validate_buffer val_buf; 1478 struct ttm_validate_buffer val_buf;
1480 1479
1481 val_buf.bo = bo; 1480 val_buf.bo = bo;
1481 val_buf.shared = false;
1482 1482
1483 list_for_each_entry_safe(res, n, &dma_buf->res_list, mob_head) { 1483 list_for_each_entry_safe(res, n, &dma_buf->res_list, mob_head) {
1484 1484
@@ -1491,9 +1491,7 @@ void vmw_resource_move_notify(struct ttm_buffer_object *bo,
1491 list_del_init(&res->mob_head); 1491 list_del_init(&res->mob_head);
1492 } 1492 }
1493 1493
1494 spin_lock(&bdev->fence_lock);
1495 (void) ttm_bo_wait(bo, false, false, false); 1494 (void) ttm_bo_wait(bo, false, false, false);
1496 spin_unlock(&bdev->fence_lock);
1497 } 1495 }
1498} 1496}
1499 1497