Merge "drm/msm: Add submit queue queries"
This commit is contained in:
commit
73a0e7ea49
5 changed files with 73 additions and 6 deletions
|
@ -1711,6 +1711,16 @@ static int msm_ioctl_submitqueue_new(struct drm_device *dev, void *data,
|
||||||
args->flags, &args->id);
|
args->flags, &args->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int msm_ioctl_submitqueue_query(struct drm_device *dev, void *data,
|
||||||
|
struct drm_file *file)
|
||||||
|
{
|
||||||
|
struct drm_msm_submitqueue_query *args = data;
|
||||||
|
void __user *ptr = (void __user *)(uintptr_t) args->data;
|
||||||
|
|
||||||
|
return msm_submitqueue_query(file->driver_priv, args->id,
|
||||||
|
args->param, ptr, args->len);
|
||||||
|
}
|
||||||
|
|
||||||
static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
|
static int msm_ioctl_submitqueue_close(struct drm_device *dev, void *data,
|
||||||
struct drm_file *file)
|
struct drm_file *file)
|
||||||
{
|
{
|
||||||
|
@ -1768,6 +1778,8 @@ static const struct drm_ioctl_desc msm_ioctls[] = {
|
||||||
DRM_AUTH|DRM_RENDER_ALLOW),
|
DRM_AUTH|DRM_RENDER_ALLOW),
|
||||||
DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close,
|
DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_CLOSE, msm_ioctl_submitqueue_close,
|
||||||
DRM_AUTH|DRM_RENDER_ALLOW),
|
DRM_AUTH|DRM_RENDER_ALLOW),
|
||||||
|
DRM_IOCTL_DEF_DRV(MSM_SUBMITQUEUE_QUERY, msm_ioctl_submitqueue_query,
|
||||||
|
DRM_AUTH|DRM_RENDER_ALLOW),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct vm_operations_struct vm_ops = {
|
static const struct vm_operations_struct vm_ops = {
|
||||||
|
|
|
@ -516,8 +516,11 @@ struct msm_gpu_submitqueue *msm_submitqueue_get(struct msm_file_private *ctx,
|
||||||
u32 id);
|
u32 id);
|
||||||
int msm_submitqueue_create(struct msm_file_private *ctx, u32 prio,
|
int msm_submitqueue_create(struct msm_file_private *ctx, u32 prio,
|
||||||
u32 flags, u32 *id);
|
u32 flags, u32 *id);
|
||||||
|
int msm_submitqueue_query(struct msm_file_private *ctx, u32 id, u32 param,
|
||||||
|
void __user *data, u32 len);
|
||||||
int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id);
|
int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id);
|
||||||
void msm_submitqueue_close(struct msm_file_private *ctx);
|
void msm_submitqueue_close(struct msm_file_private *ctx);
|
||||||
|
|
||||||
void msm_submitqueue_destroy(struct kref *kref);
|
void msm_submitqueue_destroy(struct kref *kref);
|
||||||
|
|
||||||
struct hdmi;
|
struct hdmi;
|
||||||
|
|
|
@ -274,6 +274,20 @@ static void inactive_start(struct msm_gpu *gpu)
|
||||||
round_jiffies_up(jiffies + DRM_MSM_INACTIVE_JIFFIES));
|
round_jiffies_up(jiffies + DRM_MSM_INACTIVE_JIFFIES));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void retire_guilty_submit(struct msm_gpu *gpu,
|
||||||
|
struct msm_ringbuffer *ring)
|
||||||
|
{
|
||||||
|
struct msm_gem_submit *submit = list_first_entry_or_null(&ring->submits,
|
||||||
|
struct msm_gem_submit, node);
|
||||||
|
|
||||||
|
if (!submit)
|
||||||
|
return;
|
||||||
|
|
||||||
|
submit->queue->faults++;
|
||||||
|
|
||||||
|
msm_gem_submit_free(submit);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hangcheck detection for locked gpu:
|
* Hangcheck detection for locked gpu:
|
||||||
*/
|
*/
|
||||||
|
@ -296,13 +310,12 @@ static void recover_worker(struct work_struct *work)
|
||||||
|
|
||||||
inactive_cancel(gpu);
|
inactive_cancel(gpu);
|
||||||
|
|
||||||
FOR_EACH_RING(gpu, ring, i) {
|
/* Retire all events that have already passed */
|
||||||
uint32_t fence = gpu->funcs->last_fence(gpu, ring);
|
FOR_EACH_RING(gpu, ring, i)
|
||||||
|
|
||||||
retire_submits(gpu, ring,
|
retire_submits(gpu, ring,
|
||||||
gpu->funcs->active_ring(gpu) == ring ?
|
gpu->funcs->last_fence(gpu, ring));
|
||||||
fence + 1 : fence);
|
|
||||||
}
|
retire_guilty_submit(gpu, gpu->funcs->active_ring(gpu));
|
||||||
|
|
||||||
/* Recover the GPU */
|
/* Recover the GPU */
|
||||||
gpu->funcs->recover(gpu);
|
gpu->funcs->recover(gpu);
|
||||||
|
|
|
@ -27,6 +27,9 @@ struct msm_gpu_submitqueue *msm_submitqueue_get(struct msm_file_private *ctx,
|
||||||
{
|
{
|
||||||
struct msm_gpu_submitqueue *entry;
|
struct msm_gpu_submitqueue *entry;
|
||||||
|
|
||||||
|
if (!ctx)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
read_lock(&ctx->queuelock);
|
read_lock(&ctx->queuelock);
|
||||||
|
|
||||||
list_for_each_entry(entry, &ctx->submitqueues, node) {
|
list_for_each_entry(entry, &ctx->submitqueues, node) {
|
||||||
|
@ -95,6 +98,29 @@ int msm_submitqueue_init(struct msm_file_private *ctx)
|
||||||
return msm_submitqueue_create(ctx, 3, 0, NULL);
|
return msm_submitqueue_create(ctx, 3, 0, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int msm_submitqueue_query(struct msm_file_private *ctx, u32 id, u32 param,
|
||||||
|
void __user *data, u32 len)
|
||||||
|
{
|
||||||
|
struct msm_gpu_submitqueue *queue = msm_submitqueue_get(ctx, id);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!queue)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
if (param == MSM_SUBMITQUEUE_PARAM_FAULTS) {
|
||||||
|
u32 size = min_t(u32, len, sizeof(queue->faults));
|
||||||
|
|
||||||
|
if (copy_to_user(data, &queue->faults, size))
|
||||||
|
ret = -EFAULT;
|
||||||
|
} else {
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
msm_submitqueue_put(queue);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id)
|
int msm_submitqueue_remove(struct msm_file_private *ctx, u32 id)
|
||||||
{
|
{
|
||||||
struct msm_gpu_submitqueue *entry;
|
struct msm_gpu_submitqueue *entry;
|
||||||
|
|
|
@ -370,6 +370,15 @@ struct drm_msm_submitqueue {
|
||||||
__u32 id; /* out, identifier */
|
__u32 id; /* out, identifier */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define MSM_SUBMITQUEUE_PARAM_FAULTS 0
|
||||||
|
|
||||||
|
struct drm_msm_submitqueue_query {
|
||||||
|
__u64 data;
|
||||||
|
__u32 id;
|
||||||
|
__u32 param;
|
||||||
|
__u32 len;
|
||||||
|
};
|
||||||
|
|
||||||
#define DRM_MSM_GET_PARAM 0x00
|
#define DRM_MSM_GET_PARAM 0x00
|
||||||
/* placeholder:
|
/* placeholder:
|
||||||
#define DRM_MSM_SET_PARAM 0x01
|
#define DRM_MSM_SET_PARAM 0x01
|
||||||
|
@ -384,6 +393,7 @@ struct drm_msm_submitqueue {
|
||||||
#define DRM_MSM_GEM_SVM_NEW 0x09
|
#define DRM_MSM_GEM_SVM_NEW 0x09
|
||||||
#define DRM_MSM_SUBMITQUEUE_NEW 0x0A
|
#define DRM_MSM_SUBMITQUEUE_NEW 0x0A
|
||||||
#define DRM_MSM_SUBMITQUEUE_CLOSE 0x0B
|
#define DRM_MSM_SUBMITQUEUE_CLOSE 0x0B
|
||||||
|
#define DRM_MSM_SUBMITQUEUE_QUERY 0x0C
|
||||||
|
|
||||||
#define DRM_SDE_WB_CONFIG 0x40
|
#define DRM_SDE_WB_CONFIG 0x40
|
||||||
#define DRM_MSM_REGISTER_EVENT 0x41
|
#define DRM_MSM_REGISTER_EVENT 0x41
|
||||||
|
@ -432,6 +442,9 @@ struct drm_msm_submitqueue {
|
||||||
#define DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE \
|
#define DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE \
|
||||||
DRM_IOW(DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_CLOSE, \
|
DRM_IOW(DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_CLOSE, \
|
||||||
struct drm_msm_submitqueue)
|
struct drm_msm_submitqueue)
|
||||||
|
#define DRM_IOCTL_MSM_SUBMITQUEUE_QUERY \
|
||||||
|
DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_QUERY, \
|
||||||
|
struct drm_msm_submitqueue_query)
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue