2 * Copyright (C) 2015 Red Hat, Inc.
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
13 * The above copyright notice and this permission notice (including the
14 * next paragraph) shall be included in all copies or substantial
15 * portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
21 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26 #include <linux/pci.h>
27 #include <drm/drm_fb_helper.h>
29 #include "virtgpu_drv.h"
31 int drm_virtio_set_busid(struct drm_device
*dev
, struct drm_master
*master
)
33 struct pci_dev
*pdev
= dev
->pdev
;
36 return drm_pci_set_busid(dev
, master
);
41 static void virtio_pci_kick_out_firmware_fb(struct pci_dev
*pci_dev
)
43 struct apertures_struct
*ap
;
46 ap
= alloc_apertures(1);
50 ap
->ranges
[0].base
= pci_resource_start(pci_dev
, 0);
51 ap
->ranges
[0].size
= pci_resource_len(pci_dev
, 0);
53 primary
= pci_dev
->resource
[PCI_ROM_RESOURCE
].flags
54 & IORESOURCE_ROM_SHADOW
;
56 drm_fb_helper_remove_conflicting_framebuffers(ap
, "virtiodrmfb", primary
);
61 int drm_virtio_init(struct drm_driver
*driver
, struct virtio_device
*vdev
)
63 struct drm_device
*dev
;
66 dev
= drm_dev_alloc(driver
, &vdev
->dev
);
72 if (strcmp(vdev
->dev
.parent
->bus
->name
, "pci") == 0) {
73 struct pci_dev
*pdev
= to_pci_dev(vdev
->dev
.parent
);
74 bool vga
= (pdev
->class >> 8) == PCI_CLASS_DISPLAY_VGA
;
76 DRM_INFO("pci: %s detected\n",
77 vga
? "virtio-vga" : "virtio-gpu-pci");
80 virtio_pci_kick_out_firmware_fb(pdev
);
83 ret
= drm_dev_register(dev
, 0);
87 DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", driver
->name
,
88 driver
->major
, driver
->minor
, driver
->patchlevel
,
89 driver
->date
, dev
->primary
->index
);