diff options
author | Lakshmanan M <lm@nvidia.com> | 2016-06-02 00:04:46 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-06-07 15:31:34 -0400 |
commit | 6299b00beb9dabdd53c211b02658d022827b3232 (patch) | |
tree | 941d8dd8aae8f7f8c73329e182984c36a5a9bf88 /drivers/gpu/nvgpu/gk20a/pmu_gk20a.c | |
parent | 3d7263d3cafdcfc57a6d6b9f829562845d116294 (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.c | 38 |
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; |