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