diff --git a/drivers/gpu/nvgpu/common/mc/mc.c b/drivers/gpu/nvgpu/common/mc/mc.c index b286ce7e6..621152f3f 100644 --- a/drivers/gpu/nvgpu/common/mc/mc.c +++ b/drivers/gpu/nvgpu/common/mc/mc.c @@ -24,6 +24,7 @@ #include #include +#include void nvgpu_wait_for_deferred_interrupts(struct gk20a *g) { @@ -122,3 +123,44 @@ void nvgpu_mc_intr_nonstall_resume(struct gk20a *g) g->ops.mc.intr_nonstall_resume(g); nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags); } + +#if defined(CONFIG_NVGPU_NON_FUSA) && defined(CONFIG_NVGPU_NEXT) +void nvgpu_mc_intr_unit_vectorid_init(struct gk20a *g, u32 unit, + u32 *vectorid, u32 num_entries) +{ + unsigned long flags = 0; + u32 i = 0U; + struct nvgpu_intr_unit_info *intr_unit_info; + + nvgpu_assert(num_entries <= INTR_VECTORID_SIZE_MAX); + + intr_unit_info = g->mc.nvgpu_next.intr_unit_info; + + nvgpu_spinlock_irqsave(&g->mc.intr_lock, flags); + + if (intr_unit_info[unit].valid == false) { + for (i = 0U; i < num_entries; i++) { + intr_unit_info[unit].vectorid[i] = *(vectorid + i); + } + intr_unit_info[unit].vectorid_size = num_entries; + } + nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags); +} + +bool nvgpu_mc_intr_is_unit_info_valid(struct gk20a *g, u32 unit) +{ + unsigned long flags = 0; + struct nvgpu_intr_unit_info *intr_unit_info; + bool info_valid = false; + + intr_unit_info = g->mc.nvgpu_next.intr_unit_info; + + nvgpu_spinlock_irqsave(&g->mc.intr_lock, flags); + if (intr_unit_info[unit].valid == true) { + info_valid = true; + } + nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags); + + return info_valid; +} +#endif diff --git a/drivers/gpu/nvgpu/include/nvgpu/mc.h b/drivers/gpu/nvgpu/include/nvgpu/mc.h index dcff59599..94f70dcbd 100644 --- a/drivers/gpu/nvgpu/include/nvgpu/mc.h +++ b/drivers/gpu/nvgpu/include/nvgpu/mc.h @@ -501,4 +501,10 @@ void nvgpu_mc_intr_nonstall_pause(struct gk20a *g); */ void nvgpu_mc_intr_nonstall_resume(struct gk20a *g); +#if defined(CONFIG_NVGPU_NON_FUSA) && defined(CONFIG_NVGPU_NEXT) +void nvgpu_mc_intr_unit_vectorid_init(struct gk20a *g, u32 unit, + u32 *vectorid, u32 num_entries); +bool nvgpu_mc_intr_is_unit_info_valid(struct gk20a *g, u32 unit); +#endif + #endif