diff options
author | Konsta Holtta <kholtta@nvidia.com> | 2016-05-11 08:04:44 -0400 |
---|---|---|
committer | Terje Bergstrom <tbergstrom@nvidia.com> | 2016-05-18 14:54:34 -0400 |
commit | dc45473eeb39d93100290a0f09bd787b3a5ce3f2 (patch) | |
tree | 90c56a0fc8ed2019bd4e1bfdb9fbddf18c20bd0c /drivers/gpu/nvgpu/gk20a/channel_gk20a.c | |
parent | 67a41e46a230cde7353e4cd46040f1e71d7cd289 (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.c | 19 |
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); |