diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2013-09-13 14:36:36 +0200 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2013-09-17 08:45:16 +0200 |
commit | 907b18c50348adf0055ffed2863ee30758b97642 (patch) | |
tree | 7cfcac65b9319aac2cb6a6d2f8e029462b9249a8 | |
parent | 7ca6b7bbe918faae24aadee202112e910a8b7353 (diff) | |
download | linux-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.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_drv.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_gpu.c | 5 | ||||
-rw-r--r-- | include/drm/drm_adreno.h | 7 |
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); |