summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
diff options
context:
space:
mode:
authorLakshmanan M <lm@nvidia.com>2016-06-02 00:04:46 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-06-07 15:31:34 -0400
commit6299b00beb9dabdd53c211b02658d022827b3232 (patch)
tree941d8dd8aae8f7f8c73329e182984c36a5a9bf88 /drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
parent3d7263d3cafdcfc57a6d6b9f829562845d116294 (diff)
gpu: nvgpu: Add multiple engine and runlist support
This CL covers the following modification, 1) Added multiple engine_info support 2) Added multiple runlist_info support 3) Initial changes for ASYNC CE support 4) Added ASYNC CE interrupt handling support for gm206 GPU family 5) Added generic mechanism to identify the CE engine pri_base address for gm206 (CE0, CE1 and CE2) 6) Removed hard coded engine_id logic and made generic way 7) Code cleanup for readability JIRA DNVGPU-26 Change-Id: I2c3846c40bcc8d10c2dfb225caa4105fc9123b65 Signed-off-by: Lakshmanan M <lm@nvidia.com> Reviewed-on: http://git-master/r/1155963 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/pmu_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/pmu_gk20a.c38
1 files changed, 27 insertions, 11 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
index bca57585..f6e2df00 100644
--- a/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/pmu_gk20a.c
@@ -3061,8 +3061,12 @@ int gk20a_init_pmu_bind_fecs(struct gk20a *g)
3061 struct pmu_cmd cmd; 3061 struct pmu_cmd cmd;
3062 u32 desc; 3062 u32 desc;
3063 int err = 0; 3063 int err = 0;
3064 u32 gr_engine_id;
3065
3064 gk20a_dbg_fn(""); 3066 gk20a_dbg_fn("");
3065 3067
3068 gr_engine_id = gk20a_fifo_get_gr_engine_id(g);
3069
3066 memset(&cmd, 0, sizeof(struct pmu_cmd)); 3070 memset(&cmd, 0, sizeof(struct pmu_cmd));
3067 cmd.hdr.unit_id = PMU_UNIT_PG; 3071 cmd.hdr.unit_id = PMU_UNIT_PG;
3068 cmd.hdr.size = PMU_CMD_HDR_SIZE + 3072 cmd.hdr.size = PMU_CMD_HDR_SIZE +
@@ -3070,7 +3074,7 @@ int gk20a_init_pmu_bind_fecs(struct gk20a *g)
3070 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_cmd_type(&cmd.cmd.pg, 3074 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_cmd_type(&cmd.cmd.pg,
3071 PMU_PG_CMD_ID_ENG_BUF_LOAD); 3075 PMU_PG_CMD_ID_ENG_BUF_LOAD);
3072 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_engine_id(&cmd.cmd.pg, 3076 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_engine_id(&cmd.cmd.pg,
3073 ENGINE_GR_GK20A); 3077 gr_engine_id);
3074 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_idx(&cmd.cmd.pg, 3078 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_idx(&cmd.cmd.pg,
3075 PMU_PGENG_GR_BUFFER_IDX_FECS); 3079 PMU_PGENG_GR_BUFFER_IDX_FECS);
3076 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_size(&cmd.cmd.pg, 3080 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_size(&cmd.cmd.pg,
@@ -3095,6 +3099,9 @@ static void pmu_setup_hw_load_zbc(struct gk20a *g)
3095 struct pmu_gk20a *pmu = &g->pmu; 3099 struct pmu_gk20a *pmu = &g->pmu;
3096 struct pmu_cmd cmd; 3100 struct pmu_cmd cmd;
3097 u32 desc; 3101 u32 desc;
3102 u32 gr_engine_id;
3103
3104 gr_engine_id = gk20a_fifo_get_gr_engine_id(g);
3098 3105
3099 memset(&cmd, 0, sizeof(struct pmu_cmd)); 3106 memset(&cmd, 0, sizeof(struct pmu_cmd));
3100 cmd.hdr.unit_id = PMU_UNIT_PG; 3107 cmd.hdr.unit_id = PMU_UNIT_PG;
@@ -3103,7 +3110,7 @@ static void pmu_setup_hw_load_zbc(struct gk20a *g)
3103 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_cmd_type(&cmd.cmd.pg, 3110 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_cmd_type(&cmd.cmd.pg,
3104 PMU_PG_CMD_ID_ENG_BUF_LOAD); 3111 PMU_PG_CMD_ID_ENG_BUF_LOAD);
3105 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_engine_id(&cmd.cmd.pg, 3112 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_engine_id(&cmd.cmd.pg,
3106 ENGINE_GR_GK20A); 3113 gr_engine_id);
3107 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_idx(&cmd.cmd.pg, 3114 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_idx(&cmd.cmd.pg,
3108 PMU_PGENG_GR_BUFFER_IDX_ZBC); 3115 PMU_PGENG_GR_BUFFER_IDX_ZBC);
3109 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_size(&cmd.cmd.pg, 3116 g->ops.pmu_ver.pg_cmd_eng_buf_load_set_buf_size(&cmd.cmd.pg,
@@ -3288,20 +3295,23 @@ static int pmu_init_powergating(struct gk20a *g)
3288 struct pmu_gk20a *pmu = &g->pmu; 3295 struct pmu_gk20a *pmu = &g->pmu;
3289 struct pmu_cmd cmd; 3296 struct pmu_cmd cmd;
3290 u32 seq; 3297 u32 seq;
3298 u32 gr_engine_id;
3291 3299
3292 gk20a_dbg_fn(""); 3300 gk20a_dbg_fn("");
3293 3301
3302 gr_engine_id = gk20a_fifo_get_gr_engine_id(g);
3303
3294 if (tegra_cpu_is_asim()) { 3304 if (tegra_cpu_is_asim()) {
3295 /* TBD: calculate threshold for silicon */ 3305 /* TBD: calculate threshold for silicon */
3296 gk20a_writel(g, pwr_pmu_pg_idlefilth_r(ENGINE_GR_GK20A), 3306 gk20a_writel(g, pwr_pmu_pg_idlefilth_r(gr_engine_id),
3297 PMU_PG_IDLE_THRESHOLD_SIM); 3307 PMU_PG_IDLE_THRESHOLD_SIM);
3298 gk20a_writel(g, pwr_pmu_pg_ppuidlefilth_r(ENGINE_GR_GK20A), 3308 gk20a_writel(g, pwr_pmu_pg_ppuidlefilth_r(gr_engine_id),
3299 PMU_PG_POST_POWERUP_IDLE_THRESHOLD_SIM); 3309 PMU_PG_POST_POWERUP_IDLE_THRESHOLD_SIM);
3300 } else { 3310 } else {
3301 /* TBD: calculate threshold for silicon */ 3311 /* TBD: calculate threshold for silicon */
3302 gk20a_writel(g, pwr_pmu_pg_idlefilth_r(ENGINE_GR_GK20A), 3312 gk20a_writel(g, pwr_pmu_pg_idlefilth_r(gr_engine_id),
3303 PMU_PG_IDLE_THRESHOLD); 3313 PMU_PG_IDLE_THRESHOLD);
3304 gk20a_writel(g, pwr_pmu_pg_ppuidlefilth_r(ENGINE_GR_GK20A), 3314 gk20a_writel(g, pwr_pmu_pg_ppuidlefilth_r(gr_engine_id),
3305 PMU_PG_POST_POWERUP_IDLE_THRESHOLD); 3315 PMU_PG_POST_POWERUP_IDLE_THRESHOLD);
3306 } 3316 }
3307 3317
@@ -3316,7 +3326,7 @@ static int pmu_init_powergating(struct gk20a *g)
3316 cmd.hdr.unit_id = PMU_UNIT_PG; 3326 cmd.hdr.unit_id = PMU_UNIT_PG;
3317 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd); 3327 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
3318 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD; 3328 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
3319 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A; 3329 cmd.cmd.pg.elpg_cmd.engine_id = gr_engine_id;
3320 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_INIT; 3330 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_INIT;
3321 3331
3322 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_INIT"); 3332 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_INIT");
@@ -3329,7 +3339,7 @@ static int pmu_init_powergating(struct gk20a *g)
3329 cmd.hdr.unit_id = PMU_UNIT_PG; 3339 cmd.hdr.unit_id = PMU_UNIT_PG;
3330 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_stat); 3340 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_stat);
3331 cmd.cmd.pg.stat.cmd_type = PMU_PG_CMD_ID_PG_STAT; 3341 cmd.cmd.pg.stat.cmd_type = PMU_PG_CMD_ID_PG_STAT;
3332 cmd.cmd.pg.stat.engine_id = ENGINE_GR_GK20A; 3342 cmd.cmd.pg.stat.engine_id = gr_engine_id;
3333 cmd.cmd.pg.stat.sub_cmd_id = PMU_PG_STAT_CMD_ALLOC_DMEM; 3343 cmd.cmd.pg.stat.sub_cmd_id = PMU_PG_STAT_CMD_ALLOC_DMEM;
3334 cmd.cmd.pg.stat.data = 0; 3344 cmd.cmd.pg.stat.data = 0;
3335 3345
@@ -3344,7 +3354,7 @@ static int pmu_init_powergating(struct gk20a *g)
3344 cmd.hdr.unit_id = PMU_UNIT_PG; 3354 cmd.hdr.unit_id = PMU_UNIT_PG;
3345 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd); 3355 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
3346 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD; 3356 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
3347 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A; 3357 cmd.cmd.pg.elpg_cmd.engine_id = gr_engine_id;
3348 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_DISALLOW; 3358 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_DISALLOW;
3349 3359
3350 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_DISALLOW"); 3360 gk20a_dbg_pmu("cmd post PMU_PG_ELPG_CMD_DISALLOW");
@@ -4429,14 +4439,17 @@ static int gk20a_pmu_enable_elpg_locked(struct gk20a *g)
4429 struct pmu_gk20a *pmu = &g->pmu; 4439 struct pmu_gk20a *pmu = &g->pmu;
4430 struct pmu_cmd cmd; 4440 struct pmu_cmd cmd;
4431 u32 seq, status; 4441 u32 seq, status;
4442 u32 gr_engine_id;
4432 4443
4433 gk20a_dbg_fn(""); 4444 gk20a_dbg_fn("");
4434 4445
4446 gr_engine_id = gk20a_fifo_get_gr_engine_id(g);
4447
4435 memset(&cmd, 0, sizeof(struct pmu_cmd)); 4448 memset(&cmd, 0, sizeof(struct pmu_cmd));
4436 cmd.hdr.unit_id = PMU_UNIT_PG; 4449 cmd.hdr.unit_id = PMU_UNIT_PG;
4437 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd); 4450 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
4438 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD; 4451 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
4439 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A; 4452 cmd.cmd.pg.elpg_cmd.engine_id = gr_engine_id;
4440 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_ALLOW; 4453 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_ALLOW;
4441 4454
4442 /* no need to wait ack for ELPG enable but set pending to sync 4455 /* no need to wait ack for ELPG enable but set pending to sync
@@ -4503,9 +4516,12 @@ int gk20a_pmu_disable_elpg(struct gk20a *g)
4503 struct pmu_cmd cmd; 4516 struct pmu_cmd cmd;
4504 u32 seq; 4517 u32 seq;
4505 int ret = 0; 4518 int ret = 0;
4519 u32 gr_engine_id;
4506 4520
4507 gk20a_dbg_fn(""); 4521 gk20a_dbg_fn("");
4508 4522
4523 gr_engine_id = gk20a_fifo_get_gr_engine_id(g);
4524
4509 if (!support_gk20a_pmu(g->dev)) 4525 if (!support_gk20a_pmu(g->dev))
4510 return ret; 4526 return ret;
4511 4527
@@ -4553,7 +4569,7 @@ int gk20a_pmu_disable_elpg(struct gk20a *g)
4553 cmd.hdr.unit_id = PMU_UNIT_PG; 4569 cmd.hdr.unit_id = PMU_UNIT_PG;
4554 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd); 4570 cmd.hdr.size = PMU_CMD_HDR_SIZE + sizeof(struct pmu_pg_cmd_elpg_cmd);
4555 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD; 4571 cmd.cmd.pg.elpg_cmd.cmd_type = PMU_PG_CMD_ID_ELPG_CMD;
4556 cmd.cmd.pg.elpg_cmd.engine_id = ENGINE_GR_GK20A; 4572 cmd.cmd.pg.elpg_cmd.engine_id = gr_engine_id;
4557 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_DISALLOW; 4573 cmd.cmd.pg.elpg_cmd.cmd = PMU_PG_ELPG_CMD_DISALLOW;
4558 4574
4559 pmu->elpg_stat = PMU_ELPG_STAT_OFF_PENDING; 4575 pmu->elpg_stat = PMU_ELPG_STAT_OFF_PENDING;