mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
gpu: nvgpu: Expose more config info for SM
This patch exposes the following fields to userspace for each SM, indexed by its global SM index: - Logical GPC index - Virtual GPC index - Local Logical TPC index - Global Logical TPC index - Migratable TPC index - Local SM index Bug 4115114 Change-Id: Ie596c8f617d46d7b6f1563f7afb210b59f250f3c Signed-off-by: Martin Radev <mradev@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2909784 Reviewed-by: Rajesh Devaraj <rdevaraj@nvidia.com> Reviewed-by: Ankur Kishore <ankkishore@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> GVS: Gerrit_Virtual_Submit <buildbot_gerritrpt@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
d6359b5adc
commit
78bef566dd
@@ -1151,31 +1151,65 @@ static int gk20a_ctrl_vsm_mapping(struct gk20a *g,
|
|||||||
struct nvgpu_gr_config *gr_config, struct nvgpu_gpu_vsms_mapping *args)
|
struct nvgpu_gr_config *gr_config, struct nvgpu_gpu_vsms_mapping *args)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
u32 gpc_max_count;
|
||||||
u32 no_of_sm = nvgpu_gr_config_get_no_of_sm(gr_config);
|
u32 no_of_sm = nvgpu_gr_config_get_no_of_sm(gr_config);
|
||||||
size_t write_size = no_of_sm *
|
size_t write_size = no_of_sm *
|
||||||
sizeof(struct nvgpu_gpu_vsms_mapping_entry);
|
sizeof(struct nvgpu_gpu_vsms_mapping_entry);
|
||||||
struct nvgpu_gpu_vsms_mapping_entry *vsms_buf;
|
struct nvgpu_gpu_vsms_mapping_entry *vsms_buf;
|
||||||
u32 i;
|
u32 i;
|
||||||
|
u32 gpc_logical_index;
|
||||||
|
u32 gpc_virtual_index;
|
||||||
|
u32 tpc_local_logical_index;
|
||||||
|
u32 tpc_global_logical_index;
|
||||||
|
u32 tpc_migratable_index;
|
||||||
|
u32 sm_local_id;
|
||||||
|
|
||||||
|
gpc_max_count = nvgpu_gr_config_get_max_gpc_count(gr_config);
|
||||||
|
|
||||||
vsms_buf = nvgpu_kzalloc(g, write_size);
|
vsms_buf = nvgpu_kzalloc(g, write_size);
|
||||||
if (vsms_buf == NULL)
|
if (vsms_buf == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
for (i = 0; i < no_of_sm; i++) {
|
for (i = 0; i < no_of_sm; i++) {
|
||||||
struct nvgpu_sm_info *sm_info =
|
struct nvgpu_sm_info *sm_info = nvgpu_gr_config_get_sm_info(gr_config, i);
|
||||||
nvgpu_gr_config_get_sm_info(gr_config, i);
|
|
||||||
|
|
||||||
vsms_buf[i].gpc_index =
|
gpc_logical_index = nvgpu_gr_config_get_sm_info_gpc_index(sm_info);
|
||||||
nvgpu_gr_config_get_sm_info_gpc_index(sm_info);
|
gpc_virtual_index = nvgpu_gr_config_get_sm_info_virtual_gpc_index(sm_info);
|
||||||
if (g->ops.gr.init.get_nonpes_aware_tpc)
|
if (g->ops.gr.init.get_nonpes_aware_tpc)
|
||||||
vsms_buf[i].tpc_index =
|
tpc_local_logical_index =
|
||||||
g->ops.gr.init.get_nonpes_aware_tpc(g,
|
g->ops.gr.init.get_nonpes_aware_tpc(g,
|
||||||
nvgpu_gr_config_get_sm_info_gpc_index(sm_info),
|
gpc_logical_index,
|
||||||
nvgpu_gr_config_get_sm_info_tpc_index(sm_info),
|
nvgpu_gr_config_get_sm_info_tpc_index(sm_info),
|
||||||
gr_config);
|
gr_config);
|
||||||
else
|
else
|
||||||
vsms_buf[i].tpc_index =
|
tpc_local_logical_index = nvgpu_gr_config_get_sm_info_tpc_index(sm_info);
|
||||||
nvgpu_gr_config_get_sm_info_tpc_index(sm_info);
|
tpc_global_logical_index = nvgpu_gr_config_get_sm_info_global_tpc_index(sm_info);
|
||||||
|
sm_local_id = nvgpu_gr_config_get_sm_info_sm_index(sm_info);
|
||||||
|
if (vsms_buf[i].gpc_virtual_index < gpc_max_count)
|
||||||
|
tpc_migratable_index = tpc_local_logical_index;
|
||||||
|
else {
|
||||||
|
/*
|
||||||
|
* The TPC migratable index is 0 for any Virtual GPC index >= the maximal number of GPCs.
|
||||||
|
*/
|
||||||
|
tpc_migratable_index = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpc_logical_index > U8_MAX ||
|
||||||
|
gpc_virtual_index > U8_MAX ||
|
||||||
|
tpc_local_logical_index > U8_MAX ||
|
||||||
|
tpc_global_logical_index > U8_MAX ||
|
||||||
|
tpc_migratable_index > U8_MAX ||
|
||||||
|
sm_local_id > U8_MAX) {
|
||||||
|
nvgpu_kfree(g, vsms_buf);
|
||||||
|
return -EOVERFLOW;
|
||||||
|
}
|
||||||
|
|
||||||
|
vsms_buf[i].gpc_logical_index = (u8)gpc_logical_index;
|
||||||
|
vsms_buf[i].gpc_virtual_index = (u8)gpc_virtual_index;
|
||||||
|
vsms_buf[i].tpc_local_logical_index = (u8)tpc_local_logical_index;
|
||||||
|
vsms_buf[i].tpc_global_logical_index = (u8)tpc_global_logical_index;
|
||||||
|
vsms_buf[i].sm_local_id = (u8)sm_local_id;
|
||||||
|
vsms_buf[i].tpc_migratable_index = (u8)tpc_migratable_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = copy_to_user((void __user *)(uintptr_t)
|
err = copy_to_user((void __user *)(uintptr_t)
|
||||||
|
|||||||
@@ -586,8 +586,23 @@ struct nvgpu_gpu_num_vsms {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct nvgpu_gpu_vsms_mapping_entry {
|
struct nvgpu_gpu_vsms_mapping_entry {
|
||||||
__u8 gpc_index;
|
/* Logical GPC index */
|
||||||
__u8 tpc_index;
|
__u8 gpc_logical_index;
|
||||||
|
|
||||||
|
/* Virtual GPC index */
|
||||||
|
__u8 gpc_virtual_index;
|
||||||
|
|
||||||
|
/* Local Logical index in TPC */
|
||||||
|
__u8 tpc_local_logical_index;
|
||||||
|
|
||||||
|
/* Global Logical index in GPU */
|
||||||
|
__u8 tpc_global_logical_index;
|
||||||
|
|
||||||
|
/* Local SM index in TPC */
|
||||||
|
__u8 sm_local_id;
|
||||||
|
|
||||||
|
/* Migratable TPC index */
|
||||||
|
__u8 tpc_migratable_index;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct nvgpu_gpu_vsms_mapping {
|
struct nvgpu_gpu_vsms_mapping {
|
||||||
|
|||||||
Reference in New Issue
Block a user