aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_gart.c
diff options
context:
space:
mode:
authorMichel Dänzer <michel.daenzer@amd.com>2015-01-21 03:36:35 -0500
committerAlex Deucher <alexander.deucher@amd.com>2015-01-22 11:46:17 -0500
commitcb65890610dca287718a63bd8a5d9ce3dc80c3d7 (patch)
tree17221a105fad2276d0b0c05ead0257fe63776be2 /drivers/gpu/drm/radeon/radeon_gart.c
parent67cf2d391292f8bf0598236e7b4ec343eae6234f (diff)
drm/radeon: Split off gart_get_page_entry ASIC hook from set_page_entry
get_page_entry calculates the GART page table entry, which is just written to the GART page table by set_page_entry. This is a prerequisite for the following fix. Reviewed-by: Christian König <christian.koenig@amd.com> Cc: stable@vger.kernel.org Signed-off-by: Michel Dänzer <michel.daenzer@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_gart.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_gart.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index 84146d5901aa..a530932c7654 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -228,7 +228,6 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
228 unsigned t; 228 unsigned t;
229 unsigned p; 229 unsigned p;
230 int i, j; 230 int i, j;
231 u64 page_base;
232 231
233 if (!rdev->gart.ready) { 232 if (!rdev->gart.ready) {
234 WARN(1, "trying to unbind memory from uninitialized GART !\n"); 233 WARN(1, "trying to unbind memory from uninitialized GART !\n");
@@ -240,13 +239,12 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
240 if (rdev->gart.pages[p]) { 239 if (rdev->gart.pages[p]) {
241 rdev->gart.pages[p] = NULL; 240 rdev->gart.pages[p] = NULL;
242 rdev->gart.pages_addr[p] = rdev->dummy_page.addr; 241 rdev->gart.pages_addr[p] = rdev->dummy_page.addr;
243 page_base = rdev->gart.pages_addr[p];
244 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 242 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
243 rdev->gart.pages_entry[t] = rdev->dummy_page.entry;
245 if (rdev->gart.ptr) { 244 if (rdev->gart.ptr) {
246 radeon_gart_set_page(rdev, t, page_base, 245 radeon_gart_set_page(rdev, t,
247 RADEON_GART_PAGE_DUMMY); 246 rdev->dummy_page.entry);
248 } 247 }
249 page_base += RADEON_GPU_PAGE_SIZE;
250 } 248 }
251 } 249 }
252 } 250 }
@@ -274,7 +272,7 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
274{ 272{
275 unsigned t; 273 unsigned t;
276 unsigned p; 274 unsigned p;
277 uint64_t page_base; 275 uint64_t page_base, page_entry;
278 int i, j; 276 int i, j;
279 277
280 if (!rdev->gart.ready) { 278 if (!rdev->gart.ready) {
@@ -287,12 +285,14 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
287 for (i = 0; i < pages; i++, p++) { 285 for (i = 0; i < pages; i++, p++) {
288 rdev->gart.pages_addr[p] = dma_addr[i]; 286 rdev->gart.pages_addr[p] = dma_addr[i];
289 rdev->gart.pages[p] = pagelist[i]; 287 rdev->gart.pages[p] = pagelist[i];
290 if (rdev->gart.ptr) { 288 page_base = dma_addr[i];
291 page_base = rdev->gart.pages_addr[p]; 289 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
292 for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) { 290 page_entry = radeon_gart_get_page_entry(page_base, flags);
293 radeon_gart_set_page(rdev, t, page_base, flags); 291 rdev->gart.pages_entry[t] = page_entry;
294 page_base += RADEON_GPU_PAGE_SIZE; 292 if (rdev->gart.ptr) {
293 radeon_gart_set_page(rdev, t, page_entry);
295 } 294 }
295 page_base += RADEON_GPU_PAGE_SIZE;
296 } 296 }
297 } 297 }
298 mb(); 298 mb();
@@ -340,10 +340,17 @@ int radeon_gart_init(struct radeon_device *rdev)
340 radeon_gart_fini(rdev); 340 radeon_gart_fini(rdev);
341 return -ENOMEM; 341 return -ENOMEM;
342 } 342 }
343 rdev->gart.pages_entry = vmalloc(sizeof(uint64_t) *
344 rdev->gart.num_gpu_pages);
345 if (rdev->gart.pages_entry == NULL) {
346 radeon_gart_fini(rdev);
347 return -ENOMEM;
348 }
343 /* set GART entry to point to the dummy page by default */ 349 /* set GART entry to point to the dummy page by default */
344 for (i = 0; i < rdev->gart.num_cpu_pages; i++) { 350 for (i = 0; i < rdev->gart.num_cpu_pages; i++)
345 rdev->gart.pages_addr[i] = rdev->dummy_page.addr; 351 rdev->gart.pages_addr[i] = rdev->dummy_page.addr;
346 } 352 for (i = 0; i < rdev->gart.num_gpu_pages; i++)
353 rdev->gart.pages_entry[i] = rdev->dummy_page.entry;
347 return 0; 354 return 0;
348} 355}
349 356
@@ -356,15 +363,17 @@ int radeon_gart_init(struct radeon_device *rdev)
356 */ 363 */
357void radeon_gart_fini(struct radeon_device *rdev) 364void radeon_gart_fini(struct radeon_device *rdev)
358{ 365{
359 if (rdev->gart.pages && rdev->gart.pages_addr && rdev->gart.ready) { 366 if (rdev->gart.ready) {
360 /* unbind pages */ 367 /* unbind pages */
361 radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages); 368 radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages);
362 } 369 }
363 rdev->gart.ready = false; 370 rdev->gart.ready = false;
364 vfree(rdev->gart.pages); 371 vfree(rdev->gart.pages);
365 vfree(rdev->gart.pages_addr); 372 vfree(rdev->gart.pages_addr);
373 vfree(rdev->gart.pages_entry);
366 rdev->gart.pages = NULL; 374 rdev->gart.pages = NULL;
367 rdev->gart.pages_addr = NULL; 375 rdev->gart.pages_addr = NULL;
376 rdev->gart.pages_entry = NULL;
368 377
369 radeon_dummy_page_fini(rdev); 378 radeon_dummy_page_fini(rdev);
370} 379}