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