summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorVijayakumar <vsubbu@nvidia.com>2015-08-04 07:44:54 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2015-09-16 12:44:00 -0400
commitb8faddfe2ad3d52837b0f766d74feb8e6d6f4ce5 (patch)
tree9cf25fcdd5e9ac2ff870f78c35213ce46b90ac7a /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parent2359f247d18fbde3220e463543193ab06f75fe81 (diff)
gpu: nvgpu: fix runlist update timeout handling
bug 1625901 1) disable ELPG before doing GR reset when runlist update times out 2) add mutex for GR reset to avoid multiple threads resetting GR 3) protect GR reset with FECS mutex so that no one else submits methods Change-Id: I02993fd1eabe6875ab1c58a40a06e6c79fcdeeae Signed-off-by: Vijayakumar <vsubbu@nvidia.com> Reviewed-on: http://git-master/r/793643 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
index 512a7d6b..0ae44c6f 100644
--- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
@@ -4320,12 +4320,6 @@ static int gr_gk20a_init_ctxsw(struct gk20a *g)
4320 if (err) 4320 if (err)
4321 goto out; 4321 goto out;
4322 4322
4323 /* this appears query for sw states but fecs actually init
4324 ramchain, etc so this is hw init */
4325 err = g->ops.gr.init_ctx_state(g);
4326 if (err)
4327 goto out;
4328
4329out: 4323out:
4330 if (err) 4324 if (err)
4331 gk20a_err(dev_from_gk20a(g), "fail"); 4325 gk20a_err(dev_from_gk20a(g), "fail");
@@ -4553,6 +4547,12 @@ int gk20a_init_gr_support(struct gk20a *g)
4553 if (err) 4547 if (err)
4554 return err; 4548 return err;
4555 4549
4550 /* this appears query for sw states but fecs actually init
4551 ramchain, etc so this is hw init */
4552 err = g->ops.gr.init_ctx_state(g);
4553 if (err)
4554 return err;
4555
4556 err = gk20a_init_gr_setup_sw(g); 4556 err = gk20a_init_gr_setup_sw(g);
4557 if (err) 4557 if (err)
4558 return err; 4558 return err;
@@ -4776,6 +4776,8 @@ int gk20a_gr_reset(struct gk20a *g)
4776 int err; 4776 int err;
4777 u32 size; 4777 u32 size;
4778 4778
4779 mutex_lock(&g->gr.fecs_mutex);
4780
4779 err = gk20a_enable_gr_hw(g); 4781 err = gk20a_enable_gr_hw(g);
4780 if (err) 4782 if (err)
4781 return err; 4783 return err;
@@ -4788,6 +4790,14 @@ int gk20a_gr_reset(struct gk20a *g)
4788 if (err) 4790 if (err)
4789 return err; 4791 return err;
4790 4792
4793 mutex_unlock(&g->gr.fecs_mutex);
4794
4795 /* this appears query for sw states but fecs actually init
4796 ramchain, etc so this is hw init */
4797 err = g->ops.gr.init_ctx_state(g);
4798 if (err)
4799 return err;
4800
4791 size = 0; 4801 size = 0;
4792 err = gr_gk20a_fecs_get_reglist_img_size(g, &size); 4802 err = gr_gk20a_fecs_get_reglist_img_size(g, &size);
4793 if (err) { 4803 if (err) {