summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_phys_booter.c
diff options
context:
space:
mode:
authorArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-13 08:17:09 -0500
committerArthur Hanson Rasmusson <arthur@vgpu.io>2026-11-13 08:17:09 -0500
commitc79f80cc1a49d091d20581541d9a82a37d6303d4 (patch)
treedf14562c18547f050b9a52d05406c3e986d3ebac /kernel/gsp_phys_booter.c
parentac741b2a993d4ff8f4b67e385df00d1a58fe3a4f (diff)
downloadopen-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.
Diffstat (limited to 'kernel/gsp_phys_booter.c')
-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).