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
|
/* we might need two extra gpfifo entries - one for pre fence
|
||||||
* and one for post fence. */
|
* and one for post fence. */
|
||||||
const int extra_entries = 2;
|
const int extra_entries = 2;
|
||||||
|
bool need_wfi = !(flags & NVHOST_SUBMIT_GPFIFO_FLAGS_SUPPRESS_WFI);
|
||||||
|
|
||||||
if (c->has_timedout)
|
if (c->has_timedout)
|
||||||
return -ETIMEDOUT;
|
return -ETIMEDOUT;
|
||||||
@@ -1549,10 +1550,12 @@ static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
|
|||||||
flags & NVHOST_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE)
|
flags & NVHOST_SUBMIT_GPFIFO_FLAGS_SYNC_FENCE)
|
||||||
err = c->sync->incr_user_fd(c->sync, &incr_cmd,
|
err = c->sync->incr_user_fd(c->sync, &incr_cmd,
|
||||||
&c->last_submit_fence,
|
&c->last_submit_fence,
|
||||||
|
need_wfi,
|
||||||
&fence->syncpt_id);
|
&fence->syncpt_id);
|
||||||
else if (flags & NVHOST_SUBMIT_GPFIFO_FLAGS_FENCE_GET)
|
else if (flags & NVHOST_SUBMIT_GPFIFO_FLAGS_FENCE_GET)
|
||||||
err = c->sync->incr_user_syncpt(c->sync, &incr_cmd,
|
err = c->sync->incr_user_syncpt(c->sync, &incr_cmd,
|
||||||
&c->last_submit_fence,
|
&c->last_submit_fence,
|
||||||
|
need_wfi,
|
||||||
&fence->syncpt_id,
|
&fence->syncpt_id,
|
||||||
&fence->value);
|
&fence->value);
|
||||||
else
|
else
|
||||||
@@ -1569,7 +1572,8 @@ static int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
|
|||||||
c->gpfifo.cpu_va[c->gpfifo.put].entry1 =
|
c->gpfifo.cpu_va[c->gpfifo.put].entry1 =
|
||||||
u64_hi32(wait_cmd->gva) |
|
u64_hi32(wait_cmd->gva) |
|
||||||
pbdma_gp_entry1_length_f(wait_cmd->size);
|
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.put = (c->gpfifo.put + 1) &
|
||||||
(c->gpfifo.entry_num - 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 =
|
c->gpfifo.cpu_va[c->gpfifo.put].entry1 =
|
||||||
u64_hi32(incr_cmd->gva) |
|
u64_hi32(incr_cmd->gva) |
|
||||||
pbdma_gp_entry1_length_f(incr_cmd->size);
|
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.put = (c->gpfifo.put + 1) &
|
||||||
(c->gpfifo.entry_num - 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,
|
int gk20a_channel_syncpt_incr_user_syncpt(struct gk20a_channel_sync *s,
|
||||||
struct priv_cmd_entry **entry,
|
struct priv_cmd_entry **entry,
|
||||||
struct gk20a_channel_fence *fence,
|
struct gk20a_channel_fence *fence,
|
||||||
|
bool wfi,
|
||||||
u32 *id, u32 *thresh)
|
u32 *id, u32 *thresh)
|
||||||
{
|
{
|
||||||
struct gk20a_channel_syncpt *sp =
|
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
|
/* Need to do 'host incr + wfi' or 'gfx incr' since we return the fence
|
||||||
* to user space. */
|
* to user space. */
|
||||||
int err = __gk20a_channel_syncpt_incr(s,
|
int err = __gk20a_channel_syncpt_incr(s,
|
||||||
|
wfi &&
|
||||||
sp->c->obj_class == KEPLER_C /* use gfx class? */,
|
sp->c->obj_class == KEPLER_C /* use gfx class? */,
|
||||||
|
wfi &&
|
||||||
sp->c->obj_class != KEPLER_C /* wfi if host class */,
|
sp->c->obj_class != KEPLER_C /* wfi if host class */,
|
||||||
true /* register irq */,
|
true /* register irq */,
|
||||||
entry, fence);
|
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,
|
int gk20a_channel_syncpt_incr_user_fd(struct gk20a_channel_sync *s,
|
||||||
struct priv_cmd_entry **entry,
|
struct priv_cmd_entry **entry,
|
||||||
struct gk20a_channel_fence *fence,
|
struct gk20a_channel_fence *fence,
|
||||||
|
bool wfi,
|
||||||
int *fd)
|
int *fd)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SYNC
|
#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 nvhost_ctrl_sync_fence_info pt;
|
||||||
struct gk20a_channel_syncpt *sp =
|
struct gk20a_channel_syncpt *sp =
|
||||||
container_of(s, struct gk20a_channel_syncpt, ops);
|
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);
|
&pt.id, &pt.thresh);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ struct gk20a_channel_sync {
|
|||||||
int (*incr_user_syncpt)(struct gk20a_channel_sync *s,
|
int (*incr_user_syncpt)(struct gk20a_channel_sync *s,
|
||||||
struct priv_cmd_entry **entry,
|
struct priv_cmd_entry **entry,
|
||||||
struct gk20a_channel_fence *fence,
|
struct gk20a_channel_fence *fence,
|
||||||
|
bool wfi,
|
||||||
u32 *id, u32 *thresh);
|
u32 *id, u32 *thresh);
|
||||||
|
|
||||||
/* Increment syncpoint/semaphore, so that the returned fence represents
|
/* 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,
|
int (*incr_user_fd)(struct gk20a_channel_sync *s,
|
||||||
struct priv_cmd_entry **entry,
|
struct priv_cmd_entry **entry,
|
||||||
struct gk20a_channel_fence *fence,
|
struct gk20a_channel_fence *fence,
|
||||||
|
bool wfi,
|
||||||
int *fd);
|
int *fd);
|
||||||
|
|
||||||
/* Reset the channel syncpoint/semaphore. */
|
/* Reset the channel syncpoint/semaphore. */
|
||||||
|
|||||||
Reference in New Issue
Block a user