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