1 | /* |
2 | * Setup pointers to hardware-dependent routines. |
3 | * |
4 | * This file is subject to the terms and conditions of the GNU General Public |
5 | * License. See the file "COPYING" in the main directory of this archive |
6 | * for more details. |
7 | * |
8 | * Copyright (C) 1996, 97, 98, 2000, 03, 04, 06 Ralf Baechle (ralf@linux-mips.org) |
9 | * Copyright (C) 2006,2007 Thomas Bogendoerfer (tsbogend@alpha.franken.de) |
10 | */ |
11 | #include <linux/eisa.h> |
12 | #include <linux/init.h> |
13 | #include <linux/export.h> |
14 | #include <linux/console.h> |
15 | #include <linux/fb.h> |
16 | #include <linux/screen_info.h> |
17 | |
18 | #ifdef CONFIG_FW_ARC |
19 | #include <asm/fw/arc/types.h> |
20 | #include <asm/sgialib.h> |
21 | #endif |
22 | |
23 | #ifdef CONFIG_FW_SNIPROM |
24 | #include <asm/mipsprom.h> |
25 | #endif |
26 | |
27 | #include <asm/bootinfo.h> |
28 | #include <asm/cpu.h> |
29 | #include <asm/io.h> |
30 | #include <asm/reboot.h> |
31 | #include <asm/sni.h> |
32 | |
33 | unsigned int sni_brd_type; |
34 | EXPORT_SYMBOL(sni_brd_type); |
35 | |
36 | extern void sni_machine_restart(char *command); |
37 | extern void sni_machine_power_off(void); |
38 | |
39 | static void __init sni_display_setup(void) |
40 | { |
41 | #if defined(CONFIG_VGA_CONSOLE) && defined(CONFIG_FW_ARC) |
42 | static struct screen_info si; |
43 | DISPLAY_STATUS *di; |
44 | |
45 | di = ArcGetDisplayStatus(1); |
46 | |
47 | if (di) { |
48 | si.orig_x = di->CursorXPosition; |
49 | si.orig_y = di->CursorYPosition; |
50 | si.orig_video_cols = di->CursorMaxXPosition; |
51 | si.orig_video_lines = di->CursorMaxYPosition; |
52 | si.orig_video_isVGA = VIDEO_TYPE_VGAC; |
53 | si.orig_video_points = 16; |
54 | |
55 | vgacon_register_screen(&si); |
56 | } |
57 | #endif |
58 | } |
59 | |
60 | static void __init sni_console_setup(void) |
61 | { |
62 | #ifndef CONFIG_FW_ARC |
63 | char *ctype; |
64 | char *cdev; |
65 | char *baud; |
66 | int port; |
67 | static char options[8] __initdata; |
68 | |
69 | cdev = prom_getenv("console_dev" ); |
70 | if (strncmp(cdev, "tty" , 3) == 0) { |
71 | ctype = prom_getenv("console" ); |
72 | switch (*ctype) { |
73 | default: |
74 | case 'l': |
75 | port = 0; |
76 | baud = prom_getenv("lbaud" ); |
77 | break; |
78 | case 'r': |
79 | port = 1; |
80 | baud = prom_getenv("rbaud" ); |
81 | break; |
82 | } |
83 | if (baud) |
84 | strcpy(p: options, q: baud); |
85 | if (strncmp(cdev, "tty552" , 6) == 0) |
86 | add_preferred_console(name: "ttyS" , idx: port, |
87 | options: baud ? options : NULL); |
88 | else |
89 | add_preferred_console(name: "ttySC" , idx: port, |
90 | options: baud ? options : NULL); |
91 | } |
92 | #endif |
93 | } |
94 | |
95 | #ifdef DEBUG |
96 | static void __init sni_idprom_dump(void) |
97 | { |
98 | int i; |
99 | |
100 | pr_debug("SNI IDProm dump:\n" ); |
101 | for (i = 0; i < 256; i++) { |
102 | if (i%16 == 0) |
103 | pr_debug("%04x " , i); |
104 | |
105 | printk("%02x " , *(unsigned char *) (SNI_IDPROM_BASE + i)); |
106 | |
107 | if (i % 16 == 15) |
108 | printk("\n" ); |
109 | } |
110 | } |
111 | #endif |
112 | |
113 | void __init plat_mem_setup(void) |
114 | { |
115 | int cputype; |
116 | |
117 | set_io_port_base(SNI_PORT_BASE); |
118 | // ioport_resource.end = sni_io_resource.end; |
119 | |
120 | /* |
121 | * Setup (E)ISA I/O memory access stuff |
122 | */ |
123 | #ifdef CONFIG_EISA |
124 | EISA_bus = 1; |
125 | #endif |
126 | |
127 | sni_brd_type = *(unsigned char *)SNI_IDPROM_BRDTYPE; |
128 | cputype = *(unsigned char *)SNI_IDPROM_CPUTYPE; |
129 | switch (sni_brd_type) { |
130 | case SNI_BRD_TOWER_OASIC: |
131 | switch (cputype) { |
132 | case SNI_CPU_M8030: |
133 | system_type = "RM400-330" ; |
134 | break; |
135 | case SNI_CPU_M8031: |
136 | system_type = "RM400-430" ; |
137 | break; |
138 | case SNI_CPU_M8037: |
139 | system_type = "RM400-530" ; |
140 | break; |
141 | case SNI_CPU_M8034: |
142 | system_type = "RM400-730" ; |
143 | break; |
144 | default: |
145 | system_type = "RM400-xxx" ; |
146 | break; |
147 | } |
148 | break; |
149 | case SNI_BRD_MINITOWER: |
150 | switch (cputype) { |
151 | case SNI_CPU_M8021: |
152 | case SNI_CPU_M8043: |
153 | system_type = "RM400-120" ; |
154 | break; |
155 | case SNI_CPU_M8040: |
156 | system_type = "RM400-220" ; |
157 | break; |
158 | case SNI_CPU_M8053: |
159 | system_type = "RM400-225" ; |
160 | break; |
161 | case SNI_CPU_M8050: |
162 | system_type = "RM400-420" ; |
163 | break; |
164 | default: |
165 | system_type = "RM400-xxx" ; |
166 | break; |
167 | } |
168 | break; |
169 | case SNI_BRD_PCI_TOWER: |
170 | system_type = "RM400-Cxx" ; |
171 | break; |
172 | case SNI_BRD_RM200: |
173 | system_type = "RM200-xxx" ; |
174 | break; |
175 | case SNI_BRD_PCI_MTOWER: |
176 | system_type = "RM300-Cxx" ; |
177 | break; |
178 | case SNI_BRD_PCI_DESKTOP: |
179 | switch (read_c0_prid() & PRID_IMP_MASK) { |
180 | case PRID_IMP_R4600: |
181 | case PRID_IMP_R4700: |
182 | system_type = "RM200-C20" ; |
183 | break; |
184 | case PRID_IMP_R5000: |
185 | system_type = "RM200-C40" ; |
186 | break; |
187 | default: |
188 | system_type = "RM200-Cxx" ; |
189 | break; |
190 | } |
191 | break; |
192 | case SNI_BRD_PCI_TOWER_CPLUS: |
193 | system_type = "RM400-Exx" ; |
194 | break; |
195 | case SNI_BRD_PCI_MTOWER_CPLUS: |
196 | system_type = "RM300-Exx" ; |
197 | break; |
198 | } |
199 | pr_debug("Found SNI brdtype %02x name %s\n" , sni_brd_type, system_type); |
200 | |
201 | #ifdef DEBUG |
202 | sni_idprom_dump(); |
203 | #endif |
204 | |
205 | switch (sni_brd_type) { |
206 | case SNI_BRD_10: |
207 | case SNI_BRD_10NEW: |
208 | case SNI_BRD_TOWER_OASIC: |
209 | case SNI_BRD_MINITOWER: |
210 | sni_a20r_init(); |
211 | break; |
212 | |
213 | case SNI_BRD_PCI_TOWER: |
214 | case SNI_BRD_PCI_TOWER_CPLUS: |
215 | sni_pcit_init(); |
216 | break; |
217 | |
218 | case SNI_BRD_RM200: |
219 | sni_rm200_init(); |
220 | break; |
221 | |
222 | case SNI_BRD_PCI_MTOWER: |
223 | case SNI_BRD_PCI_DESKTOP: |
224 | case SNI_BRD_PCI_MTOWER_CPLUS: |
225 | sni_pcimt_init(); |
226 | break; |
227 | } |
228 | |
229 | _machine_restart = sni_machine_restart; |
230 | pm_power_off = sni_machine_power_off; |
231 | |
232 | sni_display_setup(); |
233 | sni_console_setup(); |
234 | } |
235 | |
236 | #ifdef CONFIG_PCI |
237 | |
238 | #include <linux/pci.h> |
239 | #include <video/vga.h> |
240 | #include <video/cirrus.h> |
241 | |
242 | static void quirk_cirrus_ram_size(struct pci_dev *dev) |
243 | { |
244 | u16 cmd; |
245 | |
246 | /* |
247 | * firmware doesn't set the ram size correct, so we |
248 | * need to do it here, otherwise we get screen corruption |
249 | * on older Cirrus chips |
250 | */ |
251 | pci_read_config_word(dev, PCI_COMMAND, val: &cmd); |
252 | if ((cmd & (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) |
253 | == (PCI_COMMAND_IO|PCI_COMMAND_MEMORY)) { |
254 | vga_wseq(NULL, CL_SEQR6, val: 0x12); /* unlock all extension registers */ |
255 | vga_wseq(NULL, CL_SEQRF, val: 0x18); |
256 | } |
257 | } |
258 | |
259 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5434_8, |
260 | quirk_cirrus_ram_size); |
261 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5436, |
262 | quirk_cirrus_ram_size); |
263 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, |
264 | quirk_cirrus_ram_size); |
265 | #endif |
266 | |