diff options
Diffstat (limited to 'drivers/gpu/vga/vgaarb.c')
-rw-r--r-- | drivers/gpu/vga/vgaarb.c | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c index d2077f040f3e..77711623b973 100644 --- a/drivers/gpu/vga/vgaarb.c +++ b/drivers/gpu/vga/vgaarb.c | |||
@@ -41,6 +41,7 @@ | |||
41 | #include <linux/poll.h> | 41 | #include <linux/poll.h> |
42 | #include <linux/miscdevice.h> | 42 | #include <linux/miscdevice.h> |
43 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
44 | #include <linux/screen_info.h> | ||
44 | 45 | ||
45 | #include <linux/uaccess.h> | 46 | #include <linux/uaccess.h> |
46 | 47 | ||
@@ -112,10 +113,8 @@ both: | |||
112 | return 1; | 113 | return 1; |
113 | } | 114 | } |
114 | 115 | ||
115 | #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE | ||
116 | /* this is only used a cookie - it should not be dereferenced */ | 116 | /* this is only used a cookie - it should not be dereferenced */ |
117 | static struct pci_dev *vga_default; | 117 | static struct pci_dev *vga_default; |
118 | #endif | ||
119 | 118 | ||
120 | static void vga_arb_device_card_gone(struct pci_dev *pdev); | 119 | static void vga_arb_device_card_gone(struct pci_dev *pdev); |
121 | 120 | ||
@@ -131,7 +130,6 @@ static struct vga_device *vgadev_find(struct pci_dev *pdev) | |||
131 | } | 130 | } |
132 | 131 | ||
133 | /* Returns the default VGA device (vgacon's babe) */ | 132 | /* Returns the default VGA device (vgacon's babe) */ |
134 | #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE | ||
135 | struct pci_dev *vga_default_device(void) | 133 | struct pci_dev *vga_default_device(void) |
136 | { | 134 | { |
137 | return vga_default; | 135 | return vga_default; |
@@ -147,7 +145,6 @@ void vga_set_default_device(struct pci_dev *pdev) | |||
147 | pci_dev_put(vga_default); | 145 | pci_dev_put(vga_default); |
148 | vga_default = pci_dev_get(pdev); | 146 | vga_default = pci_dev_get(pdev); |
149 | } | 147 | } |
150 | #endif | ||
151 | 148 | ||
152 | static inline void vga_irq_set_state(struct vga_device *vgadev, bool state) | 149 | static inline void vga_irq_set_state(struct vga_device *vgadev, bool state) |
153 | { | 150 | { |
@@ -583,11 +580,12 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev) | |||
583 | /* Deal with VGA default device. Use first enabled one | 580 | /* Deal with VGA default device. Use first enabled one |
584 | * by default if arch doesn't have it's own hook | 581 | * by default if arch doesn't have it's own hook |
585 | */ | 582 | */ |
586 | #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE | ||
587 | if (vga_default == NULL && | 583 | if (vga_default == NULL && |
588 | ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) | 584 | ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) { |
585 | pr_info("vgaarb: setting as boot device: PCI:%s\n", | ||
586 | pci_name(pdev)); | ||
589 | vga_set_default_device(pdev); | 587 | vga_set_default_device(pdev); |
590 | #endif | 588 | } |
591 | 589 | ||
592 | vga_arbiter_check_bridge_sharing(vgadev); | 590 | vga_arbiter_check_bridge_sharing(vgadev); |
593 | 591 | ||
@@ -621,10 +619,8 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev) | |||
621 | goto bail; | 619 | goto bail; |
622 | } | 620 | } |
623 | 621 | ||
624 | #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE | ||
625 | if (vga_default == pdev) | 622 | if (vga_default == pdev) |
626 | vga_set_default_device(NULL); | 623 | vga_set_default_device(NULL); |
627 | #endif | ||
628 | 624 | ||
629 | if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM)) | 625 | if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM)) |
630 | vga_decode_count--; | 626 | vga_decode_count--; |
@@ -1320,6 +1316,38 @@ static int __init vga_arb_device_init(void) | |||
1320 | pr_info("vgaarb: loaded\n"); | 1316 | pr_info("vgaarb: loaded\n"); |
1321 | 1317 | ||
1322 | list_for_each_entry(vgadev, &vga_list, list) { | 1318 | list_for_each_entry(vgadev, &vga_list, list) { |
1319 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) | ||
1320 | /* Override I/O based detection done by vga_arbiter_add_pci_device() | ||
1321 | * as it may take the wrong device (e.g. on Apple system under EFI). | ||
1322 | * | ||
1323 | * Select the device owning the boot framebuffer if there is one. | ||
1324 | */ | ||
1325 | resource_size_t start, end; | ||
1326 | int i; | ||
1327 | |||
1328 | /* Does firmware framebuffer belong to us? */ | ||
1329 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { | ||
1330 | if (!(pci_resource_flags(vgadev->pdev, i) & IORESOURCE_MEM)) | ||
1331 | continue; | ||
1332 | |||
1333 | start = pci_resource_start(vgadev->pdev, i); | ||
1334 | end = pci_resource_end(vgadev->pdev, i); | ||
1335 | |||
1336 | if (!start || !end) | ||
1337 | continue; | ||
1338 | |||
1339 | if (screen_info.lfb_base < start || | ||
1340 | (screen_info.lfb_base + screen_info.lfb_size) >= end) | ||
1341 | continue; | ||
1342 | if (!vga_default_device()) | ||
1343 | pr_info("vgaarb: setting as boot device: PCI:%s\n", | ||
1344 | pci_name(vgadev->pdev)); | ||
1345 | else if (vgadev->pdev != vga_default_device()) | ||
1346 | pr_info("vgaarb: overriding boot device: PCI:%s\n", | ||
1347 | pci_name(vgadev->pdev)); | ||
1348 | vga_set_default_device(vgadev->pdev); | ||
1349 | } | ||
1350 | #endif | ||
1323 | if (vgadev->bridge_has_one_vga) | 1351 | if (vgadev->bridge_has_one_vga) |
1324 | pr_info("vgaarb: bridge control possible %s\n", pci_name(vgadev->pdev)); | 1352 | pr_info("vgaarb: bridge control possible %s\n", pci_name(vgadev->pdev)); |
1325 | else | 1353 | else |