diff options
author | Thong Thai <thong.thai@amd.com> | 2019-07-25 11:26:56 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2019-07-31 00:48:33 -0400 |
commit | c74dbe44eacf00a5ccc229b5cc340a9b7f6851a0 (patch) | |
tree | 892021a90a5302891c915c84fbce868a327db32a | |
parent | 3207dcf3afd6bffe5e887d483e7071616b97bd8f (diff) |
drm/amd/amdgpu/vcn_v2_0: Move VCN 2.0 specific dec ring test to vcn_v2_0
VCN 2.0 firmware now requires a packet start command to be sent before
any other decode ring buffer command.
Signed-off-by: Thong Thai <thong.thai@amd.com>
Reviewed-by: Leo Liu <leo.liu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c index 80bb49736ee4..eef3ec5449af 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c | |||
@@ -2092,6 +2092,36 @@ static int vcn_v2_0_process_interrupt(struct amdgpu_device *adev, | |||
2092 | return 0; | 2092 | return 0; |
2093 | } | 2093 | } |
2094 | 2094 | ||
2095 | static int vcn_v2_0_dec_ring_test_ring(struct amdgpu_ring *ring) | ||
2096 | { | ||
2097 | struct amdgpu_device *adev = ring->adev; | ||
2098 | uint32_t tmp = 0; | ||
2099 | unsigned i; | ||
2100 | int r; | ||
2101 | |||
2102 | WREG32(adev->vcn.inst[ring->me].external.scratch9, 0xCAFEDEAD); | ||
2103 | r = amdgpu_ring_alloc(ring, 4); | ||
2104 | if (r) | ||
2105 | return r; | ||
2106 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.cmd, 0)); | ||
2107 | amdgpu_ring_write(ring, VCN_DEC_KMD_CMD | (VCN_DEC_CMD_PACKET_START << 1)); | ||
2108 | amdgpu_ring_write(ring, PACKET0(adev->vcn.internal.scratch9, 0)); | ||
2109 | amdgpu_ring_write(ring, 0xDEADBEEF); | ||
2110 | amdgpu_ring_commit(ring); | ||
2111 | for (i = 0; i < adev->usec_timeout; i++) { | ||
2112 | tmp = RREG32(adev->vcn.inst[ring->me].external.scratch9); | ||
2113 | if (tmp == 0xDEADBEEF) | ||
2114 | break; | ||
2115 | DRM_UDELAY(1); | ||
2116 | } | ||
2117 | |||
2118 | if (i >= adev->usec_timeout) | ||
2119 | r = -ETIMEDOUT; | ||
2120 | |||
2121 | return r; | ||
2122 | } | ||
2123 | |||
2124 | |||
2095 | static int vcn_v2_0_set_powergating_state(void *handle, | 2125 | static int vcn_v2_0_set_powergating_state(void *handle, |
2096 | enum amd_powergating_state state) | 2126 | enum amd_powergating_state state) |
2097 | { | 2127 | { |
@@ -2155,7 +2185,7 @@ static const struct amdgpu_ring_funcs vcn_v2_0_dec_ring_vm_funcs = { | |||
2155 | .emit_ib = vcn_v2_0_dec_ring_emit_ib, | 2185 | .emit_ib = vcn_v2_0_dec_ring_emit_ib, |
2156 | .emit_fence = vcn_v2_0_dec_ring_emit_fence, | 2186 | .emit_fence = vcn_v2_0_dec_ring_emit_fence, |
2157 | .emit_vm_flush = vcn_v2_0_dec_ring_emit_vm_flush, | 2187 | .emit_vm_flush = vcn_v2_0_dec_ring_emit_vm_flush, |
2158 | .test_ring = amdgpu_vcn_dec_ring_test_ring, | 2188 | .test_ring = vcn_v2_0_dec_ring_test_ring, |
2159 | .test_ib = amdgpu_vcn_dec_ring_test_ib, | 2189 | .test_ib = amdgpu_vcn_dec_ring_test_ib, |
2160 | .insert_nop = vcn_v2_0_dec_ring_insert_nop, | 2190 | .insert_nop = vcn_v2_0_dec_ring_insert_nop, |
2161 | .insert_start = vcn_v2_0_dec_ring_insert_start, | 2191 | .insert_start = vcn_v2_0_dec_ring_insert_start, |