1 /*
2  * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef TS_RPC_ABI_H
8 #define TS_RPC_ABI_H
9 
10 #include "rpc_uuid.h"
11 #include <stdbool.h>
12 #include <stddef.h>
13 #include <stdint.h>
14 
15 #ifdef __cplusplus
16 extern "C" {
17 #endif
18 
19 /**
20  * @brief Trusted-services RPC ABI function
21  *
22  * This file contains getters and setters for TS ABI fields. They handle the five arg registers of
23  * the FF-A direct messages and extract or insert fields of suitable types.
24  */
25 
26 #define TS_RPC_ABI_FLAG_FAST_CALL			(0x01)
27 
28 #define TS_RPC_ABI_MANAGEMENT_OPCODE_VERSION		(0)
29 #define TS_RPC_ABI_MANAGEMENT_OPCODE_MEMORY_RETRIEVE	(1)
30 #define TS_RPC_ABI_MANAGEMENT_OPCODE_MEMORY_RELINQUISH	(2)
31 #define TS_RPC_ABI_MANAGEMENT_OPCODE_INTERFACE_ID_QUERY	(3)
32 
33 #define TS_RPC_ABI_VERSION_V1				(1)
34 
35 uint8_t ts_rpc_abi_get_flags(const uint32_t regs[5]);
36 void ts_rpc_abi_set_flags(uint32_t regs[5], uint8_t flags);
37 
38 uint8_t ts_rpc_abi_get_interface_id(const uint32_t regs[5]);
39 void ts_rpc_abi_set_interface_id(uint32_t regs[5], uint8_t interface_id);
40 
41 bool ts_rpc_abi_is_management_interface_id(const uint32_t regs[5]);
42 void ts_rpc_abi_set_management_interface_id(uint32_t regs[5]);
43 
44 uint16_t ts_rpc_abi_get_opcode(const uint32_t regs[5]);
45 void ts_rpc_abi_set_opcode(uint32_t regs[5], uint16_t interface_id);
46 
47 void ts_rpc_abi_copy_control_reg(uint32_t response_regs[5], const uint32_t request_regs[5]);
48 
49 uint32_t ts_rpc_abi_get_version(const uint32_t regs[5]);
50 void ts_rpc_abi_set_version(uint32_t regs[5], uint32_t version);
51 
52 uint64_t ts_rpc_abi_get_memory_handle(const uint32_t regs[5]);
53 void ts_rpc_abi_set_memory_handle(uint32_t regs[5], uint64_t handle);
54 
55 uint64_t ts_rpc_abi_get_memory_tag(const uint32_t regs[5]);
56 void ts_rpc_abi_set_memory_tag(uint32_t regs[5], uint64_t tag);
57 
58 uint32_t ts_rpc_abi_get_rpc_status(const uint32_t regs[5]);
59 void ts_rpc_abi_set_rpc_status(uint32_t regs[5], uint32_t status);
60 
61 uint32_t ts_rpc_abi_get_service_status(const uint32_t regs[5]);
62 void ts_rpc_abi_set_service_status(uint32_t regs[5], uint32_t status);
63 
64 void ts_rpc_abi_get_uuid(const uint32_t regs[5], struct rpc_uuid *uuid);
65 void ts_rpc_abi_set_uuid(uint32_t regs[5], const struct rpc_uuid *uuid);
66 
67 uint8_t ts_rpc_abi_get_queried_interface_id(const uint32_t regs[5]);
68 void ts_rpc_abi_set_queried_interface_id(uint32_t regs[5], uint8_t interface_id);
69 
70 uint32_t ts_rpc_abi_get_request_length(const uint32_t regs[5]);
71 void ts_rpc_abi_set_request_length(uint32_t regs[5], uint32_t length);
72 
73 uint32_t ts_rpc_abi_get_client_id(const uint32_t regs[5]);
74 void ts_rpc_abi_set_client_id(uint32_t regs[5], uint32_t client_id);
75 
76 uint32_t ts_rpc_abi_get_response_length(const uint32_t regs[5]);
77 void ts_rpc_abi_set_response_length(uint32_t regs[5], uint32_t length);
78 
79 #ifdef __cplusplus
80 }
81 #endif
82 
83 #endif /* TS_RPC_ABI_H */
84