diff options
| -rw-r--r-- | arch/ia64/kernel/setup.c | 12 | ||||
| -rw-r--r-- | drivers/firmware/pcdp.c | 24 | ||||
| -rw-r--r-- | drivers/firmware/pcdp.h | 33 | ||||
| -rw-r--r-- | include/asm-ia64/vga.h | 5 |
4 files changed, 62 insertions, 12 deletions
diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c index d14692e0920a..2693e1522d7c 100644 --- a/arch/ia64/kernel/setup.c +++ b/arch/ia64/kernel/setup.c | |||
| @@ -72,6 +72,8 @@ DEFINE_PER_CPU(unsigned long, ia64_phys_stacked_size_p8); | |||
| 72 | unsigned long ia64_cycles_per_usec; | 72 | unsigned long ia64_cycles_per_usec; |
| 73 | struct ia64_boot_param *ia64_boot_param; | 73 | struct ia64_boot_param *ia64_boot_param; |
| 74 | struct screen_info screen_info; | 74 | struct screen_info screen_info; |
| 75 | unsigned long vga_console_iobase; | ||
| 76 | unsigned long vga_console_membase; | ||
| 75 | 77 | ||
| 76 | unsigned long ia64_max_cacheline_size; | 78 | unsigned long ia64_max_cacheline_size; |
| 77 | unsigned long ia64_iobase; /* virtual address for I/O accesses */ | 79 | unsigned long ia64_iobase; /* virtual address for I/O accesses */ |
| @@ -273,23 +275,25 @@ io_port_init (void) | |||
| 273 | static inline int __init | 275 | static inline int __init |
| 274 | early_console_setup (char *cmdline) | 276 | early_console_setup (char *cmdline) |
| 275 | { | 277 | { |
| 278 | int earlycons = 0; | ||
| 279 | |||
| 276 | #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE | 280 | #ifdef CONFIG_SERIAL_SGI_L1_CONSOLE |
| 277 | { | 281 | { |
| 278 | extern int sn_serial_console_early_setup(void); | 282 | extern int sn_serial_console_early_setup(void); |
| 279 | if (!sn_serial_console_early_setup()) | 283 | if (!sn_serial_console_early_setup()) |
| 280 | return 0; | 284 | earlycons++; |
| 281 | } | 285 | } |
| 282 | #endif | 286 | #endif |
| 283 | #ifdef CONFIG_EFI_PCDP | 287 | #ifdef CONFIG_EFI_PCDP |
| 284 | if (!efi_setup_pcdp_console(cmdline)) | 288 | if (!efi_setup_pcdp_console(cmdline)) |
| 285 | return 0; | 289 | earlycons++; |
| 286 | #endif | 290 | #endif |
| 287 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 291 | #ifdef CONFIG_SERIAL_8250_CONSOLE |
| 288 | if (!early_serial_console_init(cmdline)) | 292 | if (!early_serial_console_init(cmdline)) |
| 289 | return 0; | 293 | earlycons++; |
| 290 | #endif | 294 | #endif |
| 291 | 295 | ||
| 292 | return -1; | 296 | return (earlycons) ? 0 : -1; |
| 293 | } | 297 | } |
| 294 | 298 | ||
| 295 | static inline void | 299 | static inline void |
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 | } |
diff --git a/drivers/firmware/pcdp.h b/drivers/firmware/pcdp.h index 1dc7c88b7b4d..e72cc47de33b 100644 --- a/drivers/firmware/pcdp.h +++ b/drivers/firmware/pcdp.h | |||
| @@ -52,11 +52,34 @@ struct pcdp_uart { | |||
| 52 | u32 clock_rate; | 52 | u32 clock_rate; |
| 53 | u8 pci_prog_intfc; | 53 | u8 pci_prog_intfc; |
| 54 | u8 flags; | 54 | u8 flags; |
| 55 | }; | 55 | } __attribute__((packed)); |
| 56 | |||
| 57 | #define PCDP_IF_PCI 1 | ||
| 58 | |||
| 59 | /* pcdp_if_pci.trans */ | ||
| 60 | #define PCDP_PCI_TRANS_IOPORT 0x02 | ||
| 61 | #define PCDP_PCI_TRANS_MMIO 0x01 | ||
| 62 | |||
| 63 | struct pcdp_if_pci { | ||
| 64 | u8 interconnect; | ||
| 65 | u8 reserved; | ||
| 66 | u16 length; | ||
| 67 | u8 segment; | ||
| 68 | u8 bus; | ||
| 69 | u8 dev; | ||
| 70 | u8 fun; | ||
| 71 | u16 dev_id; | ||
| 72 | u16 vendor_id; | ||
| 73 | u32 acpi_interrupt; | ||
| 74 | u64 mmio_tra; | ||
| 75 | u64 ioport_tra; | ||
| 76 | u8 flags; | ||
| 77 | u8 trans; | ||
| 78 | } __attribute__((packed)); | ||
| 56 | 79 | ||
| 57 | struct pcdp_vga { | 80 | struct pcdp_vga { |
| 58 | u8 count; /* address space descriptors */ | 81 | u8 count; /* address space descriptors */ |
| 59 | }; | 82 | } __attribute__((packed)); |
| 60 | 83 | ||
| 61 | /* pcdp_device.flags */ | 84 | /* pcdp_device.flags */ |
| 62 | #define PCDP_PRIMARY_CONSOLE 1 | 85 | #define PCDP_PRIMARY_CONSOLE 1 |
| @@ -66,7 +89,9 @@ struct pcdp_device { | |||
| 66 | u8 flags; | 89 | u8 flags; |
| 67 | u16 length; | 90 | u16 length; |
| 68 | u16 efi_index; | 91 | u16 efi_index; |
| 69 | }; | 92 | /* next data is pcdp_if_pci or pcdp_if_acpi (not yet supported) */ |
| 93 | /* next data is device specific type (currently only pcdp_vga) */ | ||
| 94 | } __attribute__((packed)); | ||
| 70 | 95 | ||
| 71 | struct pcdp { | 96 | struct pcdp { |
| 72 | u8 signature[4]; | 97 | u8 signature[4]; |
| @@ -81,4 +106,4 @@ struct pcdp { | |||
| 81 | u32 num_uarts; | 106 | u32 num_uarts; |
| 82 | struct pcdp_uart uart[0]; /* actual size is num_uarts */ | 107 | struct pcdp_uart uart[0]; /* actual size is num_uarts */ |
| 83 | /* remainder of table is pcdp_device structures */ | 108 | /* remainder of table is pcdp_device structures */ |
| 84 | }; | 109 | } __attribute__((packed)); |
diff --git a/include/asm-ia64/vga.h b/include/asm-ia64/vga.h index 1f446d6841f6..bc3349ffc505 100644 --- a/include/asm-ia64/vga.h +++ b/include/asm-ia64/vga.h | |||
| @@ -14,7 +14,10 @@ | |||
| 14 | * videoram directly without any black magic. | 14 | * videoram directly without any black magic. |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #define VGA_MAP_MEM(x) ((unsigned long) ioremap((x), 0)) | 17 | extern unsigned long vga_console_iobase; |
| 18 | extern unsigned long vga_console_membase; | ||
| 19 | |||
| 20 | #define VGA_MAP_MEM(x) ((unsigned long) ioremap(vga_console_membase + (x), 0)) | ||
| 18 | 21 | ||
| 19 | #define vga_readb(x) (*(x)) | 22 | #define vga_readb(x) (*(x)) |
| 20 | #define vga_writeb(x,y) (*(y) = (x)) | 23 | #define vga_writeb(x,y) (*(y) = (x)) |
