1 /* 2 * Copyright 2026 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 */ 23 24 #include <linux/delay.h> 25 #include "amdgpu.h" 26 #include "lsdma_v7_1.h" 27 #include "amdgpu_lsdma.h" 28 29 #include "lsdma/lsdma_7_1_0_offset.h" 30 #include "lsdma/lsdma_7_1_0_sh_mask.h" 31 32 static int lsdma_v7_1_wait_pio_status(struct amdgpu_device *adev) 33 { 34 return amdgpu_lsdma_wait_for(adev, SOC15_REG_OFFSET(LSDMA, 0, regLSDMA_PIO_STATUS), 35 LSDMA_PIO_STATUS__PIO_IDLE_MASK | LSDMA_PIO_STATUS__PIO_FIFO_EMPTY_MASK, 36 LSDMA_PIO_STATUS__PIO_IDLE_MASK | LSDMA_PIO_STATUS__PIO_FIFO_EMPTY_MASK); 37 } 38 39 static int lsdma_v7_1_copy_mem(struct amdgpu_device *adev, 40 uint64_t src_addr, 41 uint64_t dst_addr, 42 uint64_t size) 43 { 44 int ret; 45 uint32_t tmp; 46 47 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_SRC_ADDR_LO, lower_32_bits(src_addr)); 48 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_SRC_ADDR_HI, upper_32_bits(src_addr)); 49 50 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_DST_ADDR_LO, lower_32_bits(dst_addr)); 51 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_DST_ADDR_HI, upper_32_bits(dst_addr)); 52 53 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_CONTROL, 0x0); 54 55 tmp = RREG32_SOC15(LSDMA, 0, regLSDMA_PIO_COMMAND); 56 tmp = REG_SET_FIELD(tmp, LSDMA_PIO_COMMAND, COUNT, size); 57 tmp = REG_SET_FIELD(tmp, LSDMA_PIO_COMMAND, RAW_WAIT, 0); 58 tmp = REG_SET_FIELD(tmp, LSDMA_PIO_COMMAND, CONSTANT_FILL, 0); 59 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_COMMAND, tmp); 60 61 ret = lsdma_v7_1_wait_pio_status(adev); 62 if (ret) 63 dev_err(adev->dev, "LSDMA PIO failed to copy memory!\n"); 64 65 return ret; 66 } 67 68 static int lsdma_v7_1_fill_mem(struct amdgpu_device *adev, 69 uint64_t dst_addr, 70 uint32_t data, 71 uint64_t size) 72 { 73 int ret; 74 uint32_t tmp; 75 76 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_CONSTFILL_DATA, data); 77 78 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_DST_ADDR_LO, lower_32_bits(dst_addr)); 79 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_DST_ADDR_HI, upper_32_bits(dst_addr)); 80 81 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_CONTROL, 0x0); 82 83 tmp = RREG32_SOC15(LSDMA, 0, regLSDMA_PIO_COMMAND); 84 tmp = REG_SET_FIELD(tmp, LSDMA_PIO_COMMAND, COUNT, size); 85 tmp = REG_SET_FIELD(tmp, LSDMA_PIO_COMMAND, RAW_WAIT, 0); 86 tmp = REG_SET_FIELD(tmp, LSDMA_PIO_COMMAND, CONSTANT_FILL, 1); 87 WREG32_SOC15(LSDMA, 0, regLSDMA_PIO_COMMAND, tmp); 88 89 ret = lsdma_v7_1_wait_pio_status(adev); 90 if (ret) 91 dev_err(adev->dev, "LSDMA PIO failed to fill memory!\n"); 92 93 return ret; 94 } 95 96 const struct amdgpu_lsdma_funcs lsdma_v7_1_funcs = { 97 .copy_mem = lsdma_v7_1_copy_mem, 98 .fill_mem = lsdma_v7_1_fill_mem, 99 }; 100