drm/xe/guc: Handle regset overflow check for entire GT
authorMatt Roper <matthew.d.roper@intel.com>
Wed, 8 Mar 2023 00:55:08 +0000 (16:55 -0800)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:29:44 +0000 (18:29 -0500)
Checking whether a single engine's register save/restore entries
overflow the expected/pre-allocated GuC ADS regset area isn't terribly
useful; we actually want to check whether the combined entries from all
engines on the GT overflow the regset space.

Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Link: https://lore.kernel.org/r/20230308005509.2975663-1-matthew.d.roper@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_guc_ads.c

index 7a892ff7aba322b6c402b2e76b5b3e1f3e8e89e4..fd9911ffeae477780f997ea21c37184524dc610d 100644 (file)
@@ -482,8 +482,6 @@ static unsigned int guc_mmio_regset_write(struct xe_guc_ads *ads,
                }
        }
 
-       XE_BUG_ON(ads->regset_size < (count * sizeof(struct guc_mmio_reg)));
-
        return count;
 }
 
@@ -496,6 +494,7 @@ static void guc_mmio_reg_state_init(struct xe_guc_ads *ads)
        u32 addr = xe_bo_ggtt_addr(ads->bo) + regset_offset;
        struct iosys_map regset_map = IOSYS_MAP_INIT_OFFSET(ads_to_map(ads),
                                                            regset_offset);
+       unsigned int regset_used = 0;
 
        for_each_hw_engine(hwe, gt, id) {
                unsigned int count;
@@ -521,7 +520,11 @@ static void guc_mmio_reg_state_init(struct xe_guc_ads *ads)
 
                addr += count * sizeof(struct guc_mmio_reg);
                iosys_map_incr(&regset_map, count * sizeof(struct guc_mmio_reg));
+
+               regset_used += count * sizeof(struct guc_mmio_reg);
        }
+
+       XE_BUG_ON(regset_used > ads->regset_size);
 }
 
 static void guc_um_init_params(struct xe_guc_ads *ads)