1*414cf08bSSenthil Nathan Thangaraj /* 2*414cf08bSSenthil Nathan Thangaraj * Copyright (c) 2022, Xilinx, Inc. All rights reserved. 3*414cf08bSSenthil Nathan Thangaraj * Copyright (c) 2022-2025, Advanced Micro Devices, Inc. All rights reserved. 4*414cf08bSSenthil Nathan Thangaraj * 5*414cf08bSSenthil Nathan Thangaraj * SPDX-License-Identifier: BSD-3-Clause 6*414cf08bSSenthil Nathan Thangaraj */ 7*414cf08bSSenthil Nathan Thangaraj 8*414cf08bSSenthil Nathan Thangaraj #include <assert.h> 9*414cf08bSSenthil Nathan Thangaraj 10*414cf08bSSenthil Nathan Thangaraj #include <common/debug.h> 11*414cf08bSSenthil Nathan Thangaraj #include <drivers/delay_timer.h> 12*414cf08bSSenthil Nathan Thangaraj #include <lib/mmio.h> 13*414cf08bSSenthil Nathan Thangaraj #include <lib/psci/psci.h> 14*414cf08bSSenthil Nathan Thangaraj #include <plat/arm/common/plat_arm.h> 15*414cf08bSSenthil Nathan Thangaraj #include <plat/common/platform.h> 16*414cf08bSSenthil Nathan Thangaraj #include <plat_arm.h> 17*414cf08bSSenthil Nathan Thangaraj 18*414cf08bSSenthil Nathan Thangaraj #include "def.h" 19*414cf08bSSenthil Nathan Thangaraj #include <ipi.h> 20*414cf08bSSenthil Nathan Thangaraj #include <plat_private.h> 21*414cf08bSSenthil Nathan Thangaraj #include "pm_api_sys.h" 22*414cf08bSSenthil Nathan Thangaraj #include "pm_client.h" 23*414cf08bSSenthil Nathan Thangaraj #include <pm_common.h> 24*414cf08bSSenthil Nathan Thangaraj #include "pm_defs.h" 25*414cf08bSSenthil Nathan Thangaraj #include "pm_svc_main.h" 26*414cf08bSSenthil Nathan Thangaraj 27*414cf08bSSenthil Nathan Thangaraj static uintptr_t sec_entry; 28*414cf08bSSenthil Nathan Thangaraj 29*414cf08bSSenthil Nathan Thangaraj static int32_t versal2_pwr_domain_on(u_register_t mpidr) 30*414cf08bSSenthil Nathan Thangaraj { 31*414cf08bSSenthil Nathan Thangaraj int32_t cpu_id = plat_core_pos_by_mpidr(mpidr); 32*414cf08bSSenthil Nathan Thangaraj int32_t ret = (int32_t) PSCI_E_INTERN_FAIL; 33*414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 34*414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 35*414cf08bSSenthil Nathan Thangaraj 36*414cf08bSSenthil Nathan Thangaraj if (cpu_id != -1) { 37*414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc((uint32_t)cpu_id); 38*414cf08bSSenthil Nathan Thangaraj if (proc != NULL) { 39*414cf08bSSenthil Nathan Thangaraj pm_ret = pm_req_wakeup(proc->node_id, 40*414cf08bSSenthil Nathan Thangaraj (uint32_t) 41*414cf08bSSenthil Nathan Thangaraj ((sec_entry & 0xFFFFFFFFU) | 0x1U), 42*414cf08bSSenthil Nathan Thangaraj sec_entry >> 32, 0, 0); 43*414cf08bSSenthil Nathan Thangaraj 44*414cf08bSSenthil Nathan Thangaraj if (pm_ret == PM_RET_SUCCESS) { 45*414cf08bSSenthil Nathan Thangaraj /* Clear power down request */ 46*414cf08bSSenthil Nathan Thangaraj pm_client_wakeup(proc); 47*414cf08bSSenthil Nathan Thangaraj ret = (int32_t) PSCI_E_SUCCESS; 48*414cf08bSSenthil Nathan Thangaraj } 49*414cf08bSSenthil Nathan Thangaraj } 50*414cf08bSSenthil Nathan Thangaraj } 51*414cf08bSSenthil Nathan Thangaraj 52*414cf08bSSenthil Nathan Thangaraj return ret; 53*414cf08bSSenthil Nathan Thangaraj } 54*414cf08bSSenthil Nathan Thangaraj 55*414cf08bSSenthil Nathan Thangaraj /** 56*414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_off() - Turn off core. 57*414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 58*414cf08bSSenthil Nathan Thangaraj */ 59*414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_off(const psci_power_state_t *target_state) 60*414cf08bSSenthil Nathan Thangaraj { 61*414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 62*414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 63*414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 64*414cf08bSSenthil Nathan Thangaraj size_t i; 65*414cf08bSSenthil Nathan Thangaraj 66*414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 67*414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 68*414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 69*414cf08bSSenthil Nathan Thangaraj goto err; 70*414cf08bSSenthil Nathan Thangaraj } 71*414cf08bSSenthil Nathan Thangaraj 72*414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 73*414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 74*414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 75*414cf08bSSenthil Nathan Thangaraj } 76*414cf08bSSenthil Nathan Thangaraj 77*414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_disable(); 78*414cf08bSSenthil Nathan Thangaraj /* 79*414cf08bSSenthil Nathan Thangaraj * Send request to PMC to power down the appropriate APU CPU 80*414cf08bSSenthil Nathan Thangaraj * core. 81*414cf08bSSenthil Nathan Thangaraj * According to PSCI specification, CPU_off function does not 82*414cf08bSSenthil Nathan Thangaraj * have resume address and CPU core can only be woken up 83*414cf08bSSenthil Nathan Thangaraj * invoking CPU_on function, during which resume address will 84*414cf08bSSenthil Nathan Thangaraj * be set. 85*414cf08bSSenthil Nathan Thangaraj */ 86*414cf08bSSenthil Nathan Thangaraj pm_ret = pm_self_suspend(proc->node_id, MAX_LATENCY, PM_STATE_CPU_IDLE, 0, 87*414cf08bSSenthil Nathan Thangaraj SECURE_FLAG); 88*414cf08bSSenthil Nathan Thangaraj 89*414cf08bSSenthil Nathan Thangaraj if (pm_ret != PM_RET_SUCCESS) { 90*414cf08bSSenthil Nathan Thangaraj ERROR("Failed to power down CPU %d\n", cpu_id); 91*414cf08bSSenthil Nathan Thangaraj } 92*414cf08bSSenthil Nathan Thangaraj err: 93*414cf08bSSenthil Nathan Thangaraj return; 94*414cf08bSSenthil Nathan Thangaraj } 95*414cf08bSSenthil Nathan Thangaraj 96*414cf08bSSenthil Nathan Thangaraj /** 97*414cf08bSSenthil Nathan Thangaraj * versal2_system_reset() - Send the reset request to firmware for the 98*414cf08bSSenthil Nathan Thangaraj * system to reset. This function does not 99*414cf08bSSenthil Nathan Thangaraj * return as it resets system. 100*414cf08bSSenthil Nathan Thangaraj */ 101*414cf08bSSenthil Nathan Thangaraj static void __dead2 versal2_system_reset(void) 102*414cf08bSSenthil Nathan Thangaraj { 103*414cf08bSSenthil Nathan Thangaraj uint32_t timeout = 10000U; 104*414cf08bSSenthil Nathan Thangaraj enum pm_ret_status pm_ret; 105*414cf08bSSenthil Nathan Thangaraj int32_t ret; 106*414cf08bSSenthil Nathan Thangaraj 107*414cf08bSSenthil Nathan Thangaraj request_cpu_pwrdwn(); 108*414cf08bSSenthil Nathan Thangaraj 109*414cf08bSSenthil Nathan Thangaraj /* 110*414cf08bSSenthil Nathan Thangaraj * Send the system reset request to the firmware if power down request 111*414cf08bSSenthil Nathan Thangaraj * is not received from firmware. 112*414cf08bSSenthil Nathan Thangaraj */ 113*414cf08bSSenthil Nathan Thangaraj if (pwrdwn_req_received == true) { 114*414cf08bSSenthil Nathan Thangaraj /* 115*414cf08bSSenthil Nathan Thangaraj * TODO: shutdown scope for this reset needs be revised once 116*414cf08bSSenthil Nathan Thangaraj * we have a clearer understanding of the overall reset scoping 117*414cf08bSSenthil Nathan Thangaraj * including the implementation of SYSTEM_RESET2. 118*414cf08bSSenthil Nathan Thangaraj */ 119*414cf08bSSenthil Nathan Thangaraj pm_ret = pm_system_shutdown(XPM_SHUTDOWN_TYPE_RESET, 120*414cf08bSSenthil Nathan Thangaraj pm_get_shutdown_scope(), SECURE_FLAG); 121*414cf08bSSenthil Nathan Thangaraj 122*414cf08bSSenthil Nathan Thangaraj if (pm_ret != PM_RET_SUCCESS) { 123*414cf08bSSenthil Nathan Thangaraj WARN("System shutdown failed\n"); 124*414cf08bSSenthil Nathan Thangaraj } 125*414cf08bSSenthil Nathan Thangaraj 126*414cf08bSSenthil Nathan Thangaraj /* 127*414cf08bSSenthil Nathan Thangaraj * Wait for system shutdown request completed and idle callback 128*414cf08bSSenthil Nathan Thangaraj * not received. 129*414cf08bSSenthil Nathan Thangaraj */ 130*414cf08bSSenthil Nathan Thangaraj do { 131*414cf08bSSenthil Nathan Thangaraj ret = ipi_mb_enquire_status(primary_proc->ipi->local_ipi_id, 132*414cf08bSSenthil Nathan Thangaraj primary_proc->ipi->remote_ipi_id); 133*414cf08bSSenthil Nathan Thangaraj udelay(100); 134*414cf08bSSenthil Nathan Thangaraj timeout--; 135*414cf08bSSenthil Nathan Thangaraj } while ((ret != (int32_t)IPI_MB_STATUS_RECV_PENDING) && (timeout > 0U)); 136*414cf08bSSenthil Nathan Thangaraj } 137*414cf08bSSenthil Nathan Thangaraj 138*414cf08bSSenthil Nathan Thangaraj (void)psci_cpu_off(); 139*414cf08bSSenthil Nathan Thangaraj 140*414cf08bSSenthil Nathan Thangaraj while (true) { 141*414cf08bSSenthil Nathan Thangaraj wfi(); 142*414cf08bSSenthil Nathan Thangaraj } 143*414cf08bSSenthil Nathan Thangaraj } 144*414cf08bSSenthil Nathan Thangaraj 145*414cf08bSSenthil Nathan Thangaraj /** 146*414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_suspend() - Send request to PMC to suspend core. 147*414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 148*414cf08bSSenthil Nathan Thangaraj */ 149*414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_suspend(const psci_power_state_t *target_state) 150*414cf08bSSenthil Nathan Thangaraj { 151*414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 152*414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 153*414cf08bSSenthil Nathan Thangaraj uint32_t state; 154*414cf08bSSenthil Nathan Thangaraj enum pm_ret_status ret; 155*414cf08bSSenthil Nathan Thangaraj size_t i; 156*414cf08bSSenthil Nathan Thangaraj 157*414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 158*414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 159*414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 160*414cf08bSSenthil Nathan Thangaraj goto err; 161*414cf08bSSenthil Nathan Thangaraj } 162*414cf08bSSenthil Nathan Thangaraj 163*414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 164*414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 165*414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 166*414cf08bSSenthil Nathan Thangaraj } 167*414cf08bSSenthil Nathan Thangaraj 168*414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_disable(); 169*414cf08bSSenthil Nathan Thangaraj 170*414cf08bSSenthil Nathan Thangaraj if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { 171*414cf08bSSenthil Nathan Thangaraj plat_gic_save(); 172*414cf08bSSenthil Nathan Thangaraj } 173*414cf08bSSenthil Nathan Thangaraj 174*414cf08bSSenthil Nathan Thangaraj state = (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) ? 175*414cf08bSSenthil Nathan Thangaraj PM_STATE_SUSPEND_TO_RAM : PM_STATE_CPU_IDLE; 176*414cf08bSSenthil Nathan Thangaraj 177*414cf08bSSenthil Nathan Thangaraj /* Send request to PMC to suspend this core */ 178*414cf08bSSenthil Nathan Thangaraj ret = pm_self_suspend(proc->node_id, MAX_LATENCY, state, sec_entry, 179*414cf08bSSenthil Nathan Thangaraj SECURE_FLAG); 180*414cf08bSSenthil Nathan Thangaraj 181*414cf08bSSenthil Nathan Thangaraj if (ret != PM_RET_SUCCESS) { 182*414cf08bSSenthil Nathan Thangaraj ERROR("Failed to power down CPU %d\n", cpu_id); 183*414cf08bSSenthil Nathan Thangaraj } 184*414cf08bSSenthil Nathan Thangaraj 185*414cf08bSSenthil Nathan Thangaraj err: 186*414cf08bSSenthil Nathan Thangaraj return; 187*414cf08bSSenthil Nathan Thangaraj } 188*414cf08bSSenthil Nathan Thangaraj 189*414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_on_finish(const psci_power_state_t *target_state) 190*414cf08bSSenthil Nathan Thangaraj { 191*414cf08bSSenthil Nathan Thangaraj (void)target_state; 192*414cf08bSSenthil Nathan Thangaraj 193*414cf08bSSenthil Nathan Thangaraj /* Enable the gic cpu interface */ 194*414cf08bSSenthil Nathan Thangaraj plat_gic_pcpu_init(); 195*414cf08bSSenthil Nathan Thangaraj 196*414cf08bSSenthil Nathan Thangaraj /* Program the gic per-cpu distributor or re-distributor interface */ 197*414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_enable(); 198*414cf08bSSenthil Nathan Thangaraj } 199*414cf08bSSenthil Nathan Thangaraj 200*414cf08bSSenthil Nathan Thangaraj /** 201*414cf08bSSenthil Nathan Thangaraj * versal2_pwr_domain_suspend_finish() - Performs actions to finish 202*414cf08bSSenthil Nathan Thangaraj * suspend procedure. 203*414cf08bSSenthil Nathan Thangaraj * @target_state: Targeted state. 204*414cf08bSSenthil Nathan Thangaraj */ 205*414cf08bSSenthil Nathan Thangaraj static void versal2_pwr_domain_suspend_finish(const psci_power_state_t *target_state) 206*414cf08bSSenthil Nathan Thangaraj { 207*414cf08bSSenthil Nathan Thangaraj const struct pm_proc *proc; 208*414cf08bSSenthil Nathan Thangaraj uint32_t cpu_id = plat_my_core_pos(); 209*414cf08bSSenthil Nathan Thangaraj size_t i; 210*414cf08bSSenthil Nathan Thangaraj 211*414cf08bSSenthil Nathan Thangaraj proc = pm_get_proc(cpu_id); 212*414cf08bSSenthil Nathan Thangaraj if (proc == NULL) { 213*414cf08bSSenthil Nathan Thangaraj ERROR("Failed to get proc %d\n", cpu_id); 214*414cf08bSSenthil Nathan Thangaraj goto err; 215*414cf08bSSenthil Nathan Thangaraj } 216*414cf08bSSenthil Nathan Thangaraj 217*414cf08bSSenthil Nathan Thangaraj for (i = 0; i <= PLAT_MAX_PWR_LVL; i++) { 218*414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: target_state->pwr_domain_state[%lu]=%x\n", 219*414cf08bSSenthil Nathan Thangaraj __func__, i, target_state->pwr_domain_state[i]); 220*414cf08bSSenthil Nathan Thangaraj } 221*414cf08bSSenthil Nathan Thangaraj 222*414cf08bSSenthil Nathan Thangaraj /* Clear the APU power control register for this cpu */ 223*414cf08bSSenthil Nathan Thangaraj pm_client_wakeup(proc); 224*414cf08bSSenthil Nathan Thangaraj 225*414cf08bSSenthil Nathan Thangaraj /* APU was turned off, so restore GIC context */ 226*414cf08bSSenthil Nathan Thangaraj if (target_state->pwr_domain_state[1] > PLAT_MAX_RET_STATE) { 227*414cf08bSSenthil Nathan Thangaraj plat_gic_resume(); 228*414cf08bSSenthil Nathan Thangaraj } 229*414cf08bSSenthil Nathan Thangaraj 230*414cf08bSSenthil Nathan Thangaraj plat_gic_cpuif_enable(); 231*414cf08bSSenthil Nathan Thangaraj 232*414cf08bSSenthil Nathan Thangaraj err: 233*414cf08bSSenthil Nathan Thangaraj return; 234*414cf08bSSenthil Nathan Thangaraj } 235*414cf08bSSenthil Nathan Thangaraj 236*414cf08bSSenthil Nathan Thangaraj /** 237*414cf08bSSenthil Nathan Thangaraj * versal2_system_off() - Send the system off request to firmware. 238*414cf08bSSenthil Nathan Thangaraj * This function does not return as it puts core into WFI 239*414cf08bSSenthil Nathan Thangaraj */ 240*414cf08bSSenthil Nathan Thangaraj static void __dead2 versal2_system_off(void) 241*414cf08bSSenthil Nathan Thangaraj { 242*414cf08bSSenthil Nathan Thangaraj enum pm_ret_status ret; 243*414cf08bSSenthil Nathan Thangaraj 244*414cf08bSSenthil Nathan Thangaraj /* Send the power down request to the PMC */ 245*414cf08bSSenthil Nathan Thangaraj ret = pm_system_shutdown(XPM_SHUTDOWN_TYPE_SHUTDOWN, 246*414cf08bSSenthil Nathan Thangaraj pm_get_shutdown_scope(), SECURE_FLAG); 247*414cf08bSSenthil Nathan Thangaraj 248*414cf08bSSenthil Nathan Thangaraj if (ret != PM_RET_SUCCESS) { 249*414cf08bSSenthil Nathan Thangaraj ERROR("System shutdown failed\n"); 250*414cf08bSSenthil Nathan Thangaraj } 251*414cf08bSSenthil Nathan Thangaraj 252*414cf08bSSenthil Nathan Thangaraj while (true) { 253*414cf08bSSenthil Nathan Thangaraj wfi(); 254*414cf08bSSenthil Nathan Thangaraj } 255*414cf08bSSenthil Nathan Thangaraj } 256*414cf08bSSenthil Nathan Thangaraj 257*414cf08bSSenthil Nathan Thangaraj /** 258*414cf08bSSenthil Nathan Thangaraj * versal2_validate_power_state() - Ensure that the power state 259*414cf08bSSenthil Nathan Thangaraj * parameter in request is valid. 260*414cf08bSSenthil Nathan Thangaraj * @power_state: Power state of core. 261*414cf08bSSenthil Nathan Thangaraj * @req_state: Requested state. 262*414cf08bSSenthil Nathan Thangaraj * 263*414cf08bSSenthil Nathan Thangaraj * Return: Returns status, either PSCI_E_SUCCESS or reason. 264*414cf08bSSenthil Nathan Thangaraj */ 265*414cf08bSSenthil Nathan Thangaraj static int32_t versal2_validate_power_state(unsigned int power_state, 266*414cf08bSSenthil Nathan Thangaraj psci_power_state_t *req_state) 267*414cf08bSSenthil Nathan Thangaraj { 268*414cf08bSSenthil Nathan Thangaraj uint32_t pstate = psci_get_pstate_type(power_state); 269*414cf08bSSenthil Nathan Thangaraj int32_t ret = PSCI_E_SUCCESS; 270*414cf08bSSenthil Nathan Thangaraj 271*414cf08bSSenthil Nathan Thangaraj VERBOSE("%s: power_state: 0x%x\n", __func__, power_state); 272*414cf08bSSenthil Nathan Thangaraj 273*414cf08bSSenthil Nathan Thangaraj assert(req_state); 274*414cf08bSSenthil Nathan Thangaraj 275*414cf08bSSenthil Nathan Thangaraj /* Sanity check the requested state */ 276*414cf08bSSenthil Nathan Thangaraj if (pstate == PSTATE_TYPE_STANDBY) { 277*414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[MPIDR_AFFLVL0] = PLAT_MAX_RET_STATE; 278*414cf08bSSenthil Nathan Thangaraj } else { 279*414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[MPIDR_AFFLVL0] = PLAT_MAX_OFF_STATE; 280*414cf08bSSenthil Nathan Thangaraj } 281*414cf08bSSenthil Nathan Thangaraj 282*414cf08bSSenthil Nathan Thangaraj /* The 'state_id' is expected to be zero */ 283*414cf08bSSenthil Nathan Thangaraj if (psci_get_pstate_id(power_state) != 0U) { 284*414cf08bSSenthil Nathan Thangaraj ret = PSCI_E_INVALID_PARAMS; 285*414cf08bSSenthil Nathan Thangaraj } 286*414cf08bSSenthil Nathan Thangaraj 287*414cf08bSSenthil Nathan Thangaraj return ret; 288*414cf08bSSenthil Nathan Thangaraj } 289*414cf08bSSenthil Nathan Thangaraj 290*414cf08bSSenthil Nathan Thangaraj /** 291*414cf08bSSenthil Nathan Thangaraj * versal2_get_sys_suspend_power_state() - Get power state for system 292*414cf08bSSenthil Nathan Thangaraj * suspend. 293*414cf08bSSenthil Nathan Thangaraj * @req_state: Requested state. 294*414cf08bSSenthil Nathan Thangaraj */ 295*414cf08bSSenthil Nathan Thangaraj static void versal2_get_sys_suspend_power_state(psci_power_state_t *req_state) 296*414cf08bSSenthil Nathan Thangaraj { 297*414cf08bSSenthil Nathan Thangaraj uint64_t i; 298*414cf08bSSenthil Nathan Thangaraj 299*414cf08bSSenthil Nathan Thangaraj for (i = MPIDR_AFFLVL0; i <= PLAT_MAX_PWR_LVL; i++) { 300*414cf08bSSenthil Nathan Thangaraj req_state->pwr_domain_state[i] = PLAT_MAX_OFF_STATE; 301*414cf08bSSenthil Nathan Thangaraj } 302*414cf08bSSenthil Nathan Thangaraj } 303*414cf08bSSenthil Nathan Thangaraj 304*414cf08bSSenthil Nathan Thangaraj /** 305*414cf08bSSenthil Nathan Thangaraj * Export the platform specific power ops. 306*414cf08bSSenthil Nathan Thangaraj */ 307*414cf08bSSenthil Nathan Thangaraj static const struct plat_psci_ops versal2_nopmc_psci_ops = { 308*414cf08bSSenthil Nathan Thangaraj .pwr_domain_on = versal2_pwr_domain_on, 309*414cf08bSSenthil Nathan Thangaraj .pwr_domain_off = versal2_pwr_domain_off, 310*414cf08bSSenthil Nathan Thangaraj .pwr_domain_on_finish = versal2_pwr_domain_on_finish, 311*414cf08bSSenthil Nathan Thangaraj .pwr_domain_suspend = versal2_pwr_domain_suspend, 312*414cf08bSSenthil Nathan Thangaraj .pwr_domain_suspend_finish = versal2_pwr_domain_suspend_finish, 313*414cf08bSSenthil Nathan Thangaraj .system_off = versal2_system_off, 314*414cf08bSSenthil Nathan Thangaraj .system_reset = versal2_system_reset, 315*414cf08bSSenthil Nathan Thangaraj .validate_power_state = versal2_validate_power_state, 316*414cf08bSSenthil Nathan Thangaraj .get_sys_suspend_power_state = versal2_get_sys_suspend_power_state, 317*414cf08bSSenthil Nathan Thangaraj }; 318*414cf08bSSenthil Nathan Thangaraj 319*414cf08bSSenthil Nathan Thangaraj int plat_setup_psci_ops(uintptr_t sec_entrypoint, 320*414cf08bSSenthil Nathan Thangaraj const struct plat_psci_ops **psci_ops) 321*414cf08bSSenthil Nathan Thangaraj { 322*414cf08bSSenthil Nathan Thangaraj sec_entry = sec_entrypoint; 323*414cf08bSSenthil Nathan Thangaraj 324*414cf08bSSenthil Nathan Thangaraj VERBOSE("Setting up entry point %lx\n", sec_entry); 325*414cf08bSSenthil Nathan Thangaraj 326*414cf08bSSenthil Nathan Thangaraj *psci_ops = &versal2_nopmc_psci_ops; 327*414cf08bSSenthil Nathan Thangaraj 328*414cf08bSSenthil Nathan Thangaraj return 0; 329*414cf08bSSenthil Nathan Thangaraj } 330*414cf08bSSenthil Nathan Thangaraj 331*414cf08bSSenthil Nathan Thangaraj int32_t sip_svc_setup_init(void) 332*414cf08bSSenthil Nathan Thangaraj { 333*414cf08bSSenthil Nathan Thangaraj return pm_setup(); 334*414cf08bSSenthil Nathan Thangaraj } 335*414cf08bSSenthil Nathan Thangaraj 336*414cf08bSSenthil Nathan Thangaraj uint64_t smc_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3, uint64_t x4, 337*414cf08bSSenthil Nathan Thangaraj const void *cookie, void *handle, uint64_t flags) 338*414cf08bSSenthil Nathan Thangaraj { 339*414cf08bSSenthil Nathan Thangaraj return pm_smc_handler(smc_fid, x1, x2, x3, x4, cookie, handle, flags); 340*414cf08bSSenthil Nathan Thangaraj } 341