On Mon, 2016-01-18 at 12:27 +0800, Dongsheng Wang wrote: > From: Wang Dongsheng <dongsheng.w...@nxp.com> > > Based on PSCI v1.0, implement interface for ls102xa SoC: > psci_version, > psci_features, > psci_cpu_suspend, > psci_affinity_info, > psci_system_reset, > psci_system_off. > > Tested on LS1021aQDS, LS1021aTWR. > > Signed-off-by: Wang Dongsheng <dongsheng.w...@nxp.com> > --- > arch/arm/cpu/armv7/ls102xa/psci.S | 110 > +++++++++++++++++++++++++++-- > arch/arm/include/asm/arch-ls102xa/config.h | 1 + > board/freescale/ls1021aqds/Makefile | 1 + > board/freescale/ls1021aqds/psci.S | 36 ++++++++++ > board/freescale/ls1021atwr/Makefile | 1 + > board/freescale/ls1021atwr/psci.S | 28 ++++++++ > include/configs/ls1021aqds.h | 3 + > include/configs/ls1021atwr.h | 1 + > 8 files changed, 177 insertions(+), 4 deletions(-) > create mode 100644 board/freescale/ls1021aqds/psci.S > create mode 100644 board/freescale/ls1021atwr/psci.S > > diff --git a/arch/arm/cpu/armv7/ls102xa/psci.S > b/arch/arm/cpu/armv7/ls102xa/psci.S > index 3091362..bfc908e 100644 > --- a/arch/arm/cpu/armv7/ls102xa/psci.S > +++ b/arch/arm/cpu/armv7/ls102xa/psci.S > @@ -12,19 +12,72 @@ > #include <asm/arch-armv7/generictimer.h> > #include <asm/psci.h> > > +#define RCPM_TWAITSR 0x04C > + > #define SCFG_CORE0_SFT_RST 0x130 > #define SCFG_CORESRENCR 0x204 > > -#define DCFG_CCSR_BRR 0x0E4 > -#define DCFG_CCSR_SCRATCHRW1 0x200 > +#define DCFG_CCSR_RSTCR 0x0B0 > +#define DCFG_CCSR_RSTCR_RESET_REQ 0x2 > +#define DCFG_CCSR_BRR 0x0E4 > +#define DCFG_CCSR_SCRATCHRW1 0x200 > + > +#define PSCI_FN_PSCI_VERSION_FEATURE_MASK 0x0 > +#define PSCI_FN_CPU_SUSPEND_FEATURE_MASK 0x0 > +#define PSCI_FN_CPU_OFF_FEATURE_MASK 0x0 > +#define PSCI_FN_CPU_ON_FEATURE_MASK 0x0 > +#define PSCI_FN_AFFINITY_INFO_FEATURE_MASK 0x0 > +#define PSCI_FN_SYSTEM_OFF_FEATURE_MASK 0x0 > +#define PSCI_FN_SYSTEM_RESET_FEATURE_MASK 0x0 > > .pushsection ._secure.text, "ax" > > .arch_extension sec > > + .align 5 > + > #define ONE_MS (GENERIC_TIMER_CLK / 1000) > #define RESET_WAIT (30 * ONE_MS) > > +.globl psci_version > +psci_version: > + movw r0, #0 > + movt r0, #1 > + > + bx lr > + > +_ls102x_psci_supported_table: > + .word PSCI_FN_PSCI_VERSION > + .word PSCI_FN_PSCI_VERSION_FEATURE_MASK > + .word PSCI_FN_CPU_SUSPEND > + .word PSCI_FN_CPU_SUSPEND_FEATURE_MASK > + .word PSCI_FN_CPU_OFF > + .word PSCI_FN_CPU_OFF_FEATURE_MASK > + .word PSCI_FN_CPU_ON > + .word PSCI_FN_CPU_ON_FEATURE_MASK > + .word PSCI_FN_AFFINITY_INFO > + .word PSCI_FN_AFFINITY_INFO_FEATURE_MASK > + .word PSCI_FN_SYSTEM_OFF > + .word PSCI_FN_SYSTEM_OFF_FEATURE_MASK > + .word PSCI_FN_SYSTEM_RESET > + .word PSCI_FN_SYSTEM_RESET_FEATURE_MASK > + .word 0 > + .word PSCI_RET_NOT_SUPPORTED
Can you use the main _psci_table instead of duplicating it? > + > +.globl psci_features > +psci_features: > + adr r2, _ls102x_psci_supported_table > +1: ldr r3, [r2] > + cmp r3, #0 > + beq out_psci_features > + cmp r1, r3 > + addne r2, r2, #8 > + bne 1b Why are you adding 8 here? > + > +out_psci_features: > + ldr r0, [r2, #4] > + bx lr If you find a match, you're supposed to return zero, not the next function id in the table. How did you test this? There should really be a test suite for runtime services such as this, especially when trying to comply with a standard. > + > #define AFFINITY_LEVEL_PROCESSOR_SHIFT 8 > @ Expect target CPU in r1, return the target cpu number in R0 > .globl psci_get_target_cpu_id > @@ -128,6 +181,57 @@ psci_cpu_off: > 1: wfi > b 1b > > +.globl psci_cpu_suspend > +psci_cpu_suspend: > + mov r0, #PSCI_RET_INVALID_PARAMS > + bx lr > + > +.globl psci_affinity_info > +psci_affinity_info: > + push {lr} > + > + mov r0, #PSCI_RET_INVALID_PARAMS > + > + @ Verify Affinity level > + cmp r2, #0 > + bne out_affinity_info > + > + bl psci_get_target_cpu_id > + cmp r0, #PSCI_RET_INVALID_PARAMS > + beq out_affinity_info > + mov r1, r0 > + > + @ Get RCPM base address > + movw r4, #(CONFIG_SYS_FSL_RCPM_ADDR & 0xffff) > + movt r4, #(CONFIG_SYS_FSL_RCPM_ADDR >> 16) > + > + mov r0, #PSCI_AFFINITY_LEVEL_ON > + > + @ Detect target CPU state > + ldr r2, [r4, #RCPM_TWAITSR] > + rev r2, r2 > + lsr r2, r2, r1 > + ands r2, r2, #1 > + beq out_affinity_info > + > + mov r0, #PSCI_AFFINITY_LEVEL_OFF > + > +out_affinity_info: > + pop {pc} Where do you check for ON_PENDING? -Scott _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot