summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Zhao <rizhao@nvidia.com>2018-03-01 17:47:35 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2018-03-06 17:52:43 -0500
commitc6b846d34c1a3a92a856eed33c5a5175885a273a (patch)
tree0b6f7ad4a4a4c8fe51e60ebcc5b7fd29565158ba
parentf6cac2e0c4c57295886ea97833cebcd368de3788 (diff)
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 <rizhao@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1656753 Reviewed-by: svc-mobile-coverity <svc-mobile-coverity@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/common/linux/intr.c13
-rw-r--r--drivers/gpu/nvgpu/gk20a/gk20a.h2
-rw-r--r--drivers/gpu/nvgpu/gk20a/mc_gk20a.c11
-rw-r--r--drivers/gpu/nvgpu/gk20a/mc_gk20a.h1
-rw-r--r--drivers/gpu/nvgpu/gm20b/hal_gm20b.c1
-rw-r--r--drivers/gpu/nvgpu/gp106/hal_gp106.c1
-rw-r--r--drivers/gpu/nvgpu/gp10b/hal_gp10b.c1
-rw-r--r--drivers/gpu/nvgpu/gv100/hal_gv100.c1
-rw-r--r--drivers/gpu/nvgpu/gv11b/hal_gv11b.c1
-rw-r--r--drivers/gpu/nvgpu/vgpu/ce2_vgpu.c4
-rw-r--r--drivers/gpu/nvgpu/vgpu/fifo_vgpu.c2
-rw-r--r--drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c1
-rw-r--r--drivers/gpu/nvgpu/vgpu/gr_vgpu.c2
-rw-r--r--drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c1
14 files changed, 29 insertions, 13 deletions
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 @@
15#include <linux/irqreturn.h> 15#include <linux/irqreturn.h>
16 16
17#include "gk20a/gk20a.h" 17#include "gk20a/gk20a.h"
18#include "gk20a/mc_gk20a.h"
18 19
19#include <nvgpu/atomic.h> 20#include <nvgpu/atomic.h>
20#include <nvgpu/unit.h> 21#include <nvgpu/unit.h>
@@ -138,17 +139,11 @@ void nvgpu_intr_nonstall_cb(struct work_struct *work)
138 struct nvgpu_os_linux *l = 139 struct nvgpu_os_linux *l =
139 container_of(work, struct nvgpu_os_linux, nonstall_fn_work); 140 container_of(work, struct nvgpu_os_linux, nonstall_fn_work);
140 struct gk20a *g = &l->g; 141 struct gk20a *g = &l->g;
141 u32 ops;
142 bool semaphore_wakeup, post_events;
143 142
144 do { 143 do {
145 ops = atomic_xchg(&l->nonstall_ops, 0); 144 u32 ops;
146
147 semaphore_wakeup = ops & gk20a_nonstall_ops_wakeup_semaphore;
148 post_events = ops & gk20a_nonstall_ops_post_events;
149
150 if (semaphore_wakeup)
151 gk20a_channel_semaphore_wakeup(g, post_events);
152 145
146 ops = atomic_xchg(&l->nonstall_ops, 0);
147 mc_gk20a_handle_intr_nonstall(g, ops);
153 } while (atomic_read(&l->nonstall_ops) != 0); 148 } while (atomic_read(&l->nonstall_ops) != 0);
154} 149}
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 {
1097 int (*shutdown)(struct gk20a *g); 1097 int (*shutdown)(struct gk20a *g);
1098 int (*early_init)(struct gk20a *g); 1098 int (*early_init)(struct gk20a *g);
1099 } nvlink; 1099 } nvlink;
1100
1101 void (*semaphore_wakeup)(struct gk20a *g, bool post_events);
1100}; 1102};
1101 1103
1102struct nvgpu_bios_ucode { 1104struct 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,
240 240
241 return is_pending; 241 return is_pending;
242} 242}
243
244void mc_gk20a_handle_intr_nonstall(struct gk20a *g, u32 ops)
245{
246 bool semaphore_wakeup, post_events;
247
248 semaphore_wakeup = ops & gk20a_nonstall_ops_wakeup_semaphore;
249 post_events = ops & gk20a_nonstall_ops_post_events;
250
251 if (semaphore_wakeup)
252 g->ops.semaphore_wakeup(g, post_events);
253}
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);
40u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev); 40u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev);
41bool mc_gk20a_is_intr1_pending(struct gk20a *g, 41bool mc_gk20a_is_intr1_pending(struct gk20a *g,
42 enum nvgpu_unit unit, u32 mc_intr_1); 42 enum nvgpu_unit unit, u32 mc_intr_1);
43void mc_gk20a_handle_intr_nonstall(struct gk20a *g, u32 ops);
43#endif 44#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)
646 gops->chip_init_gpu_characteristics = 646 gops->chip_init_gpu_characteristics =
647 gm20b_ops.chip_init_gpu_characteristics; 647 gm20b_ops.chip_init_gpu_characteristics;
648 gops->get_litter_value = gm20b_ops.get_litter_value; 648 gops->get_litter_value = gm20b_ops.get_litter_value;
649 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
649 650
650 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); 651 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true);
651 __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, false); 652 __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)
780 gops->get_litter_value = gp106_ops.get_litter_value; 780 gops->get_litter_value = gp106_ops.get_litter_value;
781 gops->chip_init_gpu_characteristics = 781 gops->chip_init_gpu_characteristics =
782 gp106_ops.chip_init_gpu_characteristics; 782 gp106_ops.chip_init_gpu_characteristics;
783 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
783 784
784 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); 785 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true);
785 __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, true); 786 __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)
684 gops->chip_init_gpu_characteristics = 684 gops->chip_init_gpu_characteristics =
685 gp10b_ops.chip_init_gpu_characteristics; 685 gp10b_ops.chip_init_gpu_characteristics;
686 gops->get_litter_value = gp10b_ops.get_litter_value; 686 gops->get_litter_value = gp10b_ops.get_litter_value;
687 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
687 688
688 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); 689 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true);
689 __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, false); 690 __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)
794 gops->chip_init_gpu_characteristics = 794 gops->chip_init_gpu_characteristics =
795 gv100_ops.chip_init_gpu_characteristics; 795 gv100_ops.chip_init_gpu_characteristics;
796 gops->get_litter_value = gv100_ops.get_litter_value; 796 gops->get_litter_value = gv100_ops.get_litter_value;
797 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
797 798
798 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); 799 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true);
799 __nvgpu_set_enabled(g, NVGPU_SEC_PRIVSECURITY, true); 800 __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)
746 gops->chip_init_gpu_characteristics = 746 gops->chip_init_gpu_characteristics =
747 gv11b_ops.chip_init_gpu_characteristics; 747 gv11b_ops.chip_init_gpu_characteristics;
748 gops->get_litter_value = gv11b_ops.get_litter_value; 748 gops->get_litter_value = gv11b_ops.get_litter_value;
749 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
749 750
750 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, false); 751 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, false);
751 752
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 @@
22 * DEALINGS IN THE SOFTWARE. 22 * DEALINGS IN THE SOFTWARE.
23 */ 23 */
24 24
25#include "gk20a/channel_gk20a.h" 25#include "gk20a/gk20a.h"
26 26
27#include <nvgpu/bug.h> 27#include <nvgpu/bug.h>
28#include <nvgpu/vgpu/vgpu.h> 28#include <nvgpu/vgpu/vgpu.h>
@@ -34,7 +34,7 @@ int vgpu_ce2_nonstall_isr(struct gk20a *g,
34 34
35 switch (info->type) { 35 switch (info->type) {
36 case TEGRA_VGPU_CE2_NONSTALL_INTR_NONBLOCKPIPE: 36 case TEGRA_VGPU_CE2_NONSTALL_INTR_NONBLOCKPIPE:
37 gk20a_channel_semaphore_wakeup(g, true); 37 g->ops.semaphore_wakeup(g, true);
38 break; 38 break;
39 default: 39 default:
40 WARN_ON(1); 40 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,
752 752
753 switch (info->type) { 753 switch (info->type) {
754 case TEGRA_VGPU_FIFO_NONSTALL_INTR_CHANNEL: 754 case TEGRA_VGPU_FIFO_NONSTALL_INTR_CHANNEL:
755 gk20a_channel_semaphore_wakeup(g, false); 755 g->ops.semaphore_wakeup(g, false);
756 break; 756 break;
757 default: 757 default:
758 WARN_ON(1); 758 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)
562 gops->chip_init_gpu_characteristics = 562 gops->chip_init_gpu_characteristics =
563 vgpu_gp10b_ops.chip_init_gpu_characteristics; 563 vgpu_gp10b_ops.chip_init_gpu_characteristics;
564 gops->get_litter_value = vgpu_gp10b_ops.get_litter_value; 564 gops->get_litter_value = vgpu_gp10b_ops.get_litter_value;
565 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
565 566
566 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true); 567 __nvgpu_set_enabled(g, NVGPU_GR_USE_DMA_FOR_FW_BOOTSTRAP, true);
567 __nvgpu_set_enabled(g, NVGPU_PMU_PSTATE, false); 568 __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,
969 969
970 switch (info->type) { 970 switch (info->type) {
971 case TEGRA_VGPU_GR_NONSTALL_INTR_SEMAPHORE: 971 case TEGRA_VGPU_GR_NONSTALL_INTR_SEMAPHORE:
972 gk20a_channel_semaphore_wakeup(g, true); 972 g->ops.semaphore_wakeup(g, true);
973 break; 973 break;
974 default: 974 default:
975 WARN_ON(1); 975 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)
602 gops->chip_init_gpu_characteristics = 602 gops->chip_init_gpu_characteristics =
603 vgpu_gv11b_ops.chip_init_gpu_characteristics; 603 vgpu_gv11b_ops.chip_init_gpu_characteristics;
604 gops->get_litter_value = vgpu_gv11b_ops.get_litter_value; 604 gops->get_litter_value = vgpu_gv11b_ops.get_litter_value;
605 gops->semaphore_wakeup = gk20a_channel_semaphore_wakeup;
605 606
606 g->name = "gv11b"; 607 g->name = "gv11b";
607 608