diff mbox series

[v1,1/3] arch/arm: meson: sm: introduce power domain functions

Message ID 20230522120941.63962-2-avromanov@sberdevices.ru
State New
Delegated to: Neil Armstrong
Headers show
Series Meson Secure PWRC Driver | expand

Commit Message

Alexey Romanov May 22, 2023, 12:09 p.m. UTC
This commit adds functions to manage secure power domain for
Amlogic SoC's using smc functionality.

Signed-off-by: Alexey Romanov <avromanov@sberdevices.ru>
---
 arch/arm/include/asm/arch-meson/sm.h | 30 ++++++++++++++++++++++++++++
 arch/arm/mach-meson/sm.c             | 14 +++++++++++++
 2 files changed, 44 insertions(+)

Comments

Neil Armstrong May 30, 2023, 3:52 p.m. UTC | #1
On 22/05/2023 14:09, Alexey Romanov via groups.io wrote:
> This commit adds functions to manage secure power domain for
> Amlogic SoC's using smc functionality.
> 
> Signed-off-by: Alexey Romanov <avromanov@sberdevices.ru>
> ---
>   arch/arm/include/asm/arch-meson/sm.h | 30 ++++++++++++++++++++++++++++
>   arch/arm/mach-meson/sm.c             | 14 +++++++++++++
>   2 files changed, 44 insertions(+)
> 
> diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h
> index 53b75176493..4b1d564bc48 100644
> --- a/arch/arm/include/asm/arch-meson/sm.h
> +++ b/arch/arm/include/asm/arch-meson/sm.h
> @@ -58,4 +58,34 @@ enum {
>    */
>   int meson_sm_get_reboot_reason(void);
>   
> +#define PWRDM_OFF 0
> +#define PWRDM_ON 1
> +
> +/**
> + * meson_sm_pwrdm_set - do command at specified power domain.
> + *
> + * @index: power domain index.
> + * @cmd: command index.
> + * @return: zero on success or error code on failure.
> + */
> +int meson_sm_pwrdm_set(size_t index, int cmd);
> +
> +/**
> + * meson_sm_pwrdm_off - disable specified power domain.
> + *
> + * @index: power domain index.
> + * @return: zero on success or error code on failure.
> + */
> +#define meson_sm_pwrdm_off(index) \
> +	meson_sm_pwrdm_set(index, PWRDM_OFF)
> +
> +/**
> + * meson_sm_pwrdm_on - enable specified power domain.
> + *
> + * @index: power domain index.
> + * @return: zero on success or error code on failure.
> + */
> +#define meson_sm_pwrdm_on(index) \
> +	meson_sm_pwrdm_set(index, PWRDM_ON)
> +
>   #endif /* __MESON_SM_H__ */
> diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c
> index f2ca7e76932..d600c64d0be 100644
> --- a/arch/arm/mach-meson/sm.c
> +++ b/arch/arm/mach-meson/sm.c
> @@ -24,6 +24,7 @@
>   #define FN_EFUSE_READ			0x82000030
>   #define FN_EFUSE_WRITE			0x82000031
>   #define FN_CHIP_ID			0x82000044
> +#define FN_PWRDM_SET			0x82000093
>   
>   static void *shmem_input;
>   static void *shmem_output;
> @@ -137,3 +138,16 @@ int meson_sm_get_reboot_reason(void)
>   	/* The SMC call is not used, we directly use AO_SEC_SD_CFG15 */
>   	return FIELD_GET(REBOOT_REASON_MASK, reason);
>   }
> +
> +int meson_sm_pwrdm_set(size_t index, int cmd)
> +{
> +	struct pt_regs regs;
> +
> +	regs.regs[0] = FN_PWRDM_SET;
> +	regs.regs[1] = index;
> +	regs.regs[2] = cmd;
> +
> +	smc_call(&regs);
> +
> +	return regs.regs[0];
> +}

Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
diff mbox series

Patch

diff --git a/arch/arm/include/asm/arch-meson/sm.h b/arch/arm/include/asm/arch-meson/sm.h
index 53b75176493..4b1d564bc48 100644
--- a/arch/arm/include/asm/arch-meson/sm.h
+++ b/arch/arm/include/asm/arch-meson/sm.h
@@ -58,4 +58,34 @@  enum {
  */
 int meson_sm_get_reboot_reason(void);
 
+#define PWRDM_OFF 0
+#define PWRDM_ON 1
+
+/**
+ * meson_sm_pwrdm_set - do command at specified power domain.
+ *
+ * @index: power domain index.
+ * @cmd: command index.
+ * @return: zero on success or error code on failure.
+ */
+int meson_sm_pwrdm_set(size_t index, int cmd);
+
+/**
+ * meson_sm_pwrdm_off - disable specified power domain.
+ *
+ * @index: power domain index.
+ * @return: zero on success or error code on failure.
+ */
+#define meson_sm_pwrdm_off(index) \
+	meson_sm_pwrdm_set(index, PWRDM_OFF)
+
+/**
+ * meson_sm_pwrdm_on - enable specified power domain.
+ *
+ * @index: power domain index.
+ * @return: zero on success or error code on failure.
+ */
+#define meson_sm_pwrdm_on(index) \
+	meson_sm_pwrdm_set(index, PWRDM_ON)
+
 #endif /* __MESON_SM_H__ */
diff --git a/arch/arm/mach-meson/sm.c b/arch/arm/mach-meson/sm.c
index f2ca7e76932..d600c64d0be 100644
--- a/arch/arm/mach-meson/sm.c
+++ b/arch/arm/mach-meson/sm.c
@@ -24,6 +24,7 @@ 
 #define FN_EFUSE_READ			0x82000030
 #define FN_EFUSE_WRITE			0x82000031
 #define FN_CHIP_ID			0x82000044
+#define FN_PWRDM_SET			0x82000093
 
 static void *shmem_input;
 static void *shmem_output;
@@ -137,3 +138,16 @@  int meson_sm_get_reboot_reason(void)
 	/* The SMC call is not used, we directly use AO_SEC_SD_CFG15 */
 	return FIELD_GET(REBOOT_REASON_MASK, reason);
 }
+
+int meson_sm_pwrdm_set(size_t index, int cmd)
+{
+	struct pt_regs regs;
+
+	regs.regs[0] = FN_PWRDM_SET;
+	regs.regs[1] = index;
+	regs.regs[2] = cmd;
+
+	smc_call(&regs);
+
+	return regs.regs[0];
+}