cb040089750d04b49f1540d4fb58472d74445123
[keystone-rtos/rm-lld.git] / rmtransport.h
1 /**
2  *   @file  rmtransport.h
3  *
4  *   @brief   
5  *      This is the RM include file for the generic transport interface used by RM to exchange
6  *      RM control signals and data between RM instances
7  *
8  *  \par
9  *  ============================================================================
10  *  @n   (C) Copyright 2012, Texas Instruments, Inc.
11  * 
12  *  Redistribution and use in source and binary forms, with or without 
13  *  modification, are permitted provided that the following conditions 
14  *  are met:
15  *
16  *    Redistributions of source code must retain the above copyright 
17  *    notice, this list of conditions and the following disclaimer.
18  *
19  *    Redistributions in binary form must reproduce the above copyright
20  *    notice, this list of conditions and the following disclaimer in the 
21  *    documentation and/or other materials provided with the   
22  *    distribution.
23  *
24  *    Neither the name of Texas Instruments Incorporated nor the names of
25  *    its contributors may be used to endorse or promote products derived
26  *    from this software without specific prior written permission.
27  *
28  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
29  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
30  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
32  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
33  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
34  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
37  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
38  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  *  \par
41 */
43 #ifndef RMTRANSPORT_H_
44 #define RMTRANSPORT_H_
46 #ifdef __cplusplus
47 extern "C" {
48 #endif
50 /**
51 @addtogroup RMTRANSPORT_API
52 @{
53 */
55 /** RM Transport Result Return Codes */
56 /** RM Transport Success Code Base */
57 #define RM_TRANSPORT_OK_BASE (0)
58 /** RM transport action was successful. */
59 #define RM_TRANSPORT_SUCCESSFUL (RM_TRANSPORT_OK_BASE)
61 /** RM Transport Error Code Base */
62 #define RM_TRANSPORT_ERROR_BASE (-64)
63 /** RM transport handle has not been registered with the RM instance */
64 #define RM_TRANSPORT_ERROR_HANDLE_HAS_NOT_BEEN_REGISTERED (RM_TRANSPORT_ERROR_BASE-1)
65 /** No transports have been registered with the RM instance */
66 #define RM_TRANSPORT_ERROR_NO_TRANSPORTS_REGISTERED  (RM_TRANSPORT_ERROR_BASE-2)
68 /** 
69  * @brief Result of RM transport layer operations
70  */
71 typedef int32_t   Rm_TransportResult;
75 /** Maximum size of the RM transport packet */
76 #define RM_TRANSPORT_PACKET_MAX_SIZE_BYTES (128)  // Placeholder: This will 
77                                                  // change during development
79 /** 
80  * @brief RM transport handle
81  */
82 typedef void *Rm_TransportHandle;
84 /** 
85  * @brief RM transport registration configuration structure
86  */
87 typedef struct {
88     /** The transport's remote RM instance type */
89     Rm_InstType remoteInstType;
90     /** Pointer to the transport's remote RM instance name */
91     char *remoteInstName;
92 } Rm_TransportCfg;
94 /**
95  * @brief RM packet types that can be sent between RM instances
96  */
97 typedef enum {
98     /** Allocate/Free request packet */
99     Rm_pktType_RESOURCE_REQUEST = 0,
100     /** Allocate/Free response packet */ 
101     Rm_pktType_RESOURCE_RESPONSE = 1,
102     /** RM NameServer mapping request */
103     Rm_pktType_NAMESERVER_REQUEST = 2,
104     /** RM NameServer mapping response */
105     Rm_pktType_NAMESERVER_RESPONSE = 3,    
106     /** Policy request packet */
107     Rm_pktType_POLICY_REQUEST = 4,
108     /** Policy response packet */
109     Rm_pktType_POLICY_CHANGE = 5
110 } Rm_pktType;
112 /** 
113  * @brief RM transport layer packet
114  */
115 typedef struct {
116     /** Packet length in bytes.  Written by application when allocated */
117     uint32_t pktLenBytes;
118     /** Type of RM packet contained in the byte data array */
119     Rm_pktType pktType;
120     /** Byte array containing RM packet data */
121     char data[RM_TRANSPORT_PACKET_MAX_SIZE_BYTES];
122 } Rm_Packet;
124 typedef struct {
125     /**
126      *  @b Description
127      *  @n  
128      *      This function pointer describes the RM transport layer packet 
129      *      allocation function.  The application which integrates with RM must 
130      *      supply a function to RM at initialization time that matches this  
131      *      prototype.  The provided function implements the allocation of packet
132      *      buffers for use by the RM transport for sending messages between RM
133      *      instances in the SOC.
134      *
135      *  @param[in]  transportHandle
136      *      Which application transport to allocate a packet from.
137      *
138      *  @param[in]  pktSize
139      *      Size of requested packet allocation.
140      *
141      *  @retval
142      *      Success - Pointer to allocated packet buffer.
143      *  @retval
144      *      Failure - NULL
145      */
146     Rm_Packet *(*rmAllocPkt)(Rm_TransportHandle transportHandle, uint32_t pktSize);
147     
148     /**
149      *  @b Description
150      *  @n  
151      *      This function pointer describes the RM transport layer packet 
152      *      free function.  The application which integrates with RM must 
153      *      supply a function to RM at initialization time that matches this  
154      *      prototype.  The provided function implements the free of packet
155      *      buffers used by the RM transport for sending/receiving messages 
156      *      between RM instances in the SOC.
157      *
158      *  @param[in]  transportHandle
159      *      Which application transport to free the packet to.
160      *
161      *  @param[in]  pkt
162      *      Pointer to resource packet to be freed.
163      *
164      *  @retval
165      *      0 - Packet free okay.
166      *  @retval
167      *      Non-zero - Send failed.
168      */
169     int32_t (*rmFreePkt)(Rm_TransportHandle transportHandle, Rm_Packet *pkt);
170     
171     /**
172      *  @b Description
173      *  @n  
174      *      This function pointer describes the RM transport layer send function.
175      *      The application which integrates with RM must supply a function to RM
176      *      at initialization time that matches this prototype.  The provided 
177      *      function implements the send side of the transport between RM 
178      *      instances on different cores in the SOC.
179      *
180      *  @param[in]  transportHandle
181      *      Which application transport to send the packet over.
182      *
183      *  @param[in]  pkt
184      *      Pointer to resource packet to be sent to the destination RM.
185      *
186      *  @retval
187      *      0 - Packet sent okay.
188      *  @retval
189      *      Non-zero - Send failed.
190      */
191     int32_t (*rmSend)(Rm_TransportHandle transportHandle, Rm_Packet *pkt);
192     
193     /**
194      *  @b Description
195      *  @n  
196      *      This function pointer describes the RM transport layer receive 
197      *      function. The application which integrates with RM must supply a 
198      *      function to RM at initialization time that matches this prototype.
199      *      The provided function implements the receive side of the transport 
200      *      between RM instances on different cores in the SOC.
201      *
202      *  @param[in]  transportHandle
203      *      Which application transport to retrieve a packet from
204      *
205      *  @param[in]  pkt
206      *      Pointer to received resource packet.
207      *
208      *  @retval
209      *      0 - Packet reception okay.
210      *  @retval
211      *      Non-zero - Packet receive failed.
212      */
213     int32_t (*rmReceive)(Rm_TransportHandle transportHandle, Rm_Packet *pkt);
214     
215     /**
216      *  @b Description
217      *  @n  
218      *      This function pointer describes the RM transport layer number of
219      *      packets received function. The application which integrates with RM 
220      *      must supply a function to RM at initialization time that matches this 
221      *      prototype.  The provided function implements a query of the number of
222      *      RM packets received on a specified transport.
223      *
224      *  @param[in]  transportHandle
225      *      Which application transport to check for received packets.
226      *
227      *  @retval
228      *      Success -   Number of packets received over transport interfaces for
229      *                  a RM instance.
230      *  @retval
231      *      Failure -   -1
232      */
233     int32_t (*rmNumPktsReceived)(Rm_TransportHandle transportHandle);
234 } Rm_TransportCallouts;
236 /**
237  *  @b Description
238  *  @n  
239  *      This is the RM transport layer function available for application
240  *      transport code callbacks.  This API can be called if the application
241  *      transport wants to report a received RM packet to the RM instance.
242  *      This API can be used if RM polling the application code for received
243  *      packets is not desired.
244  *
245  *  @param[in]  transportHandle
246  *      Transport handle.  Used to distinguish which RM instance the packet
247  *      was received from and how to internally route the packet if more than
248  *      one RM instance exists on the core.
249  *
250  *  @param[in]  pkt
251  *      Pointer to received resource packet.
252  *
253  *  @retval
254  *      Success - 0
255  *  @retval
256  *      Failure - Non-zero RM error
257  */
258 Rm_Result rmTransportCallback(Rm_TransHandle transportHandle, Rm_Packet *pkt);
261 /**
262  *  @b Description
263  *  @n  
264  *      This function is used to register transports with RM for sending and
265  *      receiving packets between RM instances over application transport
266  *      data paths.
267  *
268  *  @param[in]  rmHandle
269  *      RM instance to which the transport will be registered.  Used internally
270  *      by RM if there are more than one RM instances per core.
271  *
272  *  @param[in]  transportCfg
273  *      Transport registration configuration structure.  Provides information
274  *      regarding the application transports remote entity.  For example,
275  *      if the transCfg structure specifies the remote type is the RM Server
276  *      RM will know any Server requests must be pushed to the application
277  *      transport API with the transport handle returned to the application
278  *
279  *  @retval
280  *      Success - non-NULL RM transport handle.  No two transport handles
281  *                returned by RM should be the same.
282  *  @retval
283  *      Failure - NULL
284  */
285 Rm_TransportHandle Rm_transportRegister (Rm_Handle rmHandle, 
286                                          Rm_TransportCfg *transportCfg);
288 /**
289  *  @b Description
290  *  @n  
291  *      This function places the selected RM instance into the transport
292  *      verification state.  When all RM instances in the tree are placed
293  *      in the transport verification state a transport path verification
294  *      test will take place to verify the application transport paths between
295  *      all RM tree nodes are connected correctly.
296  *
297  *      Note: This API should not be called until all transport have been
298  *            registered with RM
299  *
300  *  @param[in]  rmHandle
301  *      Which RM instance to begin the transport verification process
302  *
303  *  @param[in]  timeout
304  *      Number of ______ (cycles, usec, msec???) to wait before signaling a
305  *      transport path verification timeout
306  *
307  *  @param[in]  failData
308  *      Pointer to an empty Rm_TransFailData structure.  If the transport
309  *      verification process fails this structure will return with transport
310  *      failure data
311  *
312  *  @retval
313  *      Success - 0 - Transport Verification succeeded
314  *  @retval
315  *      Failure - non-0 - Transport Verification failed
316  */
317 Rm_TransVerifyResult Rm_transportVerify (Rm_Handle, uint32_t timeout, 
318                                          Rm_TransFailData *failData);
322 /** 
323 @} 
324 */
326 #ifdef __cplusplus
328 #endif
330 #endif /* RMTRANSPORT_H_ */