|
50 | 50 | #include <linux/screen_info.h>
|
51 | 51 | #include <linux/vt.h>
|
52 | 52 | #include <linux/console.h>
|
| 53 | +#include <linux/acpi.h> |
53 | 54 |
|
54 | 55 | #include <linux/uaccess.h>
|
55 | 56 |
|
@@ -1450,9 +1451,23 @@ static struct miscdevice vga_arb_device = {
|
1450 | 1451 | MISC_DYNAMIC_MINOR, "vga_arbiter", &vga_arb_device_fops
|
1451 | 1452 | };
|
1452 | 1453 |
|
| 1454 | +#if defined(CONFIG_ACPI) |
| 1455 | +static bool vga_arb_integrated_gpu(struct device *dev) |
| 1456 | +{ |
| 1457 | + struct acpi_device *adev = ACPI_COMPANION(dev); |
| 1458 | + |
| 1459 | + return adev && !strcmp(acpi_device_hid(adev), ACPI_VIDEO_HID); |
| 1460 | +} |
| 1461 | +#else |
| 1462 | +static bool vga_arb_integrated_gpu(struct device *dev) |
| 1463 | +{ |
| 1464 | + return false; |
| 1465 | +} |
| 1466 | +#endif |
| 1467 | + |
1453 | 1468 | static void __init vga_arb_select_default_device(void)
|
1454 | 1469 | {
|
1455 |
| - struct pci_dev *pdev; |
| 1470 | + struct pci_dev *pdev, *found = NULL; |
1456 | 1471 | struct vga_device *vgadev;
|
1457 | 1472 |
|
1458 | 1473 | #if defined(CONFIG_X86) || defined(CONFIG_IA64)
|
@@ -1505,20 +1520,26 @@ static void __init vga_arb_select_default_device(void)
|
1505 | 1520 | #endif
|
1506 | 1521 |
|
1507 | 1522 | if (!vga_default_device()) {
|
1508 |
| - list_for_each_entry(vgadev, &vga_list, list) { |
| 1523 | + list_for_each_entry_reverse(vgadev, &vga_list, list) { |
1509 | 1524 | struct device *dev = &vgadev->pdev->dev;
|
1510 | 1525 | u16 cmd;
|
1511 | 1526 |
|
1512 | 1527 | pdev = vgadev->pdev;
|
1513 | 1528 | pci_read_config_word(pdev, PCI_COMMAND, &cmd);
|
1514 | 1529 | if (cmd & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
1515 |
| - vgaarb_info(dev, "setting as boot device (VGA legacy resources not available)\n"); |
1516 |
| - vga_set_default_device(pdev); |
1517 |
| - break; |
| 1530 | + found = pdev; |
| 1531 | + if (vga_arb_integrated_gpu(dev)) |
| 1532 | + break; |
1518 | 1533 | }
|
1519 | 1534 | }
|
1520 | 1535 | }
|
1521 | 1536 |
|
| 1537 | + if (found) { |
| 1538 | + vgaarb_info(&found->dev, "setting as boot device (VGA legacy resources not available)\n"); |
| 1539 | + vga_set_default_device(found); |
| 1540 | + return; |
| 1541 | + } |
| 1542 | + |
1522 | 1543 | if (!vga_default_device()) {
|
1523 | 1544 | vgadev = list_first_entry_or_null(&vga_list,
|
1524 | 1545 | struct vga_device, list);
|
|
0 commit comments