Extend RPC parameters

The RPC model is extended to include parameters for identifying
an RPC interface instance at an endpoint and another for
identifying the parameter encoding.  The interface ID parameter
allows multiple service interfaces to be co-located.  The encoding
parameter allows clients to use different parameter serialization
schemes and to specify the format in each RPC request.

Signed-off-by: julhal01 <julian.hall@arm.com>
Change-Id: I201b3417dc0e9f655113b9931db3494e41f1d74b
diff --git a/components/rpc/common/endpoint/rpc_interface.h b/components/rpc/common/endpoint/rpc_interface.h
new file mode 100644
index 0000000..44e5783
--- /dev/null
+++ b/components/rpc/common/endpoint/rpc_interface.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef RPC_INTERFACE_H
+#define RPC_INTERFACE_H
+
+#include <stddef.h>
+#include <stdint.h>
+#include <rpc_status.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Definitions related to an rpc call endpoint */
+
+/** \brief Call parameter buffer
+ *
+ * Describes a buffer for holding call request and response parameters.
+ */
+struct call_param_buf {
+	size_t size;
+	size_t data_len;
+	void *data;
+};
+
+static inline struct call_param_buf call_param_buf_init_empty(void *data, size_t size)
+{
+	struct call_param_buf v;
+
+	v.size = size;
+	v.data_len = 0;
+	v.data = data;
+
+	return v;
+}
+
+static inline struct call_param_buf call_param_buf_init_full(void *data,
+							       size_t size,
+							       size_t data_len)
+{
+	struct call_param_buf v;
+
+	v.size = size;
+	v.data_len = data_len;
+	v.data = data;
+
+	return v;
+}
+
+/** \brief Call request
+ *
+ * A call request object represents a request from a client that will
+ * be handled by a call endpoint.
+ */
+struct call_req {
+	uint32_t caller_id;
+	uint32_t interface_id;
+	uint32_t opcode;
+	uint32_t encoding;
+	int opstatus;
+	struct call_param_buf req_buf;
+	struct call_param_buf resp_buf;
+};
+
+static inline uint32_t call_req_get_caller_id(const struct call_req *req)
+{
+	return req->caller_id;
+}
+
+static inline uint32_t call_req_get_interface_id(const struct call_req *req)
+{
+	return req->interface_id;
+}
+
+static inline uint32_t call_req_get_opcode(const struct call_req *req)
+{
+	return req->opcode;
+}
+
+static inline uint32_t call_req_get_encoding(const struct call_req *req)
+{
+	return req->encoding;
+}
+
+static inline int call_req_get_opstatus(const struct call_req *req)
+{
+	return req->opstatus;
+}
+
+static inline void call_req_set_opstatus(struct call_req *req, int opstatus)
+{
+	req->opstatus = opstatus;
+}
+
+static inline struct call_param_buf *call_req_get_req_buf(struct call_req *req)
+{
+	return &req->req_buf;
+}
+
+static inline struct call_param_buf *call_req_get_resp_buf(struct call_req *req)
+{
+	return &req->resp_buf;
+}
+
+/** \brief RPC interface
+ *
+ * A generalized RPC interface.  Provides a standard interface for a
+ * call endpoint that handles incoming call requests.
+ */
+struct rpc_interface
+{
+	void *context;
+	rpc_status_t (*receive)(struct rpc_interface *iface, struct call_req *req);
+};
+
+static inline rpc_status_t rpc_interface_receive(struct rpc_interface *iface,
+					  struct call_req *req)
+{
+	return iface->receive(iface, req);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* RPC_INTERFACE_H */