Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu/uvd7: add UVD hw init sequences for sriov

Add UVD hw init.

Signed-off-by: Frank Min <Frank.Min@amd.com>
Signed-off-by: Xiangliang Yu <Xiangliang.Yu@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Frank Min and committed by
Alex Deucher
6fa336a7 beb2ced5

+62 -51
+62 -51
drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c
··· 368 368 { 369 369 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 370 370 371 - adev->uvd.num_enc_rings = 2; 371 + if (amdgpu_sriov_vf(adev)) 372 + adev->uvd.num_enc_rings = 1; 373 + else 374 + adev->uvd.num_enc_rings = 2; 372 375 uvd_v7_0_set_ring_funcs(adev); 373 376 uvd_v7_0_set_enc_ring_funcs(adev); 374 377 uvd_v7_0_set_irq_funcs(adev); ··· 424 421 r = amdgpu_uvd_resume(adev); 425 422 if (r) 426 423 return r; 424 + if (!amdgpu_sriov_vf(adev)) { 425 + ring = &adev->uvd.ring; 426 + sprintf(ring->name, "uvd"); 427 + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); 428 + if (r) 429 + return r; 430 + } 427 431 428 - ring = &adev->uvd.ring; 429 - sprintf(ring->name, "uvd"); 430 - r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); 431 - if (r) 432 - return r; 433 432 434 433 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 435 434 ring = &adev->uvd.ring_enc[i]; ··· 445 440 return r; 446 441 } 447 442 443 + r = amdgpu_virt_alloc_mm_table(adev); 444 + if (r) 445 + return r; 446 + 448 447 return r; 449 448 } 450 449 ··· 456 447 { 457 448 int i, r; 458 449 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 450 + 451 + amdgpu_virt_free_mm_table(adev); 459 452 460 453 r = amdgpu_uvd_suspend(adev); 461 454 if (r) ··· 485 474 uint32_t tmp; 486 475 int i, r; 487 476 488 - r = uvd_v7_0_start(adev); 477 + if (amdgpu_sriov_vf(adev)) 478 + r = uvd_v7_0_sriov_start(adev); 479 + else 480 + r = uvd_v7_0_start(adev); 489 481 if (r) 490 482 goto done; 491 483 492 - ring->ready = true; 493 - r = amdgpu_ring_test_ring(ring); 494 - if (r) { 495 - ring->ready = false; 496 - goto done; 484 + if (!amdgpu_sriov_vf(adev)) { 485 + ring->ready = true; 486 + r = amdgpu_ring_test_ring(ring); 487 + if (r) { 488 + ring->ready = false; 489 + goto done; 490 + } 491 + 492 + r = amdgpu_ring_alloc(ring, 10); 493 + if (r) { 494 + DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n", r); 495 + goto done; 496 + } 497 + 498 + tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 499 + mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0); 500 + amdgpu_ring_write(ring, tmp); 501 + amdgpu_ring_write(ring, 0xFFFFF); 502 + 503 + tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 504 + mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0); 505 + amdgpu_ring_write(ring, tmp); 506 + amdgpu_ring_write(ring, 0xFFFFF); 507 + 508 + tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 509 + mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0); 510 + amdgpu_ring_write(ring, tmp); 511 + amdgpu_ring_write(ring, 0xFFFFF); 512 + 513 + /* Clear timeout status bits */ 514 + amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, 515 + mmUVD_SEMA_TIMEOUT_STATUS), 0)); 516 + amdgpu_ring_write(ring, 0x8); 517 + 518 + amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, 519 + mmUVD_SEMA_CNTL), 0)); 520 + amdgpu_ring_write(ring, 3); 521 + 522 + amdgpu_ring_commit(ring); 497 523 } 498 - 499 - r = amdgpu_ring_alloc(ring, 10); 500 - if (r) { 501 - DRM_ERROR("amdgpu: ring failed to lock UVD ring (%d).\n", r); 502 - goto done; 503 - } 504 - 505 - tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 506 - mmUVD_SEMA_WAIT_FAULT_TIMEOUT_CNTL), 0); 507 - amdgpu_ring_write(ring, tmp); 508 - amdgpu_ring_write(ring, 0xFFFFF); 509 - 510 - tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 511 - mmUVD_SEMA_WAIT_INCOMPLETE_TIMEOUT_CNTL), 0); 512 - amdgpu_ring_write(ring, tmp); 513 - amdgpu_ring_write(ring, 0xFFFFF); 514 - 515 - tmp = PACKET0(SOC15_REG_OFFSET(UVD, 0, 516 - mmUVD_SEMA_SIGNAL_INCOMPLETE_TIMEOUT_CNTL), 0); 517 - amdgpu_ring_write(ring, tmp); 518 - amdgpu_ring_write(ring, 0xFFFFF); 519 - 520 - /* Clear timeout status bits */ 521 - amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, 522 - mmUVD_SEMA_TIMEOUT_STATUS), 0)); 523 - amdgpu_ring_write(ring, 0x8); 524 - 525 - amdgpu_ring_write(ring, PACKET0(SOC15_REG_OFFSET(UVD, 0, 526 - mmUVD_SEMA_CNTL), 0)); 527 - amdgpu_ring_write(ring, 3); 528 - 529 - amdgpu_ring_commit(ring); 530 524 531 525 for (i = 0; i < adev->uvd.num_enc_rings; ++i) { 532 526 ring = &adev->uvd.ring_enc[i]; ··· 708 692 struct mmsch_v1_0_cmd_direct_write direct_wt = { {0} }; 709 693 struct mmsch_v1_0_cmd_direct_read_modify_write direct_rd_mod_wt = { {0} }; 710 694 struct mmsch_v1_0_cmd_direct_polling direct_poll = { {0} }; 711 - //struct mmsch_v1_0_cmd_indirect_write indirect_wt = {{0}}; 712 695 struct mmsch_v1_0_cmd_end end = { {0} }; 713 696 uint32_t *init_table = adev->virt.mm_table.cpu_addr; 714 697 struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)init_table; ··· 877 862 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_LO), ring->gpu_addr); 878 863 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_HI), upper_32_bits(ring->gpu_addr)); 879 864 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_SIZE), ring->ring_size / 4); 880 - 881 - ring = &adev->uvd.ring_enc[1]; 882 - MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_LO2), ring->gpu_addr); 883 - MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_BASE_HI2), upper_32_bits(ring->gpu_addr)); 884 - MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(UVD, 0, mmUVD_RB_SIZE2), ring->ring_size / 4); 885 865 886 866 /* add end packet */ 887 867 memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end)); ··· 1499 1489 amdgpu_fence_process(&adev->uvd.ring_enc[0]); 1500 1490 break; 1501 1491 case 120: 1502 - amdgpu_fence_process(&adev->uvd.ring_enc[1]); 1492 + if (!amdgpu_sriov_vf(adev)) 1493 + amdgpu_fence_process(&adev->uvd.ring_enc[1]); 1503 1494 break; 1504 1495 default: 1505 1496 DRM_ERROR("Unhandled interrupt: %d %d\n",