On Mon, 18 Feb 2019 at 15:34, Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> wrote: > > From: Joonyoung Shim <jy0922.shim@xxxxxxxxxxx> > > Add required CPU state management done via secure monitor call for > Exynos542x running unsed Secure Firmware. > > Signed-off-by: Joonyoung Shim <jy0922.shim@xxxxxxxxxxx> > [mszyprow: rewrote code to use defines and sysram base address instead > of the magic numbers, added second smc call in pm_resume, rephrased > subject and commit message] > Signed-off-by: Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> > --- > arch/arm/mach-exynos/common.h | 1 + > arch/arm/mach-exynos/exynos.c | 3 +++ > arch/arm/mach-exynos/suspend.c | 17 +++++++++++++++-- > 3 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h > index 1b8699e94098..c93356a8d662 100644 > --- a/arch/arm/mach-exynos/common.h > +++ b/arch/arm/mach-exynos/common.h > @@ -91,6 +91,7 @@ extern u32 cp15_save_power; > > extern void __iomem *sysram_ns_base_addr; > extern void __iomem *sysram_base_addr; > +extern phys_addr_t sysram_base_phys; > extern void __iomem *pmu_base_addr; > void exynos_sysram_init(void); > > diff --git a/arch/arm/mach-exynos/exynos.c b/arch/arm/mach-exynos/exynos.c > index 865dcc4c3181..9aa483366ebc 100644 > --- a/arch/arm/mach-exynos/exynos.c > +++ b/arch/arm/mach-exynos/exynos.c > @@ -33,6 +33,7 @@ static struct platform_device exynos_cpuidle = { > }; > > void __iomem *sysram_base_addr __ro_after_init; > +phys_addr_t sysram_base_phys __ro_after_init; > void __iomem *sysram_ns_base_addr __ro_after_init; > > void __init exynos_sysram_init(void) > @@ -43,6 +44,8 @@ void __init exynos_sysram_init(void) > if (!of_device_is_available(node)) > continue; > sysram_base_addr = of_iomap(node, 0); > + sysram_base_phys = of_translate_address(node, > + of_get_address(node, 0, NULL, NULL)); > break; > } > > diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c > index c1e082ab2a1e..3ac84f621d99 100644 > --- a/arch/arm/mach-exynos/suspend.c > +++ b/arch/arm/mach-exynos/suspend.c > @@ -31,6 +31,7 @@ > #include <asm/suspend.h> > > #include "common.h" > +#include "smc.h" > > #define REG_TABLE_END (-1U) > > @@ -62,6 +63,8 @@ struct exynos_pm_state { > int cpu_state; > unsigned int pmu_spare3; > void __iomem *sysram_base; > + phys_addr_t sysram_phys; > + bool secure_firmware; > }; > > static const struct exynos_pm_data *pm_data __ro_after_init; > @@ -340,6 +343,9 @@ static void exynos5420_pm_prepare(void) > pm_state.cpu_state = readl_relaxed(pm_state.sysram_base + > EXYNOS5420_CPU_STATE); > writel_relaxed(0x0, pm_state.sysram_base + EXYNOS5420_CPU_STATE); > + if (pm_state.secure_firmware) > + exynos_smc(SMC_CMD_REG, SMC_REG_ID_SFR_W(pm_state.sysram_phys + > + EXYNOS5420_CPU_STATE), 0, 0); > > exynos_pm_enter_sleep_mode(); > > @@ -459,6 +465,10 @@ static void exynos5420_pm_resume(void) > /* Restore the sysram cpu state register */ > writel_relaxed(pm_state.cpu_state, > pm_state.sysram_base + EXYNOS5420_CPU_STATE); > + if (pm_state.secure_firmware) > + exynos_smc(SMC_CMD_REG, SMC_REG_ID_SFR_W(pm_state.sysram_phys + > + EXYNOS5420_CPU_STATE), > + EXYNOS_AFTR_MAGIC, 0); This indentation is weird - the magic should not be indented as SMC_REG_ID_SFR_W() param. How about something like: exynos_smc(SMC_CMD_REG, SMC_REG_ID_SFR_W(pm_state.sysram_phys + EXYNOS5420_CPU_STATE), EXYNOS_AFTR_MAGIC, 0); or if it does not fit in 80-line, then: if (pm_state.secure_firmware) exynos_smc(SMC_CMD_REG, SMC_REG_ID_SFR_W(pm_state.sysram_phys + EXYNOS5420_CPU_STATE), EXYNOS_AFTR_MAGIC, 0); I can fix it while applying, unless you are going to resend. Best regards, Krzysztof