diff options
author | Mahantesh Kumbar <mkumbar@nvidia.com> | 2017-10-20 07:00:42 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-11-20 03:34:15 -0500 |
commit | 1ab4754c052b639427f38202860d064c2fa03b57 (patch) | |
tree | 0d7740707f0a1c602d1838f256aed07778f6fba4 /drivers/gpu/nvgpu/gm20b | |
parent | 9d04e970937657d11620d812c29a5d10828440fc (diff) |
gpu: nvgpu: Kill pg init thread if pmu boot fails
- Created nvgpu_kill_task_pg_init() method to set
pmu state to PMU_STATE_EXIT & make thread stop,
and poll to confirm thread stopped.
- Check for PMU/SEC2 ACR secure boot completion
status & initiate pg init thread kill if ACR boot
exits with error, which fails to validate &
boot LS-PMU.
- Set pmu state to PMU_STATE_OFF after thread kill
during ACR boot failure.
Issue: pg init task blocks if PMU boot fails &
cause kernel to show message "task nvgpu_pg_init_g:2120
blocked for more than 120 seconds"
Bug 200346134
Change-Id: I5270426080dcd628ccca4df798005294c19767a0
Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1582593
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gm20b')
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/acr_gm20b.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c index a39cdf2c..e5fd8692 100644 --- a/drivers/gpu/nvgpu/gm20b/acr_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/acr_gm20b.c | |||
@@ -1407,12 +1407,12 @@ int pmu_wait_for_halt(struct gk20a *g, unsigned int timeout_ms) | |||
1407 | { | 1407 | { |
1408 | struct nvgpu_pmu *pmu = &g->pmu; | 1408 | struct nvgpu_pmu *pmu = &g->pmu; |
1409 | u32 data = 0; | 1409 | u32 data = 0; |
1410 | int ret = -EBUSY; | 1410 | int ret = 0; |
1411 | 1411 | ||
1412 | ret = nvgpu_flcn_wait_for_halt(pmu->flcn, timeout_ms); | 1412 | ret = nvgpu_flcn_wait_for_halt(pmu->flcn, timeout_ms); |
1413 | if (ret) { | 1413 | if (ret) { |
1414 | nvgpu_err(g, "ACR boot timed out"); | 1414 | nvgpu_err(g, "ACR boot timed out"); |
1415 | return ret; | 1415 | goto exit; |
1416 | } | 1416 | } |
1417 | 1417 | ||
1418 | g->acr.capabilities = gk20a_readl(g, pwr_falcon_mailbox1_r()); | 1418 | g->acr.capabilities = gk20a_readl(g, pwr_falcon_mailbox1_r()); |
@@ -1421,6 +1421,13 @@ int pmu_wait_for_halt(struct gk20a *g, unsigned int timeout_ms) | |||
1421 | if (data) { | 1421 | if (data) { |
1422 | nvgpu_err(g, "ACR boot failed, err %x", data); | 1422 | nvgpu_err(g, "ACR boot failed, err %x", data); |
1423 | ret = -EAGAIN; | 1423 | ret = -EAGAIN; |
1424 | goto exit; | ||
1425 | } | ||
1426 | |||
1427 | exit: | ||
1428 | if (ret) { | ||
1429 | nvgpu_kill_task_pg_init(g); | ||
1430 | nvgpu_pmu_state_change(g, PMU_STATE_OFF, false); | ||
1424 | } | 1431 | } |
1425 | 1432 | ||
1426 | return ret; | 1433 | return ret; |