mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 21:30:54 +07:00
ARM: EXYNOS: Move code from hotplug.c to platsmp.c
Cleanup a little the SMP/hotplug code for Exynos by:
1. Moving completely all functions from hotplug.c into the platsmp.c;
2. Deleting the hotplug.c file.
After recent cleanups (e.g. 75ad2ab28f
"ARM: EXYNOS: use
v7_exit_coherency_flush macro for cache disabling") there was only CPU
power down related code in hotplug.c file.
Rationale behind the code movement and benefits:
1. The file platsmp.c is the only user of code located in hotplug.c.
Keeping code in hotplug.c required declaring exynos_cpu_die() in common.h.
Such dependencies and mentioned exynos_cpu_die() declaration can be
removed.
2. In next patches exynos_set_delayed_reset_assertion() will be
introduced. This function will be called by:
- cpu_leave_power (hotplug.c),
- platform_do_lowpower (hotplug.c),
- exynos_boot_secondary (platsmp.c).
Merging hotplug.c into platsmp.c leads to simpler and cleaner code with
less dependencies between files.
The commit only moves code around with one additional observable change:
the hotplug.c was compiled with custom CFLAGS (-march=armv7-a). These
CFLAGS are not necessary any more.
Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com>
Reviewed-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
This commit is contained in:
parent
f114040e3e
commit
6f0b7c0c6f
@ -16,9 +16,6 @@ obj-$(CONFIG_PM_GENERIC_DOMAINS) += pm_domains.o
|
|||||||
|
|
||||||
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
|
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
|
||||||
|
|
||||||
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
|
||||||
CFLAGS_hotplug.o += -march=armv7-a
|
|
||||||
|
|
||||||
plus_sec := $(call as-instr,.arch_extension sec,+sec)
|
plus_sec := $(call as-instr,.arch_extension sec,+sec)
|
||||||
AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)
|
AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec)
|
||||||
|
|
||||||
|
@ -130,8 +130,6 @@ extern void exynos_cpu_resume(void);
|
|||||||
|
|
||||||
extern struct smp_operations exynos_smp_ops;
|
extern struct smp_operations exynos_smp_ops;
|
||||||
|
|
||||||
extern void exynos_cpu_die(unsigned int cpu);
|
|
||||||
|
|
||||||
/* PMU(Power Management Unit) support */
|
/* PMU(Power Management Unit) support */
|
||||||
|
|
||||||
#define PMU_TABLE_END (-1U)
|
#define PMU_TABLE_END (-1U)
|
||||||
|
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* Cloned from linux/arch/arm/mach-realview/hotplug.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 2002 ARM Ltd.
|
|
||||||
* All Rights Reserved
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <linux/errno.h>
|
|
||||||
#include <linux/smp.h>
|
|
||||||
#include <linux/io.h>
|
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
|
||||||
#include <asm/cp15.h>
|
|
||||||
#include <asm/smp_plat.h>
|
|
||||||
|
|
||||||
#include "common.h"
|
|
||||||
#include "regs-pmu.h"
|
|
||||||
|
|
||||||
static inline void cpu_leave_lowpower(void)
|
|
||||||
{
|
|
||||||
unsigned int v;
|
|
||||||
|
|
||||||
asm volatile(
|
|
||||||
"mrc p15, 0, %0, c1, c0, 0\n"
|
|
||||||
" orr %0, %0, %1\n"
|
|
||||||
" mcr p15, 0, %0, c1, c0, 0\n"
|
|
||||||
" mrc p15, 0, %0, c1, c0, 1\n"
|
|
||||||
" orr %0, %0, %2\n"
|
|
||||||
" mcr p15, 0, %0, c1, c0, 1\n"
|
|
||||||
: "=&r" (v)
|
|
||||||
: "Ir" (CR_C), "Ir" (0x40)
|
|
||||||
: "cc");
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
|
|
||||||
{
|
|
||||||
u32 mpidr = cpu_logical_map(cpu);
|
|
||||||
u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
|
|
||||||
/* Turn the CPU off on next WFI instruction. */
|
|
||||||
exynos_cpu_power_down(core_id);
|
|
||||||
|
|
||||||
wfi();
|
|
||||||
|
|
||||||
if (pen_release == core_id) {
|
|
||||||
/*
|
|
||||||
* OK, proper wakeup, we're done
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Getting here, means that we have come out of WFI without
|
|
||||||
* having been woken up - this shouldn't happen
|
|
||||||
*
|
|
||||||
* Just note it happening - when we're woken, we can report
|
|
||||||
* its occurrence.
|
|
||||||
*/
|
|
||||||
(*spurious)++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* platform-specific code to shutdown a CPU
|
|
||||||
*
|
|
||||||
* Called with IRQs disabled
|
|
||||||
*/
|
|
||||||
void __ref exynos_cpu_die(unsigned int cpu)
|
|
||||||
{
|
|
||||||
int spurious = 0;
|
|
||||||
|
|
||||||
v7_exit_coherency_flush(louis);
|
|
||||||
|
|
||||||
platform_do_lowpower(cpu, &spurious);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bring this CPU back into the world of cache
|
|
||||||
* coherency, and then restore interrupts
|
|
||||||
*/
|
|
||||||
cpu_leave_lowpower();
|
|
||||||
|
|
||||||
if (spurious)
|
|
||||||
pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
|
|
||||||
}
|
|
@ -22,6 +22,7 @@
|
|||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
#include <asm/cp15.h>
|
||||||
#include <asm/smp_plat.h>
|
#include <asm/smp_plat.h>
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
#include <asm/firmware.h>
|
#include <asm/firmware.h>
|
||||||
@ -33,6 +34,54 @@
|
|||||||
|
|
||||||
extern void exynos4_secondary_startup(void);
|
extern void exynos4_secondary_startup(void);
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
static inline void cpu_leave_lowpower(void)
|
||||||
|
{
|
||||||
|
unsigned int v;
|
||||||
|
|
||||||
|
asm volatile(
|
||||||
|
"mrc p15, 0, %0, c1, c0, 0\n"
|
||||||
|
" orr %0, %0, %1\n"
|
||||||
|
" mcr p15, 0, %0, c1, c0, 0\n"
|
||||||
|
" mrc p15, 0, %0, c1, c0, 1\n"
|
||||||
|
" orr %0, %0, %2\n"
|
||||||
|
" mcr p15, 0, %0, c1, c0, 1\n"
|
||||||
|
: "=&r" (v)
|
||||||
|
: "Ir" (CR_C), "Ir" (0x40)
|
||||||
|
: "cc");
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
|
||||||
|
{
|
||||||
|
u32 mpidr = cpu_logical_map(cpu);
|
||||||
|
u32 core_id = MPIDR_AFFINITY_LEVEL(mpidr, 0);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
|
||||||
|
/* Turn the CPU off on next WFI instruction. */
|
||||||
|
exynos_cpu_power_down(core_id);
|
||||||
|
|
||||||
|
wfi();
|
||||||
|
|
||||||
|
if (pen_release == core_id) {
|
||||||
|
/*
|
||||||
|
* OK, proper wakeup, we're done
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Getting here, means that we have come out of WFI without
|
||||||
|
* having been woken up - this shouldn't happen
|
||||||
|
*
|
||||||
|
* Just note it happening - when we're woken, we can report
|
||||||
|
* its occurrence.
|
||||||
|
*/
|
||||||
|
(*spurious)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_HOTPLUG_CPU */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* exynos_core_power_down : power down the specified cpu
|
* exynos_core_power_down : power down the specified cpu
|
||||||
* @cpu : the cpu to power down
|
* @cpu : the cpu to power down
|
||||||
@ -318,6 +367,31 @@ static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
/*
|
||||||
|
* platform-specific code to shutdown a CPU
|
||||||
|
*
|
||||||
|
* Called with IRQs disabled
|
||||||
|
*/
|
||||||
|
static void __ref exynos_cpu_die(unsigned int cpu)
|
||||||
|
{
|
||||||
|
int spurious = 0;
|
||||||
|
|
||||||
|
v7_exit_coherency_flush(louis);
|
||||||
|
|
||||||
|
platform_do_lowpower(cpu, &spurious);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bring this CPU back into the world of cache
|
||||||
|
* coherency, and then restore interrupts
|
||||||
|
*/
|
||||||
|
cpu_leave_lowpower();
|
||||||
|
|
||||||
|
if (spurious)
|
||||||
|
pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_HOTPLUG_CPU */
|
||||||
|
|
||||||
struct smp_operations exynos_smp_ops __initdata = {
|
struct smp_operations exynos_smp_ops __initdata = {
|
||||||
.smp_init_cpus = exynos_smp_init_cpus,
|
.smp_init_cpus = exynos_smp_init_cpus,
|
||||||
.smp_prepare_cpus = exynos_smp_prepare_cpus,
|
.smp_prepare_cpus = exynos_smp_prepare_cpus,
|
||||||
|
Loading…
Reference in New Issue
Block a user