blob: a37396f4454b8bb7b04f4b4d16695cd33b5ccf31 [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
Imre Kis6bf3de32022-07-05 16:43:55 +02006#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 "sp_api.h"
11#include "sp_discovery.h"
12#include "sp_rxtx.h"
13#include "trace.h"
Julian Hall527ddd52021-06-28 11:57:17 +010014#include "service_proxy_factory.h"
15#include "../se_proxy_interfaces.h"
16
Imre Kis6bf3de32022-07-05 16:43:55 +020017static bool sp_init(uint16_t *own_sp_id);
Julian Hall527ddd52021-06-28 11:57:17 +010018
19void __noreturn sp_main(struct ffa_init_info *init_info)
20{
Imre Kis6bf3de32022-07-05 16:43:55 +020021 struct ffa_call_ep ffarpc_call_ep = { 0 };
22 struct sp_msg req_msg = { 0 };
23 struct sp_msg resp_msg = { 0 };
24 struct rpc_demux rpc_demux = { 0 };
25 struct rpc_interface *rpc_iface = NULL;
Imre Kisf6562652022-07-04 15:33:13 +020026 uint16_t own_id = 0;
Imre Kis6bf3de32022-07-05 16:43:55 +020027 sp_result result = SP_RESULT_INTERNAL_ERROR;
Julian Hall527ddd52021-06-28 11:57:17 +010028
29 /* Boot phase */
Imre Kis6bf3de32022-07-05 16:43:55 +020030 if (!sp_init(&own_id)) {
31 EMSG("Failed to init SP");
32 goto fatal_error;
33 }
Julian Hall527ddd52021-06-28 11:57:17 +010034
35 config_ramstore_init();
Imre Kis6bf3de32022-07-05 16:43:55 +020036
37 if (!sp_config_load(init_info)) {
38 EMSG("Failed to load SP config");
39 goto fatal_error;
40 }
Julian Hall527ddd52021-06-28 11:57:17 +010041
42 rpc_iface = rpc_demux_init(&rpc_demux);
Imre Kis6bf3de32022-07-05 16:43:55 +020043 if (!rpc_iface) {
44 EMSG("Failed to initialize RPC demux");
45 goto fatal_error;
46 }
47
Imre Kisd92645c2022-06-28 17:26:53 +020048 ffa_call_ep_init(&ffarpc_call_ep, rpc_iface, own_id);
Julian Hall527ddd52021-06-28 11:57:17 +010049
50 /* Create service proxies */
51 rpc_iface = its_proxy_create();
Imre Kis6bf3de32022-07-05 16:43:55 +020052 if (!rpc_iface) {
53 EMSG("Failed to create ITS proxy");
54 goto fatal_error;
55 }
56
Julian Hall527ddd52021-06-28 11:57:17 +010057 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_ITS, rpc_iface);
58
59 rpc_iface = ps_proxy_create();
Imre Kis6bf3de32022-07-05 16:43:55 +020060 if (!rpc_iface) {
61 EMSG("Failed to create PS proxy");
62 goto fatal_error;
63 }
Julian Hall527ddd52021-06-28 11:57:17 +010064 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_PS, rpc_iface);
65
66 rpc_iface = crypto_proxy_create();
Imre Kis6bf3de32022-07-05 16:43:55 +020067 if (!rpc_iface) {
68 EMSG("Failed to create Crypto proxy");
69 goto fatal_error;
70 }
Julian Hall527ddd52021-06-28 11:57:17 +010071 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_CRYPTO, rpc_iface);
72
73 rpc_iface = attest_proxy_create();
Imre Kis6bf3de32022-07-05 16:43:55 +020074 if (!rpc_iface) {
75 EMSG("Failed to create Attestation proxy");
76 goto fatal_error;
77 }
Julian Hall527ddd52021-06-28 11:57:17 +010078 rpc_demux_attach(&rpc_demux, SE_PROXY_INTERFACE_ID_ATTEST, rpc_iface);
79
80 /* End of boot phase */
Imre Kis6bf3de32022-07-05 16:43:55 +020081 result = sp_msg_wait(&req_msg);
82 if (result != SP_RESULT_OK) {
83 EMSG("Failed to send message wait %d", result);
84 goto fatal_error;
85 }
Julian Hall527ddd52021-06-28 11:57:17 +010086
87 while (1) {
Julian Hall527ddd52021-06-28 11:57:17 +010088 ffa_call_ep_receive(&ffarpc_call_ep, &req_msg, &resp_msg);
89
Imre Kis6bf3de32022-07-05 16:43:55 +020090 result = sp_msg_send_direct_resp(&resp_msg, &req_msg);
91 if (result != SP_RESULT_OK) {
92 EMSG("Failed to send direct response %d", result);
93 result = sp_msg_wait(&req_msg);
94 if (result != SP_RESULT_OK) {
95 EMSG("Failed to send message wait %d", result);
96 goto fatal_error;
97 }
98 }
Julian Hall527ddd52021-06-28 11:57:17 +010099 }
100
101fatal_error:
102 /* SP is not viable */
103 EMSG("SE proxy SP error");
104 while (1) {}
105}
106
107void sp_interrupt_handler(uint32_t interrupt_id)
108{
109 (void)interrupt_id;
110}
111
Imre Kis6bf3de32022-07-05 16:43:55 +0200112static bool sp_init(uint16_t *own_id)
Julian Hall527ddd52021-06-28 11:57:17 +0100113{
Imre Kis6bf3de32022-07-05 16:43:55 +0200114 sp_result sp_res = SP_RESULT_INTERNAL_ERROR;
Julian Hall527ddd52021-06-28 11:57:17 +0100115 static uint8_t tx_buffer[4096] __aligned(4096);
116 static uint8_t rx_buffer[4096] __aligned(4096);
117
118 sp_res = sp_rxtx_buffer_map(tx_buffer, rx_buffer, sizeof(rx_buffer));
Imre Kis6bf3de32022-07-05 16:43:55 +0200119 if (sp_res != SP_RESULT_OK) {
120 EMSG("Failed to map RXTX buffers: %d", sp_res);
121 return false;
Julian Hall527ddd52021-06-28 11:57:17 +0100122 }
123
Imre Kis6bf3de32022-07-05 16:43:55 +0200124 sp_res = sp_discovery_own_id_get(own_id);
125 if (sp_res != SP_RESULT_OK) {
126 EMSG("Failed to query own ID: %d", sp_res);
127 return false;
128 }
129
130 return true;
Julian Hall527ddd52021-06-28 11:57:17 +0100131}