diff options
Diffstat (limited to 'kernel/gsp_phys_booter.c')
| -rw-r--r-- | kernel/gsp_phys_booter.c | 35 |
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) { |
