blob: 70eddb85b5f57c21c90617b9382e0f9c25a764da [file] [log] [blame]
Julian Hall527ddd52021-06-28 11:57:17 +01001// SPDX-License-Identifier: BSD-3-Clause
2/*
Imre Kis9757f6b2022-07-26 17:19:46 +02003 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
Julian Hall527ddd52021-06-28 11:57:17 +01004 */
5
6#include <rpc/ffarpc/endpoint/ffarpc_call_ep.h>
7#include <rpc/common/demux/rpc_demux.h>
8#include <config/ramstore/config_ramstore.h>
9#include <config/loader/sp/sp_config_loader.h>
10#include <ffa_api.h>
11#include <sp_api.h>
12#include <sp_rxtx.h>
13#include <trace.h>
14#include "service_proxy_factory.h"
15#include "../se_proxy_interfaces.h"
16
Julian Hall527ddd52021-06-28 11:57:17 +010017static int sp_init(uint16_t *own_sp_id);
18
19void __noreturn sp_main(struct ffa_init_info *init_info)
20{
21 struct ffa_call_ep ffarpc_call_ep;
22 struct sp_msg req_msg;
23 struct rpc_demux rpc_demux;
24 struct rpc_interface *rpc_iface;
Imre Kisf6562652022-07-04 15:33:13 +020025 uint16_t own_id = 0;
Julian Hall527ddd52021-06-28 11:57:17 +010026
27 /* Boot phase */
28 if (sp_init(&own_id) != 0) goto fatal_error;
29
30 config_ramstore_init();
31 sp_config_load(init_info);
32
33 rpc_iface = rpc_demux_init(&rpc_demux);
Imre Kisd92645c2022-06-28 17:26:53 +020034 ffa_call_ep_init(&ffarpc_call_ep, rpc_iface, own_id);
Julian Hall527ddd52021-06-28 11:57:17 +010035
36 /* Create service proxies */
37 rpc_iface = its_proxy_create();
38 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_ITS, rpc_iface);
39
40 rpc_iface = ps_proxy_create();
41 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_PS, rpc_iface);
42
43 rpc_iface = crypto_proxy_create();
44 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_CRYPTO, rpc_iface);
45
46 rpc_iface = attest_proxy_create();
47 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_ATTEST, rpc_iface);
48
49 /* End of boot phase */
50 sp_msg_wait(&req_msg);
51
52 while (1) {
53
54 struct sp_msg resp_msg;
55
56 ffa_call_ep_receive(&ffarpc_call_ep, &req_msg, &resp_msg);
57
Julian Hall527ddd52021-06-28 11:57:17 +010058 sp_msg_send_direct_resp(&resp_msg, &req_msg);
59 }
60
61fatal_error:
62 /* SP is not viable */
63 EMSG("SE proxy SP error");
64 while (1) {}
65}
66
67void sp_interrupt_handler(uint32_t interrupt_id)
68{
69 (void)interrupt_id;
70}
71
72static int sp_init(uint16_t *own_sp_id)
73{
74 int status = -1;
75 ffa_result ffa_res;
76 sp_result sp_res;
77 static uint8_t tx_buffer[4096] __aligned(4096);
78 static uint8_t rx_buffer[4096] __aligned(4096);
79
80 sp_res = sp_rxtx_buffer_map(tx_buffer, rx_buffer, sizeof(rx_buffer));
81 if (sp_res == SP_RESULT_OK) {
82 ffa_res = ffa_id_get(own_sp_id);
83 if (ffa_res == FFA_OK) {
84 status = 0;
85 }
86 }
87
88 return status;
89}