Commit cf655d61 authored by Jordan Crouse's avatar Jordan Crouse Committed by Rob Clark

drm/msm: Add a context pointer to the submitqueue

Each submitqueue is attached to a context. Add a pointer to the
context to the submitqueue at create time and refcount it so
that it stays around through the life of the queue.
Co-developed-by: default avatarRob Clark <robdclark@chromium.org>
Signed-off-by: default avatarJordan Crouse <jcrouse@codeaurora.org>
Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent 9cba4056
...@@ -586,6 +586,7 @@ static int context_init(struct drm_device *dev, struct drm_file *file) ...@@ -586,6 +586,7 @@ static int context_init(struct drm_device *dev, struct drm_file *file)
if (!ctx) if (!ctx)
return -ENOMEM; return -ENOMEM;
kref_init(&ctx->ref);
msm_submitqueue_init(dev, ctx); msm_submitqueue_init(dev, ctx);
ctx->aspace = priv->gpu ? priv->gpu->aspace : NULL; ctx->aspace = priv->gpu ? priv->gpu->aspace : NULL;
...@@ -607,7 +608,7 @@ static int msm_open(struct drm_device *dev, struct drm_file *file) ...@@ -607,7 +608,7 @@ static int msm_open(struct drm_device *dev, struct drm_file *file)
static void context_close(struct msm_file_private *ctx) static void context_close(struct msm_file_private *ctx)
{ {
msm_submitqueue_close(ctx); msm_submitqueue_close(ctx);
kfree(ctx); msm_file_private_put(ctx);
} }
static void msm_postclose(struct drm_device *dev, struct drm_file *file) static void msm_postclose(struct drm_device *dev, struct drm_file *file)
......
...@@ -57,6 +57,7 @@ struct msm_file_private { ...@@ -57,6 +57,7 @@ struct msm_file_private {
struct list_head submitqueues; struct list_head submitqueues;
int queueid; int queueid;
struct msm_gem_address_space *aspace; struct msm_gem_address_space *aspace;
struct kref ref;
}; };
enum msm_mdp_plane_property { enum msm_mdp_plane_property {
...@@ -428,6 +429,25 @@ void msm_submitqueue_close(struct msm_file_private *ctx); ...@@ -428,6 +429,25 @@ void msm_submitqueue_close(struct msm_file_private *ctx);
void msm_submitqueue_destroy(struct kref *kref); void msm_submitqueue_destroy(struct kref *kref);
static inline void __msm_file_private_destroy(struct kref *kref)
{
struct msm_file_private *ctx = container_of(kref,
struct msm_file_private, ref);
kfree(ctx);
}
static inline void msm_file_private_put(struct msm_file_private *ctx)
{
kref_put(&ctx->ref, __msm_file_private_destroy);
}
static inline struct msm_file_private *msm_file_private_get(
struct msm_file_private *ctx)
{
kref_get(&ctx->ref);
return ctx;
}
#define DBG(fmt, ...) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__) #define DBG(fmt, ...) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__)
#define VERB(fmt, ...) if (0) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__) #define VERB(fmt, ...) if (0) DRM_DEBUG_DRIVER(fmt"\n", ##__VA_ARGS__)
......
...@@ -142,6 +142,7 @@ struct msm_gem_submit { ...@@ -142,6 +142,7 @@ struct msm_gem_submit {
bool valid; /* true if no cmdstream patching needed */ bool valid; /* true if no cmdstream patching needed */
bool in_rb; /* "sudo" mode, copy cmds into RB */ bool in_rb; /* "sudo" mode, copy cmds into RB */
struct msm_ringbuffer *ring; struct msm_ringbuffer *ring;
struct msm_file_private *ctx;
unsigned int nr_cmds; unsigned int nr_cmds;
unsigned int nr_bos; unsigned int nr_bos;
u32 ident; /* A "identifier" for the submit for logging */ u32 ident; /* A "identifier" for the submit for logging */
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
#define BO_PINNED 0x2000 #define BO_PINNED 0x2000
static struct msm_gem_submit *submit_create(struct drm_device *dev, static struct msm_gem_submit *submit_create(struct drm_device *dev,
struct msm_gpu *gpu, struct msm_gem_address_space *aspace, struct msm_gpu *gpu,
struct msm_gpu_submitqueue *queue, uint32_t nr_bos, struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
uint32_t nr_cmds) uint32_t nr_cmds)
{ {
...@@ -43,7 +43,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev, ...@@ -43,7 +43,7 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,
return NULL; return NULL;
submit->dev = dev; submit->dev = dev;
submit->aspace = aspace; submit->aspace = queue->ctx->aspace;
submit->gpu = gpu; submit->gpu = gpu;
submit->fence = NULL; submit->fence = NULL;
submit->cmd = (void *)&submit->bos[nr_bos]; submit->cmd = (void *)&submit->bos[nr_bos];
...@@ -677,7 +677,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -677,7 +677,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
} }
} }
submit = submit_create(dev, gpu, ctx->aspace, queue, args->nr_bos, submit = submit_create(dev, gpu, queue, args->nr_bos,
args->nr_cmds); args->nr_cmds);
if (!submit) { if (!submit) {
ret = -ENOMEM; ret = -ENOMEM;
......
...@@ -193,6 +193,7 @@ struct msm_gpu_submitqueue { ...@@ -193,6 +193,7 @@ struct msm_gpu_submitqueue {
u32 flags; u32 flags;
u32 prio; u32 prio;
int faults; int faults;
struct msm_file_private *ctx;
struct list_head node; struct list_head node;
struct kref ref; struct kref ref;
}; };
......
...@@ -12,6 +12,8 @@ void msm_submitqueue_destroy(struct kref *kref) ...@@ -12,6 +12,8 @@ void msm_submitqueue_destroy(struct kref *kref)
struct msm_gpu_submitqueue *queue = container_of(kref, struct msm_gpu_submitqueue *queue = container_of(kref,
struct msm_gpu_submitqueue, ref); struct msm_gpu_submitqueue, ref);
msm_file_private_put(queue->ctx);
kfree(queue); kfree(queue);
} }
...@@ -83,6 +85,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx, ...@@ -83,6 +85,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx,
write_lock(&ctx->queuelock); write_lock(&ctx->queuelock);
queue->ctx = msm_file_private_get(ctx);
queue->id = ctx->queueid++; queue->id = ctx->queueid++;
if (id) if (id)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment