Commit 25a35065 authored by Bokun Zhang's avatar Bokun Zhang Committed by Alex Deucher

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: default avatarBokun Zhang <Bokun.Zhang@amd.com>
Reviewed-by: default avatarMonk Liu <monk.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 880af2ea
...@@ -155,6 +155,13 @@ static int vcn_v3_0_sw_init(void *handle) ...@@ -155,6 +155,13 @@ static int vcn_v3_0_sw_init(void *handle)
if (r) if (r)
return 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)) { if (amdgpu_sriov_vf(adev)) {
vcn_doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1; vcn_doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1;
/* get DWORD offset */ /* get DWORD offset */
...@@ -192,9 +199,7 @@ static int vcn_v3_0_sw_init(void *handle) ...@@ -192,9 +199,7 @@ static int vcn_v3_0_sw_init(void *handle)
ring = &adev->vcn.inst[i].ring_dec; ring = &adev->vcn.inst[i].ring_dec;
ring->use_doorbell = true; ring->use_doorbell = true;
if (amdgpu_sriov_vf(adev)) { if (amdgpu_sriov_vf(adev)) {
ring->doorbell_index = vcn_doorbell_index; ring->doorbell_index = vcn_doorbell_index + i * (adev->vcn.num_enc_rings + 1);
/* NOTE: increment so next VCN engine use next DOORBELL DWORD */
vcn_doorbell_index++;
} else { } else {
ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 8 * i; 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) ...@@ -216,9 +221,7 @@ static int vcn_v3_0_sw_init(void *handle)
ring = &adev->vcn.inst[i].ring_enc[j]; ring = &adev->vcn.inst[i].ring_enc[j];
ring->use_doorbell = true; ring->use_doorbell = true;
if (amdgpu_sriov_vf(adev)) { if (amdgpu_sriov_vf(adev)) {
ring->doorbell_index = vcn_doorbell_index; ring->doorbell_index = vcn_doorbell_index + i * (adev->vcn.num_enc_rings + 1) + 1 + j;
/* NOTE: increment so next VCN engine use next DOORBELL DWORD */
vcn_doorbell_index++;
} else { } else {
ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + j + 8 * i; ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 2 + j + 8 * i;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment