diff options
author | Mark Maule <maule@sgi.com> | 2005-04-25 16:51:00 -0400 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2005-06-28 12:09:06 -0400 |
commit | 66b7f8a30437b8639e798f7db8e9be1da5711efa (patch) | |
tree | 288703e10bab793bc399961059ad485604539955 /drivers | |
parent | 54522b6613a03807f057fd567794a31267ef85cb (diff) |
[IA64-SGI] pcdp: add PCDP pci interface support
Resend 2 with changes per Bjorn Helgaas comments. Changes from original:
+ Change globals to vga_console_iobase/vga_console_membase and make them
unconditional.
+ Address style-related comments.
Patch to extend the PCDP vga setup code to support PCI io/mem translations
for the legacy vga ioport and ram spaces on architectures (e.g. altix) which
need them.
Summary of the changes:
drivers/firmware/pcdp.c
drivers/firmware/pcdp.h
-----------------------
+ add declaration for the spec-defined PCI interface struct (pcdp_if_pci)
as well as support macros.
+ extend setup_vga_console() to know about pcdp_if_pci and add a couple of
globals to hold the io and mem translation offsets if present.
arch/ia64/kernel/setup.c
------------------------
+ tweek early_console_setup() to allow multiple early console setup routines
to be called.
include/asm-ia64/vga.h
----------------------
+ make VGA_MAP_MEM vga_console_membase aware
Signed-off-by: Mark Maule <maule@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/firmware/pcdp.c | 24 | ||||
-rw-r--r-- | drivers/firmware/pcdp.h | 33 |
2 files changed, 50 insertions, 7 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 | } |
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)); |