diff options
Diffstat (limited to 'kernel/gsp_phys_booter.c')
| -rw-r--r-- | kernel/gsp_phys_booter.c | 45 |
1 files changed, 40 insertions, 5 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index 5bb1fec..55c2170 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -18432,6 +18432,39 @@ MODULE_PARM_DESC(sema_gl_mme_iram_gate, "Read the MME IRAM back (0x4044d0 port) and hold/re-emit the packed prelude until it reads back the packed image at the SA entries (default 0; the CONT-106 all-zero fetch)"); /* + * SESSION 153-CONTINUED-108: site control for the IRAM-gate readbacks. + * + * r1374 chronology (first gate boot that released calls): the carrier + * launch (window dropped, no calls) read grfifo=01010001 (empty) at +5 ms; + * the poll-break gate then wrote the MME debug port (0x4044d0) DURING that + * live launch; the first sample of the next launch 2.9 s later read + * grfifo=07071602 (not-empty + FULL, COUNT=22) with NO launch active in + * between - the front end never drained again for the rest of the boot + * (26 launches, all beginning FULL). CONT-107 already recorded the sibling + * evidence: every probe-bearing cycle (r1369..r1371) parked the engine on + * the first X-channel launches while the readback-free cycle (r1368) ran + * the full lane. Both gate sites write the same port, so each gets its own + * knob for the A/B: + * - break (default 0): the poll-break readback after the carrier + * release. Off by default - it is the r1374 suspect. Skipping it does + * not skip the live-gen promotion (that keys on the engine GP_GET + * fetch witness); the build site still gates the calls. + * - build (default 1): the pre-doorbell readback that authorizes the + * calls-bearing launch. Kept on; flip to 0 at runtime to isolate it. + */ +static bool gsp_phys_rmcall_gr_mme_iram_gate_break; +module_param_named(sema_gl_mme_iram_gate_break, + gsp_phys_rmcall_gr_mme_iram_gate_break, bool, 0644); +MODULE_PARM_DESC(sema_gl_mme_iram_gate_break, + "Do the IRAM-gate readback at the launch poll break (writes the debug port while the carrier is finishing; default 0 - the r1374 FIFO-fill suspect)"); + +static bool gsp_phys_rmcall_gr_mme_iram_gate_build = true; +module_param_named(sema_gl_mme_iram_gate_build, + gsp_phys_rmcall_gr_mme_iram_gate_build, bool, 0644); +MODULE_PARM_DESC(sema_gl_mme_iram_gate_build, + "Do the IRAM-gate readback in the launch builder before the doorbell (default 1; the calls-authorizing check)"); + +/* * SESSION 153-CONTINUED-107: separate knob for the per-launch chronology * probe lines. They write the MME debug port DURING a live launch, and the * first three probe-bearing cycles (r1369..r1371) all parked the engine on @@ -20289,11 +20322,12 @@ static u32 gsp_phys_rmcall_build_gr_launch(u32 *pb, * macro entry) instead of drawing. Only meaningful on the * packed path (the pack image is the comparator). */ - if (!mme_hold_calls && pl && pl_n && pl_gen && - READ_ONCE(gsp_phys_rmcall_gr_mme_prelude) && - READ_ONCE(gsp_phys_rmcall_gr_mme_hold_calls) && - READ_ONCE(gsp_phys_rmcall_gr_mme_prelude_pack) && - READ_ONCE(gsp_phys_rmcall_gr_mme_iram_gate)) { + if (!mme_hold_calls && pl && pl_n && pl_gen && + READ_ONCE(gsp_phys_rmcall_gr_mme_prelude) && + READ_ONCE(gsp_phys_rmcall_gr_mme_hold_calls) && + READ_ONCE(gsp_phys_rmcall_gr_mme_prelude_pack) && + READ_ONCE(gsp_phys_rmcall_gr_mme_iram_gate) && + READ_ONCE(gsp_phys_rmcall_gr_mme_iram_gate_build)) { void __iomem *gbar0 = gsp_phys_gpu_bar0(); if (gbar0 && @@ -28020,6 +28054,7 @@ gr_page_unmapped: READ_ONCE(gsp_phys_gr_mme_pending_gen) && READ_ONCE(gsp_phys_rmcall_gr_mme_prelude_pack) && READ_ONCE(gsp_phys_rmcall_gr_mme_iram_gate) && + READ_ONCE(gsp_phys_rmcall_gr_mme_iram_gate_break) && !gsp_phys_gr_mme_iram_gate(bar0, req->h_object, READ_ONCE(gsp_phys_gr_mme_pending_gen), "break")) |
