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