diff options
author | Terje Bergstrom <tbergstrom@nvidia.com> | 2015-02-23 23:51:18 -0500 |
---|---|---|
committer | Alexander Van Brunt <avanbrunt@nvidia.com> | 2015-05-05 16:55:35 -0400 |
commit | 9bbffa11de08a96f7f0f1df887bca1e22a85e0f0 (patch) | |
tree | 6927538a71607c6744a14318af9dce986a36c386 /drivers/gpu/nvgpu | |
parent | 6e1dfd0131a7db58c2bf4ccf0809c76edb2e8804 (diff) |
gpu: nvgpu: Reconfigure instance block with syncpt
Resetup RAMFC once sync point id is allocated for a channel.
Change-Id: Idbac406bea1c94c89ef587dda08fddc740c1fadb
Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com>
Reviewed-on: http://git-master/r/711302
Reviewed-on: http://git-master/r/737526
Reviewed-by: Alexander Van Brunt <avanbrunt@nvidia.com>
Tested-by: Alexander Van Brunt <avanbrunt@nvidia.com>
Reviewed-by: Automatic_Commit_Validation_User
Diffstat (limited to 'drivers/gpu/nvgpu')
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_gk20a.c | 10 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | 14 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h | 3 | ||||
-rw-r--r-- | drivers/gpu/nvgpu/gk20a/gk20a.h | 1 |
4 files changed, 27 insertions, 1 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c index dafed8f8..1a5cf5c4 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |||
@@ -1233,7 +1233,7 @@ static int gk20a_channel_submit_wfi(struct channel_gk20a *c) | |||
1233 | struct priv_cmd_entry *cmd = NULL; | 1233 | struct priv_cmd_entry *cmd = NULL; |
1234 | struct gk20a *g = c->g; | 1234 | struct gk20a *g = c->g; |
1235 | u32 free_count; | 1235 | u32 free_count; |
1236 | int err; | 1236 | int err = 0; |
1237 | 1237 | ||
1238 | if (c->has_timedout) | 1238 | if (c->has_timedout) |
1239 | return -ETIMEDOUT; | 1239 | return -ETIMEDOUT; |
@@ -1254,6 +1254,10 @@ static int gk20a_channel_submit_wfi(struct channel_gk20a *c) | |||
1254 | mutex_unlock(&c->submit_lock); | 1254 | mutex_unlock(&c->submit_lock); |
1255 | return -ENOMEM; | 1255 | return -ENOMEM; |
1256 | } | 1256 | } |
1257 | if (g->ops.fifo.resetup_ramfc) | ||
1258 | err = g->ops.fifo.resetup_ramfc(c); | ||
1259 | if (err) | ||
1260 | return err; | ||
1257 | } | 1261 | } |
1258 | 1262 | ||
1259 | gk20a_fence_put(c->last_submit.pre_fence); | 1263 | gk20a_fence_put(c->last_submit.pre_fence); |
@@ -1547,6 +1551,10 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c, | |||
1547 | mutex_unlock(&c->submit_lock); | 1551 | mutex_unlock(&c->submit_lock); |
1548 | goto clean_up; | 1552 | goto clean_up; |
1549 | } | 1553 | } |
1554 | if (g->ops.fifo.resetup_ramfc) | ||
1555 | err = g->ops.fifo.resetup_ramfc(c); | ||
1556 | if (err) | ||
1557 | return err; | ||
1550 | } | 1558 | } |
1551 | 1559 | ||
1552 | /* | 1560 | /* |
diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c index 73b2d7ec..a488178f 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.c | |||
@@ -271,6 +271,13 @@ static void gk20a_channel_syncpt_signal_timeline( | |||
271 | /* Nothing to do. */ | 271 | /* Nothing to do. */ |
272 | } | 272 | } |
273 | 273 | ||
274 | static int gk20a_channel_syncpt_id(struct gk20a_channel_sync *s) | ||
275 | { | ||
276 | struct gk20a_channel_syncpt *sp = | ||
277 | container_of(s, struct gk20a_channel_syncpt, ops); | ||
278 | return sp->id; | ||
279 | } | ||
280 | |||
274 | static void gk20a_channel_syncpt_destroy(struct gk20a_channel_sync *s) | 281 | static void gk20a_channel_syncpt_destroy(struct gk20a_channel_sync *s) |
275 | { | 282 | { |
276 | struct gk20a_channel_syncpt *sp = | 283 | struct gk20a_channel_syncpt *sp = |
@@ -306,6 +313,7 @@ gk20a_channel_syncpt_create(struct channel_gk20a *c) | |||
306 | sp->ops.incr_user = gk20a_channel_syncpt_incr_user; | 313 | sp->ops.incr_user = gk20a_channel_syncpt_incr_user; |
307 | sp->ops.set_min_eq_max = gk20a_channel_syncpt_set_min_eq_max; | 314 | sp->ops.set_min_eq_max = gk20a_channel_syncpt_set_min_eq_max; |
308 | sp->ops.signal_timeline = gk20a_channel_syncpt_signal_timeline; | 315 | sp->ops.signal_timeline = gk20a_channel_syncpt_signal_timeline; |
316 | sp->ops.syncpt_id = gk20a_channel_syncpt_id; | ||
309 | sp->ops.destroy = gk20a_channel_syncpt_destroy; | 317 | sp->ops.destroy = gk20a_channel_syncpt_destroy; |
310 | 318 | ||
311 | sp->ops.aggressive_destroy = true; | 319 | sp->ops.aggressive_destroy = true; |
@@ -587,6 +595,11 @@ static void gk20a_channel_semaphore_signal_timeline( | |||
587 | gk20a_sync_timeline_signal(sp->timeline); | 595 | gk20a_sync_timeline_signal(sp->timeline); |
588 | } | 596 | } |
589 | 597 | ||
598 | static int gk20a_channel_semaphore_syncpt_id(struct gk20a_channel_sync *s) | ||
599 | { | ||
600 | return -EINVAL; | ||
601 | } | ||
602 | |||
590 | static void gk20a_channel_semaphore_destroy(struct gk20a_channel_sync *s) | 603 | static void gk20a_channel_semaphore_destroy(struct gk20a_channel_sync *s) |
591 | { | 604 | { |
592 | struct gk20a_channel_semaphore *sema = | 605 | struct gk20a_channel_semaphore *sema = |
@@ -645,6 +658,7 @@ gk20a_channel_semaphore_create(struct channel_gk20a *c) | |||
645 | sema->ops.incr_user = gk20a_channel_semaphore_incr_user; | 658 | sema->ops.incr_user = gk20a_channel_semaphore_incr_user; |
646 | sema->ops.set_min_eq_max = gk20a_channel_semaphore_set_min_eq_max; | 659 | sema->ops.set_min_eq_max = gk20a_channel_semaphore_set_min_eq_max; |
647 | sema->ops.signal_timeline = gk20a_channel_semaphore_signal_timeline; | 660 | sema->ops.signal_timeline = gk20a_channel_semaphore_signal_timeline; |
661 | sema->ops.syncpt_id = gk20a_channel_semaphore_syncpt_id; | ||
648 | sema->ops.destroy = gk20a_channel_semaphore_destroy; | 662 | sema->ops.destroy = gk20a_channel_semaphore_destroy; |
649 | 663 | ||
650 | /* Aggressively destroying the semaphore sync would cause overhead | 664 | /* Aggressively destroying the semaphore sync would cause overhead |
diff --git a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h index a3cd8208..a347cbab 100644 --- a/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/channel_sync_gk20a.h | |||
@@ -86,6 +86,9 @@ struct gk20a_channel_sync { | |||
86 | * expired. */ | 86 | * expired. */ |
87 | void (*signal_timeline)(struct gk20a_channel_sync *s); | 87 | void (*signal_timeline)(struct gk20a_channel_sync *s); |
88 | 88 | ||
89 | /* Returns the sync point id or negative number if no syncpt*/ | ||
90 | int (*syncpt_id)(struct gk20a_channel_sync *s); | ||
91 | |||
89 | /* flag to set sync destroy aggressiveness */ | 92 | /* flag to set sync destroy aggressiveness */ |
90 | bool aggressive_destroy; | 93 | bool aggressive_destroy; |
91 | 94 | ||
diff --git a/drivers/gpu/nvgpu/gk20a/gk20a.h b/drivers/gpu/nvgpu/gk20a/gk20a.h index 2b905dcc..7e919e2e 100644 --- a/drivers/gpu/nvgpu/gk20a/gk20a.h +++ b/drivers/gpu/nvgpu/gk20a/gk20a.h | |||
@@ -217,6 +217,7 @@ struct gpu_ops { | |||
217 | void (*free_inst)(struct gk20a *g, struct channel_gk20a *ch); | 217 | void (*free_inst)(struct gk20a *g, struct channel_gk20a *ch); |
218 | int (*setup_ramfc)(struct channel_gk20a *c, u64 gpfifo_base, | 218 | int (*setup_ramfc)(struct channel_gk20a *c, u64 gpfifo_base, |
219 | u32 gpfifo_entries); | 219 | u32 gpfifo_entries); |
220 | int (*resetup_ramfc)(struct channel_gk20a *c); | ||
220 | int (*preempt_channel)(struct gk20a *g, u32 hw_chid); | 221 | int (*preempt_channel)(struct gk20a *g, u32 hw_chid); |
221 | int (*update_runlist)(struct gk20a *g, u32 runlist_id, | 222 | int (*update_runlist)(struct gk20a *g, u32 runlist_id, |
222 | u32 hw_chid, bool add, | 223 | u32 hw_chid, bool add, |