diff options
author | David Li <davli@nvidia.com> | 2018-04-26 05:00:01 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2018-05-18 02:34:20 -0400 |
commit | a807cf20419af737a79a3d0c7fcc1068ac6b724a (patch) | |
tree | 4efc94d09217bd5e7fdad973b8dacfdee9bab8dd /drivers/gpu/nvgpu/gv11b | |
parent | 8ac538e1b16c68ef4a5b9d85a82bbfc2b3fabd72 (diff) |
gpu: nvgpu: add NVGPU_IOCTL_CHANNEL_RESCHEDULE_RUNLIST
Add NVGPU_IOCTL_CHANNEL_RESCHEDULE_RUNLIST ioctl to reschedule runlist,
and optionally check host and FECS status to preempt pending load of
context not belonging to the calling channel on GR engine during context
switch.
This should be called immediately after a submit to decrease worst case
submit to start latency for high interleave channel.
There is less than 0.002% chance that the ioctl blocks up to couple
miliseconds due to race condition of FECS status changing while being read.
For GV11B it will always preempt pending load of unwanted context since
there is no chance that ioctl blocks due to race condition.
Also fix bug with host reschedule for multiple runlists which needs to
write both runlist registers.
Bug 1987640
Bug 1924808
Change-Id: I0b7e2f91bd18b0b20928e5a3311b9426b1bf1848
Signed-off-by: David Li <davli@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1549050
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gv11b')
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | 8 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/fifo_gv11b.h | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/gv11b.c | 1 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gv11b/hal_gv11b.c | 1 |
4 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c index 30e03092..f00e806f 100644 --- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.c | |||
@@ -664,6 +664,13 @@ static u32 gv11b_fifo_get_runlists_mask(struct gk20a *g, u32 act_eng_bitmask, | |||
664 | return runlists_mask; | 664 | return runlists_mask; |
665 | } | 665 | } |
666 | 666 | ||
667 | int gv11b_fifo_reschedule_runlist(struct channel_gk20a *ch, bool preempt_next) | ||
668 | { | ||
669 | /* gv11b allows multiple outstanding preempts, | ||
670 | so always preempt next for best reschedule effect */ | ||
671 | return nvgpu_fifo_reschedule_runlist(ch, true, false); | ||
672 | } | ||
673 | |||
667 | static void gv11b_fifo_issue_runlist_preempt(struct gk20a *g, | 674 | static void gv11b_fifo_issue_runlist_preempt(struct gk20a *g, |
668 | u32 runlists_mask) | 675 | u32 runlists_mask) |
669 | { | 676 | { |
@@ -842,7 +849,6 @@ int gv11b_fifo_preempt_tsg(struct gk20a *g, u32 tsgid) | |||
842 | return ret; | 849 | return ret; |
843 | } | 850 | } |
844 | 851 | ||
845 | |||
846 | static int gv11b_fifo_preempt_runlists(struct gk20a *g, u32 runlists_mask) | 852 | static int gv11b_fifo_preempt_runlists(struct gk20a *g, u32 runlists_mask) |
847 | { | 853 | { |
848 | int ret = 0; | 854 | int ret = 0; |
diff --git a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.h b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.h index 3f58f927..1ae3c93e 100644 --- a/drivers/gpu/nvgpu/gv11b/fifo_gv11b.h +++ b/drivers/gpu/nvgpu/gv11b/fifo_gv11b.h | |||
@@ -76,6 +76,7 @@ void gv11b_dump_channel_status_ramfc(struct gk20a *g, | |||
76 | void gv11b_dump_eng_status(struct gk20a *g, | 76 | void gv11b_dump_eng_status(struct gk20a *g, |
77 | struct gk20a_debug_output *o); | 77 | struct gk20a_debug_output *o); |
78 | u32 gv11b_fifo_intr_0_error_mask(struct gk20a *g); | 78 | u32 gv11b_fifo_intr_0_error_mask(struct gk20a *g); |
79 | int gv11b_fifo_reschedule_runlist(struct channel_gk20a *ch, bool preempt_next); | ||
79 | int gv11b_fifo_is_preempt_pending(struct gk20a *g, u32 id, | 80 | int gv11b_fifo_is_preempt_pending(struct gk20a *g, u32 id, |
80 | unsigned int id_type, unsigned int timeout_rc_type); | 81 | unsigned int id_type, unsigned int timeout_rc_type); |
81 | int gv11b_fifo_preempt_channel(struct gk20a *g, u32 chid); | 82 | int gv11b_fifo_preempt_channel(struct gk20a *g, u32 chid); |
diff --git a/drivers/gpu/nvgpu/gv11b/gv11b.c b/drivers/gpu/nvgpu/gv11b/gv11b.c index c1ad7944..09fe9a45 100644 --- a/drivers/gpu/nvgpu/gv11b/gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/gv11b.c | |||
@@ -154,6 +154,7 @@ int gv11b_init_gpu_characteristics(struct gk20a *g) | |||
154 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_TSG_SUBCONTEXTS, true); | 154 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_TSG_SUBCONTEXTS, true); |
155 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_IO_COHERENCE, true); | 155 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_IO_COHERENCE, true); |
156 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_SCG, true); | 156 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_SCG, true); |
157 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_RESCHEDULE_RUNLIST, true); | ||
157 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_SYNCPOINT_ADDRESS, true); | 158 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_SYNCPOINT_ADDRESS, true); |
158 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_USER_SYNCPOINT, true); | 159 | __nvgpu_set_enabled(g, NVGPU_SUPPORT_USER_SYNCPOINT, true); |
159 | 160 | ||
diff --git a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c index 290a9452..ff779075 100644 --- a/drivers/gpu/nvgpu/gv11b/hal_gv11b.c +++ b/drivers/gpu/nvgpu/gv11b/hal_gv11b.c | |||
@@ -503,6 +503,7 @@ static const struct gpu_ops gv11b_ops = { | |||
503 | .tsg_verify_channel_status = gk20a_fifo_tsg_unbind_channel_verify_status, | 503 | .tsg_verify_channel_status = gk20a_fifo_tsg_unbind_channel_verify_status, |
504 | .tsg_verify_status_ctx_reload = gm20b_fifo_tsg_verify_status_ctx_reload, | 504 | .tsg_verify_status_ctx_reload = gm20b_fifo_tsg_verify_status_ctx_reload, |
505 | .tsg_verify_status_faulted = gv11b_fifo_tsg_verify_status_faulted, | 505 | .tsg_verify_status_faulted = gv11b_fifo_tsg_verify_status_faulted, |
506 | .reschedule_runlist = gv11b_fifo_reschedule_runlist, | ||
506 | .update_runlist = gk20a_fifo_update_runlist, | 507 | .update_runlist = gk20a_fifo_update_runlist, |
507 | .trigger_mmu_fault = NULL, | 508 | .trigger_mmu_fault = NULL, |
508 | .get_mmu_fault_info = NULL, | 509 | .get_mmu_fault_info = NULL, |