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.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
index 4d62d8e9..072f1777 100644
--- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c
@@ -2212,6 +2212,22 @@ int gk20a_fifo_tsg_unbind_channel_verify_status(struct channel_gk20a *ch)
2212 return 0; 2212 return 0;
2213} 2213}
2214 2214
2215static bool gk20a_fifo_tsg_is_multi_channel(struct tsg_gk20a *tsg)
2216{
2217 bool ret = false;
2218
2219 nvgpu_rwsem_down_read(&tsg->ch_list_lock);
2220 if (nvgpu_list_first_entry(&tsg->ch_list, channel_gk20a,
2221 ch_entry) !=
2222 nvgpu_list_last_entry(&tsg->ch_list, channel_gk20a,
2223 ch_entry)) {
2224 ret = true;
2225 }
2226 nvgpu_rwsem_up_read(&tsg->ch_list_lock);
2227
2228 return ret;
2229}
2230
2215int gk20a_fifo_tsg_unbind_channel(struct channel_gk20a *ch) 2231int gk20a_fifo_tsg_unbind_channel(struct channel_gk20a *ch)
2216{ 2232{
2217 struct gk20a *g = ch->g; 2233 struct gk20a *g = ch->g;
@@ -2237,7 +2253,12 @@ int gk20a_fifo_tsg_unbind_channel(struct channel_gk20a *ch)
2237 goto fail_enable_tsg; 2253 goto fail_enable_tsg;
2238 } 2254 }
2239 2255
2240 if (g->ops.fifo.tsg_verify_channel_status && !tsg_timedout) { 2256 /*
2257 * State validation is only necessary if there are multiple channels in
2258 * the TSG.
2259 */
2260 if (gk20a_fifo_tsg_is_multi_channel(tsg) &&
2261 g->ops.fifo.tsg_verify_channel_status && !tsg_timedout) {
2241 err = g->ops.fifo.tsg_verify_channel_status(ch); 2262 err = g->ops.fifo.tsg_verify_channel_status(ch);
2242 if (err) { 2263 if (err) {
2243 goto fail_enable_tsg; 2264 goto fail_enable_tsg;