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

drm/amdgpu/gfx7: add ring reset callback for gfx

Add ring reset callback for gfx.

v2: fix operator precedence (kernel test robot)

Acked-by: Vitaly Prosyak <vitaly.prosyak@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+76 -1
+1
drivers/gpu/drm/amd/amdgpu/cikd.h
··· 364 364 * 1 - Stream 365 365 * 2 - Bypass 366 366 */ 367 + #define EOP_EXEC (1 << 28) /* For Trailing Fence */ 367 368 #define DATA_SEL(x) ((x) << 29) 368 369 /* 0 - discard 369 370 * 1 - send low 32bit data
+75 -1
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 2114 2114 { 2115 2115 bool write64bit = flags & AMDGPU_FENCE_FLAG_64BIT; 2116 2116 bool int_sel = flags & AMDGPU_FENCE_FLAG_INT; 2117 + bool exec = flags & AMDGPU_FENCE_FLAG_EXEC; 2118 + 2117 2119 /* Workaround for cache flush problems. First send a dummy EOP 2118 2120 * event down the pipe with seq one below. 2119 2121 */ ··· 2135 2133 amdgpu_ring_write(ring, (EOP_TCL1_ACTION_EN | 2136 2134 EOP_TC_ACTION_EN | 2137 2135 EVENT_TYPE(CACHE_FLUSH_AND_INV_TS_EVENT) | 2138 - EVENT_INDEX(5))); 2136 + EVENT_INDEX(5) | 2137 + (exec ? EOP_EXEC : 0))); 2139 2138 amdgpu_ring_write(ring, addr & 0xfffffffc); 2140 2139 amdgpu_ring_write(ring, (upper_32_bits(addr) & 0xffff) | 2141 2140 DATA_SEL(write64bit ? 2 : 1) | INT_SEL(int_sel ? 2 : 0)); ··· 4924 4921 amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ 4925 4922 } 4926 4923 4924 + static void gfx_v7_0_wait_reg_mem(struct amdgpu_ring *ring, int eng_sel, 4925 + int mem_space, int opt, uint32_t addr0, 4926 + uint32_t addr1, uint32_t ref, uint32_t mask, 4927 + uint32_t inv) 4928 + { 4929 + amdgpu_ring_write(ring, PACKET3(PACKET3_WAIT_REG_MEM, 5)); 4930 + amdgpu_ring_write(ring, 4931 + /* memory (1) or register (0) */ 4932 + (WAIT_REG_MEM_MEM_SPACE(mem_space) | 4933 + WAIT_REG_MEM_OPERATION(opt) | /* wait */ 4934 + WAIT_REG_MEM_FUNCTION(3) | /* equal */ 4935 + WAIT_REG_MEM_ENGINE(eng_sel))); 4936 + 4937 + if (mem_space) 4938 + BUG_ON(addr0 & 0x3); /* Dword align */ 4939 + amdgpu_ring_write(ring, addr0); 4940 + amdgpu_ring_write(ring, addr1); 4941 + amdgpu_ring_write(ring, ref); 4942 + amdgpu_ring_write(ring, mask); 4943 + amdgpu_ring_write(ring, inv); /* poll interval */ 4944 + } 4945 + 4946 + static void gfx_v7_0_ring_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg, 4947 + uint32_t val, uint32_t mask) 4948 + { 4949 + gfx_v7_0_wait_reg_mem(ring, 0, 0, 0, reg, 0, val, mask, 0x20); 4950 + } 4951 + 4952 + static int gfx_v7_0_reset_kgq(struct amdgpu_ring *ring, unsigned int vmid) 4953 + { 4954 + struct amdgpu_device *adev = ring->adev; 4955 + struct amdgpu_kiq *kiq = &adev->gfx.kiq[0]; 4956 + struct amdgpu_ring *kiq_ring = &kiq->ring; 4957 + unsigned long flags; 4958 + u32 tmp; 4959 + int r; 4960 + 4961 + if (amdgpu_sriov_vf(adev)) 4962 + return -EINVAL; 4963 + 4964 + if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues) 4965 + return -EINVAL; 4966 + 4967 + spin_lock_irqsave(&kiq->ring_lock, flags); 4968 + 4969 + if (amdgpu_ring_alloc(kiq_ring, 5)) { 4970 + spin_unlock_irqrestore(&kiq->ring_lock, flags); 4971 + return -ENOMEM; 4972 + } 4973 + 4974 + tmp = REG_SET_FIELD(0, CP_VMID_RESET, RESET_REQUEST, 1 << vmid); 4975 + gfx_v7_0_ring_emit_wreg(kiq_ring, mmCP_VMID_RESET, tmp); 4976 + amdgpu_ring_commit(kiq_ring); 4977 + 4978 + spin_unlock_irqrestore(&kiq->ring_lock, flags); 4979 + 4980 + r = amdgpu_ring_test_ring(kiq_ring); 4981 + if (r) 4982 + return r; 4983 + 4984 + if (amdgpu_ring_alloc(ring, 7 + 12 + 5)) 4985 + return -ENOMEM; 4986 + gfx_v7_0_ring_emit_fence_gfx(ring, ring->fence_drv.gpu_addr, 4987 + ring->fence_drv.sync_seq, AMDGPU_FENCE_FLAG_EXEC); 4988 + gfx_v7_0_ring_emit_reg_wait(ring, mmCP_VMID_RESET, 0, 0xffff); 4989 + gfx_v7_0_ring_emit_wreg(ring, mmCP_VMID_RESET, 0); 4990 + 4991 + return amdgpu_ring_test_ring(ring); 4992 + } 4993 + 4927 4994 static const struct amd_ip_funcs gfx_v7_0_ip_funcs = { 4928 4995 .name = "gfx_v7_0", 4929 4996 .early_init = gfx_v7_0_early_init, ··· 5045 4972 .emit_wreg = gfx_v7_0_ring_emit_wreg, 5046 4973 .soft_recovery = gfx_v7_0_ring_soft_recovery, 5047 4974 .emit_mem_sync = gfx_v7_0_emit_mem_sync, 4975 + .reset = gfx_v7_0_reset_kgq, 5048 4976 }; 5049 4977 5050 4978 static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {