Subject: [PATCH 2/2] drm/amdgpu: adjust vmhub flush tlb iteration to fit the new GFXHUB/MMHUB layout

From: Yifan Zhang <[email-masked]>
Date: Thu, 4 May 2023 23:50:23 +0800

tlb flush has to be changed for the new mmhub layout

Signed-off-by: Yifan Zhang <[email-masked]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c | 16 ++++++++++++----
 drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c   | 10 +++++++---
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index 01cb89ffbd56..2383db399c95 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -160,6 +160,7 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
 	/* Starting from VEGA10, system bit must be 0 to mean invalid. */
 	uint64_t flags = 0;
 	int idx;
+	struct amdgpu_vmhub *hub;
 
 	if (!adev->gart.ptr)
 		return;
@@ -182,8 +183,11 @@ void amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
 	}
 	mb();
 	amdgpu_device_flush_hdp(adev, NULL);
-	for (i = 0; i < adev->num_vmhubs; i++)
-		amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
+	for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) {
+		hub = &adev->vmhub[i];
+		if (hub->vmhub_funcs)
+			amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
+	}
 
 	drm_dev_exit(idx);
 }
@@ -258,14 +262,18 @@ void amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
 void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev)
 {
 	int i;
+	struct amdgpu_vmhub *hub;
 
 	if (!adev->gart.ptr)
 		return;
 
 	mb();
 	amdgpu_device_flush_hdp(adev, NULL);
-	for (i = 0; i < adev->num_vmhubs; i++)
-		amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
+	for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) {
+		hub = &adev->vmhub[i];
+		if (hub->vmhub_funcs)
+			amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
+	}
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
index 90cf79f8ddde..3ee7f5e067fb 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
@@ -331,6 +331,7 @@ static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,
 	bool ret;
 	struct amdgpu_ring *ring = &adev->gfx.kiq[0].ring;
 	struct amdgpu_kiq *kiq = &adev->gfx.kiq[0];
+	struct amdgpu_vmhub *hub;
 
 	if (amdgpu_emu_mode == 0 && ring->sched.ready) {
 		spin_lock(&adev->gfx.kiq[0].ring_lock);
@@ -362,9 +363,12 @@ static int gmc_v11_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,
 				&queried_pasid);
 		if (ret	&& queried_pasid == pasid) {
 			if (all_hub) {
-				for (i = 0; i < adev->num_vmhubs; i++)
-					gmc_v11_0_flush_gpu_tlb(adev, vmid,
-							i, flush_type);
+				for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) {
+					hub = &adev->vmhub[i];
+					if (hub->vmhub_funcs)
+						gmc_v11_0_flush_gpu_tlb(adev, vmid,
+								i, flush_type);
+				}
 			} else {
 				gmc_v11_0_flush_gpu_tlb(adev, vmid,
 						AMDGPU_GFXHUB(0), flush_type);
-- 
2.37.3