Commit 9eaaae4c authored by Jinzhou Su's avatar Jinzhou Su Committed by Alex Deucher
Browse files

drm/amd/ras: Handle check address validity in SR-IOV



Handle check address validity command in SR-IOV
guest.

Signed-off-by: default avatarJinzhou Su <jinzhou.su@amd.com>
Reviewed-by: default avatarYiPeng Chai <YiPeng.Chai@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent f0f23c31
Loading
Loading
Loading
Loading
+19 −7
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@
#include "amdgpu_reset.h"
#include "amdgpu_psp.h"
#include "amdgpu_ras_mgr.h"
#include "amdgpu_virt_ras_cmd.h"

#ifdef CONFIG_X86_MCE_AMD
#include <asm/mce.h>
@@ -228,19 +229,30 @@ static int amdgpu_check_address_validity(struct amdgpu_device *adev,
		return 0;

	if (amdgpu_sriov_vf(adev)) {
		if (amdgpu_uniras_enabled(adev)) {
			if (amdgpu_virt_ras_check_address_validity(adev, address, &hit))
				return -EPERM;
			if (hit)
				return -EACCES;
		} else {
			if (amdgpu_virt_check_vf_critical_region(adev, address, &hit))
				return -EPERM;
			return hit ? -EACCES : 0;
		}
	}

	if ((address >= adev->gmc.mc_vram_size) ||
	    (address >= RAS_UMC_INJECT_ADDR_LIMIT))
		return -EFAULT;

	if (amdgpu_uniras_enabled(adev))
		count = amdgpu_ras_mgr_lookup_bad_pages_in_a_row(adev, address,
	if (amdgpu_uniras_enabled(adev)) {
		if (amdgpu_sriov_vf(adev))
			count = amdgpu_virt_ras_convert_retired_address(adev, address,
				page_pfns, ARRAY_SIZE(page_pfns));
		else
			count = amdgpu_ras_mgr_lookup_bad_pages_in_a_row(adev, address,
				page_pfns, ARRAY_SIZE(page_pfns));
	} else
		count = amdgpu_umc_lookup_bad_pages_in_a_row(adev,
				address, page_pfns, ARRAY_SIZE(page_pfns));