.. | .. |
---|
23 | 23 | */ |
---|
24 | 24 | |
---|
25 | 25 | #include <linux/firmware.h> |
---|
26 | | -#include <drm/drmP.h> |
---|
| 26 | + |
---|
27 | 27 | #include "amdgpu.h" |
---|
28 | 28 | #include "amdgpu_uvd.h" |
---|
29 | 29 | #include "vid.h" |
---|
.. | .. |
---|
175 | 175 | int r; |
---|
176 | 176 | |
---|
177 | 177 | r = amdgpu_ring_alloc(ring, 16); |
---|
178 | | - if (r) { |
---|
179 | | - DRM_ERROR("amdgpu: uvd enc failed to lock ring %d (%d).\n", |
---|
180 | | - ring->idx, r); |
---|
| 178 | + if (r) |
---|
181 | 179 | return r; |
---|
182 | | - } |
---|
183 | 180 | |
---|
184 | 181 | rptr = amdgpu_ring_get_rptr(ring); |
---|
185 | 182 | |
---|
.. | .. |
---|
189 | 186 | for (i = 0; i < adev->usec_timeout; i++) { |
---|
190 | 187 | if (amdgpu_ring_get_rptr(ring) != rptr) |
---|
191 | 188 | break; |
---|
192 | | - DRM_UDELAY(1); |
---|
| 189 | + udelay(1); |
---|
193 | 190 | } |
---|
194 | 191 | |
---|
195 | | - if (i < adev->usec_timeout) { |
---|
196 | | - DRM_DEBUG("ring test on %d succeeded in %d usecs\n", |
---|
197 | | - ring->idx, i); |
---|
198 | | - } else { |
---|
199 | | - DRM_ERROR("amdgpu: ring %d test failed\n", |
---|
200 | | - ring->idx); |
---|
| 192 | + if (i >= adev->usec_timeout) |
---|
201 | 193 | r = -ETIMEDOUT; |
---|
202 | | - } |
---|
203 | 194 | |
---|
204 | 195 | return r; |
---|
205 | 196 | } |
---|
.. | .. |
---|
215 | 206 | * Open up a stream for HW test |
---|
216 | 207 | */ |
---|
217 | 208 | static int uvd_v6_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
---|
| 209 | + struct amdgpu_bo *bo, |
---|
218 | 210 | struct dma_fence **fence) |
---|
219 | 211 | { |
---|
220 | 212 | const unsigned ib_size_dw = 16; |
---|
221 | 213 | struct amdgpu_job *job; |
---|
222 | 214 | struct amdgpu_ib *ib; |
---|
223 | 215 | struct dma_fence *f = NULL; |
---|
224 | | - uint64_t dummy; |
---|
| 216 | + uint64_t addr; |
---|
225 | 217 | int i, r; |
---|
226 | 218 | |
---|
227 | | - r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); |
---|
| 219 | + r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, |
---|
| 220 | + AMDGPU_IB_POOL_DIRECT, &job); |
---|
228 | 221 | if (r) |
---|
229 | 222 | return r; |
---|
230 | 223 | |
---|
231 | 224 | ib = &job->ibs[0]; |
---|
232 | | - dummy = ib->gpu_addr + 1024; |
---|
| 225 | + addr = amdgpu_bo_gpu_offset(bo); |
---|
233 | 226 | |
---|
234 | 227 | ib->length_dw = 0; |
---|
235 | 228 | ib->ptr[ib->length_dw++] = 0x00000018; |
---|
236 | 229 | ib->ptr[ib->length_dw++] = 0x00000001; /* session info */ |
---|
237 | 230 | ib->ptr[ib->length_dw++] = handle; |
---|
238 | 231 | ib->ptr[ib->length_dw++] = 0x00010000; |
---|
239 | | - ib->ptr[ib->length_dw++] = upper_32_bits(dummy); |
---|
240 | | - ib->ptr[ib->length_dw++] = dummy; |
---|
| 232 | + ib->ptr[ib->length_dw++] = upper_32_bits(addr); |
---|
| 233 | + ib->ptr[ib->length_dw++] = addr; |
---|
241 | 234 | |
---|
242 | 235 | ib->ptr[ib->length_dw++] = 0x00000014; |
---|
243 | 236 | ib->ptr[ib->length_dw++] = 0x00000002; /* task info */ |
---|
.. | .. |
---|
277 | 270 | */ |
---|
278 | 271 | static int uvd_v6_0_enc_get_destroy_msg(struct amdgpu_ring *ring, |
---|
279 | 272 | uint32_t handle, |
---|
280 | | - bool direct, struct dma_fence **fence) |
---|
| 273 | + struct amdgpu_bo *bo, |
---|
| 274 | + struct dma_fence **fence) |
---|
281 | 275 | { |
---|
282 | 276 | const unsigned ib_size_dw = 16; |
---|
283 | 277 | struct amdgpu_job *job; |
---|
284 | 278 | struct amdgpu_ib *ib; |
---|
285 | 279 | struct dma_fence *f = NULL; |
---|
286 | | - uint64_t dummy; |
---|
| 280 | + uint64_t addr; |
---|
287 | 281 | int i, r; |
---|
288 | 282 | |
---|
289 | | - r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); |
---|
| 283 | + r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, |
---|
| 284 | + AMDGPU_IB_POOL_DIRECT, &job); |
---|
290 | 285 | if (r) |
---|
291 | 286 | return r; |
---|
292 | 287 | |
---|
293 | 288 | ib = &job->ibs[0]; |
---|
294 | | - dummy = ib->gpu_addr + 1024; |
---|
| 289 | + addr = amdgpu_bo_gpu_offset(bo); |
---|
295 | 290 | |
---|
296 | 291 | ib->length_dw = 0; |
---|
297 | 292 | ib->ptr[ib->length_dw++] = 0x00000018; |
---|
298 | 293 | ib->ptr[ib->length_dw++] = 0x00000001; /* session info */ |
---|
299 | 294 | ib->ptr[ib->length_dw++] = handle; |
---|
300 | 295 | ib->ptr[ib->length_dw++] = 0x00010000; |
---|
301 | | - ib->ptr[ib->length_dw++] = upper_32_bits(dummy); |
---|
302 | | - ib->ptr[ib->length_dw++] = dummy; |
---|
| 296 | + ib->ptr[ib->length_dw++] = upper_32_bits(addr); |
---|
| 297 | + ib->ptr[ib->length_dw++] = addr; |
---|
303 | 298 | |
---|
304 | 299 | ib->ptr[ib->length_dw++] = 0x00000014; |
---|
305 | 300 | ib->ptr[ib->length_dw++] = 0x00000002; /* task info */ |
---|
.. | .. |
---|
313 | 308 | for (i = ib->length_dw; i < ib_size_dw; ++i) |
---|
314 | 309 | ib->ptr[i] = 0x0; |
---|
315 | 310 | |
---|
316 | | - if (direct) |
---|
317 | | - r = amdgpu_job_submit_direct(job, ring, &f); |
---|
318 | | - else |
---|
319 | | - r = amdgpu_job_submit(job, &ring->adev->vce.entity, |
---|
320 | | - AMDGPU_FENCE_OWNER_UNDEFINED, &f); |
---|
| 311 | + r = amdgpu_job_submit_direct(job, ring, &f); |
---|
321 | 312 | if (r) |
---|
322 | 313 | goto err; |
---|
323 | 314 | |
---|
.. | .. |
---|
340 | 331 | static int uvd_v6_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout) |
---|
341 | 332 | { |
---|
342 | 333 | struct dma_fence *fence = NULL; |
---|
| 334 | + struct amdgpu_bo *bo = NULL; |
---|
343 | 335 | long r; |
---|
344 | 336 | |
---|
345 | | - r = uvd_v6_0_enc_get_create_msg(ring, 1, NULL); |
---|
346 | | - if (r) { |
---|
347 | | - DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r); |
---|
348 | | - goto error; |
---|
349 | | - } |
---|
| 337 | + r = amdgpu_bo_create_reserved(ring->adev, 128 * 1024, PAGE_SIZE, |
---|
| 338 | + AMDGPU_GEM_DOMAIN_VRAM, |
---|
| 339 | + &bo, NULL, NULL); |
---|
| 340 | + if (r) |
---|
| 341 | + return r; |
---|
350 | 342 | |
---|
351 | | - r = uvd_v6_0_enc_get_destroy_msg(ring, 1, true, &fence); |
---|
352 | | - if (r) { |
---|
353 | | - DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r); |
---|
| 343 | + r = uvd_v6_0_enc_get_create_msg(ring, 1, bo, NULL); |
---|
| 344 | + if (r) |
---|
354 | 345 | goto error; |
---|
355 | | - } |
---|
| 346 | + |
---|
| 347 | + r = uvd_v6_0_enc_get_destroy_msg(ring, 1, bo, &fence); |
---|
| 348 | + if (r) |
---|
| 349 | + goto error; |
---|
356 | 350 | |
---|
357 | 351 | r = dma_fence_wait_timeout(fence, false, timeout); |
---|
358 | | - if (r == 0) { |
---|
359 | | - DRM_ERROR("amdgpu: IB test timed out.\n"); |
---|
| 352 | + if (r == 0) |
---|
360 | 353 | r = -ETIMEDOUT; |
---|
361 | | - } else if (r < 0) { |
---|
362 | | - DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r); |
---|
363 | | - } else { |
---|
364 | | - DRM_DEBUG("ib test on ring %d succeeded\n", ring->idx); |
---|
| 354 | + else if (r > 0) |
---|
365 | 355 | r = 0; |
---|
366 | | - } |
---|
| 356 | + |
---|
367 | 357 | error: |
---|
368 | 358 | dma_fence_put(fence); |
---|
| 359 | + amdgpu_bo_unpin(bo); |
---|
| 360 | + amdgpu_bo_unreserve(bo); |
---|
| 361 | + amdgpu_bo_unref(&bo); |
---|
369 | 362 | return r; |
---|
370 | 363 | } |
---|
| 364 | + |
---|
371 | 365 | static int uvd_v6_0_early_init(void *handle) |
---|
372 | 366 | { |
---|
373 | 367 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
.. | .. |
---|
396 | 390 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
397 | 391 | |
---|
398 | 392 | /* UVD TRAP */ |
---|
399 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_UVD_SYSTEM_MESSAGE, &adev->uvd.inst->irq); |
---|
| 393 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, VISLANDS30_IV_SRCID_UVD_SYSTEM_MESSAGE, &adev->uvd.inst->irq); |
---|
400 | 394 | if (r) |
---|
401 | 395 | return r; |
---|
402 | 396 | |
---|
403 | 397 | /* UVD ENC TRAP */ |
---|
404 | 398 | if (uvd_v6_0_enc_support(adev)) { |
---|
405 | 399 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) { |
---|
406 | | - r = amdgpu_irq_add_id(adev, AMDGPU_IH_CLIENTID_LEGACY, i + VISLANDS30_IV_SRCID_UVD_ENC_GEN_PURP, &adev->uvd.inst->irq); |
---|
| 400 | + r = amdgpu_irq_add_id(adev, AMDGPU_IRQ_CLIENTID_LEGACY, i + VISLANDS30_IV_SRCID_UVD_ENC_GEN_PURP, &adev->uvd.inst->irq); |
---|
407 | 401 | if (r) |
---|
408 | 402 | return r; |
---|
409 | 403 | } |
---|
.. | .. |
---|
425 | 419 | |
---|
426 | 420 | ring = &adev->uvd.inst->ring; |
---|
427 | 421 | sprintf(ring->name, "uvd"); |
---|
428 | | - r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0); |
---|
| 422 | + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0, |
---|
| 423 | + AMDGPU_RING_PRIO_DEFAULT); |
---|
429 | 424 | if (r) |
---|
430 | 425 | return r; |
---|
431 | 426 | |
---|
.. | .. |
---|
437 | 432 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) { |
---|
438 | 433 | ring = &adev->uvd.inst->ring_enc[i]; |
---|
439 | 434 | sprintf(ring->name, "uvd_enc%d", i); |
---|
440 | | - r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0); |
---|
| 435 | + r = amdgpu_ring_init(adev, ring, 512, |
---|
| 436 | + &adev->uvd.inst->irq, 0, |
---|
| 437 | + AMDGPU_RING_PRIO_DEFAULT); |
---|
441 | 438 | if (r) |
---|
442 | 439 | return r; |
---|
443 | 440 | } |
---|
.. | .. |
---|
483 | 480 | uvd_v6_0_set_clockgating_state(adev, AMD_CG_STATE_UNGATE); |
---|
484 | 481 | uvd_v6_0_enable_mgcg(adev, true); |
---|
485 | 482 | |
---|
486 | | - ring->ready = true; |
---|
487 | | - r = amdgpu_ring_test_ring(ring); |
---|
488 | | - if (r) { |
---|
489 | | - ring->ready = false; |
---|
| 483 | + r = amdgpu_ring_test_helper(ring); |
---|
| 484 | + if (r) |
---|
490 | 485 | goto done; |
---|
491 | | - } |
---|
492 | 486 | |
---|
493 | 487 | r = amdgpu_ring_alloc(ring, 10); |
---|
494 | 488 | if (r) { |
---|
.. | .. |
---|
520 | 514 | if (uvd_v6_0_enc_support(adev)) { |
---|
521 | 515 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) { |
---|
522 | 516 | ring = &adev->uvd.inst->ring_enc[i]; |
---|
523 | | - ring->ready = true; |
---|
524 | | - r = amdgpu_ring_test_ring(ring); |
---|
525 | | - if (r) { |
---|
526 | | - ring->ready = false; |
---|
| 517 | + r = amdgpu_ring_test_helper(ring); |
---|
| 518 | + if (r) |
---|
527 | 519 | goto done; |
---|
528 | | - } |
---|
529 | 520 | } |
---|
530 | 521 | } |
---|
531 | 522 | |
---|
.. | .. |
---|
550 | 541 | static int uvd_v6_0_hw_fini(void *handle) |
---|
551 | 542 | { |
---|
552 | 543 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
553 | | - struct amdgpu_ring *ring = &adev->uvd.inst->ring; |
---|
554 | 544 | |
---|
555 | 545 | if (RREG32(mmUVD_STATUS) != 0) |
---|
556 | 546 | uvd_v6_0_stop(adev); |
---|
557 | | - |
---|
558 | | - ring->ready = false; |
---|
559 | 547 | |
---|
560 | 548 | return 0; |
---|
561 | 549 | } |
---|
.. | .. |
---|
596 | 584 | uint64_t offset; |
---|
597 | 585 | uint32_t size; |
---|
598 | 586 | |
---|
599 | | - /* programm memory controller bits 0-27 */ |
---|
| 587 | + /* program memory controller bits 0-27 */ |
---|
600 | 588 | WREG32(mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, |
---|
601 | 589 | lower_32_bits(adev->uvd.inst->gpu_addr)); |
---|
602 | 590 | WREG32(mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, |
---|
.. | .. |
---|
838 | 826 | /* set the wb address */ |
---|
839 | 827 | WREG32(mmUVD_RBC_RB_RPTR_ADDR, (upper_32_bits(ring->gpu_addr) >> 2)); |
---|
840 | 828 | |
---|
841 | | - /* programm the RB_BASE for ring buffer */ |
---|
| 829 | + /* program the RB_BASE for ring buffer */ |
---|
842 | 830 | WREG32(mmUVD_LMI_RBC_RB_64BIT_BAR_LOW, |
---|
843 | 831 | lower_32_bits(ring->gpu_addr)); |
---|
844 | 832 | WREG32(mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH, |
---|
.. | .. |
---|
976 | 964 | |
---|
977 | 965 | WREG32(mmUVD_CONTEXT_ID, 0xCAFEDEAD); |
---|
978 | 966 | r = amdgpu_ring_alloc(ring, 3); |
---|
979 | | - if (r) { |
---|
980 | | - DRM_ERROR("amdgpu: cp failed to lock ring %d (%d).\n", |
---|
981 | | - ring->idx, r); |
---|
| 967 | + if (r) |
---|
982 | 968 | return r; |
---|
983 | | - } |
---|
| 969 | + |
---|
984 | 970 | amdgpu_ring_write(ring, PACKET0(mmUVD_CONTEXT_ID, 0)); |
---|
985 | 971 | amdgpu_ring_write(ring, 0xDEADBEEF); |
---|
986 | 972 | amdgpu_ring_commit(ring); |
---|
.. | .. |
---|
988 | 974 | tmp = RREG32(mmUVD_CONTEXT_ID); |
---|
989 | 975 | if (tmp == 0xDEADBEEF) |
---|
990 | 976 | break; |
---|
991 | | - DRM_UDELAY(1); |
---|
| 977 | + udelay(1); |
---|
992 | 978 | } |
---|
993 | 979 | |
---|
994 | | - if (i < adev->usec_timeout) { |
---|
995 | | - DRM_DEBUG("ring test on %d succeeded in %d usecs\n", |
---|
996 | | - ring->idx, i); |
---|
997 | | - } else { |
---|
998 | | - DRM_ERROR("amdgpu: ring %d test failed (0x%08X)\n", |
---|
999 | | - ring->idx, tmp); |
---|
1000 | | - r = -EINVAL; |
---|
1001 | | - } |
---|
| 980 | + if (i >= adev->usec_timeout) |
---|
| 981 | + r = -ETIMEDOUT; |
---|
| 982 | + |
---|
1002 | 983 | return r; |
---|
1003 | 984 | } |
---|
1004 | 985 | |
---|
.. | .. |
---|
1011 | 992 | * Write ring commands to execute the indirect buffer |
---|
1012 | 993 | */ |
---|
1013 | 994 | static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring, |
---|
| 995 | + struct amdgpu_job *job, |
---|
1014 | 996 | struct amdgpu_ib *ib, |
---|
1015 | | - unsigned vmid, bool ctx_switch) |
---|
| 997 | + uint32_t flags) |
---|
1016 | 998 | { |
---|
| 999 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
---|
| 1000 | + |
---|
1017 | 1001 | amdgpu_ring_write(ring, PACKET0(mmUVD_LMI_RBC_IB_VMID, 0)); |
---|
1018 | 1002 | amdgpu_ring_write(ring, vmid); |
---|
1019 | 1003 | |
---|
.. | .. |
---|
1034 | 1018 | * Write enc ring commands to execute the indirect buffer |
---|
1035 | 1019 | */ |
---|
1036 | 1020 | static void uvd_v6_0_enc_ring_emit_ib(struct amdgpu_ring *ring, |
---|
1037 | | - struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) |
---|
| 1021 | + struct amdgpu_job *job, |
---|
| 1022 | + struct amdgpu_ib *ib, |
---|
| 1023 | + uint32_t flags) |
---|
1038 | 1024 | { |
---|
| 1025 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
---|
| 1026 | + |
---|
1039 | 1027 | amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM); |
---|
1040 | 1028 | amdgpu_ring_write(ring, vmid); |
---|
1041 | 1029 | amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); |
---|
.. | .. |
---|
1253 | 1241 | break; |
---|
1254 | 1242 | } |
---|
1255 | 1243 | |
---|
1256 | | - if (false == int_handled) |
---|
1257 | | - DRM_ERROR("Unhandled interrupt: %d %d\n", |
---|
| 1244 | + if (!int_handled) |
---|
| 1245 | + DRM_ERROR("Unhandled interrupt: %d %d\n", |
---|
1258 | 1246 | entry->src_id, entry->src_data[0]); |
---|
1259 | 1247 | |
---|
1260 | 1248 | return 0; |
---|
.. | .. |
---|
1436 | 1424 | enum amd_clockgating_state state) |
---|
1437 | 1425 | { |
---|
1438 | 1426 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
1439 | | - bool enable = (state == AMD_CG_STATE_GATE) ? true : false; |
---|
| 1427 | + bool enable = (state == AMD_CG_STATE_GATE); |
---|
1440 | 1428 | |
---|
1441 | 1429 | if (enable) { |
---|
1442 | 1430 | /* wait for STATUS to clear */ |
---|
.. | .. |
---|
1531 | 1519 | .type = AMDGPU_RING_TYPE_UVD, |
---|
1532 | 1520 | .align_mask = 0xf, |
---|
1533 | 1521 | .support_64bit_ptrs = false, |
---|
| 1522 | + .no_user_fence = true, |
---|
1534 | 1523 | .get_rptr = uvd_v6_0_ring_get_rptr, |
---|
1535 | 1524 | .get_wptr = uvd_v6_0_ring_get_wptr, |
---|
1536 | 1525 | .set_wptr = uvd_v6_0_ring_set_wptr, |
---|
.. | .. |
---|
1556 | 1545 | .type = AMDGPU_RING_TYPE_UVD, |
---|
1557 | 1546 | .align_mask = 0xf, |
---|
1558 | 1547 | .support_64bit_ptrs = false, |
---|
| 1548 | + .no_user_fence = true, |
---|
1559 | 1549 | .get_rptr = uvd_v6_0_ring_get_rptr, |
---|
1560 | 1550 | .get_wptr = uvd_v6_0_ring_get_wptr, |
---|
1561 | 1551 | .set_wptr = uvd_v6_0_ring_set_wptr, |
---|
.. | .. |
---|
1584 | 1574 | .align_mask = 0x3f, |
---|
1585 | 1575 | .nop = HEVC_ENC_CMD_NO_OP, |
---|
1586 | 1576 | .support_64bit_ptrs = false, |
---|
| 1577 | + .no_user_fence = true, |
---|
1587 | 1578 | .get_rptr = uvd_v6_0_enc_ring_get_rptr, |
---|
1588 | 1579 | .get_wptr = uvd_v6_0_enc_ring_get_wptr, |
---|
1589 | 1580 | .set_wptr = uvd_v6_0_enc_ring_set_wptr, |
---|