diff options
author | Michel Dänzer <michel.daenzer@amd.com> | 2015-01-21 03:36:35 -0500 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-01-22 11:46:17 -0500 |
commit | cb65890610dca287718a63bd8a5d9ce3dc80c3d7 (patch) | |
tree | 17221a105fad2276d0b0c05ead0257fe63776be2 /drivers/gpu/drm/radeon/radeon_gart.c | |
parent | 67cf2d391292f8bf0598236e7b4ec343eae6234f (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.c | 37 |
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 | */ |
357 | void radeon_gart_fini(struct radeon_device *rdev) | 364 | void 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 | } |