summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gp10b/fifo_gp10b.c
diff options
context:
space:
mode:
authorTerje Bergstrom <tbergstrom@nvidia.com>2015-06-12 11:42:27 -0400
committerDeepak Nibade <dnibade@nvidia.com>2016-12-27 04:52:06 -0500
commitd42ca3a0fc70473135a90013515c739da57319a9 (patch)
tree39d5abfe4715cf8ad25da97cd5b1d523e29257d4 /drivers/gpu/nvgpu/gp10b/fifo_gp10b.c
parent3b5a1295fa7b19296da4b370a08025d0bc6f5998 (diff)
gpu: nvgpu: gp10b: Lazy sync point update
Update sync point protection field only when we have a valid sync point id, and the new id is different from old id. Bug 1653328 Change-Id: Ie07e26f8abd7c8239ad562603b62fda00164cbc7 Signed-off-by: Terje Bergstrom <tbergstrom@nvidia.com> Reviewed-on: http://git-master/r/757102 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Deepak Nibade <dnibade@nvidia.com> Reviewed-by: Konsta Holtta <kholtta@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gp10b/fifo_gp10b.c')
-rw-r--r--drivers/gpu/nvgpu/gp10b/fifo_gp10b.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/gpu/nvgpu/gp10b/fifo_gp10b.c b/drivers/gpu/nvgpu/gp10b/fifo_gp10b.c
index 3a6c3c23..8c53978b 100644
--- a/drivers/gpu/nvgpu/gp10b/fifo_gp10b.c
+++ b/drivers/gpu/nvgpu/gp10b/fifo_gp10b.c
@@ -150,31 +150,34 @@ static u32 gp10b_fifo_get_pbdma_signature(struct gk20a *g)
150 150
151static int gp10b_fifo_resetup_ramfc(struct channel_gk20a *c) 151static int gp10b_fifo_resetup_ramfc(struct channel_gk20a *c)
152{ 152{
153 int syncpt_id; 153 u32 new_syncpt = 0, old_syncpt;
154 void *inst_ptr; 154 void *inst_ptr;
155 u32 v;
155 156
156 gk20a_dbg_fn(""); 157 gk20a_dbg_fn("");
157 158
158 inst_ptr = c->inst_block.cpu_va; 159 inst_ptr = c->inst_block.cpu_va;
159 160
160 /* disable channel */ 161 v = gk20a_mem_rd32(inst_ptr, ram_fc_allowed_syncpoints_w());
161 c->g->ops.fifo.disable_channel(c); 162 old_syncpt = pbdma_allowed_syncpoints_0_index_v(v);
163 if (c->sync)
164 new_syncpt = c->sync->syncpt_id(c->sync);
162 165
163 /* preempt the channel */ 166 if (new_syncpt && new_syncpt != old_syncpt) {
164 WARN_ON(c->g->ops.fifo.preempt_channel(c->g, c->hw_chid)); 167 /* disable channel */
168 c->g->ops.fifo.disable_channel(c);
165 169
166 if (c->sync) { 170 /* preempt the channel */
167 u32 v = pbdma_allowed_syncpoints_0_valid_f(1); 171 WARN_ON(c->g->ops.fifo.preempt_channel(c->g, c->hw_chid));
172
173 v = pbdma_allowed_syncpoints_0_valid_f(1);
168 174
169 syncpt_id = c->sync->syncpt_id(c->sync);
170 gk20a_dbg_info("Channel %d, syncpt id %d\n", 175 gk20a_dbg_info("Channel %d, syncpt id %d\n",
171 c->hw_chid, syncpt_id); 176 c->hw_chid, new_syncpt);
172 177
173 v |= pbdma_allowed_syncpoints_0_index_f(syncpt_id); 178 v |= pbdma_allowed_syncpoints_0_index_f(new_syncpt);
174 179
175 gk20a_mem_wr32(inst_ptr, ram_fc_allowed_syncpoints_w(), v); 180 gk20a_mem_wr32(inst_ptr, ram_fc_allowed_syncpoints_w(), v);
176 } else {
177 gk20a_mem_wr32(inst_ptr, ram_fc_allowed_syncpoints_w(), 0);
178 } 181 }
179 182
180 /* enable channel */ 183 /* enable channel */