summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/gsp_sema_service.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/kernel/gsp_sema_service.c b/kernel/gsp_sema_service.c
index f758218..f98fa98 100644
--- a/kernel/gsp_sema_service.c
+++ b/kernel/gsp_sema_service.c
@@ -40791,6 +40791,32 @@ static void svc_pump_channels(struct nv_vgpu_device *vgpu)
if (ch->engine_type && ch->notified)
svc_ce_init_rel_author(vgpu, ch, true,
"userd-miss");
+ /*
+ * r1663: the X DDX's kick channel has no
+ * discoverable USERD (2-entry ring at a page
+ * end, FB userd never written), yet its ring
+ * PA resolves and entry 0 carries the
+ * class2d SET_NOTIFY target. Capture it from
+ * the ring head before stalling so the kick
+ * lane can author the completion the X
+ * server waits on.
+ */
+ if (!ch->engine_type && !ch->notify2d_va &&
+ ch->h_object >= 0xbfef0000u &&
+ ch->h_object <= 0xbfef00ffu && ring_pa) {
+ svc_kick_capture_arm(vgpu, ch, ring_pa,
+ ring_ap, 0);
+ /*
+ * The captured target is the class2d
+ * completion word; author the zeroed
+ * NvNotification the guest waits on
+ * (the ring walk that would carry the
+ * NOTIFY never runs without a USERD).
+ */
+ if (ch->notify2d_va)
+ (void)svc_notify2d_write(vgpu,
+ ch, true);
+ }
stalled = true;
continue;
}