blob: 4c694ef97e67c181f44644fa28ca6f4b83dd74e6 [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 Kisfe754612022-07-05 16:43:36 +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 Kisfe754612022-07-05 16:43:36 +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 Kisfe754612022-07-05 16:43:36 +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 Kisfe754612022-07-05 16:43:36 +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 Kisfe754612022-07-05 16:43:36 +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_INTERNAL_TRUSTED);
Imre Kisfe754612022-07-05 16:43:36 +020047 if (!storage_backend) {
Julian Hall072daf82022-08-04 12:04:41 +010048 EMSG("Failed to create storage backend");
Imre Kisfe754612022-07-05 16:43:36 +020049 goto fatal_error;
50 }
51
julhal011260f102021-02-15 17:34:08 +000052 secure_storage_iface = secure_storage_provider_init(&secure_storage_provider, storage_backend);
Imre Kisfe754612022-07-05 16:43:36 +020053 if (!secure_storage_iface) {
54 EMSG("Failed to init secure storage provider");
55 goto fatal_error;
56 }
57
Imre Kisd92645c2022-06-28 17:26:53 +020058 ffa_call_ep_init(&ffa_call_ep, secure_storage_iface, own_id);
Balint Dobszay72c3f042020-11-23 18:23:57 +010059
60 /* End of boot phase */
Imre Kisfe754612022-07-05 16:43:36 +020061 result = sp_msg_wait(&req_msg);
62 if (result != SP_RESULT_OK) {
63 EMSG("Failed to send message wait %d", result);
64 goto fatal_error;
65 }
Balint Dobszay72c3f042020-11-23 18:23:57 +010066
67 while (1) {
Imre Kis76e8a3c2021-04-16 16:54:17 +020068 ffa_call_ep_receive(&ffa_call_ep, &req_msg, &resp_msg);
Balint Dobszay72c3f042020-11-23 18:23:57 +010069
Imre Kisfe754612022-07-05 16:43:36 +020070 result = sp_msg_send_direct_resp(&resp_msg, &req_msg);
71 if (result != SP_RESULT_OK) {
72 EMSG("Failed to send direct response %d", result);
73 result = sp_msg_wait(&req_msg);
74 if (result != SP_RESULT_OK) {
75 EMSG("Failed to send message wait %d", result);
76 goto fatal_error;
77 }
78 }
Balint Dobszay72c3f042020-11-23 18:23:57 +010079 }
Imre Kisfe754612022-07-05 16:43:36 +020080
81fatal_error:
82 /* SP is not viable */
83 EMSG("ITS SP error");
84 while (1) {}
Balint Dobszay72c3f042020-11-23 18:23:57 +010085}
86
87void sp_interrupt_handler(uint32_t interrupt_id)
88{
89 (void)interrupt_id;
90}