1 /* 2 * Copyright (C) 2015 Red Hat, Inc. 3 * All Rights Reserved. 4 * 5 * Authors: 6 * Dave Airlie <airlied@redhat.com> 7 * Gerd Hoffmann <kraxel@redhat.com> 8 * 9 * Permission is hereby granted, free of charge, to any person obtaining a 10 * copy of this software and associated documentation files (the "Software"), 11 * to deal in the Software without restriction, including without limitation 12 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13 * and/or sell copies of the Software, and to permit persons to whom the 14 * Software is furnished to do so, subject to the following conditions: 15 * 16 * The above copyright notice and this permission notice (including the next 17 * paragraph) shall be included in all copies or substantial portions of the 18 * Software. 19 * 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 24 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 25 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 26 * OTHER DEALINGS IN THE SOFTWARE. 27 */ 28 29 #include <linux/module.h> 30 #include <linux/console.h> 31 #include <linux/pci.h> 32 #include "drmP.h" 33 #include "drm/drm.h" 34 35 #include "virtgpu_drv.h" 36 static struct drm_driver driver; 37 38 static int virtio_gpu_modeset = -1; 39 40 MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); 41 module_param_named(modeset, virtio_gpu_modeset, int, 0400); 42 43 static int virtio_gpu_probe(struct virtio_device *vdev) 44 { 45 #ifdef CONFIG_VGA_CONSOLE 46 if (vgacon_text_force() && virtio_gpu_modeset == -1) 47 return -EINVAL; 48 #endif 49 50 if (virtio_gpu_modeset == 0) 51 return -EINVAL; 52 53 return drm_virtio_init(&driver, vdev); 54 } 55 56 static void virtio_gpu_remove(struct virtio_device *vdev) 57 { 58 struct drm_device *dev = vdev->priv; 59 drm_put_dev(dev); 60 } 61 62 static void virtio_gpu_config_changed(struct virtio_device *vdev) 63 { 64 struct drm_device *dev = vdev->priv; 65 struct virtio_gpu_device *vgdev = dev->dev_private; 66 67 schedule_work(&vgdev->config_changed_work); 68 } 69 70 static struct virtio_device_id id_table[] = { 71 { VIRTIO_ID_GPU, VIRTIO_DEV_ANY_ID }, 72 { 0 }, 73 }; 74 75 static unsigned int features[] = { 76 }; 77 static struct virtio_driver virtio_gpu_driver = { 78 .feature_table = features, 79 .feature_table_size = ARRAY_SIZE(features), 80 .driver.name = KBUILD_MODNAME, 81 .driver.owner = THIS_MODULE, 82 .id_table = id_table, 83 .probe = virtio_gpu_probe, 84 .remove = virtio_gpu_remove, 85 .config_changed = virtio_gpu_config_changed 86 }; 87 88 module_virtio_driver(virtio_gpu_driver); 89 90 MODULE_DEVICE_TABLE(virtio, id_table); 91 MODULE_DESCRIPTION("Virtio GPU driver"); 92 MODULE_LICENSE("GPL and additional rights"); 93 MODULE_AUTHOR("Dave Airlie <airlied@redhat.com>"); 94 MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>"); 95 MODULE_AUTHOR("Alon Levy"); 96 97 static const struct file_operations virtio_gpu_driver_fops = { 98 .owner = THIS_MODULE, 99 .open = drm_open, 100 .mmap = virtio_gpu_mmap, 101 .poll = drm_poll, 102 .read = drm_read, 103 .unlocked_ioctl = drm_ioctl, 104 .release = drm_release, 105 #ifdef CONFIG_COMPAT 106 .compat_ioctl = drm_compat_ioctl, 107 #endif 108 .llseek = noop_llseek, 109 }; 110 111 112 static struct drm_driver driver = { 113 .driver_features = DRIVER_MODESET | DRIVER_GEM, 114 .set_busid = drm_virtio_set_busid, 115 .load = virtio_gpu_driver_load, 116 .unload = virtio_gpu_driver_unload, 117 118 .dumb_create = virtio_gpu_mode_dumb_create, 119 .dumb_map_offset = virtio_gpu_mode_dumb_mmap, 120 .dumb_destroy = virtio_gpu_mode_dumb_destroy, 121 122 #if defined(CONFIG_DEBUG_FS) 123 .debugfs_init = virtio_gpu_debugfs_init, 124 .debugfs_cleanup = virtio_gpu_debugfs_takedown, 125 #endif 126 127 .gem_free_object = virtio_gpu_gem_free_object, 128 .fops = &virtio_gpu_driver_fops, 129 130 .name = DRIVER_NAME, 131 .desc = DRIVER_DESC, 132 .date = DRIVER_DATE, 133 .major = DRIVER_MAJOR, 134 .minor = DRIVER_MINOR, 135 .patchlevel = DRIVER_PATCHLEVEL, 136 }; 137