From 21e2214c3db8889a5fe2449690d283c67f2150cb Mon Sep 17 00:00:00 2001 From: Seema Khowala Date: Tue, 17 Mar 2020 19:17:52 -0700 Subject: [PATCH] gpu: nvgpu: support nvgpu-next intr config JIRA NVGPU-4864 Change-Id: I2fb5be3270c73ea891021161f539a7f731e05f63 Signed-off-by: Seema Khowala Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2314372 Reviewed-by: automaticguardword Reviewed-by: svc-mobile-coverity Reviewed-by: svc-mobile-misra Reviewed-by: svc-mobile-cert Reviewed-by: Lakshmanan M Reviewed-by: Vaibhav Kachore Reviewed-by: mobile promotions Tested-by: Lakshmanan M Tested-by: mobile promotions GVS: Gerrit_Virtual_Submit --- drivers/gpu/nvgpu/common/mc/mc.c | 42 ++++++++++++++++++++++++++++ drivers/gpu/nvgpu/include/nvgpu/mc.h | 6 ++++ 2 files changed, 48 insertions(+) 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