.. | .. |
---|
22 | 22 | */ |
---|
23 | 23 | |
---|
24 | 24 | #include <linux/firmware.h> |
---|
25 | | -#include <drm/drmP.h> |
---|
| 25 | + |
---|
26 | 26 | #include "amdgpu.h" |
---|
27 | 27 | #include "amdgpu_uvd.h" |
---|
28 | 28 | #include "soc15.h" |
---|
.. | .. |
---|
183 | 183 | return 0; |
---|
184 | 184 | |
---|
185 | 185 | r = amdgpu_ring_alloc(ring, 16); |
---|
186 | | - if (r) { |
---|
187 | | - DRM_ERROR("amdgpu: uvd enc failed to lock (%d)ring %d (%d).\n", |
---|
188 | | - ring->me, ring->idx, r); |
---|
| 186 | + if (r) |
---|
189 | 187 | return r; |
---|
190 | | - } |
---|
191 | 188 | |
---|
192 | 189 | rptr = amdgpu_ring_get_rptr(ring); |
---|
193 | 190 | |
---|
.. | .. |
---|
197 | 194 | for (i = 0; i < adev->usec_timeout; i++) { |
---|
198 | 195 | if (amdgpu_ring_get_rptr(ring) != rptr) |
---|
199 | 196 | break; |
---|
200 | | - DRM_UDELAY(1); |
---|
| 197 | + udelay(1); |
---|
201 | 198 | } |
---|
202 | 199 | |
---|
203 | | - if (i < adev->usec_timeout) { |
---|
204 | | - DRM_DEBUG("(%d)ring test on %d succeeded in %d usecs\n", |
---|
205 | | - ring->me, ring->idx, i); |
---|
206 | | - } else { |
---|
207 | | - DRM_ERROR("amdgpu: (%d)ring %d test failed\n", |
---|
208 | | - ring->me, ring->idx); |
---|
| 200 | + if (i >= adev->usec_timeout) |
---|
209 | 201 | r = -ETIMEDOUT; |
---|
210 | | - } |
---|
211 | 202 | |
---|
212 | 203 | return r; |
---|
213 | 204 | } |
---|
.. | .. |
---|
223 | 214 | * Open up a stream for HW test |
---|
224 | 215 | */ |
---|
225 | 216 | static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle, |
---|
| 217 | + struct amdgpu_bo *bo, |
---|
226 | 218 | struct dma_fence **fence) |
---|
227 | 219 | { |
---|
228 | 220 | const unsigned ib_size_dw = 16; |
---|
229 | 221 | struct amdgpu_job *job; |
---|
230 | 222 | struct amdgpu_ib *ib; |
---|
231 | 223 | struct dma_fence *f = NULL; |
---|
232 | | - uint64_t dummy; |
---|
| 224 | + uint64_t addr; |
---|
233 | 225 | int i, r; |
---|
234 | 226 | |
---|
235 | | - r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); |
---|
| 227 | + r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, |
---|
| 228 | + AMDGPU_IB_POOL_DIRECT, &job); |
---|
236 | 229 | if (r) |
---|
237 | 230 | return r; |
---|
238 | 231 | |
---|
239 | 232 | ib = &job->ibs[0]; |
---|
240 | | - dummy = ib->gpu_addr + 1024; |
---|
| 233 | + addr = amdgpu_bo_gpu_offset(bo); |
---|
241 | 234 | |
---|
242 | 235 | ib->length_dw = 0; |
---|
243 | 236 | ib->ptr[ib->length_dw++] = 0x00000018; |
---|
244 | 237 | ib->ptr[ib->length_dw++] = 0x00000001; /* session info */ |
---|
245 | 238 | ib->ptr[ib->length_dw++] = handle; |
---|
246 | 239 | ib->ptr[ib->length_dw++] = 0x00000000; |
---|
247 | | - ib->ptr[ib->length_dw++] = upper_32_bits(dummy); |
---|
248 | | - ib->ptr[ib->length_dw++] = dummy; |
---|
| 240 | + ib->ptr[ib->length_dw++] = upper_32_bits(addr); |
---|
| 241 | + ib->ptr[ib->length_dw++] = addr; |
---|
249 | 242 | |
---|
250 | 243 | ib->ptr[ib->length_dw++] = 0x00000014; |
---|
251 | 244 | ib->ptr[ib->length_dw++] = 0x00000002; /* task info */ |
---|
.. | .. |
---|
283 | 276 | * |
---|
284 | 277 | * Close up a stream for HW test or if userspace failed to do so |
---|
285 | 278 | */ |
---|
286 | | -int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, |
---|
287 | | - bool direct, struct dma_fence **fence) |
---|
| 279 | +static int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle, |
---|
| 280 | + struct amdgpu_bo *bo, |
---|
| 281 | + struct dma_fence **fence) |
---|
288 | 282 | { |
---|
289 | 283 | const unsigned ib_size_dw = 16; |
---|
290 | 284 | struct amdgpu_job *job; |
---|
291 | 285 | struct amdgpu_ib *ib; |
---|
292 | 286 | struct dma_fence *f = NULL; |
---|
293 | | - uint64_t dummy; |
---|
| 287 | + uint64_t addr; |
---|
294 | 288 | int i, r; |
---|
295 | 289 | |
---|
296 | | - r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); |
---|
| 290 | + r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, |
---|
| 291 | + AMDGPU_IB_POOL_DIRECT, &job); |
---|
297 | 292 | if (r) |
---|
298 | 293 | return r; |
---|
299 | 294 | |
---|
300 | 295 | ib = &job->ibs[0]; |
---|
301 | | - dummy = ib->gpu_addr + 1024; |
---|
| 296 | + addr = amdgpu_bo_gpu_offset(bo); |
---|
302 | 297 | |
---|
303 | 298 | ib->length_dw = 0; |
---|
304 | 299 | ib->ptr[ib->length_dw++] = 0x00000018; |
---|
305 | 300 | ib->ptr[ib->length_dw++] = 0x00000001; |
---|
306 | 301 | ib->ptr[ib->length_dw++] = handle; |
---|
307 | 302 | ib->ptr[ib->length_dw++] = 0x00000000; |
---|
308 | | - ib->ptr[ib->length_dw++] = upper_32_bits(dummy); |
---|
309 | | - ib->ptr[ib->length_dw++] = dummy; |
---|
| 303 | + ib->ptr[ib->length_dw++] = upper_32_bits(addr); |
---|
| 304 | + ib->ptr[ib->length_dw++] = addr; |
---|
310 | 305 | |
---|
311 | 306 | ib->ptr[ib->length_dw++] = 0x00000014; |
---|
312 | 307 | ib->ptr[ib->length_dw++] = 0x00000002; |
---|
.. | .. |
---|
320 | 315 | for (i = ib->length_dw; i < ib_size_dw; ++i) |
---|
321 | 316 | ib->ptr[i] = 0x0; |
---|
322 | 317 | |
---|
323 | | - if (direct) |
---|
324 | | - r = amdgpu_job_submit_direct(job, ring, &f); |
---|
325 | | - else |
---|
326 | | - r = amdgpu_job_submit(job, &ring->adev->vce.entity, |
---|
327 | | - AMDGPU_FENCE_OWNER_UNDEFINED, &f); |
---|
| 318 | + r = amdgpu_job_submit_direct(job, ring, &f); |
---|
328 | 319 | if (r) |
---|
329 | 320 | goto err; |
---|
330 | 321 | |
---|
.. | .. |
---|
347 | 338 | static int uvd_v7_0_enc_ring_test_ib(struct amdgpu_ring *ring, long timeout) |
---|
348 | 339 | { |
---|
349 | 340 | struct dma_fence *fence = NULL; |
---|
| 341 | + struct amdgpu_bo *bo = NULL; |
---|
350 | 342 | long r; |
---|
351 | 343 | |
---|
352 | | - r = uvd_v7_0_enc_get_create_msg(ring, 1, NULL); |
---|
353 | | - if (r) { |
---|
354 | | - DRM_ERROR("amdgpu: (%d)failed to get create msg (%ld).\n", ring->me, r); |
---|
355 | | - goto error; |
---|
356 | | - } |
---|
| 344 | + r = amdgpu_bo_create_reserved(ring->adev, 128 * 1024, PAGE_SIZE, |
---|
| 345 | + AMDGPU_GEM_DOMAIN_VRAM, |
---|
| 346 | + &bo, NULL, NULL); |
---|
| 347 | + if (r) |
---|
| 348 | + return r; |
---|
357 | 349 | |
---|
358 | | - r = uvd_v7_0_enc_get_destroy_msg(ring, 1, true, &fence); |
---|
359 | | - if (r) { |
---|
360 | | - DRM_ERROR("amdgpu: (%d)failed to get destroy ib (%ld).\n", ring->me, r); |
---|
| 350 | + r = uvd_v7_0_enc_get_create_msg(ring, 1, bo, NULL); |
---|
| 351 | + if (r) |
---|
361 | 352 | goto error; |
---|
362 | | - } |
---|
| 353 | + |
---|
| 354 | + r = uvd_v7_0_enc_get_destroy_msg(ring, 1, bo, &fence); |
---|
| 355 | + if (r) |
---|
| 356 | + goto error; |
---|
363 | 357 | |
---|
364 | 358 | r = dma_fence_wait_timeout(fence, false, timeout); |
---|
365 | | - if (r == 0) { |
---|
366 | | - DRM_ERROR("amdgpu: (%d)IB test timed out.\n", ring->me); |
---|
| 359 | + if (r == 0) |
---|
367 | 360 | r = -ETIMEDOUT; |
---|
368 | | - } else if (r < 0) { |
---|
369 | | - DRM_ERROR("amdgpu: (%d)fence wait failed (%ld).\n", ring->me, r); |
---|
370 | | - } else { |
---|
371 | | - DRM_DEBUG("ib test on (%d)ring %d succeeded\n", ring->me, ring->idx); |
---|
| 361 | + else if (r > 0) |
---|
372 | 362 | r = 0; |
---|
373 | | - } |
---|
| 363 | + |
---|
374 | 364 | error: |
---|
375 | 365 | dma_fence_put(fence); |
---|
| 366 | + amdgpu_bo_unreserve(bo); |
---|
| 367 | + amdgpu_bo_unref(&bo); |
---|
376 | 368 | return r; |
---|
377 | 369 | } |
---|
378 | 370 | |
---|
.. | .. |
---|
444 | 436 | adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].fw = adev->uvd.fw; |
---|
445 | 437 | adev->firmware.fw_size += |
---|
446 | 438 | ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE); |
---|
| 439 | + |
---|
| 440 | + if (adev->uvd.num_uvd_inst == UVD7_MAX_HW_INSTANCES_VEGA20) { |
---|
| 441 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD1].ucode_id = AMDGPU_UCODE_ID_UVD1; |
---|
| 442 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD1].fw = adev->uvd.fw; |
---|
| 443 | + adev->firmware.fw_size += |
---|
| 444 | + ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE); |
---|
| 445 | + } |
---|
447 | 446 | DRM_INFO("PSP loading UVD firmware\n"); |
---|
448 | 447 | } |
---|
449 | 448 | |
---|
.. | .. |
---|
452 | 451 | continue; |
---|
453 | 452 | if (!amdgpu_sriov_vf(adev)) { |
---|
454 | 453 | ring = &adev->uvd.inst[j].ring; |
---|
455 | | - sprintf(ring->name, "uvd<%d>", j); |
---|
456 | | - r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0); |
---|
| 454 | + sprintf(ring->name, "uvd_%d", ring->me); |
---|
| 455 | + r = amdgpu_ring_init(adev, ring, 512, |
---|
| 456 | + &adev->uvd.inst[j].irq, 0, |
---|
| 457 | + AMDGPU_RING_PRIO_DEFAULT); |
---|
457 | 458 | if (r) |
---|
458 | 459 | return r; |
---|
459 | 460 | } |
---|
460 | 461 | |
---|
461 | 462 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) { |
---|
462 | 463 | ring = &adev->uvd.inst[j].ring_enc[i]; |
---|
463 | | - sprintf(ring->name, "uvd_enc%d<%d>", i, j); |
---|
| 464 | + sprintf(ring->name, "uvd_enc_%d.%d", ring->me, i); |
---|
464 | 465 | if (amdgpu_sriov_vf(adev)) { |
---|
465 | 466 | ring->use_doorbell = true; |
---|
466 | 467 | |
---|
.. | .. |
---|
468 | 469 | * sriov, so set unused location for other unused rings. |
---|
469 | 470 | */ |
---|
470 | 471 | if (i == 0) |
---|
471 | | - ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING0_1 * 2; |
---|
| 472 | + ring->doorbell_index = adev->doorbell_index.uvd_vce.uvd_ring0_1 * 2; |
---|
472 | 473 | else |
---|
473 | | - ring->doorbell_index = AMDGPU_DOORBELL64_UVD_RING2_3 * 2 + 1; |
---|
| 474 | + ring->doorbell_index = adev->doorbell_index.uvd_vce.uvd_ring2_3 * 2 + 1; |
---|
474 | 475 | } |
---|
475 | | - r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0); |
---|
| 476 | + r = amdgpu_ring_init(adev, ring, 512, |
---|
| 477 | + &adev->uvd.inst[j].irq, 0, |
---|
| 478 | + AMDGPU_RING_PRIO_DEFAULT); |
---|
476 | 479 | if (r) |
---|
477 | 480 | return r; |
---|
478 | 481 | } |
---|
.. | .. |
---|
540 | 543 | ring = &adev->uvd.inst[j].ring; |
---|
541 | 544 | |
---|
542 | 545 | if (!amdgpu_sriov_vf(adev)) { |
---|
543 | | - ring->ready = true; |
---|
544 | | - r = amdgpu_ring_test_ring(ring); |
---|
545 | | - if (r) { |
---|
546 | | - ring->ready = false; |
---|
| 546 | + r = amdgpu_ring_test_helper(ring); |
---|
| 547 | + if (r) |
---|
547 | 548 | goto done; |
---|
548 | | - } |
---|
549 | 549 | |
---|
550 | 550 | r = amdgpu_ring_alloc(ring, 10); |
---|
551 | 551 | if (r) { |
---|
.. | .. |
---|
582 | 582 | |
---|
583 | 583 | for (i = 0; i < adev->uvd.num_enc_rings; ++i) { |
---|
584 | 584 | ring = &adev->uvd.inst[j].ring_enc[i]; |
---|
585 | | - ring->ready = true; |
---|
586 | | - r = amdgpu_ring_test_ring(ring); |
---|
587 | | - if (r) { |
---|
588 | | - ring->ready = false; |
---|
| 585 | + r = amdgpu_ring_test_helper(ring); |
---|
| 586 | + if (r) |
---|
589 | 587 | goto done; |
---|
590 | | - } |
---|
591 | 588 | } |
---|
592 | 589 | } |
---|
593 | 590 | done: |
---|
.. | .. |
---|
607 | 604 | static int uvd_v7_0_hw_fini(void *handle) |
---|
608 | 605 | { |
---|
609 | 606 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
610 | | - int i; |
---|
611 | 607 | |
---|
612 | 608 | if (!amdgpu_sriov_vf(adev)) |
---|
613 | 609 | uvd_v7_0_stop(adev); |
---|
614 | 610 | else { |
---|
615 | 611 | /* full access mode, so don't touch any UVD register */ |
---|
616 | 612 | DRM_DEBUG("For SRIOV client, shouldn't do anything.\n"); |
---|
617 | | - } |
---|
618 | | - |
---|
619 | | - for (i = 0; i < adev->uvd.num_uvd_inst; ++i) { |
---|
620 | | - if (adev->uvd.harvest_config & (1 << i)) |
---|
621 | | - continue; |
---|
622 | | - adev->uvd.inst[i].ring.ready = false; |
---|
623 | 613 | } |
---|
624 | 614 | |
---|
625 | 615 | return 0; |
---|
.. | .. |
---|
667 | 657 | continue; |
---|
668 | 658 | if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { |
---|
669 | 659 | WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, |
---|
670 | | - lower_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr)); |
---|
| 660 | + i == 0 ? |
---|
| 661 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].tmr_mc_addr_lo: |
---|
| 662 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD1].tmr_mc_addr_lo); |
---|
671 | 663 | WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, |
---|
672 | | - upper_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr)); |
---|
| 664 | + i == 0 ? |
---|
| 665 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].tmr_mc_addr_hi: |
---|
| 666 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD1].tmr_mc_addr_hi); |
---|
| 667 | + WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0, 0); |
---|
673 | 668 | offset = 0; |
---|
674 | 669 | } else { |
---|
675 | 670 | WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, |
---|
.. | .. |
---|
677 | 672 | WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, |
---|
678 | 673 | upper_32_bits(adev->uvd.inst[i].gpu_addr)); |
---|
679 | 674 | offset = size; |
---|
| 675 | + WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0, |
---|
| 676 | + AMDGPU_UVD_FIRMWARE_OFFSET >> 3); |
---|
680 | 677 | } |
---|
681 | 678 | |
---|
682 | | - WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0, |
---|
683 | | - AMDGPU_UVD_FIRMWARE_OFFSET >> 3); |
---|
684 | 679 | WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE0, size); |
---|
685 | 680 | |
---|
686 | 681 | WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, |
---|
.. | .. |
---|
805 | 800 | 0xFFFFFFFF, 0x00000004); |
---|
806 | 801 | /* mc resume*/ |
---|
807 | 802 | if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { |
---|
808 | | - MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), |
---|
809 | | - lower_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr)); |
---|
810 | | - MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), |
---|
811 | | - upper_32_bits(adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].mc_addr)); |
---|
| 803 | + MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, |
---|
| 804 | + mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), |
---|
| 805 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].tmr_mc_addr_lo); |
---|
| 806 | + MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, |
---|
| 807 | + mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), |
---|
| 808 | + adev->firmware.ucode[AMDGPU_UCODE_ID_UVD].tmr_mc_addr_hi); |
---|
| 809 | + MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), 0); |
---|
812 | 810 | offset = 0; |
---|
813 | 811 | } else { |
---|
814 | 812 | MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), |
---|
.. | .. |
---|
816 | 814 | MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), |
---|
817 | 815 | upper_32_bits(adev->uvd.inst[i].gpu_addr)); |
---|
818 | 816 | offset = size; |
---|
| 817 | + MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), |
---|
| 818 | + AMDGPU_UVD_FIRMWARE_OFFSET >> 3); |
---|
| 819 | + |
---|
819 | 820 | } |
---|
820 | 821 | |
---|
821 | | - MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET0), |
---|
822 | | - AMDGPU_UVD_FIRMWARE_OFFSET >> 3); |
---|
823 | 822 | MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE0), size); |
---|
824 | 823 | |
---|
825 | 824 | MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), |
---|
.. | .. |
---|
1074 | 1073 | WREG32_SOC15(UVD, k, mmUVD_RBC_RB_RPTR_ADDR, |
---|
1075 | 1074 | (upper_32_bits(ring->gpu_addr) >> 2)); |
---|
1076 | 1075 | |
---|
1077 | | - /* programm the RB_BASE for ring buffer */ |
---|
| 1076 | + /* program the RB_BASE for ring buffer */ |
---|
1078 | 1077 | WREG32_SOC15(UVD, k, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW, |
---|
1079 | 1078 | lower_32_bits(ring->gpu_addr)); |
---|
1080 | 1079 | WREG32_SOC15(UVD, k, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH, |
---|
.. | .. |
---|
1230 | 1229 | |
---|
1231 | 1230 | WREG32_SOC15(UVD, ring->me, mmUVD_CONTEXT_ID, 0xCAFEDEAD); |
---|
1232 | 1231 | r = amdgpu_ring_alloc(ring, 3); |
---|
1233 | | - if (r) { |
---|
1234 | | - DRM_ERROR("amdgpu: (%d)cp failed to lock ring %d (%d).\n", |
---|
1235 | | - ring->me, ring->idx, r); |
---|
| 1232 | + if (r) |
---|
1236 | 1233 | return r; |
---|
1237 | | - } |
---|
| 1234 | + |
---|
1238 | 1235 | amdgpu_ring_write(ring, |
---|
1239 | 1236 | PACKET0(SOC15_REG_OFFSET(UVD, ring->me, mmUVD_CONTEXT_ID), 0)); |
---|
1240 | 1237 | amdgpu_ring_write(ring, 0xDEADBEEF); |
---|
.. | .. |
---|
1243 | 1240 | tmp = RREG32_SOC15(UVD, ring->me, mmUVD_CONTEXT_ID); |
---|
1244 | 1241 | if (tmp == 0xDEADBEEF) |
---|
1245 | 1242 | break; |
---|
1246 | | - DRM_UDELAY(1); |
---|
| 1243 | + udelay(1); |
---|
1247 | 1244 | } |
---|
1248 | 1245 | |
---|
1249 | | - if (i < adev->usec_timeout) { |
---|
1250 | | - DRM_DEBUG("(%d)ring test on %d succeeded in %d usecs\n", |
---|
1251 | | - ring->me, ring->idx, i); |
---|
1252 | | - } else { |
---|
1253 | | - DRM_ERROR("(%d)amdgpu: ring %d test failed (0x%08X)\n", |
---|
1254 | | - ring->me, ring->idx, tmp); |
---|
1255 | | - r = -EINVAL; |
---|
1256 | | - } |
---|
| 1246 | + if (i >= adev->usec_timeout) |
---|
| 1247 | + r = -ETIMEDOUT; |
---|
| 1248 | + |
---|
1257 | 1249 | return r; |
---|
1258 | 1250 | } |
---|
1259 | 1251 | |
---|
.. | .. |
---|
1267 | 1259 | static int uvd_v7_0_ring_patch_cs_in_place(struct amdgpu_cs_parser *p, |
---|
1268 | 1260 | uint32_t ib_idx) |
---|
1269 | 1261 | { |
---|
| 1262 | + struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched); |
---|
1270 | 1263 | struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; |
---|
1271 | 1264 | unsigned i; |
---|
1272 | 1265 | |
---|
1273 | 1266 | /* No patching necessary for the first instance */ |
---|
1274 | | - if (!p->ring->me) |
---|
| 1267 | + if (!ring->me) |
---|
1275 | 1268 | return 0; |
---|
1276 | 1269 | |
---|
1277 | 1270 | for (i = 0; i < ib->length_dw; i += 2) { |
---|
.. | .. |
---|
1294 | 1287 | * Write ring commands to execute the indirect buffer |
---|
1295 | 1288 | */ |
---|
1296 | 1289 | static void uvd_v7_0_ring_emit_ib(struct amdgpu_ring *ring, |
---|
| 1290 | + struct amdgpu_job *job, |
---|
1297 | 1291 | struct amdgpu_ib *ib, |
---|
1298 | | - unsigned vmid, bool ctx_switch) |
---|
| 1292 | + uint32_t flags) |
---|
1299 | 1293 | { |
---|
1300 | 1294 | struct amdgpu_device *adev = ring->adev; |
---|
| 1295 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
---|
1301 | 1296 | |
---|
1302 | 1297 | amdgpu_ring_write(ring, |
---|
1303 | 1298 | PACKET0(SOC15_REG_OFFSET(UVD, ring->me, mmUVD_LMI_RBC_IB_VMID), 0)); |
---|
.. | .. |
---|
1323 | 1318 | * Write enc ring commands to execute the indirect buffer |
---|
1324 | 1319 | */ |
---|
1325 | 1320 | static void uvd_v7_0_enc_ring_emit_ib(struct amdgpu_ring *ring, |
---|
1326 | | - struct amdgpu_ib *ib, unsigned int vmid, bool ctx_switch) |
---|
| 1321 | + struct amdgpu_job *job, |
---|
| 1322 | + struct amdgpu_ib *ib, |
---|
| 1323 | + uint32_t flags) |
---|
1327 | 1324 | { |
---|
| 1325 | + unsigned vmid = AMDGPU_JOB_GET_VMID(job); |
---|
| 1326 | + |
---|
1328 | 1327 | amdgpu_ring_write(ring, HEVC_ENC_CMD_IB_VM); |
---|
1329 | 1328 | amdgpu_ring_write(ring, vmid); |
---|
1330 | 1329 | amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr)); |
---|
.. | .. |
---|
1376 | 1375 | pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); |
---|
1377 | 1376 | |
---|
1378 | 1377 | /* wait for reg writes */ |
---|
1379 | | - data0 = hub->ctx0_ptb_addr_lo32 + vmid * 2; |
---|
| 1378 | + data0 = hub->ctx0_ptb_addr_lo32 + vmid * hub->ctx_addr_distance; |
---|
1380 | 1379 | data1 = lower_32_bits(pd_addr); |
---|
1381 | 1380 | mask = 0xffffffff; |
---|
1382 | 1381 | uvd_v7_0_ring_emit_reg_wait(ring, data0, data1, mask); |
---|
.. | .. |
---|
1418 | 1417 | pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr); |
---|
1419 | 1418 | |
---|
1420 | 1419 | /* wait for reg writes */ |
---|
1421 | | - uvd_v7_0_enc_ring_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 + vmid * 2, |
---|
| 1420 | + uvd_v7_0_enc_ring_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 + |
---|
| 1421 | + vmid * hub->ctx_addr_distance, |
---|
1422 | 1422 | lower_32_bits(pd_addr), 0xffffffff); |
---|
1423 | 1423 | } |
---|
1424 | 1424 | |
---|
.. | .. |
---|
1694 | 1694 | enum amd_clockgating_state state) |
---|
1695 | 1695 | { |
---|
1696 | 1696 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; |
---|
1697 | | - bool enable = (state == AMD_CG_STATE_GATE) ? true : false; |
---|
| 1697 | + bool enable = (state == AMD_CG_STATE_GATE); |
---|
1698 | 1698 | |
---|
1699 | 1699 | uvd_v7_0_set_bypass_mode(adev, enable); |
---|
1700 | 1700 | |
---|
.. | .. |
---|
1773 | 1773 | .type = AMDGPU_RING_TYPE_UVD, |
---|
1774 | 1774 | .align_mask = 0xf, |
---|
1775 | 1775 | .support_64bit_ptrs = false, |
---|
1776 | | - .vmhub = AMDGPU_MMHUB, |
---|
| 1776 | + .no_user_fence = true, |
---|
| 1777 | + .vmhub = AMDGPU_MMHUB_0, |
---|
1777 | 1778 | .get_rptr = uvd_v7_0_ring_get_rptr, |
---|
1778 | 1779 | .get_wptr = uvd_v7_0_ring_get_wptr, |
---|
1779 | 1780 | .set_wptr = uvd_v7_0_ring_set_wptr, |
---|
.. | .. |
---|
1805 | 1806 | .align_mask = 0x3f, |
---|
1806 | 1807 | .nop = HEVC_ENC_CMD_NO_OP, |
---|
1807 | 1808 | .support_64bit_ptrs = false, |
---|
1808 | | - .vmhub = AMDGPU_MMHUB, |
---|
| 1809 | + .no_user_fence = true, |
---|
| 1810 | + .vmhub = AMDGPU_MMHUB_0, |
---|
1809 | 1811 | .get_rptr = uvd_v7_0_enc_ring_get_rptr, |
---|
1810 | 1812 | .get_wptr = uvd_v7_0_enc_ring_get_wptr, |
---|
1811 | 1813 | .set_wptr = uvd_v7_0_enc_ring_set_wptr, |
---|