xref: /linux/arch/arm/kernel/setup.c (revision 4f1933620f57145212cdbb1ac6ce099eeeb21c5a)
1 /*
2  *  linux/arch/arm/kernel/setup.c
3  *
4  *  Copyright (C) 1995-2001 Russell King
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  */
10 #include <linux/config.h>
11 #include <linux/module.h>
12 #include <linux/kernel.h>
13 #include <linux/stddef.h>
14 #include <linux/ioport.h>
15 #include <linux/delay.h>
16 #include <linux/utsname.h>
17 #include <linux/initrd.h>
18 #include <linux/console.h>
19 #include <linux/bootmem.h>
20 #include <linux/seq_file.h>
21 #include <linux/tty.h>
22 #include <linux/init.h>
23 #include <linux/root_dev.h>
24 #include <linux/cpu.h>
25 #include <linux/interrupt.h>
26 #include <linux/smp.h>
27 
28 #include <asm/cpu.h>
29 #include <asm/elf.h>
30 #include <asm/procinfo.h>
31 #include <asm/setup.h>
32 #include <asm/mach-types.h>
33 #include <asm/cacheflush.h>
34 #include <asm/tlbflush.h>
35 
36 #include <asm/mach/arch.h>
37 #include <asm/mach/irq.h>
38 #include <asm/mach/time.h>
39 
40 #ifndef MEM_SIZE
41 #define MEM_SIZE	(16*1024*1024)
42 #endif
43 
44 #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
45 char fpe_type[8];
46 
47 static int __init fpe_setup(char *line)
48 {
49 	memcpy(fpe_type, line, 8);
50 	return 1;
51 }
52 
53 __setup("fpe=", fpe_setup);
54 #endif
55 
56 extern unsigned int mem_fclk_21285;
57 extern void paging_init(struct meminfo *, struct machine_desc *desc);
58 extern void convert_to_tag_list(struct tag *tags);
59 extern void squash_mem_tags(struct tag *tag);
60 extern void reboot_setup(char *str);
61 extern int root_mountflags;
62 extern void _stext, _text, _etext, __data_start, _edata, _end;
63 
64 unsigned int processor_id;
65 unsigned int __machine_arch_type;
66 EXPORT_SYMBOL(__machine_arch_type);
67 
68 unsigned int system_rev;
69 EXPORT_SYMBOL(system_rev);
70 
71 unsigned int system_serial_low;
72 EXPORT_SYMBOL(system_serial_low);
73 
74 unsigned int system_serial_high;
75 EXPORT_SYMBOL(system_serial_high);
76 
77 unsigned int elf_hwcap;
78 EXPORT_SYMBOL(elf_hwcap);
79 
80 
81 #ifdef MULTI_CPU
82 struct processor processor;
83 #endif
84 #ifdef MULTI_TLB
85 struct cpu_tlb_fns cpu_tlb;
86 #endif
87 #ifdef MULTI_USER
88 struct cpu_user_fns cpu_user;
89 #endif
90 #ifdef MULTI_CACHE
91 struct cpu_cache_fns cpu_cache;
92 #endif
93 
94 struct stack {
95 	u32 irq[3];
96 	u32 abt[3];
97 	u32 und[3];
98 } ____cacheline_aligned;
99 
100 static struct stack stacks[NR_CPUS];
101 
102 char elf_platform[ELF_PLATFORM_SIZE];
103 EXPORT_SYMBOL(elf_platform);
104 
105 unsigned long phys_initrd_start __initdata = 0;
106 unsigned long phys_initrd_size __initdata = 0;
107 
108 static struct meminfo meminfo __initdata = { 0, };
109 static const char *cpu_name;
110 static const char *machine_name;
111 static char command_line[COMMAND_LINE_SIZE];
112 
113 static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
114 static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
115 #define ENDIANNESS ((char)endian_test.l)
116 
117 DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data);
118 
119 /*
120  * Standard memory resources
121  */
122 static struct resource mem_res[] = {
123 	{ "Video RAM",   0,     0,     IORESOURCE_MEM			},
124 	{ "Kernel text", 0,     0,     IORESOURCE_MEM			},
125 	{ "Kernel data", 0,     0,     IORESOURCE_MEM			}
126 };
127 
128 #define video_ram   mem_res[0]
129 #define kernel_code mem_res[1]
130 #define kernel_data mem_res[2]
131 
132 static struct resource io_res[] = {
133 	{ "reserved",    0x3bc, 0x3be, IORESOURCE_IO | IORESOURCE_BUSY },
134 	{ "reserved",    0x378, 0x37f, IORESOURCE_IO | IORESOURCE_BUSY },
135 	{ "reserved",    0x278, 0x27f, IORESOURCE_IO | IORESOURCE_BUSY }
136 };
137 
138 #define lp0 io_res[0]
139 #define lp1 io_res[1]
140 #define lp2 io_res[2]
141 
142 static const char *cache_types[16] = {
143 	"write-through",
144 	"write-back",
145 	"write-back",
146 	"undefined 3",
147 	"undefined 4",
148 	"undefined 5",
149 	"write-back",
150 	"write-back",
151 	"undefined 8",
152 	"undefined 9",
153 	"undefined 10",
154 	"undefined 11",
155 	"undefined 12",
156 	"undefined 13",
157 	"write-back",
158 	"undefined 15",
159 };
160 
161 static const char *cache_clean[16] = {
162 	"not required",
163 	"read-block",
164 	"cp15 c7 ops",
165 	"undefined 3",
166 	"undefined 4",
167 	"undefined 5",
168 	"cp15 c7 ops",
169 	"cp15 c7 ops",
170 	"undefined 8",
171 	"undefined 9",
172 	"undefined 10",
173 	"undefined 11",
174 	"undefined 12",
175 	"undefined 13",
176 	"cp15 c7 ops",
177 	"undefined 15",
178 };
179 
180 static const char *cache_lockdown[16] = {
181 	"not supported",
182 	"not supported",
183 	"not supported",
184 	"undefined 3",
185 	"undefined 4",
186 	"undefined 5",
187 	"format A",
188 	"format B",
189 	"undefined 8",
190 	"undefined 9",
191 	"undefined 10",
192 	"undefined 11",
193 	"undefined 12",
194 	"undefined 13",
195 	"format C",
196 	"undefined 15",
197 };
198 
199 static const char *proc_arch[] = {
200 	"undefined/unknown",
201 	"3",
202 	"4",
203 	"4T",
204 	"5",
205 	"5T",
206 	"5TE",
207 	"5TEJ",
208 	"6TEJ",
209 	"7",
210 	"?(11)",
211 	"?(12)",
212 	"?(13)",
213 	"?(14)",
214 	"?(15)",
215 	"?(16)",
216 	"?(17)",
217 };
218 
219 #define CACHE_TYPE(x)	(((x) >> 25) & 15)
220 #define CACHE_S(x)	((x) & (1 << 24))
221 #define CACHE_DSIZE(x)	(((x) >> 12) & 4095)	/* only if S=1 */
222 #define CACHE_ISIZE(x)	((x) & 4095)
223 
224 #define CACHE_SIZE(y)	(((y) >> 6) & 7)
225 #define CACHE_ASSOC(y)	(((y) >> 3) & 7)
226 #define CACHE_M(y)	((y) & (1 << 2))
227 #define CACHE_LINE(y)	((y) & 3)
228 
229 static inline void dump_cache(const char *prefix, int cpu, unsigned int cache)
230 {
231 	unsigned int mult = 2 + (CACHE_M(cache) ? 1 : 0);
232 
233 	printk("CPU%u: %s: %d bytes, associativity %d, %d byte lines, %d sets\n",
234 		cpu, prefix,
235 		mult << (8 + CACHE_SIZE(cache)),
236 		(mult << CACHE_ASSOC(cache)) >> 1,
237 		8 << CACHE_LINE(cache),
238 		1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) -
239 			CACHE_LINE(cache)));
240 }
241 
242 static void __init dump_cpu_info(int cpu)
243 {
244 	unsigned int info = read_cpuid(CPUID_CACHETYPE);
245 
246 	if (info != processor_id) {
247 		printk("CPU%u: D %s %s cache\n", cpu, cache_is_vivt() ? "VIVT" : "VIPT",
248 		       cache_types[CACHE_TYPE(info)]);
249 		if (CACHE_S(info)) {
250 			dump_cache("I cache", cpu, CACHE_ISIZE(info));
251 			dump_cache("D cache", cpu, CACHE_DSIZE(info));
252 		} else {
253 			dump_cache("cache", cpu, CACHE_ISIZE(info));
254 		}
255 	}
256 }
257 
258 int cpu_architecture(void)
259 {
260 	int cpu_arch;
261 
262 	if ((processor_id & 0x0008f000) == 0) {
263 		cpu_arch = CPU_ARCH_UNKNOWN;
264 	} else if ((processor_id & 0x0008f000) == 0x00007000) {
265 		cpu_arch = (processor_id & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
266 	} else if ((processor_id & 0x00080000) == 0x00000000) {
267 		cpu_arch = (processor_id >> 16) & 7;
268 		if (cpu_arch)
269 			cpu_arch += CPU_ARCH_ARMv3;
270 	} else {
271 		/* the revised CPUID */
272 		cpu_arch = ((processor_id >> 12) & 0xf) - 0xb + CPU_ARCH_ARMv6;
273 	}
274 
275 	return cpu_arch;
276 }
277 
278 /*
279  * These functions re-use the assembly code in head.S, which
280  * already provide the required functionality.
281  */
282 extern struct proc_info_list *lookup_processor_type(void);
283 extern struct machine_desc *lookup_machine_type(unsigned int);
284 
285 static void __init setup_processor(void)
286 {
287 	struct proc_info_list *list;
288 
289 	/*
290 	 * locate processor in the list of supported processor
291 	 * types.  The linker builds this table for us from the
292 	 * entries in arch/arm/mm/proc-*.S
293 	 */
294 	list = lookup_processor_type();
295 	if (!list) {
296 		printk("CPU configuration botched (ID %08x), unable "
297 		       "to continue.\n", processor_id);
298 		while (1);
299 	}
300 
301 	cpu_name = list->cpu_name;
302 
303 #ifdef MULTI_CPU
304 	processor = *list->proc;
305 #endif
306 #ifdef MULTI_TLB
307 	cpu_tlb = *list->tlb;
308 #endif
309 #ifdef MULTI_USER
310 	cpu_user = *list->user;
311 #endif
312 #ifdef MULTI_CACHE
313 	cpu_cache = *list->cache;
314 #endif
315 
316 	printk("CPU: %s [%08x] revision %d (ARMv%s)\n",
317 	       cpu_name, processor_id, (int)processor_id & 15,
318 	       proc_arch[cpu_architecture()]);
319 
320 	sprintf(system_utsname.machine, "%s%c", list->arch_name, ENDIANNESS);
321 	sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
322 	elf_hwcap = list->elf_hwcap;
323 
324 	cpu_proc_init();
325 }
326 
327 /*
328  * cpu_init - initialise one CPU.
329  *
330  * cpu_init dumps the cache information, initialises SMP specific
331  * information, and sets up the per-CPU stacks.
332  */
333 void cpu_init(void)
334 {
335 	unsigned int cpu = smp_processor_id();
336 	struct stack *stk = &stacks[cpu];
337 
338 	if (cpu >= NR_CPUS) {
339 		printk(KERN_CRIT "CPU%u: bad primary CPU number\n", cpu);
340 		BUG();
341 	}
342 
343 	if (system_state == SYSTEM_BOOTING)
344 		dump_cpu_info(cpu);
345 
346 	/*
347 	 * setup stacks for re-entrant exception handlers
348 	 */
349 	__asm__ (
350 	"msr	cpsr_c, %1\n\t"
351 	"add	sp, %0, %2\n\t"
352 	"msr	cpsr_c, %3\n\t"
353 	"add	sp, %0, %4\n\t"
354 	"msr	cpsr_c, %5\n\t"
355 	"add	sp, %0, %6\n\t"
356 	"msr	cpsr_c, %7"
357 	    :
358 	    : "r" (stk),
359 	      "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
360 	      "I" (offsetof(struct stack, irq[0])),
361 	      "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
362 	      "I" (offsetof(struct stack, abt[0])),
363 	      "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
364 	      "I" (offsetof(struct stack, und[0])),
365 	      "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
366 	    : "r14");
367 }
368 
369 static struct machine_desc * __init setup_machine(unsigned int nr)
370 {
371 	struct machine_desc *list;
372 
373 	/*
374 	 * locate machine in the list of supported machines.
375 	 */
376 	list = lookup_machine_type(nr);
377 	if (!list) {
378 		printk("Machine configuration botched (nr %d), unable "
379 		       "to continue.\n", nr);
380 		while (1);
381 	}
382 
383 	printk("Machine: %s\n", list->name);
384 
385 	return list;
386 }
387 
388 static void __init early_initrd(char **p)
389 {
390 	unsigned long start, size;
391 
392 	start = memparse(*p, p);
393 	if (**p == ',') {
394 		size = memparse((*p) + 1, p);
395 
396 		phys_initrd_start = start;
397 		phys_initrd_size = size;
398 	}
399 }
400 __early_param("initrd=", early_initrd);
401 
402 static void __init add_memory(unsigned long start, unsigned long size)
403 {
404 	/*
405 	 * Ensure that start/size are aligned to a page boundary.
406 	 * Size is appropriately rounded down, start is rounded up.
407 	 */
408 	size -= start & ~PAGE_MASK;
409 
410 	meminfo.bank[meminfo.nr_banks].start = PAGE_ALIGN(start);
411 	meminfo.bank[meminfo.nr_banks].size  = size & PAGE_MASK;
412 	meminfo.bank[meminfo.nr_banks].node  = PHYS_TO_NID(start);
413 	meminfo.nr_banks += 1;
414 }
415 
416 /*
417  * Pick out the memory size.  We look for mem=size@start,
418  * where start and size are "size[KkMm]"
419  */
420 static void __init early_mem(char **p)
421 {
422 	static int usermem __initdata = 0;
423 	unsigned long size, start;
424 
425 	/*
426 	 * If the user specifies memory size, we
427 	 * blow away any automatically generated
428 	 * size.
429 	 */
430 	if (usermem == 0) {
431 		usermem = 1;
432 		meminfo.nr_banks = 0;
433 	}
434 
435 	start = PHYS_OFFSET;
436 	size  = memparse(*p, p);
437 	if (**p == '@')
438 		start = memparse(*p + 1, p);
439 
440 	add_memory(start, size);
441 }
442 __early_param("mem=", early_mem);
443 
444 /*
445  * Initial parsing of the command line.
446  */
447 static void __init parse_cmdline(char **cmdline_p, char *from)
448 {
449 	char c = ' ', *to = command_line;
450 	int len = 0;
451 
452 	for (;;) {
453 		if (c == ' ') {
454 			extern struct early_params __early_begin, __early_end;
455 			struct early_params *p;
456 
457 			for (p = &__early_begin; p < &__early_end; p++) {
458 				int len = strlen(p->arg);
459 
460 				if (memcmp(from, p->arg, len) == 0) {
461 					if (to != command_line)
462 						to -= 1;
463 					from += len;
464 					p->fn(&from);
465 
466 					while (*from != ' ' && *from != '\0')
467 						from++;
468 					break;
469 				}
470 			}
471 		}
472 		c = *from++;
473 		if (!c)
474 			break;
475 		if (COMMAND_LINE_SIZE <= ++len)
476 			break;
477 		*to++ = c;
478 	}
479 	*to = '\0';
480 	*cmdline_p = command_line;
481 }
482 
483 static void __init
484 setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)
485 {
486 #ifdef CONFIG_BLK_DEV_RAM
487 	extern int rd_size, rd_image_start, rd_prompt, rd_doload;
488 
489 	rd_image_start = image_start;
490 	rd_prompt = prompt;
491 	rd_doload = doload;
492 
493 	if (rd_sz)
494 		rd_size = rd_sz;
495 #endif
496 }
497 
498 static void __init
499 request_standard_resources(struct meminfo *mi, struct machine_desc *mdesc)
500 {
501 	struct resource *res;
502 	int i;
503 
504 	kernel_code.start   = virt_to_phys(&_text);
505 	kernel_code.end     = virt_to_phys(&_etext - 1);
506 	kernel_data.start   = virt_to_phys(&__data_start);
507 	kernel_data.end     = virt_to_phys(&_end - 1);
508 
509 	for (i = 0; i < mi->nr_banks; i++) {
510 		unsigned long virt_start, virt_end;
511 
512 		if (mi->bank[i].size == 0)
513 			continue;
514 
515 		virt_start = __phys_to_virt(mi->bank[i].start);
516 		virt_end   = virt_start + mi->bank[i].size - 1;
517 
518 		res = alloc_bootmem_low(sizeof(*res));
519 		res->name  = "System RAM";
520 		res->start = __virt_to_phys(virt_start);
521 		res->end   = __virt_to_phys(virt_end);
522 		res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
523 
524 		request_resource(&iomem_resource, res);
525 
526 		if (kernel_code.start >= res->start &&
527 		    kernel_code.end <= res->end)
528 			request_resource(res, &kernel_code);
529 		if (kernel_data.start >= res->start &&
530 		    kernel_data.end <= res->end)
531 			request_resource(res, &kernel_data);
532 	}
533 
534 	if (mdesc->video_start) {
535 		video_ram.start = mdesc->video_start;
536 		video_ram.end   = mdesc->video_end;
537 		request_resource(&iomem_resource, &video_ram);
538 	}
539 
540 	/*
541 	 * Some machines don't have the possibility of ever
542 	 * possessing lp0, lp1 or lp2
543 	 */
544 	if (mdesc->reserve_lp0)
545 		request_resource(&ioport_resource, &lp0);
546 	if (mdesc->reserve_lp1)
547 		request_resource(&ioport_resource, &lp1);
548 	if (mdesc->reserve_lp2)
549 		request_resource(&ioport_resource, &lp2);
550 }
551 
552 /*
553  *  Tag parsing.
554  *
555  * This is the new way of passing data to the kernel at boot time.  Rather
556  * than passing a fixed inflexible structure to the kernel, we pass a list
557  * of variable-sized tags to the kernel.  The first tag must be a ATAG_CORE
558  * tag for the list to be recognised (to distinguish the tagged list from
559  * a param_struct).  The list is terminated with a zero-length tag (this tag
560  * is not parsed in any way).
561  */
562 static int __init parse_tag_core(const struct tag *tag)
563 {
564 	if (tag->hdr.size > 2) {
565 		if ((tag->u.core.flags & 1) == 0)
566 			root_mountflags &= ~MS_RDONLY;
567 		ROOT_DEV = old_decode_dev(tag->u.core.rootdev);
568 	}
569 	return 0;
570 }
571 
572 __tagtable(ATAG_CORE, parse_tag_core);
573 
574 static int __init parse_tag_mem32(const struct tag *tag)
575 {
576 	if (meminfo.nr_banks >= NR_BANKS) {
577 		printk(KERN_WARNING
578 		       "Ignoring memory bank 0x%08x size %dKB\n",
579 			tag->u.mem.start, tag->u.mem.size / 1024);
580 		return -EINVAL;
581 	}
582 	add_memory(tag->u.mem.start, tag->u.mem.size);
583 	return 0;
584 }
585 
586 __tagtable(ATAG_MEM, parse_tag_mem32);
587 
588 #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
589 struct screen_info screen_info = {
590  .orig_video_lines	= 30,
591  .orig_video_cols	= 80,
592  .orig_video_mode	= 0,
593  .orig_video_ega_bx	= 0,
594  .orig_video_isVGA	= 1,
595  .orig_video_points	= 8
596 };
597 
598 static int __init parse_tag_videotext(const struct tag *tag)
599 {
600 	screen_info.orig_x            = tag->u.videotext.x;
601 	screen_info.orig_y            = tag->u.videotext.y;
602 	screen_info.orig_video_page   = tag->u.videotext.video_page;
603 	screen_info.orig_video_mode   = tag->u.videotext.video_mode;
604 	screen_info.orig_video_cols   = tag->u.videotext.video_cols;
605 	screen_info.orig_video_ega_bx = tag->u.videotext.video_ega_bx;
606 	screen_info.orig_video_lines  = tag->u.videotext.video_lines;
607 	screen_info.orig_video_isVGA  = tag->u.videotext.video_isvga;
608 	screen_info.orig_video_points = tag->u.videotext.video_points;
609 	return 0;
610 }
611 
612 __tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);
613 #endif
614 
615 static int __init parse_tag_ramdisk(const struct tag *tag)
616 {
617 	setup_ramdisk((tag->u.ramdisk.flags & 1) == 0,
618 		      (tag->u.ramdisk.flags & 2) == 0,
619 		      tag->u.ramdisk.start, tag->u.ramdisk.size);
620 	return 0;
621 }
622 
623 __tagtable(ATAG_RAMDISK, parse_tag_ramdisk);
624 
625 static int __init parse_tag_initrd(const struct tag *tag)
626 {
627 	printk(KERN_WARNING "ATAG_INITRD is deprecated; "
628 		"please update your bootloader.\n");
629 	phys_initrd_start = __virt_to_phys(tag->u.initrd.start);
630 	phys_initrd_size = tag->u.initrd.size;
631 	return 0;
632 }
633 
634 __tagtable(ATAG_INITRD, parse_tag_initrd);
635 
636 static int __init parse_tag_initrd2(const struct tag *tag)
637 {
638 	phys_initrd_start = tag->u.initrd.start;
639 	phys_initrd_size = tag->u.initrd.size;
640 	return 0;
641 }
642 
643 __tagtable(ATAG_INITRD2, parse_tag_initrd2);
644 
645 static int __init parse_tag_serialnr(const struct tag *tag)
646 {
647 	system_serial_low = tag->u.serialnr.low;
648 	system_serial_high = tag->u.serialnr.high;
649 	return 0;
650 }
651 
652 __tagtable(ATAG_SERIAL, parse_tag_serialnr);
653 
654 static int __init parse_tag_revision(const struct tag *tag)
655 {
656 	system_rev = tag->u.revision.rev;
657 	return 0;
658 }
659 
660 __tagtable(ATAG_REVISION, parse_tag_revision);
661 
662 static int __init parse_tag_cmdline(const struct tag *tag)
663 {
664 	strlcpy(default_command_line, tag->u.cmdline.cmdline, COMMAND_LINE_SIZE);
665 	return 0;
666 }
667 
668 __tagtable(ATAG_CMDLINE, parse_tag_cmdline);
669 
670 /*
671  * Scan the tag table for this tag, and call its parse function.
672  * The tag table is built by the linker from all the __tagtable
673  * declarations.
674  */
675 static int __init parse_tag(const struct tag *tag)
676 {
677 	extern struct tagtable __tagtable_begin, __tagtable_end;
678 	struct tagtable *t;
679 
680 	for (t = &__tagtable_begin; t < &__tagtable_end; t++)
681 		if (tag->hdr.tag == t->tag) {
682 			t->parse(tag);
683 			break;
684 		}
685 
686 	return t < &__tagtable_end;
687 }
688 
689 /*
690  * Parse all tags in the list, checking both the global and architecture
691  * specific tag tables.
692  */
693 static void __init parse_tags(const struct tag *t)
694 {
695 	for (; t->hdr.size; t = tag_next(t))
696 		if (!parse_tag(t))
697 			printk(KERN_WARNING
698 				"Ignoring unrecognised tag 0x%08x\n",
699 				t->hdr.tag);
700 }
701 
702 /*
703  * This holds our defaults.
704  */
705 static struct init_tags {
706 	struct tag_header hdr1;
707 	struct tag_core   core;
708 	struct tag_header hdr2;
709 	struct tag_mem32  mem;
710 	struct tag_header hdr3;
711 } init_tags __initdata = {
712 	{ tag_size(tag_core), ATAG_CORE },
713 	{ 1, PAGE_SIZE, 0xff },
714 	{ tag_size(tag_mem32), ATAG_MEM },
715 	{ MEM_SIZE, PHYS_OFFSET },
716 	{ 0, ATAG_NONE }
717 };
718 
719 static void (*init_machine)(void) __initdata;
720 
721 static int __init customize_machine(void)
722 {
723 	/* customizes platform devices, or adds new ones */
724 	if (init_machine)
725 		init_machine();
726 	return 0;
727 }
728 arch_initcall(customize_machine);
729 
730 void __init setup_arch(char **cmdline_p)
731 {
732 	struct tag *tags = (struct tag *)&init_tags;
733 	struct machine_desc *mdesc;
734 	char *from = default_command_line;
735 
736 	setup_processor();
737 	mdesc = setup_machine(machine_arch_type);
738 	machine_name = mdesc->name;
739 
740 	if (mdesc->soft_reboot)
741 		reboot_setup("s");
742 
743 	if (mdesc->boot_params)
744 		tags = phys_to_virt(mdesc->boot_params);
745 
746 	/*
747 	 * If we have the old style parameters, convert them to
748 	 * a tag list.
749 	 */
750 	if (tags->hdr.tag != ATAG_CORE)
751 		convert_to_tag_list(tags);
752 	if (tags->hdr.tag != ATAG_CORE)
753 		tags = (struct tag *)&init_tags;
754 
755 	if (mdesc->fixup)
756 		mdesc->fixup(mdesc, tags, &from, &meminfo);
757 
758 	if (tags->hdr.tag == ATAG_CORE) {
759 		if (meminfo.nr_banks != 0)
760 			squash_mem_tags(tags);
761 		parse_tags(tags);
762 	}
763 
764 	init_mm.start_code = (unsigned long) &_text;
765 	init_mm.end_code   = (unsigned long) &_etext;
766 	init_mm.end_data   = (unsigned long) &_edata;
767 	init_mm.brk	   = (unsigned long) &_end;
768 
769 	memcpy(saved_command_line, from, COMMAND_LINE_SIZE);
770 	saved_command_line[COMMAND_LINE_SIZE-1] = '\0';
771 	parse_cmdline(cmdline_p, from);
772 	paging_init(&meminfo, mdesc);
773 	request_standard_resources(&meminfo, mdesc);
774 
775 #ifdef CONFIG_SMP
776 	smp_init_cpus();
777 #endif
778 
779 	cpu_init();
780 
781 	/*
782 	 * Set up various architecture-specific pointers
783 	 */
784 	init_arch_irq = mdesc->init_irq;
785 	system_timer = mdesc->timer;
786 	init_machine = mdesc->init_machine;
787 
788 #ifdef CONFIG_VT
789 #if defined(CONFIG_VGA_CONSOLE)
790 	conswitchp = &vga_con;
791 #elif defined(CONFIG_DUMMY_CONSOLE)
792 	conswitchp = &dummy_con;
793 #endif
794 #endif
795 }
796 
797 
798 static int __init topology_init(void)
799 {
800 	int cpu;
801 
802 	for_each_cpu(cpu)
803 		register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu, NULL);
804 
805 	return 0;
806 }
807 
808 subsys_initcall(topology_init);
809 
810 static const char *hwcap_str[] = {
811 	"swp",
812 	"half",
813 	"thumb",
814 	"26bit",
815 	"fastmult",
816 	"fpa",
817 	"vfp",
818 	"edsp",
819 	"java",
820 	NULL
821 };
822 
823 static void
824 c_show_cache(struct seq_file *m, const char *type, unsigned int cache)
825 {
826 	unsigned int mult = 2 + (CACHE_M(cache) ? 1 : 0);
827 
828 	seq_printf(m, "%s size\t\t: %d\n"
829 		      "%s assoc\t\t: %d\n"
830 		      "%s line length\t: %d\n"
831 		      "%s sets\t\t: %d\n",
832 		type, mult << (8 + CACHE_SIZE(cache)),
833 		type, (mult << CACHE_ASSOC(cache)) >> 1,
834 		type, 8 << CACHE_LINE(cache),
835 		type, 1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) -
836 			    CACHE_LINE(cache)));
837 }
838 
839 static int c_show(struct seq_file *m, void *v)
840 {
841 	int i;
842 
843 	seq_printf(m, "Processor\t: %s rev %d (%s)\n",
844 		   cpu_name, (int)processor_id & 15, elf_platform);
845 
846 #if defined(CONFIG_SMP)
847 	for_each_online_cpu(i) {
848 		/*
849 		 * glibc reads /proc/cpuinfo to determine the number of
850 		 * online processors, looking for lines beginning with
851 		 * "processor".  Give glibc what it expects.
852 		 */
853 		seq_printf(m, "processor\t: %d\n", i);
854 		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n",
855 			   per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
856 			   (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
857 	}
858 #else /* CONFIG_SMP */
859 	seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
860 		   loops_per_jiffy / (500000/HZ),
861 		   (loops_per_jiffy / (5000/HZ)) % 100);
862 #endif
863 
864 	/* dump out the processor features */
865 	seq_puts(m, "Features\t: ");
866 
867 	for (i = 0; hwcap_str[i]; i++)
868 		if (elf_hwcap & (1 << i))
869 			seq_printf(m, "%s ", hwcap_str[i]);
870 
871 	seq_printf(m, "\nCPU implementer\t: 0x%02x\n", processor_id >> 24);
872 	seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]);
873 
874 	if ((processor_id & 0x0008f000) == 0x00000000) {
875 		/* pre-ARM7 */
876 		seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4);
877 	} else {
878 		if ((processor_id & 0x0008f000) == 0x00007000) {
879 			/* ARM7 */
880 			seq_printf(m, "CPU variant\t: 0x%02x\n",
881 				   (processor_id >> 16) & 127);
882 		} else {
883 			/* post-ARM7 */
884 			seq_printf(m, "CPU variant\t: 0x%x\n",
885 				   (processor_id >> 20) & 15);
886 		}
887 		seq_printf(m, "CPU part\t: 0x%03x\n",
888 			   (processor_id >> 4) & 0xfff);
889 	}
890 	seq_printf(m, "CPU revision\t: %d\n", processor_id & 15);
891 
892 	{
893 		unsigned int cache_info = read_cpuid(CPUID_CACHETYPE);
894 		if (cache_info != processor_id) {
895 			seq_printf(m, "Cache type\t: %s\n"
896 				      "Cache clean\t: %s\n"
897 				      "Cache lockdown\t: %s\n"
898 				      "Cache format\t: %s\n",
899 				   cache_types[CACHE_TYPE(cache_info)],
900 				   cache_clean[CACHE_TYPE(cache_info)],
901 				   cache_lockdown[CACHE_TYPE(cache_info)],
902 				   CACHE_S(cache_info) ? "Harvard" : "Unified");
903 
904 			if (CACHE_S(cache_info)) {
905 				c_show_cache(m, "I", CACHE_ISIZE(cache_info));
906 				c_show_cache(m, "D", CACHE_DSIZE(cache_info));
907 			} else {
908 				c_show_cache(m, "Cache", CACHE_ISIZE(cache_info));
909 			}
910 		}
911 	}
912 
913 	seq_puts(m, "\n");
914 
915 	seq_printf(m, "Hardware\t: %s\n", machine_name);
916 	seq_printf(m, "Revision\t: %04x\n", system_rev);
917 	seq_printf(m, "Serial\t\t: %08x%08x\n",
918 		   system_serial_high, system_serial_low);
919 
920 	return 0;
921 }
922 
923 static void *c_start(struct seq_file *m, loff_t *pos)
924 {
925 	return *pos < 1 ? (void *)1 : NULL;
926 }
927 
928 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
929 {
930 	++*pos;
931 	return NULL;
932 }
933 
934 static void c_stop(struct seq_file *m, void *v)
935 {
936 }
937 
938 struct seq_operations cpuinfo_op = {
939 	.start	= c_start,
940 	.next	= c_next,
941 	.stop	= c_stop,
942 	.show	= c_show
943 };
944