blob: 2754ebf29bf8eae0923b3d0e5d7cac4692e0627a [file] [log] [blame]
julhal013ec4c322021-02-05 17:30:49 +00001// SPDX-License-Identifier: BSD-3-Clause
2/*
Imre Kisd92645c2022-06-28 17:26:53 +02003 * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
julhal013ec4c322021-02-05 17:30:49 +00004 */
5
Imre Kis24531362022-07-05 16:43:28 +02006#include "rpc/ffarpc/caller/sp/ffarpc_caller.h"
7#include "rpc/ffarpc/endpoint/ffarpc_call_ep.h"
8#include "service/test_runner/provider/test_runner_provider.h"
9#include "service/test_runner/provider/serializer/packed-c/packedc_test_runner_provider_serializer.h"
10#include "protocols/rpc/common/packed-c/status.h"
11#include "config/ramstore/config_ramstore.h"
12#include "config/loader/sp/sp_config_loader.h"
13#include "ffa_api.h"
14#include "sp_api.h"
15#include "sp_discovery.h"
16#include "sp_rxtx.h"
17#include "trace.h"
julhal0137e1aea2021-02-09 15:22:20 +000018#include "env_test_tests.h"
julhal013ec4c322021-02-05 17:30:49 +000019
Imre Kis24531362022-07-05 16:43:28 +020020static bool sp_init(uint16_t *own_sp_id);
julhal013ec4c322021-02-05 17:30:49 +000021
22void __noreturn sp_main(struct ffa_init_info *init_info)
23{
Imre Kis24531362022-07-05 16:43:28 +020024 struct test_runner_provider test_runner_provider = { 0 };
25 struct ffa_call_ep ffarpc_call_ep = { 0 };
26 struct rpc_interface *test_runner_iface = NULL;
27 struct ffarpc_caller ffarpc_caller = { 0 };
28 struct sp_msg req_msg = { 0 };
29 struct sp_msg resp_msg = { 0 };
Imre Kisf6562652022-07-04 15:33:13 +020030 uint16_t own_id = 0;
Imre Kis24531362022-07-05 16:43:28 +020031 sp_result result = SP_RESULT_INTERNAL_ERROR;
julhal013ec4c322021-02-05 17:30:49 +000032
33 /* Boot */
Imre Kis24531362022-07-05 16:43:28 +020034 if (!sp_init(&own_id)) {
35 EMSG("Failed to init SP");
36 goto fatal_error;
37 }
julhal013ec4c322021-02-05 17:30:49 +000038
julhal0137e1aea2021-02-09 15:22:20 +000039 config_ramstore_init();
Imre Kis24531362022-07-05 16:43:28 +020040
41 if (!sp_config_load(init_info)) {
42 EMSG("Failed to load SP config");
43 goto fatal_error;
44 }
julhal013ec4c322021-02-05 17:30:49 +000045
46 /* Initialize the test_runner service */
47 test_runner_iface = test_runner_provider_init(&test_runner_provider);
Imre Kis24531362022-07-05 16:43:28 +020048 if (!test_runner_iface) {
49 EMSG("Failed to initialize test runner provider");
50 goto fatal_error;
51 }
julhal013ec4c322021-02-05 17:30:49 +000052
53 test_runner_provider_register_serializer(&test_runner_provider,
Julian Hall7048d302021-06-03 16:07:28 +010054 TS_RPC_ENCODING_PACKED_C, packedc_test_runner_provider_serializer_instance());
julhal013ec4c322021-02-05 17:30:49 +000055
julhal0137e1aea2021-02-09 15:22:20 +000056 env_test_register_tests(&test_runner_provider);
57
Imre Kisd92645c2022-06-28 17:26:53 +020058 ffa_call_ep_init(&ffarpc_call_ep, test_runner_iface, own_id);
julhal013ec4c322021-02-05 17:30:49 +000059
60 /* End of boot phase */
Imre Kis24531362022-07-05 16:43:28 +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 }
julhal013ec4c322021-02-05 17:30:49 +000066
67 while (1) {
Julian Hall22c47a92021-07-09 14:49:16 +010068 ffa_call_ep_receive(&ffarpc_call_ep, &req_msg, &resp_msg);
julhal013ec4c322021-02-05 17:30:49 +000069
Julian Hall22c47a92021-07-09 14:49:16 +010070 resp_msg.source_id = req_msg.destination_id;
71 resp_msg.destination_id = req_msg.source_id;
72
Imre Kis24531362022-07-05 16:43:28 +020073 result = sp_msg_send_direct_resp(&resp_msg, &req_msg);
74 if (result != SP_RESULT_OK) {
75 EMSG("Failed to send direct response %d", result);
76 result = sp_msg_wait(&req_msg);
77 if (result != SP_RESULT_OK) {
78 EMSG("Failed to send message wait %d", result);
79 goto fatal_error;
80 }
81 }
julhal013ec4c322021-02-05 17:30:49 +000082 }
83
84fatal_error:
85 /* SP is not viable */
86 EMSG("environment-test SP error");
87 while (1) {}
88}
89
90void sp_interrupt_handler(uint32_t interrupt_id)
91{
92 (void)interrupt_id;
93}
94
Imre Kis24531362022-07-05 16:43:28 +020095static bool sp_init(uint16_t *own_id)
julhal013ec4c322021-02-05 17:30:49 +000096{
Imre Kis24531362022-07-05 16:43:28 +020097 sp_result sp_res = SP_RESULT_INTERNAL_ERROR;
julhal013ec4c322021-02-05 17:30:49 +000098 static uint8_t tx_buffer[4096] __aligned(4096);
99 static uint8_t rx_buffer[4096] __aligned(4096);
100
101 sp_res = sp_rxtx_buffer_map(tx_buffer, rx_buffer, sizeof(rx_buffer));
Imre Kis24531362022-07-05 16:43:28 +0200102 if (sp_res != SP_RESULT_OK) {
103 EMSG("Failed to map RXTX buffers: %d", sp_res);
104 return false;
julhal013ec4c322021-02-05 17:30:49 +0000105 }
106
Imre Kis24531362022-07-05 16:43:28 +0200107 sp_res = sp_discovery_own_id_get(own_id);
108 if (sp_res != SP_RESULT_OK) {
109 EMSG("Failed to query own ID: %d", sp_res);
110 return false;
111 }
112
113 return true;
julhal013ec4c322021-02-05 17:30:49 +0000114}