It is necessary to implement psci_features callback
to report supported features for linux kernel to
decide whether to proceed psci calls, for example,
linux deep sleep mode is ONLY entered when psci_features
returns TRUE when linux kernel checks whether
system suspend is supported by calling psci_features,
otherwise, s2idle will be entered instead.

Signed-off-by: Anson Huang <anson.hu...@nxp.com>
---
no change since V1.
 arch/arm/mach-imx/mx7/psci.S | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/arch/arm/mach-imx/mx7/psci.S b/arch/arm/mach-imx/mx7/psci.S
index cbe6781..694cef7 100644
--- a/arch/arm/mach-imx/mx7/psci.S
+++ b/arch/arm/mach-imx/mx7/psci.S
@@ -23,6 +23,22 @@
 
        .arch_extension sec
 
+imx_psci_supported_table:
+       .word   ARM_PSCI_0_2_FN_CPU_OFF
+       .word   ARM_PSCI_RET_SUCCESS
+       .word   ARM_PSCI_0_2_FN_CPU_ON
+       .word   ARM_PSCI_RET_SUCCESS
+       .word   ARM_PSCI_0_2_FN_AFFINITY_INFO
+       .word   ARM_PSCI_RET_SUCCESS
+       .word   ARM_PSCI_0_2_FN_SYSTEM_OFF
+       .word   ARM_PSCI_RET_SUCCESS
+       .word   ARM_PSCI_0_2_FN_SYSTEM_RESET
+       .word   ARM_PSCI_RET_SUCCESS
+       .word   ARM_PSCI_1_0_FN_SYSTEM_SUSPEND
+       .word   ARM_PSCI_RET_SUCCESS
+       .word   0
+       .word   ARM_PSCI_RET_NI
+
 .global ddrc_enter_self_refresh
 ddrc_enter_self_refresh:
        /* let DDR out of self-refresh */
@@ -112,6 +128,20 @@ v7_invalidate_l1:
        isb
        mov     pc, lr
 
+.globl psci_features
+psci_features:
+       adr     r2, imx_psci_supported_table
+1:     ldr     r3, [r2]
+       cmp     r3, #0
+       beq     out_psci_features
+       cmp     r1, r3
+       addne   r2, r2, #8
+       bne     1b
+
+out_psci_features:
+       ldr     r0, [r2, #4]
+       bx      lr
+
 .globl psci_cpu_on
 psci_cpu_on:
        push    {r4, r5, lr}
-- 
2.7.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to