diff options
Diffstat (limited to 'arch/arm/kernel/setup.c')
| -rw-r--r-- | arch/arm/kernel/setup.c | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 4de432ec903a..bf56eb337df1 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/interrupt.h> | 24 | #include <linux/interrupt.h> |
| 25 | #include <linux/smp.h> | 25 | #include <linux/smp.h> |
| 26 | #include <linux/fs.h> | 26 | #include <linux/fs.h> |
| 27 | #include <linux/kexec.h> | ||
| 27 | 28 | ||
| 28 | #include <asm/cpu.h> | 29 | #include <asm/cpu.h> |
| 29 | #include <asm/elf.h> | 30 | #include <asm/elf.h> |
| @@ -304,10 +305,23 @@ int cpu_architecture(void) | |||
| 304 | cpu_arch = (processor_id >> 16) & 7; | 305 | cpu_arch = (processor_id >> 16) & 7; |
| 305 | if (cpu_arch) | 306 | if (cpu_arch) |
| 306 | cpu_arch += CPU_ARCH_ARMv3; | 307 | cpu_arch += CPU_ARCH_ARMv3; |
| 307 | } else { | 308 | } else if ((processor_id & 0x000f0000) == 0x000f0000) { |
| 308 | /* the revised CPUID */ | 309 | unsigned int mmfr0; |
| 309 | cpu_arch = ((processor_id >> 12) & 0xf) - 0xb + CPU_ARCH_ARMv6; | 310 | |
| 310 | } | 311 | /* Revised CPUID format. Read the Memory Model Feature |
| 312 | * Register 0 and check for VMSAv7 or PMSAv7 */ | ||
| 313 | asm("mrc p15, 0, %0, c0, c1, 4" | ||
| 314 | : "=r" (mmfr0)); | ||
| 315 | if ((mmfr0 & 0x0000000f) == 0x00000003 || | ||
| 316 | (mmfr0 & 0x000000f0) == 0x00000030) | ||
| 317 | cpu_arch = CPU_ARCH_ARMv7; | ||
| 318 | else if ((mmfr0 & 0x0000000f) == 0x00000002 || | ||
| 319 | (mmfr0 & 0x000000f0) == 0x00000020) | ||
| 320 | cpu_arch = CPU_ARCH_ARMv6; | ||
| 321 | else | ||
| 322 | cpu_arch = CPU_ARCH_UNKNOWN; | ||
| 323 | } else | ||
| 324 | cpu_arch = CPU_ARCH_UNKNOWN; | ||
| 311 | 325 | ||
| 312 | return cpu_arch; | 326 | return cpu_arch; |
| 313 | } | 327 | } |
| @@ -770,6 +784,23 @@ static int __init customize_machine(void) | |||
| 770 | } | 784 | } |
| 771 | arch_initcall(customize_machine); | 785 | arch_initcall(customize_machine); |
| 772 | 786 | ||
| 787 | #ifdef CONFIG_KEXEC | ||
| 788 | |||
| 789 | /* Physical addr of where the boot params should be for this machine */ | ||
| 790 | extern unsigned long kexec_boot_params_address; | ||
| 791 | |||
| 792 | /* Physical addr of the buffer into which the boot params are copied */ | ||
| 793 | extern unsigned long kexec_boot_params_copy; | ||
| 794 | |||
| 795 | /* Pointer to the boot params buffer, for manipulation and display */ | ||
| 796 | unsigned long kexec_boot_params; | ||
| 797 | EXPORT_SYMBOL(kexec_boot_params); | ||
| 798 | |||
| 799 | /* The buffer itself - make sure it is sized correctly */ | ||
| 800 | static unsigned long kexec_boot_params_buf[(KEXEC_BOOT_PARAMS_SIZE + 3) / 4]; | ||
| 801 | |||
| 802 | #endif | ||
| 803 | |||
| 773 | void __init setup_arch(char **cmdline_p) | 804 | void __init setup_arch(char **cmdline_p) |
| 774 | { | 805 | { |
| 775 | struct tag *tags = (struct tag *)&init_tags; | 806 | struct tag *tags = (struct tag *)&init_tags; |
| @@ -788,6 +819,18 @@ void __init setup_arch(char **cmdline_p) | |||
| 788 | else if (mdesc->boot_params) | 819 | else if (mdesc->boot_params) |
| 789 | tags = phys_to_virt(mdesc->boot_params); | 820 | tags = phys_to_virt(mdesc->boot_params); |
| 790 | 821 | ||
| 822 | #ifdef CONFIG_KEXEC | ||
| 823 | kexec_boot_params_copy = virt_to_phys(kexec_boot_params_buf); | ||
| 824 | kexec_boot_params = (unsigned long)kexec_boot_params_buf; | ||
| 825 | if (__atags_pointer) { | ||
| 826 | kexec_boot_params_address = __atags_pointer; | ||
| 827 | memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||
| 828 | } else if (mdesc->boot_params) { | ||
| 829 | kexec_boot_params_address = mdesc->boot_params; | ||
| 830 | memcpy((void *)kexec_boot_params, tags, KEXEC_BOOT_PARAMS_SIZE); | ||
| 831 | } | ||
| 832 | #endif | ||
| 833 | |||
| 791 | /* | 834 | /* |
| 792 | * If we have the old style parameters, convert them to | 835 | * If we have the old style parameters, convert them to |
| 793 | * a tag list. | 836 | * a tag list. |
