From c12c729e97508f4cd073a7cd5150d7512fa84f34 Mon Sep 17 00:00:00 2001 From: Michal Wajdeczko Date: Mon, 2 Jun 2025 12:33:25 +0200 Subject: [PATCH] drm/xe/vf: Add sanity check for GGTT configuration The VF GGTT configuration was prepared by the PF, which should be trusted, was obtained from the GuC, which likely already did some sanity checks too, but since it's a received data, we should have our own sanity checks to detect early any misconfiguration. Signed-off-by: Michal Wajdeczko Cc: Satyanarayana K V P Reviewed-by: Satyanarayana K V P Link: https://lore.kernel.org/r/20250602103325.549-4-michal.wajdeczko@intel.com --- drivers/gpu/drm/xe/xe_tile_sriov_vf.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/xe/xe_tile_sriov_vf.c b/drivers/gpu/drm/xe/xe_tile_sriov_vf.c index 88e832894432b..f221dbed16f09 100644 --- a/drivers/gpu/drm/xe/xe_tile_sriov_vf.c +++ b/drivers/gpu/drm/xe/xe_tile_sriov_vf.c @@ -11,6 +11,7 @@ #include "xe_ggtt.h" #include "xe_gt_sriov_vf.h" #include "xe_sriov.h" +#include "xe_sriov_printk.h" #include "xe_tile_sriov_vf.h" #include "xe_wopcm.h" @@ -44,6 +45,7 @@ int xe_tile_sriov_vf_balloon_ggtt_locked(struct xe_tile *tile) u64 ggtt_base = xe_gt_sriov_vf_ggtt_base(tile->primary_gt); u64 ggtt_size = xe_gt_sriov_vf_ggtt(tile->primary_gt); struct xe_device *xe = tile_to_xe(tile); + u64 wopcm = xe_wopcm_size(xe); u64 start, end; int err; @@ -66,7 +68,14 @@ int xe_tile_sriov_vf_balloon_ggtt_locked(struct xe_tile *tile) * |<--- balloon[0] --->|<-- VF -->|<-- balloon[1] ->| */ - start = xe_wopcm_size(xe); + if (ggtt_base < wopcm || ggtt_base > GUC_GGTT_TOP || + ggtt_size > GUC_GGTT_TOP - ggtt_base) { + xe_sriov_err(xe, "tile%u: Invalid GGTT configuration: %#llx-%#llx\n", + tile->id, ggtt_base, ggtt_base + ggtt_size - 1); + return -ERANGE; + } + + start = wopcm; end = ggtt_base; if (end != start) { err = xe_ggtt_node_insert_balloon_locked(tile->sriov.vf.ggtt_balloon[0], -- 2.47.2