diff options
Diffstat (limited to 'kernel/gsp_rm_emulation.c')
| -rw-r--r-- | kernel/gsp_rm_emulation.c | 19 |
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, |
