diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 22 |
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 | ||
2724 | void __locked_fifo_preempt_timeout_rc(struct gk20a *g, u32 id, | 2724 | void 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 | ||