summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_phys_booter.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_phys_booter.c')
-rw-r--r--kernel/gsp_phys_booter.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c
index 4cf1c55..74b0300 100644
--- a/kernel/gsp_phys_booter.c
+++ b/kernel/gsp_phys_booter.c
@@ -19011,6 +19011,23 @@ MODULE_PARM_DESC(sema_gl_mme_release_sa_arm,
"Re-emit the START-ADDRESS RAM pairs (incl. golden slot 34 -> IR 0x265) before a saved-window release launch so CALL_MME_MACRO(34) resolves to DRAW_IAB (default 0; needs sema_gl_mme_pack_release=1)");
/*
+ * Release chaining (sema_gl_mme_release_chain): the host pack-continuation
+ * carrier's launch poll owns the single forwarding slot for up to
+ * sema_mme_fast_ms (c779 elapsed 2801 ms), and the client's 3D channel can
+ * unregister before the next service pass fires the armed release (c779:
+ * release ARM at +0.1 s, beef channel unregistered ~2.2 s later ->
+ * MME-CARRY-HOLD reason=no-channel). With this on, a successful synthetic
+ * pack carrier claims the armed release after its settle grace and runs the
+ * release work in the same slot, while the channel is still alive. Default 1;
+ * the release carrier itself is default off.
+ */
+static bool gsp_phys_rmcall_gr_mme_release_chain = true;
+module_param_named(sema_gl_mme_release_chain,
+ gsp_phys_rmcall_gr_mme_release_chain, bool, 0644);
+MODULE_PARM_DESC(sema_gl_mme_release_chain,
+ "Run the armed saved-window release in the same forwarding slot right after a successful host pack-continuation carrier (default 1; needs sema_gl_mme_pack_release=1)");
+
+/*
* DRAW_IAB preference (release carrier follow-up): the held-call window that
* matters is the DRAW window, whose method stream carries the
* CALL_MME_MACRO(34) run that expands to DRAW_IAB (mac=0x22).
@@ -19470,6 +19487,24 @@ bool gsp_phys_gr_mme_release_take(u32 h_object, u32 *held, u32 *win)
return true;
}
+/* An armed release is still owed (before its grace deadline too). */
+bool gsp_phys_gr_mme_release_waiting(void)
+{
+ struct gsp_phys_gr_mme_release_state *s = &gsp_phys_gr_mme_release;
+ unsigned long flags;
+ bool waiting;
+
+ spin_lock_irqsave(&gsp_phys_gr_mme_release_lock, flags);
+ waiting = s->valid && s->armed && !s->fired && !s->consumed;
+ spin_unlock_irqrestore(&gsp_phys_gr_mme_release_lock, flags);
+ return waiting;
+}
+
+bool gsp_phys_gr_mme_release_chain_enabled(void)
+{
+ return READ_ONCE(gsp_phys_rmcall_gr_mme_release_chain);
+}
+
/* The release is still claimed and not cancelled (builder safety gate). */
static bool gsp_phys_gr_mme_release_active(void)
{