diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vce_v2_0.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vce_v2_0.c | 57 |
1 files changed, 25 insertions, 32 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c index 5fa55b52c00e..3fcc33f9ae70 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c | |||
@@ -193,6 +193,8 @@ static int vce_v2_0_early_init(void *handle) | |||
193 | { | 193 | { |
194 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 194 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
195 | 195 | ||
196 | adev->vce.num_rings = 2; | ||
197 | |||
196 | vce_v2_0_set_ring_funcs(adev); | 198 | vce_v2_0_set_ring_funcs(adev); |
197 | vce_v2_0_set_irq_funcs(adev); | 199 | vce_v2_0_set_irq_funcs(adev); |
198 | 200 | ||
@@ -202,7 +204,7 @@ static int vce_v2_0_early_init(void *handle) | |||
202 | static int vce_v2_0_sw_init(void *handle) | 204 | static int vce_v2_0_sw_init(void *handle) |
203 | { | 205 | { |
204 | struct amdgpu_ring *ring; | 206 | struct amdgpu_ring *ring; |
205 | int r; | 207 | int r, i; |
206 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 208 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
207 | 209 | ||
208 | /* VCE */ | 210 | /* VCE */ |
@@ -219,19 +221,14 @@ static int vce_v2_0_sw_init(void *handle) | |||
219 | if (r) | 221 | if (r) |
220 | return r; | 222 | return r; |
221 | 223 | ||
222 | ring = &adev->vce.ring[0]; | 224 | for (i = 0; i < adev->vce.num_rings; i++) { |
223 | sprintf(ring->name, "vce0"); | 225 | ring = &adev->vce.ring[i]; |
224 | r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, | 226 | sprintf(ring->name, "vce%d", i); |
225 | &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); | 227 | r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, |
226 | if (r) | 228 | &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); |
227 | return r; | 229 | if (r) |
228 | 230 | return r; | |
229 | ring = &adev->vce.ring[1]; | 231 | } |
230 | sprintf(ring->name, "vce1"); | ||
231 | r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, | ||
232 | &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); | ||
233 | if (r) | ||
234 | return r; | ||
235 | 232 | ||
236 | return r; | 233 | return r; |
237 | } | 234 | } |
@@ -254,29 +251,23 @@ static int vce_v2_0_sw_fini(void *handle) | |||
254 | 251 | ||
255 | static int vce_v2_0_hw_init(void *handle) | 252 | static int vce_v2_0_hw_init(void *handle) |
256 | { | 253 | { |
257 | struct amdgpu_ring *ring; | 254 | int r, i; |
258 | int r; | ||
259 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | 255 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
260 | 256 | ||
261 | r = vce_v2_0_start(adev); | 257 | r = vce_v2_0_start(adev); |
258 | /* this error mean vcpu not in running state, so just skip ring test, not stop driver initialize */ | ||
262 | if (r) | 259 | if (r) |
263 | /* this error mean vcpu not in running state, so just skip ring test, not stop driver initialize */ | ||
264 | return 0; | 260 | return 0; |
265 | 261 | ||
266 | ring = &adev->vce.ring[0]; | 262 | for (i = 0; i < adev->vce.num_rings; i++) |
267 | ring->ready = true; | 263 | adev->vce.ring[i].ready = false; |
268 | r = amdgpu_ring_test_ring(ring); | ||
269 | if (r) { | ||
270 | ring->ready = false; | ||
271 | return r; | ||
272 | } | ||
273 | 264 | ||
274 | ring = &adev->vce.ring[1]; | 265 | for (i = 0; i < adev->vce.num_rings; i++) { |
275 | ring->ready = true; | 266 | r = amdgpu_ring_test_ring(&adev->vce.ring[i]); |
276 | r = amdgpu_ring_test_ring(ring); | 267 | if (r) |
277 | if (r) { | 268 | return r; |
278 | ring->ready = false; | 269 | else |
279 | return r; | 270 | adev->vce.ring[i].ready = true; |
280 | } | 271 | } |
281 | 272 | ||
282 | DRM_INFO("VCE initialized successfully.\n"); | 273 | DRM_INFO("VCE initialized successfully.\n"); |
@@ -618,8 +609,10 @@ static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = { | |||
618 | 609 | ||
619 | static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev) | 610 | static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev) |
620 | { | 611 | { |
621 | adev->vce.ring[0].funcs = &vce_v2_0_ring_funcs; | 612 | int i; |
622 | adev->vce.ring[1].funcs = &vce_v2_0_ring_funcs; | 613 | |
614 | for (i = 0; i < adev->vce.num_rings; i++) | ||
615 | adev->vce.ring[i].funcs = &vce_v2_0_ring_funcs; | ||
623 | } | 616 | } |
624 | 617 | ||
625 | static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = { | 618 | static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = { |