aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOak Zeng <Oak.Zeng@amd.com>2019-08-01 15:55:45 -0400
committerAlex Deucher <alexander.deucher@amd.com>2019-08-15 11:57:48 -0400
commit3ff985485b29693376bb470a40b7aba4394a189b (patch)
treef54b01a4e7ed94d5307557aadf5611c0890a2f62
parent675a9e38b39c4114dbcf1ed2e7f7a0e5a6a5e4b4 (diff)
drm/amdgpu: Export function to flush TLB of specific vm hub
This is for kfd to reuse amdgpu TLB invalidation function. On gfx10, kfd only needs to flush TLB on gfx hub but not on mm hub. So export a function for KFD flush TLB only on specific hub. Signed-off-by: Oak Zeng <Oak.Zeng@amd.com> Reviewed-by: Christian Konig <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c12
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c69
9 files changed, 78 insertions, 57 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
index 9d153cf39581..e262f2ac07a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -670,7 +670,7 @@ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid,
670int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid) 670int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
671{ 671{
672 struct amdgpu_device *adev = (struct amdgpu_device *) kgd; 672 struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
673 int vmid; 673 int vmid, i;
674 struct amdgpu_ring *ring = &adev->gfx.kiq.ring; 674 struct amdgpu_ring *ring = &adev->gfx.kiq.ring;
675 uint32_t flush_type = 0; 675 uint32_t flush_type = 0;
676 676
@@ -689,8 +689,9 @@ int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
689 if (kgd_gfx_v9_get_atc_vmid_pasid_mapping_valid(kgd, vmid)) { 689 if (kgd_gfx_v9_get_atc_vmid_pasid_mapping_valid(kgd, vmid)) {
690 if (kgd_gfx_v9_get_atc_vmid_pasid_mapping_pasid(kgd, vmid) 690 if (kgd_gfx_v9_get_atc_vmid_pasid_mapping_pasid(kgd, vmid)
691 == pasid) { 691 == pasid) {
692 amdgpu_gmc_flush_gpu_tlb(adev, vmid, 692 for (i = 0; i < adev->num_vmhubs; i++)
693 flush_type); 693 amdgpu_gmc_flush_gpu_tlb(adev, vmid,
694 i, flush_type);
694 break; 695 break;
695 } 696 }
696 } 697 }
@@ -702,6 +703,7 @@ int kgd_gfx_v9_invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
702int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid) 703int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
703{ 704{
704 struct amdgpu_device *adev = (struct amdgpu_device *) kgd; 705 struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
706 int i;
705 707
706 if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) { 708 if (!amdgpu_amdkfd_is_kfd_vmid(adev, vmid)) {
707 pr_err("non kfd vmid %d\n", vmid); 709 pr_err("non kfd vmid %d\n", vmid);
@@ -723,7 +725,9 @@ int kgd_gfx_v9_invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
723 * TODO 2: support range-based invalidation, requires kfg2kgd 725 * TODO 2: support range-based invalidation, requires kfg2kgd
724 * interface change 726 * interface change
725 */ 727 */
726 amdgpu_gmc_flush_gpu_tlb(adev, vmid, 0); 728 for (i = 0; i < adev->num_vmhubs; i++)
729 amdgpu_gmc_flush_gpu_tlb(adev, vmid, i, 0);
730
727 return 0; 731 return 0;
728} 732}
729 733
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
index d79ab1da9e07..ac14d473a143 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
@@ -251,7 +251,9 @@ int amdgpu_gart_unbind(struct amdgpu_device *adev, uint64_t offset,
251 } 251 }
252 mb(); 252 mb();
253 amdgpu_asic_flush_hdp(adev, NULL); 253 amdgpu_asic_flush_hdp(adev, NULL);
254 amdgpu_gmc_flush_gpu_tlb(adev, 0, 0); 254 for (i = 0; i < adev->num_vmhubs; i++)
255 amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
256
255 return 0; 257 return 0;
256} 258}
257 259
@@ -312,7 +314,7 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
312#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS 314#ifdef CONFIG_DRM_AMDGPU_GART_DEBUGFS
313 unsigned i,t,p; 315 unsigned i,t,p;
314#endif 316#endif
315 int r; 317 int r, i;
316 318
317 if (!adev->gart.ready) { 319 if (!adev->gart.ready) {
318 WARN(1, "trying to bind memory to uninitialized GART !\n"); 320 WARN(1, "trying to bind memory to uninitialized GART !\n");
@@ -336,7 +338,8 @@ int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset,
336 338
337 mb(); 339 mb();
338 amdgpu_asic_flush_hdp(adev, NULL); 340 amdgpu_asic_flush_hdp(adev, NULL);
339 amdgpu_gmc_flush_gpu_tlb(adev, 0, 0); 341 for (i = 0; i < adev->num_vmhubs; i++)
342 amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
340 return 0; 343 return 0;
341} 344}
342 345
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
index cac2ef84a1a1..b6e1d98ef01e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
@@ -89,8 +89,8 @@ struct amdgpu_vmhub {
89 */ 89 */
90struct amdgpu_gmc_funcs { 90struct amdgpu_gmc_funcs {
91 /* flush the vm tlb via mmio */ 91 /* flush the vm tlb via mmio */
92 void (*flush_gpu_tlb)(struct amdgpu_device *adev, 92 void (*flush_gpu_tlb)(struct amdgpu_device *adev, uint32_t vmid,
93 uint32_t vmid, uint32_t flush_type); 93 uint32_t vmhub, uint32_t flush_type);
94 /* flush the vm tlb via ring */ 94 /* flush the vm tlb via ring */
95 uint64_t (*emit_flush_gpu_tlb)(struct amdgpu_ring *ring, unsigned vmid, 95 uint64_t (*emit_flush_gpu_tlb)(struct amdgpu_ring *ring, unsigned vmid,
96 uint64_t pd_addr); 96 uint64_t pd_addr);
@@ -181,7 +181,7 @@ struct amdgpu_gmc {
181 struct ras_common_if *mmhub_ras_if; 181 struct ras_common_if *mmhub_ras_if;
182}; 182};
183 183
184#define amdgpu_gmc_flush_gpu_tlb(adev, vmid, type) (adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid), (type)) 184#define amdgpu_gmc_flush_gpu_tlb(adev, vmid, vmhub, type) ((adev)->gmc.gmc_funcs->flush_gpu_tlb((adev), (vmid), (vmhub), (type)))
185#define amdgpu_gmc_emit_flush_gpu_tlb(r, vmid, addr) (r)->adev->gmc.gmc_funcs->emit_flush_gpu_tlb((r), (vmid), (addr)) 185#define amdgpu_gmc_emit_flush_gpu_tlb(r, vmid, addr) (r)->adev->gmc.gmc_funcs->emit_flush_gpu_tlb((r), (vmid), (addr))
186#define amdgpu_gmc_emit_pasid_mapping(r, vmid, pasid) (r)->adev->gmc.gmc_funcs->emit_pasid_mapping((r), (vmid), (pasid)) 186#define amdgpu_gmc_emit_pasid_mapping(r, vmid, pasid) (r)->adev->gmc.gmc_funcs->emit_pasid_mapping((r), (vmid), (pasid))
187#define amdgpu_gmc_get_vm_pde(adev, level, dst, flags) (adev)->gmc.gmc_funcs->get_vm_pde((adev), (level), (dst), (flags)) 187#define amdgpu_gmc_get_vm_pde(adev, level, dst, flags) (adev)->gmc.gmc_funcs->get_vm_pde((adev), (level), (dst), (flags))
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
index 7ae0e86ec6a7..79d3fbd3ba63 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
@@ -1748,9 +1748,12 @@ static void gfx_v10_0_init_csb(struct amdgpu_device *adev)
1748 1748
1749static void gfx_v10_0_init_pg(struct amdgpu_device *adev) 1749static void gfx_v10_0_init_pg(struct amdgpu_device *adev)
1750{ 1750{
1751 int i;
1752
1751 gfx_v10_0_init_csb(adev); 1753 gfx_v10_0_init_csb(adev);
1752 1754
1753 amdgpu_gmc_flush_gpu_tlb(adev, 0, 0); 1755 for (i = 0; i < adev->num_vmhubs; i++)
1756 amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
1754 1757
1755 /* TODO: init power gating */ 1758 /* TODO: init power gating */
1756 return; 1759 return;
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
index ee16ec1a01bb..aafb16064338 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
@@ -230,8 +230,8 @@ static void gmc_v10_0_flush_vm_hub(struct amdgpu_device *adev, uint32_t vmid,
230 * 230 *
231 * Flush the TLB for the requested page table. 231 * Flush the TLB for the requested page table.
232 */ 232 */
233static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, 233static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
234 uint32_t vmid, uint32_t flush_type) 234 uint32_t vmhub, uint32_t flush_type)
235{ 235{
236 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring; 236 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;
237 struct dma_fence *fence; 237 struct dma_fence *fence;
@@ -244,7 +244,14 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev,
244 244
245 mutex_lock(&adev->mman.gtt_window_lock); 245 mutex_lock(&adev->mman.gtt_window_lock);
246 246
247 gmc_v10_0_flush_vm_hub(adev, vmid, AMDGPU_MMHUB_0, 0); 247 if (vmhub == AMDGPU_MMHUB_0) {
248 gmc_v10_0_flush_vm_hub(adev, vmid, AMDGPU_MMHUB_0, 0);
249 mutex_unlock(&adev->mman.gtt_window_lock);
250 return;
251 }
252
253 BUG_ON(vmhub != AMDGPU_GFXHUB_0);
254
248 if (!adev->mman.buffer_funcs_enabled || 255 if (!adev->mman.buffer_funcs_enabled ||
249 !adev->ib_pool_ready || 256 !adev->ib_pool_ready ||
250 adev->in_gpu_reset) { 257 adev->in_gpu_reset) {
@@ -756,7 +763,8 @@ static int gmc_v10_0_gart_enable(struct amdgpu_device *adev)
756 763
757 gfxhub_v2_0_set_fault_enable_default(adev, value); 764 gfxhub_v2_0_set_fault_enable_default(adev, value);
758 mmhub_v2_0_set_fault_enable_default(adev, value); 765 mmhub_v2_0_set_fault_enable_default(adev, value);
759 gmc_v10_0_flush_gpu_tlb(adev, 0, 0); 766 gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_MMHUB_0, 0);
767 gmc_v10_0_flush_gpu_tlb(adev, 0, AMDGPU_GFXHUB_0, 0);
760 768
761 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 769 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
762 (unsigned)(adev->gmc.gart_size >> 20), 770 (unsigned)(adev->gmc.gart_size >> 20),
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
index 14073b506afe..f0f6c6da9f30 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
@@ -362,8 +362,8 @@ static int gmc_v6_0_mc_init(struct amdgpu_device *adev)
362 return 0; 362 return 0;
363} 363}
364 364
365static void gmc_v6_0_flush_gpu_tlb(struct amdgpu_device *adev, 365static void gmc_v6_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
366 uint32_t vmid, uint32_t flush_type) 366 uint32_t vmhub, uint32_t flush_type)
367{ 367{
368 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); 368 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
369} 369}
@@ -571,7 +571,7 @@ static int gmc_v6_0_gart_enable(struct amdgpu_device *adev)
571 else 571 else
572 gmc_v6_0_set_fault_enable_default(adev, true); 572 gmc_v6_0_set_fault_enable_default(adev, true);
573 573
574 gmc_v6_0_flush_gpu_tlb(adev, 0, 0); 574 gmc_v6_0_flush_gpu_tlb(adev, 0, 0, 0);
575 dev_info(adev->dev, "PCIE GART of %uM enabled (table at 0x%016llX).\n", 575 dev_info(adev->dev, "PCIE GART of %uM enabled (table at 0x%016llX).\n",
576 (unsigned)(adev->gmc.gart_size >> 20), 576 (unsigned)(adev->gmc.gart_size >> 20),
577 (unsigned long long)table_addr); 577 (unsigned long long)table_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
index ca32915fbecb..d935a2f29e5f 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
@@ -433,8 +433,8 @@ static int gmc_v7_0_mc_init(struct amdgpu_device *adev)
433 * 433 *
434 * Flush the TLB for the requested page table (CIK). 434 * Flush the TLB for the requested page table (CIK).
435 */ 435 */
436static void gmc_v7_0_flush_gpu_tlb(struct amdgpu_device *adev, 436static void gmc_v7_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
437 uint32_t vmid, uint32_t flush_type) 437 uint32_t vmhub, uint32_t flush_type)
438{ 438{
439 /* bits 0-15 are the VM contexts0-15 */ 439 /* bits 0-15 are the VM contexts0-15 */
440 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); 440 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
@@ -677,7 +677,7 @@ static int gmc_v7_0_gart_enable(struct amdgpu_device *adev)
677 WREG32(mmCHUB_CONTROL, tmp); 677 WREG32(mmCHUB_CONTROL, tmp);
678 } 678 }
679 679
680 gmc_v7_0_flush_gpu_tlb(adev, 0, 0); 680 gmc_v7_0_flush_gpu_tlb(adev, 0, 0, 0);
681 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 681 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
682 (unsigned)(adev->gmc.gart_size >> 20), 682 (unsigned)(adev->gmc.gart_size >> 20),
683 (unsigned long long)table_addr); 683 (unsigned long long)table_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
index 909a8764703e..2c60e45e3fa0 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
@@ -635,8 +635,8 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
635 * 635 *
636 * Flush the TLB for the requested page table (VI). 636 * Flush the TLB for the requested page table (VI).
637 */ 637 */
638static void gmc_v8_0_flush_gpu_tlb(struct amdgpu_device *adev, 638static void gmc_v8_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
639 uint32_t vmid, uint32_t flush_type) 639 uint32_t vmhub, uint32_t flush_type)
640{ 640{
641 /* bits 0-15 are the VM contexts0-15 */ 641 /* bits 0-15 are the VM contexts0-15 */
642 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid); 642 WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
@@ -921,7 +921,7 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
921 else 921 else
922 gmc_v8_0_set_fault_enable_default(adev, true); 922 gmc_v8_0_set_fault_enable_default(adev, true);
923 923
924 gmc_v8_0_flush_gpu_tlb(adev, 0, 0); 924 gmc_v8_0_flush_gpu_tlb(adev, 0, 0, 0);
925 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 925 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
926 (unsigned)(adev->gmc.gart_size >> 20), 926 (unsigned)(adev->gmc.gart_size >> 20),
927 (unsigned long long)table_addr); 927 (unsigned long long)table_addr);
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index ba4f939f657f..7da355bf6d89 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -453,44 +453,45 @@ static uint32_t gmc_v9_0_get_invalidate_req(unsigned int vmid,
453 * 453 *
454 * Flush the TLB for the requested page table using certain type. 454 * Flush the TLB for the requested page table using certain type.
455 */ 455 */
456static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, 456static void gmc_v9_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,
457 uint32_t vmid, uint32_t flush_type) 457 uint32_t vmhub, uint32_t flush_type)
458{ 458{
459 const unsigned eng = 17; 459 const unsigned eng = 17;
460 unsigned i, j; 460 u32 j, tmp;
461 struct amdgpu_vmhub *hub;
461 462
462 for (i = 0; i < adev->num_vmhubs; ++i) { 463 BUG_ON(vmhub >= adev->num_vmhubs);
463 struct amdgpu_vmhub *hub = &adev->vmhub[i];
464 u32 tmp = gmc_v9_0_get_invalidate_req(vmid, flush_type);
465 464
466 /* This is necessary for a HW workaround under SRIOV as well 465 hub = &adev->vmhub[vmhub];
467 * as GFXOFF under bare metal 466 tmp = gmc_v9_0_get_invalidate_req(vmid, flush_type);
468 */
469 if (adev->gfx.kiq.ring.sched.ready &&
470 (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev)) &&
471 !adev->in_gpu_reset) {
472 uint32_t req = hub->vm_inv_eng0_req + eng;
473 uint32_t ack = hub->vm_inv_eng0_ack + eng;
474
475 amdgpu_virt_kiq_reg_write_reg_wait(adev, req, ack, tmp,
476 1 << vmid);
477 continue;
478 }
479 467
480 spin_lock(&adev->gmc.invalidate_lock); 468 /* This is necessary for a HW workaround under SRIOV as well
481 WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp); 469 * as GFXOFF under bare metal
482 for (j = 0; j < adev->usec_timeout; j++) { 470 */
483 tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng); 471 if (adev->gfx.kiq.ring.sched.ready &&
484 if (tmp & (1 << vmid)) 472 (amdgpu_sriov_runtime(adev) || !amdgpu_sriov_vf(adev)) &&
485 break; 473 !adev->in_gpu_reset) {
486 udelay(1); 474 uint32_t req = hub->vm_inv_eng0_req + eng;
487 } 475 uint32_t ack = hub->vm_inv_eng0_ack + eng;
488 spin_unlock(&adev->gmc.invalidate_lock); 476
489 if (j < adev->usec_timeout) 477 amdgpu_virt_kiq_reg_write_reg_wait(adev, req, ack, tmp,
490 continue; 478 1 << vmid);
479 return;
480 }
491 481
492 DRM_ERROR("Timeout waiting for VM flush ACK!\n"); 482 spin_lock(&adev->gmc.invalidate_lock);
483 WREG32_NO_KIQ(hub->vm_inv_eng0_req + eng, tmp);
484 for (j = 0; j < adev->usec_timeout; j++) {
485 tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + eng);
486 if (tmp & (1 << vmid))
487 break;
488 udelay(1);
493 } 489 }
490 spin_unlock(&adev->gmc.invalidate_lock);
491 if (j < adev->usec_timeout)
492 return;
493
494 DRM_ERROR("Timeout waiting for VM flush ACK!\n");
494} 495}
495 496
496static uint64_t gmc_v9_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring, 497static uint64_t gmc_v9_0_emit_flush_gpu_tlb(struct amdgpu_ring *ring,
@@ -1296,7 +1297,7 @@ static void gmc_v9_0_init_golden_registers(struct amdgpu_device *adev)
1296 */ 1297 */
1297static int gmc_v9_0_gart_enable(struct amdgpu_device *adev) 1298static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
1298{ 1299{
1299 int r; 1300 int r, i;
1300 bool value; 1301 bool value;
1301 u32 tmp; 1302 u32 tmp;
1302 1303
@@ -1353,7 +1354,9 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev)
1353 mmhub_v9_4_set_fault_enable_default(adev, value); 1354 mmhub_v9_4_set_fault_enable_default(adev, value);
1354 else 1355 else
1355 mmhub_v1_0_set_fault_enable_default(adev, value); 1356 mmhub_v1_0_set_fault_enable_default(adev, value);
1356 gmc_v9_0_flush_gpu_tlb(adev, 0, 0); 1357
1358 for (i = 0; i < adev->num_vmhubs; ++i)
1359 gmc_v9_0_flush_gpu_tlb(adev, 0, i, 0);
1357 1360
1358 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n", 1361 DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
1359 (unsigned)(adev->gmc.gart_size >> 20), 1362 (unsigned)(adev->gmc.gart_size >> 20),