amdgpu: use amdgpu_gem_wait_idle_ioctl to wait for GPU to finish.

For linear path we don't wait for GPU to finish before CPU access
which may case issues in gralloc lock() case.

Bug=b:115585732
TEST=android.video.cts.VideoEncoderDecoderTest#testAvcGoog0Qual1920x1080

Change-Id: If827fe4a18726797082046b4f24fc8c75ff1bcb7
Signed-off-by: Deepak Sharma <Deepak.sharma@amd.com>
Reviewed-on: https://chromium-review.googlesource.com/1340484
Commit-Ready: Deepak Sharma <deepak.sharma@amd.com>
Tested-by: Deepak Sharma <deepak.sharma@amd.com>
Reviewed-by: Deepak Sharma <deepak.sharma@amd.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
diff --git a/amdgpu.c b/amdgpu.c
index add4c20..3dbe0e8 100644
--- a/amdgpu.c
+++ b/amdgpu.c
@@ -240,6 +240,32 @@
 		return munmap(vma->addr, vma->length);
 }
 
+static int amdgpu_bo_invalidate(struct bo *bo, struct mapping *mapping)
+{
+	int ret;
+	union drm_amdgpu_gem_wait_idle wait_idle;
+
+	if (bo->priv)
+		return 0;
+
+	memset(&wait_idle, 0, sizeof(wait_idle));
+	wait_idle.in.handle = bo->handles[0].u32;
+	wait_idle.in.timeout = AMDGPU_TIMEOUT_INFINITE;
+
+	ret = drmCommandWriteRead(bo->drv->fd, DRM_AMDGPU_GEM_WAIT_IDLE, &wait_idle,
+				  sizeof(wait_idle));
+
+	if (ret < 0) {
+		drv_log("DRM_AMDGPU_GEM_WAIT_IDLE failed with %d\n", ret);
+		return ret;
+	}
+
+	if (ret == 0 && wait_idle.out.status)
+		drv_log("DRM_AMDGPU_GEM_WAIT_IDLE BO is busy\n");
+
+	return 0;
+}
+
 static uint32_t amdgpu_resolve_format(uint32_t format, uint64_t use_flags)
 {
 	switch (format) {
@@ -265,6 +291,7 @@
 	.bo_import = amdgpu_import_bo,
 	.bo_map = amdgpu_map_bo,
 	.bo_unmap = amdgpu_unmap_bo,
+	.bo_invalidate = amdgpu_bo_invalidate,
 	.resolve_format = amdgpu_resolve_format,
 };