blob: 13e9f4aae598f7db194aa889c4bfdacc44975967 [file] [log] [blame]
Juan Castillo4dc4a472014-08-12 11:17:06 +01001/*
Antonio Nino Diaze3962d02017-02-16 16:17:19 +00002 * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
Juan Castillo4dc4a472014-08-12 11:17:06 +01003 *
dp-armfa3cf0b2017-05-03 09:38:09 +01004 * SPDX-License-Identifier: BSD-3-Clause
Juan Castillo4dc4a472014-08-12 11:17:06 +01005 */
6
Juan Castillo4dc4a472014-08-12 11:17:06 +01007#include <arch_helpers.h>
Soby Mathew61e615b2015-01-15 11:49:49 +00008#include <assert.h>
Antonio Nino Diaze3962d02017-02-16 16:17:19 +00009#include <console.h>
Juan Castillo4dc4a472014-08-12 11:17:06 +010010#include <debug.h>
11#include <platform.h>
Isla Mitchell99305012017-07-11 14:54:08 +010012#include <stddef.h>
Juan Castillo4dc4a472014-08-12 11:17:06 +010013#include "psci_private.h"
14
Etienne Carriere3fdf5f32017-06-07 16:42:42 +020015void __dead2 psci_system_off(void)
Juan Castillo4dc4a472014-08-12 11:17:06 +010016{
Soby Mathew981487a2015-07-13 14:10:57 +010017 psci_print_power_domain_map();
Juan Castillo4dc4a472014-08-12 11:17:06 +010018
Soby Mathew61e615b2015-01-15 11:49:49 +000019 assert(psci_plat_pm_ops->system_off);
20
Juan Castillo4dc4a472014-08-12 11:17:06 +010021 /* Notify the Secure Payload Dispatcher */
22 if (psci_spd_pm && psci_spd_pm->svc_system_off) {
23 psci_spd_pm->svc_system_off();
24 }
25
Antonio Nino Diaze3962d02017-02-16 16:17:19 +000026 console_flush();
27
Juan Castillo4dc4a472014-08-12 11:17:06 +010028 /* Call the platform specific hook */
29 psci_plat_pm_ops->system_off();
30
31 /* This function does not return. We should never get here */
32}
33
Etienne Carriere3fdf5f32017-06-07 16:42:42 +020034void __dead2 psci_system_reset(void)
Juan Castillo4dc4a472014-08-12 11:17:06 +010035{
Soby Mathew981487a2015-07-13 14:10:57 +010036 psci_print_power_domain_map();
Juan Castillo4dc4a472014-08-12 11:17:06 +010037
Soby Mathew61e615b2015-01-15 11:49:49 +000038 assert(psci_plat_pm_ops->system_reset);
39
Juan Castillo4dc4a472014-08-12 11:17:06 +010040 /* Notify the Secure Payload Dispatcher */
41 if (psci_spd_pm && psci_spd_pm->svc_system_reset) {
42 psci_spd_pm->svc_system_reset();
43 }
44
Antonio Nino Diaze3962d02017-02-16 16:17:19 +000045 console_flush();
46
Juan Castillo4dc4a472014-08-12 11:17:06 +010047 /* Call the platform specific hook */
48 psci_plat_pm_ops->system_reset();
49
50 /* This function does not return. We should never get here */
51}
Roberto Vargasb820ad02017-07-26 09:23:09 +010052
53int psci_system_reset2(uint32_t reset_type, u_register_t cookie)
54{
55 int is_vendor;
56
57 psci_print_power_domain_map();
58
59 assert(psci_plat_pm_ops->system_reset2);
60
61 is_vendor = (reset_type >> PSCI_RESET2_TYPE_VENDOR_SHIFT) & 1;
62 if (!is_vendor) {
63 /*
64 * Only WARM_RESET is allowed for architectural type resets.
65 */
66 if (reset_type != PSCI_RESET2_SYSTEM_WARM_RESET)
67 return PSCI_E_INVALID_PARAMS;
68 if (psci_plat_pm_ops->write_mem_protect &&
69 psci_plat_pm_ops->write_mem_protect(0) < 0) {
70 return PSCI_E_NOT_SUPPORTED;
71 }
72 }
73
74 /* Notify the Secure Payload Dispatcher */
75 if (psci_spd_pm && psci_spd_pm->svc_system_reset) {
76 psci_spd_pm->svc_system_reset();
77 }
78 console_flush();
79
80 return psci_plat_pm_ops->system_reset2(is_vendor, reset_type, cookie);
81}