- 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

Change-Id: Ica36b2bc80efa896f3753f2f2e2539ca2ca6649f
Signed-off-by: Bokun Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c 
b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index 269002816109..3970a0ccb6a5 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -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;
                        }
-- 
2.25.1

_______________________________________________
amd-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to