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> 17414cf08bSSenthil Nathan Thangaraj 18414cf08bSSenthil Nathan Thangaraj #include "def.h" 19414cf08bSSenthil Nathan Thangaraj #include <ipi.h> 20414cf08bSSenthil Nathan Thangaraj #include <plat_private.h> 21414cf08bSSenthil Nathan Thangaraj #include "pm_api_sys.h" 22414cf08bSSenthil Nathan Thangaraj #include "pm_client.h" 23414cf08bSSenthil Nathan Thangaraj #include <pm_common.h> 24414cf08bSSenthil Nathan Thangaraj #include "pm_defs.h" 25414cf08bSSenthil Nathan Thangaraj #include "pm_svc_main.h" 26414cf08bSSenthil Nathan Thangaraj 27414cf08bSSenthil Nathan Thangaraj static uintptr_t sec_entry; 28414cf08bSSenthil Nathan Thangaraj 29414cf08bSSenthil Nathan Thangaraj static int32_t versal2_pwr_domain_on(u_register_t mpidr) 30414cf08bSSenthil Nathan Thangaraj { 31414cf08bSSenthil Nathan Thangaraj int32_t cpu_id = plat_core_pos_by_mpidr(mpidr); 32414cf08bSSenthil Nathan Thangaraj int32_t ret = (int32_t) PSCI_E_INTERN_FAIL; 33414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 34414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 35414cf08bSSenthil Nathan Thangaraj 36414cf08bSSenthil Nathan Thangaraj if (cpu_id != -1) { 37414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc((uint32_t)cpu_id); 38414cf08bSSenthil Nathan Thangaraj if (proc != NULL) { 39414cf08bSSenthil Nathan Thangaraj pm_ret = pm_req_wakeup(proc->node_id, 40414cf08bSSenthil Nathan Thangaraj (uint32_t) 41414cf08bSSenthil Nathan Thangaraj ((sec_entry & 0xFFFFFFFFU) | 0x1U), 42414cf08bSSenthil Nathan Thangaraj sec_entry >> 32, 0, 0); 43414cf08bSSenthil Nathan Thangaraj 44414cf08bSSenthil Nathan Thangaraj if (pm_ret == PM_RET_SUCCESS) { 45414cf08bSSenthil Nathan Thangaraj /* Clear power down request */ 46414cf08bSSenthil Nathan Thangaraj pm_client_wakeup(proc); 47414cf08bSSenthil Nathan Thangaraj ret = (int32_t) PSCI_E_SUCCESS; 48414cf08bSSenthil Nathan Thangaraj } 49414cf08bSSenthil Nathan Thangaraj } 50414cf08bSSenthil Nathan Thangaraj } 51414cf08bSSenthil Nathan Thangaraj 52414cf08bSSenthil Nathan Thangaraj return ret; 53414cf08bSSenthil Nathan Thangaraj } 54414cf08bSSenthil Nathan Thangaraj 55414cf08bSSenthil Nathan Thangaraj /** 56414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_off() - Turn off core. 57414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 58414cf08bSSenthil Nathan Thangaraj */ 59414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_off(const psci_power_state_t *target_state) 60414cf08bSSenthil Nathan Thangaraj { 61414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 62414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 63414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 64414cf08bSSenthil Nathan Thangaraj size_t i; 65414cf08bSSenthil Nathan Thangaraj 66414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 67414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 68414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 69414cf08bSSenthil Nathan Thangaraj goto err; 70414cf08bSSenthil Nathan Thangaraj } 71414cf08bSSenthil Nathan Thangaraj 72414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 73414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 74414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 75414cf08bSSenthil Nathan Thangaraj } 76414cf08bSSenthil Nathan Thangaraj 77414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_disable(); 78414cf08bSSenthil Nathan Thangaraj /* 79414cf08bSSenthil Nathan Thangaraj * Send request to PMC to power down the appropriate APU CPU 80414cf08bSSenthil Nathan Thangaraj * core. 81414cf08bSSenthil Nathan Thangaraj * According to PSCI specification, CPU_off function does not 82414cf08bSSenthil Nathan Thangaraj * have resume address and CPU core can only be woken up 83414cf08bSSenthil Nathan Thangaraj * invoking CPU_on function, during which resume address will 84414cf08bSSenthil Nathan Thangaraj * be set. 85414cf08bSSenthil Nathan Thangaraj */ 86414cf08bSSenthil Nathan Thangaraj pm_ret = pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0, 87414cf08bSSenthil Nathan Thangaraj SECURE_FLAG); 88414cf08bSSenthil Nathan Thangaraj 89414cf08bSSenthil Nathan Thangaraj if (pm_ret != PM_RET_SUCCESS) { 90414cf08bSSenthil Nathan Thangaraj ERROR("Failed to power down CPU %d\n", cpu_id); 91414cf08bSSenthil Nathan Thangaraj } 92414cf08bSSenthil Nathan Thangaraj err: 93414cf08bSSenthil Nathan Thangaraj return; 94414cf08bSSenthil Nathan Thangaraj } 95414cf08bSSenthil Nathan Thangaraj 96414cf08bSSenthil Nathan Thangaraj /** 97414cf08bSSenthil Nathan Thangaraj * versal2_system_reset() - Send the reset request to firmware for the 98414cf08bSSenthil Nathan Thangaraj * system to reset. This function does not 99414cf08bSSenthil Nathan Thangaraj * return as it resets system. 100414cf08bSSenthil Nathan Thangaraj */ 101414cf08bSSenthil Nathan Thangaraj static void __dead2 versal2_system_reset(void) 102414cf08bSSenthil Nathan Thangaraj { 103414cf08bSSenthil Nathan Thangaraj uint32_t timeout = 10000U; 104414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 105414cf08bSSenthil Nathan Thangaraj int32_t ret; 106414cf08bSSenthil Nathan Thangaraj 107414cf08bSSenthil Nathan Thangaraj request_cpu_pwrdwn(); 108414cf08bSSenthil Nathan Thangaraj 109414cf08bSSenthil Nathan Thangaraj /* 110414cf08bSSenthil Nathan Thangaraj * Send the system reset request to the firmware if power down request 111414cf08bSSenthil Nathan Thangaraj * is not received from firmware. 112414cf08bSSenthil Nathan Thangaraj */ 113*c0719d21SDevanshi Chauhan if (pm_pwrdwn_req_status() == false) { 114414cf08bSSenthil Nathan Thangaraj /* 115414cf08bSSenthil Nathan Thangaraj * TODO: shutdown scope for this reset needs be revised once 116414cf08bSSenthil Nathan Thangaraj * we have a clearer understanding of the overall reset scoping 117414cf08bSSenthil Nathan Thangaraj * including the implementation of SYSTEM_RESET2. 118414cf08bSSenthil Nathan Thangaraj */ 119414cf08bSSenthil Nathan Thangaraj pm_ret = pm_system_shutdown(XPM_SHUTDOWN_TYPE_RESET, 120414cf08bSSenthil Nathan Thangaraj pm_get_shutdown_scope(), SECURE_FLAG); 121414cf08bSSenthil Nathan Thangaraj 122414cf08bSSenthil Nathan Thangaraj if (pm_ret != PM_RET_SUCCESS) { 123414cf08bSSenthil Nathan Thangaraj WARN("System shutdown failed\n"); 124414cf08bSSenthil Nathan Thangaraj } 125414cf08bSSenthil Nathan Thangaraj 126414cf08bSSenthil Nathan Thangaraj /* 127414cf08bSSenthil Nathan Thangaraj * Wait for system shutdown request completed and idle callback 128414cf08bSSenthil Nathan Thangaraj * not received. 129414cf08bSSenthil Nathan Thangaraj */ 130414cf08bSSenthil Nathan Thangaraj do { 131414cf08bSSenthil Nathan Thangaraj ret = ipi_mb_enquire_status(primary_proc->ipi->local_ipi_id, 132414cf08bSSenthil Nathan Thangaraj primary_proc->ipi->remote_ipi_id); 133414cf08bSSenthil Nathan Thangaraj udelay(100); 134414cf08bSSenthil Nathan Thangaraj timeout--; 135414cf08bSSenthil Nathan Thangaraj } while ((ret != (int32_t)IPI_MB_STATUS_RECV_PENDING) && (timeout > 0U)); 136414cf08bSSenthil Nathan Thangaraj } 137414cf08bSSenthil Nathan Thangaraj 138414cf08bSSenthil Nathan Thangaraj (void)psci_cpu_off(); 139414cf08bSSenthil Nathan Thangaraj 140414cf08bSSenthil Nathan Thangaraj while (true) { 141414cf08bSSenthil Nathan Thangaraj wfi(); 142414cf08bSSenthil Nathan Thangaraj } 143414cf08bSSenthil Nathan Thangaraj } 144414cf08bSSenthil Nathan Thangaraj 145414cf08bSSenthil Nathan Thangaraj /** 146414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_suspend() - Send request to PMC to suspend core. 147414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 148414cf08bSSenthil Nathan Thangaraj */ 149414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_suspend(const psci_power_state_t *target_state) 150414cf08bSSenthil Nathan Thangaraj { 151414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 152414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 153414cf08bSSenthil Nathan Thangaraj uint32_t state; 154414cf08bSSenthil Nathan Thangaraj enum pm_ret_status ret; 155414cf08bSSenthil Nathan Thangaraj size_t i; 156414cf08bSSenthil Nathan Thangaraj 157414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 158414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 159414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 160414cf08bSSenthil Nathan Thangaraj goto err; 161414cf08bSSenthil Nathan Thangaraj } 162414cf08bSSenthil Nathan Thangaraj 163414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 164414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 165414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 166414cf08bSSenthil Nathan Thangaraj } 167414cf08bSSenthil Nathan Thangaraj 168414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_disable(); 169414cf08bSSenthil Nathan Thangaraj 170414cf08bSSenthil Nathan Thangaraj if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { 171414cf08bSSenthil Nathan Thangaraj plat_gic_save(); 172414cf08bSSenthil Nathan Thangaraj } 173414cf08bSSenthil Nathan Thangaraj 174414cf08bSSenthil Nathan Thangaraj state = (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) ? 175414cf08bSSenthil Nathan Thangaraj PM_STATE_SUSPEND_TO_RAM : PM_STATE_CPU_IDLE; 176414cf08bSSenthil Nathan Thangaraj 177414cf08bSSenthil Nathan Thangaraj /* Send request to PMC to suspend this core */ 178414cf08bSSenthil Nathan Thangaraj ret = pm_self_suspend(proc->node_id, MAX_LATENCY, state, sec_entry, 179414cf08bSSenthil Nathan Thangaraj SECURE_FLAG); 180414cf08bSSenthil Nathan Thangaraj 181414cf08bSSenthil Nathan Thangaraj if (ret != PM_RET_SUCCESS) { 182414cf08bSSenthil Nathan Thangaraj ERROR("Failed to power down CPU %d\n", cpu_id); 183414cf08bSSenthil Nathan Thangaraj } 184414cf08bSSenthil Nathan Thangaraj 185414cf08bSSenthil Nathan Thangaraj err: 186414cf08bSSenthil Nathan Thangaraj return; 187414cf08bSSenthil Nathan Thangaraj } 188414cf08bSSenthil Nathan Thangaraj 189414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_on_finish(const psci_power_state_t *target_state) 190414cf08bSSenthil Nathan Thangaraj { 191414cf08bSSenthil Nathan Thangaraj (void)target_state; 192414cf08bSSenthil Nathan Thangaraj 193414cf08bSSenthil Nathan Thangaraj /* Enable the gic cpu interface */ 194414cf08bSSenthil Nathan Thangaraj plat_gic_pcpu_init(); 195414cf08bSSenthil Nathan Thangaraj 196414cf08bSSenthil Nathan Thangaraj /* Program the gic per-cpu distributor or re-distributor interface */ 197414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_enable(); 198414cf08bSSenthil Nathan Thangaraj } 199414cf08bSSenthil Nathan Thangaraj 200414cf08bSSenthil Nathan Thangaraj /** 201414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_suspend_finish() - Performs actions to finish 202414cf08bSSenthil Nathan Thangaraj * suspend procedure. 203414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 204414cf08bSSenthil Nathan Thangaraj */ 205414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_suspend_finish(const psci_power_state_t *target_state) 206414cf08bSSenthil Nathan Thangaraj { 207414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 208414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 209414cf08bSSenthil Nathan Thangaraj size_t i; 210414cf08bSSenthil Nathan Thangaraj 211414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 212414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 213414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 214414cf08bSSenthil Nathan Thangaraj goto err; 215414cf08bSSenthil Nathan Thangaraj } 216414cf08bSSenthil Nathan Thangaraj 217414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 218414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 219414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 220414cf08bSSenthil Nathan Thangaraj } 221414cf08bSSenthil Nathan Thangaraj 222414cf08bSSenthil Nathan Thangaraj /* Clear the APU power control register for this cpu */ 223414cf08bSSenthil Nathan Thangaraj pm_client_wakeup(proc); 224414cf08bSSenthil Nathan Thangaraj 225414cf08bSSenthil Nathan Thangaraj /* APU was turned off, so restore GIC context */ 226414cf08bSSenthil Nathan Thangaraj if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { 227414cf08bSSenthil Nathan Thangaraj plat_gic_resume(); 228414cf08bSSenthil Nathan Thangaraj } 229414cf08bSSenthil Nathan Thangaraj 230414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_enable(); 231414cf08bSSenthil Nathan Thangaraj 232414cf08bSSenthil Nathan Thangaraj err: 233414cf08bSSenthil Nathan Thangaraj return; 234414cf08bSSenthil Nathan Thangaraj } 235414cf08bSSenthil Nathan Thangaraj 236414cf08bSSenthil Nathan Thangaraj /** 237414cf08bSSenthil Nathan Thangaraj * versal2_system_off() - Send the system off request to firmware. 238414cf08bSSenthil Nathan Thangaraj * This function does not return as it puts core into WFI 239414cf08bSSenthil Nathan Thangaraj */ 240414cf08bSSenthil Nathan Thangaraj static void __dead2 versal2_system_off(void) 241414cf08bSSenthil Nathan Thangaraj { 242414cf08bSSenthil Nathan Thangaraj enum pm_ret_status ret; 243414cf08bSSenthil Nathan Thangaraj 244414cf08bSSenthil Nathan Thangaraj /* Send the power down request to the PMC */ 245414cf08bSSenthil Nathan Thangaraj ret = pm_system_shutdown(XPM_SHUTDOWN_TYPE_SHUTDOWN, 246414cf08bSSenthil Nathan Thangaraj pm_get_shutdown_scope(), SECURE_FLAG); 247414cf08bSSenthil Nathan Thangaraj 248414cf08bSSenthil Nathan Thangaraj if (ret != PM_RET_SUCCESS) { 249414cf08bSSenthil Nathan Thangaraj ERROR("System shutdown failed\n"); 250414cf08bSSenthil Nathan Thangaraj } 251414cf08bSSenthil Nathan Thangaraj 252414cf08bSSenthil Nathan Thangaraj while (true) { 253414cf08bSSenthil Nathan Thangaraj wfi(); 254414cf08bSSenthil Nathan Thangaraj } 255414cf08bSSenthil Nathan Thangaraj } 256414cf08bSSenthil Nathan Thangaraj 257414cf08bSSenthil Nathan Thangaraj /** 258414cf08bSSenthil Nathan Thangaraj * versal2_validate_power_state() - Ensure that the power state 259414cf08bSSenthil Nathan Thangaraj * parameter in request is valid. 260414cf08bSSenthil Nathan Thangaraj * @power_state: Power state of core. 261414cf08bSSenthil Nathan Thangaraj * @req_state: Requested state. 262414cf08bSSenthil Nathan Thangaraj * 263414cf08bSSenthil Nathan Thangaraj * Return: Returns status, either PSCI_E_SUCCESS or reason. 264414cf08bSSenthil Nathan Thangaraj */ 265414cf08bSSenthil Nathan Thangaraj static int32_t versal2_validate_power_state(unsigned int power_state, 266414cf08bSSenthil Nathan Thangaraj psci_power_state_t *req_state) 267414cf08bSSenthil Nathan Thangaraj { 268414cf08bSSenthil Nathan Thangaraj uint32_t pstate = psci_get_pstate_type(power_state); 269414cf08bSSenthil Nathan Thangaraj int32_t ret = PSCI_E_SUCCESS; 270414cf08bSSenthil Nathan Thangaraj 271414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: power_state: 0x%x\n", __func__, power_state); 272414cf08bSSenthil Nathan Thangaraj 273414cf08bSSenthil Nathan Thangaraj assert(req_state); 274414cf08bSSenthil Nathan Thangaraj 275414cf08bSSenthil Nathan Thangaraj /* Sanity check the requested state */ 276414cf08bSSenthil Nathan Thangaraj if (pstate == PSTATE_TYPE_STANDBY) { 277414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[MPIDR_AFFLVL0] = PLAT_MAX_RET_STATE; 278414cf08bSSenthil Nathan Thangaraj } else { 279414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[MPIDR_AFFLVL0] = PLAT_MAX_OFF_STATE; 280414cf08bSSenthil Nathan Thangaraj } 281414cf08bSSenthil Nathan Thangaraj 282414cf08bSSenthil Nathan Thangaraj /* The 'state_id' is expected to be zero */ 283414cf08bSSenthil Nathan Thangaraj if (psci_get_pstate_id(power_state) != 0U) { 284414cf08bSSenthil Nathan Thangaraj ret = PSCI_E_INVALID_PARAMS; 285414cf08bSSenthil Nathan Thangaraj } 286414cf08bSSenthil Nathan Thangaraj 287414cf08bSSenthil Nathan Thangaraj return ret; 288414cf08bSSenthil Nathan Thangaraj } 289414cf08bSSenthil Nathan Thangaraj 290414cf08bSSenthil Nathan Thangaraj /** 291414cf08bSSenthil Nathan Thangaraj * versal2_get_sys_suspend_power_state() - Get power state for system 292414cf08bSSenthil Nathan Thangaraj * suspend. 293414cf08bSSenthil Nathan Thangaraj * @req_state: Requested state. 294414cf08bSSenthil Nathan Thangaraj */ 295414cf08bSSenthil Nathan Thangaraj static void versal2_get_sys_suspend_power_state(psci_power_state_t *req_state) 296414cf08bSSenthil Nathan Thangaraj { 297414cf08bSSenthil Nathan Thangaraj uint64_t i; 298414cf08bSSenthil Nathan Thangaraj 299414cf08bSSenthil Nathan Thangaraj for (i = MPIDR_AFFLVL0; i <= PLAT_MAX_PWR_LVL; i++) { 300414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[i] = PLAT_MAX_OFF_STATE; 301414cf08bSSenthil Nathan Thangaraj } 302414cf08bSSenthil Nathan Thangaraj } 303414cf08bSSenthil Nathan Thangaraj 304414cf08bSSenthil Nathan Thangaraj /** 305414cf08bSSenthil Nathan Thangaraj * Export the platform specific power ops. 306414cf08bSSenthil Nathan Thangaraj */ 307414cf08bSSenthil Nathan Thangaraj static const struct plat_psci_ops versal2_nopmc_psci_ops = { 308414cf08bSSenthil Nathan Thangaraj .pwr_domain_on = versal2_pwr_domain_on, 309414cf08bSSenthil Nathan Thangaraj .pwr_domain_off = versal2_pwr_domain_off, 310414cf08bSSenthil Nathan Thangaraj .pwr_domain_on_finish = versal2_pwr_domain_on_finish, 311414cf08bSSenthil Nathan Thangaraj .pwr_domain_suspend = versal2_pwr_domain_suspend, 312414cf08bSSenthil Nathan Thangaraj .pwr_domain_suspend_finish = versal2_pwr_domain_suspend_finish, 313414cf08bSSenthil Nathan Thangaraj .system_off = versal2_system_off, 314414cf08bSSenthil Nathan Thangaraj .system_reset = versal2_system_reset, 315414cf08bSSenthil Nathan Thangaraj .validate_power_state = versal2_validate_power_state, 316414cf08bSSenthil Nathan Thangaraj .get_sys_suspend_power_state = versal2_get_sys_suspend_power_state, 317414cf08bSSenthil Nathan Thangaraj }; 318414cf08bSSenthil Nathan Thangaraj 319414cf08bSSenthil Nathan Thangaraj int plat_setup_psci_ops(uintptr_t sec_entrypoint, 320414cf08bSSenthil Nathan Thangaraj const struct plat_psci_ops **psci_ops) 321414cf08bSSenthil Nathan Thangaraj { 322414cf08bSSenthil Nathan Thangaraj sec_entry = sec_entrypoint; 323414cf08bSSenthil Nathan Thangaraj 324414cf08bSSenthil Nathan Thangaraj VERBOSE("Setting up entry point %lx\n", sec_entry); 325414cf08bSSenthil Nathan Thangaraj 326414cf08bSSenthil Nathan Thangaraj *psci_ops = &versal2_nopmc_psci_ops; 327414cf08bSSenthil Nathan Thangaraj 328414cf08bSSenthil Nathan Thangaraj return 0; 329414cf08bSSenthil Nathan Thangaraj } 330414cf08bSSenthil Nathan Thangaraj 331414cf08bSSenthil Nathan Thangaraj int32_t sip_svc_setup_init(void) 332414cf08bSSenthil Nathan Thangaraj { 333414cf08bSSenthil Nathan Thangaraj return pm_setup(); 334414cf08bSSenthil Nathan Thangaraj } 335414cf08bSSenthil Nathan Thangaraj 336414cf08bSSenthil Nathan Thangaraj uint64_t smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, 337414cf08bSSenthil Nathan Thangaraj const void *cookie, void *handle, uint64_t flags) 338414cf08bSSenthil Nathan Thangaraj { 339414cf08bSSenthil Nathan Thangaraj return pm_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags); 340414cf08bSSenthil Nathan Thangaraj } 341