Integrate userptr into the blob resource creation ioctl. - Accept DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR and HINT_USERPTR_RDONLY in VIRTGPU_BLOB_HINT_MASK - Require userptr if and only if HINT_USERPTR is set - Reject HINT_USERPTR unless blob_mem is VIRTGPU_BLOB_MEM_GUEST - Pass the userspace address into the internal create params - Call virtio_gpu_userptr_create() for userptr blob requests
Signed-off-by: Honglei Huang <[email protected]> --- drivers/gpu/drm/virtio/virtgpu_ioctl.c | 29 +++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c index 3d8e4ccdb7..225a550be0 100644 --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c @@ -38,6 +38,10 @@ VIRTGPU_BLOB_FLAG_USE_SHAREABLE | \ VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) +#define VIRTGPU_BLOB_HINT_MASK (DRM_VIRTGPU_BLOB_FLAG_HINT_DEFER_MAPPING | \ + DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR | \ + DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR_RDONLY) + /* Must be called with &virtio_gpu_fpriv.struct_mutex held. */ static void virtio_gpu_create_context_locked(struct virtio_gpu_device *vgdev, struct virtio_gpu_fpriv *vfpriv) @@ -453,11 +457,25 @@ static int verify_blob(struct virtio_gpu_device *vgdev, if (rc_blob->blob_flags & ~VIRTGPU_BLOB_FLAG_USE_MASK) return -EINVAL; + if (rc_blob->blob_hints & ~VIRTGPU_BLOB_HINT_MASK) + return -EINVAL; + if (rc_blob->blob_flags & VIRTGPU_BLOB_FLAG_USE_CROSS_DEVICE) { if (!vgdev->has_resource_assign_uuid) return -EINVAL; } + if (rc_blob->blob_hints & DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR) { + if (!rc_blob->userptr) + return -EINVAL; + } else { + if (rc_blob->userptr) + return -EINVAL; + + if (rc_blob->blob_hints & DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR_RDONLY) + return -EINVAL; + } + switch (rc_blob->blob_mem) { case VIRTGPU_BLOB_MEM_GUEST: *guest_blob = true; @@ -472,6 +490,11 @@ static int verify_blob(struct virtio_gpu_device *vgdev, return -EINVAL; } + /* Userptr is only defined for pure guest backing. */ + if ((rc_blob->blob_hints & DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR) && + rc_blob->blob_mem != VIRTGPU_BLOB_MEM_GUEST) + return -EINVAL; + if (*host3d_blob) { if (!vgdev->has_virgl_3d) return -EINVAL; @@ -495,6 +518,7 @@ static int verify_blob(struct virtio_gpu_device *vgdev, params->blob = true; params->blob_flags = rc_blob->blob_flags; params->blob_hints = rc_blob->blob_hints; + params->userptr = rc_blob->userptr; if (vgdev->has_blob_alignment && !IS_ALIGNED(params->size, vgdev->blob_alignment)) @@ -538,7 +562,10 @@ static int virtio_gpu_resource_create_blob_ioctl(struct drm_device *dev, vfpriv->ctx_id, NULL, NULL); } - if (guest_blob) + if (guest_blob && + (params.blob_hints & DRM_VIRTGPU_BLOB_FLAG_HINT_USERPTR)) + ret = virtio_gpu_userptr_create(vgdev, file, ¶ms, &bo); + else if (guest_blob) ret = virtio_gpu_object_create(vgdev, ¶ms, &bo, NULL); else if (!guest_blob && host3d_blob) ret = virtio_gpu_vram_create(vgdev, ¶ms, &bo); -- 2.34.1
