mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 19:08:57 +09:00
Merge 85c83ea915 ("drm/virtio: implement context init: allocate an array of fence contexts") into android-mainline
Steps on the way to 5.16-rc1 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Id009a39fa4dba2115b4d506a79d4736b30e9421d
This commit is contained in:
@@ -56,6 +56,7 @@
|
||||
#define STATE_ERR 2
|
||||
|
||||
#define MAX_CAPSET_ID 63
|
||||
#define MAX_RINGS 64
|
||||
|
||||
struct virtio_gpu_object_params {
|
||||
unsigned long size;
|
||||
@@ -263,6 +264,8 @@ struct virtio_gpu_fpriv {
|
||||
uint32_t ctx_id;
|
||||
uint32_t context_init;
|
||||
bool context_created;
|
||||
uint32_t num_rings;
|
||||
uint64_t base_fence_ctx;
|
||||
struct mutex context_lock;
|
||||
};
|
||||
|
||||
|
||||
@@ -99,6 +99,11 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
int in_fence_fd = exbuf->fence_fd;
|
||||
int out_fence_fd = -1;
|
||||
void *buf;
|
||||
uint64_t fence_ctx;
|
||||
uint32_t ring_idx;
|
||||
|
||||
fence_ctx = vgdev->fence_drv.context;
|
||||
ring_idx = 0;
|
||||
|
||||
if (vgdev->has_virgl_3d == false)
|
||||
return -ENOSYS;
|
||||
@@ -106,6 +111,17 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
if ((exbuf->flags & ~VIRTGPU_EXECBUF_FLAGS))
|
||||
return -EINVAL;
|
||||
|
||||
if ((exbuf->flags & VIRTGPU_EXECBUF_RING_IDX)) {
|
||||
if (exbuf->ring_idx >= vfpriv->num_rings)
|
||||
return -EINVAL;
|
||||
|
||||
if (!vfpriv->base_fence_ctx)
|
||||
return -EINVAL;
|
||||
|
||||
fence_ctx = vfpriv->base_fence_ctx;
|
||||
ring_idx = exbuf->ring_idx;
|
||||
}
|
||||
|
||||
exbuf->fence_fd = -1;
|
||||
|
||||
virtio_gpu_create_context(dev, file);
|
||||
@@ -173,7 +189,7 @@ static int virtio_gpu_execbuffer_ioctl(struct drm_device *dev, void *data,
|
||||
goto out_memdup;
|
||||
}
|
||||
|
||||
out_fence = virtio_gpu_fence_alloc(vgdev, vgdev->fence_drv.context, 0);
|
||||
out_fence = virtio_gpu_fence_alloc(vgdev, fence_ctx, ring_idx);
|
||||
if(!out_fence) {
|
||||
ret = -ENOMEM;
|
||||
goto out_unresv;
|
||||
@@ -691,7 +707,7 @@ static int virtio_gpu_context_init_ioctl(struct drm_device *dev,
|
||||
return -EINVAL;
|
||||
|
||||
/* Number of unique parameters supported at this time. */
|
||||
if (num_params > 1)
|
||||
if (num_params > 2)
|
||||
return -EINVAL;
|
||||
|
||||
ctx_set_params = memdup_user(u64_to_user_ptr(args->ctx_set_params),
|
||||
@@ -731,6 +747,20 @@ static int virtio_gpu_context_init_ioctl(struct drm_device *dev,
|
||||
|
||||
vfpriv->context_init |= value;
|
||||
break;
|
||||
case VIRTGPU_CONTEXT_PARAM_NUM_RINGS:
|
||||
if (vfpriv->base_fence_ctx) {
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (value > MAX_RINGS) {
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
vfpriv->base_fence_ctx = dma_fence_context_alloc(value);
|
||||
vfpriv->num_rings = value;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
|
||||
Reference in New Issue
Block a user