mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00:00
drm/amd/amdgpu: Fix incorrect logic to increment VCN doorbell index
- The original logic uses a counter based index assignment, which is incorrect if we only assign VCN1 to this VF but no VCN0 The doorbell index is absolute, so we can calculate it by using index variable i and j Signed-off-by: Bokun Zhang <Bokun.Zhang@amd.com> Reviewed-by: Monk Liu <monk.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
880af2eaed
commit
25a35065c0
1 changed files with 9 additions and 6 deletions
|
@ -155,6 +155,13 @@ static int vcn_v3_0_sw_init(void *handle)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
/*
|
||||
* Note: doorbell assignment is fixed for SRIOV multiple VCN engines
|
||||
* Formula:
|
||||
* vcn_db_base = adev->doorbell_index.vcn.vcn_ring0_1 << 1;
|
||||
* dec_ring_i = vcn_db_base + i * (adev->vcn.num_enc_rings + 1)
|
||||
* enc_ring_i,j = vcn_db_base + i * (adev->vcn.num_enc_rings + 1) + 1 + j
|
||||
*/
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
vcn_doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1;
|
||||
/* get DWORD offset */
|
||||
|
@ -192,9 +199,7 @@ static int vcn_v3_0_sw_init(void *handle)
|
|||
ring = &adev->vcn.inst[i].ring_dec;
|
||||
ring->use_doorbell = true;
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
ring->doorbell_index = vcn_doorbell_index;
|
||||
/* NOTE: increment so next VCN engine use next DOORBELL DWORD */
|
||||
vcn_doorbell_index++;
|
||||
ring->doorbell_index = vcn_doorbell_index + i * (adev->vcn.num_enc_rings + 1);
|
||||
} else {
|
||||
ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 8 * i;
|
||||
}
|
||||
|
@ -216,9 +221,7 @@ static int vcn_v3_0_sw_init(void *handle)
|
|||
ring = &adev->vcn.inst[i].ring_enc[j];
|
||||
ring->use_doorbell = true;
|
||||
if (amdgpu_sriov_vf(adev)) {
|
||||
ring->doorbell_index = vcn_doorbell_index;
|
||||
/* NOTE: increment so next VCN engine use next DOORBELL DWORD */
|
||||
vcn_doorbell_index++;
|
||||
ring->doorbell_index = vcn_doorbell_index + i * (adev->vcn.num_enc_rings + 1) + 1 + j;
|
||||
} else {
|
||||
ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + j + 8 * i;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue