summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
diff options
context:
space:
mode:
authorLauri Peltonen <lpeltonen@nvidia.com>2014-07-17 19:31:44 -0400
committerDan Willemsen <dwillemsen@nvidia.com>2015-03-18 15:10:40 -0400
commitc60a300c4ac903dd7e0b53f2542a081fa4c334cb (patch)
tree1bcabef727d5a319d011c57a610c5aa59655aad6 /drivers/gpu/nvgpu/gk20a/mm_gk20a.c
parentbcf60a22c3e8671468517d34aa37548272455c1f (diff)
gpu: nvgpu: Attach compression state to dma-buf
Bug 1509620 Change-Id: I694fe43ef5d1f4f329d997a3d60e006785374cc3 Signed-off-by: Lauri Peltonen <lpeltonen@nvidia.com> Reviewed-on: http://git-master/r/439849 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Arto Merilainen <amerilainen@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers/gpu/nvgpu/gk20a/mm_gk20a.c')
-rw-r--r--drivers/gpu/nvgpu/gk20a/mm_gk20a.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
index e7a97207..57c61d51 100644
--- a/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
+++ b/drivers/gpu/nvgpu/gk20a/mm_gk20a.c
@@ -32,6 +32,7 @@
32 32
33#include "gk20a.h" 33#include "gk20a.h"
34#include "mm_gk20a.h" 34#include "mm_gk20a.h"
35#include "fence_gk20a.h"
35#include "hw_gmmu_gk20a.h" 36#include "hw_gmmu_gk20a.h"
36#include "hw_fb_gk20a.h" 37#include "hw_fb_gk20a.h"
37#include "hw_bus_gk20a.h" 38#include "hw_bus_gk20a.h"
@@ -121,10 +122,13 @@ struct gk20a_dmabuf_priv {
121 struct sg_table *sgt; 122 struct sg_table *sgt;
122 123
123 int pin_count; 124 int pin_count;
125
126 struct list_head states;
124}; 127};
125 128
126static void gk20a_mm_delete_priv(void *_priv) 129static void gk20a_mm_delete_priv(void *_priv)
127{ 130{
131 struct gk20a_buffer_state *s, *s_tmp;
128 struct gk20a_dmabuf_priv *priv = _priv; 132 struct gk20a_dmabuf_priv *priv = _priv;
129 if (!priv) 133 if (!priv)
130 return; 134 return;
@@ -136,6 +140,13 @@ static void gk20a_mm_delete_priv(void *_priv)
136 priv->comptags.lines); 140 priv->comptags.lines);
137 } 141 }
138 142
143 /* Free buffer states */
144 list_for_each_entry_safe(s, s_tmp, &priv->states, list) {
145 gk20a_fence_put(s->fence);
146 list_del(&s->list);
147 kfree(s);
148 }
149
139 kfree(priv); 150 kfree(priv);
140} 151}
141 152
@@ -2438,6 +2449,7 @@ int gk20a_dmabuf_alloc_drvdata(struct dma_buf *dmabuf, struct device *dev)
2438 goto priv_exist_or_err; 2449 goto priv_exist_or_err;
2439 } 2450 }
2440 mutex_init(&priv->lock); 2451 mutex_init(&priv->lock);
2452 INIT_LIST_HEAD(&priv->states);
2441 dma_buf_set_drvdata(dmabuf, dev, priv, gk20a_mm_delete_priv); 2453 dma_buf_set_drvdata(dmabuf, dev, priv, gk20a_mm_delete_priv);
2442priv_exist_or_err: 2454priv_exist_or_err:
2443 mutex_unlock(&priv_lock); 2455 mutex_unlock(&priv_lock);
@@ -2447,6 +2459,50 @@ priv_exist_or_err:
2447 return 0; 2459 return 0;
2448} 2460}
2449 2461
2462int gk20a_dmabuf_get_state(struct dma_buf *dmabuf, struct device *dev,
2463 u64 offset, struct gk20a_buffer_state **state)
2464{
2465 int err = 0;
2466 struct gk20a_dmabuf_priv *priv;
2467 struct gk20a_buffer_state *s;
2468
2469 if (WARN_ON(offset >= (u64)dmabuf->size))
2470 return -EINVAL;
2471
2472 err = gk20a_dmabuf_alloc_drvdata(dmabuf, dev);
2473 if (err)
2474 return err;
2475
2476 priv = dma_buf_get_drvdata(dmabuf, dev);
2477 if (WARN_ON(!priv))
2478 return -ENOSYS;
2479
2480 mutex_lock(&priv->lock);
2481
2482 list_for_each_entry(s, &priv->states, list)
2483 if (s->offset == offset)
2484 goto out;
2485
2486 /* State not found, create state. */
2487 s = kzalloc(sizeof(*s), GFP_KERNEL);
2488 if (!s) {
2489 err = -ENOMEM;
2490 goto out;
2491 }
2492
2493 s->offset = offset;
2494 INIT_LIST_HEAD(&s->list);
2495 mutex_init(&s->lock);
2496 list_add_tail(&priv->states, &s->list);
2497
2498out:
2499 mutex_unlock(&priv->lock);
2500 if (!err)
2501 *state = s;
2502 return err;
2503
2504
2505}
2450 2506
2451static int gk20a_dmabuf_get_kind(struct dma_buf *dmabuf) 2507static int gk20a_dmabuf_get_kind(struct dma_buf *dmabuf)
2452{ 2508{