diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2017-02-06 18:04:18 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-02-07 01:13:01 -0500 |
commit | 07f07981733135f648c53acfedf03b43045fed08 (patch) | |
tree | 7e6ea27daf0d6888c9be857be59d40085605110c /drivers/gpu | |
parent | 91406a18f07e410885646fbc96cdcf2431ee6fe3 (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')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gr_gk20a.c | 31 |
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 | |||
1561 | error: | ||
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(), |