[01/12] drm/cirrus: split out bo unpinning from cirrus_bo_push_sysram

Submitted by Varad Gautam on Sept. 8, 2017, 1:35 p.m.

Details

Message ID 20170908133517.18715-2-varadgautam@gmail.com
State New
Headers show
Series "atomic modesetting for cirrus" ( rev: 2 ) in DRI devel

Not browsing as part of any series.

Commit Message

Varad Gautam Sept. 8, 2017, 1:35 p.m.
From: Varad Gautam <varad.gautam@collabora.com>

add a cirrus_bo_unpin call, and move bo_{reserve,unreserve} operations
to bo_{pin,unpin} to ensure correct pinning/unpinning and simplify the call
sequence.

Signed-off-by: Varad Gautam <varad.gautam@collabora.com>
---
 drivers/gpu/drm/cirrus/cirrus_drv.h  |  1 +
 drivers/gpu/drm/cirrus/cirrus_mode.c | 14 ++-------
 drivers/gpu/drm/cirrus/cirrus_ttm.c  | 55 +++++++++++++++++++++++++++++-------
 3 files changed, 48 insertions(+), 22 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index be2d7e488062..e16b86dd6c19 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -254,6 +254,7 @@  static inline void cirrus_bo_unreserve(struct cirrus_bo *bo)
 
 int cirrus_bo_push_sysram(struct cirrus_bo *bo);
 int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr);
+int cirrus_bo_unpin(struct cirrus_bo *bo);
 
 extern int cirrus_bpp;
 
diff --git a/drivers/gpu/drm/cirrus/cirrus_mode.c b/drivers/gpu/drm/cirrus/cirrus_mode.c
index a4c4a465b385..6a8d09c9a36b 100644
--- a/drivers/gpu/drm/cirrus/cirrus_mode.c
+++ b/drivers/gpu/drm/cirrus/cirrus_mode.c
@@ -112,26 +112,17 @@  static int cirrus_crtc_do_set_base(struct drm_crtc *crtc,
 		cirrus_fb = to_cirrus_framebuffer(fb);
 		obj = cirrus_fb->obj;
 		bo = gem_to_cirrus_bo(obj);
-		ret = cirrus_bo_reserve(bo, false);
-		if (ret)
-			return ret;
+		cirrus_bo_unpin(bo);
 		cirrus_bo_push_sysram(bo);
-		cirrus_bo_unreserve(bo);
 	}
 
 	cirrus_fb = to_cirrus_framebuffer(crtc->primary->fb);
 	obj = cirrus_fb->obj;
 	bo = gem_to_cirrus_bo(obj);
 
-	ret = cirrus_bo_reserve(bo, false);
-	if (ret)
-		return ret;
-
 	ret = cirrus_bo_pin(bo, TTM_PL_FLAG_VRAM, &gpu_addr);
-	if (ret) {
-		cirrus_bo_unreserve(bo);
+	if (ret)
 		return ret;
-	}
 
 	if (&cdev->mode_info.gfbdev->gfb == cirrus_fb) {
 		/* if pushing console in kmap it */
@@ -139,7 +130,6 @@  static int cirrus_crtc_do_set_base(struct drm_crtc *crtc,
 		if (ret)
 			DRM_ERROR("failed to kmap fbcon\n");
 	}
-	cirrus_bo_unreserve(bo);
 
 	cirrus_set_start_address(crtc, (u32)gpu_addr);
 	return 0;
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 1ff1838c0d44..a91d31da90ba 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -358,12 +358,17 @@  static inline u64 cirrus_bo_gpu_offset(struct cirrus_bo *bo)
 
 int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
 {
-	int i, ret;
+	int i, ret = 0;
+
+	ret = cirrus_bo_reserve(bo, false);
+	if (ret)
+		return ret;
 
 	if (bo->pin_count) {
 		bo->pin_count++;
 		if (gpu_addr)
 			*gpu_addr = cirrus_bo_gpu_offset(bo);
+		goto out;
 	}
 
 	cirrus_ttm_placement(bo, pl_flag);
@@ -371,24 +376,51 @@  int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
 		bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
 	ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
 	if (ret)
-		return ret;
+		goto out;
 
 	bo->pin_count = 1;
 	if (gpu_addr)
 		*gpu_addr = cirrus_bo_gpu_offset(bo);
-	return 0;
+
+out:
+	cirrus_bo_unreserve(bo);
+	return ret;
+}
+
+int cirrus_bo_unpin(struct cirrus_bo *bo)
+{
+	int i, ret = 0;
+
+	ret = cirrus_bo_reserve(bo, false);
+	if (ret)
+		return ret;
+
+	if (!bo->pin_count || --bo->pin_count)
+		goto out;
+
+	for (i = 0; i < bo->placement.num_placement; i++)
+		bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
+	ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
+	if (ret)
+		goto out;
+
+out:
+	cirrus_bo_unreserve(bo);
+	return ret;
 }
 
 int cirrus_bo_push_sysram(struct cirrus_bo *bo)
 {
 	int i, ret;
-	if (!bo->pin_count) {
+
+	ret = cirrus_bo_reserve(bo, false);
+	if (ret)
+		return ret;
+
+	if (bo->pin_count) {
 		DRM_ERROR("unpin bad %p\n", bo);
-		return 0;
+		goto out;
 	}
-	bo->pin_count--;
-	if (bo->pin_count)
-		return 0;
 
 	if (bo->kmap.virtual)
 		ttm_bo_kunmap(&bo->kmap);
@@ -400,9 +432,12 @@  int cirrus_bo_push_sysram(struct cirrus_bo *bo)
 	ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
 	if (ret) {
 		DRM_ERROR("pushing to VRAM failed\n");
-		return ret;
+		goto out;
 	}
-	return 0;
+
+out:
+	cirrus_bo_unreserve(bo);
+	return ret;
 }
 
 int cirrus_mmap(struct file *filp, struct vm_area_struct *vma)