summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_rm_emulation.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_rm_emulation.c')
-rw-r--r--kernel/gsp_rm_emulation.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/kernel/gsp_rm_emulation.c b/kernel/gsp_rm_emulation.c
index 957729b..b928faf 100644
--- a/kernel/gsp_rm_emulation.c
+++ b/kernel/gsp_rm_emulation.c
@@ -4273,6 +4273,25 @@ static void gsp_rm_handle_rm_alloc(struct gsp_emu_context *ctx,
memcpy(&rp[3], reply + GSPRM_ALLOC_HDR_SIZE + 12, 4);
gsp_rm_grobj_note(ho, class_id);
+ /*
+ * eng23 (CONT.483): the RM record is the direct-GL lane's
+ * class bind. The X lane carries its C597 SET_OBJECT inline
+ * in the init push (hw class bind, sticky); the direct-GL
+ * client's channel (0xbeef01xx family) binds the class
+ * channel-side - it allocates TURING_A (0xc597) with
+ * hParent = its own channel (measured: alloc 0xc597
+ * h=0xbeef9097 parent=0xbeef0100 client=0xc1d0001a, twice,
+ * while 0xbeef0100 was a registered channel with engine 0)
+ * and never re-emits a bind push. Without the note the
+ * section recognizer's sticky-attachment gate drops every
+ * one of that channel's pushes and no C597 section is ever
+ * opened (CONT.481/482: 0 sections for 0xbeef0100 on a boot
+ * where the whole setup push was readable). Report hParent
+ * to the sema service, which applies it as the sticky 3D
+ * bind on its own thread.
+ */
+ if (hp && hp != hc)
+ gsp_sema_service_gl_attach(hp, 0);
if (rm->gr3d_alloc_log < GSPRM_GR3D_LOG_MAX) {
rm->gr3d_alloc_log++;
nv_vgpu_info(ctx->vgpu,