summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
index c0336ca9bf6a..45d601b27c3a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
@@ -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_virt_check_vf_critical_region(adev, address, &hit))
- return -EPERM;
- return hit ? -EACCES : 0;
+ 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,
- page_pfns, ARRAY_SIZE(page_pfns));
- else
+ 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));