]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm/kernel/setup.c
ARM: 7855/1: Add check for Cortex-A15 errata 798181 ECO
[karo-tx-linux.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/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/of_platform.h>
22 #include <linux/init.h>
23 #include <linux/kexec.h>
24 #include <linux/of_fdt.h>
25 #include <linux/cpu.h>
26 #include <linux/interrupt.h>
27 #include <linux/smp.h>
28 #include <linux/proc_fs.h>
29 #include <linux/memblock.h>
30 #include <linux/bug.h>
31 #include <linux/compiler.h>
32 #include <linux/sort.h>
33
34 #include <asm/unified.h>
35 #include <asm/cp15.h>
36 #include <asm/cpu.h>
37 #include <asm/cputype.h>
38 #include <asm/elf.h>
39 #include <asm/procinfo.h>
40 #include <asm/psci.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 #include <asm/virt.h>
59
60 #include "atags.h"
61
62
63 #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
64 char fpe_type[8];
65
66 static int __init fpe_setup(char *line)
67 {
68         memcpy(fpe_type, line, 8);
69         return 1;
70 }
71
72 __setup("fpe=", fpe_setup);
73 #endif
74
75 extern void paging_init(const struct machine_desc *desc);
76 extern void sanity_check_meminfo(void);
77 extern enum reboot_mode reboot_mode;
78 extern void setup_dma_zone(const struct machine_desc *desc);
79
80 unsigned int processor_id;
81 EXPORT_SYMBOL(processor_id);
82 unsigned int __machine_arch_type __read_mostly;
83 EXPORT_SYMBOL(__machine_arch_type);
84 unsigned int cacheid __read_mostly;
85 EXPORT_SYMBOL(cacheid);
86
87 unsigned int __atags_pointer __initdata;
88
89 unsigned int system_rev;
90 EXPORT_SYMBOL(system_rev);
91
92 unsigned int system_serial_low;
93 EXPORT_SYMBOL(system_serial_low);
94
95 unsigned int system_serial_high;
96 EXPORT_SYMBOL(system_serial_high);
97
98 unsigned int elf_hwcap __read_mostly;
99 EXPORT_SYMBOL(elf_hwcap);
100
101
102 #ifdef MULTI_CPU
103 struct processor processor __read_mostly;
104 #endif
105 #ifdef MULTI_TLB
106 struct cpu_tlb_fns cpu_tlb __read_mostly;
107 #endif
108 #ifdef MULTI_USER
109 struct cpu_user_fns cpu_user __read_mostly;
110 #endif
111 #ifdef MULTI_CACHE
112 struct cpu_cache_fns cpu_cache __read_mostly;
113 #endif
114 #ifdef CONFIG_OUTER_CACHE
115 struct outer_cache_fns outer_cache __read_mostly;
116 EXPORT_SYMBOL(outer_cache);
117 #endif
118
119 /*
120  * Cached cpu_architecture() result for use by assembler code.
121  * C code should use the cpu_architecture() function instead of accessing this
122  * variable directly.
123  */
124 int __cpu_architecture __read_mostly = CPU_ARCH_UNKNOWN;
125
126 struct stack {
127         u32 irq[3];
128         u32 abt[3];
129         u32 und[3];
130 } ____cacheline_aligned;
131
132 #ifndef CONFIG_CPU_V7M
133 static struct stack stacks[NR_CPUS];
134 #endif
135
136 char elf_platform[ELF_PLATFORM_SIZE];
137 EXPORT_SYMBOL(elf_platform);
138
139 static const char *cpu_name;
140 static const char *machine_name;
141 static char __initdata cmd_line[COMMAND_LINE_SIZE];
142 const struct machine_desc *machine_desc __initdata;
143
144 static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
145 #define ENDIANNESS ((char)endian_test.l)
146
147 DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data);
148
149 /*
150  * Standard memory resources
151  */
152 static struct resource mem_res[] = {
153         {
154                 .name = "Video RAM",
155                 .start = 0,
156                 .end = 0,
157                 .flags = IORESOURCE_MEM
158         },
159         {
160                 .name = "Kernel code",
161                 .start = 0,
162                 .end = 0,
163                 .flags = IORESOURCE_MEM
164         },
165         {
166                 .name = "Kernel data",
167                 .start = 0,
168                 .end = 0,
169                 .flags = IORESOURCE_MEM
170         }
171 };
172
173 #define video_ram   mem_res[0]
174 #define kernel_code mem_res[1]
175 #define kernel_data mem_res[2]
176
177 static struct resource io_res[] = {
178         {
179                 .name = "reserved",
180                 .start = 0x3bc,
181                 .end = 0x3be,
182                 .flags = IORESOURCE_IO | IORESOURCE_BUSY
183         },
184         {
185                 .name = "reserved",
186                 .start = 0x378,
187                 .end = 0x37f,
188                 .flags = IORESOURCE_IO | IORESOURCE_BUSY
189         },
190         {
191                 .name = "reserved",
192                 .start = 0x278,
193                 .end = 0x27f,
194                 .flags = IORESOURCE_IO | IORESOURCE_BUSY
195         }
196 };
197
198 #define lp0 io_res[0]
199 #define lp1 io_res[1]
200 #define lp2 io_res[2]
201
202 static const char *proc_arch[] = {
203         "undefined/unknown",
204         "3",
205         "4",
206         "4T",
207         "5",
208         "5T",
209         "5TE",
210         "5TEJ",
211         "6TEJ",
212         "7",
213         "7M",
214         "?(12)",
215         "?(13)",
216         "?(14)",
217         "?(15)",
218         "?(16)",
219         "?(17)",
220 };
221
222 #ifdef CONFIG_CPU_V7M
223 static int __get_cpu_architecture(void)
224 {
225         return CPU_ARCH_ARMv7M;
226 }
227 #else
228 static int __get_cpu_architecture(void)
229 {
230         int cpu_arch;
231
232         if ((read_cpuid_id() & 0x0008f000) == 0) {
233                 cpu_arch = CPU_ARCH_UNKNOWN;
234         } else if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
235                 cpu_arch = (read_cpuid_id() & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
236         } else if ((read_cpuid_id() & 0x00080000) == 0x00000000) {
237                 cpu_arch = (read_cpuid_id() >> 16) & 7;
238                 if (cpu_arch)
239                         cpu_arch += CPU_ARCH_ARMv3;
240         } else if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) {
241                 unsigned int mmfr0;
242
243                 /* Revised CPUID format. Read the Memory Model Feature
244                  * Register 0 and check for VMSAv7 or PMSAv7 */
245                 asm("mrc        p15, 0, %0, c0, c1, 4"
246                     : "=r" (mmfr0));
247                 if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
248                     (mmfr0 & 0x000000f0) >= 0x00000030)
249                         cpu_arch = CPU_ARCH_ARMv7;
250                 else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
251                          (mmfr0 & 0x000000f0) == 0x00000020)
252                         cpu_arch = CPU_ARCH_ARMv6;
253                 else
254                         cpu_arch = CPU_ARCH_UNKNOWN;
255         } else
256                 cpu_arch = CPU_ARCH_UNKNOWN;
257
258         return cpu_arch;
259 }
260 #endif
261
262 int __pure cpu_architecture(void)
263 {
264         BUG_ON(__cpu_architecture == CPU_ARCH_UNKNOWN);
265
266         return __cpu_architecture;
267 }
268
269 static int cpu_has_aliasing_icache(unsigned int arch)
270 {
271         int aliasing_icache;
272         unsigned int id_reg, num_sets, line_size;
273
274         /* PIPT caches never alias. */
275         if (icache_is_pipt())
276                 return 0;
277
278         /* arch specifies the register format */
279         switch (arch) {
280         case CPU_ARCH_ARMv7:
281                 asm("mcr        p15, 2, %0, c0, c0, 0 @ set CSSELR"
282                     : /* No output operands */
283                     : "r" (1));
284                 isb();
285                 asm("mrc        p15, 1, %0, c0, c0, 0 @ read CCSIDR"
286                     : "=r" (id_reg));
287                 line_size = 4 << ((id_reg & 0x7) + 2);
288                 num_sets = ((id_reg >> 13) & 0x7fff) + 1;
289                 aliasing_icache = (line_size * num_sets) > PAGE_SIZE;
290                 break;
291         case CPU_ARCH_ARMv6:
292                 aliasing_icache = read_cpuid_cachetype() & (1 << 11);
293                 break;
294         default:
295                 /* I-cache aliases will be handled by D-cache aliasing code */
296                 aliasing_icache = 0;
297         }
298
299         return aliasing_icache;
300 }
301
302 static void __init cacheid_init(void)
303 {
304         unsigned int arch = cpu_architecture();
305
306         if (arch == CPU_ARCH_ARMv7M) {
307                 cacheid = 0;
308         } else if (arch >= CPU_ARCH_ARMv6) {
309                 unsigned int cachetype = read_cpuid_cachetype();
310                 if ((cachetype & (7 << 29)) == 4 << 29) {
311                         /* ARMv7 register format */
312                         arch = CPU_ARCH_ARMv7;
313                         cacheid = CACHEID_VIPT_NONALIASING;
314                         switch (cachetype & (3 << 14)) {
315                         case (1 << 14):
316                                 cacheid |= CACHEID_ASID_TAGGED;
317                                 break;
318                         case (3 << 14):
319                                 cacheid |= CACHEID_PIPT;
320                                 break;
321                         }
322                 } else {
323                         arch = CPU_ARCH_ARMv6;
324                         if (cachetype & (1 << 23))
325                                 cacheid = CACHEID_VIPT_ALIASING;
326                         else
327                                 cacheid = CACHEID_VIPT_NONALIASING;
328                 }
329                 if (cpu_has_aliasing_icache(arch))
330                         cacheid |= CACHEID_VIPT_I_ALIASING;
331         } else {
332                 cacheid = CACHEID_VIVT;
333         }
334
335         printk("CPU: %s data cache, %s instruction cache\n",
336                 cache_is_vivt() ? "VIVT" :
337                 cache_is_vipt_aliasing() ? "VIPT aliasing" :
338                 cache_is_vipt_nonaliasing() ? "PIPT / VIPT nonaliasing" : "unknown",
339                 cache_is_vivt() ? "VIVT" :
340                 icache_is_vivt_asid_tagged() ? "VIVT ASID tagged" :
341                 icache_is_vipt_aliasing() ? "VIPT aliasing" :
342                 icache_is_pipt() ? "PIPT" :
343                 cache_is_vipt_nonaliasing() ? "VIPT nonaliasing" : "unknown");
344 }
345
346 /*
347  * These functions re-use the assembly code in head.S, which
348  * already provide the required functionality.
349  */
350 extern struct proc_info_list *lookup_processor_type(unsigned int);
351
352 void __init early_print(const char *str, ...)
353 {
354         extern void printascii(const char *);
355         char buf[256];
356         va_list ap;
357
358         va_start(ap, str);
359         vsnprintf(buf, sizeof(buf), str, ap);
360         va_end(ap);
361
362 #ifdef CONFIG_DEBUG_LL
363         printascii(buf);
364 #endif
365         printk("%s", buf);
366 }
367
368 static void __init cpuid_init_hwcaps(void)
369 {
370         unsigned int divide_instrs, vmsa;
371
372         if (cpu_architecture() < CPU_ARCH_ARMv7)
373                 return;
374
375         divide_instrs = (read_cpuid_ext(CPUID_EXT_ISAR0) & 0x0f000000) >> 24;
376
377         switch (divide_instrs) {
378         case 2:
379                 elf_hwcap |= HWCAP_IDIVA;
380         case 1:
381                 elf_hwcap |= HWCAP_IDIVT;
382         }
383
384         /* LPAE implies atomic ldrd/strd instructions */
385         vmsa = (read_cpuid_ext(CPUID_EXT_MMFR0) & 0xf) >> 0;
386         if (vmsa >= 5)
387                 elf_hwcap |= HWCAP_LPAE;
388 }
389
390 static void __init feat_v6_fixup(void)
391 {
392         int id = read_cpuid_id();
393
394         if ((id & 0xff0f0000) != 0x41070000)
395                 return;
396
397         /*
398          * HWCAP_TLS is available only on 1136 r1p0 and later,
399          * see also kuser_get_tls_init.
400          */
401         if ((((id >> 4) & 0xfff) == 0xb36) && (((id >> 20) & 3) == 0))
402                 elf_hwcap &= ~HWCAP_TLS;
403 }
404
405 /*
406  * cpu_init - initialise one CPU.
407  *
408  * cpu_init sets up the per-CPU stacks.
409  */
410 void notrace cpu_init(void)
411 {
412 #ifndef CONFIG_CPU_V7M
413         unsigned int cpu = smp_processor_id();
414         struct stack *stk = &stacks[cpu];
415
416         if (cpu >= NR_CPUS) {
417                 printk(KERN_CRIT "CPU%u: bad primary CPU number\n", cpu);
418                 BUG();
419         }
420
421         /*
422          * This only works on resume and secondary cores. For booting on the
423          * boot cpu, smp_prepare_boot_cpu is called after percpu area setup.
424          */
425         set_my_cpu_offset(per_cpu_offset(cpu));
426
427         cpu_proc_init();
428
429         /*
430          * Define the placement constraint for the inline asm directive below.
431          * In Thumb-2, msr with an immediate value is not allowed.
432          */
433 #ifdef CONFIG_THUMB2_KERNEL
434 #define PLC     "r"
435 #else
436 #define PLC     "I"
437 #endif
438
439         /*
440          * setup stacks for re-entrant exception handlers
441          */
442         __asm__ (
443         "msr    cpsr_c, %1\n\t"
444         "add    r14, %0, %2\n\t"
445         "mov    sp, r14\n\t"
446         "msr    cpsr_c, %3\n\t"
447         "add    r14, %0, %4\n\t"
448         "mov    sp, r14\n\t"
449         "msr    cpsr_c, %5\n\t"
450         "add    r14, %0, %6\n\t"
451         "mov    sp, r14\n\t"
452         "msr    cpsr_c, %7"
453             :
454             : "r" (stk),
455               PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
456               "I" (offsetof(struct stack, irq[0])),
457               PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
458               "I" (offsetof(struct stack, abt[0])),
459               PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
460               "I" (offsetof(struct stack, und[0])),
461               PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
462             : "r14");
463 #endif
464 }
465
466 u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
467
468 void __init smp_setup_processor_id(void)
469 {
470         int i;
471         u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
472         u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
473
474         cpu_logical_map(0) = cpu;
475         for (i = 1; i < nr_cpu_ids; ++i)
476                 cpu_logical_map(i) = i == cpu ? 0 : i;
477
478         /*
479          * clear __my_cpu_offset on boot CPU to avoid hang caused by
480          * using percpu variable early, for example, lockdep will
481          * access percpu variable inside lock_release
482          */
483         set_my_cpu_offset(0);
484
485         printk(KERN_INFO "Booting Linux on physical CPU 0x%x\n", mpidr);
486 }
487
488 struct mpidr_hash mpidr_hash;
489 #ifdef CONFIG_SMP
490 /**
491  * smp_build_mpidr_hash - Pre-compute shifts required at each affinity
492  *                        level in order to build a linear index from an
493  *                        MPIDR value. Resulting algorithm is a collision
494  *                        free hash carried out through shifting and ORing
495  */
496 static void __init smp_build_mpidr_hash(void)
497 {
498         u32 i, affinity;
499         u32 fs[3], bits[3], ls, mask = 0;
500         /*
501          * Pre-scan the list of MPIDRS and filter out bits that do
502          * not contribute to affinity levels, ie they never toggle.
503          */
504         for_each_possible_cpu(i)
505                 mask |= (cpu_logical_map(i) ^ cpu_logical_map(0));
506         pr_debug("mask of set bits 0x%x\n", mask);
507         /*
508          * Find and stash the last and first bit set at all affinity levels to
509          * check how many bits are required to represent them.
510          */
511         for (i = 0; i < 3; i++) {
512                 affinity = MPIDR_AFFINITY_LEVEL(mask, i);
513                 /*
514                  * Find the MSB bit and LSB bits position
515                  * to determine how many bits are required
516                  * to express the affinity level.
517                  */
518                 ls = fls(affinity);
519                 fs[i] = affinity ? ffs(affinity) - 1 : 0;
520                 bits[i] = ls - fs[i];
521         }
522         /*
523          * An index can be created from the MPIDR by isolating the
524          * significant bits at each affinity level and by shifting
525          * them in order to compress the 24 bits values space to a
526          * compressed set of values. This is equivalent to hashing
527          * the MPIDR through shifting and ORing. It is a collision free
528          * hash though not minimal since some levels might contain a number
529          * of CPUs that is not an exact power of 2 and their bit
530          * representation might contain holes, eg MPIDR[7:0] = {0x2, 0x80}.
531          */
532         mpidr_hash.shift_aff[0] = fs[0];
533         mpidr_hash.shift_aff[1] = MPIDR_LEVEL_BITS + fs[1] - bits[0];
534         mpidr_hash.shift_aff[2] = 2*MPIDR_LEVEL_BITS + fs[2] -
535                                                 (bits[1] + bits[0]);
536         mpidr_hash.mask = mask;
537         mpidr_hash.bits = bits[2] + bits[1] + bits[0];
538         pr_debug("MPIDR hash: aff0[%u] aff1[%u] aff2[%u] mask[0x%x] bits[%u]\n",
539                                 mpidr_hash.shift_aff[0],
540                                 mpidr_hash.shift_aff[1],
541                                 mpidr_hash.shift_aff[2],
542                                 mpidr_hash.mask,
543                                 mpidr_hash.bits);
544         /*
545          * 4x is an arbitrary value used to warn on a hash table much bigger
546          * than expected on most systems.
547          */
548         if (mpidr_hash_size() > 4 * num_possible_cpus())
549                 pr_warn("Large number of MPIDR hash buckets detected\n");
550         sync_cache_w(&mpidr_hash);
551 }
552 #endif
553
554 static void __init setup_processor(void)
555 {
556         struct proc_info_list *list;
557
558         /*
559          * locate processor in the list of supported processor
560          * types.  The linker builds this table for us from the
561          * entries in arch/arm/mm/proc-*.S
562          */
563         list = lookup_processor_type(read_cpuid_id());
564         if (!list) {
565                 printk("CPU configuration botched (ID %08x), unable "
566                        "to continue.\n", read_cpuid_id());
567                 while (1);
568         }
569
570         cpu_name = list->cpu_name;
571         __cpu_architecture = __get_cpu_architecture();
572
573 #ifdef MULTI_CPU
574         processor = *list->proc;
575 #endif
576 #ifdef MULTI_TLB
577         cpu_tlb = *list->tlb;
578 #endif
579 #ifdef MULTI_USER
580         cpu_user = *list->user;
581 #endif
582 #ifdef MULTI_CACHE
583         cpu_cache = *list->cache;
584 #endif
585
586         printk("CPU: %s [%08x] revision %d (ARMv%s), cr=%08lx\n",
587                cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
588                proc_arch[cpu_architecture()], cr_alignment);
589
590         snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c",
591                  list->arch_name, ENDIANNESS);
592         snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
593                  list->elf_name, ENDIANNESS);
594         elf_hwcap = list->elf_hwcap;
595
596         cpuid_init_hwcaps();
597
598 #ifndef CONFIG_ARM_THUMB
599         elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
600 #endif
601
602         erratum_a15_798181_init();
603
604         feat_v6_fixup();
605
606         cacheid_init();
607         cpu_init();
608 }
609
610 void __init dump_machine_table(void)
611 {
612         const struct machine_desc *p;
613
614         early_print("Available machine support:\n\nID (hex)\tNAME\n");
615         for_each_machine_desc(p)
616                 early_print("%08x\t%s\n", p->nr, p->name);
617
618         early_print("\nPlease check your kernel config and/or bootloader.\n");
619
620         while (true)
621                 /* can't use cpu_relax() here as it may require MMU setup */;
622 }
623
624 int __init arm_add_memory(phys_addr_t start, phys_addr_t size)
625 {
626         struct membank *bank = &meminfo.bank[meminfo.nr_banks];
627
628         if (meminfo.nr_banks >= NR_BANKS) {
629                 printk(KERN_CRIT "NR_BANKS too low, "
630                         "ignoring memory at 0x%08llx\n", (long long)start);
631                 return -EINVAL;
632         }
633
634         /*
635          * Ensure that start/size are aligned to a page boundary.
636          * Size is appropriately rounded down, start is rounded up.
637          */
638         size -= start & ~PAGE_MASK;
639         bank->start = PAGE_ALIGN(start);
640
641 #ifndef CONFIG_ARM_LPAE
642         if (bank->start + size < bank->start) {
643                 printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in "
644                         "32-bit physical address space\n", (long long)start);
645                 /*
646                  * To ensure bank->start + bank->size is representable in
647                  * 32 bits, we use ULONG_MAX as the upper limit rather than 4GB.
648                  * This means we lose a page after masking.
649                  */
650                 size = ULONG_MAX - bank->start;
651         }
652 #endif
653
654         bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1);
655
656         /*
657          * Check whether this memory region has non-zero size or
658          * invalid node number.
659          */
660         if (bank->size == 0)
661                 return -EINVAL;
662
663         meminfo.nr_banks++;
664         return 0;
665 }
666
667 /*
668  * Pick out the memory size.  We look for mem=size@start,
669  * where start and size are "size[KkMm]"
670  */
671 static int __init early_mem(char *p)
672 {
673         static int usermem __initdata = 0;
674         phys_addr_t size;
675         phys_addr_t start;
676         char *endp;
677
678         /*
679          * If the user specifies memory size, we
680          * blow away any automatically generated
681          * size.
682          */
683         if (usermem == 0) {
684                 usermem = 1;
685                 meminfo.nr_banks = 0;
686         }
687
688         start = PHYS_OFFSET;
689         size  = memparse(p, &endp);
690         if (*endp == '@')
691                 start = memparse(endp + 1, NULL);
692
693         arm_add_memory(start, size);
694
695         return 0;
696 }
697 early_param("mem", early_mem);
698
699 static void __init request_standard_resources(const struct machine_desc *mdesc)
700 {
701         struct memblock_region *region;
702         struct resource *res;
703
704         kernel_code.start   = virt_to_phys(_text);
705         kernel_code.end     = virt_to_phys(_etext - 1);
706         kernel_data.start   = virt_to_phys(_sdata);
707         kernel_data.end     = virt_to_phys(_end - 1);
708
709         for_each_memblock(memory, region) {
710                 res = alloc_bootmem_low(sizeof(*res));
711                 res->name  = "System RAM";
712                 res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
713                 res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
714                 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
715
716                 request_resource(&iomem_resource, res);
717
718                 if (kernel_code.start >= res->start &&
719                     kernel_code.end <= res->end)
720                         request_resource(res, &kernel_code);
721                 if (kernel_data.start >= res->start &&
722                     kernel_data.end <= res->end)
723                         request_resource(res, &kernel_data);
724         }
725
726         if (mdesc->video_start) {
727                 video_ram.start = mdesc->video_start;
728                 video_ram.end   = mdesc->video_end;
729                 request_resource(&iomem_resource, &video_ram);
730         }
731
732         /*
733          * Some machines don't have the possibility of ever
734          * possessing lp0, lp1 or lp2
735          */
736         if (mdesc->reserve_lp0)
737                 request_resource(&ioport_resource, &lp0);
738         if (mdesc->reserve_lp1)
739                 request_resource(&ioport_resource, &lp1);
740         if (mdesc->reserve_lp2)
741                 request_resource(&ioport_resource, &lp2);
742 }
743
744 #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE)
745 struct screen_info screen_info = {
746  .orig_video_lines      = 30,
747  .orig_video_cols       = 80,
748  .orig_video_mode       = 0,
749  .orig_video_ega_bx     = 0,
750  .orig_video_isVGA      = 1,
751  .orig_video_points     = 8
752 };
753 #endif
754
755 static int __init customize_machine(void)
756 {
757         /*
758          * customizes platform devices, or adds new ones
759          * On DT based machines, we fall back to populating the
760          * machine from the device tree, if no callback is provided,
761          * otherwise we would always need an init_machine callback.
762          */
763         if (machine_desc->init_machine)
764                 machine_desc->init_machine();
765 #ifdef CONFIG_OF
766         else
767                 of_platform_populate(NULL, of_default_bus_match_table,
768                                         NULL, NULL);
769 #endif
770         return 0;
771 }
772 arch_initcall(customize_machine);
773
774 static int __init init_machine_late(void)
775 {
776         if (machine_desc->init_late)
777                 machine_desc->init_late();
778         return 0;
779 }
780 late_initcall(init_machine_late);
781
782 #ifdef CONFIG_KEXEC
783 static inline unsigned long long get_total_mem(void)
784 {
785         unsigned long total;
786
787         total = max_low_pfn - min_low_pfn;
788         return total << PAGE_SHIFT;
789 }
790
791 /**
792  * reserve_crashkernel() - reserves memory are for crash kernel
793  *
794  * This function reserves memory area given in "crashkernel=" kernel command
795  * line parameter. The memory reserved is used by a dump capture kernel when
796  * primary kernel is crashing.
797  */
798 static void __init reserve_crashkernel(void)
799 {
800         unsigned long long crash_size, crash_base;
801         unsigned long long total_mem;
802         int ret;
803
804         total_mem = get_total_mem();
805         ret = parse_crashkernel(boot_command_line, total_mem,
806                                 &crash_size, &crash_base);
807         if (ret)
808                 return;
809
810         ret = reserve_bootmem(crash_base, crash_size, BOOTMEM_EXCLUSIVE);
811         if (ret < 0) {
812                 printk(KERN_WARNING "crashkernel reservation failed - "
813                        "memory is in use (0x%lx)\n", (unsigned long)crash_base);
814                 return;
815         }
816
817         printk(KERN_INFO "Reserving %ldMB of memory at %ldMB "
818                "for crashkernel (System RAM: %ldMB)\n",
819                (unsigned long)(crash_size >> 20),
820                (unsigned long)(crash_base >> 20),
821                (unsigned long)(total_mem >> 20));
822
823         crashk_res.start = crash_base;
824         crashk_res.end = crash_base + crash_size - 1;
825         insert_resource(&iomem_resource, &crashk_res);
826 }
827 #else
828 static inline void reserve_crashkernel(void) {}
829 #endif /* CONFIG_KEXEC */
830
831 static int __init meminfo_cmp(const void *_a, const void *_b)
832 {
833         const struct membank *a = _a, *b = _b;
834         long cmp = bank_pfn_start(a) - bank_pfn_start(b);
835         return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
836 }
837
838 void __init hyp_mode_check(void)
839 {
840 #ifdef CONFIG_ARM_VIRT_EXT
841         sync_boot_mode();
842
843         if (is_hyp_mode_available()) {
844                 pr_info("CPU: All CPU(s) started in HYP mode.\n");
845                 pr_info("CPU: Virtualization extensions available.\n");
846         } else if (is_hyp_mode_mismatched()) {
847                 pr_warn("CPU: WARNING: CPU(s) started in wrong/inconsistent modes (primary CPU mode 0x%x)\n",
848                         __boot_cpu_mode & MODE_MASK);
849                 pr_warn("CPU: This may indicate a broken bootloader or firmware.\n");
850         } else
851                 pr_info("CPU: All CPU(s) started in SVC mode.\n");
852 #endif
853 }
854
855 void __init setup_arch(char **cmdline_p)
856 {
857         const struct machine_desc *mdesc;
858
859         setup_processor();
860         mdesc = setup_machine_fdt(__atags_pointer);
861         if (!mdesc)
862                 mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);
863         machine_desc = mdesc;
864         machine_name = mdesc->name;
865
866         setup_dma_zone(mdesc);
867
868         if (mdesc->reboot_mode != REBOOT_HARD)
869                 reboot_mode = mdesc->reboot_mode;
870
871         init_mm.start_code = (unsigned long) _text;
872         init_mm.end_code   = (unsigned long) _etext;
873         init_mm.end_data   = (unsigned long) _edata;
874         init_mm.brk        = (unsigned long) _end;
875
876         /* populate cmd_line too for later use, preserving boot_command_line */
877         strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
878         *cmdline_p = cmd_line;
879
880         parse_early_param();
881
882         sort(&meminfo.bank, meminfo.nr_banks, sizeof(meminfo.bank[0]), meminfo_cmp, NULL);
883         sanity_check_meminfo();
884         arm_memblock_init(&meminfo, mdesc);
885
886         paging_init(mdesc);
887         request_standard_resources(mdesc);
888
889         if (mdesc->restart)
890                 arm_pm_restart = mdesc->restart;
891
892         unflatten_device_tree();
893
894         arm_dt_init_cpu_maps();
895         psci_init();
896 #ifdef CONFIG_SMP
897         if (is_smp()) {
898                 if (!mdesc->smp_init || !mdesc->smp_init()) {
899                         if (psci_smp_available())
900                                 smp_set_ops(&psci_smp_ops);
901                         else if (mdesc->smp)
902                                 smp_set_ops(mdesc->smp);
903                 }
904                 smp_init_cpus();
905                 smp_build_mpidr_hash();
906         }
907 #endif
908
909         if (!is_smp())
910                 hyp_mode_check();
911
912         reserve_crashkernel();
913
914 #ifdef CONFIG_MULTI_IRQ_HANDLER
915         handle_arch_irq = mdesc->handle_irq;
916 #endif
917
918 #ifdef CONFIG_VT
919 #if defined(CONFIG_VGA_CONSOLE)
920         conswitchp = &vga_con;
921 #elif defined(CONFIG_DUMMY_CONSOLE)
922         conswitchp = &dummy_con;
923 #endif
924 #endif
925
926         if (mdesc->init_early)
927                 mdesc->init_early();
928 }
929
930
931 static int __init topology_init(void)
932 {
933         int cpu;
934
935         for_each_possible_cpu(cpu) {
936                 struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu);
937                 cpuinfo->cpu.hotpluggable = 1;
938                 register_cpu(&cpuinfo->cpu, cpu);
939         }
940
941         return 0;
942 }
943 subsys_initcall(topology_init);
944
945 #ifdef CONFIG_HAVE_PROC_CPU
946 static int __init proc_cpu_init(void)
947 {
948         struct proc_dir_entry *res;
949
950         res = proc_mkdir("cpu", NULL);
951         if (!res)
952                 return -ENOMEM;
953         return 0;
954 }
955 fs_initcall(proc_cpu_init);
956 #endif
957
958 static const char *hwcap_str[] = {
959         "swp",
960         "half",
961         "thumb",
962         "26bit",
963         "fastmult",
964         "fpa",
965         "vfp",
966         "edsp",
967         "java",
968         "iwmmxt",
969         "crunch",
970         "thumbee",
971         "neon",
972         "vfpv3",
973         "vfpv3d16",
974         "tls",
975         "vfpv4",
976         "idiva",
977         "idivt",
978         "vfpd32",
979         "lpae",
980         NULL
981 };
982
983 static int c_show(struct seq_file *m, void *v)
984 {
985         int i, j;
986         u32 cpuid;
987
988         for_each_online_cpu(i) {
989                 /*
990                  * glibc reads /proc/cpuinfo to determine the number of
991                  * online processors, looking for lines beginning with
992                  * "processor".  Give glibc what it expects.
993                  */
994                 seq_printf(m, "processor\t: %d\n", i);
995                 cpuid = is_smp() ? per_cpu(cpu_data, i).cpuid : read_cpuid_id();
996                 seq_printf(m, "model name\t: %s rev %d (%s)\n",
997                            cpu_name, cpuid & 15, elf_platform);
998
999                 /* dump out the processor features */
1000                 seq_puts(m, "Features\t: ");
1001
1002                 for (j = 0; hwcap_str[j]; j++)
1003                         if (elf_hwcap & (1 << j))
1004                                 seq_printf(m, "%s ", hwcap_str[j]);
1005
1006                 seq_printf(m, "\nCPU implementer\t: 0x%02x\n", cpuid >> 24);
1007                 seq_printf(m, "CPU architecture: %s\n",
1008                            proc_arch[cpu_architecture()]);
1009
1010                 if ((cpuid & 0x0008f000) == 0x00000000) {
1011                         /* pre-ARM7 */
1012                         seq_printf(m, "CPU part\t: %07x\n", cpuid >> 4);
1013                 } else {
1014                         if ((cpuid & 0x0008f000) == 0x00007000) {
1015                                 /* ARM7 */
1016                                 seq_printf(m, "CPU variant\t: 0x%02x\n",
1017                                            (cpuid >> 16) & 127);
1018                         } else {
1019                                 /* post-ARM7 */
1020                                 seq_printf(m, "CPU variant\t: 0x%x\n",
1021                                            (cpuid >> 20) & 15);
1022                         }
1023                         seq_printf(m, "CPU part\t: 0x%03x\n",
1024                                    (cpuid >> 4) & 0xfff);
1025                 }
1026                 seq_printf(m, "CPU revision\t: %d\n\n", cpuid & 15);
1027         }
1028
1029         seq_printf(m, "Hardware\t: %s\n", machine_name);
1030         seq_printf(m, "Revision\t: %04x\n", system_rev);
1031         seq_printf(m, "Serial\t\t: %08x%08x\n",
1032                    system_serial_high, system_serial_low);
1033
1034         return 0;
1035 }
1036
1037 static void *c_start(struct seq_file *m, loff_t *pos)
1038 {
1039         return *pos < 1 ? (void *)1 : NULL;
1040 }
1041
1042 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
1043 {
1044         ++*pos;
1045         return NULL;
1046 }
1047
1048 static void c_stop(struct seq_file *m, void *v)
1049 {
1050 }
1051
1052 const struct seq_operations cpuinfo_op = {
1053         .start  = c_start,
1054         .next   = c_next,
1055         .stop   = c_stop,
1056         .show   = c_show
1057 };