summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
diff options
context:
space:
mode:
authorKonsta Holtta <kholtta@nvidia.com>2016-05-11 08:04:44 -0400
committerTerje Bergstrom <tbergstrom@nvidia.com>2016-05-18 14:54:34 -0400
commitdc45473eeb39d93100290a0f09bd787b3a5ce3f2 (patch)
tree90c56a0fc8ed2019bd4e1bfdb9fbddf18c20bd0c /drivers/gpu/nvgpu/gk20a/channel_gk20a.c
parent67a41e46a230cde7353e4cd46040f1e71d7cd289 (diff)
gpu: nvgpu: use mem_desc in priv_cmd_entry
Replace the plain cpu pointer accesses with gk20a_mem_wr32(), and use a reference to the underlying mem_desc (within priv_cmd_queue) paired with an offset, for buffer aperture flexibility. JIRA DNVGPU-21 JIRA DNVGPU-23 Change-Id: I317672c94bb682bb895f9ed3e8116729c8bb7f4b Signed-off-by: Konsta Holtta <kholtta@nvidia.com> Reviewed-on: http://git-master/r/1145922 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Alex Waterman <alexw@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/channel_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/channel_gk20a.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
index 065e8ab1..31a3ceeb 100644
--- a/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/channel_gk20a.c
@@ -1355,15 +1355,16 @@ int gk20a_channel_alloc_priv_cmdbuf(struct channel_gk20a *c, u32 orig_size,
1355 e->gp_get = c->gpfifo.get; 1355 e->gp_get = c->gpfifo.get;
1356 e->gp_put = c->gpfifo.put; 1356 e->gp_put = c->gpfifo.put;
1357 e->gp_wrap = c->gpfifo.wrap; 1357 e->gp_wrap = c->gpfifo.wrap;
1358 e->mem = &q->mem;
1358 1359
1359 /* if we have increased size to skip free space in the end, set put 1360 /* if we have increased size to skip free space in the end, set put
1360 to beginning of cmd buffer (0) + size */ 1361 to beginning of cmd buffer (0) + size */
1361 if (size != orig_size) { 1362 if (size != orig_size) {
1362 e->ptr = (u32 *)q->mem.cpu_va; 1363 e->off = 0;
1363 e->gva = q->mem.gpu_va; 1364 e->gva = q->mem.gpu_va;
1364 q->put = orig_size; 1365 q->put = orig_size;
1365 } else { 1366 } else {
1366 e->ptr = (u32 *)q->mem.cpu_va + q->put; 1367 e->off = q->put;
1367 e->gva = q->mem.gpu_va + q->put * sizeof(u32); 1368 e->gva = q->mem.gpu_va + q->put * sizeof(u32);
1368 q->put = (q->put + orig_size) & (q->size - 1); 1369 q->put = (q->put + orig_size) & (q->size - 1);
1369 } 1370 }
@@ -1755,17 +1756,15 @@ static int gk20a_free_priv_cmdbuf(struct channel_gk20a *c,
1755 struct priv_cmd_entry *e) 1756 struct priv_cmd_entry *e)
1756{ 1757{
1757 struct priv_cmd_queue *q = &c->priv_cmd_q; 1758 struct priv_cmd_queue *q = &c->priv_cmd_q;
1758 u32 cmd_entry_start;
1759 struct device *d = dev_from_gk20a(c->g); 1759 struct device *d = dev_from_gk20a(c->g);
1760 1760
1761 if (!e) 1761 if (!e)
1762 return 0; 1762 return 0;
1763 1763
1764 cmd_entry_start = (u32)(e->ptr - (u32 *)q->mem.cpu_va); 1764 if ((q->get != e->off) && e->off != 0)
1765 if ((q->get != cmd_entry_start) && cmd_entry_start != 0)
1766 gk20a_err(d, "requests out-of-order, ch=%d\n", c->hw_chid); 1765 gk20a_err(d, "requests out-of-order, ch=%d\n", c->hw_chid);
1767 1766
1768 q->get = (e->ptr - (u32 *)q->mem.cpu_va) + e->size; 1767 q->get = e->off + e->size;
1769 free_priv_cmdbuf(c, e); 1768 free_priv_cmdbuf(c, e);
1770 1769
1771 return 0; 1770 return 0;
@@ -2150,7 +2149,9 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
2150 gpfifo_mem[c->gpfifo.put].entry1 = u64_hi32(wait_cmd->gva) | 2149 gpfifo_mem[c->gpfifo.put].entry1 = u64_hi32(wait_cmd->gva) |
2151 pbdma_gp_entry1_length_f(wait_cmd->size); 2150 pbdma_gp_entry1_length_f(wait_cmd->size);
2152 trace_gk20a_push_cmdbuf(dev_name(c->g->dev), 2151 trace_gk20a_push_cmdbuf(dev_name(c->g->dev),
2153 0, wait_cmd->size, 0, wait_cmd->ptr); 2152 0, wait_cmd->size, 0,
2153 wait_cmd->mem->cpu_va + wait_cmd->off *
2154 sizeof(u32));
2154 2155
2155 c->gpfifo.put = (c->gpfifo.put + 1) & 2156 c->gpfifo.put = (c->gpfifo.put + 1) &
2156 (c->gpfifo.entry_num - 1); 2157 (c->gpfifo.entry_num - 1);
@@ -2235,7 +2236,9 @@ int gk20a_submit_channel_gpfifo(struct channel_gk20a *c,
2235 gpfifo_mem[c->gpfifo.put].entry1 = u64_hi32(incr_cmd->gva) | 2236 gpfifo_mem[c->gpfifo.put].entry1 = u64_hi32(incr_cmd->gva) |
2236 pbdma_gp_entry1_length_f(incr_cmd->size); 2237 pbdma_gp_entry1_length_f(incr_cmd->size);
2237 trace_gk20a_push_cmdbuf(dev_name(c->g->dev), 2238 trace_gk20a_push_cmdbuf(dev_name(c->g->dev),
2238 0, incr_cmd->size, 0, incr_cmd->ptr); 2239 0, incr_cmd->size, 0,
2240 incr_cmd->mem->cpu_va + incr_cmd->off *
2241 sizeof(u32));
2239 2242
2240 c->gpfifo.put = (c->gpfifo.put + 1) & 2243 c->gpfifo.put = (c->gpfifo.put + 1) &
2241 (c->gpfifo.entry_num - 1); 2244 (c->gpfifo.entry_num - 1);