summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gm20b
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2018-09-21 02:36:36 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-09-24 13:14:56 -0400
commite16843c2efdffa13c15cc0a014b2a5598cc2f4ec (patch)
tree2942e8a53e954ab30b564a3eb07efc8c10270e10 /drivers/gpu/nvgpu/gm20b
parent2a26075b8408b45d18920e3f4ca08a457b23a7e0 (diff)
gpu: nvgpu: read GPC mask from h/w
In gk20a_ctrl_ioctl_gpu_characteristics() we right now just calculate GPC mask in s/w and return to user space But this could give incorrect result as any GPC could be floorswept in h/w Add gops.fuse.fuse_status_opt_gpc() to read GPC floorsweep status from fuse Add gops.gr.get_gpc_mask() to get actual GPC mask from h/w Set these HALs only for dGPUs right now. Fuse register to read GPC mask is not yet supported in simulation and hence simulation boot fails These HALs will be set for iGPU once simulation issue is resolved Use gops.gr.get_gpc_mask() if it is defined in gk20a_ctrl_ioctl_gpu_characteristics() to send the actual GPC mask to user space Jira NVGPUT-132 Change-Id: I3b552de07883328fcfa41d4334ec0d777e04bdd3 Signed-off-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1822811 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b')
-rw-r--r--drivers/gpu/nvgpu/gm20b/gr_gm20b.c17
-rw-r--r--drivers/gpu/nvgpu/gm20b/gr_gm20b.h1
2 files changed, 18 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
index 368c9321..c67f7870 100644
--- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
+++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.c
@@ -550,6 +550,23 @@ void gr_gm20b_get_sm_dsm_perf_ctrl_regs(struct gk20a *g,
550 ctxsw_prog_extended_sm_dsm_perf_counter_control_register_stride_v(); 550 ctxsw_prog_extended_sm_dsm_perf_counter_control_register_stride_v();
551} 551}
552 552
553u32 gr_gm20b_get_gpc_mask(struct gk20a *g)
554{
555 u32 val;
556 struct gr_gk20a *gr = &g->gr;
557
558 /*
559 * For register NV_FUSE_STATUS_OPT_GPC a set bit with index i indicates
560 * corresponding GPC is floorswept
561 * But for s/w mask a set bit means GPC is enabled and it is disabled
562 * otherwise
563 * Hence toggle the bits of register value to get s/w mask
564 */
565 val = g->ops.fuse.fuse_status_opt_gpc(g);
566
567 return (~val) & (BIT32(gr->max_gpc_count) - 1U);
568}
569
553u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index) 570u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index)
554{ 571{
555 u32 val; 572 u32 val;
diff --git a/drivers/gpu/nvgpu/gm20b/gr_gm20b.h b/drivers/gpu/nvgpu/gm20b/gr_gm20b.h
index 7402478d..084b6157 100644
--- a/drivers/gpu/nvgpu/gm20b/gr_gm20b.h
+++ b/drivers/gpu/nvgpu/gm20b/gr_gm20b.h
@@ -83,6 +83,7 @@ void gr_gm20b_get_sm_dsm_perf_ctrl_regs(struct gk20a *g,
83 u32 *ctrl_register_stride); 83 u32 *ctrl_register_stride);
84u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index); 84u32 gr_gm20b_get_gpc_tpc_mask(struct gk20a *g, u32 gpc_index);
85void gr_gm20b_set_gpc_tpc_mask(struct gk20a *g, u32 gpc_index); 85void gr_gm20b_set_gpc_tpc_mask(struct gk20a *g, u32 gpc_index);
86u32 gr_gm20b_get_gpc_mask(struct gk20a *g);
86void gr_gm20b_load_tpc_mask(struct gk20a *g); 87void gr_gm20b_load_tpc_mask(struct gk20a *g);
87void gr_gm20b_program_sm_id_numbering(struct gk20a *g, 88void gr_gm20b_program_sm_id_numbering(struct gk20a *g,
88 u32 gpc, u32 tpc, u32 smid); 89 u32 gpc, u32 tpc, u32 smid);