Commit | Line | Data |
---|---|---|
dc5698e8 DA |
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 | { | |
dc5698e8 DA |
45 | if (vgacon_text_force() && virtio_gpu_modeset == -1) |
46 | return -EINVAL; | |
dc5698e8 DA |
47 | |
48 | if (virtio_gpu_modeset == 0) | |
49 | return -EINVAL; | |
50 | ||
51 | return drm_virtio_init(&driver, vdev); | |
52 | } | |
53 | ||
54 | static void virtio_gpu_remove(struct virtio_device *vdev) | |
55 | { | |
56 | struct drm_device *dev = vdev->priv; | |
57 | drm_put_dev(dev); | |
58 | } | |
59 | ||
60 | static void virtio_gpu_config_changed(struct virtio_device *vdev) | |
61 | { | |
62 | struct drm_device *dev = vdev->priv; | |
63 | struct virtio_gpu_device *vgdev = dev->dev_private; | |
64 | ||
65 | schedule_work(&vgdev->config_changed_work); | |
66 | } | |
67 | ||
68 | static struct virtio_device_id id_table[] = { | |
69 | { VIRTIO_ID_GPU, VIRTIO_DEV_ANY_ID }, | |
70 | { 0 }, | |
71 | }; | |
72 | ||
73 | static unsigned int features[] = { | |
62fb7a5e GH |
74 | #ifdef __LITTLE_ENDIAN |
75 | /* | |
76 | * Gallium command stream send by virgl is native endian. | |
77 | * Because of that we only support little endian guests on | |
78 | * little endian hosts. | |
79 | */ | |
80 | VIRTIO_GPU_F_VIRGL, | |
81 | #endif | |
dc5698e8 DA |
82 | }; |
83 | static struct virtio_driver virtio_gpu_driver = { | |
84 | .feature_table = features, | |
85 | .feature_table_size = ARRAY_SIZE(features), | |
86 | .driver.name = KBUILD_MODNAME, | |
87 | .driver.owner = THIS_MODULE, | |
88 | .id_table = id_table, | |
89 | .probe = virtio_gpu_probe, | |
90 | .remove = virtio_gpu_remove, | |
91 | .config_changed = virtio_gpu_config_changed | |
92 | }; | |
93 | ||
94 | module_virtio_driver(virtio_gpu_driver); | |
95 | ||
96 | MODULE_DEVICE_TABLE(virtio, id_table); | |
97 | MODULE_DESCRIPTION("Virtio GPU driver"); | |
98 | MODULE_LICENSE("GPL and additional rights"); | |
99 | MODULE_AUTHOR("Dave Airlie <airlied@redhat.com>"); | |
100 | MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>"); | |
101 | MODULE_AUTHOR("Alon Levy"); | |
102 | ||
103 | static const struct file_operations virtio_gpu_driver_fops = { | |
104 | .owner = THIS_MODULE, | |
105 | .open = drm_open, | |
106 | .mmap = virtio_gpu_mmap, | |
107 | .poll = drm_poll, | |
108 | .read = drm_read, | |
109 | .unlocked_ioctl = drm_ioctl, | |
110 | .release = drm_release, | |
111 | #ifdef CONFIG_COMPAT | |
112 | .compat_ioctl = drm_compat_ioctl, | |
113 | #endif | |
114 | .llseek = noop_llseek, | |
115 | }; | |
116 | ||
117 | ||
118 | static struct drm_driver driver = { | |
5443ce86 | 119 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC, |
dc5698e8 DA |
120 | .set_busid = drm_virtio_set_busid, |
121 | .load = virtio_gpu_driver_load, | |
122 | .unload = virtio_gpu_driver_unload, | |
62fb7a5e GH |
123 | .open = virtio_gpu_driver_open, |
124 | .postclose = virtio_gpu_driver_postclose, | |
dc5698e8 DA |
125 | |
126 | .dumb_create = virtio_gpu_mode_dumb_create, | |
127 | .dumb_map_offset = virtio_gpu_mode_dumb_mmap, | |
128 | .dumb_destroy = virtio_gpu_mode_dumb_destroy, | |
129 | ||
130 | #if defined(CONFIG_DEBUG_FS) | |
131 | .debugfs_init = virtio_gpu_debugfs_init, | |
132 | .debugfs_cleanup = virtio_gpu_debugfs_takedown, | |
133 | #endif | |
11a8f280 DA |
134 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, |
135 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, | |
136 | .gem_prime_export = drm_gem_prime_export, | |
137 | .gem_prime_import = drm_gem_prime_import, | |
138 | .gem_prime_pin = virtgpu_gem_prime_pin, | |
139 | .gem_prime_unpin = virtgpu_gem_prime_unpin, | |
140 | .gem_prime_get_sg_table = virtgpu_gem_prime_get_sg_table, | |
141 | .gem_prime_import_sg_table = virtgpu_gem_prime_import_sg_table, | |
142 | .gem_prime_vmap = virtgpu_gem_prime_vmap, | |
143 | .gem_prime_vunmap = virtgpu_gem_prime_vunmap, | |
144 | .gem_prime_mmap = virtgpu_gem_prime_mmap, | |
dc5698e8 DA |
145 | |
146 | .gem_free_object = virtio_gpu_gem_free_object, | |
62fb7a5e GH |
147 | .gem_open_object = virtio_gpu_gem_object_open, |
148 | .gem_close_object = virtio_gpu_gem_object_close, | |
dc5698e8 DA |
149 | .fops = &virtio_gpu_driver_fops, |
150 | ||
62fb7a5e GH |
151 | .ioctls = virtio_gpu_ioctls, |
152 | .num_ioctls = DRM_VIRTIO_NUM_IOCTLS, | |
153 | ||
dc5698e8 DA |
154 | .name = DRIVER_NAME, |
155 | .desc = DRIVER_DESC, | |
156 | .date = DRIVER_DATE, | |
157 | .major = DRIVER_MAJOR, | |
158 | .minor = DRIVER_MINOR, | |
159 | .patchlevel = DRIVER_PATCHLEVEL, | |
160 | }; |