summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2013-09-13 14:36:36 +0200
committerLucas Stach <l.stach@pengutronix.de>2013-09-17 08:45:16 +0200
commit907b18c50348adf0055ffed2863ee30758b97642 (patch)
tree7cfcac65b9319aac2cb6a6d2f8e029462b9249a8
parent7ca6b7bbe918faae24aadee202112e910a8b7353 (diff)
downloadlinux-907b18c50348adf0055ffed2863ee30758b97642.tar.gz
linux-907b18c50348adf0055ffed2863ee30758b97642.tar.xz
WIP: track adreno context per gpu and independant of drm driver
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r--drivers/gpu/drm/msm/adreno/adreno_gpu.c5
-rw-r--r--drivers/gpu/drm/msm/adreno/adreno_gpu.h4
-rw-r--r--drivers/gpu/drm/msm/msm_drv.c17
-rw-r--r--drivers/gpu/drm/msm/msm_drv.h3
-rw-r--r--drivers/gpu/drm/msm/msm_gpu.c5
-rw-r--r--include/drm/drm_adreno.h7
6 files changed, 19 insertions, 22 deletions
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
index 1f7c71816d87..55033619fd1c 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c
@@ -134,10 +134,9 @@ void adreno_recover(struct msm_gpu *gpu)
}
int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
- struct msm_file_private *ctx)
+ struct adreno_context *ctx)
{
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
- struct msm_drm_private *priv = gpu->dev->dev_private;
struct adreno_ringbuffer *ring = adreno_gpu->rb;
unsigned i, ibs = 0;
@@ -148,7 +147,7 @@ int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
break;
case MSM_SUBMIT_CMD_CTX_RESTORE_BUF:
/* ignore if there has not been a ctx switch: */
- if (priv->lastctx == ctx)
+ if (adreno_gpu->lastctx == ctx)
break;
case MSM_SUBMIT_CMD_BUF:
OUT_PKT3(ring, CP_INDIRECT_BUFFER_PFD, 2);
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
index d7fff0a0ee17..133f2b0f1799 100644
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
@@ -64,6 +64,8 @@ struct adreno_gpu {
struct adreno_ringbuffer *rb;
uint32_t rb_iova;
+
+ struct adreno_context *lastctx;
};
#define to_adreno_gpu(x) container_of(x, struct adreno_gpu, base)
@@ -100,7 +102,7 @@ int adreno_hw_init(struct msm_gpu *gpu);
uint32_t adreno_last_fence(struct msm_gpu *gpu);
void adreno_recover(struct msm_gpu *gpu);
int adreno_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
- struct msm_file_private *ctx);
+ struct adreno_context *ctx);
void adreno_flush(struct msm_gpu *gpu);
void adreno_idle(struct msm_gpu *gpu);
#ifdef CONFIG_DEBUG_FS
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 864c9773636b..aa9513408658 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -282,18 +282,18 @@ static void load_gpu(struct drm_device *dev)
static int msm_open(struct drm_device *dev, struct drm_file *file)
{
- struct msm_file_private *ctx;
+ struct msm_file_private *filp;
/* For now, load gpu on open.. to avoid the requirement of having
* firmware in the initrd.
*/
load_gpu(dev);
- ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
- if (!ctx)
+ filp = kzalloc(sizeof(*filp), GFP_KERNEL);
+ if (!filp)
return -ENOMEM;
- file->driver_priv = ctx;
+ file->driver_priv = filp;
return 0;
}
@@ -301,18 +301,13 @@ static int msm_open(struct drm_device *dev, struct drm_file *file)
static void msm_preclose(struct drm_device *dev, struct drm_file *file)
{
struct msm_drm_private *priv = dev->dev_private;
- struct msm_file_private *ctx = file->driver_priv;
+ struct msm_file_private *filp = file->driver_priv;
struct msm_kms *kms = priv->kms;
if (kms)
kms->funcs->preclose(kms, file);
- mutex_lock(&dev->struct_mutex);
- if (ctx == priv->lastctx)
- priv->lastctx = NULL;
- mutex_unlock(&dev->struct_mutex);
-
- kfree(ctx);
+ kfree(filp);
}
static void msm_lastclose(struct drm_device *dev)
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index cb5d2e6b51d5..4bf2855d7df0 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -53,7 +53,7 @@ struct msm_file_private {
* per-context address spaces are supported we'd keep track of
* the context's page-tables here.
*/
- int dummy;
+ struct adreno_context ctx;
};
struct msm_drm_private {
@@ -62,7 +62,6 @@ struct msm_drm_private {
/* when we have more than one 'msm_gpu' these need to be an array: */
struct msm_gpu *gpu;
- struct msm_file_private *lastctx;
struct drm_fb_helper *fbdev;
diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c
index f8ea6b28be13..3b0aad71fbd0 100644
--- a/drivers/gpu/drm/msm/msm_gpu.c
+++ b/drivers/gpu/drm/msm/msm_gpu.c
@@ -289,7 +289,7 @@ void msm_gpu_retire(struct msm_gpu *gpu)
/* add bo's to gpu's ring, and kick gpu: */
int msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
- struct msm_file_private *ctx)
+ struct msm_file_private *filp)
{
struct drm_device *dev = gpu->dev;
struct msm_drm_private *priv = dev->dev_private;
@@ -301,8 +301,7 @@ int msm_gpu_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit,
gpu->submitted_fence = submit->fence;
- ret = gpu->funcs->submit(gpu, submit, ctx);
- priv->lastctx = ctx;
+ ret = gpu->funcs->submit(gpu, submit, &filp->ctx);
for (i = 0; i < submit->nr_bos; i++) {
struct msm_gem_object *msm_obj = submit->bos[i].obj;
diff --git a/include/drm/drm_adreno.h b/include/drm/drm_adreno.h
index 566b0c8e2131..92275429dfe9 100644
--- a/include/drm/drm_adreno.h
+++ b/include/drm/drm_adreno.h
@@ -21,7 +21,10 @@
struct msm_gpu;
struct msm_gem_submit;
-struct msm_file_private;
+
+struct adreno_context {
+ int dummy;
+};
struct adreno_gpu_funcs {
int (*get_param)(struct msm_gpu *gpu, uint32_t param, uint64_t *value);
@@ -29,7 +32,7 @@ struct adreno_gpu_funcs {
int (*pm_suspend)(struct msm_gpu *gpu);
int (*pm_resume)(struct msm_gpu *gpu);
int (*submit)(struct msm_gpu *gpu, struct msm_gem_submit *submit,
- struct msm_file_private *ctx);
+ struct adreno_context *ctx);
void (*flush)(struct msm_gpu *gpu);
void (*idle)(struct msm_gpu *gpu);
irqreturn_t (*irq)(struct msm_gpu *irq);