diff options
author | Vijayakumar <vsubbu@nvidia.com> | 2015-08-04 07:44:54 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2015-09-16 12:44:00 -0400 |
commit | b8faddfe2ad3d52837b0f766d74feb8e6d6f4ce5 (patch) | |
tree | 9cf25fcdd5e9ac2ff870f78c35213ce46b90ac7a /drivers/gpu/nvgpu/gk20a/gr_gk20a.c | |
parent | 2359f247d18fbde3220e463543193ab06f75fe81 (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.c | 22 |
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 | |||
4329 | out: | 4323 | out: |
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) { |