| .. | .. |
|---|
| 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, |
|---|