blob: ba949dedc2f15fbe952b70ee4cdb947afe6f218e [file] [log] [blame]
Julian Hall6c59e4e2020-11-23 17:50:47 +01001/*
julhal01c3f4e9a2020-12-15 13:39:01 +00002 * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
Julian Hall6c59e4e2020-11-23 17:50:47 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
julhal01c3f4e9a2020-12-15 13:39:01 +00007#ifndef RPC_INTERFACE_H
8#define RPC_INTERFACE_H
Julian Hall6c59e4e2020-11-23 17:50:47 +01009
10#include <stddef.h>
11#include <stdint.h>
12#include <rpc_status.h>
Julian Halla6b3e1c2021-06-25 10:15:01 +010013#include <protocols/rpc/common/packed-c/status.h>
Julian Hall6c59e4e2020-11-23 17:50:47 +010014
15#ifdef __cplusplus
16extern "C" {
17#endif
18
19/* Definitions related to an rpc call endpoint */
20
21/** \brief Call parameter buffer
22 *
23 * Describes a buffer for holding call request and response parameters.
24 */
25struct call_param_buf {
26 size_t size;
27 size_t data_len;
28 void *data;
29};
30
31static inline struct call_param_buf call_param_buf_init_empty(void *data, size_t size)
32{
33 struct call_param_buf v;
34
35 v.size = size;
36 v.data_len = 0;
37 v.data = data;
38
39 return v;
40}
41
42static inline struct call_param_buf call_param_buf_init_full(void *data,
43 size_t size,
44 size_t data_len)
45{
46 struct call_param_buf v;
47
48 v.size = size;
49 v.data_len = data_len;
50 v.data = data;
51
52 return v;
53}
54
Julian Hall6c59e4e2020-11-23 17:50:47 +010055/** \brief Call request
56 *
57 * A call request object represents a request from a client that will
58 * be handled by a call endpoint.
59 */
60struct call_req {
61 uint32_t caller_id;
julhal01c3f4e9a2020-12-15 13:39:01 +000062 uint32_t interface_id;
Julian Hall6c59e4e2020-11-23 17:50:47 +010063 uint32_t opcode;
julhal01c3f4e9a2020-12-15 13:39:01 +000064 uint32_t encoding;
Julian Hall6c59e4e2020-11-23 17:50:47 +010065 int opstatus;
Julian Hall6c59e4e2020-11-23 17:50:47 +010066 struct call_param_buf req_buf;
67 struct call_param_buf resp_buf;
68};
69
70static inline uint32_t call_req_get_caller_id(const struct call_req *req)
71{
72 return req->caller_id;
73}
74
julhal01c3f4e9a2020-12-15 13:39:01 +000075static inline uint32_t call_req_get_interface_id(const struct call_req *req)
76{
77 return req->interface_id;
78}
79
Julian Hall6c59e4e2020-11-23 17:50:47 +010080static inline uint32_t call_req_get_opcode(const struct call_req *req)
81{
82 return req->opcode;
83}
84
julhal01c3f4e9a2020-12-15 13:39:01 +000085static inline uint32_t call_req_get_encoding(const struct call_req *req)
86{
87 return req->encoding;
88}
89
Julian Hall6c59e4e2020-11-23 17:50:47 +010090static inline int call_req_get_opstatus(const struct call_req *req)
91{
92 return req->opstatus;
93}
94
95static inline void call_req_set_opstatus(struct call_req *req, int opstatus)
96{
97 req->opstatus = opstatus;
98}
99
Julian Hall6c59e4e2020-11-23 17:50:47 +0100100static inline struct call_param_buf *call_req_get_req_buf(struct call_req *req)
101{
102 return &req->req_buf;
103}
104
105static inline struct call_param_buf *call_req_get_resp_buf(struct call_req *req)
106{
107 return &req->resp_buf;
108}
109
julhal01c3f4e9a2020-12-15 13:39:01 +0000110/** \brief RPC interface
Julian Hall6c59e4e2020-11-23 17:50:47 +0100111 *
julhal01c3f4e9a2020-12-15 13:39:01 +0000112 * A generalized RPC interface. Provides a standard interface for a
Julian Hall6c59e4e2020-11-23 17:50:47 +0100113 * call endpoint that handles incoming call requests.
114 */
julhal01c3f4e9a2020-12-15 13:39:01 +0000115struct rpc_interface
Julian Hall6c59e4e2020-11-23 17:50:47 +0100116{
117 void *context;
julhal01c3f4e9a2020-12-15 13:39:01 +0000118 rpc_status_t (*receive)(struct rpc_interface *iface, struct call_req *req);
Julian Hall6c59e4e2020-11-23 17:50:47 +0100119};
120
julhal01c3f4e9a2020-12-15 13:39:01 +0000121static inline rpc_status_t rpc_interface_receive(struct rpc_interface *iface,
Julian Hall6c59e4e2020-11-23 17:50:47 +0100122 struct call_req *req)
123{
Julian Halla6b3e1c2021-06-25 10:15:01 +0100124 rpc_status_t rpc_status = TS_RPC_ERROR_INTERFACE_DOES_NOT_EXIST;
125
126 if (iface) {
127
128 rpc_status = iface->receive(iface, req);
129 }
130
131 return rpc_status;
Julian Hall6c59e4e2020-11-23 17:50:47 +0100132}
133
134#ifdef __cplusplus
135}
136#endif
137
julhal01c3f4e9a2020-12-15 13:39:01 +0000138#endif /* RPC_INTERFACE_H */