summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/gr_gk20a.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2017-02-06 18:04:18 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-02-07 01:13:01 -0500
commit07f07981733135f648c53acfedf03b43045fed08 (patch)
tree7e6ea27daf0d6888c9be857be59d40085605110c /drivers/gpu/nvgpu/gk20a/gr_gk20a.c
parent91406a18f07e410885646fbc96cdcf2431ee6fe3 (diff)
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 <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/1300098 Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/gr_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/gr_gk20a.c31
1 files changed, 24 insertions, 7 deletions
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)
1525 sw_bundle_init->l[i].addr); 1525 sw_bundle_init->l[i].addr);
1526 1526
1527 if (gr_pipe_bundle_address_value_v(sw_bundle_init->l[i].addr) == 1527 if (gr_pipe_bundle_address_value_v(sw_bundle_init->l[i].addr) ==
1528 GR_GO_IDLE_BUNDLE) 1528 GR_GO_IDLE_BUNDLE) {
1529 err |= gr_gk20a_wait_idle(g, 1529 err = gr_gk20a_wait_idle(g,
1530 gk20a_get_gr_idle_timeout(g), 1530 gk20a_get_gr_idle_timeout(g),
1531 GR_IDLE_CHECK_DEFAULT); 1531 GR_IDLE_CHECK_DEFAULT);
1532 if (err)
1533 goto error;
1534 }
1532 1535
1533 err = gr_gk20a_wait_fe_idle(g, gk20a_get_gr_idle_timeout(g), 1536 err = gr_gk20a_wait_fe_idle(g, gk20a_get_gr_idle_timeout(g),
1534 GR_IDLE_CHECK_DEFAULT); 1537 GR_IDLE_CHECK_DEFAULT);
1535 if (err) 1538 if (err)
1536 break; 1539 goto error;
1537 } 1540 }
1538 if (g->ops.gr.init_sw_veid_bundle) 1541
1539 g->ops.gr.init_sw_veid_bundle(g); 1542 if (!err && g->ops.gr.init_sw_veid_bundle) {
1543 err = g->ops.gr.init_sw_veid_bundle(g);
1544 if (err)
1545 goto error;
1546 }
1547
1540 /* disable pipe mode override */ 1548 /* disable pipe mode override */
1541 gk20a_writel(g, gr_pipe_bundle_config_r(), 1549 gk20a_writel(g, gr_pipe_bundle_config_r(),
1542 gr_pipe_bundle_config_override_pipe_mode_disabled_f()); 1550 gr_pipe_bundle_config_override_pipe_mode_disabled_f());
1543 1551
1544 err = gr_gk20a_wait_idle(g, gk20a_get_gr_idle_timeout(g), 1552 err = gr_gk20a_wait_idle(g, gk20a_get_gr_idle_timeout(g),
1545 GR_IDLE_CHECK_DEFAULT); 1553 GR_IDLE_CHECK_DEFAULT);
1546 if (err) 1554
1547 return err; 1555 /* restore fe_go_idle */
1556 gk20a_writel(g, gr_fe_go_idle_timeout_r(),
1557 gr_fe_go_idle_timeout_count_prod_f());
1558
1559 return err;
1560
1561error:
1562 /* in case of error skip waiting for GR idle - just restore state */
1563 gk20a_writel(g, gr_pipe_bundle_config_r(),
1564 gr_pipe_bundle_config_override_pipe_mode_disabled_f());
1548 1565
1549 /* restore fe_go_idle */ 1566 /* restore fe_go_idle */
1550 gk20a_writel(g, gr_fe_go_idle_timeout_r(), 1567 gk20a_writel(g, gr_fe_go_idle_timeout_r(),