diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-11-02 02:04:28 -0500 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-11-02 02:04:28 -0500 |
| commit | 07bc59da291be0da1e4416d89310716b62696b9f (patch) | |
| tree | 6eee26146a4f0e50447b4aac009af100f2162bb8 /kernel | |
| parent | 8df33f1f87e944959fb2dde01a0b9eb25598a24d (diff) | |
| download | open-iov-07bc59da291be0da1e4416d89310716b62696b9f.tar.gz open-iov-07bc59da291be0da1e4416d89310716b62696b9f.zip | |
vgsp: CONT-108 - sema_gl_mme_iram_gate_break (default 0) + sema_gl_mme_iram_gate_build (default 1) independently control the two gsp_phys_gr_mme_iram_gate() readback sites (poll-break ~28019, pre-doorbell builder ~20300; comment records r1374 healthy->FULL chronology + CONT-107 probe-park note) - TASK-1 SUPERSEDED: 'LOAD0 stall at slot 58' EXPLAINED+DISMISSED: no call to slot 58 exists (all 8 3D-raw windows CALL_MME_MACRO runs hit only lanes {0,2,34,39,40,48,51,57}; 0x39d0 CALL_MME_MACRO(58) ZERO times; SA complete MME-PRE-SA[57] entry=0x364 / [58] entry=0x3a3); word-exact: slot 57 = mmeCodeOGL_C597_LOAD_CONSTANT_BUFFER_BUG2548370 (63 instrs 0x364..0x3a2), slot 58 = mmeCodeOGL_C597_LOAD_CONSTANT_BUFFER_OFFSET (2 instrs 0x3a3..0x3a4); Mesa sim: slot-57 with real params ends after last instr 5/5 consumed -> next fetch 0x364+63=0x3a3 = observed pc = POST-COMPLETION FETCH POINTER not stalled LOAD0; INFO_EX=0x4 = DATA_FIFO_SIZE constant not exception; A/B VERDICT r1376 break=0 build=1 still wedges at first calls-bearing launch; r1377 BOTH SITES OFF still wedges but RECOVERS (WEDGE-RECOVER priv-error poison seen grfifo=0x1 self-cleared) -> debug-port readback NOT the wedge cause, wedge is IN THE FIRST WINDOW REPLAY ITSELF; FIRST NONZERO STORES r1377 output retirement wait 2/901 pages changed 214ms settled + GUEST-WIT retire 4/908 changed va=0x4500000 pa=0x5ac146000 pre=0x3fb2ca25c057d17b post=0x0 engine-authored writes; MME executed r1376 pc=931 ir=71cc0301,18c0034a,1c34238f; r1377 never started (pc_valid=0, gate off => no live promotion); GATE1 black - next: bisect wedge-causing window content at first window+live launch (r1377 config no readbacks): A/B keep_mask=0 nop_drop=all (ALL call runs dropped) vs default; wedge gone => executed macros' emitted methods (0x2390/0x34a4 CB writes) park FE; persists => non-call families (SURF-PRELUDE/SHADER-EXC 0x1528/SPH-REGION/SA-REARM) then bisect win_drop families; follow-up readback-free live-promotion trigger (MME pc!=0 witness) - SESSION 153 r1375-r1377
Diffstat (limited to 'kernel')
| -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")) |
