]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amd/amdgpu: Fix incorrect logic to increment VCN doorbell index
authorBokun Zhang <Bokun.Zhang@amd.com>
Mon, 9 Nov 2020 18:59:27 +0000 (13:59 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 10 Nov 2020 19:26:24 +0000 (14:26 -0500)
- 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>
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c

index 269002816109be7ac0d2b8d83a4b4e0b95c858df..3970a0ccb6a57fdee4466700baa968c23ac75387 100644 (file)
@@ -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;
                        }