summaryrefslogtreecommitdiffstats
path: root/kernel/gsp_rm_emulation.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/gsp_rm_emulation.h')
-rw-r--r--kernel/gsp_rm_emulation.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/kernel/gsp_rm_emulation.h b/kernel/gsp_rm_emulation.h
index 96ea16a..17154b7 100644
--- a/kernel/gsp_rm_emulation.h
+++ b/kernel/gsp_rm_emulation.h
@@ -45,10 +45,40 @@ struct gsp_emu_context;
#define GSPRM_RPC_FUNC_GSP_RM_CONTROL 76
#define GSPRM_RPC_FUNC_GSP_RM_ALLOC 103
#define GSPRM_RPC_FUNC_FREE 10
+#define GSPRM_RPC_FUNC_DUP_OBJECT 21
#define GSPRM_RPC_FUNC_UNLOADING_GUEST_DRIVER 47
#define GSPRM_RPC_FUNC_UPDATE_BAR_PDE 70
#define GSPRM_RPC_EVENT_POST_EVENT 0x1003
#define GSPRM_MAX_EVENTS 128
+/*
+ * CONT.438: bounded client memory-object table. GSP-client kernel channels
+ * pass a client-allocated USERD as hUserdMemory[subdev] (NV_CHANNEL_ALLOC_PARAMS
+ * @32), not as the userdMem memdesc (@168), so the channel alloc alone cannot
+ * name the USERD PA. Remember the memory-object ALLOCs by (hClient, hObject)
+ * and resolve the channel's handle later. Sized well above the handful of
+ * USERD objects live at once; retired slots are reused.
+ */
+#define GSPRM_MAX_MEM_OBJECTS 128
+
+/* Address-space tag for a remembered memory object (NV_ADDR_* values). */
+enum gsp_rm_mem_as {
+ GSPRM_MEM_AS_UNKNOWN = 0,
+ GSPRM_MEM_AS_SYSMEM = 1, /* NV_ADDR_SYSMEM: base is a guest PA */
+ GSPRM_MEM_AS_VIDMEM = 2, /* NV_ADDR_FBMEM: base is an FB offset */
+ GSPRM_MEM_AS_VIRTUAL = 3, /* VA range only; never a physical base */
+};
+
+struct gsp_rm_mem_object {
+ u32 h_object;
+ u32 h_client;
+ u32 h_parent;
+ u32 class_id;
+ u64 base; /* PA (sysmem), FB offset (vidmem), or VA */
+ u64 size;
+ u8 address_space; /* enum gsp_rm_mem_as */
+ bool valid;
+};
+
/* Max event records written between two replies (status-ring safety). */
#define GSPRM_EVENT_BURST_MAX 24
#define GSPRM_RPC_EVENT_GSP_INIT_DONE 0x1001
@@ -175,6 +205,8 @@ struct gsp_rm_emu {
u64 unknown_rpcs;
u32 alloc_dumps; /* raw GSP_RM_ALLOC dumps emitted */
u32 alloc_param_dumps; /* alloc param dumps emitted */
+ u32 gr3d_alloc_log; /* CONT.406 c597 alloc-reply witness lines */
+ u32 gr3d_free_log; /* CONT.406 c597 free-after witness lines */
u32 ctrl_param_dumps; /* control param dumps emitted */
u64 static_live; /* static-info replies carrying live identity */
u64 static_fallback; /* overlay requested, no snapshot served */
@@ -183,6 +215,10 @@ struct gsp_rm_emu {
u64 ctrl_fwd_fallback; /* forward attempt used emulation */
u64 ctrl_fwd_timeout; /* fallbacks caused by a backend timeout */
+ /* NV2080_CTRL_CMD_INTERNAL_INIT_USER_SHARED_DATA bookkeeping */
+ u64 rusd_phys_addr; /* last registered RUSD phys address */
+ bool rusd_init_seen; /* a registration was acknowledged */
+
/*
* NV01_EVENT objects (class 0x5, allocated via class 0x79 in the
* guest ABI). Each carries {hSrcResource, notifyIndex, data}; the
@@ -204,12 +240,58 @@ struct gsp_rm_emu {
u64 events_dropped;
u32 event_burst; /* event records written in the current window */
unsigned long event_burst_at; /* m171: burst window start (time-based reset) */
+
+ /*
+ * CONT.438: client memory objects observed through GSP_RM_ALLOC,
+ * keyed by (hClient, hObject), used to turn a channel's
+ * hUserdMemory[subdev] into a physical USERD base. All alloc/free
+ * handling is serialized on the emulation thread, so no lock.
+ */
+ struct gsp_rm_mem_object mem_objects[GSPRM_MAX_MEM_OBJECTS];
+ u32 mem_objects_n;
+ u32 mem_objects_next; /* eviction cursor when full */
+ u32 mem_object_logs; /* bounded mem-object witness budget */
+ u32 mem_object_evictions; /* bounded diagnostic counter */
};
+/*
+ * r576 DIAG: per-boot witness budget for GSP event-post payloads (default 0
+ * = off). Nonzero logs every EVENT_POST_EVENT record actually sent (slot,
+ * hClient, hEvent, notifyIndex, data, send rc) and the sentinel case of a
+ * post_all_events call that found nothing postable - the evidence needed
+ * when a client parks waiting for a completion wake-up that never arrives.
+ */
+extern unsigned gsp_rm_ev_log_max;
+
+/*
+ * r577 experiment knobs (runtime-writable; default 0 = legacy). See the
+ * definitions in gsp_rm_emulation.c: event record sequence, bNotifyList,
+ * hClient override - the A/B space for the guest-RM event drop.
+ */
+extern unsigned gsp_rm_ev_seq;
+extern unsigned gsp_rm_ev_nlist;
+extern unsigned gsp_rm_ev_cl;
+extern unsigned gsp_rm_ev_func;
+
int gsp_rm_emu_init(struct nv_vgpu_device *vgpu, struct gsp_emu_context *ctx);
void gsp_rm_emu_fini(struct gsp_emu_context *ctx);
int gsp_rm_post_channel_event(struct nv_vgpu_device *vgpu, u32 h_src);
+int gsp_rm_post_channel_event_force(struct nv_vgpu_device *vgpu, u32 h_src);
+/*
+ * r1765 strict variants: post only to events registered on h_src; a miss
+ * returns -ENOENT instead of running the all-events fallback (the display
+ * engine's retry pump re-posts a refused completion).
+ */
+int gsp_rm_post_channel_event_strict(struct nv_vgpu_device *vgpu, u32 h_src);
+int gsp_rm_post_channel_event_force_strict(struct nv_vgpu_device *vgpu,
+ u32 h_src);
int gsp_rm_force_post(struct nv_vgpu_device *vgpu, u32 idx);
+/*
+ * r623: deliver a synthetic OS_ERROR_LOG (0x1006) record to the guest's RM
+ * queue (the engine-fault report a real GSP sends). Debug/experiment only.
+ */
+int gsp_rm_send_os_error_log(struct nv_vgpu_device *vgpu, u32 except_type,
+ u32 runlist_id, u32 chid, const char *engine);
int gsp_rm_post_all_events(struct nv_vgpu_device *vgpu);
int gsp_rm_dump_state(struct nv_vgpu_device *vgpu);
int gsp_rm_scan_guest_ram(struct nv_vgpu_device *vgpu, u64 needle,