Linux Audio

Check our new training course

Yocto / OpenEmbedded training

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