blob: 3b1f472230a5a3d0966c90ba539696bbd94fcd33 [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/endpoint/ffarpc_call_ep.h"
7#include "service/test_runner/provider/test_runner_provider.h"
8#include "service/test_runner/provider/serializer/packed-c/packedc_test_runner_provider_serializer.h"
9#include "protocols/rpc/common/packed-c/status.h"
10#include "config/ramstore/config_ramstore.h"
11#include "config/loader/sp/sp_config_loader.h"
12#include "ffa_api.h"
13#include "sp_api.h"
14#include "sp_discovery.h"
15#include "sp_rxtx.h"
16#include "trace.h"
Julian Hall2feec562022-09-07 09:22:45 +010017#include "deployments/env-test/suites/registration/env_test_register.h"
julhal013ec4c322021-02-05 17:30:49 +000018
Imre Kis24531362022-07-05 16:43:28 +020019static bool sp_init(uint16_t *own_sp_id);
julhal013ec4c322021-02-05 17:30:49 +000020
21void __noreturn sp_main(struct ffa_init_info *init_info)
22{
Imre Kis24531362022-07-05 16:43:28 +020023 struct test_runner_provider test_runner_provider = { 0 };
24 struct ffa_call_ep ffarpc_call_ep = { 0 };
25 struct rpc_interface *test_runner_iface = NULL;
Imre Kis24531362022-07-05 16:43:28 +020026 struct sp_msg req_msg = { 0 };
27 struct sp_msg resp_msg = { 0 };
Imre Kisf6562652022-07-04 15:33:13 +020028 uint16_t own_id = 0;
Imre Kis24531362022-07-05 16:43:28 +020029 sp_result result = SP_RESULT_INTERNAL_ERROR;
julhal013ec4c322021-02-05 17:30:49 +000030
31 /* Boot */
Imre Kis24531362022-07-05 16:43:28 +020032 if (!sp_init(&own_id)) {
33 EMSG("Failed to init SP");
34 goto fatal_error;
35 }
julhal013ec4c322021-02-05 17:30:49 +000036
julhal0137e1aea2021-02-09 15:22:20 +000037 config_ramstore_init();
Imre Kis24531362022-07-05 16:43:28 +020038
39 if (!sp_config_load(init_info)) {
40 EMSG("Failed to load SP config");
41 goto fatal_error;
42 }
julhal013ec4c322021-02-05 17:30:49 +000043
44 /* Initialize the test_runner service */
45 test_runner_iface = test_runner_provider_init(&test_runner_provider);
Imre Kis24531362022-07-05 16:43:28 +020046 if (!test_runner_iface) {
47 EMSG("Failed to initialize test runner provider");
48 goto fatal_error;
49 }
julhal013ec4c322021-02-05 17:30:49 +000050
51 test_runner_provider_register_serializer(&test_runner_provider,
Julian Hall7048d302021-06-03 16:07:28 +010052 TS_RPC_ENCODING_PACKED_C, packedc_test_runner_provider_serializer_instance());
julhal013ec4c322021-02-05 17:30:49 +000053
julhal0137e1aea2021-02-09 15:22:20 +000054 env_test_register_tests(&test_runner_provider);
55
Imre Kisd92645c2022-06-28 17:26:53 +020056 ffa_call_ep_init(&ffarpc_call_ep, test_runner_iface, own_id);
julhal013ec4c322021-02-05 17:30:49 +000057
58 /* End of boot phase */
Imre Kis24531362022-07-05 16:43:28 +020059 result = sp_msg_wait(&req_msg);
60 if (result != SP_RESULT_OK) {
61 EMSG("Failed to send message wait %d", result);
62 goto fatal_error;
63 }
julhal013ec4c322021-02-05 17:30:49 +000064
65 while (1) {
Julian Hall22c47a92021-07-09 14:49:16 +010066 ffa_call_ep_receive(&ffarpc_call_ep, &req_msg, &resp_msg);
julhal013ec4c322021-02-05 17:30:49 +000067
Julian Hall22c47a92021-07-09 14:49:16 +010068 resp_msg.source_id = req_msg.destination_id;
69 resp_msg.destination_id = req_msg.source_id;
70
Imre Kis24531362022-07-05 16:43:28 +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 }
julhal013ec4c322021-02-05 17:30:49 +000080 }
81
82fatal_error:
83 /* SP is not viable */
84 EMSG("environment-test SP error");
85 while (1) {}
86}
87
88void sp_interrupt_handler(uint32_t interrupt_id)
89{
90 (void)interrupt_id;
91}
92
Imre Kis24531362022-07-05 16:43:28 +020093static bool sp_init(uint16_t *own_id)
julhal013ec4c322021-02-05 17:30:49 +000094{
Imre Kis24531362022-07-05 16:43:28 +020095 sp_result sp_res = SP_RESULT_INTERNAL_ERROR;
julhal013ec4c322021-02-05 17:30:49 +000096 static uint8_t tx_buffer[4096] __aligned(4096);
97 static uint8_t rx_buffer[4096] __aligned(4096);
98
99 sp_res = sp_rxtx_buffer_map(tx_buffer, rx_buffer, sizeof(rx_buffer));
Imre Kis24531362022-07-05 16:43:28 +0200100 if (sp_res != SP_RESULT_OK) {
101 EMSG("Failed to map RXTX buffers: %d", sp_res);
102 return false;
julhal013ec4c322021-02-05 17:30:49 +0000103 }
104
Imre Kis24531362022-07-05 16:43:28 +0200105 sp_res = sp_discovery_own_id_get(own_id);
106 if (sp_res != SP_RESULT_OK) {
107 EMSG("Failed to query own ID: %d", sp_res);
108 return false;
109 }
110
111 return true;
julhal013ec4c322021-02-05 17:30:49 +0000112}