Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu/sdma4: use a helper for SDMA_OP_POLL_REGMEM

Rather than opencoding it in a bunch of functions.

Reviewed-by: Huang Rui <ray.huang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+34 -28
+34 -28
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
··· 360 360 361 361 } 362 362 363 + static void sdma_v4_0_wait_reg_mem(struct amdgpu_ring *ring, 364 + int mem_space, int hdp, 365 + uint32_t addr0, uint32_t addr1, 366 + uint32_t ref, uint32_t mask, 367 + uint32_t inv) 368 + { 369 + amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 370 + SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(hdp) | 371 + SDMA_PKT_POLL_REGMEM_HEADER_MEM_POLL(mem_space) | 372 + SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3)); /* == */ 373 + if (mem_space) { 374 + /* memory */ 375 + amdgpu_ring_write(ring, addr0); 376 + amdgpu_ring_write(ring, addr1); 377 + } else { 378 + /* registers */ 379 + amdgpu_ring_write(ring, addr0 << 2); 380 + amdgpu_ring_write(ring, addr1 << 2); 381 + } 382 + amdgpu_ring_write(ring, ref); /* reference */ 383 + amdgpu_ring_write(ring, mask); /* mask */ 384 + amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) | 385 + SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(inv)); /* retry count, poll interval */ 386 + } 387 + 363 388 /** 364 389 * sdma_v4_0_ring_emit_hdp_flush - emit an hdp flush on the DMA ring 365 390 * ··· 403 378 else 404 379 ref_and_mask = nbio_hf_reg->ref_and_mask_sdma1; 405 380 406 - amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 407 - SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(1) | 408 - SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3)); /* == */ 409 - amdgpu_ring_write(ring, (adev->nbio_funcs->get_hdp_flush_done_offset(adev)) << 2); 410 - amdgpu_ring_write(ring, (adev->nbio_funcs->get_hdp_flush_req_offset(adev)) << 2); 411 - amdgpu_ring_write(ring, ref_and_mask); /* reference */ 412 - amdgpu_ring_write(ring, ref_and_mask); /* mask */ 413 - amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) | 414 - SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */ 381 + sdma_v4_0_wait_reg_mem(ring, 0, 1, 382 + adev->nbio_funcs->get_hdp_flush_done_offset(adev), 383 + adev->nbio_funcs->get_hdp_flush_req_offset(adev), 384 + ref_and_mask, ref_and_mask, 10); 415 385 } 416 386 417 387 /** ··· 1134 1114 uint64_t addr = ring->fence_drv.gpu_addr; 1135 1115 1136 1116 /* wait for idle */ 1137 - amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 1138 - SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(0) | 1139 - SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3) | /* equal */ 1140 - SDMA_PKT_POLL_REGMEM_HEADER_MEM_POLL(1)); 1141 - amdgpu_ring_write(ring, addr & 0xfffffffc); 1142 - amdgpu_ring_write(ring, upper_32_bits(addr) & 0xffffffff); 1143 - amdgpu_ring_write(ring, seq); /* reference */ 1144 - amdgpu_ring_write(ring, 0xffffffff); /* mask */ 1145 - amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) | 1146 - SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(4)); /* retry count, poll interval */ 1117 + sdma_v4_0_wait_reg_mem(ring, 1, 0, 1118 + addr & 0xfffffffc, 1119 + upper_32_bits(addr) & 0xffffffff, 1120 + seq, 0xffffffff, 4); 1147 1121 } 1148 1122 1149 1123 ··· 1168 1154 static void sdma_v4_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, 1169 1155 uint32_t val, uint32_t mask) 1170 1156 { 1171 - amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_POLL_REGMEM) | 1172 - SDMA_PKT_POLL_REGMEM_HEADER_HDP_FLUSH(0) | 1173 - SDMA_PKT_POLL_REGMEM_HEADER_FUNC(3)); /* equal */ 1174 - amdgpu_ring_write(ring, reg << 2); 1175 - amdgpu_ring_write(ring, 0); 1176 - amdgpu_ring_write(ring, val); /* reference */ 1177 - amdgpu_ring_write(ring, mask); /* mask */ 1178 - amdgpu_ring_write(ring, SDMA_PKT_POLL_REGMEM_DW5_RETRY_COUNT(0xfff) | 1179 - SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); 1157 + sdma_v4_0_wait_reg_mem(ring, 0, 0, reg, 0, val, mask, 10); 1180 1158 } 1181 1159 1182 1160 static int sdma_v4_0_early_init(void *handle)