diff options
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index dbed9880..78f777ae 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |||
@@ -2410,6 +2410,34 @@ bool gk20a_fifo_handle_sched_error(struct gk20a *g) | |||
2410 | sched_error = gk20a_readl(g, fifo_intr_sched_error_r()); | 2410 | sched_error = gk20a_readl(g, fifo_intr_sched_error_r()); |
2411 | 2411 | ||
2412 | engine_id = gk20a_fifo_get_failing_engine_data(g, &id, &is_tsg); | 2412 | engine_id = gk20a_fifo_get_failing_engine_data(g, &id, &is_tsg); |
2413 | /* | ||
2414 | * Could not find the engine | ||
2415 | * Possible Causes: | ||
2416 | * a) | ||
2417 | * On hitting engine reset, h/w drops the ctxsw_status to INVALID in | ||
2418 | * fifo_engine_status register. Also while the engine is held in reset | ||
2419 | * h/w passes busy/idle straight through. fifo_engine_status registers | ||
2420 | * are correct in that there is no context switch outstanding | ||
2421 | * as the CTXSW is aborted when reset is asserted. | ||
2422 | * This is just a side effect of how gv100 and earlier versions of | ||
2423 | * ctxsw_timeout behave. | ||
2424 | * With gv11b and later, h/w snaps the context at the point of error | ||
2425 | * so that s/w can see the tsg_id which caused the HW timeout. | ||
2426 | * b) | ||
2427 | * If engines are not busy and ctxsw state is valid then intr occurred | ||
2428 | * in the past and if the ctxsw state has moved on to VALID from LOAD | ||
2429 | * or SAVE, it means that whatever timed out eventually finished | ||
2430 | * anyways. The problem with this is that s/w cannot conclude which | ||
2431 | * context caused the problem as maybe more switches occurred before | ||
2432 | * intr is handled. | ||
2433 | */ | ||
2434 | if (engine_id == FIFO_INVAL_ENGINE_ID) { | ||
2435 | nvgpu_info(g, "fifo sched error: 0x%08x, failed to find engine " | ||
2436 | "that is busy doing ctxsw. " | ||
2437 | "May be ctxsw already happened", sched_error); | ||
2438 | ret = false; | ||
2439 | goto err; | ||
2440 | } | ||
2413 | 2441 | ||
2414 | /* could not find the engine - should never happen */ | 2442 | /* could not find the engine - should never happen */ |
2415 | if (!gk20a_fifo_is_valid_engine_id(g, engine_id)) { | 2443 | if (!gk20a_fifo_is_valid_engine_id(g, engine_id)) { |