mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-21 18:01:21 +07:00
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: Rob Clark <robdclark@chromium.org> Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org> Signed-off-by: Rob Clark <robdclark@chromium.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
This commit is contained in:
parent
9cba4056a1
commit
cf655d6159
@ -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)
|
|||||||
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 {
|
|||||||
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);
|
|||||||
|
|
||||||
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 {
|
|||||||
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 @@
|
|||||||
#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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
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)
|
|||||||
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,
|
|||||||
|
|
||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user