blob: 5635a72b88bc4c51659c25d58f1b1ffd1da76251 [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 Kis4fe0c102023-07-05 18:14:21 +02006#include "components/rpc/common/endpoint/rpc_service_interface.h"
7#include "components/rpc/ts_rpc/endpoint/sp/ts_rpc_endpoint_sp.h"
Imre Kis24531362022-07-05 16:43:28 +02008#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"
Julian Hall2feec562022-09-07 09:22:45 +010018#include "deployments/env-test/suites/registration/env_test_register.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
Balint Dobszay4f9d8e32023-04-13 13:55:08 +020022void __noreturn sp_main(union ffa_boot_info *boot_info)
julhal013ec4c322021-02-05 17:30:49 +000023{
Imre Kis24531362022-07-05 16:43:28 +020024 struct test_runner_provider test_runner_provider = { 0 };
Imre Kis4fe0c102023-07-05 18:14:21 +020025 struct ts_rpc_endpoint_sp rpc_endpoint = { 0 };
26 struct rpc_service_interface *test_runner_iface = NULL;
Imre Kis24531362022-07-05 16:43:28 +020027 struct sp_msg req_msg = { 0 };
28 struct sp_msg resp_msg = { 0 };
Imre Kisf6562652022-07-04 15:33:13 +020029 uint16_t own_id = 0;
Imre Kis24531362022-07-05 16:43:28 +020030 sp_result result = SP_RESULT_INTERNAL_ERROR;
Imre Kis4fe0c102023-07-05 18:14:21 +020031 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
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
Balint Dobszay4f9d8e32023-04-13 13:55:08 +020041 if (!sp_config_load(boot_info)) {
Imre Kis24531362022-07-05 16:43:28 +020042 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 Kis4fe0c102023-07-05 18:14:21 +020058 rpc_status = ts_rpc_endpoint_sp_init(&rpc_endpoint, 1, 16);
59 if (rpc_status != RPC_SUCCESS) {
60 EMSG("Failed to initialize RPC endpoint: %d", rpc_status);
61 goto fatal_error;
62 }
63
64 rpc_status = ts_rpc_endpoint_sp_add_service(&rpc_endpoint, test_runner_iface);
65 if (rpc_status != RPC_SUCCESS) {
66 EMSG("Failed to add service to RPC endpoint: %d", rpc_status);
67 goto fatal_error;
68 }
julhal013ec4c322021-02-05 17:30:49 +000069
70 /* End of boot phase */
Imre Kis24531362022-07-05 16:43:28 +020071 result = sp_msg_wait(&req_msg);
72 if (result != SP_RESULT_OK) {
73 EMSG("Failed to send message wait %d", result);
74 goto fatal_error;
75 }
julhal013ec4c322021-02-05 17:30:49 +000076
77 while (1) {
Imre Kis4fe0c102023-07-05 18:14:21 +020078 ts_rpc_endpoint_sp_receive(&rpc_endpoint, &req_msg, &resp_msg);
julhal013ec4c322021-02-05 17:30:49 +000079
Julian Hall22c47a92021-07-09 14:49:16 +010080 resp_msg.source_id = req_msg.destination_id;
81 resp_msg.destination_id = req_msg.source_id;
82
Imre Kis24531362022-07-05 16:43:28 +020083 result = sp_msg_send_direct_resp(&resp_msg, &req_msg);
84 if (result != SP_RESULT_OK) {
85 EMSG("Failed to send direct response %d", result);
86 result = sp_msg_wait(&req_msg);
87 if (result != SP_RESULT_OK) {
88 EMSG("Failed to send message wait %d", result);
89 goto fatal_error;
90 }
91 }
julhal013ec4c322021-02-05 17:30:49 +000092 }
93
94fatal_error:
95 /* SP is not viable */
96 EMSG("environment-test SP error");
97 while (1) {}
98}
99
100void sp_interrupt_handler(uint32_t interrupt_id)
101{
102 (void)interrupt_id;
103}
104
Balint Dobszayac721da2024-07-02 16:33:59 +0200105ffa_result ffa_vm_created_handler(uint16_t vm_id, uint64_t handle)
106{
107 (void)vm_id;
108 (void)handle;
109
110 return FFA_OK;
111}
112
113ffa_result ffa_vm_destroyed_handler(uint16_t vm_id, uint64_t handle)
114{
115 (void)vm_id;
116 (void)handle;
117
118 return FFA_OK;
119}
120
Imre Kis24531362022-07-05 16:43:28 +0200121static bool sp_init(uint16_t *own_id)
julhal013ec4c322021-02-05 17:30:49 +0000122{
Imre Kis24531362022-07-05 16:43:28 +0200123 sp_result sp_res = SP_RESULT_INTERNAL_ERROR;
julhal013ec4c322021-02-05 17:30:49 +0000124 static uint8_t tx_buffer[4096] __aligned(4096);
125 static uint8_t rx_buffer[4096] __aligned(4096);
126
127 sp_res = sp_rxtx_buffer_map(tx_buffer, rx_buffer, sizeof(rx_buffer));
Imre Kis24531362022-07-05 16:43:28 +0200128 if (sp_res != SP_RESULT_OK) {
129 EMSG("Failed to map RXTX buffers: %d", sp_res);
130 return false;
julhal013ec4c322021-02-05 17:30:49 +0000131 }
132
Imre Kis24531362022-07-05 16:43:28 +0200133 sp_res = sp_discovery_own_id_get(own_id);
134 if (sp_res != SP_RESULT_OK) {
135 EMSG("Failed to query own ID: %d", sp_res);
136 return false;
137 }
138
139 return true;
julhal013ec4c322021-02-05 17:30:49 +0000140}