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 31*91f16700Schasinglulu /* Determine if we have a 64 or 32 direct request. */ 32*91f16700Schasinglulu if (smc_fid == FFA_MSG_SEND_DIRECT_REQ_SMC32) { 33*91f16700Schasinglulu ret = FFA_MSG_SEND_DIRECT_RESP_SMC32; 34*91f16700Schasinglulu } else if (smc_fid == FFA_MSG_SEND_DIRECT_REQ_SMC64) { 35*91f16700Schasinglulu ret = FFA_MSG_SEND_DIRECT_RESP_SMC64; 36*91f16700Schasinglulu } else { 37*91f16700Schasinglulu panic(); /* Unknown SMC. */ 38*91f16700Schasinglulu } 39*91f16700Schasinglulu /* 40*91f16700Schasinglulu * Handle the incoming request. For testing purposes we echo the 41*91f16700Schasinglulu * incoming message. 42*91f16700Schasinglulu */ 43*91f16700Schasinglulu INFO("Logical Partition: Received Direct Request from %s world!\n", 44*91f16700Schasinglulu secure_origin ? "Secure" : "Normal"); 45*91f16700Schasinglulu 46*91f16700Schasinglulu /* 47*91f16700Schasinglulu * Logical SP's must always send a direct response so we can populate 48*91f16700Schasinglulu * our response directly. 49*91f16700Schasinglulu */ 50*91f16700Schasinglulu SMC_RET8(handle, ret, 0, 0, x4, 0, 0, 0, 0); 51*91f16700Schasinglulu } 52*91f16700Schasinglulu 53*91f16700Schasinglulu /* Register logical partition */ 54*91f16700Schasinglulu DECLARE_LOGICAL_PARTITION( 55*91f16700Schasinglulu my_logical_partition, 56*91f16700Schasinglulu sp_init, /* Init Function */ 57*91f16700Schasinglulu LP_PARTITION_ID, /* FF-A Partition ID */ 58*91f16700Schasinglulu LP_UUID, /* UUID */ 59*91f16700Schasinglulu PARTITION_PROPERTIES, /* Partition Properties. */ 60*91f16700Schasinglulu handle_ffa_direct_request /* Callback for direct requests. */ 61*91f16700Schasinglulu ); 62