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.c62
1 files changed, 48 insertions, 14 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 982b1cc11dac..b4048a91c814 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -283,6 +283,41 @@ int amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
283} 283}
284 284
285/** 285/**
286 * amdgpu_gart_map - map dma_addresses into GART entries
287 *
288 * @adev: amdgpu_device pointer
289 * @offset: offset into the GPU's gart aperture
290 * @pages: number of pages to bind
291 * @dma_addr: DMA addresses of pages
292 *
293 * Map the dma_addresses into GART entries (all asics).
294 * Returns 0 for success, -EINVAL for failure.
295 */
296int amdgpu_gart_map(struct amdgpu_device *adev, uint64_t offset,
297 int pages, dma_addr_t *dma_addr, uint64_t flags,
298 void *dst)
299{
300 uint64_t page_base;
301 unsigned i, j, t;
302
303 if (!adev->gart.ready) {
304 WARN(1, "trying to bind memory to uninitialized GART !\n");
305 return -EINVAL;
306 }
307
308 t = offset / AMDGPU_GPU_PAGE_SIZE;
309
310 for (i = 0; i < pages; i++) {
311 page_base = dma_addr[i];
312 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) {
313 amdgpu_gart_set_pte_pde(adev, dst, t, page_base, flags);
314 page_base += AMDGPU_GPU_PAGE_SIZE;
315 }
316 }
317 return 0;
318}
319
320/**
286 * amdgpu_gart_bind - bind pages into the gart page table 321 * amdgpu_gart_bind - bind pages into the gart page table
287 * 322 *
288 * @adev: amdgpu_device pointer 323 * @adev: amdgpu_device pointer
@@ -299,31 +334,30 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
299 int pages, struct page **pagelist, dma_addr_t *dma_addr, 334 int pages, struct page **pagelist, dma_addr_t *dma_addr,
300 uint64_t flags) 335 uint64_t flags)
301{ 336{
302 unsigned t; 337#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
303 unsigned p; 338 unsigned i,t,p;
304 uint64_t page_base; 339#endif
305 int i, j; 340 int r;
306 341
307 if (!adev->gart.ready) { 342 if (!adev->gart.ready) {
308 WARN(1, "trying to bind memory to uninitialized GART !\n"); 343 WARN(1, "trying to bind memory to uninitialized GART !\n");
309 return -EINVAL; 344 return -EINVAL;
310 } 345 }
311 346
347#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
312 t = offset / AMDGPU_GPU_PAGE_SIZE; 348 t = offset / AMDGPU_GPU_PAGE_SIZE;
313 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 349 p = t / (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE);
314 350 for (i = 0; i < pages; i++, p++)
315 for (i = 0; i < pages; i++, p++) {
316#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
317 adev->gart.pages[p] = pagelist[i]; 351 adev->gart.pages[p] = pagelist[i];
318#endif 352#endif
319 if (adev->gart.ptr) { 353
320 page_base = dma_addr[i]; 354 if (adev->gart.ptr) {
321 for (j = 0; j < (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); j++, t++) { 355 r = amdgpu_gart_map(adev, offset, pages, dma_addr, flags,
322 amdgpu_gart_set_pte_pde(adev, adev->gart.ptr, t, page_base, flags); 356 adev->gart.ptr);
323 page_base += AMDGPU_GPU_PAGE_SIZE; 357 if (r)
324 } 358 return r;
325 }
326 } 359 }
360
327 mb(); 361 mb();
328 amdgpu_gart_flush_gpu_tlb(adev, 0); 362 amdgpu_gart_flush_gpu_tlb(adev, 0);
329 return 0; 363 return 0;