aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c35
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index a13603abed07..921bce2df0b0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -238,17 +238,17 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, unsigned offset,
238 t = offset / AMDGPU_GPU_PAGE_SIZE; 238 t = offset / AMDGPU_GPU_PAGE_SIZE;
239 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 239 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
240 for (i = 0; i < pages; i++, p++) { 240 for (i = 0; i < pages; i++, p++) {
241 if (adev->gart.pages[p]) { 241#ifdef CONFIG_AMDGPU_GART_DEBUGFS
242 adev->gart.pages[p] = NULL; 242 adev->gart.pages[p] = NULL;
243 page_base = adev->dummy_page.addr; 243#endif
244 if (!adev->gart.ptr) 244 page_base = adev->dummy_page.addr;
245 continue; 245 if (!adev->gart.ptr)
246 continue;
246 247
247 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 248 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
248 amdgpu_gart_set_pte_pde(adev, adev->gart.ptr, 249 amdgpu_gart_set_pte_pde(adev, adev->gart.ptr,
249 t, page_base, flags); 250 t, page_base, flags);
250 page_base += AMDGPU_GPU_PAGE_SIZE; 251 page_base += AMDGPU_GPU_PAGE_SIZE;
251 }
252 } 252 }
253 } 253 }
254 mb(); 254 mb();
@@ -286,7 +286,9 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, unsigned offset,
286 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 286 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
287 287
288 for (i = 0; i < pages; i++, p++) { 288 for (i = 0; i < pages; i++, p++) {
289#ifdef CONFIG_AMDGPU_GART_DEBUGFS
289 adev->gart.pages[p] = pagelist[i]; 290 adev->gart.pages[p] = pagelist[i];
291#endif
290 if (adev->gart.ptr) { 292 if (adev->gart.ptr) {
291 page_base = dma_addr[i]; 293 page_base = dma_addr[i];
292 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 294 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
@@ -312,9 +314,9 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
312{ 314{
313 int r; 315 int r;
314 316
315 if (adev->gart.pages) { 317 if (adev->dummy_page.page)
316 return 0; 318 return 0;
317 } 319
318 /* We need PAGE_SIZE >= AMDGPU_GPU_PAGE_SIZE */ 320 /* We need PAGE_SIZE >= AMDGPU_GPU_PAGE_SIZE */
319 if (PAGE_SIZE < AMDGPU_GPU_PAGE_SIZE) { 321 if (PAGE_SIZE < AMDGPU_GPU_PAGE_SIZE) {
320 DRM_ERROR("Page size is smaller than GPU page size!\n"); 322 DRM_ERROR("Page size is smaller than GPU page size!\n");
@@ -328,12 +330,16 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
328 adev->gart.num_gpu_pages = adev->mc.gtt_size / AMDGPU_GPU_PAGE_SIZE; 330 adev->gart.num_gpu_pages = adev->mc.gtt_size / AMDGPU_GPU_PAGE_SIZE;
329 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n", 331 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
330 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages); 332 adev->gart.num_cpu_pages, adev->gart.num_gpu_pages);
333
334#ifdef CONFIG_AMDGPU_GART_DEBUGFS
331 /* Allocate pages table */ 335 /* Allocate pages table */
332 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages); 336 adev->gart.pages = vzalloc(sizeof(void *) * adev->gart.num_cpu_pages);
333 if (adev->gart.pages == NULL) { 337 if (adev->gart.pages == NULL) {
334 amdgpu_gart_fini(adev); 338 amdgpu_gart_fini(adev);
335 return -ENOMEM; 339 return -ENOMEM;
336 } 340 }
341#endif
342
337 return 0; 343 return 0;
338} 344}
339 345
@@ -346,13 +352,14 @@ int amdgpu_gart_init(struct amdgpu_device *adev)
346 */ 352 */
347void amdgpu_gart_fini(struct amdgpu_device *adev) 353void amdgpu_gart_fini(struct amdgpu_device *adev)
348{ 354{
349 if (adev->gart.pages && adev->gart.ready) { 355 if (adev->gart.ready) {
350 /* unbind pages */ 356 /* unbind pages */
351 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages); 357 amdgpu_gart_unbind(adev, 0, adev->gart.num_cpu_pages);
352 } 358 }
353 adev->gart.ready = false; 359 adev->gart.ready = false;
360#ifdef CONFIG_AMDGPU_GART_DEBUGFS
354 vfree(adev->gart.pages); 361 vfree(adev->gart.pages);
355 adev->gart.pages = NULL; 362 adev->gart.pages = NULL;
356 363#endif
357 amdgpu_dummy_page_fini(adev); 364 amdgpu_dummy_page_fini(adev);
358} 365}