]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/video: Only fall back to vga_default_device() without screen info
authorMario Limonciello <mario.limonciello@amd.com>
Tue, 23 Jun 2026 14:15:05 +0000 (07:15 -0700)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 7 Jul 2026 15:14:55 +0000 (08:14 -0700)
Some multi GPU systems may have a VGA compatible device, but that might not be
used for display.  If due to enumeration order this device is found before the
one actually used for display then multiple devices may show the boot_display
attribute, confusing userspace.

When screen info is valid, use it exclusively to find the primary device so
that only the device backing the framebuffer is reported.  Only when no
framebuffer has been set up does it make sense to fall back to the default VGA
device.  This ensures at most one primary graphics device, preferably the one
with the framebuffer.

Fixes: ad90860bd10ee ("fbcon: Use screen info to find primary device")
Closes: https://lore.kernel.org/linux-pci/20260618081803.2790848-1-aaron.ma@canonical.com/#t
Reported-by: Aaron Ma <aaron.ma@canonical.com>
Suggested-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Reviewed-by: Thomas Zimmermann <tzimmermann@suse.de>
Tested-by: Aaron Ma <aaron.ma@canonical.com>
Cc: <stable@kernel.org>
Link: https://patch.msgid.link/20260623141505.1816786-1-mario.limonciello@amd.com
arch/x86/video/video-common.c

index 152789f00fcda96078b5a109dafe21a8be8410eb..8ed82fff7638ed128ea5c2d3800f9c91e28f33fb 100644 (file)
@@ -43,21 +43,26 @@ bool video_is_primary_device(struct device *dev)
        if (!pci_is_display(pdev))
                return false;
 
-       if (pdev == vga_default_device())
-               return true;
-
 #ifdef CONFIG_SCREEN_INFO
        numres = screen_info_resources(si, res, ARRAY_SIZE(res));
-       for (i = 0; i < numres; ++i) {
-               if (!(res[i].flags & IORESOURCE_MEM))
-                       continue;
+       if (numres > 0) {
+               for (i = 0; i < numres; ++i) {
+                       if (!(res[i].flags & IORESOURCE_MEM))
+                               continue;
+
+                       if (pci_find_resource(pdev, &res[i]))
+                               return true;
+               }
 
-               if (pci_find_resource(pdev, &res[i]))
-                       return true;
+               return false;
        }
 #endif
 
-       return false;
+       /*
+        * No framebuffer was set up by the firmware/bootloader, so fall back
+        * to the default VGA device.
+        */
+       return pdev == vga_default_device();
 }
 EXPORT_SYMBOL(video_is_primary_device);