summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSeema Khowala <seemaj@nvidia.com>2018-06-26 15:33:02 -0400
committermobile promotions <svcmobile_promotions@nvidia.com>2018-07-30 03:21:04 -0400
commit4cbec6b2c7f74f309fb4bc5d4981c42ae6ea3bcd (patch)
tree0797b3884c771aaf56eeceac091d7c2516256b6d
parent5d2058791fa5a917201634b034a8736522585e26 (diff)
gpu: nvgpu: set preempt timeout
-For Si platforms, gk20a_get_gr_idle_timeout returns 3000 ms i.e. 3 sec. Currently this time is used for preempt polling and this conflicts with channel timeout if polling times out. Use fifo_eng_timeout_us converted to ms for preempt polling. -In case of preempt timeout, do not issue recovery for si platform. ctxsw timeout will trigger recovery if needed. For non si platforms, issue preempt timeout rc if preempt times out. Bug 2113657 Bug 2064553 Bug 2038366 Bug 2028993 Bug 200426402 Change-Id: I8d9f58be9ac634e94defa92a20fb737bf256d841 Signed-off-by: Seema Khowala <seemaj@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/1762076 GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c46
1 files changed, 40 insertions, 6 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 1bf38080..306f05a7 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -2743,6 +2743,17 @@ void gk20a_fifo_issue_preempt(struct gk20a *g, u32 id, bool is_tsg)
2743 fifo_preempt_type_channel_f()); 2743 fifo_preempt_type_channel_f());
2744} 2744}
2745 2745
2746static u32 gk20a_fifo_get_preempt_timeout(struct gk20a *g)
2747{
2748 /* Use fifo_eng_timeout converted to ms for preempt
2749 * polling. gr_idle_timeout i.e 3000 ms is and not appropriate
2750 * for polling preempt done as context switch timeout gets
2751 * triggered every 100 ms and context switch recovery
2752 * happens every 3000 ms */
2753
2754 return g->fifo_eng_timeout_us / 1000;
2755}
2756
2746int gk20a_fifo_is_preempt_pending(struct gk20a *g, u32 id, 2757int gk20a_fifo_is_preempt_pending(struct gk20a *g, u32 id,
2747 unsigned int id_type) 2758 unsigned int id_type)
2748{ 2759{
@@ -2750,7 +2761,7 @@ int gk20a_fifo_is_preempt_pending(struct gk20a *g, u32 id,
2750 u32 delay = GR_IDLE_CHECK_DEFAULT; 2761 u32 delay = GR_IDLE_CHECK_DEFAULT;
2751 int ret = -EBUSY; 2762 int ret = -EBUSY;
2752 2763
2753 nvgpu_timeout_init(g, &timeout, gk20a_get_gr_idle_timeout(g), 2764 nvgpu_timeout_init(g, &timeout, gk20a_fifo_get_preempt_timeout(g),
2754 NVGPU_TIMER_CPU_TIMER); 2765 NVGPU_TIMER_CPU_TIMER);
2755 do { 2766 do {
2756 if (!(gk20a_readl(g, fifo_preempt_r()) & 2767 if (!(gk20a_readl(g, fifo_preempt_r()) &
@@ -2761,8 +2772,12 @@ int gk20a_fifo_is_preempt_pending(struct gk20a *g, u32 id,
2761 2772
2762 nvgpu_usleep_range(delay, delay * 2); 2773 nvgpu_usleep_range(delay, delay * 2);
2763 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX); 2774 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX);
2764 } while (!nvgpu_timeout_expired_msg(&timeout, "preempt timeout")); 2775 } while (!nvgpu_timeout_expired(&timeout));
2765 2776
2777 if (ret) {
2778 nvgpu_err(g, "preempt timeout: id: %u id_type: %d ",
2779 id, id_type);
2780 }
2766 return ret; 2781 return ret;
2767} 2782}
2768 2783
@@ -2848,8 +2863,16 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 chid)
2848 for (i = 0; i < g->fifo.max_runlists; i++) 2863 for (i = 0; i < g->fifo.max_runlists; i++)
2849 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock); 2864 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock);
2850 2865
2851 if (ret) 2866 if (ret) {
2852 gk20a_fifo_preempt_timeout_rc(g, chid, false); 2867 if (nvgpu_platform_is_silicon(g)) {
2868 nvgpu_err(g, "preempt timed out for chid: %u, "
2869 "ctxsw timeout will trigger recovery if needed", chid);
2870 } else {
2871 gk20a_fifo_preempt_timeout_rc(g, chid, false);
2872 }
2873 }
2874
2875
2853 2876
2854 return ret; 2877 return ret;
2855} 2878}
@@ -2880,8 +2903,14 @@ int gk20a_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
2880 for (i = 0; i < g->fifo.max_runlists; i++) 2903 for (i = 0; i < g->fifo.max_runlists; i++)
2881 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock); 2904 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock);
2882 2905
2883 if (ret) 2906 if (ret) {
2884 gk20a_fifo_preempt_timeout_rc(g, tsgid, true); 2907 if (nvgpu_platform_is_silicon(g)) {
2908 nvgpu_err(g, "preempt timed out for tsgid: %u, "
2909 "ctxsw timeout will trigger recovery if needed", tsgid);
2910 } else {
2911 gk20a_fifo_preempt_timeout_rc(g, tsgid, true);
2912 }
2913 }
2885 2914
2886 return ret; 2915 return ret;
2887} 2916}
@@ -3121,6 +3150,11 @@ int gk20a_fifo_runlist_wait_pending(struct gk20a *g, u32 runlist_id)
3121 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX); 3150 delay = min_t(u32, delay << 1, GR_IDLE_CHECK_MAX);
3122 } while (!nvgpu_timeout_expired(&timeout)); 3151 } while (!nvgpu_timeout_expired(&timeout));
3123 3152
3153 if (ret) {
3154 nvgpu_err(g, "runlist wait timeout: runlist id: %u",
3155 runlist_id);
3156 }
3157
3124 return ret; 3158 return ret;
3125} 3159}
3126 3160