From b5131c6bfd277705ec4b2f6ec7380d15a8214d95 Mon Sep 17 00:00:00 2001 From: Shaoyun Liu Date: Tue, 14 Mar 2017 18:07:28 -0400 Subject: [PATCH 1629/4131] drm/amdkfd: Serialize tlb flush on KFD side Change-Id: Id78f764a66c8a16d8c983afd3913d4ef9d06e014 Signed-off-by: Shaoyun Liu --- drivers/gpu/drm/amd/amdkfd/kfd_device.c | 2 ++ drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c | 7 +++++++ drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 2 ++ 3 files changed, 11 insertions(+) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c index e03fe90..d94ec24 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c @@ -576,6 +576,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd, kfd->dbgmgr = NULL; + spin_lock_init(&kfd->tlb_invalidation_lock); + kfd->init_complete = true; dev_info(kfd_device, "added device (%x:%x)\n", kfd->pdev->vendor, kfd->pdev->device); diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c index 49a2a53..1c1ec21 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_flat_memory.c @@ -433,6 +433,9 @@ void kfd_flush_tlb(struct kfd_dev *dev, uint32_t pasid) /* Scan all registers in the range ATC_VMID8_PASID_MAPPING .. ATC_VMID15_PASID_MAPPING * to check which VMID the current process is mapped to * and flush TLB for this VMID if found*/ + if (dev->device_info->asic_family >= CHIP_VEGA10) + spin_lock(&dev->tlb_invalidation_lock); + for (vmid = first_vmid_to_scan; vmid <= last_vmid_to_scan; vmid++) { if (f2g->get_atc_vmid_pasid_mapping_valid( dev->kgd, vmid)) { @@ -446,4 +449,8 @@ void kfd_flush_tlb(struct kfd_dev *dev, uint32_t pasid) } } } + + if (dev->device_info->asic_family >= CHIP_VEGA10) + spin_unlock(&dev->tlb_invalidation_lock); + } diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index 4962d7b..607b43f 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -255,6 +255,8 @@ struct kfd_dev { unsigned int gtt_sa_chunk_size; unsigned int gtt_sa_num_of_chunks; + spinlock_t tlb_invalidation_lock; + /* QCM Device instance */ struct device_queue_manager *dqm; -- 2.7.4