diff options
| author | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-11-13 08:17:09 -0500 |
|---|---|---|
| committer | Arthur Hanson Rasmusson <arthur@vgpu.io> | 2026-11-13 08:17:09 -0500 |
| commit | c79f80cc1a49d091d20581541d9a82a37d6303d4 (patch) | |
| tree | df14562c18547f050b9a52d05406c3e986d3ebac | |
| parent | ac741b2a993d4ff8f4b67e385df00d1a58fe3a4f (diff) | |
| download | open-iov-c79f80cc1a49d091d20581541d9a82a37d6303d4.tar.gz open-iov-c79f80cc1a49d091d20581541d9a82a37d6303d4.zip | |
vgsp: eng15 diagnostics - 3D window 48->256, WINPROBE 64->2048, NOWRITE-PBDMA dump
Diag-only commit (eng15 receipts: /tmp/opencode/eng15-receipts-c260.txt).
- gr3d_win_log 48 -> 256: keep the raw 3D window dump for the gl_frames-era
replays (the 48/boot budget was consumed by earlier launches).
- winprobe_log 64 -> 2048: keep WINPROBE samples for every stream3d launch.
- NEW NOWRITE-PBDMA dump (stream3d-only, 256/boot): all 12 PBDMA instances'
intr0/gp_put/pbfetch/off-in-block/hdr/pbcnt at the zero-write verdict.
Produced the decisive c260 data: pbfetch == 0x101000+words*4 exactly
(deposit fully fetched per launch), intr0=0.
No behaviour change; logging only.
| -rw-r--r-- | kernel/gsp_phys_booter.c | 65 |
1 files changed, 63 insertions, 2 deletions
diff --git a/kernel/gsp_phys_booter.c b/kernel/gsp_phys_booter.c index f1cd2cb..8e3f25f 100644 --- a/kernel/gsp_phys_booter.c +++ b/kernel/gsp_phys_booter.c @@ -30982,7 +30982,9 @@ gr_page_unmapped: static u32 gr3d_win_log; u32 wi; - if (gr3d_win_log < 48) { + /* eng15: 48/boot was consumed before the gl_frames + * replays; keep the raw window on record for them. */ + if (gr3d_win_log < 256) { gr3d_win_log++; pr_info("vgsp-gr: 3D window dump h=0x%x push=0x%llx words=%u\n", req->h_object, req->push_va, win3d_n); @@ -31744,7 +31746,15 @@ gr_page_unmapped: static u32 winprobe_log; u32 pi; - if (winprobe_log < 64) { + /* + * eng15: the 64/boot budget was consumed by X's + * launch train before the gl_frames replays, so the + * one witness that localizes a stalled walk (pbfetch + * vs the module block range) never fired for the + * launches under investigation. Raised so every + * stream3d launch keeps both samples. + */ + if (winprobe_log < 2048) { winprobe_log++; pr_info("vgsp-gr: WINPROBE +%ums push=0x%llx words=%u block_dma=0x%llx grfifo=%08x trapped=%08x trapped_lo=%08x\n", sked_tick * GSP_PHYS_RMCALL_POLL_MS, @@ -32931,6 +32941,57 @@ gr_page_unmapped: READ_ONCE(gsp_phys_gr_nw_streak) + 1u, gsp_phys_gr_wedge_quiet, gsp_phys_gr_wedge_heals); + /* + * eng15: PBDMA state at the zero-write verdict. The + * WINPROBE's 150 ms/1.2 s pbfetch samples are budget + * bounded; this one is stream3d-only, bounded + * 256/boot, and names WHERE the PBDMA walk of the + * just-accepted replay stopped when the stores never + * happened: off inside [0,words) = still walking our + * block; off >= words = whole stream decoded and the + * stall is downstream; no fetch at all = the entry + * was never consumed. + */ + if (stream3d && bar0) { + static u32 nwpd_log; + u32 pi2; + + if (nwpd_log < 256) { + nwpd_log++; + for (pi2 = 0; pi2 < 12; pi2++) { + u32 b2 = 0x40000u + + pi2 * 0x2000u; + u32 i0 = ioread32(bar0 + b2 + + 0x108u); + u32 gpf = ioread32(bar0 + b2 + + 0x050u); + u32 pbl = ioread32(bar0 + b2 + + 0x054u); + u32 pbh = ioread32(bar0 + b2 + + 0x058u); + u64 f64 = ((u64)(pbh & 0xffu) + << 32) | + (u64)(pbl & ~3u); + s64 wo = -1; + + if (!i0 && !gpf && !pbl && + !pbh) + continue; + if (gsp_phys_gr_last_pb_dma && + f64 >= gsp_phys_gr_last_pb_dma && + f64 < gsp_phys_gr_last_pb_dma + + (u64)gsp_phys_gr_last_words * 4u) + wo = (s64)(f64 - + gsp_phys_gr_last_pb_dma) / 4; + pr_warn("vgsp-gr: NOWRITE-PBDMA P%u intr0=%08x gp_put=%u pbfetch=0x%llx off=%lld hdr=%08x pbcnt=%08x h=0x%x push=0x%llx words=%u\n", + pi2, i0, gpf, f64, wo, + ioread32(bar0 + b2 + 0x118u), + ioread32(bar0 + b2 + 0x088u), + req->h_object, + req->push_va, words); + } + } + } /* * m180 (lottery discriminator, agent-order H1/H2). |
