diff options
Diffstat (limited to 'kernel/gsp_rm_emulation.c')
| -rw-r--r-- | kernel/gsp_rm_emulation.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/kernel/gsp_rm_emulation.c b/kernel/gsp_rm_emulation.c index d1f17cb..842d952 100644 --- a/kernel/gsp_rm_emulation.c +++ b/kernel/gsp_rm_emulation.c @@ -1111,6 +1111,54 @@ static void gsp_rm_handle_kgr_get_global_sm_order(struct gsp_emu_context *ctx, TU104_NUM_SM, TU104_NUM_TPC); } +/* + * STATIC_KGR_GET_INFO (0x20800a2a) + * + * Returns the GR infoList the driver caches as pGrInfo and reads by index - + * critically MAX_SUBCONTEXT_COUNT (0x2c): zero makes the channel group's + * numMax==0 and channel allocation asserts (numMax == numFree && numMax != 0 + * -> NV_ERR_INVALID_STATE -> "No devices"). Fill TU104 litter topology + + * subcontext counts (MAX_VEID_COUNT_INIT = 64). engineInfo[8] x infoList[58] + * of {index,data} = 3712 bytes; engine 0 = GR0. + */ +static void gsp_rm_handle_kgr_get_info(struct gsp_emu_context *ctx, + u32 sequence, + u32 *out_status, + u8 *out_params, + u32 *out_params_size) +{ + struct tu104_gr_static_info *info = + (struct tu104_gr_static_info *)out_params; /* engine 0 */ + u32 i; + + memset(out_params, 0, TU104_GR_INFO_MAX_ENGINES * + sizeof(struct tu104_gr_static_info)); + + /* positional array: index field = position for every entry */ + for (i = 0; i < TU104_GR_INFO_MAX_SIZE; i++) + info->infoList[i].index = i; + + /* TU104 litter topology: 6 GPC x 4 TPC x 2 SM = 48 SMs */ + info->infoList[TU104_GR_INFO_IDX_LITTER_NUM_GPCS].data = TU104_NUM_GPC; + info->infoList[TU104_GR_INFO_IDX_LITTER_NUM_TPC_PER_GPC].data = TU104_TPC_PER_GPC; + info->infoList[TU104_GR_INFO_IDX_GPU_CORE_COUNT].data = TU104_NUM_SM; + info->infoList[TU104_GR_INFO_IDX_LITTER_NUM_SM_PER_TPC].data = TU104_SM_PER_TPC; + info->infoList[TU104_GR_INFO_IDX_FAMILY_MAX_TPC_PER_GPC].data = TU104_TPC_PER_GPC; + + /* subcontext (VEID) counts: 64 per hw */ + info->infoList[TU104_GR_INFO_IDX_MAX_SUBCONTEXT_COUNT].data = TU104_MAX_SUBCONTEXT_COUNT; + info->infoList[TU104_GR_INFO_IDX_MAX_LEGACY_SUBCONTEXT_COUNT].data = TU104_MAX_SUBCONTEXT_COUNT; + info->infoList[TU104_GR_INFO_IDX_MAX_PER_ENGINE_SUBCONTEXT_COUNT].data = TU104_MAX_SUBCONTEXT_COUNT; + + *out_params_size = TU104_GR_INFO_MAX_ENGINES * + sizeof(struct tu104_gr_static_info); + *out_status = 0; + + nv_vgpu_info(ctx->vgpu, "GSPRM: KGR_GET_INFO -> GR0 litter %uGPC/%uTPC/%uSM, maxSubctx=%u", + TU104_NUM_GPC, TU104_TPC_PER_GPC, TU104_NUM_SM, + TU104_MAX_SUBCONTEXT_COUNT); +} + static void gsp_rm_handle_rm_control(struct gsp_emu_context *ctx, const u8 *elem, u32 sequence) { @@ -1205,6 +1253,12 @@ static void gsp_rm_handle_rm_control(struct gsp_emu_context *ctx, reply + GSP_RM_CTRL_HDR_SIZE, &out_params_size); break; + case TU104_CTRL_STATIC_KGR_GET_INFO: + gsp_rm_handle_kgr_get_info(ctx, sequence, + &out_status, + reply + GSP_RM_CTRL_HDR_SIZE, &out_params_size); + break; + default: /* Unknown control command - return success with zeroed params. * Do NOT echo the request: pure queries pass uninitialized |
