diff options
author | David Li <davli@nvidia.com> | 2017-08-11 00:44:28 -0400 |
---|---|---|
committer | mobile promotions <svcmobile_promotions@nvidia.com> | 2017-08-31 21:44:54 -0400 |
commit | a199baede7e59fd0b303c50d4a25fc0ee7c290d9 (patch) | |
tree | 8ea5a03f27b5aa980136889300166681b91c9ac6 /drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |
parent | 4995389f6806433c65549250b5ab953611febc40 (diff) |
gpu: nvgpu: add NVGPU_SUBMIT_GPFIFO_FLAGS_RESCHEDULE_RUNLIST
NVGPU_SUBMIT_GPFIFO_FLAGS_RESCHEDULE_RUNLIST causes host to expire
current timeslice and reschedule from front of runlist.
This can be used with NVGPU_RUNLIST_INTERLEAVE_LEVEL_HIGH to make a
channel start sooner after submit rather than waiting for natural
timeslice expiration or block/finish of currently running channel.
Bug 1968813
Change-Id: I632e87c5f583a09ec8bf521dc73f595150abebb0
Signed-off-by: David Li <davli@nvidia.com>
Reviewed-on: http://git-master/r/#/c/1537198
Reviewed-on: https://git-master.nvidia.com/r/1537198
Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com>
GVS: Gerrit_Virtual_Submit
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/fifo_gk20a.c')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c index fd249bc9..7062a8a0 100644 --- a/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/fifo_gk20a.c | |||
@@ -3211,6 +3211,34 @@ end: | |||
3211 | return ret; | 3211 | return ret; |
3212 | } | 3212 | } |
3213 | 3213 | ||
3214 | /* trigger host to expire current timeslice and reschedule runlist from front */ | ||
3215 | int gk20a_fifo_reschedule_runlist(struct gk20a *g, u32 runlist_id) | ||
3216 | { | ||
3217 | struct fifo_runlist_info_gk20a *runlist; | ||
3218 | u32 token = PMU_INVALID_MUTEX_OWNER_ID; | ||
3219 | u32 mutex_ret; | ||
3220 | int ret = 0; | ||
3221 | |||
3222 | runlist = &g->fifo.runlist_info[runlist_id]; | ||
3223 | if (nvgpu_mutex_tryacquire(&runlist->mutex)) { | ||
3224 | mutex_ret = nvgpu_pmu_mutex_acquire( | ||
3225 | &g->pmu, PMU_MUTEX_ID_FIFO, &token); | ||
3226 | |||
3227 | gk20a_writel(g, fifo_runlist_r(), | ||
3228 | gk20a_readl(g, fifo_runlist_r())); | ||
3229 | gk20a_fifo_runlist_wait_pending(g, runlist_id); | ||
3230 | |||
3231 | if (!mutex_ret) | ||
3232 | nvgpu_pmu_mutex_release( | ||
3233 | &g->pmu, PMU_MUTEX_ID_FIFO, &token); | ||
3234 | nvgpu_mutex_release(&runlist->mutex); | ||
3235 | } else { | ||
3236 | /* someone else is writing fifo_runlist_r so not needed here */ | ||
3237 | ret = -EBUSY; | ||
3238 | } | ||
3239 | return ret; | ||
3240 | } | ||
3241 | |||
3214 | /* add/remove a channel from runlist | 3242 | /* add/remove a channel from runlist |
3215 | special cases below: runlist->active_channels will NOT be changed. | 3243 | special cases below: runlist->active_channels will NOT be changed. |
3216 | (chid == ~0 && !add) means remove all active channels from runlist. | 3244 | (chid == ~0 && !add) means remove all active channels from runlist. |