summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/gsp_phys_booter.c65
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).