xref: /rk3399_ARM-atf/plat/allwinner/common/sunxi_pm.c (revision e2b18771fc2a0528dda18dbdaac08dd8530df25a)
158032586SSamuel Holland /*
2814dce8fSSamuel Holland  * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
358032586SSamuel Holland  *
458032586SSamuel Holland  * SPDX-License-Identifier: BSD-3-Clause
558032586SSamuel Holland  */
658032586SSamuel Holland 
758032586SSamuel Holland #include <assert.h>
809d40e0eSAntonio Nino Diaz 
958032586SSamuel Holland #include <platform_def.h>
1009d40e0eSAntonio Nino Diaz 
1109d40e0eSAntonio Nino Diaz #include <common/debug.h>
12*e2b18771SSamuel Holland #include <common/fdt_fixup.h>
1309d40e0eSAntonio Nino Diaz #include <lib/mmio.h>
1409d40e0eSAntonio Nino Diaz #include <lib/psci/psci.h>
1509d40e0eSAntonio Nino Diaz 
16560581ecSSamuel Holland #include <sunxi_cpucfg.h>
174ec1a239SAndre Przywara #include <sunxi_private.h>
1858032586SSamuel Holland 
19*e2b18771SSamuel Holland static bool psci_is_scpi;
20*e2b18771SSamuel Holland 
21*e2b18771SSamuel Holland #if SUNXI_PSCI_USE_SCPI
22*e2b18771SSamuel Holland bool sunxi_psci_is_scpi(void)
23*e2b18771SSamuel Holland {
24*e2b18771SSamuel Holland 	return psci_is_scpi;
25*e2b18771SSamuel Holland }
26*e2b18771SSamuel Holland #endif
27*e2b18771SSamuel Holland 
28fe753c97SSamuel Holland int sunxi_validate_ns_entrypoint(uintptr_t ns_entrypoint)
29560581ecSSamuel Holland {
30560581ecSSamuel Holland 	/* The non-secure entry point must be in DRAM */
31814dce8fSSamuel Holland 	if (ns_entrypoint < SUNXI_DRAM_BASE) {
32560581ecSSamuel Holland 		return PSCI_E_INVALID_ADDRESS;
33560581ecSSamuel Holland 	}
34560581ecSSamuel Holland 
35814dce8fSSamuel Holland 	return PSCI_E_SUCCESS;
36814dce8fSSamuel Holland }
37814dce8fSSamuel Holland 
3858032586SSamuel Holland int plat_setup_psci_ops(uintptr_t sec_entrypoint,
3958032586SSamuel Holland 			const plat_psci_ops_t **psci_ops)
4058032586SSamuel Holland {
4158032586SSamuel Holland 	assert(psci_ops);
4258032586SSamuel Holland 
43e382c88eSSamuel Holland 	/* Program all CPU entry points. */
44e382c88eSSamuel Holland 	for (unsigned int cpu = 0; cpu < PLATFORM_CORE_COUNT; ++cpu) {
45560581ecSSamuel Holland 		mmio_write_32(SUNXI_CPUCFG_RVBAR_LO_REG(cpu),
46560581ecSSamuel Holland 			      sec_entrypoint & 0xffffffff);
47560581ecSSamuel Holland 		mmio_write_32(SUNXI_CPUCFG_RVBAR_HI_REG(cpu),
48560581ecSSamuel Holland 			      sec_entrypoint >> 32);
49560581ecSSamuel Holland 	}
50560581ecSSamuel Holland 
51fe753c97SSamuel Holland 	if (sunxi_set_scpi_psci_ops(psci_ops) == 0) {
52fe753c97SSamuel Holland 		INFO("PSCI: Suspend is available via SCPI\n");
53*e2b18771SSamuel Holland 		psci_is_scpi = true;
54fe753c97SSamuel Holland 	} else {
55fe753c97SSamuel Holland 		INFO("PSCI: Suspend is unavailable\n");
56fe753c97SSamuel Holland 		sunxi_set_native_psci_ops(psci_ops);
57e382c88eSSamuel Holland 	}
5858032586SSamuel Holland 
5958032586SSamuel Holland 	return 0;
6058032586SSamuel Holland }
61