summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/virtio/virtio_kms.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/virtio/virtio_kms.c')
-rw-r--r--drivers/gpu/drm/virtio/virtio_kms.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/drivers/gpu/drm/virtio/virtio_kms.c b/drivers/gpu/drm/virtio/virtio_kms.c
index 0fedd63cc1a2..59d98a6103ef 100644
--- a/drivers/gpu/drm/virtio/virtio_kms.c
+++ b/drivers/gpu/drm/virtio/virtio_kms.c
@@ -1,25 +1,50 @@
+#include <linux/virtio.h>
+#include <linux/virtio_config.h>
#include <drm/drmP.h>
#include "virtio_drv.h"
-int virtio_gpu_max_ioctls;
+int virtgpu_max_ioctls;
-int virtio_gpu_driver_load(struct drm_device *dev, unsigned long flags)
+static void virtgpu_ctrl_ack(struct virtqueue *vq)
{
- struct virtio_gpu_device *vgdev;
- vgdev = kzalloc(sizeof(struct virtio_gpu_device), GFP_KERNEL);
+}
+
+int virtgpu_driver_load(struct drm_device *dev, unsigned long flags)
+{
+ struct virtgpu_device *vgdev;
+ /* this will expand later */
+ struct virtqueue *vqs[1];
+ vq_callback_t *callbacks[] = { virtgpu_ctrl_ack };
+ const char *names[] = { "control" };
+ int nvqs;
+ int ret;
+
+ vgdev = kzalloc(sizeof(struct virtgpu_device), GFP_KERNEL);
if (!vgdev)
return -ENOMEM;
vgdev->ddev = dev;
dev->dev_private = vgdev;
+ vgdev->vdev = dev->virtdev;
+
+ nvqs = 1;
+
+ ret = vgdev->vdev->config->find_vqs(vgdev->vdev, nvqs, vqs, callbacks, names);
+ if (ret) {
+ DRM_ERROR("failed to find virt queues\n");
+ kfree(vgdev);
+ return ret;
+ }
+
+ vgdev->ctrlq = vqs[0];
return 0;
}
-int virtio_gpu_driver_unload(struct drm_device *dev)
+int virtgpu_driver_unload(struct drm_device *dev)
{
- struct virtio_gpu_device *vgdev = dev->dev_private;
+ struct virtgpu_device *vgdev = dev->dev_private;
kfree(vgdev);
return 0;