xref: /rk3399_ARM-atf/plat/allwinner/common/sunxi_pm.c (revision e603983d3703a0c9cee3f43baf550ca397e20b34)
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>
12e2b18771SSamuel 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 
19e2b18771SSamuel Holland static bool psci_is_scpi;
20e2b18771SSamuel Holland 
21e2b18771SSamuel Holland #if SUNXI_PSCI_USE_SCPI
sunxi_psci_is_scpi(void)22e2b18771SSamuel Holland bool sunxi_psci_is_scpi(void)
23e2b18771SSamuel Holland {
24e2b18771SSamuel Holland 	return psci_is_scpi;
25e2b18771SSamuel Holland }
26e2b18771SSamuel Holland #endif
27e2b18771SSamuel Holland 
28*018c1d87SMikhail Kalashnikov #ifndef SUNXI_ALT_RVBAR_LO_REG
29*018c1d87SMikhail Kalashnikov #define SUNXI_ALT_RVBAR_LO_REG(n)	0
30*018c1d87SMikhail Kalashnikov #define SUNXI_ALT_RVBAR_HI_REG(n)	0
31*018c1d87SMikhail Kalashnikov #endif
32*018c1d87SMikhail Kalashnikov 
sunxi_validate_ns_entrypoint(uintptr_t ns_entrypoint)33fe753c97SSamuel Holland int sunxi_validate_ns_entrypoint(uintptr_t ns_entrypoint)
34560581ecSSamuel Holland {
35560581ecSSamuel Holland 	/* The non-secure entry point must be in DRAM */
36814dce8fSSamuel Holland 	if (ns_entrypoint < SUNXI_DRAM_BASE) {
37560581ecSSamuel Holland 		return PSCI_E_INVALID_ADDRESS;
38560581ecSSamuel Holland 	}
39560581ecSSamuel Holland 
40814dce8fSSamuel Holland 	return PSCI_E_SUCCESS;
41814dce8fSSamuel Holland }
42814dce8fSSamuel Holland 
plat_setup_psci_ops(uintptr_t sec_entrypoint,const plat_psci_ops_t ** psci_ops)4358032586SSamuel Holland int plat_setup_psci_ops(uintptr_t sec_entrypoint,
4458032586SSamuel Holland 			const plat_psci_ops_t **psci_ops)
4558032586SSamuel Holland {
4658032586SSamuel Holland 	assert(psci_ops);
4758032586SSamuel Holland 
48e382c88eSSamuel Holland 	/* Program all CPU entry points. */
49e382c88eSSamuel Holland 	for (unsigned int cpu = 0; cpu < PLATFORM_CORE_COUNT; ++cpu) {
50*018c1d87SMikhail Kalashnikov 		if (sunxi_cpucfg_has_per_cluster_regs()) {
51560581ecSSamuel Holland 			mmio_write_32(SUNXI_CPUCFG_RVBAR_LO_REG(cpu),
52560581ecSSamuel Holland 				      sec_entrypoint & 0xffffffff);
53560581ecSSamuel Holland 			mmio_write_32(SUNXI_CPUCFG_RVBAR_HI_REG(cpu),
54560581ecSSamuel Holland 				      sec_entrypoint >> 32);
55*018c1d87SMikhail Kalashnikov 		} else {
56*018c1d87SMikhail Kalashnikov 			mmio_write_32(SUNXI_ALT_RVBAR_LO_REG(cpu),
57*018c1d87SMikhail Kalashnikov 				      sec_entrypoint & 0xffffffff);
58*018c1d87SMikhail Kalashnikov 			mmio_write_32(SUNXI_ALT_RVBAR_HI_REG(cpu),
59*018c1d87SMikhail Kalashnikov 				      sec_entrypoint >> 32);
60*018c1d87SMikhail Kalashnikov 		}
61560581ecSSamuel Holland 	}
62560581ecSSamuel Holland 
63fe753c97SSamuel Holland 	if (sunxi_set_scpi_psci_ops(psci_ops) == 0) {
64fe753c97SSamuel Holland 		INFO("PSCI: Suspend is available via SCPI\n");
65e2b18771SSamuel Holland 		psci_is_scpi = true;
66fe753c97SSamuel Holland 	} else {
67fe753c97SSamuel Holland 		INFO("PSCI: Suspend is unavailable\n");
68fe753c97SSamuel Holland 		sunxi_set_native_psci_ops(psci_ops);
69e382c88eSSamuel Holland 	}
7058032586SSamuel Holland 
7158032586SSamuel Holland 	return 0;
7258032586SSamuel Holland }
73