mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
gpu: nvgpu: Allow suppressing WFI on submit
Allow suppressing WFI when submitting work and requesting a fence back. Bug 1491545 Change-Id: Ic3d061bb4f116cf7ea68dbd6a1b2ace9f11d0ab5 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/390457
This commit is contained in:
committed by
Dan Willemsen
parent
af8c1dc3a8
commit
2fbf6e7afb
@@ -1450,6 +1450,7 @@ static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
|
||||
/* we might need two extra gpfifo entries - one for pre fence
|
||||
* and one for post fence. */
|
||||
const int extra_entries = 2;
|
||||
bool need_wfi = !(flags & NVHOST_SUBMIT_GPFIFO_FLAGS_SUPPRESS_WFI);
|
||||
|
||||
if (c->has_timedout)
|
||||
return -ETIMEDOUT;
|
||||
@@ -1549,10 +1550,12 @@ static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
|
||||
flags & NVHOST_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE)
|
||||
err = c->sync->incr_user_fd(c->sync, &incr_cmd,
|
||||
&c->last_submit_fence,
|
||||
need_wfi,
|
||||
&fence->syncpt_id);
|
||||
else if (flags & NVHOST_SUBMIT_GPFIFO_FLAGS_FENCE_GET)
|
||||
err = c->sync->incr_user_syncpt(c->sync, &incr_cmd,
|
||||
&c->last_submit_fence,
|
||||
need_wfi,
|
||||
&fence->syncpt_id,
|
||||
&fence->value);
|
||||
else
|
||||
@@ -1569,7 +1572,8 @@ static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
|
||||
c->gpfifo.cpu_va[c->gpfifo.put].entry1 =
|
||||
u64_hi32(wait_cmd->gva) |
|
||||
pbdma_gp_entry1_length_f(wait_cmd->size);
|
||||
trace_write_pushbuffer(c, &c->gpfifo.cpu_va[c->gpfifo.put]);
|
||||
trace_gk20a_push_cmdbuf(c->g->dev->name,
|
||||
0, wait_cmd->size, 0, wait_cmd->ptr);
|
||||
|
||||
c->gpfifo.put = (c->gpfifo.put + 1) &
|
||||
(c->gpfifo.entry_num - 1);
|
||||
@@ -1594,7 +1598,8 @@ static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
|
||||
c->gpfifo.cpu_va[c->gpfifo.put].entry1 =
|
||||
u64_hi32(incr_cmd->gva) |
|
||||
pbdma_gp_entry1_length_f(incr_cmd->size);
|
||||
trace_write_pushbuffer(c, &c->gpfifo.cpu_va[c->gpfifo.put]);
|
||||
trace_gk20a_push_cmdbuf(c->g->dev->name,
|
||||
0, incr_cmd->size, 0, incr_cmd->ptr);
|
||||
|
||||
c->gpfifo.put = (c->gpfifo.put + 1) &
|
||||
(c->gpfifo.entry_num - 1);
|
||||
|
||||
@@ -279,6 +279,7 @@ int gk20a_channel_syncpt_incr(struct gk20a_channel_sync *s,
|
||||
int gk20a_channel_syncpt_incr_user_syncpt(struct gk20a_channel_sync *s,
|
||||
struct priv_cmd_entry **entry,
|
||||
struct gk20a_channel_fence *fence,
|
||||
bool wfi,
|
||||
u32 *id, u32 *thresh)
|
||||
{
|
||||
struct gk20a_channel_syncpt *sp =
|
||||
@@ -286,7 +287,9 @@ int gk20a_channel_syncpt_incr_user_syncpt(struct gk20a_channel_sync *s,
|
||||
/* Need to do 'host incr + wfi' or 'gfx incr' since we return the fence
|
||||
* to user space. */
|
||||
int err = __gk20a_channel_syncpt_incr(s,
|
||||
wfi &&
|
||||
sp->c->obj_class == KEPLER_C /* use gfx class? */,
|
||||
wfi &&
|
||||
sp->c->obj_class != KEPLER_C /* wfi if host class */,
|
||||
true /* register irq */,
|
||||
entry, fence);
|
||||
@@ -300,6 +303,7 @@ int gk20a_channel_syncpt_incr_user_syncpt(struct gk20a_channel_sync *s,
|
||||
int gk20a_channel_syncpt_incr_user_fd(struct gk20a_channel_sync *s,
|
||||
struct priv_cmd_entry **entry,
|
||||
struct gk20a_channel_fence *fence,
|
||||
bool wfi,
|
||||
int *fd)
|
||||
{
|
||||
#ifdef CONFIG_SYNC
|
||||
@@ -307,7 +311,7 @@ int gk20a_channel_syncpt_incr_user_fd(struct gk20a_channel_sync *s,
|
||||
struct nvhost_ctrl_sync_fence_info pt;
|
||||
struct gk20a_channel_syncpt *sp =
|
||||
container_of(s, struct gk20a_channel_syncpt, ops);
|
||||
err = gk20a_channel_syncpt_incr_user_syncpt(s, entry, fence,
|
||||
err = gk20a_channel_syncpt_incr_user_syncpt(s, entry, fence, wfi,
|
||||
&pt.id, &pt.thresh);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -77,6 +77,7 @@ struct gk20a_channel_sync {
|
||||
int (*incr_user_syncpt)(struct gk20a_channel_sync *s,
|
||||
struct priv_cmd_entry **entry,
|
||||
struct gk20a_channel_fence *fence,
|
||||
bool wfi,
|
||||
u32 *id, u32 *thresh);
|
||||
|
||||
/* Increment syncpoint/semaphore, so that the returned fence represents
|
||||
@@ -89,6 +90,7 @@ struct gk20a_channel_sync {
|
||||
int (*incr_user_fd)(struct gk20a_channel_sync *s,
|
||||
struct priv_cmd_entry **entry,
|
||||
struct gk20a_channel_fence *fence,
|
||||
bool wfi,
|
||||
int *fd);
|
||||
|
||||
/* Reset the channel syncpoint/semaphore. */
|
||||
|
||||
Reference in New Issue
Block a user