summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/fifo_gk20a.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index aada3065..22dc1d60 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -2721,7 +2721,7 @@ int gk20a_fifo_is_preempt_pending(struct gk20a *g, u32 id,
2721 return ret; 2721 return ret;
2722} 2722}
2723 2723
2724void __locked_fifo_preempt_timeout_rc(struct gk20a *g, u32 id, 2724void gk20a_fifo_preempt_timeout_rc(struct gk20a *g, u32 id,
2725 unsigned int id_type) 2725 unsigned int id_type)
2726{ 2726{
2727 if (id_type == ID_TYPE_TSG) { 2727 if (id_type == ID_TYPE_TSG) {
@@ -2764,7 +2764,7 @@ int __locked_fifo_preempt(struct gk20a *g, u32 id, bool is_tsg)
2764 int ret; 2764 int ret;
2765 unsigned int id_type; 2765 unsigned int id_type;
2766 2766
2767 nvgpu_log_fn(g, "%d", id); 2767 nvgpu_log_fn(g, "id: %d is_tsg: %d", id, is_tsg);
2768 2768
2769 /* issue preempt */ 2769 /* issue preempt */
2770 gk20a_fifo_issue_preempt(g, id, is_tsg); 2770 gk20a_fifo_issue_preempt(g, id, is_tsg);
@@ -2774,10 +2774,6 @@ int __locked_fifo_preempt(struct gk20a *g, u32 id, bool is_tsg)
2774 /* wait for preempt */ 2774 /* wait for preempt */
2775 ret = g->ops.fifo.is_preempt_pending(g, id, id_type, 2775 ret = g->ops.fifo.is_preempt_pending(g, id, id_type,
2776 PREEMPT_TIMEOUT_RC); 2776 PREEMPT_TIMEOUT_RC);
2777
2778 if (ret)
2779 __locked_fifo_preempt_timeout_rc(g, id, id_type);
2780
2781 return ret; 2777 return ret;
2782} 2778}
2783 2779
@@ -2789,7 +2785,9 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 chid)
2789 u32 mutex_ret = 0; 2785 u32 mutex_ret = 0;
2790 u32 i; 2786 u32 i;
2791 2787
2792 nvgpu_log_fn(g, "%d", chid); 2788 nvgpu_log_fn(g, "chid: %d", chid);
2789 if (chid == FIFO_INVAL_CHANNEL_ID)
2790 return 0;
2793 2791
2794 /* we have no idea which runlist we are using. lock all */ 2792 /* we have no idea which runlist we are using. lock all */
2795 for (i = 0; i < g->fifo.max_runlists; i++) 2793 for (i = 0; i < g->fifo.max_runlists; i++)
@@ -2805,6 +2803,9 @@ int gk20a_fifo_preempt_channel(struct gk20a *g, u32 chid)
2805 for (i = 0; i < g->fifo.max_runlists; i++) 2803 for (i = 0; i < g->fifo.max_runlists; i++)
2806 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock); 2804 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock);
2807 2805
2806 if (ret)
2807 gk20a_fifo_preempt_timeout_rc(g, chid, false);
2808
2808 return ret; 2809 return ret;
2809} 2810}
2810 2811
@@ -2816,7 +2817,9 @@ int gk20a_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
2816 u32 mutex_ret = 0; 2817 u32 mutex_ret = 0;
2817 u32 i; 2818 u32 i;
2818 2819
2819 nvgpu_log_fn(g, "%d", tsgid); 2820 nvgpu_log_fn(g, "tsgid: %d", tsgid);
2821 if (tsgid == FIFO_INVAL_TSG_ID)
2822 return 0;
2820 2823
2821 /* we have no idea which runlist we are using. lock all */ 2824 /* we have no idea which runlist we are using. lock all */
2822 for (i = 0; i < g->fifo.max_runlists; i++) 2825 for (i = 0; i < g->fifo.max_runlists; i++)
@@ -2832,6 +2835,9 @@ int gk20a_fifo_preempt_tsg(struct gk20a *g, u32 tsgid)
2832 for (i = 0; i < g->fifo.max_runlists; i++) 2835 for (i = 0; i < g->fifo.max_runlists; i++)
2833 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock); 2836 nvgpu_mutex_release(&f->runlist_info[i].runlist_lock);
2834 2837
2838 if (ret)
2839 gk20a_fifo_preempt_timeout_rc(g, tsgid, true);
2840
2835 return ret; 2841 return ret;
2836} 2842}
2837 2843