xref: /arm-trusted-firmware/plat/arm/board/fvp/fvp_el3_spmc_logical_sp.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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