0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "amdgpu.h"
0025 #include "amdgpu_lsdma.h"
0026
0027 #define AMDGPU_LSDMA_MAX_SIZE 0x2000000ULL
0028
0029 int amdgpu_lsdma_wait_for(struct amdgpu_device *adev,
0030 uint32_t reg_index, uint32_t reg_val,
0031 uint32_t mask)
0032 {
0033 uint32_t val;
0034 int i;
0035
0036 for (i = 0; i < adev->usec_timeout; i++) {
0037 val = RREG32(reg_index);
0038 if ((val & mask) == reg_val)
0039 return 0;
0040 udelay(1);
0041 }
0042
0043 return -ETIME;
0044 }
0045
0046 int amdgpu_lsdma_copy_mem(struct amdgpu_device *adev,
0047 uint64_t src_addr,
0048 uint64_t dst_addr,
0049 uint64_t mem_size)
0050 {
0051 int ret;
0052
0053 if (mem_size == 0)
0054 return -EINVAL;
0055
0056 while (mem_size > 0) {
0057 uint64_t current_copy_size = min(mem_size, AMDGPU_LSDMA_MAX_SIZE);
0058
0059 ret = adev->lsdma.funcs->copy_mem(adev, src_addr, dst_addr, current_copy_size);
0060 if (ret)
0061 return ret;
0062 src_addr += current_copy_size;
0063 dst_addr += current_copy_size;
0064 mem_size -= current_copy_size;
0065 }
0066
0067 return 0;
0068 }
0069
0070 int amdgpu_lsdma_fill_mem(struct amdgpu_device *adev,
0071 uint64_t dst_addr,
0072 uint32_t data,
0073 uint64_t mem_size)
0074 {
0075 int ret;
0076
0077 if (mem_size == 0)
0078 return -EINVAL;
0079
0080 while (mem_size > 0) {
0081 uint64_t current_fill_size = min(mem_size, AMDGPU_LSDMA_MAX_SIZE);
0082
0083 ret = adev->lsdma.funcs->fill_mem(adev, dst_addr, data, current_fill_size);
0084 if (ret)
0085 return ret;
0086 dst_addr += current_fill_size;
0087 mem_size -= current_fill_size;
0088 }
0089
0090 return 0;
0091 }