summaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/gsp_phys_booter.c45
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"))