Commit fb4c52db authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: fix and cleanup gmc_v7_0_flush_gpu_tlb_pasid



Testing for reset is pointless since the reset can start right after the
test. Grab the reset semaphore instead.

The same PASID can be used by more than once VMID, build a mask of VMIDs
to invalidate instead of just restting the first one.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Reviewed-by: default avatarShashank Sharma <shashank.sharma@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a54db42f
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#include "amdgpu_ucode.h"
#include "amdgpu_amdkfd.h"
#include "amdgpu_gem.h"
#include "amdgpu_reset.h"

#include "bif/bif_4_1_d.h"
#include "bif/bif_4_1_sh_mask.h"
@@ -426,23 +427,23 @@ static int gmc_v7_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,
					uint16_t pasid, uint32_t flush_type,
					bool all_hub, uint32_t inst)
{
	u32 mask = 0x0;
	int vmid;
	unsigned int tmp;

	if (amdgpu_in_reset(adev))
		return -EIO;
	if (!down_read_trylock(&adev->reset_domain->sem))
		return 0;

	for (vmid = 1; vmid < 16; vmid++) {
		u32 tmp = RREG32(mmATC_VMID0_PASID_MAPPING + vmid);

		tmp = RREG32(mmATC_VMID0_PASID_MAPPING + vmid);
		if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
			(tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
			WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
			RREG32(mmVM_INVALIDATE_RESPONSE);
			break;
		}
		    (tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid)
			mask |= 1 << vmid;
	}

	WREG32(mmVM_INVALIDATE_REQUEST, mask);
	RREG32(mmVM_INVALIDATE_RESPONSE);
	up_read(&adev->reset_domain->sem);
	return 0;
}