diff options
Diffstat (limited to 'drivers/firmware/pcdp.c')
| -rw-r--r-- | drivers/firmware/pcdp.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/firmware/pcdp.c b/drivers/firmware/pcdp.c index 839b44a7e08b..53c95c0bbf46 100644 --- a/drivers/firmware/pcdp.c +++ b/drivers/firmware/pcdp.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/console.h> | 16 | #include <linux/console.h> |
| 17 | #include <linux/efi.h> | 17 | #include <linux/efi.h> |
| 18 | #include <linux/serial.h> | 18 | #include <linux/serial.h> |
| 19 | #include <asm/vga.h> | ||
| 19 | #include "pcdp.h" | 20 | #include "pcdp.h" |
| 20 | 21 | ||
| 21 | static int __init | 22 | static int __init |
| @@ -40,10 +41,27 @@ setup_serial_console(struct pcdp_uart *uart) | |||
| 40 | } | 41 | } |
| 41 | 42 | ||
| 42 | static int __init | 43 | static int __init |
| 43 | setup_vga_console(struct pcdp_vga *vga) | 44 | setup_vga_console(struct pcdp_device *dev) |
| 44 | { | 45 | { |
| 45 | #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) | 46 | #if defined(CONFIG_VT) && defined(CONFIG_VGA_CONSOLE) |
| 46 | if (efi_mem_type(0xA0000) == EFI_CONVENTIONAL_MEMORY) { | 47 | u8 *if_ptr; |
| 48 | |||
| 49 | if_ptr = ((u8 *)dev + sizeof(struct pcdp_device)); | ||
| 50 | if (if_ptr[0] == PCDP_IF_PCI) { | ||
| 51 | struct pcdp_if_pci if_pci; | ||
| 52 | |||
| 53 | /* struct copy since ifptr might not be correctly aligned */ | ||
| 54 | |||
| 55 | memcpy(&if_pci, if_ptr, sizeof(if_pci)); | ||
| 56 | |||
| 57 | if (if_pci.trans & PCDP_PCI_TRANS_IOPORT) | ||
| 58 | vga_console_iobase = if_pci.ioport_tra; | ||
| 59 | |||
| 60 | if (if_pci.trans & PCDP_PCI_TRANS_MMIO) | ||
| 61 | vga_console_membase = if_pci.mmio_tra; | ||
| 62 | } | ||
| 63 | |||
| 64 | if (efi_mem_type(vga_console_membase + 0xA0000) == EFI_CONVENTIONAL_MEMORY) { | ||
| 47 | printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not MMIO!\n"); | 65 | printk(KERN_ERR "PCDP: VGA selected, but frame buffer is not MMIO!\n"); |
| 48 | return -ENODEV; | 66 | return -ENODEV; |
| 49 | } | 67 | } |
| @@ -95,7 +113,7 @@ efi_setup_pcdp_console(char *cmdline) | |||
| 95 | dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) { | 113 | dev = (struct pcdp_device *) ((u8 *) dev + dev->length)) { |
| 96 | if (dev->flags & PCDP_PRIMARY_CONSOLE) { | 114 | if (dev->flags & PCDP_PRIMARY_CONSOLE) { |
| 97 | if (dev->type == PCDP_CONSOLE_VGA) { | 115 | if (dev->type == PCDP_CONSOLE_VGA) { |
| 98 | return setup_vga_console((struct pcdp_vga *) dev); | 116 | return setup_vga_console(dev); |
| 99 | } | 117 | } |
| 100 | } | 118 | } |
| 101 | } | 119 | } |
