aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/vce_v2_0.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vce_v2_0.c57
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)
202static int vce_v2_0_sw_init(void *handle) 204static 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
255static int vce_v2_0_hw_init(void *handle) 252static 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
619static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev) 610static 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
625static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = { 618static const struct amdgpu_irq_src_funcs vce_v2_0_irq_funcs = {