Re: [PATCH 3/4] ARM: exynos: Add CPU state management for Exynos542x under secure firmware

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux SoC Development]     [Linux Rockchip Development]     [Linux for Synopsys ARC Processors]    
  • [Linux on Unisoc (RDA Micro) SoCs]     [Linux Actions SoC]     [Linux USB Development]     [Video for Linux]     [Linux Audio Users]     [Linux SCSI]     [Yosemite News]

  •   Powered by Linux