1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2022, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <common/debug.h> 8*91f16700Schasinglulu #include <services/el3_spmc_logical_sp.h> 9*91f16700Schasinglulu #include <services/ffa_svc.h> 10*91f16700Schasinglulu #include <smccc_helpers.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #define LP_PARTITION_ID 0xC001 13*91f16700Schasinglulu #define LP_UUID {0x47a3bf57, 0xe98e43ad, 0xb7db524f, 0x1588f4e3} 14*91f16700Schasinglulu 15*91f16700Schasinglulu /* Our Logical SP currently only supports receipt of direct messaging. */ 16*91f16700Schasinglulu #define PARTITION_PROPERTIES FFA_PARTITION_DIRECT_REQ_RECV 17*91f16700Schasinglulu 18*91f16700Schasinglulu static int32_t sp_init(void) 19*91f16700Schasinglulu { 20*91f16700Schasinglulu INFO("LSP: Init function called.\n"); 21*91f16700Schasinglulu return 0; 22*91f16700Schasinglulu } 23*91f16700Schasinglulu 24*91f16700Schasinglulu static uint64_t handle_ffa_direct_request(uint32_t smc_fid, bool secure_origin, 25*91f16700Schasinglulu uint64_t x1, uint64_t x2, uint64_t x3, 26*91f16700Schasinglulu uint64_t x4, void *cookie, 27*91f16700Schasinglulu void *handle, uint64_t flags) 28*91f16700Schasinglulu { 29*91f16700Schasinglulu uint64_t ret; 30*91f16700Schasinglulu uint32_t src_dst; 31*91f16700Schasinglulu 32*91f16700Schasinglulu /* Determine if we have a 64 or 32 direct request. */ 33*91f16700Schasinglulu if (smc_fid == FFA_MSG_SEND_DIRECT_REQ_SMC32) { 34*91f16700Schasinglulu ret = FFA_MSG_SEND_DIRECT_RESP_SMC32; 35*91f16700Schasinglulu } else if (smc_fid == FFA_MSG_SEND_DIRECT_REQ_SMC64) { 36*91f16700Schasinglulu ret = FFA_MSG_SEND_DIRECT_RESP_SMC64; 37*91f16700Schasinglulu } else { 38*91f16700Schasinglulu panic(); /* Unknown SMC. */ 39*91f16700Schasinglulu } 40*91f16700Schasinglulu 41*91f16700Schasinglulu /* 42*91f16700Schasinglulu * Handle the incoming request. For testing purposes we echo the 43*91f16700Schasinglulu * incoming message. 44*91f16700Schasinglulu */ 45*91f16700Schasinglulu INFO("LSP: Received Direct Request from %s world (0x%x)\n", 46*91f16700Schasinglulu secure_origin ? "Secure" : "Normal", ffa_endpoint_source(x1)); 47*91f16700Schasinglulu 48*91f16700Schasinglulu /* Populate the source and destination IDs. */ 49*91f16700Schasinglulu src_dst = (uint32_t) LP_PARTITION_ID << FFA_DIRECT_MSG_SOURCE_SHIFT | 50*91f16700Schasinglulu ffa_endpoint_source(x1) << FFA_DIRECT_MSG_DESTINATION_SHIFT; 51*91f16700Schasinglulu /* 52*91f16700Schasinglulu * Logical SP's must always send a direct response so we can populate 53*91f16700Schasinglulu * our response directly. 54*91f16700Schasinglulu */ 55*91f16700Schasinglulu SMC_RET8(handle, ret, src_dst, 0, x4, 0, 0, 0, 0); 56*91f16700Schasinglulu } 57*91f16700Schasinglulu 58*91f16700Schasinglulu /* Register logical partition */ 59*91f16700Schasinglulu DECLARE_LOGICAL_PARTITION( 60*91f16700Schasinglulu my_logical_partition, 61*91f16700Schasinglulu sp_init, /* Init Function */ 62*91f16700Schasinglulu LP_PARTITION_ID, /* FF-A Partition ID */ 63*91f16700Schasinglulu LP_UUID, /* UUID */ 64*91f16700Schasinglulu PARTITION_PROPERTIES, /* Partition Properties. */ 65*91f16700Schasinglulu handle_ffa_direct_request /* Callback for direct requests. */ 66*91f16700Schasinglulu ); 67