1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <stddef.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <arch_helpers.h> 11*91f16700Schasinglulu #include <common/debug.h> 12*91f16700Schasinglulu #include <drivers/console.h> 13*91f16700Schasinglulu #include <plat/common/platform.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include "psci_private.h" 16*91f16700Schasinglulu 17*91f16700Schasinglulu void __dead2 psci_system_off(void) 18*91f16700Schasinglulu { 19*91f16700Schasinglulu psci_print_power_domain_map(); 20*91f16700Schasinglulu 21*91f16700Schasinglulu assert(psci_plat_pm_ops->system_off != NULL); 22*91f16700Schasinglulu 23*91f16700Schasinglulu /* Notify the Secure Payload Dispatcher */ 24*91f16700Schasinglulu if ((psci_spd_pm != NULL) && (psci_spd_pm->svc_system_off != NULL)) { 25*91f16700Schasinglulu psci_spd_pm->svc_system_off(); 26*91f16700Schasinglulu } 27*91f16700Schasinglulu 28*91f16700Schasinglulu console_flush(); 29*91f16700Schasinglulu 30*91f16700Schasinglulu /* Call the platform specific hook */ 31*91f16700Schasinglulu psci_plat_pm_ops->system_off(); 32*91f16700Schasinglulu 33*91f16700Schasinglulu /* This function does not return. We should never get here */ 34*91f16700Schasinglulu } 35*91f16700Schasinglulu 36*91f16700Schasinglulu void __dead2 psci_system_reset(void) 37*91f16700Schasinglulu { 38*91f16700Schasinglulu psci_print_power_domain_map(); 39*91f16700Schasinglulu 40*91f16700Schasinglulu assert(psci_plat_pm_ops->system_reset != NULL); 41*91f16700Schasinglulu 42*91f16700Schasinglulu /* Notify the Secure Payload Dispatcher */ 43*91f16700Schasinglulu if ((psci_spd_pm != NULL) && (psci_spd_pm->svc_system_reset != NULL)) { 44*91f16700Schasinglulu psci_spd_pm->svc_system_reset(); 45*91f16700Schasinglulu } 46*91f16700Schasinglulu 47*91f16700Schasinglulu console_flush(); 48*91f16700Schasinglulu 49*91f16700Schasinglulu /* Call the platform specific hook */ 50*91f16700Schasinglulu psci_plat_pm_ops->system_reset(); 51*91f16700Schasinglulu 52*91f16700Schasinglulu /* This function does not return. We should never get here */ 53*91f16700Schasinglulu } 54*91f16700Schasinglulu 55*91f16700Schasinglulu u_register_t psci_system_reset2(uint32_t reset_type, u_register_t cookie) 56*91f16700Schasinglulu { 57*91f16700Schasinglulu unsigned int is_vendor; 58*91f16700Schasinglulu 59*91f16700Schasinglulu psci_print_power_domain_map(); 60*91f16700Schasinglulu 61*91f16700Schasinglulu assert(psci_plat_pm_ops->system_reset2 != NULL); 62*91f16700Schasinglulu 63*91f16700Schasinglulu is_vendor = (reset_type >> PSCI_RESET2_TYPE_VENDOR_SHIFT) & 1U; 64*91f16700Schasinglulu if (is_vendor == 0U) { 65*91f16700Schasinglulu /* 66*91f16700Schasinglulu * Only WARM_RESET is allowed for architectural type resets. 67*91f16700Schasinglulu */ 68*91f16700Schasinglulu if (reset_type != PSCI_RESET2_SYSTEM_WARM_RESET) 69*91f16700Schasinglulu return (u_register_t) PSCI_E_INVALID_PARAMS; 70*91f16700Schasinglulu if ((psci_plat_pm_ops->write_mem_protect != NULL) && 71*91f16700Schasinglulu (psci_plat_pm_ops->write_mem_protect(0) < 0)) { 72*91f16700Schasinglulu return (u_register_t) PSCI_E_NOT_SUPPORTED; 73*91f16700Schasinglulu } 74*91f16700Schasinglulu } 75*91f16700Schasinglulu 76*91f16700Schasinglulu /* Notify the Secure Payload Dispatcher */ 77*91f16700Schasinglulu if ((psci_spd_pm != NULL) && (psci_spd_pm->svc_system_reset != NULL)) { 78*91f16700Schasinglulu psci_spd_pm->svc_system_reset(); 79*91f16700Schasinglulu } 80*91f16700Schasinglulu console_flush(); 81*91f16700Schasinglulu 82*91f16700Schasinglulu return (u_register_t) 83*91f16700Schasinglulu psci_plat_pm_ops->system_reset2((int) is_vendor, reset_type, 84*91f16700Schasinglulu cookie); 85*91f16700Schasinglulu } 86