diff options
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 23 |
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 | ||
2215 | static 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 | |||
2215 | int gk20a_fifo_tsg_unbind_channel(struct channel_gk20a *ch) | 2231 | int 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; |