diff options
author | Richard Zhao <rizhao@nvidia.com> | 2018-03-01 17:47:35 -0500 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-03-06 17:52:43 -0500 |
commit | c6b846d34c1a3a92a856eed33c5a5175885a273a (patch) | |
tree | 0b6f7ad4a4a4c8fe51e60ebcc5b7fd29565158ba | |
parent | f6cac2e0c4c57295886ea97833cebcd368de3788 (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.c | 13 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mc_gk20a.c | 11 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/mc_gk20a.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gm20b/hal_gm20b.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gp106/hal_gp106.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gp10b/hal_gp10b.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv100/hal_gv100.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/hal_gv11b.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/ce2_vgpu.c | 4 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/fifo_vgpu.c | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/gp10b/vgpu_hal_gp10b.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/gr_vgpu.c | 2 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/vgpu/gv11b/vgpu_hal_gv11b.c | 1 |
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 | ||
1102 | struct nvgpu_bios_ucode { | 1104 | 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, | |||
240 | 240 | ||
241 | return is_pending; | 241 | return is_pending; |
242 | } | 242 | } |
243 | |||
244 | void 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); | |||
40 | u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev); | 40 | u32 gk20a_mc_boot_0(struct gk20a *g, u32 *arch, u32 *impl, u32 *rev); |
41 | bool mc_gk20a_is_intr1_pending(struct gk20a *g, | 41 | bool 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); |
43 | void 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 | ||