diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2014-09-10 07:04:32 -0400 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2015-03-18 15:11:17 -0400 |
commit | 1c7dcfdeef3b0672317fca947cb2097e97c623a9 (patch) | |
tree | f5e9c6a843d3e0079f1a124d2b9ffc21bb7585b5 /drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |
parent | 2f232348e686f92a6a34e5fa7b98884d4b48313b (diff) |
gpu: nvgpu: use TSG recover API
Use TSG specific API gk20a_fifo_recover_tsg() in following cases :
- IOCTL_CHANNEL_FORCE_RESET
to force reset a channel in TSG, reset all the channels
- handle pbdma intr
while resetting in case of pbdma intr, if channel is part of
TSG, recover entire TSG
- TSG preempt failure
when TSG preempt times out, use TSG recover API
Use preempt_tsg() API to preempt if channel is part of TSG
Add below two generic APIs which will take care of preempting/
recovering either of channel or TSG as required
gk20a_fifo_preempt()
gk20a_fifo_force_reset_ch()
Bug 1470692
Change-Id: I8d46e252af79136be85a9a2accf8b51bd924ca8c
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/497875
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index 7a3132c9..1e71c1c7 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -2293,8 +2293,6 @@ long gk20a_channel_ioctl(struct file *filp, | |||
2293 | gk20a_idle(dev); | 2293 | gk20a_idle(dev); |
2294 | break; | 2294 | break; |
2295 | case NVHOST_IOCTL_CHANNEL_PREEMPT: | 2295 | case NVHOST_IOCTL_CHANNEL_PREEMPT: |
2296 | if (gk20a_is_channel_marked_as_tsg(ch)) | ||
2297 | return -EINVAL; | ||
2298 | err = gk20a_busy(dev); | 2296 | err = gk20a_busy(dev); |
2299 | if (err) { | 2297 | if (err) { |
2300 | dev_err(&dev->dev, | 2298 | dev_err(&dev->dev, |
@@ -2302,8 +2300,7 @@ long gk20a_channel_ioctl(struct file *filp, | |||
2302 | __func__, cmd); | 2300 | __func__, cmd); |
2303 | return err; | 2301 | return err; |
2304 | } | 2302 | } |
2305 | /* preempt channel */ | 2303 | err = gk20a_fifo_preempt(ch->g, ch); |
2306 | err = gk20a_fifo_preempt_channel(ch->g, ch->hw_chid); | ||
2307 | gk20a_idle(dev); | 2304 | gk20a_idle(dev); |
2308 | break; | 2305 | break; |
2309 | case NVHOST_IOCTL_CHANNEL_FORCE_RESET: | 2306 | case NVHOST_IOCTL_CHANNEL_FORCE_RESET: |
@@ -2314,9 +2311,7 @@ long gk20a_channel_ioctl(struct file *filp, | |||
2314 | __func__, cmd); | 2311 | __func__, cmd); |
2315 | return err; | 2312 | return err; |
2316 | } | 2313 | } |
2317 | gk20a_set_error_notifier(ch, | 2314 | err = gk20a_fifo_force_reset_ch(ch, true); |
2318 | NVHOST_CHANNEL_RESETCHANNEL_VERIF_ERROR); | ||
2319 | gk20a_fifo_recover_ch(ch->g, ch->hw_chid, true); | ||
2320 | gk20a_idle(dev); | 2315 | gk20a_idle(dev); |
2321 | break; | 2316 | break; |
2322 | default: | 2317 | default: |