diff options
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/devtree.c | 7 | ||||
-rw-r--r-- | arch/arm/kernel/process.c | 8 | ||||
-rw-r--r-- | arch/arm/kernel/setup.c | 32 | ||||
-rw-r--r-- | arch/arm/kernel/topology.c | 50 |
4 files changed, 81 insertions, 16 deletions
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index f35906b3d8c9..b231510db238 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c @@ -26,6 +26,10 @@ #include <asm/mach/arch.h> #include <asm/mach-types.h> +#ifdef CONFIG_ACPI +#include <asm/acpi.h> +#endif + void __init early_init_dt_add_memory_arch(u64 base, u64 size) { arm_add_memory(base, size); @@ -242,6 +246,9 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) /* Retrieve various information from the /chosen node */ of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line); +#ifdef CONFIG_ACPI + of_scan_flat_dt(early_init_dt_scan_acpi, &acpi_arm_rsdp_info); +#endif /* Initialize {size,address}-cells info */ of_scan_flat_dt(early_init_dt_scan_root, NULL); /* Setup memory, calling early_init_dt_add_memory_arch */ diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 94f6b05f9e24..a12fad01e478 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -507,3 +507,11 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) return ret; } #endif + +#ifdef CONFIG_ACPI + +unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE; +EXPORT_SYMBOL(boot_option_idle_override); + +#endif + diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 1df531eeca78..b0a18c7a9c9c 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -31,6 +31,9 @@ #include <linux/compiler.h> #include <linux/sort.h> #include <linux/efi.h> +#ifdef CONFIG_ACPI +#include <linux/acpi.h> +#endif #include <asm/unified.h> #include <asm/cp15.h> @@ -62,7 +65,6 @@ #include "atags.h" - #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE) char fpe_type[8]; @@ -888,10 +890,23 @@ void __init setup_arch(char **cmdline_p) sanity_check_meminfo(); arm_memblock_init(&meminfo, mdesc); +#ifdef CONFIG_ACPI + arm_acpi_reserve_memory(); +#endif + #ifdef CONFIG_EFI efi_memblock_arm_reserve_range(); #endif +#ifdef CONFIG_ACPI + /* + * Parse the ACPI tables for possible boot-time configuration + */ + acpi_boot_table_init(); + early_acpi_boot_init(); + acpi_boot_init(); +#endif + paging_init(mdesc); request_standard_resources(mdesc); @@ -936,21 +951,6 @@ void __init setup_arch(char **cmdline_p) mdesc->init_early(); } - -static int __init topology_init(void) -{ - int cpu; - - for_each_possible_cpu(cpu) { - struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu); - cpuinfo->cpu.hotpluggable = 1; - register_cpu(&cpuinfo->cpu, cpu); - } - - return 0; -} -subsys_initcall(topology_init); - #ifdef CONFIG_HAVE_PROC_CPU static int __init proc_cpu_init(void) { diff --git a/arch/arm/kernel/topology.c b/arch/arm/kernel/topology.c index 77c06ad0fb5b..e89426e5ab3f 100644 --- a/arch/arm/kernel/topology.c +++ b/arch/arm/kernel/topology.c @@ -24,6 +24,7 @@ #include <asm/cputype.h> #include <asm/topology.h> +#include <asm/cpu.h> /* * cpu power scale management @@ -266,6 +267,17 @@ void store_cpu_topology(unsigned int cpuid) cpu_topology[cpuid].socket_id, mpidr); } +void arch_fix_phys_package_id(int num, u32 slot) +{ +#ifdef CONFIG_SMP + struct cputopo_arm *cpuid_topo = &cpu_topology[num]; + + if (cpuid_topo->socket_id == -1) + cpuid_topo->socket_id = slot; +#endif +} +EXPORT_SYMBOL_GPL(arch_fix_phys_package_id); + /* * cluster_to_logical_mask - return cpu logical mask of CPUs in a cluster * @socket_id: cluster HW identifier @@ -317,3 +329,41 @@ void __init init_cpu_topology(void) parse_dt_topology(); } + +#ifdef CONFIG_HOTPLUG_CPU +int __ref arch_register_cpu(int cpu) +{ + struct cpuinfo_arm *cpuinfo = &per_cpu(cpu_data, cpu); + + /* BSP cann't be taken down on arm */ + if (cpu) + cpuinfo->cpu.hotpluggable = 1; + + return register_cpu(&cpuinfo->cpu, cpu); +} +EXPORT_SYMBOL(arch_register_cpu); + +void arch_unregister_cpu(int cpu) +{ + unregister_cpu(&per_cpu(cpu_data, cpu).cpu); +} +EXPORT_SYMBOL(arch_unregister_cpu); +#else /* CONFIG_HOTPLUG_CPU */ + +static int __init arch_register_cpu(int cpu) +{ + return register_cpu(&per_cpu(cpu_data, cpu).cpu, cpu); +} +#endif /* CONFIG_HOTPLUG_CPU */ + +static int __init topology_init(void) +{ + int cpu; + + for_each_present_cpu(cpu) + arch_register_cpu(cpu); + + return 0; +} +subsys_initcall(topology_init); + |