]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * ip22-setup.c: SGI specific setup, including init of the feature struct. | |
3 | * | |
4 | * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com) | |
5 | * Copyright (C) 1997, 1998 Ralf Baechle (ralf@gnu.org) | |
6 | */ | |
7 | #include <linux/config.h> | |
8 | #include <linux/ds1286.h> | |
9 | #include <linux/init.h> | |
10 | #include <linux/kernel.h> | |
11 | #include <linux/kdev_t.h> | |
12 | #include <linux/types.h> | |
13 | #include <linux/module.h> | |
14 | #include <linux/console.h> | |
15 | #include <linux/sched.h> | |
16 | #include <linux/tty.h> | |
17 | ||
18 | #include <asm/addrspace.h> | |
19 | #include <asm/bcache.h> | |
20 | #include <asm/bootinfo.h> | |
21 | #include <asm/irq.h> | |
22 | #include <asm/reboot.h> | |
23 | #include <asm/time.h> | |
24 | #include <asm/gdb-stub.h> | |
25 | #include <asm/io.h> | |
26 | #include <asm/traps.h> | |
27 | #include <asm/sgialib.h> | |
28 | #include <asm/sgi/mc.h> | |
29 | #include <asm/sgi/hpc3.h> | |
30 | #include <asm/sgi/ip22.h> | |
31 | ||
32 | unsigned long sgi_gfxaddr; | |
33 | ||
34 | /* | |
35 | * Stop-A is originally a Sun thing that isn't standard on IP22 so to avoid | |
36 | * accidents it's disabled by default on IP22. | |
37 | * | |
38 | * FIXME: provide a mechanism to change the value of stop_a_enabled. | |
39 | */ | |
40 | int stop_a_enabled; | |
41 | ||
42 | void ip22_do_break(void) | |
43 | { | |
44 | if (!stop_a_enabled) | |
45 | return; | |
46 | ||
47 | printk("\n"); | |
48 | ArcEnterInteractiveMode(); | |
49 | } | |
50 | ||
51 | EXPORT_SYMBOL(ip22_do_break); | |
52 | ||
53 | extern void ip22_be_init(void) __init; | |
54 | extern void ip22_time_init(void) __init; | |
55 | ||
c83cfc9c | 56 | void __init plat_setup(void) |
1da177e4 LT |
57 | { |
58 | char *ctype; | |
59 | ||
60 | board_be_init = ip22_be_init; | |
61 | ip22_time_init(); | |
62 | ||
63 | /* Init the INDY HPC I/O controller. Need to call this before | |
64 | * fucking with the memory controller because it needs to know the | |
65 | * boardID and whether this is a Guiness or a FullHouse machine. | |
66 | */ | |
67 | sgihpc_init(); | |
68 | ||
69 | /* Init INDY memory controller. */ | |
70 | sgimc_init(); | |
71 | ||
72 | #ifdef CONFIG_BOARD_SCACHE | |
73 | /* Now enable boardcaches, if any. */ | |
74 | indy_sc_init(); | |
75 | #endif | |
76 | ||
77 | /* Set EISA IO port base for Indigo2 | |
78 | * ioremap cannot fail */ | |
79 | set_io_port_base((unsigned long)ioremap(0x00080000, | |
80 | 0x1fffffff - 0x00080000)); | |
81 | /* ARCS console environment variable is set to "g?" for | |
82 | * graphics console, it is set to "d" for the first serial | |
83 | * line and "d2" for the second serial line. | |
84 | */ | |
85 | ctype = ArcGetEnvironmentVariable("console"); | |
86 | if (ctype && *ctype == 'd') { | |
87 | static char options[8]; | |
88 | char *baud = ArcGetEnvironmentVariable("dbaud"); | |
89 | if (baud) | |
90 | strcpy(options, baud); | |
91 | add_preferred_console("ttyS", *(ctype + 1) == '2' ? 1 : 0, | |
92 | baud ? options : NULL); | |
93 | } else if (!ctype || *ctype != 'g') { | |
94 | /* Use ARC if we don't want serial ('d') or Newport ('g'). */ | |
95 | prom_flags |= PROM_FLAG_USE_AS_CONSOLE; | |
96 | add_preferred_console("arc", 0, NULL); | |
97 | } | |
98 | ||
99 | #ifdef CONFIG_KGDB | |
100 | { | |
101 | char *kgdb_ttyd = prom_getcmdline(); | |
102 | ||
103 | if ((kgdb_ttyd = strstr(kgdb_ttyd, "kgdb=ttyd")) != NULL) { | |
104 | int line; | |
105 | kgdb_ttyd += strlen("kgdb=ttyd"); | |
106 | if (*kgdb_ttyd != '1' && *kgdb_ttyd != '2') | |
107 | printk(KERN_INFO "KGDB: Uknown serial line /dev/ttyd%c" | |
108 | ", falling back to /dev/ttyd1\n", *kgdb_ttyd); | |
109 | line = *kgdb_ttyd == '2' ? 0 : 1; | |
110 | printk(KERN_INFO "KGDB: Using serial line /dev/ttyd%d for " | |
111 | "session\n", line ? 1 : 2); | |
112 | rs_kgdb_hook(line); | |
113 | ||
114 | printk(KERN_INFO "KGDB: Using serial line /dev/ttyd%d for " | |
115 | "session, please connect your debugger\n", line ? 1:2); | |
116 | ||
117 | kgdb_enabled = 1; | |
118 | /* Breakpoints and stuff are in sgi_irq_setup() */ | |
119 | } | |
120 | } | |
121 | #endif | |
122 | ||
123 | #if defined(CONFIG_VT) && defined(CONFIG_SGI_NEWPORT_CONSOLE) | |
124 | { | |
125 | ULONG *gfxinfo; | |
126 | ULONG * (*__vec)(void) = (void *) (long) | |
127 | *((_PULONG *)(long)((PROMBLOCK)->pvector + 0x20)); | |
128 | ||
129 | gfxinfo = __vec(); | |
130 | sgi_gfxaddr = ((gfxinfo[1] >= 0xa0000000 | |
131 | && gfxinfo[1] <= 0xc0000000) | |
132 | ? gfxinfo[1] - 0xa0000000 : 0); | |
133 | ||
134 | /* newport addresses? */ | |
135 | if (sgi_gfxaddr == 0x1f0f0000 || sgi_gfxaddr == 0x1f4f0000) { | |
136 | conswitchp = &newport_con; | |
137 | } | |
138 | } | |
139 | #endif | |
1da177e4 | 140 | } |