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