]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - arch/arm/kernel/setup.c
ARM: 7291/1: cache: assume 64-byte L1 cachelines for ARMv7 CPUs
[mirror_ubuntu-artful-kernel.git] / arch / arm / kernel / setup.c
CommitLineData
1da177e4
LT
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 */
ecea4ab6 10#include <linux/export.h>
1da177e4
LT
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>
894673ee 20#include <linux/screen_info.h>
1da177e4 21#include <linux/init.h>
3c57fb43 22#include <linux/kexec.h>
93c02ab4 23#include <linux/of_fdt.h>
1da177e4
LT
24#include <linux/root_dev.h>
25#include <linux/cpu.h>
26#include <linux/interrupt.h>
7bbb7940 27#include <linux/smp.h>
4e950f6f 28#include <linux/fs.h>
e119bfff 29#include <linux/proc_fs.h>
2778f620 30#include <linux/memblock.h>
2ecccf90
DM
31#include <linux/bug.h>
32#include <linux/compiler.h>
27a3f0e9 33#include <linux/sort.h>
1da177e4 34
b86040a5 35#include <asm/unified.h>
1da177e4 36#include <asm/cpu.h>
0ba8b9b2 37#include <asm/cputype.h>
1da177e4 38#include <asm/elf.h>
1da177e4 39#include <asm/procinfo.h>
37efe642 40#include <asm/sections.h>
1da177e4 41#include <asm/setup.h>
f00ec48f 42#include <asm/smp_plat.h>
1da177e4
LT
43#include <asm/mach-types.h>
44#include <asm/cacheflush.h>
46097c7d 45#include <asm/cachetype.h>
1da177e4 46#include <asm/tlbflush.h>
2ecccf90 47#include <asm/system.h>
1da177e4 48
93c02ab4 49#include <asm/prom.h>
1da177e4
LT
50#include <asm/mach/arch.h>
51#include <asm/mach/irq.h>
52#include <asm/mach/time.h>
5cbad0eb 53#include <asm/traps.h>
bff595c1 54#include <asm/unwind.h>
1c16d242 55#include <asm/memblock.h>
1da177e4 56
73a65b3f 57#if defined(CONFIG_DEPRECATED_PARAM_STRUCT)
0fc1c832 58#include "compat.h"
73a65b3f 59#endif
4cd9d6f7 60#include "atags.h"
bc581770 61#include "tcm.h"
0fc1c832 62
1da177e4
LT
63#ifndef MEM_SIZE
64#define MEM_SIZE (16*1024*1024)
65#endif
66
67#if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
68char fpe_type[8];
69
70static int __init fpe_setup(char *line)
71{
72 memcpy(fpe_type, line, 8);
73 return 1;
74}
75
76__setup("fpe=", fpe_setup);
77#endif
78
4b5f32ce 79extern void paging_init(struct machine_desc *desc);
0371d3f7 80extern void sanity_check_meminfo(void);
1da177e4 81extern void reboot_setup(char *str);
1da177e4
LT
82
83unsigned int processor_id;
c18f6581 84EXPORT_SYMBOL(processor_id);
0385ebc0 85unsigned int __machine_arch_type __read_mostly;
1da177e4 86EXPORT_SYMBOL(__machine_arch_type);
0385ebc0 87unsigned int cacheid __read_mostly;
c0e95878 88EXPORT_SYMBOL(cacheid);
1da177e4 89
9d20fdd5
BG
90unsigned int __atags_pointer __initdata;
91
1da177e4
LT
92unsigned int system_rev;
93EXPORT_SYMBOL(system_rev);
94
95unsigned int system_serial_low;
96EXPORT_SYMBOL(system_serial_low);
97
98unsigned int system_serial_high;
99EXPORT_SYMBOL(system_serial_high);
100
0385ebc0 101unsigned int elf_hwcap __read_mostly;
1da177e4
LT
102EXPORT_SYMBOL(elf_hwcap);
103
104
105#ifdef MULTI_CPU
0385ebc0 106struct processor processor __read_mostly;
1da177e4
LT
107#endif
108#ifdef MULTI_TLB
0385ebc0 109struct cpu_tlb_fns cpu_tlb __read_mostly;
1da177e4
LT
110#endif
111#ifdef MULTI_USER
0385ebc0 112struct cpu_user_fns cpu_user __read_mostly;
1da177e4
LT
113#endif
114#ifdef MULTI_CACHE
0385ebc0 115struct cpu_cache_fns cpu_cache __read_mostly;
1da177e4 116#endif
953233dc 117#ifdef CONFIG_OUTER_CACHE
0385ebc0 118struct outer_cache_fns outer_cache __read_mostly;
6c09f09d 119EXPORT_SYMBOL(outer_cache);
953233dc 120#endif
1da177e4 121
2ecccf90
DM
122/*
123 * Cached cpu_architecture() result for use by assembler code.
124 * C code should use the cpu_architecture() function instead of accessing this
125 * variable directly.
126 */
127int __cpu_architecture __read_mostly = CPU_ARCH_UNKNOWN;
128
ccea7a19
RK
129struct stack {
130 u32 irq[3];
131 u32 abt[3];
132 u32 und[3];
133} ____cacheline_aligned;
134
135static struct stack stacks[NR_CPUS];
136
1da177e4
LT
137char elf_platform[ELF_PLATFORM_SIZE];
138EXPORT_SYMBOL(elf_platform);
139
1da177e4
LT
140static const char *cpu_name;
141static const char *machine_name;
48ab7e09 142static char __initdata cmd_line[COMMAND_LINE_SIZE];
8ff1443c 143struct machine_desc *machine_desc __initdata;
1da177e4
LT
144
145static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
146static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
147#define ENDIANNESS ((char)endian_test.l)
148
149DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data);
150
151/*
152 * Standard memory resources
153 */
154static struct resource mem_res[] = {
740e518e
GKH
155 {
156 .name = "Video RAM",
157 .start = 0,
158 .end = 0,
159 .flags = IORESOURCE_MEM
160 },
161 {
a36d8e5b 162 .name = "Kernel code",
740e518e
GKH
163 .start = 0,
164 .end = 0,
165 .flags = IORESOURCE_MEM
166 },
167 {
168 .name = "Kernel data",
169 .start = 0,
170 .end = 0,
171 .flags = IORESOURCE_MEM
172 }
1da177e4
LT
173};
174
175#define video_ram mem_res[0]
176#define kernel_code mem_res[1]
177#define kernel_data mem_res[2]
178
179static struct resource io_res[] = {
740e518e
GKH
180 {
181 .name = "reserved",
182 .start = 0x3bc,
183 .end = 0x3be,
184 .flags = IORESOURCE_IO | IORESOURCE_BUSY
185 },
186 {
187 .name = "reserved",
188 .start = 0x378,
189 .end = 0x37f,
190 .flags = IORESOURCE_IO | IORESOURCE_BUSY
191 },
192 {
193 .name = "reserved",
194 .start = 0x278,
195 .end = 0x27f,
196 .flags = IORESOURCE_IO | IORESOURCE_BUSY
197 }
1da177e4
LT
198};
199
200#define lp0 io_res[0]
201#define lp1 io_res[1]
202#define lp2 io_res[2]
203
1da177e4
LT
204static const char *proc_arch[] = {
205 "undefined/unknown",
206 "3",
207 "4",
208 "4T",
209 "5",
210 "5T",
211 "5TE",
212 "5TEJ",
213 "6TEJ",
6b090a25 214 "7",
1da177e4
LT
215 "?(11)",
216 "?(12)",
217 "?(13)",
218 "?(14)",
219 "?(15)",
220 "?(16)",
221 "?(17)",
222};
223
2ecccf90 224static int __get_cpu_architecture(void)
1da177e4
LT
225{
226 int cpu_arch;
227
0ba8b9b2 228 if ((read_cpuid_id() & 0x0008f000) == 0) {
1da177e4 229 cpu_arch = CPU_ARCH_UNKNOWN;
0ba8b9b2
RK
230 } else if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
231 cpu_arch = (read_cpuid_id() & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
232 } else if ((read_cpuid_id() & 0x00080000) == 0x00000000) {
233 cpu_arch = (read_cpuid_id() >> 16) & 7;
1da177e4
LT
234 if (cpu_arch)
235 cpu_arch += CPU_ARCH_ARMv3;
0ba8b9b2 236 } else if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) {
180005c4
CM
237 unsigned int mmfr0;
238
239 /* Revised CPUID format. Read the Memory Model Feature
240 * Register 0 and check for VMSAv7 or PMSAv7 */
241 asm("mrc p15, 0, %0, c0, c1, 4"
242 : "=r" (mmfr0));
315cfe78
CM
243 if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
244 (mmfr0 & 0x000000f0) >= 0x00000030)
180005c4
CM
245 cpu_arch = CPU_ARCH_ARMv7;
246 else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
247 (mmfr0 & 0x000000f0) == 0x00000020)
248 cpu_arch = CPU_ARCH_ARMv6;
249 else
250 cpu_arch = CPU_ARCH_UNKNOWN;
251 } else
252 cpu_arch = CPU_ARCH_UNKNOWN;
1da177e4
LT
253
254 return cpu_arch;
255}
256
2ecccf90
DM
257int __pure cpu_architecture(void)
258{
259 BUG_ON(__cpu_architecture == CPU_ARCH_UNKNOWN);
260
261 return __cpu_architecture;
262}
263
8925ec4c
WD
264static int cpu_has_aliasing_icache(unsigned int arch)
265{
266 int aliasing_icache;
267 unsigned int id_reg, num_sets, line_size;
268
7f94e9cc
WD
269 /* PIPT caches never alias. */
270 if (icache_is_pipt())
271 return 0;
272
8925ec4c
WD
273 /* arch specifies the register format */
274 switch (arch) {
275 case CPU_ARCH_ARMv7:
5fb31a96
LW
276 asm("mcr p15, 2, %0, c0, c0, 0 @ set CSSELR"
277 : /* No output operands */
8925ec4c 278 : "r" (1));
5fb31a96
LW
279 isb();
280 asm("mrc p15, 1, %0, c0, c0, 0 @ read CCSIDR"
281 : "=r" (id_reg));
8925ec4c
WD
282 line_size = 4 << ((id_reg & 0x7) + 2);
283 num_sets = ((id_reg >> 13) & 0x7fff) + 1;
284 aliasing_icache = (line_size * num_sets) > PAGE_SIZE;
285 break;
286 case CPU_ARCH_ARMv6:
287 aliasing_icache = read_cpuid_cachetype() & (1 << 11);
288 break;
289 default:
290 /* I-cache aliases will be handled by D-cache aliasing code */
291 aliasing_icache = 0;
292 }
293
294 return aliasing_icache;
295}
296
c0e95878
RK
297static void __init cacheid_init(void)
298{
299 unsigned int cachetype = read_cpuid_cachetype();
300 unsigned int arch = cpu_architecture();
301
b57ee99f
CM
302 if (arch >= CPU_ARCH_ARMv6) {
303 if ((cachetype & (7 << 29)) == 4 << 29) {
304 /* ARMv7 register format */
72dc53ac 305 arch = CPU_ARCH_ARMv7;
b57ee99f 306 cacheid = CACHEID_VIPT_NONALIASING;
7f94e9cc
WD
307 switch (cachetype & (3 << 14)) {
308 case (1 << 14):
b57ee99f 309 cacheid |= CACHEID_ASID_TAGGED;
7f94e9cc
WD
310 break;
311 case (3 << 14):
312 cacheid |= CACHEID_PIPT;
313 break;
314 }
8925ec4c 315 } else {
72dc53ac
WD
316 arch = CPU_ARCH_ARMv6;
317 if (cachetype & (1 << 23))
318 cacheid = CACHEID_VIPT_ALIASING;
319 else
320 cacheid = CACHEID_VIPT_NONALIASING;
8925ec4c 321 }
72dc53ac
WD
322 if (cpu_has_aliasing_icache(arch))
323 cacheid |= CACHEID_VIPT_I_ALIASING;
c0e95878
RK
324 } else {
325 cacheid = CACHEID_VIVT;
326 }
2b4ae1f1
RK
327
328 printk("CPU: %s data cache, %s instruction cache\n",
329 cache_is_vivt() ? "VIVT" :
330 cache_is_vipt_aliasing() ? "VIPT aliasing" :
7f94e9cc 331 cache_is_vipt_nonaliasing() ? "PIPT / VIPT nonaliasing" : "unknown",
2b4ae1f1
RK
332 cache_is_vivt() ? "VIVT" :
333 icache_is_vivt_asid_tagged() ? "VIVT ASID tagged" :
8925ec4c 334 icache_is_vipt_aliasing() ? "VIPT aliasing" :
7f94e9cc 335 icache_is_pipt() ? "PIPT" :
2b4ae1f1 336 cache_is_vipt_nonaliasing() ? "VIPT nonaliasing" : "unknown");
c0e95878
RK
337}
338
1da177e4
LT
339/*
340 * These functions re-use the assembly code in head.S, which
341 * already provide the required functionality.
342 */
0f44ba1d 343extern struct proc_info_list *lookup_processor_type(unsigned int);
6fc31d54 344
93c02ab4 345void __init early_print(const char *str, ...)
6fc31d54
RK
346{
347 extern void printascii(const char *);
348 char buf[256];
349 va_list ap;
350
351 va_start(ap, str);
352 vsnprintf(buf, sizeof(buf), str, ap);
353 va_end(ap);
354
355#ifdef CONFIG_DEBUG_LL
356 printascii(buf);
357#endif
358 printk("%s", buf);
359}
360
f159f4ed
TL
361static void __init feat_v6_fixup(void)
362{
363 int id = read_cpuid_id();
364
365 if ((id & 0xff0f0000) != 0x41070000)
366 return;
367
368 /*
369 * HWCAP_TLS is available only on 1136 r1p0 and later,
370 * see also kuser_get_tls_init.
371 */
372 if ((((id >> 4) & 0xfff) == 0xb36) && (((id >> 20) & 3) == 0))
373 elf_hwcap &= ~HWCAP_TLS;
374}
375
ccea7a19
RK
376/*
377 * cpu_init - initialise one CPU.
378 *
90f1e084 379 * cpu_init sets up the per-CPU stacks.
ccea7a19 380 */
36c5ed23 381void cpu_init(void)
ccea7a19
RK
382{
383 unsigned int cpu = smp_processor_id();
384 struct stack *stk = &stacks[cpu];
385
386 if (cpu >= NR_CPUS) {
387 printk(KERN_CRIT "CPU%u: bad primary CPU number\n", cpu);
388 BUG();
389 }
390
b69874e4
RK
391 cpu_proc_init();
392
b86040a5
CM
393 /*
394 * Define the placement constraint for the inline asm directive below.
395 * In Thumb-2, msr with an immediate value is not allowed.
396 */
397#ifdef CONFIG_THUMB2_KERNEL
398#define PLC "r"
399#else
400#define PLC "I"
401#endif
402
ccea7a19
RK
403 /*
404 * setup stacks for re-entrant exception handlers
405 */
406 __asm__ (
407 "msr cpsr_c, %1\n\t"
b86040a5
CM
408 "add r14, %0, %2\n\t"
409 "mov sp, r14\n\t"
ccea7a19 410 "msr cpsr_c, %3\n\t"
b86040a5
CM
411 "add r14, %0, %4\n\t"
412 "mov sp, r14\n\t"
ccea7a19 413 "msr cpsr_c, %5\n\t"
b86040a5
CM
414 "add r14, %0, %6\n\t"
415 "mov sp, r14\n\t"
ccea7a19
RK
416 "msr cpsr_c, %7"
417 :
418 : "r" (stk),
b86040a5 419 PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
ccea7a19 420 "I" (offsetof(struct stack, irq[0])),
b86040a5 421 PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
ccea7a19 422 "I" (offsetof(struct stack, abt[0])),
b86040a5 423 PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
ccea7a19 424 "I" (offsetof(struct stack, und[0])),
b86040a5 425 PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
aaaa3f9e 426 : "r14");
ccea7a19
RK
427}
428
b69874e4
RK
429static void __init setup_processor(void)
430{
431 struct proc_info_list *list;
432
433 /*
434 * locate processor in the list of supported processor
435 * types. The linker builds this table for us from the
436 * entries in arch/arm/mm/proc-*.S
437 */
438 list = lookup_processor_type(read_cpuid_id());
439 if (!list) {
440 printk("CPU configuration botched (ID %08x), unable "
441 "to continue.\n", read_cpuid_id());
442 while (1);
443 }
444
445 cpu_name = list->cpu_name;
2ecccf90 446 __cpu_architecture = __get_cpu_architecture();
b69874e4
RK
447
448#ifdef MULTI_CPU
449 processor = *list->proc;
450#endif
451#ifdef MULTI_TLB
452 cpu_tlb = *list->tlb;
453#endif
454#ifdef MULTI_USER
455 cpu_user = *list->user;
456#endif
457#ifdef MULTI_CACHE
458 cpu_cache = *list->cache;
459#endif
460
461 printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08lx\n",
462 cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
463 proc_arch[cpu_architecture()], cr_alignment);
464
a34dbfb0
WD
465 snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c",
466 list->arch_name, ENDIANNESS);
467 snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
468 list->elf_name, ENDIANNESS);
b69874e4
RK
469 elf_hwcap = list->elf_hwcap;
470#ifndef CONFIG_ARM_THUMB
471 elf_hwcap &= ~HWCAP_THUMB;
472#endif
473
474 feat_v6_fixup();
475
476 cacheid_init();
477 cpu_init();
478}
479
93c02ab4 480void __init dump_machine_table(void)
1da177e4 481{
dce72dd0 482 struct machine_desc *p;
1da177e4 483
6291319d
GL
484 early_print("Available machine support:\n\nID (hex)\tNAME\n");
485 for_each_machine_desc(p)
dce72dd0 486 early_print("%08x\t%s\n", p->nr, p->name);
1da177e4 487
dce72dd0 488 early_print("\nPlease check your kernel config and/or bootloader.\n");
1da177e4 489
dce72dd0
NP
490 while (true)
491 /* can't use cpu_relax() here as it may require MMU setup */;
1da177e4
LT
492}
493
9eb8f674 494int __init arm_add_memory(phys_addr_t start, unsigned long size)
3a669411 495{
4b5f32ce
NP
496 struct membank *bank = &meminfo.bank[meminfo.nr_banks];
497
498 if (meminfo.nr_banks >= NR_BANKS) {
499 printk(KERN_CRIT "NR_BANKS too low, "
29a38193 500 "ignoring memory at 0x%08llx\n", (long long)start);
4b5f32ce
NP
501 return -EINVAL;
502 }
05f96ef1 503
3a669411
RK
504 /*
505 * Ensure that start/size are aligned to a page boundary.
506 * Size is appropriately rounded down, start is rounded up.
507 */
508 size -= start & ~PAGE_MASK;
05f96ef1
RK
509 bank->start = PAGE_ALIGN(start);
510 bank->size = size & PAGE_MASK;
4b5f32ce
NP
511
512 /*
513 * Check whether this memory region has non-zero size or
514 * invalid node number.
515 */
be370302 516 if (bank->size == 0)
4b5f32ce
NP
517 return -EINVAL;
518
519 meminfo.nr_banks++;
520 return 0;
3a669411
RK
521}
522
1da177e4
LT
523/*
524 * Pick out the memory size. We look for mem=size@start,
525 * where start and size are "size[KkMm]"
526 */
2b0d8c25 527static int __init early_mem(char *p)
1da177e4
LT
528{
529 static int usermem __initdata = 0;
f60892d3
WD
530 unsigned long size;
531 phys_addr_t start;
2b0d8c25 532 char *endp;
1da177e4
LT
533
534 /*
535 * If the user specifies memory size, we
536 * blow away any automatically generated
537 * size.
538 */
539 if (usermem == 0) {
540 usermem = 1;
541 meminfo.nr_banks = 0;
542 }
543
544 start = PHYS_OFFSET;
2b0d8c25
JK
545 size = memparse(p, &endp);
546 if (*endp == '@')
547 start = memparse(endp + 1, NULL);
1da177e4 548
1c97b73e 549 arm_add_memory(start, size);
1da177e4 550
2b0d8c25 551 return 0;
1da177e4 552}
2b0d8c25 553early_param("mem", early_mem);
1da177e4
LT
554
555static void __init
556setup_ramdisk(int doload, int prompt, int image_start, unsigned int rd_sz)
557{
558#ifdef CONFIG_BLK_DEV_RAM
559 extern int rd_size, rd_image_start, rd_prompt, rd_doload;
560
561 rd_image_start = image_start;
562 rd_prompt = prompt;
563 rd_doload = doload;
564
565 if (rd_sz)
566 rd_size = rd_sz;
567#endif
568}
569
11b9369c 570static void __init request_standard_resources(struct machine_desc *mdesc)
1da177e4 571{
11b9369c 572 struct memblock_region *region;
1da177e4 573 struct resource *res;
1da177e4 574
37efe642
RK
575 kernel_code.start = virt_to_phys(_text);
576 kernel_code.end = virt_to_phys(_etext - 1);
842eab40 577 kernel_data.start = virt_to_phys(_sdata);
37efe642 578 kernel_data.end = virt_to_phys(_end - 1);
1da177e4 579
11b9369c 580 for_each_memblock(memory, region) {
1da177e4
LT
581 res = alloc_bootmem_low(sizeof(*res));
582 res->name = "System RAM";
11b9369c
DZ
583 res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
584 res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
1da177e4
LT
585 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
586
587 request_resource(&iomem_resource, res);
588
589 if (kernel_code.start >= res->start &&
590 kernel_code.end <= res->end)
591 request_resource(res, &kernel_code);
592 if (kernel_data.start >= res->start &&
593 kernel_data.end <= res->end)
594 request_resource(res, &kernel_data);
595 }
596
597 if (mdesc->video_start) {
598 video_ram.start = mdesc->video_start;
599 video_ram.end = mdesc->video_end;
600 request_resource(&iomem_resource, &video_ram);
601 }
602
603 /*
604 * Some machines don't have the possibility of ever
605 * possessing lp0, lp1 or lp2
606 */
607 if (mdesc->reserve_lp0)
608 request_resource(&ioport_resource, &lp0);
609 if (mdesc->reserve_lp1)
610 request_resource(&ioport_resource, &lp1);
611 if (mdesc->reserve_lp2)
612 request_resource(&ioport_resource, &lp2);
613}
614
615/*
616 * Tag parsing.
617 *
618 * This is the new way of passing data to the kernel at boot time. Rather
619 * than passing a fixed inflexible structure to the kernel, we pass a list
620 * of variable-sized tags to the kernel. The first tag must be a ATAG_CORE
621 * tag for the list to be recognised (to distinguish the tagged list from
622 * a param_struct). The list is terminated with a zero-length tag (this tag
623 * is not parsed in any way).
624 */
625static int __init parse_tag_core(const struct tag *tag)
626{
627 if (tag->hdr.size > 2) {
628 if ((tag->u.core.flags & 1) == 0)
629 root_mountflags &= ~MS_RDONLY;
630 ROOT_DEV = old_decode_dev(tag->u.core.rootdev);
631 }
632 return 0;
633}
634
635__tagtable(ATAG_CORE, parse_tag_core);
636
637static int __init parse_tag_mem32(const struct tag *tag)
638{
4b5f32ce 639 return arm_add_memory(tag->u.mem.start, tag->u.mem.size);
1da177e4
LT
640}
641
642__tagtable(ATAG_MEM, parse_tag_mem32);
643
644#if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
645struct screen_info screen_info = {
646 .orig_video_lines = 30,
647 .orig_video_cols = 80,
648 .orig_video_mode = 0,
649 .orig_video_ega_bx = 0,
650 .orig_video_isVGA = 1,
651 .orig_video_points = 8
652};
653
654static int __init parse_tag_videotext(const struct tag *tag)
655{
656 screen_info.orig_x = tag->u.videotext.x;
657 screen_info.orig_y = tag->u.videotext.y;
658 screen_info.orig_video_page = tag->u.videotext.video_page;
659 screen_info.orig_video_mode = tag->u.videotext.video_mode;
660 screen_info.orig_video_cols = tag->u.videotext.video_cols;
661 screen_info.orig_video_ega_bx = tag->u.videotext.video_ega_bx;
662 screen_info.orig_video_lines = tag->u.videotext.video_lines;
663 screen_info.orig_video_isVGA = tag->u.videotext.video_isvga;
664 screen_info.orig_video_points = tag->u.videotext.video_points;
665 return 0;
666}
667
668__tagtable(ATAG_VIDEOTEXT, parse_tag_videotext);
669#endif
670
671static int __init parse_tag_ramdisk(const struct tag *tag)
672{
673 setup_ramdisk((tag->u.ramdisk.flags & 1) == 0,
674 (tag->u.ramdisk.flags & 2) == 0,
675 tag->u.ramdisk.start, tag->u.ramdisk.size);
676 return 0;
677}
678
679__tagtable(ATAG_RAMDISK, parse_tag_ramdisk);
680
1da177e4
LT
681static int __init parse_tag_serialnr(const struct tag *tag)
682{
683 system_serial_low = tag->u.serialnr.low;
684 system_serial_high = tag->u.serialnr.high;
685 return 0;
686}
687
688__tagtable(ATAG_SERIAL, parse_tag_serialnr);
689
690static int __init parse_tag_revision(const struct tag *tag)
691{
692 system_rev = tag->u.revision.rev;
693 return 0;
694}
695
696__tagtable(ATAG_REVISION, parse_tag_revision);
697
698static int __init parse_tag_cmdline(const struct tag *tag)
699{
4394c124
VB
700#if defined(CONFIG_CMDLINE_EXTEND)
701 strlcat(default_command_line, " ", COMMAND_LINE_SIZE);
702 strlcat(default_command_line, tag->u.cmdline.cmdline,
703 COMMAND_LINE_SIZE);
704#elif defined(CONFIG_CMDLINE_FORCE)
22eeb8f6 705 pr_warning("Ignoring tag cmdline (using the default kernel command line)\n");
4394c124
VB
706#else
707 strlcpy(default_command_line, tag->u.cmdline.cmdline,
708 COMMAND_LINE_SIZE);
709#endif
1da177e4
LT
710 return 0;
711}
712
713__tagtable(ATAG_CMDLINE, parse_tag_cmdline);
714
715/*
716 * Scan the tag table for this tag, and call its parse function.
717 * The tag table is built by the linker from all the __tagtable
718 * declarations.
719 */
720static int __init parse_tag(const struct tag *tag)
721{
722 extern struct tagtable __tagtable_begin, __tagtable_end;
723 struct tagtable *t;
724
725 for (t = &__tagtable_begin; t < &__tagtable_end; t++)
726 if (tag->hdr.tag == t->tag) {
727 t->parse(tag);
728 break;
729 }
730
731 return t < &__tagtable_end;
732}
733
734/*
735 * Parse all tags in the list, checking both the global and architecture
736 * specific tag tables.
737 */
738static void __init parse_tags(const struct tag *t)
739{
740 for (; t->hdr.size; t = tag_next(t))
741 if (!parse_tag(t))
742 printk(KERN_WARNING
743 "Ignoring unrecognised tag 0x%08x\n",
744 t->hdr.tag);
745}
746
747/*
748 * This holds our defaults.
749 */
750static struct init_tags {
751 struct tag_header hdr1;
752 struct tag_core core;
753 struct tag_header hdr2;
754 struct tag_mem32 mem;
755 struct tag_header hdr3;
756} init_tags __initdata = {
757 { tag_size(tag_core), ATAG_CORE },
758 { 1, PAGE_SIZE, 0xff },
759 { tag_size(tag_mem32), ATAG_MEM },
b75c178a 760 { MEM_SIZE },
1da177e4
LT
761 { 0, ATAG_NONE }
762};
763
1da177e4
LT
764static int __init customize_machine(void)
765{
766 /* customizes platform devices, or adds new ones */
8ff1443c
RK
767 if (machine_desc->init_machine)
768 machine_desc->init_machine();
1da177e4
LT
769 return 0;
770}
771arch_initcall(customize_machine);
772
3c57fb43
MW
773#ifdef CONFIG_KEXEC
774static inline unsigned long long get_total_mem(void)
775{
776 unsigned long total;
777
778 total = max_low_pfn - min_low_pfn;
779 return total << PAGE_SHIFT;
780}
781
782/**
783 * reserve_crashkernel() - reserves memory are for crash kernel
784 *
785 * This function reserves memory area given in "crashkernel=" kernel command
786 * line parameter. The memory reserved is used by a dump capture kernel when
787 * primary kernel is crashing.
788 */
789static void __init reserve_crashkernel(void)
790{
791 unsigned long long crash_size, crash_base;
792 unsigned long long total_mem;
793 int ret;
794
795 total_mem = get_total_mem();
796 ret = parse_crashkernel(boot_command_line, total_mem,
797 &crash_size, &crash_base);
798 if (ret)
799 return;
800
801 ret = reserve_bootmem(crash_base, crash_size, BOOTMEM_EXCLUSIVE);
802 if (ret < 0) {
803 printk(KERN_WARNING "crashkernel reservation failed - "
804 "memory is in use (0x%lx)\n", (unsigned long)crash_base);
805 return;
806 }
807
808 printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
809 "for crashkernel (System RAM: %ldMB)\n",
810 (unsigned long)(crash_size >> 20),
811 (unsigned long)(crash_base >> 20),
812 (unsigned long)(total_mem >> 20));
813
814 crashk_res.start = crash_base;
815 crashk_res.end = crash_base + crash_size - 1;
816 insert_resource(&iomem_resource, &crashk_res);
817}
818#else
819static inline void reserve_crashkernel(void) {}
820#endif /* CONFIG_KEXEC */
821
73a65b3f
UKK
822static void __init squash_mem_tags(struct tag *tag)
823{
824 for (; tag->hdr.size; tag = tag_next(tag))
825 if (tag->hdr.tag == ATAG_MEM)
826 tag->hdr.tag = ATAG_NONE;
827}
828
6291319d 829static struct machine_desc * __init setup_machine_tags(unsigned int nr)
1da177e4
LT
830{
831 struct tag *tags = (struct tag *)&init_tags;
6291319d 832 struct machine_desc *mdesc = NULL, *p;
1da177e4
LT
833 char *from = default_command_line;
834
b75c178a
RK
835 init_tags.mem.start = PHYS_OFFSET;
836
6291319d
GL
837 /*
838 * locate machine in the list of supported machines.
839 */
840 for_each_machine_desc(p)
841 if (nr == p->nr) {
842 printk("Machine: %s\n", p->name);
843 mdesc = p;
844 break;
845 }
1da177e4 846
6291319d
GL
847 if (!mdesc) {
848 early_print("\nError: unrecognized/unsupported machine ID"
849 " (r1 = 0x%08x).\n\n", nr);
850 dump_machine_table(); /* does not return */
851 }
1da177e4 852
9d20fdd5
BG
853 if (__atags_pointer)
854 tags = phys_to_virt(__atags_pointer);
2bb9839e
NP
855 else if (mdesc->atag_offset)
856 tags = (void *)(PAGE_OFFSET + mdesc->atag_offset);
1da177e4 857
73a65b3f 858#if defined(CONFIG_DEPRECATED_PARAM_STRUCT)
1da177e4
LT
859 /*
860 * If we have the old style parameters, convert them to
861 * a tag list.
862 */
863 if (tags->hdr.tag != ATAG_CORE)
864 convert_to_tag_list(tags);
73a65b3f 865#endif
93c02ab4
GL
866
867 if (tags->hdr.tag != ATAG_CORE) {
868#if defined(CONFIG_OF)
869 /*
870 * If CONFIG_OF is set, then assume this is a reasonably
871 * modern system that should pass boot parameters
872 */
873 early_print("Warning: Neither atags nor dtb found\n");
874#endif
1da177e4 875 tags = (struct tag *)&init_tags;
93c02ab4 876 }
1da177e4
LT
877
878 if (mdesc->fixup)
0744a3ee 879 mdesc->fixup(tags, &from, &meminfo);
1da177e4
LT
880
881 if (tags->hdr.tag == ATAG_CORE) {
882 if (meminfo.nr_banks != 0)
883 squash_mem_tags(tags);
4cd9d6f7 884 save_atags(tags);
1da177e4
LT
885 parse_tags(tags);
886 }
887
6291319d
GL
888 /* parse_early_param needs a boot_command_line */
889 strlcpy(boot_command_line, from, COMMAND_LINE_SIZE);
890
891 return mdesc;
892}
893
27a3f0e9
NP
894static int __init meminfo_cmp(const void *_a, const void *_b)
895{
896 const struct membank *a = _a, *b = _b;
897 long cmp = bank_pfn_start(a) - bank_pfn_start(b);
898 return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
899}
6291319d
GL
900
901void __init setup_arch(char **cmdline_p)
902{
903 struct machine_desc *mdesc;
904
6291319d 905 setup_processor();
93c02ab4
GL
906 mdesc = setup_machine_fdt(__atags_pointer);
907 if (!mdesc)
908 mdesc = setup_machine_tags(machine_arch_type);
6291319d
GL
909 machine_desc = mdesc;
910 machine_name = mdesc->name;
911
9811ccdf
AP
912#ifdef CONFIG_ZONE_DMA
913 if (mdesc->dma_zone_size) {
914 extern unsigned long arm_dma_zone_size;
915 arm_dma_zone_size = mdesc->dma_zone_size;
916 }
917#endif
b44c350d
RK
918 if (mdesc->restart_mode)
919 reboot_setup(&mdesc->restart_mode);
6291319d 920
37efe642
RK
921 init_mm.start_code = (unsigned long) _text;
922 init_mm.end_code = (unsigned long) _etext;
923 init_mm.end_data = (unsigned long) _edata;
924 init_mm.brk = (unsigned long) _end;
1da177e4 925
48ab7e09
JK
926 /* populate cmd_line too for later use, preserving boot_command_line */
927 strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
928 *cmdline_p = cmd_line;
2b0d8c25
JK
929
930 parse_early_param();
931
27a3f0e9 932 sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
0371d3f7 933 sanity_check_meminfo();
8d717a52 934 arm_memblock_init(&meminfo, mdesc);
2778f620 935
4b5f32ce 936 paging_init(mdesc);
11b9369c 937 request_standard_resources(mdesc);
1da177e4 938
a528721d
RK
939 if (mdesc->restart)
940 arm_pm_restart = mdesc->restart;
941
93c02ab4
GL
942 unflatten_device_tree();
943
7bbb7940 944#ifdef CONFIG_SMP
f00ec48f
RK
945 if (is_smp())
946 smp_init_cpus();
7bbb7940 947#endif
3c57fb43 948 reserve_crashkernel();
7bbb7940 949
bc581770 950 tcm_init();
ccea7a19 951
52108641 952#ifdef CONFIG_MULTI_IRQ_HANDLER
953 handle_arch_irq = mdesc->handle_irq;
954#endif
1da177e4
LT
955
956#ifdef CONFIG_VT
957#if defined(CONFIG_VGA_CONSOLE)
958 conswitchp = &vga_con;
959#elif defined(CONFIG_DUMMY_CONSOLE)
960 conswitchp = &dummy_con;
961#endif
962#endif
5cbad0eb 963 early_trap_init();
dec12e62
RK
964
965 if (mdesc->init_early)
966 mdesc->init_early();
1da177e4
LT
967}
968
969
970static int __init topology_init(void)
971{
972 int cpu;
973
66fb8bd2
RK
974 for_each_possible_cpu(cpu) {
975 struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu);
976 cpuinfo->cpu.hotpluggable = 1;
977 register_cpu(&cpuinfo->cpu, cpu);
978 }
1da177e4
LT
979
980 return 0;
981}
1da177e4
LT
982subsys_initcall(topology_init);
983
e119bfff
RK
984#ifdef CONFIG_HAVE_PROC_CPU
985static int __init proc_cpu_init(void)
986{
987 struct proc_dir_entry *res;
988
989 res = proc_mkdir("cpu", NULL);
990 if (!res)
991 return -ENOMEM;
992 return 0;
993}
994fs_initcall(proc_cpu_init);
995#endif
996
1da177e4
LT
997static const char *hwcap_str[] = {
998 "swp",
999 "half",
1000 "thumb",
1001 "26bit",
1002 "fastmult",
1003 "fpa",
1004 "vfp",
1005 "edsp",
1006 "java",
8f7f9435 1007 "iwmmxt",
99e4a6dd 1008 "crunch",
4369ae16 1009 "thumbee",
2bedbdf4 1010 "neon",
7279dc3e
CM
1011 "vfpv3",
1012 "vfpv3d16",
254cdf8e
WD
1013 "tls",
1014 "vfpv4",
1015 "idiva",
1016 "idivt",
1da177e4
LT
1017 NULL
1018};
1019
1da177e4
LT
1020static int c_show(struct seq_file *m, void *v)
1021{
1022 int i;
1023
1024 seq_printf(m, "Processor\t: %s rev %d (%s)\n",
0ba8b9b2 1025 cpu_name, read_cpuid_id() & 15, elf_platform);
1da177e4
LT
1026
1027#if defined(CONFIG_SMP)
1028 for_each_online_cpu(i) {
15559722
RK
1029 /*
1030 * glibc reads /proc/cpuinfo to determine the number of
1031 * online processors, looking for lines beginning with
1032 * "processor". Give glibc what it expects.
1033 */
1034 seq_printf(m, "processor\t: %d\n", i);
1da177e4
LT
1035 seq_printf(m, "BogoMIPS\t: %lu.%02lu\n\n",
1036 per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
1037 (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
1038 }
1039#else /* CONFIG_SMP */
1040 seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
1041 loops_per_jiffy / (500000/HZ),
1042 (loops_per_jiffy / (5000/HZ)) % 100);
1043#endif
1044
1045 /* dump out the processor features */
1046 seq_puts(m, "Features\t: ");
1047
1048 for (i = 0; hwcap_str[i]; i++)
1049 if (elf_hwcap & (1 << i))
1050 seq_printf(m, "%s ", hwcap_str[i]);
1051
0ba8b9b2 1052 seq_printf(m, "\nCPU implementer\t: 0x%02x\n", read_cpuid_id() >> 24);
1da177e4
LT
1053 seq_printf(m, "CPU architecture: %s\n", proc_arch[cpu_architecture()]);
1054
0ba8b9b2 1055 if ((read_cpuid_id() & 0x0008f000) == 0x00000000) {
1da177e4 1056 /* pre-ARM7 */
0ba8b9b2 1057 seq_printf(m, "CPU part\t: %07x\n", read_cpuid_id() >> 4);
1da177e4 1058 } else {
0ba8b9b2 1059 if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
1da177e4
LT
1060 /* ARM7 */
1061 seq_printf(m, "CPU variant\t: 0x%02x\n",
0ba8b9b2 1062 (read_cpuid_id() >> 16) & 127);
1da177e4
LT
1063 } else {
1064 /* post-ARM7 */
1065 seq_printf(m, "CPU variant\t: 0x%x\n",
0ba8b9b2 1066 (read_cpuid_id() >> 20) & 15);
1da177e4
LT
1067 }
1068 seq_printf(m, "CPU part\t: 0x%03x\n",
0ba8b9b2 1069 (read_cpuid_id() >> 4) & 0xfff);
1da177e4 1070 }
0ba8b9b2 1071 seq_printf(m, "CPU revision\t: %d\n", read_cpuid_id() & 15);
1da177e4 1072
1da177e4
LT
1073 seq_puts(m, "\n");
1074
1075 seq_printf(m, "Hardware\t: %s\n", machine_name);
1076 seq_printf(m, "Revision\t: %04x\n", system_rev);
1077 seq_printf(m, "Serial\t\t: %08x%08x\n",
1078 system_serial_high, system_serial_low);
1079
1080 return 0;
1081}
1082
1083static void *c_start(struct seq_file *m, loff_t *pos)
1084{
1085 return *pos < 1 ? (void *)1 : NULL;
1086}
1087
1088static void *c_next(struct seq_file *m, void *v, loff_t *pos)
1089{
1090 ++*pos;
1091 return NULL;
1092}
1093
1094static void c_stop(struct seq_file *m, void *v)
1095{
1096}
1097
2ffd6e18 1098const struct seq_operations cpuinfo_op = {
1da177e4
LT
1099 .start = c_start,
1100 .next = c_next,
1101 .stop = c_stop,
1102 .show = c_show
1103};