diff --git a/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b.h b/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b.h index 32b103062..d3d30f1ef 100644 --- a/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b.h +++ b/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b.h @@ -68,6 +68,8 @@ void ga10b_pbdma_dump_status(struct gk20a *g, struct nvgpu_debug_context *o); u32 ga10b_pbdma_get_mmu_fault_id(struct gk20a *g, u32 pbdma_id); u32 ga10b_pbdma_get_num_of_pbdmas(void); +bool ga10b_pbdma_handle_intr_0_acquire(struct gk20a *g, u32 pbdma_id, + u32 pbdma_intr_0, u32 *error_notifier); u32 ga10b_pbdma_intr_0_en_set_tree_mask(void); u32 ga10b_pbdma_intr_0_en_clear_tree_mask(void); diff --git a/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b_fusa.c b/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b_fusa.c index c82e00fae..385866f93 100644 --- a/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b_fusa.c +++ b/drivers/gpu/nvgpu/hal/fifo/pbdma_ga10b_fusa.c @@ -437,25 +437,9 @@ static bool ga10b_pbdma_handle_intr_0_legacy(struct gk20a *g, u32 pbdma_id, recover = true; } - if ((pbdma_intr_0 & pbdma_intr_0_acquire_pending_f()) != 0U) { - u32 val = nvgpu_readl(g, pbdma_acquire_r(pbdma_id)); - - val &= ~pbdma_acquire_timeout_en_enable_f(); - nvgpu_writel(g, pbdma_acquire_r(pbdma_id), val); - if (nvgpu_is_timeouts_enabled(g)) { - recover = true; - nvgpu_err(g, "semaphore acquire timeout!"); - - gk20a_debug_dump(g); - - /* - * Note: the error_notifier can be overwritten if - * semaphore_timeout is triggered with pbcrc_pending - * interrupt below - */ - *error_notifier = - NVGPU_ERR_NOTIFIER_GR_SEMAPHORE_TIMEOUT; - } + if (g->ops.pbdma.handle_intr_0_acquire != NULL) { + recover = g->ops.pbdma.handle_intr_0_acquire(g, pbdma_id, + pbdma_intr_0, error_notifier); } if ((pbdma_intr_0 & pbdma_intr_0_pbentry_pending_f()) != 0U) { @@ -640,3 +624,32 @@ u32 ga10b_pbdma_get_num_of_pbdmas(void) { return pbdma_cfg0__size_1_v(); } + +bool ga10b_pbdma_handle_intr_0_acquire(struct gk20a *g, u32 pbdma_id, + u32 pbdma_intr_0, u32 *error_notifier) +{ + bool recover = false; + + if ((pbdma_intr_0 & pbdma_intr_0_acquire_pending_f()) != 0U) { + u32 val = nvgpu_readl(g, pbdma_acquire_r(pbdma_id)); + + val &= ~pbdma_acquire_timeout_en_enable_f(); + nvgpu_writel(g, pbdma_acquire_r(pbdma_id), val); + if (nvgpu_is_timeouts_enabled(g)) { + recover = true; + nvgpu_err(g, "semaphore acquire timeout!"); + + gk20a_debug_dump(g); + + /* + * Note: the error_notifier can be overwritten if + * semaphore_timeout is triggered with pbcrc_pending + * interrupt below + */ + *error_notifier = + NVGPU_ERR_NOTIFIER_GR_SEMAPHORE_TIMEOUT; + } + } + + return recover; +} diff --git a/drivers/gpu/nvgpu/hal/init/hal_ga100.c b/drivers/gpu/nvgpu/hal/init/hal_ga100.c index ecab8cb04..322930021 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_ga100.c +++ b/drivers/gpu/nvgpu/hal/init/hal_ga100.c @@ -1054,6 +1054,7 @@ static const struct gops_pbdma ga100_ops_pbdma = { .dump_status = ga10b_pbdma_dump_status, #endif .handle_intr_0 = ga10b_pbdma_handle_intr_0, + .handle_intr_0_acquire = ga10b_pbdma_handle_intr_0_acquire, .handle_intr_1 = ga10b_pbdma_handle_intr_1, .handle_intr = ga10b_pbdma_handle_intr, .dump_intr_0 = ga10b_pbdma_dump_intr_0, diff --git a/drivers/gpu/nvgpu/hal/init/hal_ga10b.c b/drivers/gpu/nvgpu/hal/init/hal_ga10b.c index 85ba066cb..781250bdf 100644 --- a/drivers/gpu/nvgpu/hal/init/hal_ga10b.c +++ b/drivers/gpu/nvgpu/hal/init/hal_ga10b.c @@ -1072,6 +1072,7 @@ static const struct gops_pbdma ga10b_ops_pbdma = { .dump_status = ga10b_pbdma_dump_status, #endif .handle_intr_0 = ga10b_pbdma_handle_intr_0, + .handle_intr_0_acquire = ga10b_pbdma_handle_intr_0_acquire, .handle_intr_1 = ga10b_pbdma_handle_intr_1, .handle_intr = ga10b_pbdma_handle_intr, .dump_intr_0 = ga10b_pbdma_dump_intr_0, diff --git a/drivers/gpu/nvgpu/include/nvgpu/gops/pbdma.h b/drivers/gpu/nvgpu/include/nvgpu/gops/pbdma.h index 0d40ca2b3..a46b64d40 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/gops/pbdma.h +++ b/drivers/gpu/nvgpu/include/nvgpu/gops/pbdma.h @@ -94,6 +94,8 @@ struct gops_pbdma { u32 (*get_num_of_pbdmas)(void); void (*report_error)(struct gk20a *g, u32 pbdma_id, u32 pbdma_intr_0); + bool (*handle_intr_0_acquire)(struct gk20a *g, u32 pbdma_id, + u32 pbdma_intr_0, u32 *error_notifier); /** NON FUSA */ void (*syncpt_debug_dump)(struct gk20a *g,