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