diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 62 |
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 | */ | ||
296 | int 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; |