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