summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2015-09-21 17:57:54 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:52:07 -0500
commit1ef64423f91a4add0351bed5bf55577768ccebf2 (patch)
tree621703b18f37fed8ff66b85cb015c238984ff1e9 /drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
parente51dfa9d61048d0c38e93e3873aa7c74b922a3a9 (diff)
gpu: nvgpu: ELPG init & statistics update
- Required init param to start elpg - change in statistics dump Bug 1684939 Change-Id: Icc482c08303d0870ec2e1c18a845074968b15e77 Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: http://git-master/r/802455 Reviewed-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Tested-by: Seshendra Gadagottu <sgadagottu@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/806194 Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/pmu_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/pmu_gp10b.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c b/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
index a4d7a0f7..6832bf41 100644
--- a/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/pmu_gp10b.c
@@ -202,6 +202,60 @@ static int gp10b_load_falcon_ucode(struct gk20a *g, u32 falconidmask)
202 return 0; 202 return 0;
203} 203}
204 204
205static void pmu_handle_gr_param_msg(struct gk20a *g, struct pmu_msg *msg,
206 void *param, u32 handle, u32 status)
207{
208 gk20a_dbg_fn("");
209
210 if (status != 0) {
211 gk20a_err(dev_from_gk20a(g), "GR PARAM cmd aborted");
212 /* TBD: disable ELPG */
213 return;
214 }
215
216 gp10b_dbg_pmu("GR PARAM is acknowledged from PMU %x \n",
217 msg->msg.pg.msg_type);
218
219 return;
220}
221
222static int gp10b_pg_gr_init(struct gk20a *g, u8 grfeaturemask)
223{
224 struct pmu_gk20a *pmu = &g->pmu;
225 struct pmu_cmd cmd;
226 u32 seq;
227
228 memset(&cmd, 0, sizeof(struct pmu_cmd));
229 cmd.hdr.unit_id = PMU_UNIT_PG;
230 cmd.hdr.size = PMU_CMD_HDR_SIZE +
231 sizeof(struct pmu_pg_cmd_gr_init_param);
232 cmd.cmd.pg.gr_init_param.cmd_type =
233 PMU_PG_CMD_ID_PG_PARAM;
234 cmd.cmd.pg.gr_init_param.sub_cmd_id =
235 PMU_PG_PARAM_CMD_GR_INIT_PARAM;
236 cmd.cmd.pg.gr_init_param.featuremask =
237 grfeaturemask;
238
239 gp10b_dbg_pmu("cmd post PMU_PG_CMD_ID_PG_PARAM %x", grfeaturemask);
240 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
241 pmu_handle_gr_param_msg, pmu, &seq, ~0);
242
243 return 0;
244}
245void gp10b_pmu_elpg_statistics(struct gk20a *g,
246 u32 *ingating_time, u32 *ungating_time, u32 *gating_cnt)
247{
248 struct pmu_gk20a *pmu = &g->pmu;
249 struct pmu_pg_stats_v1 stats;
250
251 pmu_copy_from_dmem(pmu, pmu->stat_dmem_offset,
252 (u8 *)&stats, sizeof(struct pmu_pg_stats_v1), 0);
253
254 *ingating_time = stats.total_sleep_timeus;
255 *ungating_time = stats.total_nonsleep_timeus;
256 *gating_cnt = stats.entry_count;
257}
258
205static int gp10b_pmu_setup_elpg(struct gk20a *g) 259static int gp10b_pmu_setup_elpg(struct gk20a *g)
206{ 260{
207 int ret = 0; 261 int ret = 0;
@@ -249,4 +303,6 @@ void gp10b_init_pmu_ops(struct gpu_ops *gops)
249 gops->pmu.lspmuwprinitdone = false; 303 gops->pmu.lspmuwprinitdone = false;
250 gops->pmu.fecsbootstrapdone = false; 304 gops->pmu.fecsbootstrapdone = false;
251 gops->pmu.write_dmatrfbase = gp10b_write_dmatrfbase; 305 gops->pmu.write_dmatrfbase = gp10b_write_dmatrfbase;
306 gops->pmu.pmu_elpg_statistics = gp10b_pmu_elpg_statistics;
307 gops->pmu.pmu_pg_grinit_param = gp10b_pg_gr_init;
252} 308}