Skip to content

Commit

Permalink
drm/virtio: factor out context create hypercall
Browse files Browse the repository at this point in the history
We currently create an OpenGL context when opening the DRM fd
if 3D is available.

We may need other context types (VK,..) in the future, and the plan
is to have explicit initialization for that.

For explicit initialization to work, we need to factor out
virtio_gpu_create_context from driver initialization.

v2: Move context handle initialization too (olv)
v6: Remove redundant 3D check (emil.velikov)

Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Link: http://patchwork.freedesktop.org/patch/msgid/20200225000800.2966-2-gurchetansingh@chromium.org
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
  • Loading branch information
Gurchetan Singh authored and Gerd Hoffmann committed Feb 25, 2020
1 parent 30349f8 commit 40caded
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 20 deletions.
2 changes: 2 additions & 0 deletions drivers/gpu/drm/virtio/virtgpu_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,8 @@ struct virtio_gpu_fpriv {
/* virtio_ioctl.c */
#define DRM_VIRTIO_NUM_IOCTLS 10
extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
void virtio_gpu_create_context(struct drm_device *dev,
struct drm_file *file);

/* virtio_kms.c */
int virtio_gpu_init(struct drm_device *dev);
Expand Down
13 changes: 13 additions & 0 deletions drivers/gpu/drm/virtio/virtgpu_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,19 @@

#include "virtgpu_drv.h"

void virtio_gpu_create_context(struct drm_device *dev,
struct drm_file *file)
{
struct virtio_gpu_device *vgdev = dev->dev_private;
struct virtio_gpu_fpriv *vfpriv = file->driver_priv;
char dbgname[TASK_COMM_LEN];

get_task_comm(dbgname, current);
virtio_gpu_cmd_context_create(vgdev, vfpriv->ctx_id,
strlen(dbgname), dbgname);
virtio_gpu_notify(vgdev);
}

static int virtio_gpu_map_ioctl(struct drm_device *dev, void *data,
struct drm_file *file)
{
Expand Down
26 changes: 6 additions & 20 deletions drivers/gpu/drm/virtio/virtgpu_kms.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,6 @@ static void virtio_gpu_config_changed_work_func(struct work_struct *work)
events_clear, &events_clear);
}

static int virtio_gpu_context_create(struct virtio_gpu_device *vgdev,
uint32_t nlen, const char *name)
{
int handle = ida_alloc(&vgdev->ctx_id_ida, GFP_KERNEL);

if (handle < 0)
return handle;
handle += 1;
virtio_gpu_cmd_context_create(vgdev, handle, nlen, name);
virtio_gpu_notify(vgdev);
return handle;
}

static void virtio_gpu_context_destroy(struct virtio_gpu_device *vgdev,
uint32_t ctx_id)
{
Expand Down Expand Up @@ -260,8 +247,7 @@ int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file)
{
struct virtio_gpu_device *vgdev = dev->dev_private;
struct virtio_gpu_fpriv *vfpriv;
int id;
char dbgname[TASK_COMM_LEN];
int handle;

/* can't create contexts without 3d renderer */
if (!vgdev->has_virgl_3d)
Expand All @@ -272,15 +258,15 @@ int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file)
if (!vfpriv)
return -ENOMEM;

get_task_comm(dbgname, current);
id = virtio_gpu_context_create(vgdev, strlen(dbgname), dbgname);
if (id < 0) {
handle = ida_alloc(&vgdev->ctx_id_ida, GFP_KERNEL);
if (handle < 0) {
kfree(vfpriv);
return id;
return handle;
}

vfpriv->ctx_id = id;
vfpriv->ctx_id = handle + 1;
file->driver_priv = vfpriv;
virtio_gpu_create_context(dev, file);
return 0;
}

Expand Down

0 comments on commit 40caded

Please sign in to comment.