.. | .. |
---|
48 | 48 | #include <linux/miscdevice.h> |
---|
49 | 49 | #include <linux/slab.h> |
---|
50 | 50 | #include <linux/screen_info.h> |
---|
| 51 | +#include <linux/vt.h> |
---|
| 52 | +#include <linux/console.h> |
---|
51 | 53 | |
---|
52 | 54 | #include <linux/uaccess.h> |
---|
53 | 55 | |
---|
.. | .. |
---|
167 | 169 | pci_dev_put(vga_default); |
---|
168 | 170 | vga_default = pci_dev_get(pdev); |
---|
169 | 171 | } |
---|
| 172 | + |
---|
| 173 | +/** |
---|
| 174 | + * vga_remove_vgacon - deactivete vga console |
---|
| 175 | + * |
---|
| 176 | + * Unbind and unregister vgacon in case pdev is the default vga |
---|
| 177 | + * device. Can be called by gpu drivers on initialization to make |
---|
| 178 | + * sure vga register access done by vgacon will not disturb the |
---|
| 179 | + * device. |
---|
| 180 | + * |
---|
| 181 | + * @pdev: pci device. |
---|
| 182 | + */ |
---|
| 183 | +#if !defined(CONFIG_VGA_CONSOLE) |
---|
| 184 | +int vga_remove_vgacon(struct pci_dev *pdev) |
---|
| 185 | +{ |
---|
| 186 | + return 0; |
---|
| 187 | +} |
---|
| 188 | +#elif !defined(CONFIG_DUMMY_CONSOLE) |
---|
| 189 | +int vga_remove_vgacon(struct pci_dev *pdev) |
---|
| 190 | +{ |
---|
| 191 | + return -ENODEV; |
---|
| 192 | +} |
---|
| 193 | +#else |
---|
| 194 | +int vga_remove_vgacon(struct pci_dev *pdev) |
---|
| 195 | +{ |
---|
| 196 | + int ret = 0; |
---|
| 197 | + |
---|
| 198 | + if (pdev != vga_default) |
---|
| 199 | + return 0; |
---|
| 200 | + vgaarb_info(&pdev->dev, "deactivate vga console\n"); |
---|
| 201 | + |
---|
| 202 | + console_lock(); |
---|
| 203 | + if (con_is_bound(&vga_con)) |
---|
| 204 | + ret = do_take_over_console(&dummy_con, 0, |
---|
| 205 | + MAX_NR_CONSOLES - 1, 1); |
---|
| 206 | + if (ret == 0) { |
---|
| 207 | + ret = do_unregister_con_driver(&vga_con); |
---|
| 208 | + |
---|
| 209 | + /* Ignore "already unregistered". */ |
---|
| 210 | + if (ret == -ENODEV) |
---|
| 211 | + ret = 0; |
---|
| 212 | + } |
---|
| 213 | + console_unlock(); |
---|
| 214 | + |
---|
| 215 | + return ret; |
---|
| 216 | +} |
---|
| 217 | +#endif |
---|
| 218 | +EXPORT_SYMBOL(vga_remove_vgacon); |
---|
170 | 219 | |
---|
171 | 220 | static inline void vga_irq_set_state(struct vga_device *vgadev, bool state) |
---|
172 | 221 | { |
---|
.. | .. |
---|
480 | 529 | * |
---|
481 | 530 | * 0 on success, negative error code on failure. |
---|
482 | 531 | */ |
---|
483 | | -int vga_tryget(struct pci_dev *pdev, unsigned int rsrc) |
---|
| 532 | +static int vga_tryget(struct pci_dev *pdev, unsigned int rsrc) |
---|
484 | 533 | { |
---|
485 | 534 | struct vga_device *vgadev; |
---|
486 | 535 | unsigned long flags; |
---|
.. | .. |
---|
505 | 554 | spin_unlock_irqrestore(&vga_lock, flags); |
---|
506 | 555 | return rc; |
---|
507 | 556 | } |
---|
508 | | -EXPORT_SYMBOL(vga_tryget); |
---|
509 | 557 | |
---|
510 | 558 | /** |
---|
511 | 559 | * vga_put - release lock on legacy VGA resources |
---|
.. | .. |
---|
676 | 724 | vga_arbiter_check_bridge_sharing(vgadev); |
---|
677 | 725 | |
---|
678 | 726 | /* Add to the list */ |
---|
679 | | - list_add(&vgadev->list, &vga_list); |
---|
| 727 | + list_add_tail(&vgadev->list, &vga_list); |
---|
680 | 728 | vga_count++; |
---|
681 | 729 | vgaarb_info(&pdev->dev, "VGA device added: decodes=%s,owns=%s,locks=%s\n", |
---|
682 | 730 | vga_iostate_to_str(vgadev->decodes), |
---|
.. | .. |
---|
1408 | 1456 | struct vga_device *vgadev; |
---|
1409 | 1457 | |
---|
1410 | 1458 | #if defined(CONFIG_X86) || defined(CONFIG_IA64) |
---|
| 1459 | + u64 base = screen_info.lfb_base; |
---|
| 1460 | + u64 size = screen_info.lfb_size; |
---|
| 1461 | + u64 limit; |
---|
| 1462 | + resource_size_t start, end; |
---|
| 1463 | + unsigned long flags; |
---|
| 1464 | + int i; |
---|
| 1465 | + |
---|
| 1466 | + if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE) |
---|
| 1467 | + base |= (u64)screen_info.ext_lfb_base << 32; |
---|
| 1468 | + |
---|
| 1469 | + limit = base + size; |
---|
| 1470 | + |
---|
1411 | 1471 | list_for_each_entry(vgadev, &vga_list, list) { |
---|
1412 | 1472 | struct device *dev = &vgadev->pdev->dev; |
---|
1413 | 1473 | /* |
---|
.. | .. |
---|
1418 | 1478 | * Select the device owning the boot framebuffer if there is |
---|
1419 | 1479 | * one. |
---|
1420 | 1480 | */ |
---|
1421 | | - resource_size_t start, end, limit; |
---|
1422 | | - unsigned long flags; |
---|
1423 | | - int i; |
---|
1424 | | - |
---|
1425 | | - limit = screen_info.lfb_base + screen_info.lfb_size; |
---|
1426 | 1481 | |
---|
1427 | 1482 | /* Does firmware framebuffer belong to us? */ |
---|
1428 | 1483 | for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { |
---|
.. | .. |
---|
1437 | 1492 | if (!start || !end) |
---|
1438 | 1493 | continue; |
---|
1439 | 1494 | |
---|
1440 | | - if (screen_info.lfb_base < start || limit >= end) |
---|
| 1495 | + if (base < start || limit >= end) |
---|
1441 | 1496 | continue; |
---|
1442 | 1497 | |
---|
1443 | 1498 | if (!vga_default_device()) |
---|