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 Hollandbool 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 Hollandint 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 Hollandint 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