| .. | .. |
|---|
| 29 | 29 | #include <linux/module.h> |
|---|
| 30 | 30 | #include <linux/console.h> |
|---|
| 31 | 31 | #include <linux/pci.h> |
|---|
| 32 | | -#include <drm/drmP.h> |
|---|
| 32 | + |
|---|
| 33 | 33 | #include <drm/drm.h> |
|---|
| 34 | +#include <drm/drm_atomic_helper.h> |
|---|
| 35 | +#include <drm/drm_drv.h> |
|---|
| 36 | +#include <drm/drm_file.h> |
|---|
| 34 | 37 | |
|---|
| 35 | 38 | #include "virtgpu_drv.h" |
|---|
| 39 | + |
|---|
| 36 | 40 | static struct drm_driver driver; |
|---|
| 37 | 41 | |
|---|
| 38 | 42 | static int virtio_gpu_modeset = -1; |
|---|
| 39 | 43 | |
|---|
| 40 | 44 | MODULE_PARM_DESC(modeset, "Disable/Enable modesetting"); |
|---|
| 41 | 45 | module_param_named(modeset, virtio_gpu_modeset, int, 0400); |
|---|
| 42 | | - |
|---|
| 43 | | -static void virtio_pci_kick_out_firmware_fb(struct pci_dev *pci_dev) |
|---|
| 44 | | -{ |
|---|
| 45 | | - struct apertures_struct *ap; |
|---|
| 46 | | - bool primary; |
|---|
| 47 | | - |
|---|
| 48 | | - ap = alloc_apertures(1); |
|---|
| 49 | | - if (!ap) |
|---|
| 50 | | - return; |
|---|
| 51 | | - |
|---|
| 52 | | - ap->ranges[0].base = pci_resource_start(pci_dev, 0); |
|---|
| 53 | | - ap->ranges[0].size = pci_resource_len(pci_dev, 0); |
|---|
| 54 | | - |
|---|
| 55 | | - primary = pci_dev->resource[PCI_ROM_RESOURCE].flags |
|---|
| 56 | | - & IORESOURCE_ROM_SHADOW; |
|---|
| 57 | | - |
|---|
| 58 | | - drm_fb_helper_remove_conflicting_framebuffers(ap, "virtiodrmfb", primary); |
|---|
| 59 | | - |
|---|
| 60 | | - kfree(ap); |
|---|
| 61 | | -} |
|---|
| 62 | 46 | |
|---|
| 63 | 47 | static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vdev) |
|---|
| 64 | 48 | { |
|---|
| .. | .. |
|---|
| 72 | 56 | pname); |
|---|
| 73 | 57 | dev->pdev = pdev; |
|---|
| 74 | 58 | if (vga) |
|---|
| 75 | | - virtio_pci_kick_out_firmware_fb(pdev); |
|---|
| 59 | + drm_fb_helper_remove_conflicting_pci_framebuffers(pdev, |
|---|
| 60 | + "virtiodrmfb"); |
|---|
| 76 | 61 | |
|---|
| 77 | 62 | /* |
|---|
| 78 | 63 | * Normally the drm_dev_set_unique() call is done by core DRM. |
|---|
| .. | .. |
|---|
| 151 | 136 | { |
|---|
| 152 | 137 | struct drm_device *dev = vdev->priv; |
|---|
| 153 | 138 | |
|---|
| 154 | | - drm_dev_unregister(dev); |
|---|
| 139 | + drm_dev_unplug(dev); |
|---|
| 140 | + drm_atomic_helper_shutdown(dev); |
|---|
| 155 | 141 | virtio_gpu_deinit(dev); |
|---|
| 156 | | - drm_put_dev(dev); |
|---|
| 142 | + drm_dev_put(dev); |
|---|
| 157 | 143 | } |
|---|
| 158 | 144 | |
|---|
| 159 | 145 | static void virtio_gpu_config_changed(struct virtio_device *vdev) |
|---|
| .. | .. |
|---|
| 179 | 165 | VIRTIO_GPU_F_VIRGL, |
|---|
| 180 | 166 | #endif |
|---|
| 181 | 167 | VIRTIO_GPU_F_EDID, |
|---|
| 168 | + VIRTIO_GPU_F_RESOURCE_UUID, |
|---|
| 182 | 169 | }; |
|---|
| 183 | 170 | static struct virtio_driver virtio_gpu_driver = { |
|---|
| 184 | 171 | .feature_table = features, |
|---|
| .. | .. |
|---|
| 200 | 187 | MODULE_AUTHOR("Gerd Hoffmann <kraxel@redhat.com>"); |
|---|
| 201 | 188 | MODULE_AUTHOR("Alon Levy"); |
|---|
| 202 | 189 | |
|---|
| 203 | | -static const struct file_operations virtio_gpu_driver_fops = { |
|---|
| 204 | | - .owner = THIS_MODULE, |
|---|
| 205 | | - .open = drm_open, |
|---|
| 206 | | - .mmap = virtio_gpu_mmap, |
|---|
| 207 | | - .poll = drm_poll, |
|---|
| 208 | | - .read = drm_read, |
|---|
| 209 | | - .unlocked_ioctl = drm_ioctl, |
|---|
| 210 | | - .release = drm_release, |
|---|
| 211 | | - .compat_ioctl = drm_compat_ioctl, |
|---|
| 212 | | - .llseek = noop_llseek, |
|---|
| 213 | | -}; |
|---|
| 190 | +DEFINE_DRM_GEM_FOPS(virtio_gpu_driver_fops); |
|---|
| 214 | 191 | |
|---|
| 215 | 192 | static struct drm_driver driver = { |
|---|
| 216 | | - .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER | DRIVER_ATOMIC, |
|---|
| 193 | + .driver_features = DRIVER_MODESET | DRIVER_GEM | DRIVER_RENDER | DRIVER_ATOMIC, |
|---|
| 217 | 194 | .open = virtio_gpu_driver_open, |
|---|
| 218 | 195 | .postclose = virtio_gpu_driver_postclose, |
|---|
| 219 | 196 | |
|---|
| .. | .. |
|---|
| 225 | 202 | #endif |
|---|
| 226 | 203 | .prime_handle_to_fd = drm_gem_prime_handle_to_fd, |
|---|
| 227 | 204 | .prime_fd_to_handle = drm_gem_prime_fd_to_handle, |
|---|
| 228 | | - .gem_prime_export = drm_gem_prime_export, |
|---|
| 229 | | - .gem_prime_import = drm_gem_prime_import, |
|---|
| 230 | | - .gem_prime_get_sg_table = virtgpu_gem_prime_get_sg_table, |
|---|
| 205 | + .gem_prime_mmap = drm_gem_prime_mmap, |
|---|
| 206 | + .gem_prime_export = virtgpu_gem_prime_export, |
|---|
| 207 | + .gem_prime_import = virtgpu_gem_prime_import, |
|---|
| 231 | 208 | .gem_prime_import_sg_table = virtgpu_gem_prime_import_sg_table, |
|---|
| 232 | | - .gem_prime_vmap = virtgpu_gem_prime_vmap, |
|---|
| 233 | | - .gem_prime_vunmap = virtgpu_gem_prime_vunmap, |
|---|
| 234 | | - .gem_prime_mmap = virtgpu_gem_prime_mmap, |
|---|
| 235 | 209 | |
|---|
| 236 | | - .gem_free_object_unlocked = virtio_gpu_gem_free_object, |
|---|
| 237 | | - .gem_open_object = virtio_gpu_gem_object_open, |
|---|
| 238 | | - .gem_close_object = virtio_gpu_gem_object_close, |
|---|
| 210 | + .gem_create_object = virtio_gpu_create_object, |
|---|
| 239 | 211 | .fops = &virtio_gpu_driver_fops, |
|---|
| 240 | 212 | |
|---|
| 241 | 213 | .ioctls = virtio_gpu_ioctls, |
|---|
| .. | .. |
|---|
| 247 | 219 | .major = DRIVER_MAJOR, |
|---|
| 248 | 220 | .minor = DRIVER_MINOR, |
|---|
| 249 | 221 | .patchlevel = DRIVER_PATCHLEVEL, |
|---|
| 222 | + |
|---|
| 223 | + .release = virtio_gpu_release, |
|---|
| 250 | 224 | }; |
|---|