blob: 35c6c853466f492a46c9c7dc4874fc22b1ad7d24 [file] [log] [blame]
Balint Dobszay72c3f042020-11-23 18:23:57 +01001/*
Imre Kisd0ed5c22021-12-15 17:05:47 +01002 * Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
Balint Dobszay72c3f042020-11-23 18:23:57 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Imre Kis317eb2c2022-07-05 16:43:42 +02007#include "components/rpc/common/endpoint/rpc_interface.h"
8#include "components/rpc/ffarpc/endpoint/ffarpc_call_ep.h"
9#include "components/service/secure_storage/factory/storage_factory.h"
10#include "components/service/secure_storage/frontend/secure_storage_provider/secure_storage_provider.h"
11#include "sp_api.h"
12#include "sp_discovery.h"
13#include "sp_messaging.h"
14#include "sp_rxtx.h"
15#include "trace.h"
Balint Dobszay72c3f042020-11-23 18:23:57 +010016
Balint Dobszay72c3f042020-11-23 18:23:57 +010017static uint8_t tx_buffer[4096] __aligned(4096);
18static uint8_t rx_buffer[4096] __aligned(4096);
19
20void sp_main(struct ffa_init_info *init_info)
21{
Imre Kis317eb2c2022-07-05 16:43:42 +020022 sp_result result = SP_RESULT_INTERNAL_ERROR;
23 struct rpc_interface *secure_storage_iface = NULL;
24 struct ffa_call_ep ffa_call_ep = { 0 };
Imre Kis76e8a3c2021-04-16 16:54:17 +020025 struct sp_msg req_msg = { 0 };
26 struct sp_msg resp_msg = { 0 };
Imre Kis317eb2c2022-07-05 16:43:42 +020027 struct secure_storage_provider secure_storage_provider = { 0 };
28 struct storage_backend *storage_backend = NULL;
Imre Kisf6562652022-07-04 15:33:13 +020029 uint16_t own_id = 0;
Balint Dobszay72c3f042020-11-23 18:23:57 +010030
31 /* Boot */
32 (void) init_info;
33
Imre Kis317eb2c2022-07-05 16:43:42 +020034 result = sp_rxtx_buffer_map(tx_buffer, rx_buffer, sizeof(rx_buffer));
35 if (result != SP_RESULT_OK) {
36 EMSG("Failed to map RXTX buffers: %d", result);
37 goto fatal_error;
Balint Dobszay72c3f042020-11-23 18:23:57 +010038 }
39
Imre Kis317eb2c2022-07-05 16:43:42 +020040 result = sp_discovery_own_id_get(&own_id);
41 if (result != SP_RESULT_OK) {
42 EMSG("Failed to query own ID: %d", result);
43 goto fatal_error;
Balint Dobszay72c3f042020-11-23 18:23:57 +010044 }
45
julhal013a4207d2021-03-08 13:32:08 +000046 storage_backend = storage_factory_create(storage_factory_security_class_PROTECTED);
Imre Kis317eb2c2022-07-05 16:43:42 +020047 if (!storage_backend) {
48 EMSG("Failed to create storage factory");
49 goto fatal_error;
50 }
51
52 secure_storage_iface = secure_storage_provider_init(&secure_storage_provider,
53 storage_backend);
54 if (!secure_storage_iface) {
55 EMSG("Failed to init secure storage provider");
56 goto fatal_error;
57 }
58
Imre Kisd92645c2022-06-28 17:26:53 +020059 ffa_call_ep_init(&ffa_call_ep, secure_storage_iface, own_id);
Balint Dobszay72c3f042020-11-23 18:23:57 +010060
61 /* End of boot phase */
Imre Kis317eb2c2022-07-05 16:43:42 +020062 result = sp_msg_wait(&req_msg);
63 if (result != SP_RESULT_OK) {
64 EMSG("Failed to send message wait %d", result);
65 goto fatal_error;
66 }
Balint Dobszay72c3f042020-11-23 18:23:57 +010067
68 while (1) {
Imre Kis76e8a3c2021-04-16 16:54:17 +020069 ffa_call_ep_receive(&ffa_call_ep, &req_msg, &resp_msg);
Balint Dobszay72c3f042020-11-23 18:23:57 +010070
Imre Kis317eb2c2022-07-05 16:43:42 +020071 result = sp_msg_send_direct_resp(&resp_msg, &req_msg);
72 if (result != SP_RESULT_OK) {
73 EMSG("Failed to send direct response %d", result);
74 result = sp_msg_wait(&req_msg);
75 if (result != SP_RESULT_OK) {
76 EMSG("Failed to send message wait %d", result);
77 goto fatal_error;
78 }
79 }
Balint Dobszay72c3f042020-11-23 18:23:57 +010080 }
Imre Kis317eb2c2022-07-05 16:43:42 +020081
82fatal_error:
83 /* SP is not viable */
84 EMSG("ITS SP error");
85 while (1) {}
Balint Dobszay72c3f042020-11-23 18:23:57 +010086}
87
88void sp_interrupt_handler(uint32_t interrupt_id)
89{
90 (void)interrupt_id;
91}