]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/xe/pf: Fix MMIO access using PF view instead of VF view during migration
authorShuicheng Lin <shuicheng.lin@intel.com>
Wed, 29 Apr 2026 19:22:59 +0000 (19:22 +0000)
committerMatthew Brost <matthew.brost@intel.com>
Tue, 5 May 2026 23:15:00 +0000 (16:15 -0700)
pf_migration_mmio_save() and pf_migration_mmio_restore() initialize a
local VF-specific MMIO view via xe_mmio_init_vf_view() but then pass
&gt->mmio (the PF base) to all xe_mmio_read32()/xe_mmio_write32()
calls instead of the local &mmio. This causes the PF own SW flag
registers to be saved/restored rather than the target VF registers,
silently corrupting migration state.

Use the VF MMIO view for all register accesses, matching the correct
pattern used in pf_clear_vf_scratch_regs().

Fixes: b7c1b990f719 ("drm/xe/pf: Handle MMIO migration data as part of PF control")
Cc: MichaƂ Winiarski <michal.winiarski@intel.com>
Assisted-by: Claude:claude-opus-4.6
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com>
Reviewed-by: Stuart Summers <stuart.summers@intel.com>
Link: https://patch.msgid.link/20260429192259.4009211-1-shuicheng.lin@intel.com
Signed-off-by: Shuicheng Lin <shuicheng.lin@intel.com>
(cherry picked from commit 7d9c39cfb31ff389490ca1308767c2807a9829a6)
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
drivers/gpu/drm/xe/xe_gt_sriov_pf_migration.c

index 87a164efcc33c8807bb758931c6e1a3796a0337f..01fe03b9efe85c3f137b0d26fa02ee1206b4621f 100644 (file)
@@ -385,10 +385,10 @@ static int pf_migration_mmio_save(struct xe_gt *gt, unsigned int vfid, void *buf
 
        if (xe_gt_is_media_type(gt))
                for (n = 0; n < MED_VF_SW_FLAG_COUNT; n++)
-                       regs[n] = xe_mmio_read32(&gt->mmio, MED_VF_SW_FLAG(n));
+                       regs[n] = xe_mmio_read32(&mmio, MED_VF_SW_FLAG(n));
        else
                for (n = 0; n < VF_SW_FLAG_COUNT; n++)
-                       regs[n] = xe_mmio_read32(&gt->mmio, VF_SW_FLAG(n));
+                       regs[n] = xe_mmio_read32(&mmio, VF_SW_FLAG(n));
 
        return 0;
 }
@@ -407,10 +407,10 @@ static int pf_migration_mmio_restore(struct xe_gt *gt, unsigned int vfid,
 
        if (xe_gt_is_media_type(gt))
                for (n = 0; n < MED_VF_SW_FLAG_COUNT; n++)
-                       xe_mmio_write32(&gt->mmio, MED_VF_SW_FLAG(n), regs[n]);
+                       xe_mmio_write32(&mmio, MED_VF_SW_FLAG(n), regs[n]);
        else
                for (n = 0; n < VF_SW_FLAG_COUNT; n++)
-                       xe_mmio_write32(&gt->mmio, VF_SW_FLAG(n), regs[n]);
+                       xe_mmio_write32(&mmio, VF_SW_FLAG(n), regs[n]);
 
        return 0;
 }