diff options
Diffstat (limited to 'components/rpc')
-rw-r--r-- | components/rpc/common/caller/rpc_caller.c | 16 | ||||
-rw-r--r-- | components/rpc/common/endpoint/rpc_interface.h (renamed from components/rpc/common/endpoint/call_ep.h) | 48 | ||||
-rw-r--r-- | components/rpc/common/interface/rpc_caller.h | 16 | ||||
-rw-r--r-- | components/rpc/direct/direct_caller.c | 18 | ||||
-rw-r--r-- | components/rpc/direct/direct_caller.h | 10 | ||||
-rw-r--r-- | components/rpc/dummy/dummy_caller.c | 4 | ||||
-rw-r--r-- | components/rpc/dummy/dummy_caller.h | 2 | ||||
-rw-r--r-- | components/rpc/ffarpc/caller/linux/ffarpc_caller.c | 272 | ||||
-rw-r--r-- | components/rpc/ffarpc/caller/linux/ffarpc_caller.h | 5 | ||||
-rw-r--r-- | components/rpc/ffarpc/caller/sp/ffarpc_caller.c | 69 | ||||
-rw-r--r-- | components/rpc/ffarpc/caller/sp/ffarpc_caller.h | 7 | ||||
-rw-r--r-- | components/rpc/ffarpc/endpoint/ffarpc_call_args.h | 14 | ||||
-rw-r--r-- | components/rpc/ffarpc/endpoint/ffarpc_call_ep.c | 39 | ||||
-rw-r--r-- | components/rpc/ffarpc/endpoint/ffarpc_call_ep.h | 8 | ||||
-rw-r--r-- | components/rpc/ffarpc/endpoint/ffarpc_call_ops.h | 16 |
15 files changed, 310 insertions, 234 deletions
diff --git a/components/rpc/common/caller/rpc_caller.c b/components/rpc/common/caller/rpc_caller.c index 4fd1e5adf..00b559c71 100644 --- a/components/rpc/common/caller/rpc_caller.c +++ b/components/rpc/common/caller/rpc_caller.c @@ -1,11 +1,25 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include <rpc_caller.h> #include <stdint.h> +#include <protocols/rpc/common/packed-c/encoding.h> + +void rpc_caller_init(struct rpc_caller *s, void *context) +{ + s->context = context; + + /* The default encoding scheme - may be overridden by a client */ + s->encoding = TS_RPC_ENCODING_PACKED_C; +} + +void rpc_caller_set_encoding_scheme(struct rpc_caller *s, uint32_t encoding) +{ + s->encoding = encoding; +} rpc_call_handle rpc_caller_begin(struct rpc_caller *s, uint8_t **req_buf, size_t req_len) diff --git a/components/rpc/common/endpoint/call_ep.h b/components/rpc/common/endpoint/rpc_interface.h index 1b5d03dc4..44e578354 100644 --- a/components/rpc/common/endpoint/call_ep.h +++ b/components/rpc/common/endpoint/rpc_interface.h @@ -1,11 +1,11 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ -#ifndef CALL_EP_H -#define CALL_EP_H +#ifndef RPC_INTERFACE_H +#define RPC_INTERFACE_H #include <stddef.h> #include <stdint.h> @@ -51,16 +51,6 @@ static inline struct call_param_buf call_param_buf_init_full(void *data, return v; } -/** \brief Serializer for handling call parameters - * - * An abstract serializer pointer, used for attaching a concrete - * serializer to a call request for serializing/deserializing call - * parameters. The strategy for selecting an appropriate serializer - * could be hard-coded or dynamic, based on a content type identifier - * carried by a concrete rpc. - */ -typedef const void* call_param_serializer_ptr; - /** \brief Call request * * A call request object represents a request from a client that will @@ -68,9 +58,10 @@ typedef const void* call_param_serializer_ptr; */ struct call_req { uint32_t caller_id; + uint32_t interface_id; uint32_t opcode; + uint32_t encoding; int opstatus; - call_param_serializer_ptr serializer; struct call_param_buf req_buf; struct call_param_buf resp_buf; }; @@ -80,11 +71,21 @@ 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; @@ -95,11 +96,6 @@ static inline void call_req_set_opstatus(struct call_req *req, int opstatus) req->opstatus = opstatus; } -static inline call_param_serializer_ptr call_req_get_serializer(const struct call_req *req) -{ - return req->serializer; -} - static inline struct call_param_buf *call_req_get_req_buf(struct call_req *req) { return &req->req_buf; @@ -110,25 +106,25 @@ static inline struct call_param_buf *call_req_get_resp_buf(struct call_req *req) return &req->resp_buf; } -/** \brief Call endpoint +/** \brief RPC interface * - * A generalized call endpoint. Provides a standard interface for a + * A generalized RPC interface. Provides a standard interface for a * call endpoint that handles incoming call requests. */ -struct call_ep +struct rpc_interface { void *context; - rpc_status_t (*receive)(struct call_ep *ep, struct call_req *req); + rpc_status_t (*receive)(struct rpc_interface *iface, struct call_req *req); }; -static inline rpc_status_t call_ep_receive(struct call_ep *ep, +static inline rpc_status_t rpc_interface_receive(struct rpc_interface *iface, struct call_req *req) { - return ep->receive(ep, req); + return iface->receive(iface, req); } #ifdef __cplusplus } #endif -#endif /* CALL_EP_H */ +#endif /* RPC_INTERFACE_H */ diff --git a/components/rpc/common/interface/rpc_caller.h b/components/rpc/common/interface/rpc_caller.h index a75bdd9ab..879d2cb2a 100644 --- a/components/rpc/common/interface/rpc_caller.h +++ b/components/rpc/common/interface/rpc_caller.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -36,6 +36,7 @@ typedef void *rpc_call_handle; struct rpc_caller { void *context; + uint32_t encoding; /* A concrete rpc_caller implements these methods */ rpc_call_handle (*call_begin)(void *context, uint8_t **req_buf, size_t req_len); @@ -47,6 +48,19 @@ struct rpc_caller }; /* + * Called by a concrete rpc_caller to initialise the base rpc_caller. + */ +void rpc_caller_init(struct rpc_caller *s, void *context); + +/* + * Allows a client to specify the parameter encoding scheme that the client + * intends to use during an RPC session. It is the client's responsiblity + * to choose an encoding scheme that is supported by the remote interface. + */ +RPC_CALLER_EXPORTED void rpc_caller_set_encoding_scheme(struct rpc_caller *s, + uint32_t encoding); + +/* * Starts a call transaction. The returned handle is an identifier for the * transaction and must be passed as a parameter to call_invoke() and * call_end(). A concrete rpc_caller may perform resource allocation during diff --git a/components/rpc/direct/direct_caller.c b/components/rpc/direct/direct_caller.c index 001ee7c84..14f1a91e0 100644 --- a/components/rpc/direct/direct_caller.c +++ b/components/rpc/direct/direct_caller.c @@ -1,11 +1,11 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include "direct_caller.h" -#include <rpc/common/endpoint/call_ep.h> +#include <rpc/common/endpoint/rpc_interface.h> #include <protocols/rpc/common/packed-c/status.h> #include <stdlib.h> @@ -18,17 +18,17 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t static void call_end(void *context, rpc_call_handle handle); -struct rpc_caller *direct_caller_init(struct direct_caller *s, struct call_ep *ep, +struct rpc_caller *direct_caller_init(struct direct_caller *s, struct rpc_interface *iface, size_t req_buf_size, size_t resp_buf_size) { struct rpc_caller *base = &s->rpc_caller; - base->context = s; + rpc_caller_init(base, s); base->call_begin = call_begin; base->call_invoke = call_invoke; base->call_end = call_end; - s->call_ep = ep; + s->rpc_interface = iface; s->caller_id = 0; s->is_call_transaction_in_progess = false; s->req_len = 0; @@ -47,10 +47,10 @@ struct rpc_caller *direct_caller_init(struct direct_caller *s, struct call_ep *e return base; } -struct rpc_caller *direct_caller_init_default(struct direct_caller *s, struct call_ep *ep) +struct rpc_caller *direct_caller_init_default(struct direct_caller *s, struct rpc_interface *iface) { /* Initialise with default buffer sizes */ - return direct_caller_init(s, ep, + return direct_caller_init(s, iface, DIRECT_CALLER_DEFAULT_REQ_BUF_SIZE, DIRECT_CALLER_DEFAULT_RESP_BUF_SIZE); } @@ -94,7 +94,9 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t struct call_req req; + req.interface_id = 0; req.opcode = opcode; + req.encoding = this_context->rpc_caller.encoding; req.caller_id = this_context->caller_id; req.opstatus = 0; req.req_buf = call_param_buf_init_full(this_context->req_buf, @@ -102,7 +104,7 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t req.resp_buf = call_param_buf_init_empty(this_context->resp_buf, this_context->resp_buf_size); - status = call_ep_receive(this_context->call_ep, &req); + status = rpc_interface_receive(this_context->rpc_interface, &req); *resp_buf = this_context->resp_buf; *resp_len = call_req_get_resp_buf(&req)->data_len; diff --git a/components/rpc/direct/direct_caller.h b/components/rpc/direct/direct_caller.h index 0f51845e1..fe5ac087f 100644 --- a/components/rpc/direct/direct_caller.h +++ b/components/rpc/direct/direct_caller.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -16,7 +16,7 @@ extern "C" { #endif -struct call_ep; +struct rpc_interface; /** An rpc_caller that calls methods associated with a specific endpoint * directly. Used when the caller and endpoint are running in the same @@ -25,7 +25,7 @@ struct call_ep; struct direct_caller { struct rpc_caller rpc_caller; - struct call_ep *call_ep; + struct rpc_interface *rpc_interface; uint32_t caller_id; bool is_call_transaction_in_progess; size_t req_len; @@ -35,10 +35,10 @@ struct direct_caller uint8_t *resp_buf; }; -struct rpc_caller *direct_caller_init(struct direct_caller *s, struct call_ep *ep, +struct rpc_caller *direct_caller_init(struct direct_caller *s, struct rpc_interface *iface, size_t req_buf_size, size_t resp_buf_size); -struct rpc_caller *direct_caller_init_default(struct direct_caller *s, struct call_ep *ep); +struct rpc_caller *direct_caller_init_default(struct direct_caller *s, struct rpc_interface *iface); void direct_caller_deinit(struct direct_caller *s); diff --git a/components/rpc/dummy/dummy_caller.c b/components/rpc/dummy/dummy_caller.c index 6d40b8009..f55b41898 100644 --- a/components/rpc/dummy/dummy_caller.c +++ b/components/rpc/dummy/dummy_caller.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -18,7 +18,7 @@ struct rpc_caller *dummy_caller_init(struct dummy_caller *s, { struct rpc_caller *base = &s->rpc_caller; - base->context = s; + rpc_caller_init(base, s); base->call_begin = call_begin; base->call_invoke = call_invoke; base->call_end = call_end; diff --git a/components/rpc/dummy/dummy_caller.h b/components/rpc/dummy/dummy_caller.h index 215d29306..27fe68a72 100644 --- a/components/rpc/dummy/dummy_caller.h +++ b/components/rpc/dummy/dummy_caller.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ diff --git a/components/rpc/ffarpc/caller/linux/ffarpc_caller.c b/components/rpc/ffarpc/caller/linux/ffarpc_caller.c index 70d6ca30b..ac628a951 100644 --- a/components/rpc/ffarpc/caller/linux/ffarpc_caller.c +++ b/components/rpc/ffarpc/caller/linux/ffarpc_caller.c @@ -21,7 +21,7 @@ static rpc_call_handle call_begin(void *context, uint8_t **req_buf, size_t req_len); static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t opcode, - int *opstatus, uint8_t **resp_buf, size_t *resp_len); + int *opstatus, uint8_t **resp_buf, size_t *resp_len); static void call_end(void *context, rpc_call_handle handle); static int kernel_write_req_buf(struct ffarpc_caller *s); @@ -35,14 +35,15 @@ struct rpc_caller *ffarpc_caller_init(struct ffarpc_caller *s, const char *devic { struct rpc_caller *base = &s->rpc_caller; - base->context = s; + rpc_caller_init(base, s); base->call_begin = call_begin; base->call_invoke = call_invoke; base->call_end = call_end; s->device_path = device_path; s->fd = -1; - s->call_ep_id = 0; + s->dest_partition_id = 0; + s->dest_iface_id = 0; s->shared_mem_handle = 0; s->shared_mem_required_size = DEFAULT_SHMEM_BUF_SIZE; s->req_buf = NULL; @@ -93,12 +94,12 @@ size_t ffarpc_caller_discover(const struct ffarpc_caller *s, const struct uuid_c } } - return discover_count; + return discover_count; } -int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id) +int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t dest_partition_id, uint16_t dest_iface_id) { - int ioctl_status = -1; + int ioctl_status = -1; if (s->device_path) { @@ -110,7 +111,8 @@ int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id) if (ioctl_status == 0) { /* Session successfully opened */ - s->call_ep_id = call_ep_id; + s->dest_partition_id = dest_partition_id; + s->dest_iface_id = dest_iface_id; ioctl_status = share_mem_with_partition(s); } @@ -122,23 +124,23 @@ int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id) } } - return ioctl_status; + return ioctl_status; } int ffarpc_caller_close(struct ffarpc_caller *s) { - int ioctl_status = -1; + int ioctl_status = -1; - if (s->fd >= 0) { + if (s->fd >= 0) { - unshare_mem_with_partition(s); - ioctl_status = ioctl(s->fd, FFA_IOC_SHM_DEINIT); - close(s->fd); - s->fd = -1; - s->call_ep_id = 0; - } + unshare_mem_with_partition(s); + ioctl_status = ioctl(s->fd, FFA_IOC_SHM_DEINIT); + close(s->fd); + s->fd = -1; + s->dest_partition_id = 0; + } - return ioctl_status; + return ioctl_status; } static rpc_call_handle call_begin(void *context, uint8_t **req_buf, size_t req_len) @@ -146,96 +148,104 @@ static rpc_call_handle call_begin(void *context, uint8_t **req_buf, size_t req_l rpc_call_handle handle = NULL; struct ffarpc_caller *s = (struct ffarpc_caller*)context; - if (!s->is_call_transaction_in_progess) { + if (!s->is_call_transaction_in_progess) { - s->is_call_transaction_in_progess = true; - handle = s; + s->is_call_transaction_in_progess = true; + handle = s; - if (req_len > 0) { + if (req_len > 0) { - s->req_buf = malloc(req_len); + s->req_buf = malloc(req_len); - if (s->req_buf) { + if (s->req_buf) { - *req_buf = s->req_buf; - s->req_len = req_len; - } - else { - /* Failed to allocate req buffer */ - handle = NULL; - s->is_call_transaction_in_progess = false; - } - } - else { + *req_buf = s->req_buf; + s->req_len = req_len; + } + else { + /* Failed to allocate req buffer */ + handle = NULL; + s->is_call_transaction_in_progess = false; + } + } + else { - *req_buf = NULL; - s->req_buf = NULL; - s->req_len = req_len; - } - } + *req_buf = NULL; + s->req_buf = NULL; + s->req_len = req_len; + } + } - return handle; + return handle; } static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t opcode, - int *opstatus, uint8_t **resp_buf, size_t *resp_len) + int *opstatus, uint8_t **resp_buf, size_t *resp_len) { - rpc_status_t rpc_status = TS_RPC_ERROR_INTERNAL; + rpc_status_t rpc_status = TS_RPC_ERROR_INTERNAL; struct ffarpc_caller *s = (struct ffarpc_caller*)context; - if ((handle == s) && s->is_call_transaction_in_progess) { - int kernel_op_status = 0; - - if (s->req_len > 0) { - kernel_op_status = kernel_write_req_buf(s); - } - - if (kernel_op_status == 0) { - /* Make direct call to send the request */ - struct ffa_ioctl_msg_args direct_msg; - memset(&direct_msg, 0, sizeof(direct_msg)); - - direct_msg.dst_id = s->call_ep_id; - direct_msg.args[FFA_CALL_ARGS_OPCODE] = (uint64_t)opcode; - direct_msg.args[FFA_CALL_ARGS_REQ_DATA_LEN] = (uint64_t)s->req_len; - - kernel_op_status = ioctl(s->fd, FFA_IOC_MSG_SEND, &direct_msg); - - if (kernel_op_status == 0) { - /* Send completed normally - ffa return args in msg_args struct */ - s->resp_len = (size_t)direct_msg.args[FFA_CALL_ARGS_RESP_DATA_LEN]; - rpc_status = (int)direct_msg.args[FFA_CALL_ARGS_RESP_RPC_STATUS]; - *opstatus = (int)direct_msg.args[FFA_CALL_ARGS_RESP_OP_STATUS]; - - if (s->resp_len > 0) { - s->resp_buf = malloc(s->resp_len); - - if (s->resp_buf) { - kernel_op_status = kernel_read_resp_buf(s); - - if (kernel_op_status != 0) { - /* Failed to read response buffer */ - rpc_status = TS_RPC_ERROR_INTERNAL; - } - } - else { - /* Failed to allocate response buffer */ - s->resp_len = 0; - rpc_status = TS_RPC_ERROR_INTERNAL; - } - } - else { + if ((handle == s) && s->is_call_transaction_in_progess) { + int kernel_op_status = 0; + + if (s->req_len > 0) { + kernel_op_status = kernel_write_req_buf(s); + } + + if (kernel_op_status == 0) { + /* Make direct call to send the request */ + struct ffa_ioctl_msg_args direct_msg; + memset(&direct_msg, 0, sizeof(direct_msg)); + + direct_msg.dst_id = s->dest_partition_id; + direct_msg.args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = + FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(s->dest_partition_id, opcode); + direct_msg.args[FFA_CALL_ARGS_REQ_DATA_LEN] = (uint64_t)s->req_len; + direct_msg.args[FFA_CALL_ARGS_ENCODING] = s->rpc_caller.encoding; + + /* Initialise the caller ID. Depending on the call path, this may + * be overridden by a higher privilege execution level, based on its + * perspective of the caller identity. + */ + direct_msg.args[FFA_CALL_ARGS_CALLER_ID] = 0; + + kernel_op_status = ioctl(s->fd, FFA_IOC_MSG_SEND, &direct_msg); + + if (kernel_op_status == 0) { + /* Send completed normally - ffa return args in msg_args struct */ + s->resp_len = (size_t)direct_msg.args[FFA_CALL_ARGS_RESP_DATA_LEN]; + rpc_status = (int)direct_msg.args[FFA_CALL_ARGS_RESP_RPC_STATUS]; + *opstatus = (int)direct_msg.args[FFA_CALL_ARGS_RESP_OP_STATUS]; + + if (s->resp_len > 0) { + s->resp_buf = malloc(s->resp_len); + + if (s->resp_buf) { + kernel_op_status = kernel_read_resp_buf(s); + + if (kernel_op_status != 0) { + /* Failed to read response buffer */ + rpc_status = TS_RPC_ERROR_INTERNAL; + } + } + else { + /* Failed to allocate response buffer */ + s->resp_len = 0; + rpc_status = TS_RPC_ERROR_INTERNAL; + } + } + else { /* No response parameters */ - s->resp_buf = NULL; - } + s->resp_buf = NULL; + } - *resp_len = s->resp_len; - *resp_buf = s->resp_buf; - } - } + *resp_len = s->resp_len; + *resp_buf = s->resp_buf; + } + } } - return rpc_status; + return rpc_status; } static void call_end(void *context, rpc_call_handle handle) @@ -244,73 +254,75 @@ static void call_end(void *context, rpc_call_handle handle) if ((handle == s) && s->is_call_transaction_in_progess) { - /* Call transaction complete so free resource */ - free(s->req_buf); - s->req_buf = NULL; - s->req_len = 0; + /* Call transaction complete so free resource */ + free(s->req_buf); + s->req_buf = NULL; + s->req_len = 0; - free(s->resp_buf); - s->resp_buf = NULL; - s->resp_len = 0; + free(s->resp_buf); + s->resp_buf = NULL; + s->resp_len = 0; - s->is_call_transaction_in_progess = false; - } + s->is_call_transaction_in_progess = false; + } } static int kernel_write_req_buf(struct ffarpc_caller *s) { - int ioctl_status; - struct ffa_ioctl_buf_desc req_descr; + int ioctl_status; + struct ffa_ioctl_buf_desc req_descr; - req_descr.buf_ptr = (uintptr_t)s->req_buf; - req_descr.buf_len = s->req_len; - ioctl_status = ioctl(s->fd, FFA_IOC_SHM_WRITE, &req_descr); + req_descr.buf_ptr = (uintptr_t)s->req_buf; + req_descr.buf_len = s->req_len; + ioctl_status = ioctl(s->fd, FFA_IOC_SHM_WRITE, &req_descr); - return ioctl_status; + return ioctl_status; } static int kernel_read_resp_buf(struct ffarpc_caller *s) { - int ioctl_status; - struct ffa_ioctl_buf_desc resp_descr; + int ioctl_status; + struct ffa_ioctl_buf_desc resp_descr; - resp_descr.buf_ptr = (uintptr_t)s->resp_buf; - resp_descr.buf_len = s->resp_len; - ioctl_status = ioctl(s->fd, FFA_IOC_SHM_READ, &resp_descr); + resp_descr.buf_ptr = (uintptr_t)s->resp_buf; + resp_descr.buf_len = s->resp_len; + ioctl_status = ioctl(s->fd, FFA_IOC_SHM_READ, &resp_descr); - return ioctl_status; + return ioctl_status; } static int share_mem_with_partition(struct ffarpc_caller *s) { - int ioctl_status; - struct ffa_ioctl_msg_args direct_msg; - memset(&direct_msg, 0, sizeof(direct_msg)); + int ioctl_status; + struct ffa_ioctl_msg_args direct_msg; + memset(&direct_msg, 0, sizeof(direct_msg)); - direct_msg.dst_id = s->call_ep_id; - direct_msg.args[FFA_CALL_ARGS_OPCODE] = (uint64_t)FFA_CALL_OPCODE_SHARE_BUF; - direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)s->shared_mem_handle; - direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(s->shared_mem_handle >> 32); - direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_SIZE] = (uint64_t)s->shared_mem_required_size; + direct_msg.dst_id = s->dest_partition_id; + direct_msg.args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = + FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_SHARE_BUF); + direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)s->shared_mem_handle; + direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(s->shared_mem_handle >> 32); + direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_SIZE] = (uint64_t)s->shared_mem_required_size; - ioctl_status = ioctl(s->fd, FFA_IOC_MSG_SEND, &direct_msg); + ioctl_status = ioctl(s->fd, FFA_IOC_MSG_SEND, &direct_msg); - return ioctl_status; + return ioctl_status; } static int unshare_mem_with_partition(struct ffarpc_caller *s) { - int ioctl_status; - struct ffa_ioctl_msg_args direct_msg; - memset(&direct_msg, 0, sizeof(direct_msg)); + int ioctl_status; + struct ffa_ioctl_msg_args direct_msg; + memset(&direct_msg, 0, sizeof(direct_msg)); - direct_msg.dst_id = s->call_ep_id; - direct_msg.args[FFA_CALL_ARGS_OPCODE] = (uint64_t)FFA_CALL_OPCODE_UNSHARE_BUF; - direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)s->shared_mem_handle; - direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(s->shared_mem_handle >> 32); + direct_msg.dst_id = s->dest_partition_id; + direct_msg.args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = + FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_UNSHARE_BUF); + direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)s->shared_mem_handle; + direct_msg.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(s->shared_mem_handle >> 32); - ioctl_status = ioctl(s->fd, FFA_IOC_MSG_SEND, &direct_msg); + ioctl_status = ioctl(s->fd, FFA_IOC_MSG_SEND, &direct_msg); - return ioctl_status; + return ioctl_status; } diff --git a/components/rpc/ffarpc/caller/linux/ffarpc_caller.h b/components/rpc/ffarpc/caller/linux/ffarpc_caller.h index 7e846ba92..c81382e6a 100644 --- a/components/rpc/ffarpc/caller/linux/ffarpc_caller.h +++ b/components/rpc/ffarpc/caller/linux/ffarpc_caller.h @@ -24,7 +24,8 @@ struct ffarpc_caller { struct rpc_caller rpc_caller; int fd; const char *device_path; - uint16_t call_ep_id; + uint16_t dest_partition_id; + uint16_t dest_iface_id; uint64_t shared_mem_handle; size_t shared_mem_required_size; uint8_t *req_buf; @@ -38,7 +39,7 @@ struct rpc_caller *ffarpc_caller_init(struct ffarpc_caller *s, const char *devic void ffarpc_caller_deinit(struct ffarpc_caller *s); size_t ffarpc_caller_discover(const struct ffarpc_caller *s, const struct uuid_canonical *uuid, uint16_t *partition_ids, size_t discover_limit); -int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id); +int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t dest_partition_id, uint16_t dest_iface_id); int ffarpc_caller_close(struct ffarpc_caller *s); #ifdef __cplusplus diff --git a/components/rpc/ffarpc/caller/sp/ffarpc_caller.c b/components/rpc/ffarpc/caller/sp/ffarpc_caller.c index 9d98512af..07a2dcaab 100644 --- a/components/rpc/ffarpc/caller/sp/ffarpc_caller.c +++ b/components/rpc/ffarpc/caller/sp/ffarpc_caller.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -13,6 +13,7 @@ #include <sp_rxtx.h> #include <trace.h> #include <stdbool.h> +#include <stdint.h> #include <stdio.h> uint8_t shared_buffer[4096] __aligned(4096); @@ -33,6 +34,11 @@ static rpc_call_handle call_begin(void *context, uint8_t **req_buf, size_t req_l goto out; } + if (req_len > UINT32_MAX) { + EMSG("call_begin(): req_len too big"); + goto out; + } + this_context->is_call_transaction_in_progess = true; handle = this_context; @@ -50,7 +56,7 @@ out: } static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t opcode, - int *opstatus, uint8_t **resp_buf, size_t *resp_len) + int *opstatus, uint8_t **resp_buf, size_t *resp_len) { struct ffarpc_caller *this_context = (struct ffarpc_caller *)context; ffa_result res = FFA_OK; @@ -59,7 +65,7 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t rpc_status_t status = TS_RPC_ERROR_INTERNAL; if (handle != this_context || opstatus == NULL || - resp_buf == NULL || resp_len == NULL) { + resp_buf == NULL || resp_len == NULL) { EMSG("call_invoke(): invalid arguments"); status = TS_RPC_ERROR_INVALID_PARAMETER; goto out; @@ -71,16 +77,24 @@ static rpc_status_t call_invoke(void *context, rpc_call_handle handle, uint32_t goto out; } - req.destination_id = this_context->call_ep_id; + req.destination_id = this_context->dest_partition_id; req.source_id = own_id; - req.args[FFA_CALL_ARGS_OPCODE] = opcode; + req.args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = + FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(this_context->dest_partition_id, opcode); //TODO: downcast problem? req.args[FFA_CALL_ARGS_REQ_DATA_LEN] = (uint32_t)this_context->req_len; + req.args[FFA_CALL_ARGS_ENCODING] = this_context->rpc_caller.encoding; + + /* Initialise the caller ID. Depending on the call path, this may + * be overridden by a higher privilege execution level, based on its + * perspective of the caller identity. + */ + req.args[FFA_CALL_ARGS_CALLER_ID] = 0; res = ffa_msg_send_direct_req(req.source_id, req.destination_id, - req.args[0], req.args[1], - req.args[2], req.args[3], - req.args[4], &resp); + req.args[0], req.args[1], + req.args[2], req.args[3], + req.args[4], &resp); if (res != FFA_OK) { EMSG("ffa_msg_send_direct_req(): error %"PRId32, res); @@ -123,12 +137,13 @@ struct rpc_caller *ffarpc_caller_init(struct ffarpc_caller *s) { struct rpc_caller *base = &s->rpc_caller; - base->context = s; + rpc_caller_init(base, s); base->call_begin = call_begin; base->call_invoke = call_invoke; base->call_end = call_end; - s->call_ep_id = 0; + s->dest_partition_id = 0; + s->dest_iface_id = 0; s->shared_mem_handle = 0; s->shared_mem_required_size = sizeof(shared_buffer); s->req_buf = NULL; @@ -191,7 +206,7 @@ out: return sp_cnt; } -int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id) +int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t dest_partition_id, uint16_t dest_iface_id) { //TODO: revise return type, error handling ffa_result ffa_res; @@ -212,7 +227,7 @@ int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id) acc_desc.data_access = sp_data_access_read_write; acc_desc.instruction_access = sp_instruction_access_not_executable; - acc_desc.receiver_id = call_ep_id; + acc_desc.receiver_id = dest_partition_id; region.address = shared_buffer; region.page_count = 1; @@ -224,23 +239,25 @@ int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id) } req.source_id = own_id; - req.destination_id = call_ep_id; - req.args[FFA_CALL_ARGS_OPCODE] = FFA_CALL_OPCODE_SHARE_BUF; - req.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)(handle & 0xffff); + req.destination_id = dest_partition_id; + req.args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = + FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_SHARE_BUF); + req.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = (uint32_t)(handle & UINT32_MAX); req.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = (uint32_t)(handle >> 32); //TODO: downcast req.args[FFA_CALL_ARGS_SHARE_MEM_SIZE] = (uint32_t)(s->shared_mem_required_size); ffa_res = ffa_msg_send_direct_req(req.source_id, req.destination_id, - req.args[0], req.args[1], - req.args[2], req.args[3], - req.args[4], &resp); + req.args[0], req.args[1], + req.args[2], req.args[3], + req.args[4], &resp); if (ffa_res != FFA_OK) { EMSG("ffa_msg_send_direct_req(): error %"PRId32, ffa_res); return -1; } - s->call_ep_id = call_ep_id; + s->dest_partition_id = dest_partition_id; + s->dest_iface_id = dest_iface_id; s->shared_mem_handle = handle; return 0; @@ -260,15 +277,16 @@ int ffarpc_caller_close(struct ffarpc_caller *s) handle_hi = (uint32_t)(s->shared_mem_handle >> 32); req.source_id = own_id; - req.destination_id = s->call_ep_id; - req.args[FFA_CALL_ARGS_OPCODE] = FFA_CALL_OPCODE_UNSHARE_BUF; + req.destination_id = s->dest_partition_id; + req.args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = + FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(FFA_CALL_MGMT_IFACE_ID, FFA_CALL_OPCODE_UNSHARE_BUF); req.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_LSW] = handle_lo; req.args[FFA_CALL_ARGS_SHARE_MEM_HANDLE_MSW] = handle_hi; ffa_res = ffa_msg_send_direct_req(req.source_id, req.destination_id, - req.args[0], req.args[1], - req.args[2], req.args[3], - req.args[4], &resp); + req.args[0], req.args[1], + req.args[2], req.args[3], + req.args[4], &resp); if (ffa_res != FFA_OK) { EMSG("ffa_msg_send_direct_req(): error %"PRId32, ffa_res); return -1; @@ -280,7 +298,8 @@ int ffarpc_caller_close(struct ffarpc_caller *s) return -1; } - s->call_ep_id = 0; + s->dest_partition_id = 0; + s->dest_iface_id = 0; s->shared_mem_handle = 0; return 0; diff --git a/components/rpc/ffarpc/caller/sp/ffarpc_caller.h b/components/rpc/ffarpc/caller/sp/ffarpc_caller.h index ba810e9f3..a6c2fba53 100644 --- a/components/rpc/ffarpc/caller/sp/ffarpc_caller.h +++ b/components/rpc/ffarpc/caller/sp/ffarpc_caller.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -16,7 +16,8 @@ extern "C" { struct ffarpc_caller { struct rpc_caller rpc_caller; - uint16_t call_ep_id; + uint16_t dest_partition_id; + uint16_t dest_iface_id; uint64_t shared_mem_handle; size_t shared_mem_required_size; uint8_t *req_buf; @@ -29,7 +30,7 @@ struct ffarpc_caller { struct rpc_caller *ffarpc_caller_init(struct ffarpc_caller *s); void ffarpc_caller_deinit(struct ffarpc_caller *s); uint32_t ffarpc_caller_discover(const uint8_t *uuid, uint16_t *sp_ids, uint32_t sp_max_cnt); -int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t call_ep_id); +int ffarpc_caller_open(struct ffarpc_caller *s, uint16_t dest_partition_id, uint16_t dest_iface_id); int ffarpc_caller_close(struct ffarpc_caller *s); #ifdef __cplusplus diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_args.h b/components/rpc/ffarpc/endpoint/ffarpc_call_args.h index 402e4f5d3..fbe7320be 100644 --- a/components/rpc/ffarpc/endpoint/ffarpc_call_args.h +++ b/components/rpc/ffarpc/endpoint/ffarpc_call_args.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -17,11 +17,21 @@ extern "C" { * normal world RPC caller and the RPC listener in the SP. */ +/* Macros for parameters carried in a single register */ +#define FFA_CALL_ARGS_COMBINE_IFACE_ID_OPCODE(i, o) \ + (((i) << 16) | ((o) & 0xffff)) +#define FFA_CALL_ARGS_EXTRACT_IFACE(reg) \ + ((reg) >> 16) +#define FFA_CALL_ARGS_EXTRACT_OPCODE(reg) \ + ((reg) & 0xffff) + /* Common req & resp arg offests into msg_args structure */ -#define FFA_CALL_ARGS_OPCODE (0) +#define FFA_CALL_ARGS_IFACE_ID_OPCODE (0) /* Req arg offsets */ #define FFA_CALL_ARGS_REQ_DATA_LEN (1) +#define FFA_CALL_ARGS_CALLER_ID (2) +#define FFA_CALL_ARGS_ENCODING (3) /* Resp arg offsets */ #define FFA_CALL_ARGS_RESP_DATA_LEN (1) diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c index bb40cf37e..1139e73bc 100644 --- a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c +++ b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -16,16 +16,16 @@ /* TODO: remove this when own ID will be available in libsp */ extern uint16_t own_id; -static void set_resp_args(uint32_t *resp_args, uint32_t opcode, uint32_t data_len, +static void set_resp_args(uint32_t *resp_args, uint32_t ifaceid_opcode, uint32_t data_len, rpc_status_t rpc_status, uint32_t opstatus) { - resp_args[FFA_CALL_ARGS_OPCODE] = opcode; + resp_args[FFA_CALL_ARGS_IFACE_ID_OPCODE] = ifaceid_opcode; resp_args[FFA_CALL_ARGS_RESP_DATA_LEN] = data_len; resp_args[FFA_CALL_ARGS_RESP_RPC_STATUS] = rpc_status; resp_args[FFA_CALL_ARGS_RESP_OP_STATUS] = opstatus; } -static void set_mgmt_resp_args(uint32_t *resp_args, uint32_t opcode, +static void set_mgmt_resp_args(uint32_t *resp_args, uint32_t ifaceid_opcode, rpc_status_t rpc_status) { /* @@ -33,7 +33,7 @@ static void set_mgmt_resp_args(uint32_t *resp_args, uint32_t opcode, * rather than from a higher layer service. These responses are not * associated with a shared buffer for any additional message payload. */ - set_resp_args(resp_args, opcode, 0, rpc_status, 0); + set_resp_args(resp_args, ifaceid_opcode, 0, rpc_status, 0); } static void init_shmem_buf(struct ffa_call_ep *call_ep, uint16_t source_id, @@ -68,7 +68,7 @@ static void init_shmem_buf(struct ffa_call_ep *call_ep, uint16_t source_id, EMSG("memory retrieve error: %d", sp_res); } - set_mgmt_resp_args(resp_args, req_args[FFA_CALL_ARGS_OPCODE], rpc_status); + set_mgmt_resp_args(resp_args, req_args[FFA_CALL_ARGS_IFACE_ID_OPCODE], rpc_status); } static void deinit_shmem_buf(struct ffa_call_ep *call_ep, const uint32_t *req_args, @@ -94,7 +94,7 @@ static void deinit_shmem_buf(struct ffa_call_ep *call_ep, const uint32_t *req_ar EMSG("memory relinquish error: %d", sp_res); } - set_mgmt_resp_args(resp_args, req_args[FFA_CALL_ARGS_OPCODE], rpc_status); + set_mgmt_resp_args(resp_args, req_args[FFA_CALL_ARGS_IFACE_ID_OPCODE], rpc_status); } static void handle_service_msg(struct ffa_call_ep *call_ep, uint16_t source_id, @@ -103,8 +103,12 @@ static void handle_service_msg(struct ffa_call_ep *call_ep, uint16_t source_id, rpc_status_t rpc_status; struct call_req call_req; + uint32_t ifaceid_opcode = req_args[FFA_CALL_ARGS_IFACE_ID_OPCODE]; + call_req.caller_id = source_id; - call_req.opcode = req_args[FFA_CALL_ARGS_OPCODE]; + call_req.interface_id = FFA_CALL_ARGS_EXTRACT_IFACE(ifaceid_opcode); + call_req.opcode = FFA_CALL_ARGS_EXTRACT_OPCODE(ifaceid_opcode); + call_req.encoding = req_args[FFA_CALL_ARGS_ENCODING]; call_req.req_buf.data = call_ep->shmem_buf; call_req.req_buf.data_len = req_args[FFA_CALL_ARGS_REQ_DATA_LEN]; @@ -114,10 +118,10 @@ static void handle_service_msg(struct ffa_call_ep *call_ep, uint16_t source_id, call_req.resp_buf.data_len = 0; call_req.resp_buf.size = call_ep->shmem_buf_size; - rpc_status = call_ep_receive(call_ep->call_ep, &call_req); + rpc_status = rpc_interface_receive(call_ep->iface, &call_req); set_resp_args(resp_args, - call_req.opcode, + ifaceid_opcode, call_req.resp_buf.data_len, rpc_status, call_req.opstatus); @@ -126,7 +130,8 @@ static void handle_service_msg(struct ffa_call_ep *call_ep, uint16_t source_id, static void handle_mgmt_msg(struct ffa_call_ep *call_ep, uint16_t source_id, const uint32_t *req_args, uint32_t *resp_args) { - uint32_t opcode = req_args[FFA_CALL_ARGS_OPCODE]; + uint32_t ifaceid_opcode = req_args[FFA_CALL_ARGS_IFACE_ID_OPCODE]; + uint32_t opcode = FFA_CALL_ARGS_EXTRACT_OPCODE(ifaceid_opcode); /* * TODO: shouldn't this be used to keep track of multiple @@ -142,14 +147,14 @@ static void handle_mgmt_msg(struct ffa_call_ep *call_ep, uint16_t source_id, deinit_shmem_buf(call_ep, req_args, resp_args); break; default: - set_mgmt_resp_args(resp_args, opcode, TS_RPC_ERROR_INVALID_OPCODE); + set_mgmt_resp_args(resp_args, ifaceid_opcode, TS_RPC_ERROR_INVALID_OPCODE); break; } } -void ffa_call_ep_init(struct ffa_call_ep *ffa_call_ep, struct call_ep *call_ep) +void ffa_call_ep_init(struct ffa_call_ep *ffa_call_ep, struct rpc_interface *iface) { - ffa_call_ep->call_ep = call_ep; + ffa_call_ep->iface = iface; ffa_call_ep->shmem_buf_handle = 0; ffa_call_ep->shmem_buf_size = 0; ffa_call_ep->shmem_buf = NULL; @@ -163,9 +168,9 @@ void ffa_call_ep_receive(struct ffa_call_ep *call_ep, uint32_t *resp_args = resp_msg->args; uint16_t source_id = req_msg->source_id; - uint32_t opcode = req_args[FFA_CALL_ARGS_OPCODE]; + uint32_t ifaceid_opcode = req_args[FFA_CALL_ARGS_IFACE_ID_OPCODE]; - if (FFA_CALL_OPCODE_IS_MGMT(opcode)) { + if (FFA_CALL_ARGS_EXTRACT_IFACE(ifaceid_opcode) == FFA_CALL_MGMT_IFACE_ID) { /* It's an RPC layer management request */ handle_mgmt_msg(call_ep, source_id, req_args, resp_args); } else { @@ -177,6 +182,6 @@ void ffa_call_ep_receive(struct ffa_call_ep *call_ep, if (call_ep->shmem_buf) handle_service_msg(call_ep, source_id, req_args, resp_args); else - set_mgmt_resp_args(resp_args, opcode, TS_RPC_ERROR_NOT_READY); + set_mgmt_resp_args(resp_args, ifaceid_opcode, TS_RPC_ERROR_NOT_READY); } } diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.h b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.h index b4bcdd6f2..cc67f6ed9 100644 --- a/components/rpc/ffarpc/endpoint/ffarpc_call_ep.h +++ b/components/rpc/ffarpc/endpoint/ffarpc_call_ep.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -8,7 +8,7 @@ #define FFA_CALL_EP_H #include <ffa_api.h> -#include <components/rpc/common/endpoint/call_ep.h> +#include <components/rpc/common/endpoint/rpc_interface.h> #include <stddef.h> #include <stdint.h> @@ -17,13 +17,13 @@ extern "C" { #endif struct ffa_call_ep { - struct call_ep *call_ep; + struct rpc_interface *iface; unsigned long shmem_buf_handle; volatile uint8_t *shmem_buf; size_t shmem_buf_size; }; -void ffa_call_ep_init(struct ffa_call_ep *ffa_call_ep, struct call_ep *call_ep); +void ffa_call_ep_init(struct ffa_call_ep *ffa_call_ep, struct rpc_interface *iface); void ffa_call_ep_receive(struct ffa_call_ep *call_ep, const struct ffa_direct_msg *req_msg, struct ffa_direct_msg *resp_msg); diff --git a/components/rpc/ffarpc/endpoint/ffarpc_call_ops.h b/components/rpc/ffarpc/endpoint/ffarpc_call_ops.h index 3f14fc7d3..de22678e6 100644 --- a/components/rpc/ffarpc/endpoint/ffarpc_call_ops.h +++ b/components/rpc/ffarpc/endpoint/ffarpc_call_ops.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -12,13 +12,15 @@ extern "C" { #endif /* Common opcodes used by the FFA based RPC layer for management operations */ -#define FFA_CALL_OPCODE_BASE (0x10) -#define FFA_CALL_OPCODE_SHARE_BUF (FFA_CALL_OPCODE_BASE + 0) -#define FFA_CALL_OPCODE_UNSHARE_BUF (FFA_CALL_OPCODE_BASE + 1) -#define FFA_CALL_OPCODE_LIMIT (FFA_CALL_OPCODE_BASE + 2) +enum +{ + FFA_CALL_OPCODE_SHARE_BUF = 0, + FFA_CALL_OPCODE_UNSHARE_BUF = 1, + FFA_CALL_OPCODE_LIMIT +}; -#define FFA_CALL_OPCODE_IS_MGMT(opcode) \ - ((opcode >= FFA_CALL_OPCODE_BASE) && (opcode < FFA_CALL_OPCODE_LIMIT)) +/* Interface ID for FFA management interface */ +#define FFA_CALL_MGMT_IFACE_ID (0x1000) #ifdef __cplusplus } |