Module Name: src Committed By: riastradh Date: Sun Dec 19 12:22:37 UTC 2021
Modified Files: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu: amdgpu_vm.c amdgpu_vm.h Log Message: amdgpu: Thread bus_dma segments through amdgpu_vm.c. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 \ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c cvs rdiff -u -r1.2 -r1.3 \ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:1.6 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:1.7 --- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c:1.6 Sun Dec 19 12:22:28 2021 +++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.c Sun Dec 19 12:22:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: amdgpu_vm.c,v 1.6 2021/12/19 12:22:28 riastradh Exp $ */ +/* $NetBSD: amdgpu_vm.c,v 1.7 2021/12/19 12:22:37 riastradh Exp $ */ /* * Copyright 2008 Advanced Micro Devices, Inc. @@ -28,7 +28,7 @@ * Jerome Glisse */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: amdgpu_vm.c,v 1.6 2021/12/19 12:22:28 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: amdgpu_vm.c,v 1.7 2021/12/19 12:22:37 riastradh Exp $"); #include <linux/dma-fence-array.h> #include <linux/interval_tree_generic.h> @@ -1218,12 +1218,21 @@ struct amdgpu_bo_va *amdgpu_vm_bo_find(s * Returns: * The pointer for the page table entry. */ +#ifdef __NetBSD__ +uint64_t amdgpu_vm_map_gart(const bus_dma_segment_t *pages_addr, uint64_t addr) +#else uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr) +#endif { uint64_t result; /* page table offset */ +#ifdef __NetBSD__ + KASSERT(pages_addr[addr >> PAGE_SHIFT].ds_len == PAGE_SIZE); + result = pages_addr[addr >> PAGE_SHIFT].ds_addr; +#else result = pages_addr[addr >> PAGE_SHIFT]; +#endif /* in case cpu page size != gpu page size*/ result |= addr & (~PAGE_MASK); @@ -1574,7 +1583,11 @@ static int amdgpu_vm_bo_update_mapping(s struct dma_fence *exclusive, uint64_t start, uint64_t last, uint64_t flags, uint64_t addr, +#ifdef __NetBSD__ + bus_dma_segment_t *pages_addr, +#else dma_addr_t *pages_addr, +#endif struct dma_fence **fence) { struct amdgpu_vm_update_params params; @@ -1633,7 +1646,11 @@ error_unlock: */ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, struct dma_fence *exclusive, +#ifdef __NetBSD__ + bus_dma_segment_t *pages_addr, +#else dma_addr_t *pages_addr, +#endif struct amdgpu_vm *vm, struct amdgpu_bo_va_mapping *mapping, uint64_t flags, @@ -1667,7 +1684,11 @@ static int amdgpu_vm_bo_split_mapping(st } do { +#ifdef __NetBSD__ + bus_dma_segment_t *dma_addr = NULL; +#else dma_addr_t *dma_addr = NULL; +#endif uint64_t max_entries; uint64_t addr, last; @@ -1688,16 +1709,28 @@ static int amdgpu_vm_bo_split_mapping(st ++count) { uint64_t idx = pfn + count; +#ifdef __NetBSD__ + KASSERT(pages_addr[idx].ds_len == PAGE_SIZE); + if (pages_addr[idx].ds_addr != + pages_addr[idx - 1].ds_addr + PAGE_SIZE) + break; +#else if (pages_addr[idx] != (pages_addr[idx - 1] + PAGE_SIZE)) break; +#endif } if (count < min_linear_pages) { addr = pfn << PAGE_SHIFT; dma_addr = pages_addr; } else { +#ifdef __NetBSD__ + KASSERT(pages_addr[pfn].ds_len == PAGE_SIZE); + addr = pages_addr[pfn].ds_addr; +#else addr = pages_addr[pfn]; +#endif max_entries = count * AMDGPU_GPU_PAGES_IN_CPU_PAGE; } @@ -1744,7 +1777,11 @@ int amdgpu_vm_bo_update(struct amdgpu_de struct amdgpu_bo *bo = bo_va->base.bo; struct amdgpu_vm *vm = bo_va->base.vm; struct amdgpu_bo_va_mapping *mapping; +#ifdef __NetBSD__ + bus_dma_segment_t *pages_addr = NULL; +#else dma_addr_t *pages_addr = NULL; +#endif struct ttm_mem_reg *mem; struct drm_mm_node *nodes; struct dma_fence *exclusive, **last_update; @@ -1763,7 +1800,11 @@ int amdgpu_vm_bo_update(struct amdgpu_de nodes = mem->mm_node; if (mem->mem_type == TTM_PL_TT) { ttm = container_of(bo->tbo.ttm, struct ttm_dma_tt, ttm); +#ifdef __NetBSD__ + pages_addr = ttm->dma_address->dm_segs; +#else pages_addr = ttm->dma_address; +#endif } exclusive = bo->tbo.moving; } Index: src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.h diff -u src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.h:1.2 src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.h:1.3 --- src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.h:1.2 Sat Dec 18 23:44:58 2021 +++ src/sys/external/bsd/drm2/dist/drm/amd/amdgpu/amdgpu_vm.h Sun Dec 19 12:22:37 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: amdgpu_vm.h,v 1.2 2021/12/18 23:44:58 riastradh Exp $ */ +/* $NetBSD: amdgpu_vm.h,v 1.3 2021/12/19 12:22:37 riastradh Exp $ */ /* * Copyright 2016 Advanced Micro Devices, Inc. @@ -214,7 +214,11 @@ struct amdgpu_vm_update_params { * * DMA addresses to use for mapping */ +#ifdef __NetBSD__ + bus_dma_segment_t *pages_addr; +#else dma_addr_t *pages_addr; +#endif /** * @job: job to used for hw submission @@ -395,7 +399,11 @@ int amdgpu_vm_bo_update(struct amdgpu_de bool amdgpu_vm_evictable(struct amdgpu_bo *bo); void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, struct amdgpu_bo *bo, bool evicted); +#ifdef __NetBSD__ +uint64_t amdgpu_vm_map_gart(const bus_dma_segment_t *pages_addr, uint64_t addr); +#else uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr); +#endif struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm, struct amdgpu_bo *bo); struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,