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

drm/amd/amdgpu: Recovery vcn instance iterate.

The previous logic is recording the amount of valid vcn instances
to use them on SRIOV, it is a hard task due to the vcn accessment is
based on the index of the vcn instance.

Check if the vcn instance enabled before do instance init.

Signed-off-by: Peng Ju Zhou <PengJu.Zhou@amd.com>
Reviewed-by: Monk Liu <monk.liu@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Peng Ju Zhou and committed by
Alex Deucher
564e3dcf 4b296527

+20 -13
+20 -13
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
··· 90 90 int i; 91 91 92 92 if (amdgpu_sriov_vf(adev)) { 93 - for (i = 0; i < VCN_INSTANCES_SIENNA_CICHLID; i++) 94 - if (amdgpu_vcn_is_disabled_vcn(adev, VCN_DECODE_RING, i)) 95 - adev->vcn.num_vcn_inst++; 93 + adev->vcn.num_vcn_inst = VCN_INSTANCES_SIENNA_CICHLID; 96 94 adev->vcn.harvest_config = 0; 97 95 adev->vcn.num_enc_rings = 1; 98 96 ··· 151 153 adev->firmware.fw_size += 152 154 ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE); 153 155 154 - if ((adev->vcn.num_vcn_inst == VCN_INSTANCES_SIENNA_CICHLID) || 155 - (amdgpu_sriov_vf(adev) && adev->asic_type == CHIP_SIENNA_CICHLID)) { 156 + if (adev->vcn.num_vcn_inst == VCN_INSTANCES_SIENNA_CICHLID) { 156 157 adev->firmware.ucode[AMDGPU_UCODE_ID_VCN1].ucode_id = AMDGPU_UCODE_ID_VCN1; 157 158 adev->firmware.ucode[AMDGPU_UCODE_ID_VCN1].fw = adev->vcn.fw; 158 159 adev->firmware.fw_size += ··· 325 328 continue; 326 329 327 330 ring = &adev->vcn.inst[i].ring_dec; 328 - ring->wptr = 0; 329 - ring->wptr_old = 0; 330 - vcn_v3_0_dec_ring_set_wptr(ring); 331 - ring->sched.ready = true; 331 + if (amdgpu_vcn_is_disabled_vcn(adev, VCN_DECODE_RING, i)) { 332 + ring->sched.ready = false; 333 + dev_info(adev->dev, "ring %s is disabled by hypervisor\n", ring->name); 334 + } else { 335 + ring->wptr = 0; 336 + ring->wptr_old = 0; 337 + vcn_v3_0_dec_ring_set_wptr(ring); 338 + ring->sched.ready = true; 339 + } 332 340 333 341 for (j = 0; j < adev->vcn.num_enc_rings; ++j) { 334 342 ring = &adev->vcn.inst[i].ring_enc[j]; 335 - ring->wptr = 0; 336 - ring->wptr_old = 0; 337 - vcn_v3_0_enc_ring_set_wptr(ring); 338 - ring->sched.ready = true; 343 + if (amdgpu_vcn_is_disabled_vcn(adev, VCN_ENCODE_RING, i)) { 344 + ring->sched.ready = false; 345 + dev_info(adev->dev, "ring %s is disabled by hypervisor\n", ring->name); 346 + } else { 347 + ring->wptr = 0; 348 + ring->wptr_old = 0; 349 + vcn_v3_0_enc_ring_set_wptr(ring); 350 + ring->sched.ready = true; 351 + } 339 352 } 340 353 } 341 354 } else {