1414cf08bSSenthil Nathan Thangaraj /* 2414cf08bSSenthil Nathan Thangaraj * Copyright (c) 2022, Xilinx, Inc. All rights reserved. 3414cf08bSSenthil Nathan Thangaraj * Copyright (c) 2022-2025, Advanced Micro Devices, Inc. All rights reserved. 4414cf08bSSenthil Nathan Thangaraj * 5414cf08bSSenthil Nathan Thangaraj * SPDX-License-Identifier: BSD-3-Clause 6414cf08bSSenthil Nathan Thangaraj */ 7414cf08bSSenthil Nathan Thangaraj 8414cf08bSSenthil Nathan Thangaraj #include <assert.h> 9414cf08bSSenthil Nathan Thangaraj 10414cf08bSSenthil Nathan Thangaraj #include <common/debug.h> 11414cf08bSSenthil Nathan Thangaraj #include <drivers/delay_timer.h> 12414cf08bSSenthil Nathan Thangaraj #include <lib/mmio.h> 13414cf08bSSenthil Nathan Thangaraj #include <lib/psci/psci.h> 14414cf08bSSenthil Nathan Thangaraj #include <plat/arm/common/plat_arm.h> 15414cf08bSSenthil Nathan Thangaraj #include <plat/common/platform.h> 16414cf08bSSenthil Nathan Thangaraj #include <plat_arm.h> 17*27e72221SMaheedhar Bollapalli #include <plat_fdt.h> 18414cf08bSSenthil Nathan Thangaraj 19414cf08bSSenthil Nathan Thangaraj #include "def.h" 20414cf08bSSenthil Nathan Thangaraj #include <ipi.h> 21414cf08bSSenthil Nathan Thangaraj #include <plat_private.h> 22414cf08bSSenthil Nathan Thangaraj #include "pm_api_sys.h" 23414cf08bSSenthil Nathan Thangaraj #include "pm_client.h" 24414cf08bSSenthil Nathan Thangaraj #include <pm_common.h> 25414cf08bSSenthil Nathan Thangaraj #include "pm_defs.h" 26414cf08bSSenthil Nathan Thangaraj #include "pm_svc_main.h" 27414cf08bSSenthil Nathan Thangaraj 28414cf08bSSenthil Nathan Thangaraj static uintptr_t sec_entry; 29414cf08bSSenthil Nathan Thangaraj 30414cf08bSSenthil Nathan Thangaraj static int32_t versal2_pwr_domain_on(u_register_t mpidr) 31414cf08bSSenthil Nathan Thangaraj { 32414cf08bSSenthil Nathan Thangaraj int32_t cpu_id = plat_core_pos_by_mpidr(mpidr); 33414cf08bSSenthil Nathan Thangaraj int32_t ret = (int32_t) PSCI_E_INTERN_FAIL; 34414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 35414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 36414cf08bSSenthil Nathan Thangaraj 37414cf08bSSenthil Nathan Thangaraj if (cpu_id != -1) { 38414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc((uint32_t)cpu_id); 39414cf08bSSenthil Nathan Thangaraj if (proc != NULL) { 40414cf08bSSenthil Nathan Thangaraj pm_ret = pm_req_wakeup(proc->node_id, 41414cf08bSSenthil Nathan Thangaraj (uint32_t) 42414cf08bSSenthil Nathan Thangaraj ((sec_entry & 0xFFFFFFFFU) | 0x1U), 43414cf08bSSenthil Nathan Thangaraj sec_entry >> 32, 0, 0); 44414cf08bSSenthil Nathan Thangaraj 45414cf08bSSenthil Nathan Thangaraj if (pm_ret == PM_RET_SUCCESS) { 46414cf08bSSenthil Nathan Thangaraj /* Clear power down request */ 47414cf08bSSenthil Nathan Thangaraj pm_client_wakeup(proc); 48414cf08bSSenthil Nathan Thangaraj ret = (int32_t) PSCI_E_SUCCESS; 49414cf08bSSenthil Nathan Thangaraj } 50414cf08bSSenthil Nathan Thangaraj } 51414cf08bSSenthil Nathan Thangaraj } 52414cf08bSSenthil Nathan Thangaraj 53414cf08bSSenthil Nathan Thangaraj return ret; 54414cf08bSSenthil Nathan Thangaraj } 55414cf08bSSenthil Nathan Thangaraj 56414cf08bSSenthil Nathan Thangaraj /** 57414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_off() - Turn off core. 58414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 59414cf08bSSenthil Nathan Thangaraj */ 60414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_off(const psci_power_state_t *target_state) 61414cf08bSSenthil Nathan Thangaraj { 62414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 63414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 64414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 65414cf08bSSenthil Nathan Thangaraj size_t i; 66414cf08bSSenthil Nathan Thangaraj 67414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 68414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 69414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 70414cf08bSSenthil Nathan Thangaraj goto err; 71414cf08bSSenthil Nathan Thangaraj } 72414cf08bSSenthil Nathan Thangaraj 73414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 74414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 75414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 76414cf08bSSenthil Nathan Thangaraj } 77414cf08bSSenthil Nathan Thangaraj 78414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_disable(); 79414cf08bSSenthil Nathan Thangaraj /* 80414cf08bSSenthil Nathan Thangaraj * Send request to PMC to power down the appropriate APU CPU 81414cf08bSSenthil Nathan Thangaraj * core. 82414cf08bSSenthil Nathan Thangaraj * According to PSCI specification, CPU_off function does not 83414cf08bSSenthil Nathan Thangaraj * have resume address and CPU core can only be woken up 84414cf08bSSenthil Nathan Thangaraj * invoking CPU_on function, during which resume address will 85414cf08bSSenthil Nathan Thangaraj * be set. 86414cf08bSSenthil Nathan Thangaraj */ 87414cf08bSSenthil Nathan Thangaraj pm_ret = pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0, 88414cf08bSSenthil Nathan Thangaraj SECURE_FLAG); 89414cf08bSSenthil Nathan Thangaraj 90414cf08bSSenthil Nathan Thangaraj if (pm_ret != PM_RET_SUCCESS) { 91414cf08bSSenthil Nathan Thangaraj ERROR("Failed to power down CPU %d\n", cpu_id); 92414cf08bSSenthil Nathan Thangaraj } 93414cf08bSSenthil Nathan Thangaraj err: 94414cf08bSSenthil Nathan Thangaraj return; 95414cf08bSSenthil Nathan Thangaraj } 96414cf08bSSenthil Nathan Thangaraj 97414cf08bSSenthil Nathan Thangaraj /** 98414cf08bSSenthil Nathan Thangaraj * versal2_system_reset() - Send the reset request to firmware for the 99414cf08bSSenthil Nathan Thangaraj * system to reset. This function does not 100414cf08bSSenthil Nathan Thangaraj * return as it resets system. 101414cf08bSSenthil Nathan Thangaraj */ 102414cf08bSSenthil Nathan Thangaraj static void __dead2 versal2_system_reset(void) 103414cf08bSSenthil Nathan Thangaraj { 104414cf08bSSenthil Nathan Thangaraj uint32_t timeout = 10000U; 105414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 106414cf08bSSenthil Nathan Thangaraj int32_t ret; 107414cf08bSSenthil Nathan Thangaraj 108414cf08bSSenthil Nathan Thangaraj request_cpu_pwrdwn(); 109414cf08bSSenthil Nathan Thangaraj 110414cf08bSSenthil Nathan Thangaraj /* 111414cf08bSSenthil Nathan Thangaraj * Send the system reset request to the firmware if power down request 112414cf08bSSenthil Nathan Thangaraj * is not received from firmware. 113414cf08bSSenthil Nathan Thangaraj */ 114c0719d21SDevanshi Chauhan if (pm_pwrdwn_req_status() == false) { 115414cf08bSSenthil Nathan Thangaraj /* 116414cf08bSSenthil Nathan Thangaraj * TODO: shutdown scope for this reset needs be revised once 117414cf08bSSenthil Nathan Thangaraj * we have a clearer understanding of the overall reset scoping 118414cf08bSSenthil Nathan Thangaraj * including the implementation of SYSTEM_RESET2. 119414cf08bSSenthil Nathan Thangaraj */ 120414cf08bSSenthil Nathan Thangaraj pm_ret = pm_system_shutdown(XPM_SHUTDOWN_TYPE_RESET, 121414cf08bSSenthil Nathan Thangaraj pm_get_shutdown_scope(), SECURE_FLAG); 122414cf08bSSenthil Nathan Thangaraj 123414cf08bSSenthil Nathan Thangaraj if (pm_ret != PM_RET_SUCCESS) { 124414cf08bSSenthil Nathan Thangaraj WARN("System shutdown failed\n"); 125414cf08bSSenthil Nathan Thangaraj } 126414cf08bSSenthil Nathan Thangaraj 127414cf08bSSenthil Nathan Thangaraj /* 128414cf08bSSenthil Nathan Thangaraj * Wait for system shutdown request completed and idle callback 129414cf08bSSenthil Nathan Thangaraj * not received. 130414cf08bSSenthil Nathan Thangaraj */ 131414cf08bSSenthil Nathan Thangaraj do { 132414cf08bSSenthil Nathan Thangaraj ret = ipi_mb_enquire_status(primary_proc->ipi->local_ipi_id, 133414cf08bSSenthil Nathan Thangaraj primary_proc->ipi->remote_ipi_id); 134414cf08bSSenthil Nathan Thangaraj udelay(100); 135414cf08bSSenthil Nathan Thangaraj timeout--; 136414cf08bSSenthil Nathan Thangaraj } while ((ret != (int32_t)IPI_MB_STATUS_RECV_PENDING) && (timeout > 0U)); 137414cf08bSSenthil Nathan Thangaraj } 138414cf08bSSenthil Nathan Thangaraj 139414cf08bSSenthil Nathan Thangaraj (void)psci_cpu_off(); 140414cf08bSSenthil Nathan Thangaraj 141414cf08bSSenthil Nathan Thangaraj while (true) { 142414cf08bSSenthil Nathan Thangaraj wfi(); 143414cf08bSSenthil Nathan Thangaraj } 144414cf08bSSenthil Nathan Thangaraj } 145414cf08bSSenthil Nathan Thangaraj 146414cf08bSSenthil Nathan Thangaraj /** 147414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_suspend() - Send request to PMC to suspend core. 148414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 149414cf08bSSenthil Nathan Thangaraj */ 150414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_suspend(const psci_power_state_t *target_state) 151414cf08bSSenthil Nathan Thangaraj { 152414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 153414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 154414cf08bSSenthil Nathan Thangaraj uint32_t state; 155414cf08bSSenthil Nathan Thangaraj enum pm_ret_status ret; 156414cf08bSSenthil Nathan Thangaraj size_t i; 157414cf08bSSenthil Nathan Thangaraj 158414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 159414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 160414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 161414cf08bSSenthil Nathan Thangaraj goto err; 162414cf08bSSenthil Nathan Thangaraj } 163414cf08bSSenthil Nathan Thangaraj 164414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 165414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 166414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 167414cf08bSSenthil Nathan Thangaraj } 168414cf08bSSenthil Nathan Thangaraj 169414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_disable(); 170414cf08bSSenthil Nathan Thangaraj 171414cf08bSSenthil Nathan Thangaraj if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { 172414cf08bSSenthil Nathan Thangaraj plat_gic_save(); 173414cf08bSSenthil Nathan Thangaraj } 174414cf08bSSenthil Nathan Thangaraj 175414cf08bSSenthil Nathan Thangaraj state = (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) ? 176414cf08bSSenthil Nathan Thangaraj PM_STATE_SUSPEND_TO_RAM : PM_STATE_CPU_IDLE; 177414cf08bSSenthil Nathan Thangaraj 178414cf08bSSenthil Nathan Thangaraj /* Send request to PMC to suspend this core */ 179414cf08bSSenthil Nathan Thangaraj ret = pm_self_suspend(proc->node_id, MAX_LATENCY, state, sec_entry, 180414cf08bSSenthil Nathan Thangaraj SECURE_FLAG); 181414cf08bSSenthil Nathan Thangaraj 182414cf08bSSenthil Nathan Thangaraj if (ret != PM_RET_SUCCESS) { 183414cf08bSSenthil Nathan Thangaraj ERROR("Failed to power down CPU %d\n", cpu_id); 184414cf08bSSenthil Nathan Thangaraj } 185414cf08bSSenthil Nathan Thangaraj 186414cf08bSSenthil Nathan Thangaraj err: 187414cf08bSSenthil Nathan Thangaraj return; 188414cf08bSSenthil Nathan Thangaraj } 189414cf08bSSenthil Nathan Thangaraj 190*27e72221SMaheedhar Bollapalli static int32_t versal2_validate_ns_entrypoint(uint64_t ns_entrypoint) 191*27e72221SMaheedhar Bollapalli { 192*27e72221SMaheedhar Bollapalli int32_t ret = PSCI_E_SUCCESS; 193*27e72221SMaheedhar Bollapalli struct reserve_mem_range *rmr; 194*27e72221SMaheedhar Bollapalli uint32_t index = 0, counter = 0; 195*27e72221SMaheedhar Bollapalli 196*27e72221SMaheedhar Bollapalli rmr = get_reserved_entries_fdt(&counter); 197*27e72221SMaheedhar Bollapalli 198*27e72221SMaheedhar Bollapalli VERBOSE("Validate ns_entry point %lx\n", ns_entrypoint); 199*27e72221SMaheedhar Bollapalli 200*27e72221SMaheedhar Bollapalli if (counter != 0) { 201*27e72221SMaheedhar Bollapalli while (index < counter) { 202*27e72221SMaheedhar Bollapalli if ((ns_entrypoint >= rmr[index].base) && 203*27e72221SMaheedhar Bollapalli (ns_entrypoint <= rmr[index].size)) { 204*27e72221SMaheedhar Bollapalli ret = PSCI_E_INVALID_ADDRESS; 205*27e72221SMaheedhar Bollapalli break; 206*27e72221SMaheedhar Bollapalli } 207*27e72221SMaheedhar Bollapalli index++; 208*27e72221SMaheedhar Bollapalli } 209*27e72221SMaheedhar Bollapalli } else { 210*27e72221SMaheedhar Bollapalli if ((ns_entrypoint >= BL31_BASE) && (ns_entrypoint <= BL31_LIMIT)) { 211*27e72221SMaheedhar Bollapalli ret = PSCI_E_INVALID_ADDRESS; 212*27e72221SMaheedhar Bollapalli } 213*27e72221SMaheedhar Bollapalli } 214*27e72221SMaheedhar Bollapalli 215*27e72221SMaheedhar Bollapalli return ret; 216*27e72221SMaheedhar Bollapalli } 217*27e72221SMaheedhar Bollapalli 218414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_on_finish(const psci_power_state_t *target_state) 219414cf08bSSenthil Nathan Thangaraj { 220414cf08bSSenthil Nathan Thangaraj (void)target_state; 221414cf08bSSenthil Nathan Thangaraj 222414cf08bSSenthil Nathan Thangaraj /* Enable the gic cpu interface */ 223414cf08bSSenthil Nathan Thangaraj plat_gic_pcpu_init(); 224414cf08bSSenthil Nathan Thangaraj 225414cf08bSSenthil Nathan Thangaraj /* Program the gic per-cpu distributor or re-distributor interface */ 226414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_enable(); 227414cf08bSSenthil Nathan Thangaraj } 228414cf08bSSenthil Nathan Thangaraj 229414cf08bSSenthil Nathan Thangaraj /** 230414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_suspend_finish() - Performs actions to finish 231414cf08bSSenthil Nathan Thangaraj * suspend procedure. 232414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 233414cf08bSSenthil Nathan Thangaraj */ 234414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_suspend_finish(const psci_power_state_t *target_state) 235414cf08bSSenthil Nathan Thangaraj { 236414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 237414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 238414cf08bSSenthil Nathan Thangaraj size_t i; 239414cf08bSSenthil Nathan Thangaraj 240414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 241414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 242414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 243414cf08bSSenthil Nathan Thangaraj goto err; 244414cf08bSSenthil Nathan Thangaraj } 245414cf08bSSenthil Nathan Thangaraj 246414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 247414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 248414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 249414cf08bSSenthil Nathan Thangaraj } 250414cf08bSSenthil Nathan Thangaraj 251414cf08bSSenthil Nathan Thangaraj /* Clear the APU power control register for this cpu */ 252414cf08bSSenthil Nathan Thangaraj pm_client_wakeup(proc); 253414cf08bSSenthil Nathan Thangaraj 254414cf08bSSenthil Nathan Thangaraj /* APU was turned off, so restore GIC context */ 255414cf08bSSenthil Nathan Thangaraj if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { 256414cf08bSSenthil Nathan Thangaraj plat_gic_resume(); 257414cf08bSSenthil Nathan Thangaraj } 258414cf08bSSenthil Nathan Thangaraj 259414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_enable(); 260414cf08bSSenthil Nathan Thangaraj 261414cf08bSSenthil Nathan Thangaraj err: 262414cf08bSSenthil Nathan Thangaraj return; 263414cf08bSSenthil Nathan Thangaraj } 264414cf08bSSenthil Nathan Thangaraj 265414cf08bSSenthil Nathan Thangaraj /** 266414cf08bSSenthil Nathan Thangaraj * versal2_system_off() - Send the system off request to firmware. 267414cf08bSSenthil Nathan Thangaraj * This function does not return as it puts core into WFI 268414cf08bSSenthil Nathan Thangaraj */ 269414cf08bSSenthil Nathan Thangaraj static void __dead2 versal2_system_off(void) 270414cf08bSSenthil Nathan Thangaraj { 271414cf08bSSenthil Nathan Thangaraj enum pm_ret_status ret; 272414cf08bSSenthil Nathan Thangaraj 273414cf08bSSenthil Nathan Thangaraj /* Send the power down request to the PMC */ 274414cf08bSSenthil Nathan Thangaraj ret = pm_system_shutdown(XPM_SHUTDOWN_TYPE_SHUTDOWN, 275414cf08bSSenthil Nathan Thangaraj pm_get_shutdown_scope(), SECURE_FLAG); 276414cf08bSSenthil Nathan Thangaraj 277414cf08bSSenthil Nathan Thangaraj if (ret != PM_RET_SUCCESS) { 278414cf08bSSenthil Nathan Thangaraj ERROR("System shutdown failed\n"); 279414cf08bSSenthil Nathan Thangaraj } 280414cf08bSSenthil Nathan Thangaraj 281414cf08bSSenthil Nathan Thangaraj while (true) { 282414cf08bSSenthil Nathan Thangaraj wfi(); 283414cf08bSSenthil Nathan Thangaraj } 284414cf08bSSenthil Nathan Thangaraj } 285414cf08bSSenthil Nathan Thangaraj 286414cf08bSSenthil Nathan Thangaraj /** 287414cf08bSSenthil Nathan Thangaraj * versal2_validate_power_state() - Ensure that the power state 288414cf08bSSenthil Nathan Thangaraj * parameter in request is valid. 289414cf08bSSenthil Nathan Thangaraj * @power_state: Power state of core. 290414cf08bSSenthil Nathan Thangaraj * @req_state: Requested state. 291414cf08bSSenthil Nathan Thangaraj * 292414cf08bSSenthil Nathan Thangaraj * Return: Returns status, either PSCI_E_SUCCESS or reason. 293414cf08bSSenthil Nathan Thangaraj */ 294414cf08bSSenthil Nathan Thangaraj static int32_t versal2_validate_power_state(unsigned int power_state, 295414cf08bSSenthil Nathan Thangaraj psci_power_state_t *req_state) 296414cf08bSSenthil Nathan Thangaraj { 297414cf08bSSenthil Nathan Thangaraj uint32_t pstate = psci_get_pstate_type(power_state); 298414cf08bSSenthil Nathan Thangaraj int32_t ret = PSCI_E_SUCCESS; 299414cf08bSSenthil Nathan Thangaraj 300414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: power_state: 0x%x\n", __func__, power_state); 301414cf08bSSenthil Nathan Thangaraj 302414cf08bSSenthil Nathan Thangaraj assert(req_state); 303414cf08bSSenthil Nathan Thangaraj 304414cf08bSSenthil Nathan Thangaraj /* Sanity check the requested state */ 305414cf08bSSenthil Nathan Thangaraj if (pstate == PSTATE_TYPE_STANDBY) { 306414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[MPIDR_AFFLVL0] = PLAT_MAX_RET_STATE; 307414cf08bSSenthil Nathan Thangaraj } else { 308414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[MPIDR_AFFLVL0] = PLAT_MAX_OFF_STATE; 309414cf08bSSenthil Nathan Thangaraj } 310414cf08bSSenthil Nathan Thangaraj 311414cf08bSSenthil Nathan Thangaraj /* The 'state_id' is expected to be zero */ 312414cf08bSSenthil Nathan Thangaraj if (psci_get_pstate_id(power_state) != 0U) { 313414cf08bSSenthil Nathan Thangaraj ret = PSCI_E_INVALID_PARAMS; 314414cf08bSSenthil Nathan Thangaraj } 315414cf08bSSenthil Nathan Thangaraj 316414cf08bSSenthil Nathan Thangaraj return ret; 317414cf08bSSenthil Nathan Thangaraj } 318414cf08bSSenthil Nathan Thangaraj 319414cf08bSSenthil Nathan Thangaraj /** 320414cf08bSSenthil Nathan Thangaraj * versal2_get_sys_suspend_power_state() - Get power state for system 321414cf08bSSenthil Nathan Thangaraj * suspend. 322414cf08bSSenthil Nathan Thangaraj * @req_state: Requested state. 323414cf08bSSenthil Nathan Thangaraj */ 324414cf08bSSenthil Nathan Thangaraj static void versal2_get_sys_suspend_power_state(psci_power_state_t *req_state) 325414cf08bSSenthil Nathan Thangaraj { 326414cf08bSSenthil Nathan Thangaraj uint64_t i; 327414cf08bSSenthil Nathan Thangaraj 328414cf08bSSenthil Nathan Thangaraj for (i = MPIDR_AFFLVL0; i <= PLAT_MAX_PWR_LVL; i++) { 329414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[i] = PLAT_MAX_OFF_STATE; 330414cf08bSSenthil Nathan Thangaraj } 331414cf08bSSenthil Nathan Thangaraj } 332414cf08bSSenthil Nathan Thangaraj 333414cf08bSSenthil Nathan Thangaraj /** 334414cf08bSSenthil Nathan Thangaraj * Export the platform specific power ops. 335414cf08bSSenthil Nathan Thangaraj */ 336414cf08bSSenthil Nathan Thangaraj static const struct plat_psci_ops versal2_nopmc_psci_ops = { 337414cf08bSSenthil Nathan Thangaraj .pwr_domain_on = versal2_pwr_domain_on, 338414cf08bSSenthil Nathan Thangaraj .pwr_domain_off = versal2_pwr_domain_off, 339414cf08bSSenthil Nathan Thangaraj .pwr_domain_on_finish = versal2_pwr_domain_on_finish, 340414cf08bSSenthil Nathan Thangaraj .pwr_domain_suspend = versal2_pwr_domain_suspend, 341414cf08bSSenthil Nathan Thangaraj .pwr_domain_suspend_finish = versal2_pwr_domain_suspend_finish, 342414cf08bSSenthil Nathan Thangaraj .system_off = versal2_system_off, 343414cf08bSSenthil Nathan Thangaraj .system_reset = versal2_system_reset, 344*27e72221SMaheedhar Bollapalli .validate_ns_entrypoint = versal2_validate_ns_entrypoint, 345414cf08bSSenthil Nathan Thangaraj .validate_power_state = versal2_validate_power_state, 346414cf08bSSenthil Nathan Thangaraj .get_sys_suspend_power_state = versal2_get_sys_suspend_power_state, 347414cf08bSSenthil Nathan Thangaraj }; 348414cf08bSSenthil Nathan Thangaraj 349414cf08bSSenthil Nathan Thangaraj int plat_setup_psci_ops(uintptr_t sec_entrypoint, 350414cf08bSSenthil Nathan Thangaraj const struct plat_psci_ops **psci_ops) 351414cf08bSSenthil Nathan Thangaraj { 352414cf08bSSenthil Nathan Thangaraj sec_entry = sec_entrypoint; 353414cf08bSSenthil Nathan Thangaraj 354414cf08bSSenthil Nathan Thangaraj VERBOSE("Setting up entry point %lx\n", sec_entry); 355414cf08bSSenthil Nathan Thangaraj 356414cf08bSSenthil Nathan Thangaraj *psci_ops = &versal2_nopmc_psci_ops; 357414cf08bSSenthil Nathan Thangaraj 358414cf08bSSenthil Nathan Thangaraj return 0; 359414cf08bSSenthil Nathan Thangaraj } 360414cf08bSSenthil Nathan Thangaraj 361414cf08bSSenthil Nathan Thangaraj int32_t sip_svc_setup_init(void) 362414cf08bSSenthil Nathan Thangaraj { 363414cf08bSSenthil Nathan Thangaraj return pm_setup(); 364414cf08bSSenthil Nathan Thangaraj } 365414cf08bSSenthil Nathan Thangaraj 366414cf08bSSenthil Nathan Thangaraj uint64_t smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, 367414cf08bSSenthil Nathan Thangaraj const void *cookie, void *handle, uint64_t flags) 368414cf08bSSenthil Nathan Thangaraj { 369414cf08bSSenthil Nathan Thangaraj return pm_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags); 370414cf08bSSenthil Nathan Thangaraj } 371