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> | |
ff67a25d MY |
32 | #include <drm/drmP.h> |
33 | #include <drm/drm.h> | |
dc5698e8 DA |
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; | |
9d492b6b | 57 | |
dc5698e8 DA |
58 | drm_put_dev(dev); |
59 | } | |
60 | ||
61 | static void virtio_gpu_config_changed(struct virtio_device *vdev) | |
62 | { | |
63 | struct drm_device *dev = vdev->priv; | |
64 | struct virtio_gpu_device *vgdev = dev->dev_private; | |
65 | ||
66 | schedule_work(&vgdev->config_changed_work); | |
67 | } | |
68 | ||
69 | static struct virtio_device_id id_table[] = { | |
70 | { VIRTIO_ID_GPU, VIRTIO_DEV_ANY_ID }, | |
71 | { 0 }, | |
72 | }; | |
73 | ||
74 | static unsigned int features[] = { | |
62fb7a5e GH |
75 | #ifdef __LITTLE_ENDIAN |
76 | /* | |
77 | * Gallium command stream send by virgl is native endian. | |
78 | * Because of that we only support little endian guests on | |
79 | * little endian hosts. | |
80 | */ | |
81 | VIRTIO_GPU_F_VIRGL, | |
82 | #endif | |
b4b01b49 | 83 | VIRTIO_GPU_F_EDID, |
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, | |
dc5698e8 | 113 | .compat_ioctl = drm_compat_ioctl, |
dc5698e8 DA |
114 | .llseek = noop_llseek, |
115 | }; | |
116 | ||
dc5698e8 | 117 | static struct drm_driver driver = { |
5443ce86 | 118 | .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC, |
dc5698e8 DA |
119 | .load = virtio_gpu_driver_load, |
120 | .unload = virtio_gpu_driver_unload, | |
62fb7a5e GH |
121 | .open = virtio_gpu_driver_open, |
122 | .postclose = virtio_gpu_driver_postclose, | |
dc5698e8 DA |
123 | |
124 | .dumb_create = virtio_gpu_mode_dumb_create, | |
125 | .dumb_map_offset = virtio_gpu_mode_dumb_mmap, | |
dc5698e8 DA |
126 | |
127 | #if defined(CONFIG_DEBUG_FS) | |
128 | .debugfs_init = virtio_gpu_debugfs_init, | |
dc5698e8 | 129 | #endif |
11a8f280 DA |
130 | .gem_prime_export = drm_gem_prime_export, |
131 | .gem_prime_import = drm_gem_prime_import, | |
132 | .gem_prime_pin = virtgpu_gem_prime_pin, | |
133 | .gem_prime_unpin = virtgpu_gem_prime_unpin, | |
11a8f280 DA |
134 | .gem_prime_vmap = virtgpu_gem_prime_vmap, |
135 | .gem_prime_vunmap = virtgpu_gem_prime_vunmap, | |
136 | .gem_prime_mmap = virtgpu_gem_prime_mmap, | |
dc5698e8 | 137 | |
bd884b74 | 138 | .gem_free_object_unlocked = virtio_gpu_gem_free_object, |
62fb7a5e GH |
139 | .gem_open_object = virtio_gpu_gem_object_open, |
140 | .gem_close_object = virtio_gpu_gem_object_close, | |
dc5698e8 DA |
141 | .fops = &virtio_gpu_driver_fops, |
142 | ||
62fb7a5e GH |
143 | .ioctls = virtio_gpu_ioctls, |
144 | .num_ioctls = DRM_VIRTIO_NUM_IOCTLS, | |
145 | ||
dc5698e8 DA |
146 | .name = DRIVER_NAME, |
147 | .desc = DRIVER_DESC, | |
148 | .date = DRIVER_DATE, | |
149 | .major = DRIVER_MAJOR, | |
150 | .minor = DRIVER_MINOR, | |
151 | .patchlevel = DRIVER_PATCHLEVEL, | |
152 | }; |