RE: [PATCH] drm/amd/amdgpu: Fix incorrect logic to increment VCN doorbell index

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[AMD Official Use Only - Internal Distribution Only]

Reviewed-by: Monk Liu <monk.liu@xxxxxxx>

_____________________________________
Monk Liu|GPU Virtualization Team |AMD


-----Original Message-----
From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Bokun Zhang
Sent: Saturday, November 7, 2020 10:03 AM
To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
Cc: Zhang, Bokun <Bokun.Zhang@xxxxxxx>
Subject: [PATCH] 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

Change-Id: Ica36b2bc80efa896f3753f2f2e2539ca2ca6649f
Signed-off-by: Bokun Zhang <Bokun.Zhang@xxxxxxx>
---
 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
amd-gfx@xxxxxxxxxxxxxxxxxxxxx
https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.freedesktop.org%2Fmailman%2Flistinfo%2Famd-gfx&amp;data=04%7C01%7Cmonk.liu%40amd.com%7C0ec09d9e179b4721263608d882c13981%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637403114148624558%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C2000&amp;sdata=Bn03tzCw6gyiI%2Fq78gJ%2BQQUGAJdABHG1Fup87tgSP0A%3D&amp;reserved=0
_______________________________________________
amd-gfx mailing list
amd-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/amd-gfx



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux