diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index dee4a0c..f078a21 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -30,10 +30,11 @@
 /* Test BO GTT->VRAM and VRAM->GTT GPU copies across the whole GTT aperture */
 void radeon_test_moves(struct radeon_device *rdev)
 {
-	struct radeon_bo *vram_obj = NULL;
+	struct radeon_bo **vram_obj = NULL;
 	struct radeon_bo **gtt_obj = NULL;
 	struct radeon_fence *fence = NULL;
-	uint64_t gtt_addr, vram_addr;
+	void **gtt_map = NULL, **vram_map = NULL;
+	uint64_t *gtt_addr = NULL, *vram_addr = NULL;
 	unsigned i, n, size;
 	int r;
 
@@ -46,55 +47,116 @@ void radeon_test_moves(struct radeon_device *rdev)
 	     rdev->cp.ring_size)) / size;
 
 	gtt_obj = kzalloc(n * sizeof(*gtt_obj), GFP_KERNEL);
+	vram_obj = kzalloc(n * sizeof(*vram_obj), GFP_KERNEL);
+	gtt_map = kzalloc(n * sizeof(*gtt_map), GFP_KERNEL);
+	vram_map = kzalloc(n * sizeof(*vram_map), GFP_KERNEL);
+	gtt_addr = kzalloc(n * sizeof(*gtt_addr), GFP_KERNEL);
+	vram_addr = kzalloc(n * sizeof(*vram_addr), GFP_KERNEL);
+
 	if (!gtt_obj) {
-		DRM_ERROR("Failed to allocate %d pointers\n", n);
+		DRM_ERROR("gtt_obj: Failed to allocate %d pointers\n", n);
 		r = 1;
 		goto out_cleanup;
 	}
 
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				&vram_obj);
-	if (r) {
-		DRM_ERROR("Failed to create VRAM object\n");
+	if (!vram_obj) {
+		DRM_ERROR("vram_obj: Failed to allocate %d pointers\n", n);
+		r = 1;
 		goto out_cleanup;
 	}
-	r = radeon_bo_reserve(vram_obj, false);
-	if (unlikely(r != 0))
+
+	if (!gtt_map) {
+		DRM_ERROR("gtt_map: Failed to allocate %d pointers\n", n);
+		r = 1;
 		goto out_cleanup;
-	r = radeon_bo_pin(vram_obj, RADEON_GEM_DOMAIN_VRAM, &vram_addr);
-	if (r) {
-		DRM_ERROR("Failed to pin VRAM object\n");
+	}
+
+	if (!vram_map) {
+		DRM_ERROR("vram_map: Failed to allocate %d pointers\n", n);
+		r = 1;
+		goto out_cleanup;
+	}
+
+	if (!gtt_addr) {
+		DRM_ERROR("gtt_addr: Failed to allocate %d pointers\n", n);
+		r = 1;
+		goto out_cleanup;
+	}
+
+	if (!vram_addr) {
+		DRM_ERROR("vram_addr: Failed to allocate %d pointers\n", n);
+		r = 1;
 		goto out_cleanup;
 	}
+
+	/* Allocate memspace */
 	for (i = 0; i < n; i++) {
-		void *gtt_map, *vram_map;
-		void **gtt_start, **gtt_end;
-		void **vram_start, **vram_end;
+		/* Create bo lives in VRAM */
+		r = radeon_bo_create(rdev, NULL, size, true, RADEON_GEM_DOMAIN_VRAM,
+				vram_obj + i);
+		if (r) {
+			DRM_ERROR("Failed to create VRAM object %d\n", i);
+			break;
+		}
 
-		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
+		r = radeon_bo_reserve(vram_obj[i], false);
+		if (unlikely(r != 0))
+			break;
+		r = radeon_bo_pin(vram_obj[i], RADEON_GEM_DOMAIN_VRAM, vram_addr + i);
+		if (r) {
+			DRM_ERROR("Failed to pin VRAM object %d\n", i);
+			break;
+		}
+
+		/* Create bo lives in gtt */
+		r = radeon_bo_create(rdev, NULL, size, true,
 					 RADEON_GEM_DOMAIN_GTT, gtt_obj + i);
 		if (r) {
 			DRM_ERROR("Failed to create GTT object %d\n", i);
-			goto out_cleanup;
+			break;
 		}
 
 		r = radeon_bo_reserve(gtt_obj[i], false);
 		if (unlikely(r != 0))
-			goto out_cleanup;
-		r = radeon_bo_pin(gtt_obj[i], RADEON_GEM_DOMAIN_GTT, &gtt_addr);
+			break;
+		r = radeon_bo_pin(gtt_obj[i], RADEON_GEM_DOMAIN_GTT, gtt_addr + i);
 		if (r) {
 			DRM_ERROR("Failed to pin GTT object %d\n", i);
-			goto out_cleanup;
+			break;
+		}
+	}
+
+	if (i < n) {
+		if (vram_obj[i]) {
+			if (radeon_bo_is_reserved(vram_obj[i])) {
+				radeon_bo_unpin(vram_obj[i]);
+				radeon_bo_unreserve(vram_obj[i]);
+			}
+			radeon_bo_unref(&vram_obj[i]);
+		}
+		if (gtt_obj[i]) {
+			if (radeon_bo_is_reserved(gtt_obj[i])) {
+				radeon_bo_unpin(gtt_obj[i]);
+				radeon_bo_unreserve(gtt_obj[i]);
+			}
+			radeon_bo_unref(&gtt_obj[i]);
 		}
+	}
 
-		r = radeon_bo_kmap(gtt_obj[i], &gtt_map);
+	n = i;
+
+	/* Copy GTT->VRAM  */
+	for (i = 0; i < n; i++) {
+		void **gtt_start, **gtt_end;
+
+		r = radeon_bo_kmap(gtt_obj[i], gtt_map + i);
 		if (r) {
 			DRM_ERROR("Failed to map GTT object %d\n", i);
 			goto out_cleanup;
 		}
 
-		for (gtt_start = gtt_map, gtt_end = gtt_map + size;
-		     gtt_start < gtt_end;
+		for (gtt_start = gtt_map[i], gtt_end = gtt_map[i] + size;
+		     gtt_start + 1 <= gtt_end;
 		     gtt_start++)
 			*gtt_start = gtt_start;
 
@@ -106,7 +168,7 @@ void radeon_test_moves(struct radeon_device *rdev)
 			goto out_cleanup;
 		}
 
-		r = radeon_copy(rdev, gtt_addr, vram_addr, size / RADEON_GPU_PAGE_SIZE, fence);
+		r = radeon_copy(rdev, gtt_addr[i], vram_addr[i], size / RADEON_GPU_PAGE_SIZE, fence);
 		if (r) {
 			DRM_ERROR("Failed GTT->VRAM copy %d\n", i);
 			goto out_cleanup;
@@ -119,37 +181,48 @@ void radeon_test_moves(struct radeon_device *rdev)
 		}
 
 		radeon_fence_unref(&fence);
+	}
+	DRM_INFO("Generated & Copied %d samples from gtt->vram", n);
+
+	/* Check: Copy GTT->VRAM  */
+	for (i = 0; i < n; i++) {
+		void **gtt_start, **gtt_end;
+		void **vram_start, **vram_end;
 
-		r = radeon_bo_kmap(vram_obj, &vram_map);
+		r = radeon_bo_kmap(vram_obj[i], vram_map + i);
 		if (r) {
 			DRM_ERROR("Failed to map VRAM object after copy %d\n", i);
 			goto out_cleanup;
 		}
 
-		for (gtt_start = gtt_map, gtt_end = gtt_map + size,
-		     vram_start = vram_map, vram_end = vram_map + size;
-		     vram_start < vram_end;
+		for (gtt_start = gtt_map[i], gtt_end = gtt_map[i] + size,
+		     vram_start = vram_map[i], vram_end = vram_map[i] + size;
+		     vram_start + 1 <= vram_end;
 		     gtt_start++, vram_start++) {
 			if (*vram_start != gtt_start) {
 				DRM_ERROR("Incorrect GTT->VRAM copy %d: Got 0x%p, "
 					  "expected 0x%p (GTT map 0x%p-0x%p)\n",
-					  i, *vram_start, gtt_start, gtt_map,
+					  i, *vram_start, gtt_start, gtt_map[i],
 					  gtt_end);
-				radeon_bo_kunmap(vram_obj);
+				radeon_bo_kunmap(vram_obj[i]);
 				goto out_cleanup;
 			}
 			*vram_start = vram_start;
 		}
 
-		radeon_bo_kunmap(vram_obj);
+		radeon_bo_kunmap(vram_obj[i]);
+	}
+	DRM_INFO("Checked & resampled %d samples in vram.", n);
 
+	/* Copy VRAM->GTT */
+	for (i = 0; i < n; i++) {
 		r = radeon_fence_create(rdev, &fence);
 		if (r) {
 			DRM_ERROR("Failed to create VRAM->GTT fence %d\n", i);
-			goto out_cleanup;
+			break;
 		}
 
-		r = radeon_copy(rdev, vram_addr, gtt_addr, size / RADEON_GPU_PAGE_SIZE, fence);
+		r = radeon_copy(rdev, vram_addr[i], gtt_addr[i], size / RADEON_GPU_PAGE_SIZE, fence);
 		if (r) {
 			DRM_ERROR("Failed VRAM->GTT copy %d\n", i);
 			goto out_cleanup;
@@ -162,21 +235,28 @@ void radeon_test_moves(struct radeon_device *rdev)
 		}
 
 		radeon_fence_unref(&fence);
+	}
+	DRM_INFO("Copied %d samples from vram->gtt", n);
+
+	/* Check: Copy VRAM->GTT */
+	for (i = 0; i < n; i++) {
+		void **gtt_start, **gtt_end;
+		void **vram_start, **vram_end;
 
-		r = radeon_bo_kmap(gtt_obj[i], &gtt_map);
+		r = radeon_bo_kmap(gtt_obj[i], gtt_map + i);
 		if (r) {
 			DRM_ERROR("Failed to map GTT object after copy %d\n", i);
 			goto out_cleanup;
 		}
 
-		for (gtt_start = gtt_map, gtt_end = gtt_map + size,
-		     vram_start = vram_map, vram_end = vram_map + size;
-		     gtt_start < gtt_end;
+		for (gtt_start = gtt_map[i], gtt_end = gtt_map[i] + size,
+		     vram_start = vram_map[i], vram_end = vram_map[i] + size;
+		     gtt_start + 1 <= gtt_end;
 		     gtt_start++, vram_start++) {
 			if (*gtt_start != vram_start) {
 				DRM_ERROR("Incorrect VRAM->GTT copy %d: Got 0x%p, "
 					  "expected 0x%p (VRAM map 0x%p-0x%p)\n",
-					  i, *gtt_start, vram_start, vram_map,
+					  i, *gtt_start, vram_start, vram_map[i],
 					  vram_end);
 				radeon_bo_kunmap(gtt_obj[i]);
 				goto out_cleanup;
@@ -184,18 +264,24 @@ void radeon_test_moves(struct radeon_device *rdev)
 		}
 
 		radeon_bo_kunmap(gtt_obj[i]);
-
-		DRM_INFO("Tested GTT->VRAM and VRAM->GTT copy for GTT offset 0x%llx\n",
-			 gtt_addr - rdev->mc.gtt_start);
 	}
+	DRM_INFO("Checked %d samples in gtt.", n);
+
+	DRM_INFO("Tested GTT->VRAM and VRAM->GTT copy for GTT offset 0x%llx\n",
+		 gtt_addr[n-1] - rdev->mc.gtt_start);
 
 out_cleanup:
 	if (vram_obj) {
-		if (radeon_bo_is_reserved(vram_obj)) {
-			radeon_bo_unpin(vram_obj);
-			radeon_bo_unreserve(vram_obj);
+		for (i = 0; i < n; i++) {
+			if (vram_obj[i]) {
+				if (radeon_bo_is_reserved(vram_obj[i])) {
+					radeon_bo_unpin(vram_obj[i]);
+					radeon_bo_unreserve(vram_obj[i]);
+				}
+				radeon_bo_unref(&vram_obj[i]);
+			}
 		}
-		radeon_bo_unref(&vram_obj);
+		kfree(vram_obj);
 	}
 	if (gtt_obj) {
 		for (i = 0; i < n; i++) {
@@ -209,6 +295,16 @@ out_cleanup:
 		}
 		kfree(gtt_obj);
 	}
+
+	if (gtt_map)
+		kfree(gtt_map);
+	if (vram_map)
+		kfree(vram_map);
+	if (gtt_addr)
+		kfree(gtt_addr);
+	if (vram_addr)
+		kfree(vram_addr);
+
 	if (fence) {
 		radeon_fence_unref(&fence);
 	}
