xref: /openbmc/linux/arch/arm/kernel/setup.c (revision 3a448205)
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/efi.h>
11 #include <linux/export.h>
12 #include <linux/kernel.h>
13 #include <linux/stddef.h>
14 #include <linux/ioport.h>
15 #include <linux/delay.h>
16 #include <linux/utsname.h>
17 #include <linux/initrd.h>
18 #include <linux/console.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 #include <linux/psci.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/efi.h>
40 #include <asm/elf.h>
41 #include <asm/early_ioremap.h>
42 #include <asm/fixmap.h>
43 #include <asm/procinfo.h>
44 #include <asm/psci.h>
45 #include <asm/sections.h>
46 #include <asm/setup.h>
47 #include <asm/smp_plat.h>
48 #include <asm/mach-types.h>
49 #include <asm/cacheflush.h>
50 #include <asm/cachetype.h>
51 #include <asm/tlbflush.h>
52 #include <asm/xen/hypervisor.h>
53 
54 #include <asm/prom.h>
55 #include <asm/mach/arch.h>
56 #include <asm/mach/irq.h>
57 #include <asm/mach/time.h>
58 #include <asm/system_info.h>
59 #include <asm/system_misc.h>
60 #include <asm/traps.h>
61 #include <asm/unwind.h>
62 #include <asm/memblock.h>
63 #include <asm/virt.h>
64 
65 #include "atags.h"
66 
67 
68 #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE)
69 char fpe_type[8];
70 
71 static int __init fpe_setup(char *line)
72 {
73 	memcpy(fpe_type, line, 8);
74 	return 1;
75 }
76 
77 __setup("fpe=", fpe_setup);
78 #endif
79 
80 extern void init_default_cache_policy(unsigned long);
81 extern void paging_init(const struct machine_desc *desc);
82 extern void early_mm_init(const struct machine_desc *);
83 extern void adjust_lowmem_bounds(void);
84 extern enum reboot_mode reboot_mode;
85 extern void setup_dma_zone(const struct machine_desc *desc);
86 
87 unsigned int processor_id;
88 EXPORT_SYMBOL(processor_id);
89 unsigned int __machine_arch_type __read_mostly;
90 EXPORT_SYMBOL(__machine_arch_type);
91 unsigned int cacheid __read_mostly;
92 EXPORT_SYMBOL(cacheid);
93 
94 unsigned int __atags_pointer __initdata;
95 
96 unsigned int system_rev;
97 EXPORT_SYMBOL(system_rev);
98 
99 const char *system_serial;
100 EXPORT_SYMBOL(system_serial);
101 
102 unsigned int system_serial_low;
103 EXPORT_SYMBOL(system_serial_low);
104 
105 unsigned int system_serial_high;
106 EXPORT_SYMBOL(system_serial_high);
107 
108 unsigned int elf_hwcap __read_mostly;
109 EXPORT_SYMBOL(elf_hwcap);
110 
111 unsigned int elf_hwcap2 __read_mostly;
112 EXPORT_SYMBOL(elf_hwcap2);
113 
114 
115 #ifdef MULTI_CPU
116 struct processor processor __ro_after_init;
117 #if defined(CONFIG_BIG_LITTLE) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR)
118 struct processor *cpu_vtable[NR_CPUS] = {
119 	[0] = &processor,
120 };
121 #endif
122 #endif
123 #ifdef MULTI_TLB
124 struct cpu_tlb_fns cpu_tlb __ro_after_init;
125 #endif
126 #ifdef MULTI_USER
127 struct cpu_user_fns cpu_user __ro_after_init;
128 #endif
129 #ifdef MULTI_CACHE
130 struct cpu_cache_fns cpu_cache __ro_after_init;
131 #endif
132 #ifdef CONFIG_OUTER_CACHE
133 struct outer_cache_fns outer_cache __ro_after_init;
134 EXPORT_SYMBOL(outer_cache);
135 #endif
136 
137 /*
138  * Cached cpu_architecture() result for use by assembler code.
139  * C code should use the cpu_architecture() function instead of accessing this
140  * variable directly.
141  */
142 int __cpu_architecture __read_mostly = CPU_ARCH_UNKNOWN;
143 
144 struct stack {
145 	u32 irq[3];
146 	u32 abt[3];
147 	u32 und[3];
148 	u32 fiq[3];
149 } ____cacheline_aligned;
150 
151 #ifndef CONFIG_CPU_V7M
152 static struct stack stacks[NR_CPUS];
153 #endif
154 
155 char elf_platform[ELF_PLATFORM_SIZE];
156 EXPORT_SYMBOL(elf_platform);
157 
158 static const char *cpu_name;
159 static const char *machine_name;
160 static char __initdata cmd_line[COMMAND_LINE_SIZE];
161 const struct machine_desc *machine_desc __initdata;
162 
163 static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
164 #define ENDIANNESS ((char)endian_test.l)
165 
166 DEFINE_PER_CPU(struct cpuinfo_arm, cpu_data);
167 
168 /*
169  * Standard memory resources
170  */
171 static struct resource mem_res[] = {
172 	{
173 		.name = "Video RAM",
174 		.start = 0,
175 		.end = 0,
176 		.flags = IORESOURCE_MEM
177 	},
178 	{
179 		.name = "Kernel code",
180 		.start = 0,
181 		.end = 0,
182 		.flags = IORESOURCE_SYSTEM_RAM
183 	},
184 	{
185 		.name = "Kernel data",
186 		.start = 0,
187 		.end = 0,
188 		.flags = IORESOURCE_SYSTEM_RAM
189 	}
190 };
191 
192 #define video_ram   mem_res[0]
193 #define kernel_code mem_res[1]
194 #define kernel_data mem_res[2]
195 
196 static struct resource io_res[] = {
197 	{
198 		.name = "reserved",
199 		.start = 0x3bc,
200 		.end = 0x3be,
201 		.flags = IORESOURCE_IO | IORESOURCE_BUSY
202 	},
203 	{
204 		.name = "reserved",
205 		.start = 0x378,
206 		.end = 0x37f,
207 		.flags = IORESOURCE_IO | IORESOURCE_BUSY
208 	},
209 	{
210 		.name = "reserved",
211 		.start = 0x278,
212 		.end = 0x27f,
213 		.flags = IORESOURCE_IO | IORESOURCE_BUSY
214 	}
215 };
216 
217 #define lp0 io_res[0]
218 #define lp1 io_res[1]
219 #define lp2 io_res[2]
220 
221 static const char *proc_arch[] = {
222 	"undefined/unknown",
223 	"3",
224 	"4",
225 	"4T",
226 	"5",
227 	"5T",
228 	"5TE",
229 	"5TEJ",
230 	"6TEJ",
231 	"7",
232 	"7M",
233 	"?(12)",
234 	"?(13)",
235 	"?(14)",
236 	"?(15)",
237 	"?(16)",
238 	"?(17)",
239 };
240 
241 #ifdef CONFIG_CPU_V7M
242 static int __get_cpu_architecture(void)
243 {
244 	return CPU_ARCH_ARMv7M;
245 }
246 #else
247 static int __get_cpu_architecture(void)
248 {
249 	int cpu_arch;
250 
251 	if ((read_cpuid_id() & 0x0008f000) == 0) {
252 		cpu_arch = CPU_ARCH_UNKNOWN;
253 	} else if ((read_cpuid_id() & 0x0008f000) == 0x00007000) {
254 		cpu_arch = (read_cpuid_id() & (1 << 23)) ? CPU_ARCH_ARMv4T : CPU_ARCH_ARMv3;
255 	} else if ((read_cpuid_id() & 0x00080000) == 0x00000000) {
256 		cpu_arch = (read_cpuid_id() >> 16) & 7;
257 		if (cpu_arch)
258 			cpu_arch += CPU_ARCH_ARMv3;
259 	} else if ((read_cpuid_id() & 0x000f0000) == 0x000f0000) {
260 		/* Revised CPUID format. Read the Memory Model Feature
261 		 * Register 0 and check for VMSAv7 or PMSAv7 */
262 		unsigned int mmfr0 = read_cpuid_ext(CPUID_EXT_MMFR0);
263 		if ((mmfr0 & 0x0000000f) >= 0x00000003 ||
264 		    (mmfr0 & 0x000000f0) >= 0x00000030)
265 			cpu_arch = CPU_ARCH_ARMv7;
266 		else if ((mmfr0 & 0x0000000f) == 0x00000002 ||
267 			 (mmfr0 & 0x000000f0) == 0x00000020)
268 			cpu_arch = CPU_ARCH_ARMv6;
269 		else
270 			cpu_arch = CPU_ARCH_UNKNOWN;
271 	} else
272 		cpu_arch = CPU_ARCH_UNKNOWN;
273 
274 	return cpu_arch;
275 }
276 #endif
277 
278 int __pure cpu_architecture(void)
279 {
280 	BUG_ON(__cpu_architecture == CPU_ARCH_UNKNOWN);
281 
282 	return __cpu_architecture;
283 }
284 
285 static int cpu_has_aliasing_icache(unsigned int arch)
286 {
287 	int aliasing_icache;
288 	unsigned int id_reg, num_sets, line_size;
289 
290 	/* PIPT caches never alias. */
291 	if (icache_is_pipt())
292 		return 0;
293 
294 	/* arch specifies the register format */
295 	switch (arch) {
296 	case CPU_ARCH_ARMv7:
297 		set_csselr(CSSELR_ICACHE | CSSELR_L1);
298 		isb();
299 		id_reg = read_ccsidr();
300 		line_size = 4 << ((id_reg & 0x7) + 2);
301 		num_sets = ((id_reg >> 13) & 0x7fff) + 1;
302 		aliasing_icache = (line_size * num_sets) > PAGE_SIZE;
303 		break;
304 	case CPU_ARCH_ARMv6:
305 		aliasing_icache = read_cpuid_cachetype() & (1 << 11);
306 		break;
307 	default:
308 		/* I-cache aliases will be handled by D-cache aliasing code */
309 		aliasing_icache = 0;
310 	}
311 
312 	return aliasing_icache;
313 }
314 
315 static void __init cacheid_init(void)
316 {
317 	unsigned int arch = cpu_architecture();
318 
319 	if (arch >= CPU_ARCH_ARMv6) {
320 		unsigned int cachetype = read_cpuid_cachetype();
321 
322 		if ((arch == CPU_ARCH_ARMv7M) && !(cachetype & 0xf000f)) {
323 			cacheid = 0;
324 		} else if ((cachetype & (7 << 29)) == 4 << 29) {
325 			/* ARMv7 register format */
326 			arch = CPU_ARCH_ARMv7;
327 			cacheid = CACHEID_VIPT_NONALIASING;
328 			switch (cachetype & (3 << 14)) {
329 			case (1 << 14):
330 				cacheid |= CACHEID_ASID_TAGGED;
331 				break;
332 			case (3 << 14):
333 				cacheid |= CACHEID_PIPT;
334 				break;
335 			}
336 		} else {
337 			arch = CPU_ARCH_ARMv6;
338 			if (cachetype & (1 << 23))
339 				cacheid = CACHEID_VIPT_ALIASING;
340 			else
341 				cacheid = CACHEID_VIPT_NONALIASING;
342 		}
343 		if (cpu_has_aliasing_icache(arch))
344 			cacheid |= CACHEID_VIPT_I_ALIASING;
345 	} else {
346 		cacheid = CACHEID_VIVT;
347 	}
348 
349 	pr_info("CPU: %s data cache, %s instruction cache\n",
350 		cache_is_vivt() ? "VIVT" :
351 		cache_is_vipt_aliasing() ? "VIPT aliasing" :
352 		cache_is_vipt_nonaliasing() ? "PIPT / VIPT nonaliasing" : "unknown",
353 		cache_is_vivt() ? "VIVT" :
354 		icache_is_vivt_asid_tagged() ? "VIVT ASID tagged" :
355 		icache_is_vipt_aliasing() ? "VIPT aliasing" :
356 		icache_is_pipt() ? "PIPT" :
357 		cache_is_vipt_nonaliasing() ? "VIPT nonaliasing" : "unknown");
358 }
359 
360 /*
361  * These functions re-use the assembly code in head.S, which
362  * already provide the required functionality.
363  */
364 extern struct proc_info_list *lookup_processor_type(unsigned int);
365 
366 void __init early_print(const char *str, ...)
367 {
368 	extern void printascii(const char *);
369 	char buf[256];
370 	va_list ap;
371 
372 	va_start(ap, str);
373 	vsnprintf(buf, sizeof(buf), str, ap);
374 	va_end(ap);
375 
376 #ifdef CONFIG_DEBUG_LL
377 	printascii(buf);
378 #endif
379 	printk("%s", buf);
380 }
381 
382 #ifdef CONFIG_ARM_PATCH_IDIV
383 
384 static inline u32 __attribute_const__ sdiv_instruction(void)
385 {
386 	if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) {
387 		/* "sdiv r0, r0, r1" */
388 		u32 insn = __opcode_thumb32_compose(0xfb90, 0xf0f1);
389 		return __opcode_to_mem_thumb32(insn);
390 	}
391 
392 	/* "sdiv r0, r0, r1" */
393 	return __opcode_to_mem_arm(0xe710f110);
394 }
395 
396 static inline u32 __attribute_const__ udiv_instruction(void)
397 {
398 	if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) {
399 		/* "udiv r0, r0, r1" */
400 		u32 insn = __opcode_thumb32_compose(0xfbb0, 0xf0f1);
401 		return __opcode_to_mem_thumb32(insn);
402 	}
403 
404 	/* "udiv r0, r0, r1" */
405 	return __opcode_to_mem_arm(0xe730f110);
406 }
407 
408 static inline u32 __attribute_const__ bx_lr_instruction(void)
409 {
410 	if (IS_ENABLED(CONFIG_THUMB2_KERNEL)) {
411 		/* "bx lr; nop" */
412 		u32 insn = __opcode_thumb32_compose(0x4770, 0x46c0);
413 		return __opcode_to_mem_thumb32(insn);
414 	}
415 
416 	/* "bx lr" */
417 	return __opcode_to_mem_arm(0xe12fff1e);
418 }
419 
420 static void __init patch_aeabi_idiv(void)
421 {
422 	extern void __aeabi_uidiv(void);
423 	extern void __aeabi_idiv(void);
424 	uintptr_t fn_addr;
425 	unsigned int mask;
426 
427 	mask = IS_ENABLED(CONFIG_THUMB2_KERNEL) ? HWCAP_IDIVT : HWCAP_IDIVA;
428 	if (!(elf_hwcap & mask))
429 		return;
430 
431 	pr_info("CPU: div instructions available: patching division code\n");
432 
433 	fn_addr = ((uintptr_t)&__aeabi_uidiv) & ~1;
434 	asm ("" : "+g" (fn_addr));
435 	((u32 *)fn_addr)[0] = udiv_instruction();
436 	((u32 *)fn_addr)[1] = bx_lr_instruction();
437 	flush_icache_range(fn_addr, fn_addr + 8);
438 
439 	fn_addr = ((uintptr_t)&__aeabi_idiv) & ~1;
440 	asm ("" : "+g" (fn_addr));
441 	((u32 *)fn_addr)[0] = sdiv_instruction();
442 	((u32 *)fn_addr)[1] = bx_lr_instruction();
443 	flush_icache_range(fn_addr, fn_addr + 8);
444 }
445 
446 #else
447 static inline void patch_aeabi_idiv(void) { }
448 #endif
449 
450 static void __init cpuid_init_hwcaps(void)
451 {
452 	int block;
453 	u32 isar5;
454 
455 	if (cpu_architecture() < CPU_ARCH_ARMv7)
456 		return;
457 
458 	block = cpuid_feature_extract(CPUID_EXT_ISAR0, 24);
459 	if (block >= 2)
460 		elf_hwcap |= HWCAP_IDIVA;
461 	if (block >= 1)
462 		elf_hwcap |= HWCAP_IDIVT;
463 
464 	/* LPAE implies atomic ldrd/strd instructions */
465 	block = cpuid_feature_extract(CPUID_EXT_MMFR0, 0);
466 	if (block >= 5)
467 		elf_hwcap |= HWCAP_LPAE;
468 
469 	/* check for supported v8 Crypto instructions */
470 	isar5 = read_cpuid_ext(CPUID_EXT_ISAR5);
471 
472 	block = cpuid_feature_extract_field(isar5, 4);
473 	if (block >= 2)
474 		elf_hwcap2 |= HWCAP2_PMULL;
475 	if (block >= 1)
476 		elf_hwcap2 |= HWCAP2_AES;
477 
478 	block = cpuid_feature_extract_field(isar5, 8);
479 	if (block >= 1)
480 		elf_hwcap2 |= HWCAP2_SHA1;
481 
482 	block = cpuid_feature_extract_field(isar5, 12);
483 	if (block >= 1)
484 		elf_hwcap2 |= HWCAP2_SHA2;
485 
486 	block = cpuid_feature_extract_field(isar5, 16);
487 	if (block >= 1)
488 		elf_hwcap2 |= HWCAP2_CRC32;
489 }
490 
491 static void __init elf_hwcap_fixup(void)
492 {
493 	unsigned id = read_cpuid_id();
494 
495 	/*
496 	 * HWCAP_TLS is available only on 1136 r1p0 and later,
497 	 * see also kuser_get_tls_init.
498 	 */
499 	if (read_cpuid_part() == ARM_CPU_PART_ARM1136 &&
500 	    ((id >> 20) & 3) == 0) {
501 		elf_hwcap &= ~HWCAP_TLS;
502 		return;
503 	}
504 
505 	/* Verify if CPUID scheme is implemented */
506 	if ((id & 0x000f0000) != 0x000f0000)
507 		return;
508 
509 	/*
510 	 * If the CPU supports LDREX/STREX and LDREXB/STREXB,
511 	 * avoid advertising SWP; it may not be atomic with
512 	 * multiprocessing cores.
513 	 */
514 	if (cpuid_feature_extract(CPUID_EXT_ISAR3, 12) > 1 ||
515 	    (cpuid_feature_extract(CPUID_EXT_ISAR3, 12) == 1 &&
516 	     cpuid_feature_extract(CPUID_EXT_ISAR4, 20) >= 3))
517 		elf_hwcap &= ~HWCAP_SWP;
518 }
519 
520 /*
521  * cpu_init - initialise one CPU.
522  *
523  * cpu_init sets up the per-CPU stacks.
524  */
525 void notrace cpu_init(void)
526 {
527 #ifndef CONFIG_CPU_V7M
528 	unsigned int cpu = smp_processor_id();
529 	struct stack *stk = &stacks[cpu];
530 
531 	if (cpu >= NR_CPUS) {
532 		pr_crit("CPU%u: bad primary CPU number\n", cpu);
533 		BUG();
534 	}
535 
536 	/*
537 	 * This only works on resume and secondary cores. For booting on the
538 	 * boot cpu, smp_prepare_boot_cpu is called after percpu area setup.
539 	 */
540 	set_my_cpu_offset(per_cpu_offset(cpu));
541 
542 	cpu_proc_init();
543 
544 	/*
545 	 * Define the placement constraint for the inline asm directive below.
546 	 * In Thumb-2, msr with an immediate value is not allowed.
547 	 */
548 #ifdef CONFIG_THUMB2_KERNEL
549 #define PLC	"r"
550 #else
551 #define PLC	"I"
552 #endif
553 
554 	/*
555 	 * setup stacks for re-entrant exception handlers
556 	 */
557 	__asm__ (
558 	"msr	cpsr_c, %1\n\t"
559 	"add	r14, %0, %2\n\t"
560 	"mov	sp, r14\n\t"
561 	"msr	cpsr_c, %3\n\t"
562 	"add	r14, %0, %4\n\t"
563 	"mov	sp, r14\n\t"
564 	"msr	cpsr_c, %5\n\t"
565 	"add	r14, %0, %6\n\t"
566 	"mov	sp, r14\n\t"
567 	"msr	cpsr_c, %7\n\t"
568 	"add	r14, %0, %8\n\t"
569 	"mov	sp, r14\n\t"
570 	"msr	cpsr_c, %9"
571 	    :
572 	    : "r" (stk),
573 	      PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
574 	      "I" (offsetof(struct stack, irq[0])),
575 	      PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
576 	      "I" (offsetof(struct stack, abt[0])),
577 	      PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),
578 	      "I" (offsetof(struct stack, und[0])),
579 	      PLC (PSR_F_BIT | PSR_I_BIT | FIQ_MODE),
580 	      "I" (offsetof(struct stack, fiq[0])),
581 	      PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
582 	    : "r14");
583 #endif
584 }
585 
586 u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
587 
588 void __init smp_setup_processor_id(void)
589 {
590 	int i;
591 	u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
592 	u32 cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0);
593 
594 	cpu_logical_map(0) = cpu;
595 	for (i = 1; i < nr_cpu_ids; ++i)
596 		cpu_logical_map(i) = i == cpu ? 0 : i;
597 
598 	/*
599 	 * clear __my_cpu_offset on boot CPU to avoid hang caused by
600 	 * using percpu variable early, for example, lockdep will
601 	 * access percpu variable inside lock_release
602 	 */
603 	set_my_cpu_offset(0);
604 
605 	pr_info("Booting Linux on physical CPU 0x%x\n", mpidr);
606 }
607 
608 struct mpidr_hash mpidr_hash;
609 #ifdef CONFIG_SMP
610 /**
611  * smp_build_mpidr_hash - Pre-compute shifts required at each affinity
612  *			  level in order to build a linear index from an
613  *			  MPIDR value. Resulting algorithm is a collision
614  *			  free hash carried out through shifting and ORing
615  */
616 static void __init smp_build_mpidr_hash(void)
617 {
618 	u32 i, affinity;
619 	u32 fs[3], bits[3], ls, mask = 0;
620 	/*
621 	 * Pre-scan the list of MPIDRS and filter out bits that do
622 	 * not contribute to affinity levels, ie they never toggle.
623 	 */
624 	for_each_possible_cpu(i)
625 		mask |= (cpu_logical_map(i) ^ cpu_logical_map(0));
626 	pr_debug("mask of set bits 0x%x\n", mask);
627 	/*
628 	 * Find and stash the last and first bit set at all affinity levels to
629 	 * check how many bits are required to represent them.
630 	 */
631 	for (i = 0; i < 3; i++) {
632 		affinity = MPIDR_AFFINITY_LEVEL(mask, i);
633 		/*
634 		 * Find the MSB bit and LSB bits position
635 		 * to determine how many bits are required
636 		 * to express the affinity level.
637 		 */
638 		ls = fls(affinity);
639 		fs[i] = affinity ? ffs(affinity) - 1 : 0;
640 		bits[i] = ls - fs[i];
641 	}
642 	/*
643 	 * An index can be created from the MPIDR by isolating the
644 	 * significant bits at each affinity level and by shifting
645 	 * them in order to compress the 24 bits values space to a
646 	 * compressed set of values. This is equivalent to hashing
647 	 * the MPIDR through shifting and ORing. It is a collision free
648 	 * hash though not minimal since some levels might contain a number
649 	 * of CPUs that is not an exact power of 2 and their bit
650 	 * representation might contain holes, eg MPIDR[7:0] = {0x2, 0x80}.
651 	 */
652 	mpidr_hash.shift_aff[0] = fs[0];
653 	mpidr_hash.shift_aff[1] = MPIDR_LEVEL_BITS + fs[1] - bits[0];
654 	mpidr_hash.shift_aff[2] = 2*MPIDR_LEVEL_BITS + fs[2] -
655 						(bits[1] + bits[0]);
656 	mpidr_hash.mask = mask;
657 	mpidr_hash.bits = bits[2] + bits[1] + bits[0];
658 	pr_debug("MPIDR hash: aff0[%u] aff1[%u] aff2[%u] mask[0x%x] bits[%u]\n",
659 				mpidr_hash.shift_aff[0],
660 				mpidr_hash.shift_aff[1],
661 				mpidr_hash.shift_aff[2],
662 				mpidr_hash.mask,
663 				mpidr_hash.bits);
664 	/*
665 	 * 4x is an arbitrary value used to warn on a hash table much bigger
666 	 * than expected on most systems.
667 	 */
668 	if (mpidr_hash_size() > 4 * num_possible_cpus())
669 		pr_warn("Large number of MPIDR hash buckets detected\n");
670 	sync_cache_w(&mpidr_hash);
671 }
672 #endif
673 
674 /*
675  * locate processor in the list of supported processor types.  The linker
676  * builds this table for us from the entries in arch/arm/mm/proc-*.S
677  */
678 struct proc_info_list *lookup_processor(u32 midr)
679 {
680 	struct proc_info_list *list = lookup_processor_type(midr);
681 
682 	if (!list) {
683 		pr_err("CPU%u: configuration botched (ID %08x), CPU halted\n",
684 		       smp_processor_id(), midr);
685 		while (1)
686 		/* can't use cpu_relax() here as it may require MMU setup */;
687 	}
688 
689 	return list;
690 }
691 
692 static void __init setup_processor(void)
693 {
694 	unsigned int midr = read_cpuid_id();
695 	struct proc_info_list *list = lookup_processor(midr);
696 
697 	cpu_name = list->cpu_name;
698 	__cpu_architecture = __get_cpu_architecture();
699 
700 	init_proc_vtable(list->proc);
701 #ifdef MULTI_TLB
702 	cpu_tlb = *list->tlb;
703 #endif
704 #ifdef MULTI_USER
705 	cpu_user = *list->user;
706 #endif
707 #ifdef MULTI_CACHE
708 	cpu_cache = *list->cache;
709 #endif
710 
711 	pr_info("CPU: %s [%08x] revision %d (ARMv%s), cr=%08lx\n",
712 		list->cpu_name, midr, midr & 15,
713 		proc_arch[cpu_architecture()], get_cr());
714 
715 	snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c",
716 		 list->arch_name, ENDIANNESS);
717 	snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
718 		 list->elf_name, ENDIANNESS);
719 	elf_hwcap = list->elf_hwcap;
720 
721 	cpuid_init_hwcaps();
722 	patch_aeabi_idiv();
723 
724 #ifndef CONFIG_ARM_THUMB
725 	elf_hwcap &= ~(HWCAP_THUMB | HWCAP_IDIVT);
726 #endif
727 #ifdef CONFIG_MMU
728 	init_default_cache_policy(list->__cpu_mm_mmu_flags);
729 #endif
730 	erratum_a15_798181_init();
731 
732 	elf_hwcap_fixup();
733 
734 	cacheid_init();
735 	cpu_init();
736 }
737 
738 void __init dump_machine_table(void)
739 {
740 	const struct machine_desc *p;
741 
742 	early_print("Available machine support:\n\nID (hex)\tNAME\n");
743 	for_each_machine_desc(p)
744 		early_print("%08x\t%s\n", p->nr, p->name);
745 
746 	early_print("\nPlease check your kernel config and/or bootloader.\n");
747 
748 	while (true)
749 		/* can't use cpu_relax() here as it may require MMU setup */;
750 }
751 
752 int __init arm_add_memory(u64 start, u64 size)
753 {
754 	u64 aligned_start;
755 
756 	/*
757 	 * Ensure that start/size are aligned to a page boundary.
758 	 * Size is rounded down, start is rounded up.
759 	 */
760 	aligned_start = PAGE_ALIGN(start);
761 	if (aligned_start > start + size)
762 		size = 0;
763 	else
764 		size -= aligned_start - start;
765 
766 #ifndef CONFIG_PHYS_ADDR_T_64BIT
767 	if (aligned_start > ULONG_MAX) {
768 		pr_crit("Ignoring memory at 0x%08llx outside 32-bit physical address space\n",
769 			(long long)start);
770 		return -EINVAL;
771 	}
772 
773 	if (aligned_start + size > ULONG_MAX) {
774 		pr_crit("Truncating memory at 0x%08llx to fit in 32-bit physical address space\n",
775 			(long long)start);
776 		/*
777 		 * To ensure bank->start + bank->size is representable in
778 		 * 32 bits, we use ULONG_MAX as the upper limit rather than 4GB.
779 		 * This means we lose a page after masking.
780 		 */
781 		size = ULONG_MAX - aligned_start;
782 	}
783 #endif
784 
785 	if (aligned_start < PHYS_OFFSET) {
786 		if (aligned_start + size <= PHYS_OFFSET) {
787 			pr_info("Ignoring memory below PHYS_OFFSET: 0x%08llx-0x%08llx\n",
788 				aligned_start, aligned_start + size);
789 			return -EINVAL;
790 		}
791 
792 		pr_info("Ignoring memory below PHYS_OFFSET: 0x%08llx-0x%08llx\n",
793 			aligned_start, (u64)PHYS_OFFSET);
794 
795 		size -= PHYS_OFFSET - aligned_start;
796 		aligned_start = PHYS_OFFSET;
797 	}
798 
799 	start = aligned_start;
800 	size = size & ~(phys_addr_t)(PAGE_SIZE - 1);
801 
802 	/*
803 	 * Check whether this memory region has non-zero size or
804 	 * invalid node number.
805 	 */
806 	if (size == 0)
807 		return -EINVAL;
808 
809 	memblock_add(start, size);
810 	return 0;
811 }
812 
813 /*
814  * Pick out the memory size.  We look for mem=size@start,
815  * where start and size are "size[KkMm]"
816  */
817 
818 static int __init early_mem(char *p)
819 {
820 	static int usermem __initdata = 0;
821 	u64 size;
822 	u64 start;
823 	char *endp;
824 
825 	/*
826 	 * If the user specifies memory size, we
827 	 * blow away any automatically generated
828 	 * size.
829 	 */
830 	if (usermem == 0) {
831 		usermem = 1;
832 		memblock_remove(memblock_start_of_DRAM(),
833 			memblock_end_of_DRAM() - memblock_start_of_DRAM());
834 	}
835 
836 	start = PHYS_OFFSET;
837 	size  = memparse(p, &endp);
838 	if (*endp == '@')
839 		start = memparse(endp + 1, NULL);
840 
841 	arm_add_memory(start, size);
842 
843 	return 0;
844 }
845 early_param("mem", early_mem);
846 
847 static void __init request_standard_resources(const struct machine_desc *mdesc)
848 {
849 	struct memblock_region *region;
850 	struct resource *res;
851 
852 	kernel_code.start   = virt_to_phys(_text);
853 	kernel_code.end     = virt_to_phys(__init_begin - 1);
854 	kernel_data.start   = virt_to_phys(_sdata);
855 	kernel_data.end     = virt_to_phys(_end - 1);
856 
857 	for_each_memblock(memory, region) {
858 		phys_addr_t start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
859 		phys_addr_t end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
860 		unsigned long boot_alias_start;
861 
862 		/*
863 		 * Some systems have a special memory alias which is only
864 		 * used for booting.  We need to advertise this region to
865 		 * kexec-tools so they know where bootable RAM is located.
866 		 */
867 		boot_alias_start = phys_to_idmap(start);
868 		if (arm_has_idmap_alias() && boot_alias_start != IDMAP_INVALID_ADDR) {
869 			res = memblock_alloc(sizeof(*res), SMP_CACHE_BYTES);
870 			res->name = "System RAM (boot alias)";
871 			res->start = boot_alias_start;
872 			res->end = phys_to_idmap(end);
873 			res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
874 			request_resource(&iomem_resource, res);
875 		}
876 
877 		res = memblock_alloc(sizeof(*res), SMP_CACHE_BYTES);
878 		res->name  = "System RAM";
879 		res->start = start;
880 		res->end = end;
881 		res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
882 
883 		request_resource(&iomem_resource, res);
884 
885 		if (kernel_code.start >= res->start &&
886 		    kernel_code.end <= res->end)
887 			request_resource(res, &kernel_code);
888 		if (kernel_data.start >= res->start &&
889 		    kernel_data.end <= res->end)
890 			request_resource(res, &kernel_data);
891 	}
892 
893 	if (mdesc->video_start) {
894 		video_ram.start = mdesc->video_start;
895 		video_ram.end   = mdesc->video_end;
896 		request_resource(&iomem_resource, &video_ram);
897 	}
898 
899 	/*
900 	 * Some machines don't have the possibility of ever
901 	 * possessing lp0, lp1 or lp2
902 	 */
903 	if (mdesc->reserve_lp0)
904 		request_resource(&ioport_resource, &lp0);
905 	if (mdesc->reserve_lp1)
906 		request_resource(&ioport_resource, &lp1);
907 	if (mdesc->reserve_lp2)
908 		request_resource(&ioport_resource, &lp2);
909 }
910 
911 #if defined(CONFIG_VGA_CONSOLE) || defined(CONFIG_DUMMY_CONSOLE) || \
912     defined(CONFIG_EFI)
913 struct screen_info screen_info = {
914  .orig_video_lines	= 30,
915  .orig_video_cols	= 80,
916  .orig_video_mode	= 0,
917  .orig_video_ega_bx	= 0,
918  .orig_video_isVGA	= 1,
919  .orig_video_points	= 8
920 };
921 #endif
922 
923 static int __init customize_machine(void)
924 {
925 	/*
926 	 * customizes platform devices, or adds new ones
927 	 * On DT based machines, we fall back to populating the
928 	 * machine from the device tree, if no callback is provided,
929 	 * otherwise we would always need an init_machine callback.
930 	 */
931 	if (machine_desc->init_machine)
932 		machine_desc->init_machine();
933 
934 	return 0;
935 }
936 arch_initcall(customize_machine);
937 
938 static int __init init_machine_late(void)
939 {
940 	struct device_node *root;
941 	int ret;
942 
943 	if (machine_desc->init_late)
944 		machine_desc->init_late();
945 
946 	root = of_find_node_by_path("/");
947 	if (root) {
948 		ret = of_property_read_string(root, "serial-number",
949 					      &system_serial);
950 		if (ret)
951 			system_serial = NULL;
952 	}
953 
954 	if (!system_serial)
955 		system_serial = kasprintf(GFP_KERNEL, "%08x%08x",
956 					  system_serial_high,
957 					  system_serial_low);
958 
959 	return 0;
960 }
961 late_initcall(init_machine_late);
962 
963 #ifdef CONFIG_KEXEC
964 /*
965  * The crash region must be aligned to 128MB to avoid
966  * zImage relocating below the reserved region.
967  */
968 #define CRASH_ALIGN	(128 << 20)
969 
970 static inline unsigned long long get_total_mem(void)
971 {
972 	unsigned long total;
973 
974 	total = max_low_pfn - min_low_pfn;
975 	return total << PAGE_SHIFT;
976 }
977 
978 /**
979  * reserve_crashkernel() - reserves memory are for crash kernel
980  *
981  * This function reserves memory area given in "crashkernel=" kernel command
982  * line parameter. The memory reserved is used by a dump capture kernel when
983  * primary kernel is crashing.
984  */
985 static void __init reserve_crashkernel(void)
986 {
987 	unsigned long long crash_size, crash_base;
988 	unsigned long long total_mem;
989 	int ret;
990 
991 	total_mem = get_total_mem();
992 	ret = parse_crashkernel(boot_command_line, total_mem,
993 				&crash_size, &crash_base);
994 	if (ret)
995 		return;
996 
997 	if (crash_base <= 0) {
998 		unsigned long long crash_max = idmap_to_phys((u32)~0);
999 		unsigned long long lowmem_max = __pa(high_memory - 1) + 1;
1000 		if (crash_max > lowmem_max)
1001 			crash_max = lowmem_max;
1002 		crash_base = memblock_find_in_range(CRASH_ALIGN, crash_max,
1003 						    crash_size, CRASH_ALIGN);
1004 		if (!crash_base) {
1005 			pr_err("crashkernel reservation failed - No suitable area found.\n");
1006 			return;
1007 		}
1008 	} else {
1009 		unsigned long long start;
1010 
1011 		start = memblock_find_in_range(crash_base,
1012 					       crash_base + crash_size,
1013 					       crash_size, SECTION_SIZE);
1014 		if (start != crash_base) {
1015 			pr_err("crashkernel reservation failed - memory is in use.\n");
1016 			return;
1017 		}
1018 	}
1019 
1020 	ret = memblock_reserve(crash_base, crash_size);
1021 	if (ret < 0) {
1022 		pr_warn("crashkernel reservation failed - memory is in use (0x%lx)\n",
1023 			(unsigned long)crash_base);
1024 		return;
1025 	}
1026 
1027 	pr_info("Reserving %ldMB of memory at %ldMB for crashkernel (System RAM: %ldMB)\n",
1028 		(unsigned long)(crash_size >> 20),
1029 		(unsigned long)(crash_base >> 20),
1030 		(unsigned long)(total_mem >> 20));
1031 
1032 	/* The crashk resource must always be located in normal mem */
1033 	crashk_res.start = crash_base;
1034 	crashk_res.end = crash_base + crash_size - 1;
1035 	insert_resource(&iomem_resource, &crashk_res);
1036 
1037 	if (arm_has_idmap_alias()) {
1038 		/*
1039 		 * If we have a special RAM alias for use at boot, we
1040 		 * need to advertise to kexec tools where the alias is.
1041 		 */
1042 		static struct resource crashk_boot_res = {
1043 			.name = "Crash kernel (boot alias)",
1044 			.flags = IORESOURCE_BUSY | IORESOURCE_MEM,
1045 		};
1046 
1047 		crashk_boot_res.start = phys_to_idmap(crash_base);
1048 		crashk_boot_res.end = crashk_boot_res.start + crash_size - 1;
1049 		insert_resource(&iomem_resource, &crashk_boot_res);
1050 	}
1051 }
1052 #else
1053 static inline void reserve_crashkernel(void) {}
1054 #endif /* CONFIG_KEXEC */
1055 
1056 void __init hyp_mode_check(void)
1057 {
1058 #ifdef CONFIG_ARM_VIRT_EXT
1059 	sync_boot_mode();
1060 
1061 	if (is_hyp_mode_available()) {
1062 		pr_info("CPU: All CPU(s) started in HYP mode.\n");
1063 		pr_info("CPU: Virtualization extensions available.\n");
1064 	} else if (is_hyp_mode_mismatched()) {
1065 		pr_warn("CPU: WARNING: CPU(s) started in wrong/inconsistent modes (primary CPU mode 0x%x)\n",
1066 			__boot_cpu_mode & MODE_MASK);
1067 		pr_warn("CPU: This may indicate a broken bootloader or firmware.\n");
1068 	} else
1069 		pr_info("CPU: All CPU(s) started in SVC mode.\n");
1070 #endif
1071 }
1072 
1073 void __init setup_arch(char **cmdline_p)
1074 {
1075 	const struct machine_desc *mdesc;
1076 
1077 	setup_processor();
1078 	mdesc = setup_machine_fdt(__atags_pointer);
1079 	if (!mdesc)
1080 		mdesc = setup_machine_tags(__atags_pointer, __machine_arch_type);
1081 	if (!mdesc) {
1082 		early_print("\nError: invalid dtb and unrecognized/unsupported machine ID\n");
1083 		early_print("  r1=0x%08x, r2=0x%08x\n", __machine_arch_type,
1084 			    __atags_pointer);
1085 		if (__atags_pointer)
1086 			early_print("  r2[]=%*ph\n", 16,
1087 				    phys_to_virt(__atags_pointer));
1088 		dump_machine_table();
1089 	}
1090 
1091 	machine_desc = mdesc;
1092 	machine_name = mdesc->name;
1093 	dump_stack_set_arch_desc("%s", mdesc->name);
1094 
1095 	if (mdesc->reboot_mode != REBOOT_HARD)
1096 		reboot_mode = mdesc->reboot_mode;
1097 
1098 	init_mm.start_code = (unsigned long) _text;
1099 	init_mm.end_code   = (unsigned long) _etext;
1100 	init_mm.end_data   = (unsigned long) _edata;
1101 	init_mm.brk	   = (unsigned long) _end;
1102 
1103 	/* populate cmd_line too for later use, preserving boot_command_line */
1104 	strlcpy(cmd_line, boot_command_line, COMMAND_LINE_SIZE);
1105 	*cmdline_p = cmd_line;
1106 
1107 	early_fixmap_init();
1108 	early_ioremap_init();
1109 
1110 	parse_early_param();
1111 
1112 #ifdef CONFIG_MMU
1113 	early_mm_init(mdesc);
1114 #endif
1115 	setup_dma_zone(mdesc);
1116 	xen_early_init();
1117 	efi_init();
1118 	/*
1119 	 * Make sure the calculation for lowmem/highmem is set appropriately
1120 	 * before reserving/allocating any mmeory
1121 	 */
1122 	adjust_lowmem_bounds();
1123 	arm_memblock_init(mdesc);
1124 	/* Memory may have been removed so recalculate the bounds. */
1125 	adjust_lowmem_bounds();
1126 
1127 	early_ioremap_reset();
1128 
1129 	paging_init(mdesc);
1130 	request_standard_resources(mdesc);
1131 
1132 	if (mdesc->restart)
1133 		arm_pm_restart = mdesc->restart;
1134 
1135 	unflatten_device_tree();
1136 
1137 	arm_dt_init_cpu_maps();
1138 	psci_dt_init();
1139 #ifdef CONFIG_SMP
1140 	if (is_smp()) {
1141 		if (!mdesc->smp_init || !mdesc->smp_init()) {
1142 			if (psci_smp_available())
1143 				smp_set_ops(&psci_smp_ops);
1144 			else if (mdesc->smp)
1145 				smp_set_ops(mdesc->smp);
1146 		}
1147 		smp_init_cpus();
1148 		smp_build_mpidr_hash();
1149 	}
1150 #endif
1151 
1152 	if (!is_smp())
1153 		hyp_mode_check();
1154 
1155 	reserve_crashkernel();
1156 
1157 #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER
1158 	handle_arch_irq = mdesc->handle_irq;
1159 #endif
1160 
1161 #ifdef CONFIG_VT
1162 #if defined(CONFIG_VGA_CONSOLE)
1163 	conswitchp = &vga_con;
1164 #elif defined(CONFIG_DUMMY_CONSOLE)
1165 	conswitchp = &dummy_con;
1166 #endif
1167 #endif
1168 
1169 	if (mdesc->init_early)
1170 		mdesc->init_early();
1171 }
1172 
1173 
1174 static int __init topology_init(void)
1175 {
1176 	int cpu;
1177 
1178 	for_each_possible_cpu(cpu) {
1179 		struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu);
1180 		cpuinfo->cpu.hotpluggable = platform_can_hotplug_cpu(cpu);
1181 		register_cpu(&cpuinfo->cpu, cpu);
1182 	}
1183 
1184 	return 0;
1185 }
1186 subsys_initcall(topology_init);
1187 
1188 #ifdef CONFIG_HAVE_PROC_CPU
1189 static int __init proc_cpu_init(void)
1190 {
1191 	struct proc_dir_entry *res;
1192 
1193 	res = proc_mkdir("cpu", NULL);
1194 	if (!res)
1195 		return -ENOMEM;
1196 	return 0;
1197 }
1198 fs_initcall(proc_cpu_init);
1199 #endif
1200 
1201 static const char *hwcap_str[] = {
1202 	"swp",
1203 	"half",
1204 	"thumb",
1205 	"26bit",
1206 	"fastmult",
1207 	"fpa",
1208 	"vfp",
1209 	"edsp",
1210 	"java",
1211 	"iwmmxt",
1212 	"crunch",
1213 	"thumbee",
1214 	"neon",
1215 	"vfpv3",
1216 	"vfpv3d16",
1217 	"tls",
1218 	"vfpv4",
1219 	"idiva",
1220 	"idivt",
1221 	"vfpd32",
1222 	"lpae",
1223 	"evtstrm",
1224 	NULL
1225 };
1226 
1227 static const char *hwcap2_str[] = {
1228 	"aes",
1229 	"pmull",
1230 	"sha1",
1231 	"sha2",
1232 	"crc32",
1233 	NULL
1234 };
1235 
1236 static int c_show(struct seq_file *m, void *v)
1237 {
1238 	int i, j;
1239 	u32 cpuid;
1240 
1241 	for_each_online_cpu(i) {
1242 		/*
1243 		 * glibc reads /proc/cpuinfo to determine the number of
1244 		 * online processors, looking for lines beginning with
1245 		 * "processor".  Give glibc what it expects.
1246 		 */
1247 		seq_printf(m, "processor\t: %d\n", i);
1248 		cpuid = is_smp() ? per_cpu(cpu_data, i).cpuid : read_cpuid_id();
1249 		seq_printf(m, "model name\t: %s rev %d (%s)\n",
1250 			   cpu_name, cpuid & 15, elf_platform);
1251 
1252 #if defined(CONFIG_SMP)
1253 		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
1254 			   per_cpu(cpu_data, i).loops_per_jiffy / (500000UL/HZ),
1255 			   (per_cpu(cpu_data, i).loops_per_jiffy / (5000UL/HZ)) % 100);
1256 #else
1257 		seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
1258 			   loops_per_jiffy / (500000/HZ),
1259 			   (loops_per_jiffy / (5000/HZ)) % 100);
1260 #endif
1261 		/* dump out the processor features */
1262 		seq_puts(m, "Features\t: ");
1263 
1264 		for (j = 0; hwcap_str[j]; j++)
1265 			if (elf_hwcap & (1 << j))
1266 				seq_printf(m, "%s ", hwcap_str[j]);
1267 
1268 		for (j = 0; hwcap2_str[j]; j++)
1269 			if (elf_hwcap2 & (1 << j))
1270 				seq_printf(m, "%s ", hwcap2_str[j]);
1271 
1272 		seq_printf(m, "\nCPU implementer\t: 0x%02x\n", cpuid >> 24);
1273 		seq_printf(m, "CPU architecture: %s\n",
1274 			   proc_arch[cpu_architecture()]);
1275 
1276 		if ((cpuid & 0x0008f000) == 0x00000000) {
1277 			/* pre-ARM7 */
1278 			seq_printf(m, "CPU part\t: %07x\n", cpuid >> 4);
1279 		} else {
1280 			if ((cpuid & 0x0008f000) == 0x00007000) {
1281 				/* ARM7 */
1282 				seq_printf(m, "CPU variant\t: 0x%02x\n",
1283 					   (cpuid >> 16) & 127);
1284 			} else {
1285 				/* post-ARM7 */
1286 				seq_printf(m, "CPU variant\t: 0x%x\n",
1287 					   (cpuid >> 20) & 15);
1288 			}
1289 			seq_printf(m, "CPU part\t: 0x%03x\n",
1290 				   (cpuid >> 4) & 0xfff);
1291 		}
1292 		seq_printf(m, "CPU revision\t: %d\n\n", cpuid & 15);
1293 	}
1294 
1295 	seq_printf(m, "Hardware\t: %s\n", machine_name);
1296 	seq_printf(m, "Revision\t: %04x\n", system_rev);
1297 	seq_printf(m, "Serial\t\t: %s\n", system_serial);
1298 
1299 	return 0;
1300 }
1301 
1302 static void *c_start(struct seq_file *m, loff_t *pos)
1303 {
1304 	return *pos < 1 ? (void *)1 : NULL;
1305 }
1306 
1307 static void *c_next(struct seq_file *m, void *v, loff_t *pos)
1308 {
1309 	++*pos;
1310 	return NULL;
1311 }
1312 
1313 static void c_stop(struct seq_file *m, void *v)
1314 {
1315 }
1316 
1317 const struct seq_operations cpuinfo_op = {
1318 	.start	= c_start,
1319 	.next	= c_next,
1320 	.stop	= c_stop,
1321 	.show	= c_show
1322 };
1323