From c6b846d34c1a3a92a856eed33c5a5175885a273a Mon Sep 17 00:00:00 2001 From: Richard Zhao Date: Thu, 1 Mar 2018 14:47:35 -0800 Subject: gpu: nvgpu: add gops.semaphore_wakeup HAL vserver handles semaphore differently from native, so it needs a callback to differentiate from native. Also created common function mc_gk20a_handle_intr_nonstall to handle all nonstall interrupts. Jira VQRM-2982 Change-Id: I1b3821717a4005ca4bf2a4dac5dcd335872f48f1 Signed-off-by: Richard Zhao Reviewed-on: https://git-master.nvidia.com/r/1656753 Reviewed-by: svc-mobile-coverity GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/common/linux/intr.c | 13 ++++--------- drivers/gpu/nvgpu/gk20a/gk20a.h | 2 ++ drivers/gpu/nvgpu/gk20a/mc_gk20a.c | 11 +++++++++++ drivers/gpu/nvgpu/gk20a/mc_gk20a.h | 1 + drivers/gpu/nvgpu/gm20b/hal_gm20b.c | 1 + drivers/gpu/nvgpu/gp106/hal_gp106.c | 1 + drivers/gpu/nvgpu/gp10b/hal_gp10b.c | 1 + drivers/gpu/nvgpu/gv100/hal_gv100.c | 1 + drivers/gpu/nvgpu/gv11b/hal_gv11b.c | 1 + drivers/gpu/nvgpu/vgpu/ce2_vgpu.c | 4 ++-- drivers/gpu/nvgpu/vgpu/fifo_vgpu.c | 2 +- drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c | 1 + drivers/gpu/nvgpu/vgpu/gr_vgpu.c | 2 +- drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c | 1 + 14 files changed, 29 insertions(+), 13 deletions(-) (limited to 'drivers') diff --git a/drivers/gpu/nvgpu/common/linux/intr.c b/drivers/gpu/nvgpu/common/linux/intr.c index d1b6ef36..6b4b2dc9 100644 --- a/drivers/gpu/nvgpu/common/linux/intr.c +++ b/drivers/gpu/nvgpu/common/linux/intr.c @@ -15,6 +15,7 @@ #include #include "gk20a/gk20a.h" +#include "gk20a/mc_gk20a.h" #include #include @@ -138,17 +139,11 @@ void nvgpu_intr_nonstall_cb(struct work_struct *work) struct nvgpu_os_linux *l = container_of(work, struct nvgpu_os_linux, nonstall_fn_work); struct gk20a *g = &l->g; - u32 ops; - bool semaphore_wakeup, post_events; do { - ops = atomic_xchg(&l->nonstall_ops, 0); - - semaphore_wakeup = ops & gk20a_nonstall_ops_wakeup_semaphore; - post_events = ops & gk20a_nonstall_ops_post_events; - - if (semaphore_wakeup) - gk20a_channel_semaphore_wakeup(g, post_events); + u32 ops; + ops = atomic_xchg(&l->nonstall_ops, 0); + mc_gk20a_handle_intr_nonstall(g, ops); } while (atomic_read(&l->nonstall_ops) != 0); } diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 06739eee..178c1200 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h @@ -1097,6 +1097,8 @@ struct gpu_ops { int (*shutdown)(struct gk20a *g); int (*early_init)(struct gk20a *g); } nvlink; + + void (*semaphore_wakeup)(struct gk20a *g, bool post_events); }; struct nvgpu_bios_ucode { diff --git a/drivers/gpu/nvgpu/gk20a/mc_gk20a.c b/drivers/gpu/nvgpu/gk20a/mc_gk20a.c index b99fbdb0..e6d81a87 100644 --- a/drivers/gpu/nvgpu/gk20a/mc_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/mc_gk20a.c @@ -240,3 +240,14 @@ bool mc_gk20a_is_intr1_pending(struct gk20a *g, return is_pending; } + +void mc_gk20a_handle_intr_nonstall(struct gk20a *g, u32 ops) +{ + bool semaphore_wakeup, post_events; + + semaphore_wakeup = ops & gk20a_nonstall_ops_wakeup_semaphore; + post_events = ops & gk20a_nonstall_ops_post_events; + + if (semaphore_wakeup) + g->ops.semaphore_wakeup(g, post_events); +} diff --git a/drivers/gpu/nvgpu/gk20a/mc_gk20a.h b/drivers/gpu/nvgpu/gk20a/mc_gk20a.h index 1bddab28..870a1d3f 100644 --- a/drivers/gpu/nvgpu/gk20a/mc_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/mc_gk20a.h @@ -40,4 +40,5 @@ void gk20a_mc_reset(struct gk20a *g, u32 units); u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev); bool mc_gk20a_is_intr1_pending(struct gk20a *g, enum nvgpu_unit unit, u32 mc_intr_1); +void mc_gk20a_handle_intr_nonstall(struct gk20a *g, u32 ops); #endif diff --git a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c index 8df66151..9c3cc63e 100644 --- a/drivers/gpu/nvgpu/gm20b/hal_gm20b.c +++ b/drivers/gpu/nvgpu/gm20b/hal_gm20b.c @@ -646,6 +646,7 @@ int gm20b_init_hal(struct gk20a *g) gops->chip_init_gpu_characteristics = gm20b_ops.chip_init_gpu_characteristics; gops->get_litter_value = gm20b_ops.get_litter_value; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, false); diff --git a/drivers/gpu/nvgpu/gp106/hal_gp106.c b/drivers/gpu/nvgpu/gp106/hal_gp106.c index 35e4a7dd..75c9d336 100644 --- a/drivers/gpu/nvgpu/gp106/hal_gp106.c +++ b/drivers/gpu/nvgpu/gp106/hal_gp106.c @@ -780,6 +780,7 @@ int gp106_init_hal(struct gk20a *g) gops->get_litter_value = gp106_ops.get_litter_value; gops->chip_init_gpu_characteristics = gp106_ops.chip_init_gpu_characteristics; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, true); diff --git a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c index ced3bb40..137980a9 100644 --- a/drivers/gpu/nvgpu/gp10b/hal_gp10b.c +++ b/drivers/gpu/nvgpu/gp10b/hal_gp10b.c @@ -684,6 +684,7 @@ int gp10b_init_hal(struct gk20a *g) gops->chip_init_gpu_characteristics = gp10b_ops.chip_init_gpu_characteristics; gops->get_litter_value = gp10b_ops.get_litter_value; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, false); diff --git a/drivers/gpu/nvgpu/gv100/hal_gv100.c b/drivers/gpu/nvgpu/gv100/hal_gv100.c index dffacdf7..7e1b6a3f 100644 --- a/drivers/gpu/nvgpu/gv100/hal_gv100.c +++ b/drivers/gpu/nvgpu/gv100/hal_gv100.c @@ -794,6 +794,7 @@ int gv100_init_hal(struct gk20a *g) gops->chip_init_gpu_characteristics = gv100_ops.chip_init_gpu_characteristics; gops->get_litter_value = gv100_ops.get_litter_value; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); __nvgpu_set_enabled(g, NVGPU_SEC_PRIVSECURITY, true); diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c index 2cc2d53a..11d710bf 100644 --- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c @@ -746,6 +746,7 @@ int gv11b_init_hal(struct gk20a *g) gops->chip_init_gpu_characteristics = gv11b_ops.chip_init_gpu_characteristics; gops->get_litter_value = gv11b_ops.get_litter_value; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, false); diff --git a/drivers/gpu/nvgpu/vgpu/ce2_vgpu.c b/drivers/gpu/nvgpu/vgpu/ce2_vgpu.c index 914041ff..a552ad44 100644 --- a/drivers/gpu/nvgpu/vgpu/ce2_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/ce2_vgpu.c @@ -22,7 +22,7 @@ * DEALINGS IN THE SOFTWARE. */ -#include "gk20a/channel_gk20a.h" +#include "gk20a/gk20a.h" #include #include @@ -34,7 +34,7 @@ int vgpu_ce2_nonstall_isr(struct gk20a *g, switch (info->type) { case TEGRA_VGPU_CE2_NONSTALL_INTR_NONBLOCKPIPE: - gk20a_channel_semaphore_wakeup(g, true); + g->ops.semaphore_wakeup(g, true); break; default: WARN_ON(1); diff --git a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c index 580bfb60..6406c0da 100644 --- a/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/fifo_vgpu.c @@ -752,7 +752,7 @@ int vgpu_fifo_nonstall_isr(struct gk20a *g, switch (info->type) { case TEGRA_VGPU_FIFO_NONSTALL_INTR_CHANNEL: - gk20a_channel_semaphore_wakeup(g, false); + g->ops.semaphore_wakeup(g, false); break; default: WARN_ON(1); diff --git a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c index 861f6c00..5d618649 100644 --- a/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c +++ b/drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c @@ -562,6 +562,7 @@ int vgpu_gp10b_init_hal(struct gk20a *g) gops->chip_init_gpu_characteristics = vgpu_gp10b_ops.chip_init_gpu_characteristics; gops->get_litter_value = vgpu_gp10b_ops.get_litter_value; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, false); diff --git a/drivers/gpu/nvgpu/vgpu/gr_vgpu.c b/drivers/gpu/nvgpu/vgpu/gr_vgpu.c index d04beb56..e61996a1 100644 --- a/drivers/gpu/nvgpu/vgpu/gr_vgpu.c +++ b/drivers/gpu/nvgpu/vgpu/gr_vgpu.c @@ -969,7 +969,7 @@ int vgpu_gr_nonstall_isr(struct gk20a *g, switch (info->type) { case TEGRA_VGPU_GR_NONSTALL_INTR_SEMAPHORE: - gk20a_channel_semaphore_wakeup(g, true); + g->ops.semaphore_wakeup(g, true); break; default: WARN_ON(1); diff --git a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c index 01b31976..a6a28225 100644 --- a/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c +++ b/drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c @@ -602,6 +602,7 @@ int vgpu_gv11b_init_hal(struct gk20a *g) gops->chip_init_gpu_characteristics = vgpu_gv11b_ops.chip_init_gpu_characteristics; gops->get_litter_value = vgpu_gv11b_ops.get_litter_value; + gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup; g->name = "gv11b"; -- cgit v1.2.2