summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_emulation.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_emulation.c')
-rw-r--r--kernel/gsp_emulation.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/kernel/gsp_emulation.c b/kernel/gsp_emulation.c
index bca8a52..7b3b261 100644
--- a/kernel/gsp_emulation.c
+++ b/kernel/gsp_emulation.c
@@ -178,6 +178,17 @@ static void gsp_emu_poll_boot(struct gsp_emu_context *ctx)
u32 gsp_cpuctl = gsp_emu_shadow_read32(ctx, GSP_EMU_REG_GSP_CPUCTL);
u32 sec2_cpuctl = gsp_emu_shadow_read32(ctx, GSP_EMU_REG_SEC2_CPUCTL);
u32 engine = gsp_emu_shadow_read32(ctx, GSP_EMU_REG_GSP_ENGINE);
+ u32 mmu_inv = gsp_emu_shadow_read32(ctx, GSP_EMU_REG_MMU_INVALIDATE);
+
+ /* TLB invalidate auto-complete: the driver sets TRIGGER then spins
+ * polling for it to clear (kgmmuCheckPendingInvalidates). Report
+ * instant completion or the driver wedges the open/init path. */
+ if (mmu_inv & GSP_EMU_MMU_INVALIDATE_TRIGGER) {
+ gsp_emu_shadow_write32(ctx, GSP_EMU_REG_MMU_INVALIDATE,
+ mmu_inv & ~GSP_EMU_MMU_INVALIDATE_TRIGGER);
+ pr_info_ratelimited("GSP-BOOT: MMU_INVALIDATE trigger auto-cleared (val=0x%x)\n",
+ mmu_inv);
+ }
/* GSP ENGINE reset asserted -> falcon rebooted, restart stage tracking */
if ((engine & 0x1) && ctx->boot_stage != GSP_BOOT_STAGE_IDLE) {