| .. | .. |
|---|
| 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()) |
|---|