17a2130b4SMadhukar Pappireddy /* 27a2130b4SMadhukar Pappireddy * Copyright (c) 2023, Arm Limited. All rights reserved. 37a2130b4SMadhukar Pappireddy * 47a2130b4SMadhukar Pappireddy * SPDX-License-Identifier: BSD-3-Clause 57a2130b4SMadhukar Pappireddy */ 67a2130b4SMadhukar Pappireddy 77a2130b4SMadhukar Pappireddy #include <stdint.h> 87a2130b4SMadhukar Pappireddy 97a2130b4SMadhukar Pappireddy #include <common/debug.h> 107a2130b4SMadhukar Pappireddy #include <common/runtime_svc.h> 117a2130b4SMadhukar Pappireddy 127a2130b4SMadhukar Pappireddy #include <plat/arm/common/arm_sip_svc.h> 137a2130b4SMadhukar Pappireddy #include <plat/common/platform.h> 147a2130b4SMadhukar Pappireddy 157a2130b4SMadhukar Pappireddy #if ENABLE_SPMD_LP 167a2130b4SMadhukar Pappireddy #include <services/el3_spmd_logical_sp.h> 177a2130b4SMadhukar Pappireddy #endif 187a2130b4SMadhukar Pappireddy 197a2130b4SMadhukar Pappireddy uintptr_t plat_arm_sip_handler(uint32_t smc_fid, 207a2130b4SMadhukar Pappireddy u_register_t x1, 217a2130b4SMadhukar Pappireddy u_register_t x2, 227a2130b4SMadhukar Pappireddy u_register_t x3, 237a2130b4SMadhukar Pappireddy u_register_t x4, 247a2130b4SMadhukar Pappireddy void *cookie, 257a2130b4SMadhukar Pappireddy void *handle, 267a2130b4SMadhukar Pappireddy u_register_t flags) 277a2130b4SMadhukar Pappireddy { 28*20324013SMadhukar Pappireddy #if PLAT_TEST_SPM 29*20324013SMadhukar Pappireddy bool secure_origin; 30*20324013SMadhukar Pappireddy 31*20324013SMadhukar Pappireddy /* Determine which security state this SMC originated from */ 32*20324013SMadhukar Pappireddy secure_origin = is_caller_secure(flags); 33*20324013SMadhukar Pappireddy 34*20324013SMadhukar Pappireddy switch (smc_fid) { 35*20324013SMadhukar Pappireddy case ARM_SIP_SET_INTERRUPT_PENDING: 36*20324013SMadhukar Pappireddy if (!secure_origin) { 37*20324013SMadhukar Pappireddy SMC_RET1(handle, SMC_UNK); 38*20324013SMadhukar Pappireddy } 39*20324013SMadhukar Pappireddy 40*20324013SMadhukar Pappireddy VERBOSE("SiP Call- Set interrupt pending %d\n", (uint32_t)x1); 41*20324013SMadhukar Pappireddy plat_ic_set_interrupt_pending(x1); 42*20324013SMadhukar Pappireddy 43*20324013SMadhukar Pappireddy SMC_RET1(handle, SMC_OK); 44*20324013SMadhukar Pappireddy break; /* Not reached */ 45*20324013SMadhukar Pappireddy default: 46*20324013SMadhukar Pappireddy break; 47*20324013SMadhukar Pappireddy } 48*20324013SMadhukar Pappireddy #endif 49*20324013SMadhukar Pappireddy 507a2130b4SMadhukar Pappireddy #if ENABLE_SPMD_LP 517a2130b4SMadhukar Pappireddy return plat_spmd_logical_sp_smc_handler(smc_fid, x1, x2, x3, x4, 527a2130b4SMadhukar Pappireddy cookie, handle, flags); 537a2130b4SMadhukar Pappireddy #else 547a2130b4SMadhukar Pappireddy WARN("Unimplemented ARM SiP Service Call: 0x%x\n", smc_fid); 557a2130b4SMadhukar Pappireddy SMC_RET1(handle, SMC_UNK); 567a2130b4SMadhukar Pappireddy #endif 577a2130b4SMadhukar Pappireddy } 58