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