]> git.karo-electronics.de Git - karo-tx-linux.git/blob - arch/arm64/kernel/setup.c
82ae8429baf216efe52281cc9689c5cd1d74e208
[karo-tx-linux.git] / arch / arm64 / kernel / setup.c
1 /*
2  * Based on arch/arm/kernel/setup.c
3  *
4  * Copyright (C) 1995-2001 Russell King
5  * Copyright (C) 2012 ARM Ltd.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #include <linux/acpi.h>
21 #include <linux/export.h>
22 #include <linux/kernel.h>
23 #include <linux/stddef.h>
24 #include <linux/ioport.h>
25 #include <linux/delay.h>
26 #include <linux/utsname.h>
27 #include <linux/initrd.h>
28 #include <linux/console.h>
29 #include <linux/cache.h>
30 #include <linux/bootmem.h>
31 #include <linux/seq_file.h>
32 #include <linux/screen_info.h>
33 #include <linux/init.h>
34 #include <linux/kexec.h>
35 #include <linux/crash_dump.h>
36 #include <linux/root_dev.h>
37 #include <linux/clk-provider.h>
38 #include <linux/cpu.h>
39 #include <linux/interrupt.h>
40 #include <linux/smp.h>
41 #include <linux/fs.h>
42 #include <linux/proc_fs.h>
43 #include <linux/memblock.h>
44 #include <linux/of_iommu.h>
45 #include <linux/of_fdt.h>
46 #include <linux/of_platform.h>
47 #include <linux/efi.h>
48 #include <linux/personality.h>
49
50 #include <asm/acpi.h>
51 #include <asm/fixmap.h>
52 #include <asm/cpu.h>
53 #include <asm/cputype.h>
54 #include <asm/elf.h>
55 #include <asm/cpufeature.h>
56 #include <asm/cpu_ops.h>
57 #include <asm/sections.h>
58 #include <asm/setup.h>
59 #include <asm/smp_plat.h>
60 #include <asm/cacheflush.h>
61 #include <asm/tlbflush.h>
62 #include <asm/traps.h>
63 #include <asm/memblock.h>
64 #include <asm/psci.h>
65 #include <asm/efi.h>
66 #include <asm/virt.h>
67 #include <asm/xen/hypervisor.h>
68
69 unsigned long elf_hwcap __read_mostly;
70 EXPORT_SYMBOL_GPL(elf_hwcap);
71
72 #ifdef CONFIG_COMPAT
73 #define COMPAT_ELF_HWCAP_DEFAULT        \
74                                 (COMPAT_HWCAP_HALF|COMPAT_HWCAP_THUMB|\
75                                  COMPAT_HWCAP_FAST_MULT|COMPAT_HWCAP_EDSP|\
76                                  COMPAT_HWCAP_TLS|COMPAT_HWCAP_VFP|\
77                                  COMPAT_HWCAP_VFPv3|COMPAT_HWCAP_VFPv4|\
78                                  COMPAT_HWCAP_NEON|COMPAT_HWCAP_IDIV|\
79                                  COMPAT_HWCAP_LPAE)
80 unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT;
81 unsigned int compat_elf_hwcap2 __read_mostly;
82 #endif
83
84 DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
85
86 phys_addr_t __fdt_pointer __initdata;
87
88 /*
89  * Standard memory resources
90  */
91 static struct resource mem_res[] = {
92         {
93                 .name = "Kernel code",
94                 .start = 0,
95                 .end = 0,
96                 .flags = IORESOURCE_MEM
97         },
98         {
99                 .name = "Kernel data",
100                 .start = 0,
101                 .end = 0,
102                 .flags = IORESOURCE_MEM
103         }
104 };
105
106 #define kernel_code mem_res[0]
107 #define kernel_data mem_res[1]
108
109 /*
110  * The recorded values of x0 .. x3 upon kernel entry.
111  */
112 u64 __cacheline_aligned boot_args[4];
113
114 void __init smp_setup_processor_id(void)
115 {
116         u64 mpidr = read_cpuid_mpidr() & MPIDR_HWID_BITMASK;
117         cpu_logical_map(0) = mpidr;
118
119         /*
120          * clear __my_cpu_offset on boot CPU to avoid hang caused by
121          * using percpu variable early, for example, lockdep will
122          * access percpu variable inside lock_release
123          */
124         set_my_cpu_offset(0);
125         pr_info("Booting Linux on physical CPU 0x%lx\n", (unsigned long)mpidr);
126 }
127
128 bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
129 {
130         return phys_id == cpu_logical_map(cpu);
131 }
132
133 struct mpidr_hash mpidr_hash;
134 /**
135  * smp_build_mpidr_hash - Pre-compute shifts required at each affinity
136  *                        level in order to build a linear index from an
137  *                        MPIDR value. Resulting algorithm is a collision
138  *                        free hash carried out through shifting and ORing
139  */
140 static void __init smp_build_mpidr_hash(void)
141 {
142         u32 i, affinity, fs[4], bits[4], ls;
143         u64 mask = 0;
144         /*
145          * Pre-scan the list of MPIDRS and filter out bits that do
146          * not contribute to affinity levels, ie they never toggle.
147          */
148         for_each_possible_cpu(i)
149                 mask |= (cpu_logical_map(i) ^ cpu_logical_map(0));
150         pr_debug("mask of set bits %#llx\n", mask);
151         /*
152          * Find and stash the last and first bit set at all affinity levels to
153          * check how many bits are required to represent them.
154          */
155         for (i = 0; i < 4; i++) {
156                 affinity = MPIDR_AFFINITY_LEVEL(mask, i);
157                 /*
158                  * Find the MSB bit and LSB bits position
159                  * to determine how many bits are required
160                  * to express the affinity level.
161                  */
162                 ls = fls(affinity);
163                 fs[i] = affinity ? ffs(affinity) - 1 : 0;
164                 bits[i] = ls - fs[i];
165         }
166         /*
167          * An index can be created from the MPIDR_EL1 by isolating the
168          * significant bits at each affinity level and by shifting
169          * them in order to compress the 32 bits values space to a
170          * compressed set of values. This is equivalent to hashing
171          * the MPIDR_EL1 through shifting and ORing. It is a collision free
172          * hash though not minimal since some levels might contain a number
173          * of CPUs that is not an exact power of 2 and their bit
174          * representation might contain holes, eg MPIDR_EL1[7:0] = {0x2, 0x80}.
175          */
176         mpidr_hash.shift_aff[0] = MPIDR_LEVEL_SHIFT(0) + fs[0];
177         mpidr_hash.shift_aff[1] = MPIDR_LEVEL_SHIFT(1) + fs[1] - bits[0];
178         mpidr_hash.shift_aff[2] = MPIDR_LEVEL_SHIFT(2) + fs[2] -
179                                                 (bits[1] + bits[0]);
180         mpidr_hash.shift_aff[3] = MPIDR_LEVEL_SHIFT(3) +
181                                   fs[3] - (bits[2] + bits[1] + bits[0]);
182         mpidr_hash.mask = mask;
183         mpidr_hash.bits = bits[3] + bits[2] + bits[1] + bits[0];
184         pr_debug("MPIDR hash: aff0[%u] aff1[%u] aff2[%u] aff3[%u] mask[%#llx] bits[%u]\n",
185                 mpidr_hash.shift_aff[0],
186                 mpidr_hash.shift_aff[1],
187                 mpidr_hash.shift_aff[2],
188                 mpidr_hash.shift_aff[3],
189                 mpidr_hash.mask,
190                 mpidr_hash.bits);
191         /*
192          * 4x is an arbitrary value used to warn on a hash table much bigger
193          * than expected on most systems.
194          */
195         if (mpidr_hash_size() > 4 * num_possible_cpus())
196                 pr_warn("Large number of MPIDR hash buckets detected\n");
197         __flush_dcache_area(&mpidr_hash, sizeof(struct mpidr_hash));
198 }
199
200 static void __init hyp_mode_check(void)
201 {
202         if (is_hyp_mode_available())
203                 pr_info("CPU: All CPU(s) started at EL2\n");
204         else if (is_hyp_mode_mismatched())
205                 WARN_TAINT(1, TAINT_CPU_OUT_OF_SPEC,
206                            "CPU: CPUs started in inconsistent modes");
207         else
208                 pr_info("CPU: All CPU(s) started at EL1\n");
209 }
210
211 void __init do_post_cpus_up_work(void)
212 {
213         hyp_mode_check();
214         apply_alternatives_all();
215 }
216
217 #ifdef CONFIG_UP_LATE_INIT
218 void __init up_late_init(void)
219 {
220         do_post_cpus_up_work();
221 }
222 #endif /* CONFIG_UP_LATE_INIT */
223
224 static void __init setup_processor(void)
225 {
226         u64 features, block;
227         u32 cwg;
228         int cls;
229
230         printk("CPU: AArch64 Processor [%08x] revision %d\n",
231                read_cpuid_id(), read_cpuid_id() & 15);
232
233         sprintf(init_utsname()->machine, ELF_PLATFORM);
234         elf_hwcap = 0;
235
236         cpuinfo_store_boot_cpu();
237
238         /*
239          * Check for sane CTR_EL0.CWG value.
240          */
241         cwg = cache_type_cwg();
242         cls = cache_line_size();
243         if (!cwg)
244                 pr_warn("No Cache Writeback Granule information, assuming cache line size %d\n",
245                         cls);
246         if (L1_CACHE_BYTES < cls)
247                 pr_warn("L1_CACHE_BYTES smaller than the Cache Writeback Granule (%d < %d)\n",
248                         L1_CACHE_BYTES, cls);
249
250         /*
251          * ID_AA64ISAR0_EL1 contains 4-bit wide signed feature blocks.
252          * The blocks we test below represent incremental functionality
253          * for non-negative values. Negative values are reserved.
254          */
255         features = read_cpuid(ID_AA64ISAR0_EL1);
256         block = (features >> 4) & 0xf;
257         if (!(block & 0x8)) {
258                 switch (block) {
259                 default:
260                 case 2:
261                         elf_hwcap |= HWCAP_PMULL;
262                 case 1:
263                         elf_hwcap |= HWCAP_AES;
264                 case 0:
265                         break;
266                 }
267         }
268
269         block = (features >> 8) & 0xf;
270         if (block && !(block & 0x8))
271                 elf_hwcap |= HWCAP_SHA1;
272
273         block = (features >> 12) & 0xf;
274         if (block && !(block & 0x8))
275                 elf_hwcap |= HWCAP_SHA2;
276
277         block = (features >> 16) & 0xf;
278         if (block && !(block & 0x8))
279                 elf_hwcap |= HWCAP_CRC32;
280
281         block = (features >> 20) & 0xf;
282         if (!(block & 0x8)) {
283                 switch (block) {
284                 default:
285                 case 2:
286                         elf_hwcap |= HWCAP_ATOMICS;
287                         cpus_set_cap(ARM64_HAS_LSE_ATOMICS);
288                         if (IS_ENABLED(CONFIG_AS_LSE) &&
289                             IS_ENABLED(CONFIG_ARM64_LSE_ATOMICS))
290                                 pr_info("LSE atomics supported\n");
291                 case 1:
292                         /* RESERVED */
293                 case 0:
294                         break;
295                 }
296         }
297
298 #ifdef CONFIG_COMPAT
299         /*
300          * ID_ISAR5_EL1 carries similar information as above, but pertaining to
301          * the Aarch32 32-bit execution state.
302          */
303         features = read_cpuid(ID_ISAR5_EL1);
304         block = (features >> 4) & 0xf;
305         if (!(block & 0x8)) {
306                 switch (block) {
307                 default:
308                 case 2:
309                         compat_elf_hwcap2 |= COMPAT_HWCAP2_PMULL;
310                 case 1:
311                         compat_elf_hwcap2 |= COMPAT_HWCAP2_AES;
312                 case 0:
313                         break;
314                 }
315         }
316
317         block = (features >> 8) & 0xf;
318         if (block && !(block & 0x8))
319                 compat_elf_hwcap2 |= COMPAT_HWCAP2_SHA1;
320
321         block = (features >> 12) & 0xf;
322         if (block && !(block & 0x8))
323                 compat_elf_hwcap2 |= COMPAT_HWCAP2_SHA2;
324
325         block = (features >> 16) & 0xf;
326         if (block && !(block & 0x8))
327                 compat_elf_hwcap2 |= COMPAT_HWCAP2_CRC32;
328 #endif
329 }
330
331 static void __init setup_machine_fdt(phys_addr_t dt_phys)
332 {
333         void *dt_virt = fixmap_remap_fdt(dt_phys);
334
335         if (!dt_virt || !early_init_dt_scan(dt_virt)) {
336                 pr_crit("\n"
337                         "Error: invalid device tree blob at physical address %pa (virtual address 0x%p)\n"
338                         "The dtb must be 8-byte aligned and must not exceed 2 MB in size\n"
339                         "\nPlease check your bootloader.",
340                         &dt_phys, dt_virt);
341
342                 while (true)
343                         cpu_relax();
344         }
345
346         dump_stack_set_arch_desc("%s (DT)", of_flat_dt_get_machine_name());
347 }
348
349 static void __init request_standard_resources(void)
350 {
351         struct memblock_region *region;
352         struct resource *res;
353
354         kernel_code.start   = virt_to_phys(_text);
355         kernel_code.end     = virt_to_phys(_etext - 1);
356         kernel_data.start   = virt_to_phys(_sdata);
357         kernel_data.end     = virt_to_phys(_end - 1);
358
359         for_each_memblock(memory, region) {
360                 res = alloc_bootmem_low(sizeof(*res));
361                 res->name  = "System RAM";
362                 res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
363                 res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
364                 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
365
366                 request_resource(&iomem_resource, res);
367
368                 if (kernel_code.start >= res->start &&
369                     kernel_code.end <= res->end)
370                         request_resource(res, &kernel_code);
371                 if (kernel_data.start >= res->start &&
372                     kernel_data.end <= res->end)
373                         request_resource(res, &kernel_data);
374         }
375 }
376
377 u64 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = INVALID_HWID };
378
379 void __init setup_arch(char **cmdline_p)
380 {
381         setup_processor();
382
383         init_mm.start_code = (unsigned long) _text;
384         init_mm.end_code   = (unsigned long) _etext;
385         init_mm.end_data   = (unsigned long) _edata;
386         init_mm.brk        = (unsigned long) _end;
387
388         *cmdline_p = boot_command_line;
389
390         early_fixmap_init();
391         early_ioremap_init();
392
393         setup_machine_fdt(__fdt_pointer);
394
395         parse_early_param();
396
397         /*
398          *  Unmask asynchronous aborts after bringing up possible earlycon.
399          * (Report possible System Errors once we can report this occurred)
400          */
401         local_async_enable();
402
403         efi_init();
404         arm64_memblock_init();
405
406         /* Parse the ACPI tables for possible boot-time configuration */
407         acpi_boot_table_init();
408
409         paging_init();
410         request_standard_resources();
411
412         early_ioremap_reset();
413
414         if (acpi_disabled) {
415                 unflatten_device_tree();
416                 psci_dt_init();
417         } else {
418                 psci_acpi_init();
419         }
420         xen_early_init();
421
422         cpu_read_bootcpu_ops();
423         smp_init_cpus();
424         smp_build_mpidr_hash();
425
426 #ifdef CONFIG_VT
427 #if defined(CONFIG_VGA_CONSOLE)
428         conswitchp = &vga_con;
429 #elif defined(CONFIG_DUMMY_CONSOLE)
430         conswitchp = &dummy_con;
431 #endif
432 #endif
433         if (boot_args[1] || boot_args[2] || boot_args[3]) {
434                 pr_err("WARNING: x1-x3 nonzero in violation of boot protocol:\n"
435                         "\tx1: %016llx\n\tx2: %016llx\n\tx3: %016llx\n"
436                         "This indicates a broken bootloader or old kernel\n",
437                         boot_args[1], boot_args[2], boot_args[3]);
438         }
439 }
440
441 static int __init arm64_device_init(void)
442 {
443         if (of_have_populated_dt()) {
444                 of_iommu_init();
445                 of_platform_populate(NULL, of_default_bus_match_table,
446                                      NULL, NULL);
447         } else if (acpi_disabled) {
448                 pr_crit("Device tree not populated\n");
449         }
450         return 0;
451 }
452 arch_initcall_sync(arm64_device_init);
453
454 static int __init topology_init(void)
455 {
456         int i;
457
458         for_each_possible_cpu(i) {
459                 struct cpu *cpu = &per_cpu(cpu_data.cpu, i);
460                 cpu->hotpluggable = 1;
461                 register_cpu(cpu, i);
462         }
463
464         return 0;
465 }
466 subsys_initcall(topology_init);
467
468 static const char *hwcap_str[] = {
469         "fp",
470         "asimd",
471         "evtstrm",
472         "aes",
473         "pmull",
474         "sha1",
475         "sha2",
476         "crc32",
477         "atomics",
478         NULL
479 };
480
481 #ifdef CONFIG_COMPAT
482 static const char *compat_hwcap_str[] = {
483         "swp",
484         "half",
485         "thumb",
486         "26bit",
487         "fastmult",
488         "fpa",
489         "vfp",
490         "edsp",
491         "java",
492         "iwmmxt",
493         "crunch",
494         "thumbee",
495         "neon",
496         "vfpv3",
497         "vfpv3d16",
498         "tls",
499         "vfpv4",
500         "idiva",
501         "idivt",
502         "vfpd32",
503         "lpae",
504         "evtstrm"
505 };
506
507 static const char *compat_hwcap2_str[] = {
508         "aes",
509         "pmull",
510         "sha1",
511         "sha2",
512         "crc32",
513         NULL
514 };
515 #endif /* CONFIG_COMPAT */
516
517 static int c_show(struct seq_file *m, void *v)
518 {
519         int i, j;
520
521         for_each_online_cpu(i) {
522                 struct cpuinfo_arm64 *cpuinfo = &per_cpu(cpu_data, i);
523                 u32 midr = cpuinfo->reg_midr;
524
525                 /*
526                  * glibc reads /proc/cpuinfo to determine the number of
527                  * online processors, looking for lines beginning with
528                  * "processor".  Give glibc what it expects.
529                  */
530                 seq_printf(m, "processor\t: %d\n", i);
531
532                 /*
533                  * Dump out the common processor features in a single line.
534                  * Userspace should read the hwcaps with getauxval(AT_HWCAP)
535                  * rather than attempting to parse this, but there's a body of
536                  * software which does already (at least for 32-bit).
537                  */
538                 seq_puts(m, "Features\t:");
539                 if (personality(current->personality) == PER_LINUX32) {
540 #ifdef CONFIG_COMPAT
541                         for (j = 0; compat_hwcap_str[j]; j++)
542                                 if (compat_elf_hwcap & (1 << j))
543                                         seq_printf(m, " %s", compat_hwcap_str[j]);
544
545                         for (j = 0; compat_hwcap2_str[j]; j++)
546                                 if (compat_elf_hwcap2 & (1 << j))
547                                         seq_printf(m, " %s", compat_hwcap2_str[j]);
548 #endif /* CONFIG_COMPAT */
549                 } else {
550                         for (j = 0; hwcap_str[j]; j++)
551                                 if (elf_hwcap & (1 << j))
552                                         seq_printf(m, " %s", hwcap_str[j]);
553                 }
554                 seq_puts(m, "\n");
555
556                 seq_printf(m, "CPU implementer\t: 0x%02x\n",
557                            MIDR_IMPLEMENTOR(midr));
558                 seq_printf(m, "CPU architecture: 8\n");
559                 seq_printf(m, "CPU variant\t: 0x%x\n", MIDR_VARIANT(midr));
560                 seq_printf(m, "CPU part\t: 0x%03x\n", MIDR_PARTNUM(midr));
561                 seq_printf(m, "CPU revision\t: %d\n\n", MIDR_REVISION(midr));
562         }
563
564         return 0;
565 }
566
567 static void *c_start(struct seq_file *m, loff_t *pos)
568 {
569         return *pos < 1 ? (void *)1 : NULL;
570 }
571
572 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
573 {
574         ++*pos;
575         return NULL;
576 }
577
578 static void c_stop(struct seq_file *m, void *v)
579 {
580 }
581
582 const struct seq_operations cpuinfo_op = {
583         .start  = c_start,
584         .next   = c_next,
585         .stop   = c_stop,
586         .show   = c_show
587 };