From 07f07981733135f648c53acfedf03b43045fed08 Mon Sep 17 00:00:00 2001 From: Terje Bergstrom Date: Mon, 6 Feb 2017 15:04:18 -0800 Subject: gpu: nvgpu: Do not skip errors in gk20a_init_sw_bundle gk20a_init_sw_bundle() has a couple of places where it continues even despite an error is returned. Also it does not check the return value from gops->gr.init_sw_veid_bundle(). Add an error goto label which restores pipeline state. Add gotos to that label for all error cases. Coverity ID 490376 Change-Id: I65338272d2817fa831370c8f070019debbfcd673 Signed-off-by: Terje Bergstrom Reviewed-on: http://git-master/r/1300098 Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c') diff --git a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c index d7693515..488a6fcb 100644 --- a/drivers/gpu/nvgpu/gk20a/gr_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/gr_gk20a.c @@ -1525,26 +1525,43 @@ static u32 gk20a_init_sw_bundle(struct gk20a *g) sw_bundle_init->l[i].addr); if (gr_pipe_bundle_address_value_v(sw_bundle_init->l[i].addr) == - GR_GO_IDLE_BUNDLE) - err |= gr_gk20a_wait_idle(g, + GR_GO_IDLE_BUNDLE) { + err = gr_gk20a_wait_idle(g, gk20a_get_gr_idle_timeout(g), GR_IDLE_CHECK_DEFAULT); + if (err) + goto error; + } err = gr_gk20a_wait_fe_idle(g, gk20a_get_gr_idle_timeout(g), GR_IDLE_CHECK_DEFAULT); if (err) - break; + goto error; } - if (g->ops.gr.init_sw_veid_bundle) - g->ops.gr.init_sw_veid_bundle(g); + + if (!err && g->ops.gr.init_sw_veid_bundle) { + err = g->ops.gr.init_sw_veid_bundle(g); + if (err) + goto error; + } + /* disable pipe mode override */ gk20a_writel(g, gr_pipe_bundle_config_r(), gr_pipe_bundle_config_override_pipe_mode_disabled_f()); err = gr_gk20a_wait_idle(g, gk20a_get_gr_idle_timeout(g), GR_IDLE_CHECK_DEFAULT); - if (err) - return err; + + /* restore fe_go_idle */ + gk20a_writel(g, gr_fe_go_idle_timeout_r(), + gr_fe_go_idle_timeout_count_prod_f()); + + return err; + +error: + /* in case of error skip waiting for GR idle - just restore state */ + gk20a_writel(g, gr_pipe_bundle_config_r(), + gr_pipe_bundle_config_override_pipe_mode_disabled_f()); /* restore fe_go_idle */ gk20a_writel(g, gr_fe_go_idle_timeout_r(), -- cgit v1.2.2