Support in QNX MmRpc/MmServiceMgr to identify deleted instance during cleanup
[ipc/ipcdev.git] / qnx / src / ipc3x_dev / ti / syslink / inc / ti / ipc / rpmsg_rpc.h
1 /*
2  * Remote Processor Procedure Call Driver
3  *
4  * Copyright (c) 2012-2014 Texas Instruments Incorporated.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  *   notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above copyright
14  *   notice, this list of conditions and the following disclaimer in
15  *   the documentation and/or other materials provided with the
16  *   distribution.
17  * * Neither the name Texas Instruments nor the names of its
18  *   contributors may be used to endorse or promote products derived
19  *   from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
34 #ifndef _RPMSG_RPC_H_
35 #define _RPMSG_RPC_H_
37 #include <stdint.h>
38 #include <sys/types.h>
39 #include <ioctl.h>
40 #include <stddef.h>
42 #define __packed __attribute__ ((packed))
44 /**
45  * struct rppc_buf_fds - rppc buffer registration/deregistration
46  * @num: number of file descriptors
47  * @fds: pointer to the array holding the file descriptors
48  */
49 struct rppc_buf_fds {
50         uint32_t num;
51         int32_t *fds;
52 };
54 /*
55  * ioctl definitions
56  */
57 #define RPPC_IOC_MAGIC    'r'
58 #define RPPC_IOC_CREATE   _IOWR(RPPC_IOC_MAGIC, 1, struct rppc_create_instance)
59 #define RPPC_IOC_BUFREGISTER    _IOW(RPPC_IOC_MAGIC, 2, struct rppc_buf_fds)
60 #define RPPC_IOC_BUFUNREGISTER  _IOW(RPPC_IOC_MAGIC, 3, struct rppc_buf_fds)
61 #define RPPC_IOC_MAXNR      (4)
63 #define RPPC_MAX_PARAMETERS     (10)
64 #define RPPC_MAX_TRANSLATIONS   (1024)
65 #define RPPC_MAX_INST_NAMELEN   (48)
67 /**
68  * enum rppc_param_type - RPC function parameter type
69  * @RPPC_PARAM_TYPE_UNKNOWN: unrecognized parameter
70  * @RPPC_PARAM_TYPE_ATOMIC: an atomic data type, 1 byte to architecture limit
71  *                          sized bytes
72  * @RPPC_PARAM_TYPE_PTR: a pointer to shared memory. The fd field in the
73  *                       structures rppc_param and rppc_param_translation must
74  *                       contain the file descriptor of the associated dma_buf
75  * @RPPC_PARAM_TYPE_STRUCT: (unsupported) a structure type. Will be architecture
76  *                          width aligned in memory
77  *
78  * These enum values are used to identify the parameter type for every
79  * parameter argument of the remote function.
80  */
81 enum rppc_param_type {
82         RPPC_PARAM_TYPE_UNKNOWN = 0,
83         RPPC_PARAM_TYPE_ATOMIC,
84         RPPC_PARAM_TYPE_PTR,
85         RPPC_PARAM_TYPE_STRUCT,
86 };
88 /**
89  * struct rppc_param_translation - pointer translation helper structure
90  * @index: index of the parameter where the translation needs to be done in.
91  *         used for computing the primary offset and mapping into kernel
92  *         the page from the buffer referred to in the correspoding parameter
93  * @offset: offset from the primary base pointer to the pointer to translate.
94  *          This is the secondary offset, and used either for mentioning the
95  *          offset from an structure array element base, or within a single
96  *          structure which itself is at an offset in an allocated buffer
97  * @base: the base user virtual address of the pointer to translate (used to
98  *        calculate translated pointer offset)
99  * @fd: dma_buf file descriptor of the allocated buffer pointer within which
100  *      the translated pointer is present
101  */
102 struct rppc_param_translation {
103         uint32_t index;
104         ptrdiff_t offset;
105         size_t base;
106         int32_t fd;
107 };
109 /**
110  * struct rppc_param - descriptor structure for each parameter
111  * @type: type of the parameter, as dictated by enum rppc_param_type
112  * @size: size of the data (for atomic types) or size of the containing
113  *        structure in which translations are performed
114  * @data: either the parameter value itself (for atomic type) or
115  *        the actual user space pointer address to the data (for pointer type)
116  * @base: the base user space pointer address of the original allocated buffer,
117  *        providing a reference if data has the pointer that is at an offset
118  *        from the original pointer
119  * @fd: file descriptor of the exported allocation (will be used to
120  *      import the associated dma_buf within the driver).
121  */
122 struct rppc_param {
123         uint32_t type;
124         size_t size;
125         size_t data;
126         size_t base;
127         int32_t fd;
128 };
130 /**
131  * struct rppc_function - descriptor structure for the remote function
132  * @fxn_id: index of the function to invoke on the opened rppc device
133  * @num_params: number of parameters filled in the params field
134  * @params: array of parameter descriptor structures
135  * @num_translations: number of in-place translations to be performed within
136  *                    the arguments.
137  * @translations: an open array of the translation descriptor structures, whose
138  *                length is given in @num_translations. Used for translating
139  *                the pointers within the function data.
140  *
141  * This is the primary descriptor structure passed down from the userspace,
142  * describing the function, its parameter arguments and the needed translations.
143  */
144 struct rppc_function {
145         uint32_t fxn_id;
146         uint32_t num_params;
147         struct rppc_param params[RPPC_MAX_PARAMETERS];
148         uint32_t num_translations;
149         struct rppc_param_translation translations[0];
150 };
152 /**
153  * struct rppc_function_return - function return status descriptor structure
154  * @fxn_id: index of the function invoked on the opened rppc device
155  * @status: return value of the executed function
156  */
157 struct rppc_function_return {
158         uint32_t fxn_id;
159         uint32_t status;
160 };
162 /*
163  * helper macros for manipulating the function index in the marshalled packet
164  */
165 #define RPPC_DESC_EXEC_SYNC     (0x0100)
166 #define RPPC_DESC_TYPE_MASK     (0x0F00)
168 /*
169  * helper macros for manipulating the function index in the marshalled packet.
170  * The remote functions are offset by one relative to the client
171  * XXX: Remove the relative offset
172  */
173 #define RPPC_SET_FXN_IDX(idx)   (((idx) + 1) | 0x80000000)
174 #define RPPC_FXN_MASK(idx)      (((idx) - 1) & 0x7FFFFFFF)
176 /**
177  * struct rppc_packet - the actual marshalled packet
178  * @desc: type of function execution, currently only synchronous function
179  *        invocations are supported
180  * @msg_id: an incremental message index identifier
181  * @flags: a combination of job id and pool id of the worker threads
182  *         of the server
183  * @fxn_id: id of the function to execute
184  * @result: result of the remotely executed function
185  * @data_size: size of the payload packet
186  * @data: variable payload, containing the marshalled function data.
187  *
188  * This is actually a condensed structure of the Remote Command Messaging
189  * (RCM) structure. The initial fields of the structure are used by the
190  * remote-side server to schedule the execution of the function. The actual
191  * variable payload data starts from the .data field. This marshalled packet
192  * is the payload for a rpmsg message.
193  *
194  * XXX: remove or mask unneeded fields, some fields can be stripped down
195  */
196 struct rppc_packet {
197         uint16_t desc;
198         uint16_t msg_id;
199         uint32_t flags;
200         uint32_t fxn_id;
201         int32_t  result;
202         uint32_t data_size;
203         uint8_t  data[0];
204 } __packed;
207 //#ifdef __KERNEL__
209 #define RPPC_MAX_NUM_FUNCS          (1024)
210 #define RPPC_MAX_CHANNEL_NAMELEN    (64)
211 #define RPPC_MAX_FUNC_NAMELEN       (64)
212 #define RPPC_MAX_NUM_PARAMS         (10)
213 #define RPPC_MAX_INST_NAMELEN       (48)
215 /* Added below definition for use with CREATE ioctl in QNX */
216 struct rppc_create_instance {
217     char name[RPPC_MAX_CHANNEL_NAMELEN];
218     uint32_t  id;  /* id for this instance */
219 };
221 /**
222  * enum rppc_param_direction - direction of the function parameter
223  * @RPPC_PARAMDIR_IN: input argument
224  * @RPPC_PARAMDIR_OUT: output argument
225  * @RPPC_PARAMDIR_BI: an in and out argument
226  * @RPPC_PARAMDIR_MAX: limit value for the direction type
227  *
228  * The parameter direction is described as relative to the function.
229  */
230 enum rppc_param_direction {
231         RPPC_PARAMDIR_IN = 0,
232         RPPC_PARAMDIR_OUT,
233         RPPC_PARAMDIR_BI,
234         RPPC_PARAMDIR_MAX
235 };
237 /**
238  * enum rppc_param_datatype - parameter data type and descriptor flags
239  * @RPPC_PARAM_VOID: parameter is of type 'void'
240  * @RPPC_PARAM_S08: parameter is of type 's8'
241  * @RPPC_PARAM_U08: parameter is of type 'u8'
242  * @RPPC_PARAM_S16: parameter is of type 's16'
243  * @RPPC_PARAM_U16: parameter is of type 'u16'
244  * @RPPC_PARAM_S32: parameter is of type 's32'
245  * @RPPC_PARAM_U32: parameter is of type 'u32'
246  * @RPPC_PARAM_S64: parameter is of type 's64'
247  * @RPPC_PARAM_U64: parameter is of type 'u64'
248  * @RPPC_PARAM_ATOMIC_MAX: limit value for scalar data types
249  * @RPPC_PARAM_MASK: mask field for retrieving the scalar data type
250  * @RPPC_PARAM_PTR: flag to indicate the data type is a pointer
251  * @RPPC_PARAM_MAX: max limit value used as a marker
252  *
253  * This enum is used to describe the data type for the parameters.
254  * A pointer of a data type is reflected by using an additional bit
255  * mask field.
256  */
257 enum rppc_param_datatype {
258         RPPC_PARAM_VOID = 0,
259         RPPC_PARAM_S08,
260         RPPC_PARAM_U08,
261         RPPC_PARAM_S16,
262         RPPC_PARAM_U16,
263         RPPC_PARAM_S32,
264         RPPC_PARAM_U32,
265         RPPC_PARAM_S64,
266         RPPC_PARAM_U64,
267         RPPC_PARAM_ATOMIC_MAX,
269         RPPC_PARAM_MASK = 0x7F,
270         RPPC_PARAM_PTR = 0x80,
272         RPPC_PARAM_MAX
273 };
275 /*
276  * helper macros to deal with parameter types
277  */
278 #define RPPC_PTR_TYPE(type)     ((type) | RPPC_PARAM_PTR)
279 #define RPPC_IS_PTR(type)       ((type) & RPPC_PARAM_PTR)
280 #define RPPC_IS_ATOMIC(type)    (((type) > RPPC_PARAM_VOID) && \
281                                  ((type) < RPPC_PARAM_ATOMIC_MAX))
283 //#endif /* __KERNEL__ */
285 #endif /* _RPMSG_RPC_H_ */