]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/vf: Add sanity check for GGTT configuration
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Mon, 2 Jun 2025 10:33:25 +0000 (12:33 +0200)
committerMichal Wajdeczko <michal.wajdeczko@intel.com>
Tue, 3 Jun 2025 10:36:00 +0000 (12:36 +0200)
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 <michal.wajdeczko@intel.com>
Cc: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Reviewed-by: Satyanarayana K V P <satyanarayana.k.v.p@intel.com>
Link: https://lore.kernel.org/r/20250602103325.549-4-michal.wajdeczko@intel.com
drivers/gpu/drm/xe/xe_tile_sriov_vf.c

index 88e832894432bb2af118832644fa5e81286e70f8..f221dbed16f091a46e9232e70ac7b28075e2f776 100644 (file)
@@ -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],