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