mirror-linux/drivers
Vivek Kasireddy 5dd8b536bb drm/virtio: Lock the VGA resources during initialization
If another driver for a VGA compatible GPU (that is passthrough'd)
locks the VGA resources (by calling vga_get()), then virtio_gpu
driver would encounter the following errors and fail to load during
probe and initialization:

Invalid read at addr 0x7200005014, size 1, region '(null)', reason: rejected
Invalid write at addr 0x7200005014, size 1, region '(null)', reason: rejected
virtio_gpu virtio0: virtio: device uses modern interface but does not have VIRTIO_F_VERSION_1
virtio_gpu virtio0: probe with driver virtio_gpu failed with error -22

This issue is only seen if virtio-gpu and the other GPU are on
different PCI buses, which can happen if the user includes an
additional PCIe port and associates the VGA compatible GPU with
it while launching Qemu:
qemu-system-x86_64...
-device virtio-vga,max_outputs=1,xres=1920,yres=1080,blob=true
-device pcie-root-port,id=pcie.1,bus=pcie.0,addr=1c.0,slot=1,chassis=1,multifunction=on
-device vfio-pci,host=03:00.0,bus=pcie.1,addr=00.0 ...

In the above example, the device 03:00.0 is an Intel DG2 card and
this issue is seen when both i915 driver and virtio_gpu driver are
loading (or initializing) concurrently or when i915 is loaded first.
Note that during initalization, i915 driver does the following in
intel_vga_reset_io_mem():
vga_get_uninterruptible(pdev, VGA_RSRC_LEGACY_IO);
outb(inb(VGA_MIS_R), VGA_MIS_W);
vga_put(pdev, VGA_RSRC_LEGACY_IO);

Although, virtio-gpu might own the VGA resources initially, the
above call (in i915) to vga_get_uninterruptible() would result in
these resources being taken away, which means that virtio-gpu would
not be able to decode VGA anymore. This happens in __vga_tryget()
when it calls
pci_set_vga_state(conflict->pdev, false, pci_bits, flags);
where
pci_bits = PCI_COMMAND_MEMORY | PCI_COMMAND_IO
flags = PCI_VGA_STATE_CHANGE_DECODES | PCI_VGA_STATE_CHANGE_BRIDGE

Therefore, to solve this issue, virtio-gpu driver needs to call
vga_get() whenever it needs to reclaim and access VGA resources,
which is during initial probe and setup. After that, a call to
vga_put() would release the lock to allow other VGA compatible
devices to access these shared VGA resources.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Chia-I Wu <olvaffe@gmail.com>
Reported-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Vivek Kasireddy <vivek.kasireddy@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241211064343.550153-1-vivek.kasireddy@intel.com
Tested-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
Signed-off-by: Dmitry Osipenko <dmitry.osipenko@collabora.com>
2025-01-09 16:52:49 +03:00
..
accel accel/ivpu: Enable HWS by default on all platforms 2025-01-09 09:35:45 +01:00
accessibility
acpi arm64 fixes for 6.13-rc2: 2024-12-06 13:47:55 -08:00
amba
android Char/Misc/IIO/Whatever driver subsystem updates for 6.13-rc1 2024-11-29 11:58:27 -08:00
ata pci-v6.13-changes 2024-11-26 18:05:44 -08:00
atm Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
auxdisplay module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
base - Have the Automatic IBRS setting check on AMD does not falsely fire in 2024-12-08 11:38:56 -08:00
bcma Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
block virtio-blk: don't keep queue frozen during system suspend 2024-12-05 10:00:20 -07:00
bluetooth Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
bus Char/Misc/IIO/Whatever driver subsystem updates for 6.13-rc1 2024-11-29 11:58:27 -08:00
cache
cdrom Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
cdx module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
char Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
clk module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
clocksource Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
comedi
connector
counter module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
cpufreq powerpc updates for 6.13 2024-11-23 10:44:31 -08:00
cpuidle Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
crypto module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
cxl module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
dax module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
dca
devfreq Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
dio
dma module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
dma-buf drm fixes for 6.13-rc2 2024-12-06 11:52:15 -08:00
dpll
edac Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
eisa
extcon Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
firewire firewire updates for v6.13 2024-11-25 17:12:54 -08:00
firmware module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
fpga module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
fsi Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
gnss
gpio module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
gpu drm/virtio: Lock the VGA resources during initialization 2025-01-09 16:52:49 +03:00
greybus
hid hid-for-linus-2024120501 2024-12-05 10:06:47 -08:00
hsi Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
hte Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
hv Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
hwmon module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
hwspinlock Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
hwtracing Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
i2c module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
i3c Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
idle
iio 24 hotfixes. 17 are cc:stable. 15 are MM and 9 are non-MM. 2024-12-08 11:26:13 -08:00
infiniband module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
input Input updates for v6.13-rc0 2024-11-25 10:31:39 -08:00
interconnect
iommu iommufd 6.13 first rc pull 2024-12-05 15:02:20 -08:00
ipack
irqchip - Fix a /proc/interrupts formatting regression 2024-12-08 11:54:04 -08:00
isdn
leds module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
macintosh Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
mailbox TTY / Serial driver updates for 6.13-rc1 2024-11-30 09:03:16 -08:00
mcb module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
md bcache: revert replacing IS_ERR_OR_NULL with IS_ERR again 2024-12-03 15:06:27 -07:00
media module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
memory Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
memstick Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
message scsi: message: fusion: Constify struct pci_device_id 2024-11-20 21:38:24 -05:00
mfd module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
misc module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
mmc mmc: core: Further prevent card detect during shutdown 2024-12-02 15:37:16 +01:00
most
mtd This pull request contains updates for JFFS2, UBI and UBIFS: 2024-11-30 10:32:47 -08:00
mux
net Including fixes from can and netfilter. 2024-12-05 10:25:06 -08:00
nfc
ntb
nubus
nvdimm module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
nvme nvme fixes for Linux 6.13 2024-12-05 10:14:36 -07:00
nvmem Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
of Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
opp Additional power management updates for 6.13-rc1 2024-11-27 14:40:33 -08:00
parisc Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
parport Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
pci module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
pcmcia Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
peci module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
perf module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
phy Driver core changes for 6.13-rc1 2024-11-29 11:43:29 -08:00
pinctrl module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
platform platform-drivers-x86 for v6.13-2 2024-12-04 10:28:30 -08:00
pmdomain pmdomain core: 2024-12-06 11:24:00 -08:00
pnp
power power supply and reset changes for the 6.13 series 2024-11-28 09:28:09 -08:00
powercap module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
pps Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
ps3
ptp Including fixes from can and netfilter. 2024-12-05 10:25:06 -08:00
pwm module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
rapidio
ras
regulator regulator: Fixes for v6.13 2024-11-28 09:40:53 -08:00
remoteproc
reset module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
rpmsg Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
rtc module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
s390 Driver core changes for 6.13-rc1 2024-11-29 11:43:29 -08:00
sbus Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
scsi scsi: scsi_debug: Fix hrtimer support for ndelay 2024-12-04 13:22:59 -05:00
sh sh updates for v6.13 2024-11-30 14:45:29 -08:00
siox
slimbus Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
soc Networking changes for 6.13. 2024-11-21 08:28:08 -08:00
soundwire module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
spi spi: Fixes for v6.13 2024-12-06 11:36:48 -08:00
spmi Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
ssb
staging module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
target Merge branch '6.13/scsi-queue' into 6.13/scsi-fixes 2024-12-02 12:36:18 -05:00
tc
tee Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
thermal module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
thunderbolt USB / Thunderbolt (USB4) changes for 6.13-rc1 2024-11-29 11:19:31 -08:00
tty module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
ufs scsi: ufs: core: Add missing post notify for power mode change 2024-12-04 13:22:59 -05:00
uio Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
usb module: Convert default symbol namespace to string literal 2024-12-03 08:22:25 -08:00
vdpa
vfio module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
vhost
video module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
virt arm64 fixes for 6.13-rc2: 2024-12-06 13:47:55 -08:00
virtio module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
w1 Get rid of 'remove_new' relic from platform driver struct 2024-12-01 15:12:43 -08:00
watchdog linux-watchdog 6.13-rc1 tag 2024-12-05 10:03:43 -08:00
xen module: Convert symbol namespace to string literal 2024-12-02 11:34:44 -08:00
zorro
Kconfig
Makefile