]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI/VGA: Fail pci_set_vga_state() if VGA decoding not supported
authorSimon Richter <Simon.Richter@hogyros.de>
Sat, 7 Mar 2026 17:35:37 +0000 (02:35 +0900)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 30 Mar 2026 15:44:50 +0000 (10:44 -0500)
PCI bridges are allowed to refuse activating VGA decoding, by simply
ignoring attempts to set the bit that enables it, so after setting the bit,
read it back to verify.

One example of such a bridge is the root bridge in IBM PowerNV, but this is
also useful for GPU passthrough into virtual machines, where it is
difficult to set up routing for legacy IO through IOMMU.

Signed-off-by: Simon Richter <Simon.Richter@hogyros.de>
[bhelgaas: subject, add comment about VGA Enable writability]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Link: https://patch.msgid.link/20260307173538.763188-5-Simon.Richter@hogyros.de
drivers/pci/pci.c

index 8479c2e1f74f1044416281aba11bf071ea89488a..52eb3ef0f487c7037ea67cacaa320529b27a4955 100644 (file)
@@ -6197,6 +6197,18 @@ int pci_set_vga_state(struct pci_dev *dev, bool decode,
                                cmd &= ~PCI_BRIDGE_CTL_VGA;
                        pci_write_config_word(bridge, PCI_BRIDGE_CONTROL,
                                              cmd);
+
+
+                       /*
+                        * VGA Enable may not be writable if bridge doesn't
+                        * support it.
+                        */
+                       if (decode) {
+                               pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,
+                                                    &cmd);
+                               if (!(cmd & PCI_BRIDGE_CTL_VGA))
+                                       return -EIO;
+                       }
                }
                bus = bus->parent;
        }