drm/virtio: implement context init: handle VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK
For the Sommelier guest Wayland proxy, it's desirable for the DRM fd to be pollable in response to an host compositor event. This can also be used by the 3D driver to poll events on a CPU timeline. This enables the DRM fd associated with a particular 3D context to be polled independent of KMS events. The parameter VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK specifies the pollable rings. Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org> Acked-by: Nicholas Verne <nverne@chromium.org> Link: http://patchwork.freedesktop.org/patch/msgid/20210921232024.817-11-gurchetansingh@chromium.org Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
85c83ea915
commit
8d6b006e1f
|
@ -266,6 +266,7 @@ struct virtio_gpu_fpriv {
|
|||
bool context_created;
|
||||
uint32_t num_rings;
|
||||
uint64_t base_fence_ctx;
|
||||
uint64_t ring_idx_mask;
|
||||
struct mutex context_lock;
|
||||
};
|
||||
|
||||
|
|
|
@ -694,6 +694,7 @@ static int virtio_gpu_context_init_ioctl(struct drm_device *dev,
|
|||
{
|
||||
int ret = 0;
|
||||
uint32_t num_params, i, param, value;
|
||||
uint64_t valid_ring_mask;
|
||||
size_t len;
|
||||
struct drm_virtgpu_context_set_param *ctx_set_params = NULL;
|
||||
struct virtio_gpu_device *vgdev = dev->dev_private;
|
||||
|
@ -707,7 +708,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 > 2)
|
||||
if (num_params > 3)
|
||||
return -EINVAL;
|
||||
|
||||
ctx_set_params = memdup_user(u64_to_user_ptr(args->ctx_set_params),
|
||||
|
@ -761,12 +762,31 @@ static int virtio_gpu_context_init_ioctl(struct drm_device *dev,
|
|||
vfpriv->base_fence_ctx = dma_fence_context_alloc(value);
|
||||
vfpriv->num_rings = value;
|
||||
break;
|
||||
case VIRTGPU_CONTEXT_PARAM_POLL_RINGS_MASK:
|
||||
if (vfpriv->ring_idx_mask) {
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
vfpriv->ring_idx_mask = value;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
if (vfpriv->ring_idx_mask) {
|
||||
valid_ring_mask = 0;
|
||||
for (i = 0; i < vfpriv->num_rings; i++)
|
||||
valid_ring_mask |= 1 << i;
|
||||
|
||||
if (~valid_ring_mask & vfpriv->ring_idx_mask) {
|
||||
ret = -EINVAL;
|
||||
goto out_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
virtio_gpu_create_context_locked(vgdev, vfpriv);
|
||||
virtio_gpu_notify(vgdev);
|
||||
|
||||
|
|
Loading…
Reference in New Issue