1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu /*! 8*91f16700Schasinglulu * File containing client-side RPC functions for the PM service. These 9*91f16700Schasinglulu * functions are ported to clients that communicate to the SC. 10*91f16700Schasinglulu * 11*91f16700Schasinglulu * @addtogroup PM_SVC 12*91f16700Schasinglulu * @{ 13*91f16700Schasinglulu */ 14*91f16700Schasinglulu 15*91f16700Schasinglulu /* Includes */ 16*91f16700Schasinglulu 17*91f16700Schasinglulu #include <stdlib.h> 18*91f16700Schasinglulu 19*91f16700Schasinglulu #include <sci/sci_types.h> 20*91f16700Schasinglulu #include <sci/svc/rm/sci_rm_api.h> 21*91f16700Schasinglulu #include <sci/svc/pm/sci_pm_api.h> 22*91f16700Schasinglulu #include <sci/sci_rpc.h> 23*91f16700Schasinglulu 24*91f16700Schasinglulu #include "sci_pm_rpc.h" 25*91f16700Schasinglulu 26*91f16700Schasinglulu /* Local Defines */ 27*91f16700Schasinglulu 28*91f16700Schasinglulu /* Local Types */ 29*91f16700Schasinglulu 30*91f16700Schasinglulu /* Local Functions */ 31*91f16700Schasinglulu 32*91f16700Schasinglulu sc_err_t sc_pm_set_sys_power_mode(sc_ipc_t ipc, sc_pm_power_mode_t mode) 33*91f16700Schasinglulu { 34*91f16700Schasinglulu sc_rpc_msg_t msg; 35*91f16700Schasinglulu uint8_t result; 36*91f16700Schasinglulu 37*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 38*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 39*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_SYS_POWER_MODE; 40*91f16700Schasinglulu RPC_U8(&msg, 0U) = (uint8_t)mode; 41*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 42*91f16700Schasinglulu 43*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 44*91f16700Schasinglulu 45*91f16700Schasinglulu result = RPC_R8(&msg); 46*91f16700Schasinglulu return (sc_err_t)result; 47*91f16700Schasinglulu } 48*91f16700Schasinglulu 49*91f16700Schasinglulu sc_err_t sc_pm_set_partition_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt, 50*91f16700Schasinglulu sc_pm_power_mode_t mode) 51*91f16700Schasinglulu { 52*91f16700Schasinglulu sc_rpc_msg_t msg; 53*91f16700Schasinglulu uint8_t result; 54*91f16700Schasinglulu 55*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 56*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 57*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_PARTITION_POWER_MODE; 58*91f16700Schasinglulu RPC_U8(&msg, 0U) = (uint8_t)pt; 59*91f16700Schasinglulu RPC_U8(&msg, 1U) = (uint8_t)mode; 60*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 61*91f16700Schasinglulu 62*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 63*91f16700Schasinglulu 64*91f16700Schasinglulu result = RPC_R8(&msg); 65*91f16700Schasinglulu return (sc_err_t)result; 66*91f16700Schasinglulu } 67*91f16700Schasinglulu 68*91f16700Schasinglulu sc_err_t sc_pm_get_sys_power_mode(sc_ipc_t ipc, sc_rm_pt_t pt, 69*91f16700Schasinglulu sc_pm_power_mode_t *mode) 70*91f16700Schasinglulu { 71*91f16700Schasinglulu sc_rpc_msg_t msg; 72*91f16700Schasinglulu uint8_t result; 73*91f16700Schasinglulu 74*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 75*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 76*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_SYS_POWER_MODE; 77*91f16700Schasinglulu RPC_U8(&msg, 0U) = (uint8_t)pt; 78*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 79*91f16700Schasinglulu 80*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 81*91f16700Schasinglulu 82*91f16700Schasinglulu result = RPC_R8(&msg); 83*91f16700Schasinglulu if (mode != NULL) { 84*91f16700Schasinglulu *mode = RPC_U8(&msg, 0U); 85*91f16700Schasinglulu } 86*91f16700Schasinglulu 87*91f16700Schasinglulu return (sc_err_t)result; 88*91f16700Schasinglulu } 89*91f16700Schasinglulu 90*91f16700Schasinglulu sc_err_t sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, 91*91f16700Schasinglulu sc_pm_power_mode_t mode) 92*91f16700Schasinglulu { 93*91f16700Schasinglulu sc_rpc_msg_t msg; 94*91f16700Schasinglulu uint8_t result; 95*91f16700Schasinglulu 96*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 97*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 98*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_RESOURCE_POWER_MODE; 99*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 100*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)mode; 101*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 102*91f16700Schasinglulu 103*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 104*91f16700Schasinglulu 105*91f16700Schasinglulu result = RPC_R8(&msg); 106*91f16700Schasinglulu return (sc_err_t)result; 107*91f16700Schasinglulu } 108*91f16700Schasinglulu 109*91f16700Schasinglulu sc_err_t sc_pm_get_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, 110*91f16700Schasinglulu sc_pm_power_mode_t *mode) 111*91f16700Schasinglulu { 112*91f16700Schasinglulu sc_rpc_msg_t msg; 113*91f16700Schasinglulu uint8_t result; 114*91f16700Schasinglulu 115*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 116*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 117*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_RESOURCE_POWER_MODE; 118*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 119*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 120*91f16700Schasinglulu 121*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 122*91f16700Schasinglulu 123*91f16700Schasinglulu result = RPC_R8(&msg); 124*91f16700Schasinglulu if (mode != NULL) { 125*91f16700Schasinglulu *mode = RPC_U8(&msg, 0U); 126*91f16700Schasinglulu } 127*91f16700Schasinglulu 128*91f16700Schasinglulu return (sc_err_t)result; 129*91f16700Schasinglulu } 130*91f16700Schasinglulu 131*91f16700Schasinglulu sc_err_t sc_pm_req_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, 132*91f16700Schasinglulu sc_pm_power_mode_t mode) 133*91f16700Schasinglulu { 134*91f16700Schasinglulu sc_rpc_msg_t msg; 135*91f16700Schasinglulu uint8_t result; 136*91f16700Schasinglulu 137*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 138*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 139*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REQ_LOW_POWER_MODE; 140*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 141*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)mode; 142*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 143*91f16700Schasinglulu 144*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 145*91f16700Schasinglulu 146*91f16700Schasinglulu result = RPC_R8(&msg); 147*91f16700Schasinglulu return (sc_err_t)result; 148*91f16700Schasinglulu } 149*91f16700Schasinglulu 150*91f16700Schasinglulu sc_err_t sc_pm_req_cpu_low_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, 151*91f16700Schasinglulu sc_pm_power_mode_t mode, 152*91f16700Schasinglulu sc_pm_wake_src_t wake_src) 153*91f16700Schasinglulu { 154*91f16700Schasinglulu sc_rpc_msg_t msg; 155*91f16700Schasinglulu uint8_t result; 156*91f16700Schasinglulu 157*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 158*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 159*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REQ_CPU_LOW_POWER_MODE; 160*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 161*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)mode; 162*91f16700Schasinglulu RPC_U8(&msg, 3U) = (uint8_t)wake_src; 163*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 164*91f16700Schasinglulu 165*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 166*91f16700Schasinglulu 167*91f16700Schasinglulu result = RPC_R8(&msg); 168*91f16700Schasinglulu return (sc_err_t)result; 169*91f16700Schasinglulu } 170*91f16700Schasinglulu 171*91f16700Schasinglulu sc_err_t sc_pm_set_cpu_resume_addr(sc_ipc_t ipc, sc_rsrc_t resource, 172*91f16700Schasinglulu sc_faddr_t address) 173*91f16700Schasinglulu { 174*91f16700Schasinglulu sc_rpc_msg_t msg; 175*91f16700Schasinglulu uint8_t result; 176*91f16700Schasinglulu 177*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 178*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 179*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CPU_RESUME_ADDR; 180*91f16700Schasinglulu RPC_U32(&msg, 0U) = (uint32_t)(address >> 32U); 181*91f16700Schasinglulu RPC_U32(&msg, 4U) = (uint32_t)address; 182*91f16700Schasinglulu RPC_U16(&msg, 8U) = (uint16_t)resource; 183*91f16700Schasinglulu RPC_SIZE(&msg) = 4U; 184*91f16700Schasinglulu 185*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 186*91f16700Schasinglulu 187*91f16700Schasinglulu result = RPC_R8(&msg); 188*91f16700Schasinglulu return (sc_err_t)result; 189*91f16700Schasinglulu } 190*91f16700Schasinglulu 191*91f16700Schasinglulu sc_err_t sc_pm_set_cpu_resume(sc_ipc_t ipc, sc_rsrc_t resource, 192*91f16700Schasinglulu sc_bool_t isPrimary, sc_faddr_t address) 193*91f16700Schasinglulu { 194*91f16700Schasinglulu sc_rpc_msg_t msg; 195*91f16700Schasinglulu uint8_t result; 196*91f16700Schasinglulu 197*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 198*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 199*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CPU_RESUME; 200*91f16700Schasinglulu RPC_U32(&msg, 0U) = (uint32_t)(address >> 32U); 201*91f16700Schasinglulu RPC_U32(&msg, 4U) = (uint32_t)address; 202*91f16700Schasinglulu RPC_U16(&msg, 8U) = (uint16_t)resource; 203*91f16700Schasinglulu RPC_U8(&msg, 10U) = (uint8_t)isPrimary; 204*91f16700Schasinglulu RPC_SIZE(&msg) = 4U; 205*91f16700Schasinglulu 206*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 207*91f16700Schasinglulu 208*91f16700Schasinglulu result = RPC_R8(&msg); 209*91f16700Schasinglulu return (sc_err_t)result; 210*91f16700Schasinglulu } 211*91f16700Schasinglulu 212*91f16700Schasinglulu sc_err_t sc_pm_req_sys_if_power_mode(sc_ipc_t ipc, sc_rsrc_t resource, 213*91f16700Schasinglulu sc_pm_sys_if_t sys_if, 214*91f16700Schasinglulu sc_pm_power_mode_t hpm, 215*91f16700Schasinglulu sc_pm_power_mode_t lpm) 216*91f16700Schasinglulu { 217*91f16700Schasinglulu sc_rpc_msg_t msg; 218*91f16700Schasinglulu uint8_t result; 219*91f16700Schasinglulu 220*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 221*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 222*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REQ_SYS_IF_POWER_MODE; 223*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 224*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)sys_if; 225*91f16700Schasinglulu RPC_U8(&msg, 3U) = (uint8_t)hpm; 226*91f16700Schasinglulu RPC_U8(&msg, 4U) = (uint8_t)lpm; 227*91f16700Schasinglulu RPC_SIZE(&msg) = 3U; 228*91f16700Schasinglulu 229*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 230*91f16700Schasinglulu 231*91f16700Schasinglulu result = RPC_R8(&msg); 232*91f16700Schasinglulu return (sc_err_t)result; 233*91f16700Schasinglulu } 234*91f16700Schasinglulu 235*91f16700Schasinglulu sc_err_t sc_pm_set_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, 236*91f16700Schasinglulu sc_pm_clk_t clk, sc_pm_clock_rate_t *rate) 237*91f16700Schasinglulu { 238*91f16700Schasinglulu sc_rpc_msg_t msg; 239*91f16700Schasinglulu uint8_t result; 240*91f16700Schasinglulu 241*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 242*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 243*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CLOCK_RATE; 244*91f16700Schasinglulu RPC_U32(&msg, 0U) = *(uint32_t *)rate; 245*91f16700Schasinglulu RPC_U16(&msg, 4U) = (uint16_t)resource; 246*91f16700Schasinglulu RPC_U8(&msg, 6U) = (uint8_t)clk; 247*91f16700Schasinglulu RPC_SIZE(&msg) = 3U; 248*91f16700Schasinglulu 249*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 250*91f16700Schasinglulu 251*91f16700Schasinglulu *rate = RPC_U32(&msg, 0U); 252*91f16700Schasinglulu result = RPC_R8(&msg); 253*91f16700Schasinglulu return (sc_err_t)result; 254*91f16700Schasinglulu } 255*91f16700Schasinglulu 256*91f16700Schasinglulu sc_err_t sc_pm_get_clock_rate(sc_ipc_t ipc, sc_rsrc_t resource, 257*91f16700Schasinglulu sc_pm_clk_t clk, sc_pm_clock_rate_t *rate) 258*91f16700Schasinglulu { 259*91f16700Schasinglulu sc_rpc_msg_t msg; 260*91f16700Schasinglulu uint8_t result; 261*91f16700Schasinglulu 262*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 263*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 264*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_CLOCK_RATE; 265*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 266*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)clk; 267*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 268*91f16700Schasinglulu 269*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 270*91f16700Schasinglulu 271*91f16700Schasinglulu if (rate != NULL) { 272*91f16700Schasinglulu *rate = RPC_U32(&msg, 0U); 273*91f16700Schasinglulu } 274*91f16700Schasinglulu 275*91f16700Schasinglulu result = RPC_R8(&msg); 276*91f16700Schasinglulu return (sc_err_t)result; 277*91f16700Schasinglulu } 278*91f16700Schasinglulu 279*91f16700Schasinglulu sc_err_t sc_pm_clock_enable(sc_ipc_t ipc, sc_rsrc_t resource, 280*91f16700Schasinglulu sc_pm_clk_t clk, sc_bool_t enable, sc_bool_t autog) 281*91f16700Schasinglulu { 282*91f16700Schasinglulu sc_rpc_msg_t msg; 283*91f16700Schasinglulu uint8_t result; 284*91f16700Schasinglulu 285*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 286*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 287*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_CLOCK_ENABLE; 288*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 289*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)clk; 290*91f16700Schasinglulu RPC_U8(&msg, 3U) = (uint8_t)enable; 291*91f16700Schasinglulu RPC_U8(&msg, 4U) = (uint8_t)autog; 292*91f16700Schasinglulu RPC_SIZE(&msg) = 3U; 293*91f16700Schasinglulu 294*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 295*91f16700Schasinglulu 296*91f16700Schasinglulu result = RPC_R8(&msg); 297*91f16700Schasinglulu return (sc_err_t)result; 298*91f16700Schasinglulu } 299*91f16700Schasinglulu 300*91f16700Schasinglulu sc_err_t sc_pm_set_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, 301*91f16700Schasinglulu sc_pm_clk_t clk, sc_pm_clk_parent_t parent) 302*91f16700Schasinglulu { 303*91f16700Schasinglulu sc_rpc_msg_t msg; 304*91f16700Schasinglulu uint8_t result; 305*91f16700Schasinglulu 306*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 307*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 308*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_SET_CLOCK_PARENT; 309*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 310*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)clk; 311*91f16700Schasinglulu RPC_U8(&msg, 3U) = (uint8_t)parent; 312*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 313*91f16700Schasinglulu 314*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 315*91f16700Schasinglulu 316*91f16700Schasinglulu result = RPC_R8(&msg); 317*91f16700Schasinglulu return (sc_err_t)result; 318*91f16700Schasinglulu } 319*91f16700Schasinglulu 320*91f16700Schasinglulu sc_err_t sc_pm_get_clock_parent(sc_ipc_t ipc, sc_rsrc_t resource, 321*91f16700Schasinglulu sc_pm_clk_t clk, sc_pm_clk_parent_t *parent) 322*91f16700Schasinglulu { 323*91f16700Schasinglulu sc_rpc_msg_t msg; 324*91f16700Schasinglulu uint8_t result; 325*91f16700Schasinglulu 326*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 327*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 328*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_GET_CLOCK_PARENT; 329*91f16700Schasinglulu RPC_U16(&msg, 0U) = (uint16_t)resource; 330*91f16700Schasinglulu RPC_U8(&msg, 2U) = (uint8_t)clk; 331*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 332*91f16700Schasinglulu 333*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 334*91f16700Schasinglulu 335*91f16700Schasinglulu result = RPC_R8(&msg); 336*91f16700Schasinglulu if (parent != NULL) { 337*91f16700Schasinglulu *parent = RPC_U8(&msg, 0U); 338*91f16700Schasinglulu } 339*91f16700Schasinglulu 340*91f16700Schasinglulu return (sc_err_t)result; 341*91f16700Schasinglulu } 342*91f16700Schasinglulu 343*91f16700Schasinglulu sc_err_t sc_pm_reset(sc_ipc_t ipc, sc_pm_reset_type_t type) 344*91f16700Schasinglulu { 345*91f16700Schasinglulu sc_rpc_msg_t msg; 346*91f16700Schasinglulu uint8_t result; 347*91f16700Schasinglulu 348*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 349*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 350*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_RESET; 351*91f16700Schasinglulu RPC_U8(&msg, 0U) = (uint8_t)type; 352*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 353*91f16700Schasinglulu 354*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 355*91f16700Schasinglulu 356*91f16700Schasinglulu result = RPC_R8(&msg); 357*91f16700Schasinglulu return (sc_err_t)result; 358*91f16700Schasinglulu } 359*91f16700Schasinglulu 360*91f16700Schasinglulu sc_err_t sc_pm_reset_reason(sc_ipc_t ipc, sc_pm_reset_reason_t *reason) 361*91f16700Schasinglulu { 362*91f16700Schasinglulu sc_rpc_msg_t msg; 363*91f16700Schasinglulu uint8_t result; 364*91f16700Schasinglulu 365*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 366*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 367*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_RESET_REASON; 368*91f16700Schasinglulu RPC_SIZE(&msg) = 1U; 369*91f16700Schasinglulu 370*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 371*91f16700Schasinglulu 372*91f16700Schasinglulu result = RPC_R8(&msg); 373*91f16700Schasinglulu if (reason != NULL) { 374*91f16700Schasinglulu *reason = RPC_U8(&msg, 0U); 375*91f16700Schasinglulu } 376*91f16700Schasinglulu 377*91f16700Schasinglulu return (sc_err_t)result; 378*91f16700Schasinglulu } 379*91f16700Schasinglulu 380*91f16700Schasinglulu sc_err_t sc_pm_boot(sc_ipc_t ipc, sc_rm_pt_t pt, 381*91f16700Schasinglulu sc_rsrc_t resource_cpu, sc_faddr_t boot_addr, 382*91f16700Schasinglulu sc_rsrc_t resource_mu, sc_rsrc_t resource_dev) 383*91f16700Schasinglulu { 384*91f16700Schasinglulu sc_rpc_msg_t msg; 385*91f16700Schasinglulu uint8_t result; 386*91f16700Schasinglulu 387*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 388*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 389*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_BOOT; 390*91f16700Schasinglulu RPC_U32(&msg, 0U) = (uint32_t)(boot_addr >> 32U); 391*91f16700Schasinglulu RPC_U32(&msg, 4U) = (uint32_t)boot_addr; 392*91f16700Schasinglulu RPC_U16(&msg, 8U) = (uint16_t)resource_cpu; 393*91f16700Schasinglulu RPC_U16(&msg, 10U) = (uint16_t)resource_mu; 394*91f16700Schasinglulu RPC_U16(&msg, 12U) = (uint16_t)resource_dev; 395*91f16700Schasinglulu RPC_U8(&msg, 14U) = (uint8_t)pt; 396*91f16700Schasinglulu RPC_SIZE(&msg) = 5U; 397*91f16700Schasinglulu 398*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 399*91f16700Schasinglulu 400*91f16700Schasinglulu result = RPC_R8(&msg); 401*91f16700Schasinglulu return (sc_err_t)result; 402*91f16700Schasinglulu } 403*91f16700Schasinglulu 404*91f16700Schasinglulu void sc_pm_reboot(sc_ipc_t ipc, sc_pm_reset_type_t type) 405*91f16700Schasinglulu { 406*91f16700Schasinglulu sc_rpc_msg_t msg; 407*91f16700Schasinglulu 408*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 409*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 410*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REBOOT; 411*91f16700Schasinglulu RPC_U8(&msg, 0U) = (uint8_t)type; 412*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 413*91f16700Schasinglulu 414*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_TRUE); 415*91f16700Schasinglulu } 416*91f16700Schasinglulu 417*91f16700Schasinglulu sc_err_t sc_pm_reboot_partition(sc_ipc_t ipc, sc_rm_pt_t pt, 418*91f16700Schasinglulu sc_pm_reset_type_t type) 419*91f16700Schasinglulu { 420*91f16700Schasinglulu sc_rpc_msg_t msg; 421*91f16700Schasinglulu uint8_t result; 422*91f16700Schasinglulu 423*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 424*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 425*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_REBOOT_PARTITION; 426*91f16700Schasinglulu RPC_U8(&msg, 0U) = (uint8_t)pt; 427*91f16700Schasinglulu RPC_U8(&msg, 1U) = (uint8_t)type; 428*91f16700Schasinglulu RPC_SIZE(&msg) = 2U; 429*91f16700Schasinglulu 430*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 431*91f16700Schasinglulu 432*91f16700Schasinglulu result = RPC_R8(&msg); 433*91f16700Schasinglulu return (sc_err_t)result; 434*91f16700Schasinglulu } 435*91f16700Schasinglulu 436*91f16700Schasinglulu sc_err_t sc_pm_cpu_start(sc_ipc_t ipc, sc_rsrc_t resource, sc_bool_t enable, 437*91f16700Schasinglulu sc_faddr_t address) 438*91f16700Schasinglulu { 439*91f16700Schasinglulu sc_rpc_msg_t msg; 440*91f16700Schasinglulu uint8_t result; 441*91f16700Schasinglulu 442*91f16700Schasinglulu RPC_VER(&msg) = SC_RPC_VERSION; 443*91f16700Schasinglulu RPC_SVC(&msg) = (uint8_t)SC_RPC_SVC_PM; 444*91f16700Schasinglulu RPC_FUNC(&msg) = (uint8_t)PM_FUNC_CPU_START; 445*91f16700Schasinglulu RPC_U32(&msg, 0U) = (uint32_t)(address >> 32U); 446*91f16700Schasinglulu RPC_U32(&msg, 4U) = (uint32_t)address; 447*91f16700Schasinglulu RPC_U16(&msg, 8U) = (uint16_t)resource; 448*91f16700Schasinglulu RPC_U8(&msg, 10U) = (uint8_t)enable; 449*91f16700Schasinglulu RPC_SIZE(&msg) = 4U; 450*91f16700Schasinglulu 451*91f16700Schasinglulu sc_call_rpc(ipc, &msg, SC_FALSE); 452*91f16700Schasinglulu 453*91f16700Schasinglulu result = RPC_R8(&msg); 454*91f16700Schasinglulu return (sc_err_t)result; 455*91f16700Schasinglulu } 456*91f16700Schasinglulu 457*91f16700Schasinglulu /**@}*/ 458