1fe753c97SSamuel Holland /* 2fe753c97SSamuel Holland * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved. 3fe753c97SSamuel Holland * 4fe753c97SSamuel Holland * SPDX-License-Identifier: BSD-3-Clause 5fe753c97SSamuel Holland */ 6fe753c97SSamuel Holland 7fe753c97SSamuel Holland #include <arch_helpers.h> 8fe753c97SSamuel Holland #include <common/debug.h> 9fe753c97SSamuel Holland #include <drivers/arm/gicv2.h> 10fe753c97SSamuel Holland #include <drivers/delay_timer.h> 11fe753c97SSamuel Holland #include <lib/mmio.h> 12fe753c97SSamuel Holland #include <lib/psci/psci.h> 13fe753c97SSamuel Holland 14fe753c97SSamuel Holland #include <sunxi_mmap.h> 15fe753c97SSamuel Holland #include <sunxi_private.h> 16fe753c97SSamuel Holland 17fe753c97SSamuel Holland #define SUNXI_WDOG0_CTRL_REG (SUNXI_R_WDOG_BASE + 0x0010) 18fe753c97SSamuel Holland #define SUNXI_WDOG0_CFG_REG (SUNXI_R_WDOG_BASE + 0x0014) 19fe753c97SSamuel Holland #define SUNXI_WDOG0_MODE_REG (SUNXI_R_WDOG_BASE + 0x0018) 20fe753c97SSamuel Holland sunxi_pwr_domain_on(u_register_t mpidr)21fe753c97SSamuel Hollandstatic int sunxi_pwr_domain_on(u_register_t mpidr) 22fe753c97SSamuel Holland { 23fe753c97SSamuel Holland sunxi_cpu_on(mpidr); 24fe753c97SSamuel Holland 25fe753c97SSamuel Holland return PSCI_E_SUCCESS; 26fe753c97SSamuel Holland } 27fe753c97SSamuel Holland sunxi_pwr_domain_off(const psci_power_state_t * target_state)28fe753c97SSamuel Hollandstatic void sunxi_pwr_domain_off(const psci_power_state_t *target_state) 29fe753c97SSamuel Holland { 30fe753c97SSamuel Holland gicv2_cpuif_disable(); 31fe753c97SSamuel Holland 32fe753c97SSamuel Holland sunxi_cpu_power_off_self(); 33fe753c97SSamuel Holland } 34fe753c97SSamuel Holland sunxi_pwr_domain_on_finish(const psci_power_state_t * target_state)35fe753c97SSamuel Hollandstatic void sunxi_pwr_domain_on_finish(const psci_power_state_t *target_state) 36fe753c97SSamuel Holland { 37fe753c97SSamuel Holland gicv2_pcpu_distif_init(); 38fe753c97SSamuel Holland gicv2_cpuif_enable(); 39fe753c97SSamuel Holland } 40fe753c97SSamuel Holland sunxi_system_off(void)41*1ed77d1bSBoyan Karatotevstatic void sunxi_system_off(void) 42fe753c97SSamuel Holland { 43fe753c97SSamuel Holland gicv2_cpuif_disable(); 44fe753c97SSamuel Holland 45fe753c97SSamuel Holland /* Attempt to power down the board (may not return) */ 46fe753c97SSamuel Holland sunxi_power_down(); 47fe753c97SSamuel Holland 48fe753c97SSamuel Holland /* Turn off all CPUs */ 49fe753c97SSamuel Holland sunxi_cpu_power_off_others(); 50fe753c97SSamuel Holland sunxi_cpu_power_off_self(); 51fe753c97SSamuel Holland } 52fe753c97SSamuel Holland sunxi_system_reset(void)53fe753c97SSamuel Hollandstatic void __dead2 sunxi_system_reset(void) 54fe753c97SSamuel Holland { 55fe753c97SSamuel Holland gicv2_cpuif_disable(); 56fe753c97SSamuel Holland 57fe753c97SSamuel Holland /* Reset the whole system when the watchdog times out */ 58fe753c97SSamuel Holland mmio_write_32(SUNXI_WDOG0_CFG_REG, 1); 59fe753c97SSamuel Holland /* Enable the watchdog with the shortest timeout (0.5 seconds) */ 60fe753c97SSamuel Holland mmio_write_32(SUNXI_WDOG0_MODE_REG, (0 << 4) | 1); 61fe753c97SSamuel Holland /* Wait for twice the watchdog timeout before panicking */ 62fe753c97SSamuel Holland mdelay(1000); 63fe753c97SSamuel Holland 64fe753c97SSamuel Holland ERROR("PSCI: System reset failed\n"); 65fe753c97SSamuel Holland panic(); 66fe753c97SSamuel Holland } 67fe753c97SSamuel Holland 68fe753c97SSamuel Holland static const plat_psci_ops_t sunxi_native_psci_ops = { 69fe753c97SSamuel Holland .pwr_domain_on = sunxi_pwr_domain_on, 70fe753c97SSamuel Holland .pwr_domain_off = sunxi_pwr_domain_off, 71fe753c97SSamuel Holland .pwr_domain_on_finish = sunxi_pwr_domain_on_finish, 72fe753c97SSamuel Holland .system_off = sunxi_system_off, 73fe753c97SSamuel Holland .system_reset = sunxi_system_reset, 74fe753c97SSamuel Holland .validate_ns_entrypoint = sunxi_validate_ns_entrypoint, 75fe753c97SSamuel Holland }; 76fe753c97SSamuel Holland sunxi_set_native_psci_ops(const plat_psci_ops_t ** psci_ops)77fe753c97SSamuel Hollandvoid sunxi_set_native_psci_ops(const plat_psci_ops_t **psci_ops) 78fe753c97SSamuel Holland { 79fe753c97SSamuel Holland *psci_ops = &sunxi_native_psci_ops; 80fe753c97SSamuel Holland } 81