Import 2.3.52pre1
[davej-history.git] / arch / arm / kernel / arch.c
blob615ed568b87f96747050f1cd580be23586c085dc
1 /*
2 * linux/arch/arm/kernel/arch.c
4 * Architecture specifics
5 */
6 #include <linux/tty.h>
7 #include <linux/init.h>
9 #include <asm/elf.h>
10 #include <asm/setup.h>
11 #include <asm/system.h>
13 #include "arch.h"
15 extern unsigned int system_rev;
16 extern unsigned int system_serial_low;
17 extern unsigned int system_serial_high;
19 unsigned int vram_size;
20 #ifdef CONFIG_ARCH_ACORN
21 unsigned int memc_ctrl_reg;
22 unsigned int number_mfm_drives;
23 #endif
26 * Architecture specific fixups. This is where any
27 * parameters in the params struct are fixed up, or
28 * any additional architecture specific information
29 * is pulled from the params struct.
31 static void __init
32 fixup_acorn(struct machine_desc *desc, struct param_struct *params,
33 char **cmdline, struct meminfo *mi)
35 #ifdef CONFIG_ARCH_ACORN
36 int i;
38 if (machine_is_riscpc()) {
40 * RiscPC can't handle half-word loads and stores
42 elf_hwcap &= ~HWCAP_HALF;
44 switch (params->u1.s.pages_in_vram) {
45 case 512:
46 vram_size += PAGE_SIZE * 256;
47 case 256:
48 vram_size += PAGE_SIZE * 256;
49 default:
50 break;
53 if (vram_size) {
54 desc->video_start = 0x02000000;
55 desc->video_end = 0x02000000 + vram_size;
58 for (i = 0; i < 4; i++) {
59 mi->bank[i].start = PHYS_OFFSET + (i << 26);
60 mi->bank[i].size =
61 params->u1.s.pages_in_bank[i] *
62 params->u1.s.page_size;
64 mi->nr_banks = 4;
66 memc_ctrl_reg = params->u1.s.memc_control_reg;
67 number_mfm_drives = (params->u1.s.adfsdrives >> 3) & 3;
68 #endif
71 static void __init
72 fixup_ebsa285(struct machine_desc *desc, struct param_struct *params,
73 char **cmdline, struct meminfo *mi)
75 ORIG_X = params->u1.s.video_x;
76 ORIG_Y = params->u1.s.video_y;
77 ORIG_VIDEO_COLS = params->u1.s.video_num_cols;
78 ORIG_VIDEO_LINES = params->u1.s.video_num_rows;
82 * Older NeTTroms either do not provide a parameters
83 * page, or they don't supply correct information in
84 * the parameter page.
86 static void __init
87 fixup_netwinder(struct machine_desc *desc, struct param_struct *params,
88 char **cmdline, struct meminfo *mi)
90 if (params->u1.s.nr_pages != 0x2000 &&
91 params->u1.s.nr_pages != 0x4000) {
92 printk(KERN_WARNING "Warning: bad NeTTrom parameters "
93 "detected, using defaults\n");
95 params->u1.s.nr_pages = 0x2000; /* 32MB */
96 params->u1.s.ramdisk_size = 0;
97 params->u1.s.flags = FLAG_READONLY;
98 params->u1.s.initrd_start = 0;
99 params->u1.s.initrd_size = 0;
100 params->u1.s.rd_start = 0;
105 * CATS uses soft-reboot by default, since
106 * hard reboots fail on early boards.
108 static void __init
109 fixup_cats(struct machine_desc *desc, struct param_struct *params,
110 char **cmdline, struct meminfo *mi)
112 ORIG_VIDEO_LINES = 25;
113 ORIG_VIDEO_POINTS = 16;
114 ORIG_Y = 24;
117 static void __init
118 fixup_coebsa285(struct machine_desc *desc, struct param_struct *params,
119 char **cmdline, struct meminfo *mi)
121 #if 0
122 extern unsigned long boot_memory_end;
123 extern char boot_command_line[];
125 mi->nr_banks = 1;
126 mi->bank[0].start = PHYS_OFFSET;
127 mi->bank[0].size = boot_memory_end;
129 *cmdline = boot_command_line;
130 #endif
133 static void __init
134 fixup_sa1100(struct machine_desc *desc, struct param_struct *params,
135 char **cmdline, struct meminfo *mi)
137 #ifdef CONFIG_ARCH_SA1100
138 int i;
139 extern struct mem_desc {
140 unsigned long phys_start;
141 unsigned long length;
142 } mem_desc[];
143 extern unsigned int mem_desc_size;
145 for( i = 0; i < mem_desc_size; i++ ) {
146 if( i >= NR_BANKS ) {
147 printk( __FUNCTION__
148 ": mem_desc too large for meminfo structure\n");
149 break;
151 mi->bank[i].start = mem_desc[i].phys_start;
152 mi->bank[i].size = mem_desc[i].length;
154 mi->nr_banks = i;
156 #if defined(CONFIG_SA1100_BRUTUS)
157 ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
158 setup_ramdisk( 1, 0, 0, 8192 );
159 setup_initrd( __phys_to_virt(0xd8000000), 0x00400000 );
160 #elif defined(CONFIG_SA1100_EMPEG)
161 ROOT_DEV = MKDEV( 3, 1 ); /* /dev/hda1 */
162 setup_ramdisk( 1, 0, 0, 4096 );
163 setup_initrd( 0xd0000000+((1024-320)*1024), (320*1024) );
164 #elif defined(CONFIG_SA1100_TIFON)
165 ROOT_DEV = MKDEV(UNNAMED_MAJOR, 0);
166 setup_ramdisk(1, 0, 0, 4096);
167 setup_initrd( 0xd0000000 + 0x1100004, 0x140000 );
168 #elif defined(CONFIG_SA1100_VICTOR)
169 ROOT_DEV = MKDEV( 60, 2 );
171 /* Get command line parameters passed from the loader (if any) */
172 if( *((char*)0xc0000000) )
173 strcpy( default_command_line, ((char *)0xc0000000) );
175 /* power off if any problem */
176 strcat( default_command_line, " panic=1" );
177 #elif defined(CONFIG_SA1100_LART)
178 ROOT_DEV = MKDEV(RAMDISK_MAJOR,0);
179 setup_ramdisk(1, 0, 0, 8192);
180 setup_initrd(0xc0400000, 0x00400000);
181 #endif
182 #endif
185 #define NO_PARAMS 0
186 #define NO_VIDEO 0, 0
189 * This is the list of all architectures supported by
190 * this kernel. This should be integrated with the list
191 * in head-armv.S.
193 static struct machine_desc machine_desc[] __attribute__ ((__section__ (".arch.info"))) = {
195 MACH_TYPE_EBSA110,
196 "EBSA110", /* RMK */
197 0x00000400,
198 NO_VIDEO,
199 1, 0, 1, 1, 1,
200 NULL
201 }, {
202 MACH_TYPE_RISCPC,
203 "Acorn-RiscPC", /* RMK */
204 0x10000100,
205 NO_VIDEO,
206 1, 1, 0, 0, 0,
207 fixup_acorn
208 }, {
210 "unknown",
211 NO_PARAMS,
212 NO_VIDEO,
213 0, 0, 0, 0, 0,
214 NULL
215 }, {
216 MACH_TYPE_NEXUSPCI,
217 "FTV/PCI", /* Philip Blundell */
218 NO_PARAMS,
219 NO_VIDEO,
220 0, 0, 0, 0, 0,
221 NULL
222 }, {
223 MACH_TYPE_EBSA285,
224 "EBSA285", /* RMK */
225 0x00000100,
226 0x000a0000, 0x000bffff,
227 0, 0, 0, 0, 0,
228 fixup_ebsa285
229 }, {
230 MACH_TYPE_NETWINDER,
231 "Rebel-NetWinder", /* RMK */
232 0x00000100,
233 0x000a0000, 0x000bffff,
234 1, 0, 1, 0, 0,
235 fixup_netwinder
236 }, {
237 MACH_TYPE_CATS,
238 "Chalice-CATS", /* Philip Blundell */
239 NO_PARAMS,
240 0x000a0000, 0x000bffff,
241 0, 0, 0, 0, 1,
242 fixup_cats
243 }, {
244 MACH_TYPE_TBOX,
245 "unknown-TBOX", /* Philip Blundell */
246 NO_PARAMS,
247 NO_VIDEO,
248 0, 0, 0, 0, 0,
249 NULL
250 }, {
251 MACH_TYPE_CO285,
252 "co-EBSA285", /* Mark van Doesburg */
253 NO_PARAMS,
254 NO_VIDEO,
255 0, 0, 0, 0, 0,
256 fixup_coebsa285
257 }, {
258 MACH_TYPE_CLPS7110,
259 "CL-PS7110", /* Werner Almesberger */
260 NO_PARAMS,
261 NO_VIDEO,
262 0, 0, 0, 0, 0,
263 NULL
264 }, {
265 MACH_TYPE_ARCHIMEDES,
266 "Acorn-Archimedes",/* RMK/DAG */
267 0x0207c000,
268 NO_VIDEO,
269 0, 0, 0, 0, 0,
270 fixup_acorn
271 }, {
272 MACH_TYPE_A5K,
273 "Acorn-A5000", /* RMK/PB */
274 0x0207c000,
275 NO_VIDEO,
276 0, 0, 0, 0, 0,
277 fixup_acorn
278 }, {
279 MACH_TYPE_ETOILE,
280 "Etoile", /* Alex de Vries */
281 NO_PARAMS,
282 NO_VIDEO,
283 0, 0, 0, 0, 0,
284 NULL
285 }, {
286 MACH_TYPE_LACIE_NAS,
287 "LaCie_NAS", /* Benjamin Herrenschmidt */
288 NO_PARAMS,
289 NO_VIDEO,
290 0, 0, 0, 0, 0,
291 NULL
292 }, {
293 MACH_TYPE_CLPS7500,
294 "CL-PS7500", /* Philip Blundell */
295 NO_PARAMS,
296 NO_VIDEO,
297 0, 0, 0, 0, 0,
298 NULL
299 }, {
300 MACH_TYPE_SHARK,
301 "Shark", /* Alexander Schulz */
302 NO_PARAMS,
303 0x06000000, 0x06000000+0x001fffff,
304 0, 0, 0, 0, 0,
305 NULL
306 }, {
307 MACH_TYPE_SA1100,
308 "SA1100-based", /* Nicolas Pitre */
309 NO_PARAMS,
310 NO_VIDEO,
311 0, 0, 0, 0, 0,
312 fixup_sa1100
313 }, {
314 MACH_TYPE_PERSONAL_SERVER,
315 "Compaq Personal Server",
316 NO_PARAMS,
317 NO_VIDEO,
318 0, 0, 0, 0, 0,
319 NULL