xref: /freebsd/sys/contrib/ncsw/inc/xx_ext.h (revision acc1a9ef)
1 /* Copyright (c) 2008-2011 Freescale Semiconductor, Inc.
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above copyright
9  *       notice, this list of conditions and the following disclaimer in the
10  *       documentation and/or other materials provided with the distribution.
11  *     * Neither the name of Freescale Semiconductor nor the
12  *       names of its contributors may be used to endorse or promote products
13  *       derived from this software without specific prior written permission.
14  *
15  *
16  * ALTERNATIVELY, this software may be distributed under the terms of the
17  * GNU General Public License ("GPL") as published by the Free Software
18  * Foundation, either version 2 of that License or (at your option) any
19  * later version.
20  *
21  * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor ``AS IS'' AND ANY
22  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
23  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24  * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY
25  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
28  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 /**************************************************************************//**
34  @File          xx_ext.h
35 
36  @Description   Prototypes, externals and typedefs for system-supplied
37                 (external) routines
38 *//***************************************************************************/
39 
40 #ifndef __XX_EXT_H
41 #define __XX_EXT_H
42 
43 #include "std_ext.h"
44 #include "part_ext.h"
45 
46 #if defined(__MWERKS__) && defined(OPTIMIZED_FOR_SPEED)
47 #include "xx_integration_ext.h"
48 #endif /* defined(__MWERKS__) && defined(OPTIMIZED_FOR_SPEED) */
49 
50 
51 /**************************************************************************//**
52  @Group         xx_id  XX Interface (System call hooks)
53 
54  @Description   Prototypes, externals and typedefs for system-supplied
55                 (external) routines
56 
57  @{
58 *//***************************************************************************/
59 
60 #if (defined(REPORT_EVENTS) && (REPORT_EVENTS > 0))
61 /**************************************************************************//**
62  @Function      XX_EventById
63 
64  @Description   Event reporting routine - executed only when REPORT_EVENTS=1.
65 
66  @Param[in]     event - Event code (e_Event).
67  @Param[in]     appId - Application identifier.
68  @Param[in]     flags - Event flags.
69  @Param[in]     msg   - Event message.
70 
71  @Return        None
72 *//***************************************************************************/
73 void XX_EventById(uint32_t event, t_Handle appId, uint16_t flags, char *msg);
74 
75 #else  /* not REPORT_EVENTS */
76 #define XX_EventById(event, appId, flags, msg)
77 #endif /* REPORT_EVENTS */
78 
79 
80 #ifdef DEBUG_XX_MALLOC
81 void * XX_MallocDebug(uint32_t size, char *fname, int line);
82 
83 void * XX_MallocSmartDebug(uint32_t size,
84                            int      memPartitionId,
85                            uint32_t alignment,
86                            char     *fname,
87                            int      line);
88 
89 #define XX_Malloc(sz) \
90     XX_MallocDebug((sz), __FILE__, __LINE__)
91 
92 #define XX_MallocSmart(sz, memt, al) \
93     XX_MallocSmartDebug((sz), (memt), (al), __FILE__, __LINE__)
94 
95 #else /* not DEBUG_XX_MALLOC */
96 /**************************************************************************//**
97  @Function      XX_Malloc
98 
99  @Description   allocates contiguous block of memory.
100 
101  @Param[in]     size - Number of bytes to allocate.
102 
103  @Return        The address of the newly allocated block on success, NULL on failure.
104 *//***************************************************************************/
105 void * XX_Malloc(uint32_t size);
106 
107 /**************************************************************************//**
108  @Function      XX_MallocSmartInit
109 
110  @Description   Initializes SmartMalloc allocator.
111 
112  @Return        E_OK on success, error code otherwise.
113 *//***************************************************************************/
114 int XX_MallocSmartInit(void);
115 
116 /**************************************************************************//**
117  @Function      XX_MallocSmart
118 
119  @Description   Allocates contiguous block of memory in a specified
120                 alignment and from the specified segment.
121 
122  @Param[in]     size            - Number of bytes to allocate.
123  @Param[in]     memPartitionId  - Memory partition ID; The value zero must
124                                   be mapped to the default heap partition.
125  @Param[in]     alignment       - Required memory alignment (in bytes).
126 
127  @Return        The address of the newly allocated block on success, NULL on failure.
128 *//***************************************************************************/
129 void * XX_MallocSmart(uint32_t size, int memPartitionId, uint32_t alignment);
130 #endif /* not DEBUG_XX_MALLOC */
131 
132 /**************************************************************************//**
133  @Function      XX_FreeSmart
134 
135  @Description   Frees the memory block pointed to by "p".
136                 Only for memory allocated by XX_MallocSmart
137 
138  @Param[in]     p_Memory - pointer to the memory block.
139 
140  @Return        None.
141 *//***************************************************************************/
142 void XX_FreeSmart(void *p_Memory);
143 
144 /**************************************************************************//**
145  @Function      XX_Free
146 
147  @Description   frees the memory block pointed to by "p".
148 
149  @Param[in]     p_Memory - pointer to the memory block.
150 
151  @Return        None.
152 *//***************************************************************************/
153 void XX_Free(void *p_Memory);
154 
155 #ifndef NCSW_LINUX
156 /**************************************************************************//**
157  @Function      XX_GetMemPartitionBase
158 
159  @Description   This routine gets the address of a memory segment according to
160                 the memory type.
161 
162  @Param[in]     memPartitionId  - Memory partition ID; The value zero must
163                                   be mapped to the default heap partition.
164 
165  @Return        The address of the required memory type.
166 *//***************************************************************************/
167 void * XX_GetMemPartitionBase(int memPartitionId);
168 #endif
169 
170 /**************************************************************************//**
171  @Function      XX_Print
172 
173  @Description   print a string.
174 
175  @Param[in]     str - string to print.
176 
177  @Return        None.
178 *//***************************************************************************/
179 void    XX_Print(char *str, ...);
180 
181 /**************************************************************************//**
182  @Function      XX_GetChar
183 
184  @Description   Get character from console.
185 
186  @Return        Character is returned on success. Zero is returned otherwise.
187 *//***************************************************************************/
188 char    XX_GetChar(void);
189 
190 /**************************************************************************//**
191  @Function      XX_PreallocAndBindIntr
192 
193  @Description   Preallocate and optionally bind it to given CPU.
194 
195  @Param[in]     irq     - Interrupt ID (system-specific number).
196  @Param[in]     cpu	- CPU to bind to or -1 if iRQ should be unbound.
197 
198  @Return        E_OK on success; error code otherwise..
199 *//***************************************************************************/
200 t_Error XX_PreallocAndBindIntr(int irq, unsigned int cpu);
201 
202 /**************************************************************************//**
203  @Function      XX_DeallocIntr
204 
205  @Description   Deallocate preallocated interupt.
206 
207  @Param[in]     irq     - Interrupt ID (system-specific number).
208 
209  @Return        E_OK on success; error code otherwise..
210 *//***************************************************************************/
211 t_Error XX_DeallocIntr(int irq);
212 
213 /**************************************************************************//**
214  @Function      XX_SetIntr
215 
216  @Description   Set an interrupt service routine for a specific interrupt source.
217 
218  @Param[in]     irq     - Interrupt ID (system-specific number).
219  @Param[in]     f_Isr   - Callback routine that will be called when the interrupt occurs.
220  @Param[in]     handle  - The argument for the user callback routine.
221 
222  @Return        E_OK on success; error code otherwise..
223 *//***************************************************************************/
224 t_Error XX_SetIntr(int irq, t_Isr *f_Isr, t_Handle handle);
225 
226 /**************************************************************************//**
227  @Function      XX_FreeIntr
228 
229  @Description   Free a specific interrupt and a specific callback routine.
230 
231  @Param[in]     irq - Interrupt ID (system-specific number).
232 
233  @Return        E_OK on success; error code otherwise..
234 *//***************************************************************************/
235 t_Error XX_FreeIntr(int irq);
236 
237 /**************************************************************************//**
238  @Function      XX_EnableIntr
239 
240  @Description   Enable a specific interrupt.
241 
242  @Param[in]     irq - Interrupt ID (system-specific number).
243 
244  @Return        E_OK on success; error code otherwise..
245 *//***************************************************************************/
246 t_Error XX_EnableIntr(int irq);
247 
248 /**************************************************************************//**
249  @Function      XX_DisableIntr
250 
251  @Description   Disable a specific interrupt.
252 
253  @Param[in]     irq - Interrupt ID (system-specific number).
254 
255  @Return        E_OK on success; error code otherwise..
256 *//***************************************************************************/
257 t_Error XX_DisableIntr(int irq);
258 
259 #if !(defined(__MWERKS__) && defined(OPTIMIZED_FOR_SPEED))
260 /**************************************************************************//**
261  @Function      XX_DisableAllIntr
262 
263  @Description   Disable all interrupts by masking them at the CPU.
264 
265  @Return        A value that represents the interrupts state before the
266                 operation, and should be passed to the matching
267                 XX_RestoreAllIntr() call.
268 *//***************************************************************************/
269 uint32_t XX_DisableAllIntr(void);
270 
271 /**************************************************************************//**
272  @Function      XX_RestoreAllIntr
273 
274  @Description   Restore previous state of interrupts level at the CPU.
275 
276  @Param[in]     flags - A value that represents the interrupts state to restore,
277                         as returned by the matching call for XX_DisableAllIntr().
278 
279  @Return        None.
280 *//***************************************************************************/
281 void XX_RestoreAllIntr(uint32_t flags);
282 #endif /* !(defined(__MWERKS__) && defined(OPTIMIZED_FOR_SPEED)) */
283 
284 /**************************************************************************//**
285  @Function      XX_Call
286 
287  @Description   Call a service in another task.
288 
289                 Activate the routine "f" via the queue identified by "IntrManagerId". The
290                 parameter to "f" is Id - the handle of the destination object
291 
292  @Param[in]     intrManagerId   - Queue ID.
293  @Param[in]     f               - routine pointer.
294  @Param[in]     Id              - the parameter to be passed to f().
295  @Param[in]     h_App           - Application handle.
296  @Param[in]     flags           - Unused,
297 
298  @Return        E_OK is returned on success. E_FAIL is returned otherwise (usually an operating system level failure).
299 *//***************************************************************************/
300 t_Error XX_Call( uint32_t intrManagerId,
301                  t_Error (* f)(t_Handle),
302                  t_Handle Id,
303                  t_Handle h_App,
304                  uint16_t flags );
305 
306 /**************************************************************************//**
307  @Function      XX_Exit
308 
309  @Description   Stop execution and report status (where it is applicable)
310 
311  @Param[in]     status - exit status
312 *//***************************************************************************/
313 void    XX_Exit(int status);
314 
315 /*****************************************************************************/
316 /*                        Tasklet Service Routines                           */
317 /*****************************************************************************/
318 typedef t_Handle t_TaskletHandle;
319 
320 /**************************************************************************//**
321  @Function      XX_InitTasklet
322 
323  @Description   Create and initialize a tasklet object.
324 
325  @Param[in]     routine - A routine to be ran as a tasklet.
326  @Param[in]     data    - An argument to pass to the tasklet.
327 
328  @Return        Tasklet handle is returned on success. NULL is returned otherwise.
329 *//***************************************************************************/
330 t_TaskletHandle XX_InitTasklet (void (*routine)(void *), void *data);
331 
332 /**************************************************************************//**
333  @Function      XX_FreeTasklet
334 
335  @Description   Free a tasklet object.
336 
337  @Param[in]     h_Tasklet - A handle to a tasklet to be free.
338 
339  @Return        None.
340 *//***************************************************************************/
341 void XX_FreeTasklet (t_TaskletHandle h_Tasklet);
342 
343 /**************************************************************************//**
344  @Function      XX_ScheduleTask
345 
346  @Description   Schedule a tasklet object.
347 
348  @Param[in]     h_Tasklet - A handle to a tasklet to be scheduled.
349  @Param[in]     immediate - Indicate whether to schedule this tasklet on
350                             the immediate queue or on the delayed one.
351 
352  @Return        0 - on success. Error code - otherwise.
353 *//***************************************************************************/
354 int XX_ScheduleTask(t_TaskletHandle h_Tasklet, int immediate);
355 
356 /**************************************************************************//**
357  @Function      XX_FlushScheduledTasks
358 
359  @Description   Flush all tasks there are in the scheduled tasks queue.
360 
361  @Return        None.
362 *//***************************************************************************/
363 void XX_FlushScheduledTasks(void);
364 
365 /**************************************************************************//**
366  @Function      XX_TaskletIsQueued
367 
368  @Description   Check if task is queued.
369 
370  @Param[in]     h_Tasklet - A handle to a tasklet to be scheduled.
371 
372  @Return        1 - task is queued. 0 - otherwise.
373 *//***************************************************************************/
374 int XX_TaskletIsQueued(t_TaskletHandle h_Tasklet);
375 
376 /**************************************************************************//**
377  @Function      XX_SetTaskletData
378 
379  @Description   Set data to a scheduled task. Used to change data of already
380                 scheduled task.
381 
382  @Param[in]     h_Tasklet - A handle to a tasklet to be scheduled.
383  @Param[in]     data      - Data to be set.
384 *//***************************************************************************/
385 void XX_SetTaskletData(t_TaskletHandle h_Tasklet, t_Handle data);
386 
387 /**************************************************************************//**
388  @Function      XX_GetTaskletData
389 
390  @Description   Get the data of scheduled task.
391 
392  @Param[in]     h_Tasklet - A handle to a tasklet to be scheduled.
393 
394  @Return        handle to the data of the task.
395 *//***************************************************************************/
396 t_Handle XX_GetTaskletData(t_TaskletHandle h_Tasklet);
397 
398 /**************************************************************************//**
399  @Function      XX_BottomHalf
400 
401  @Description   Bottom half implementation, invoked by the interrupt handler.
402 
403                 This routine handles all bottom-half tasklets with interrupts
404                 enabled.
405 
406  @Return        None.
407 *//***************************************************************************/
408 void XX_BottomHalf(void);
409 
410 
411 /*****************************************************************************/
412 /*                        Spinlock Service Routines                          */
413 /*****************************************************************************/
414 
415 /**************************************************************************//**
416  @Function      XX_InitSpinlock
417 
418  @Description   Creates a spinlock.
419 
420  @Return        Spinlock handle is returned on success; NULL otherwise.
421 *//***************************************************************************/
422 t_Handle XX_InitSpinlock(void);
423 
424 /**************************************************************************//**
425  @Function      XX_FreeSpinlock
426 
427  @Description   Frees the memory allocated for the spinlock creation.
428 
429  @Param[in]     h_Spinlock - A handle to a spinlock.
430 
431  @Return        None.
432 *//***************************************************************************/
433 void XX_FreeSpinlock(t_Handle h_Spinlock);
434 
435 /**************************************************************************//**
436  @Function      XX_LockSpinlock
437 
438  @Description   Locks a spinlock.
439 
440  @Param[in]     h_Spinlock - A handle to a spinlock.
441 
442  @Return        None.
443 *//***************************************************************************/
444 void XX_LockSpinlock(t_Handle h_Spinlock);
445 
446 /**************************************************************************//**
447  @Function      XX_UnlockSpinlock
448 
449  @Description   Unlocks a spinlock.
450 
451  @Param[in]     h_Spinlock - A handle to a spinlock.
452 
453  @Return        None.
454 *//***************************************************************************/
455 void XX_UnlockSpinlock(t_Handle h_Spinlock);
456 
457 /**************************************************************************//**
458  @Function      XX_LockIntrSpinlock
459 
460  @Description   Locks a spinlock (interrupt safe).
461 
462  @Param[in]     h_Spinlock - A handle to a spinlock.
463 
464  @Return        A value that represents the interrupts state before the
465                 operation, and should be passed to the matching
466                 XX_UnlockIntrSpinlock() call.
467 *//***************************************************************************/
468 uint32_t XX_LockIntrSpinlock(t_Handle h_Spinlock);
469 
470 /**************************************************************************//**
471  @Function      XX_UnlockIntrSpinlock
472 
473  @Description   Unlocks a spinlock (interrupt safe).
474 
475  @Param[in]     h_Spinlock  - A handle to a spinlock.
476  @Param[in]     intrFlags   - A value that represents the interrupts state to
477                               restore, as returned by the matching call for
478                               XX_LockIntrSpinlock().
479 
480  @Return        None.
481 *//***************************************************************************/
482 void XX_UnlockIntrSpinlock(t_Handle h_Spinlock, uint32_t intrFlags);
483 
484 
485 /*****************************************************************************/
486 /*                        Timers Service Routines                            */
487 /*****************************************************************************/
488 
489 /**************************************************************************//**
490  @Function      XX_CurrentTime
491 
492  @Description   Returns current system time.
493 
494  @Return        Current system time (in milliseconds).
495 *//***************************************************************************/
496 uint32_t XX_CurrentTime(void);
497 
498 /**************************************************************************//**
499  @Function      XX_CreateTimer
500 
501  @Description   Creates a timer.
502 
503  @Return        Timer handle is returned on success; NULL otherwise.
504 *//***************************************************************************/
505 t_Handle XX_CreateTimer(void);
506 
507 /**************************************************************************//**
508  @Function      XX_FreeTimer
509 
510  @Description   Frees the memory allocated for the timer creation.
511 
512  @Param[in]     h_Timer - A handle to a timer.
513 
514  @Return        None.
515 *//***************************************************************************/
516 void XX_FreeTimer(t_Handle h_Timer);
517 
518 /**************************************************************************//**
519  @Function      XX_StartTimer
520 
521  @Description   Starts a timer.
522 
523                 The user can select to start the timer as periodic timer or as
524                 one-shot timer. The user should provide a callback routine that
525                 will be called when the timer expires.
526 
527  @Param[in]     h_Timer         - A handle to a timer.
528  @Param[in]     msecs           - Timer expiration period (in milliseconds).
529  @Param[in]     periodic        - TRUE for a periodic timer;
530                                   FALSE for a one-shot timer..
531  @Param[in]     f_TimerExpired  - A callback routine to be called when the
532                                   timer expires.
533  @Param[in]     h_Arg           - The argument to pass in the timer-expired
534                                   callback routine.
535 
536  @Return        None.
537 *//***************************************************************************/
538 void XX_StartTimer(t_Handle h_Timer,
539                    uint32_t msecs,
540                    bool     periodic,
541                    void     (*f_TimerExpired)(t_Handle h_Arg),
542                    t_Handle h_Arg);
543 
544 /**************************************************************************//**
545  @Function      XX_StopTimer
546 
547  @Description   Frees the memory allocated for the timer creation.
548 
549  @Param[in]     h_Timer - A handle to a timer.
550 
551  @Return        None.
552 *//***************************************************************************/
553 void XX_StopTimer(t_Handle h_Timer);
554 
555 /**************************************************************************//**
556  @Function      XX_GetExpirationTime
557 
558  @Description   Returns the time (in milliseconds) remaining until the
559                 expiration of a timer.
560 
561  @Param[in]     h_Timer - A handle to a timer.
562 
563  @Return        The time left until the timer expires.
564 *//***************************************************************************/
565 uint32_t XX_GetExpirationTime(t_Handle h_Timer);
566 
567 /**************************************************************************//**
568  @Function      XX_ModTimer
569 
570  @Description   Updates the expiration time of a timer.
571 
572                 This routine adds the given time to the current system time,
573                 and sets this value as the new expiration time of the timer.
574 
575  @Param[in]     h_Timer - A handle to a timer.
576  @Param[in]     msecs   - The new interval until timer expiration
577                           (in milliseconds).
578 
579  @Return        None.
580 *//***************************************************************************/
581 void XX_ModTimer(t_Handle h_Timer, uint32_t msecs);
582 
583 /**************************************************************************//**
584  @Function      XX_TimerIsActive
585 
586  @Description   Checks whether a timer is active (pending) or not.
587 
588  @Param[in]     h_Timer - A handle to a timer.
589 
590  @Return        0 - the timer is inactive; Non-zero value - the timer is active;
591 *//***************************************************************************/
592 int XX_TimerIsActive(t_Handle h_Timer);
593 
594 /**************************************************************************//**
595  @Function      XX_Sleep
596 
597  @Description   Non-busy wait until the desired time (in milliseconds) has passed.
598 
599  @Param[in]     msecs - The requested sleep time (in milliseconds).
600 
601  @Return        None.
602 
603  @Cautions      This routine enables interrupts during its wait time.
604 *//***************************************************************************/
605 uint32_t XX_Sleep(uint32_t msecs);
606 
607 /**************************************************************************//**
608  @Function      XX_UDelay
609 
610  @Description   Busy-wait until the desired time (in microseconds) has passed.
611 
612  @Param[in]     usecs - The requested delay time (in microseconds).
613 
614  @Return        None.
615 
616  @Cautions      It is highly unrecommended to call this routine during interrupt
617                 time, because the system time may not be updated properly during
618                 the delay loop. The behavior of this routine during interrupt
619                 time is unexpected.
620 *//***************************************************************************/
621 void XX_UDelay(uint32_t usecs);
622 
623 
624 /*****************************************************************************/
625 /*                         Other Service Routines                            */
626 /*****************************************************************************/
627 
628 /**************************************************************************//**
629  @Function      XX_PhysToVirt
630 
631  @Description   Translates a physical address to the matching virtual address.
632 
633  @Param[in]     addr - The physical address to translate.
634 
635  @Return        Virtual address.
636 *//***************************************************************************/
637 void * XX_PhysToVirt(physAddress_t addr);
638 
639 /**************************************************************************//**
640  @Function      XX_VirtToPhys
641 
642  @Description   Translates a virtual address to the matching physical address.
643 
644  @Param[in]     addr - The virtual address to translate.
645 
646  @Return        Physical address.
647 *//***************************************************************************/
648 physAddress_t XX_VirtToPhys(void *addr);
649 
650 /**************************************************************************//**
651  @Function      XX_PortalSetInfo
652 
653  @Description   Save physical and virtual adresses of the portals.
654 
655  @Param[in]     dev - Portals device - either bman or qman.
656 
657  @Return        Physical, virtual addresses and size.
658 *//***************************************************************************/
659 void XX_PortalSetInfo(device_t dev);
660 
661 /**************************************************************************//**
662  @Function      XX_FmanSetIntrInfo
663 
664  @Description   Workaround for FMan interrupt, which must be binded to one CPU
665                 only.
666 
667  @Param[in]     irq - Interrupt number.
668 
669  @Return        None.
670 *//***************************************************************************/
671 void XX_FmanFixIntr(int irq);
672 
673 /**************************************************************************//**
674  @Group         xx_ipc  XX Inter-Partition-Communication API
675 
676  @Description   The following API is to be used when working with multiple
677                 partitions configuration.
678 
679  @{
680 *//***************************************************************************/
681 
682 #define XX_IPC_MAX_ADDR_NAME_LENGTH 16         /**< Maximum length of an endpoint name string;
683                                                     The IPC service can use this constant to limit
684                                                     the storage space for IPC endpoint names. */
685 
686 
687 /**************************************************************************//**
688  @Function      t_IpcMsgCompletion
689 
690  @Description   Callback function used upon IPC non-blocking transaction completion
691                 to return message buffer to the caller and to forward reply if available.
692 
693                 This callback function may be attached by the source endpoint to any outgoing
694                 IPC message to indicate a non-blocking send (see also XX_IpcSendMessage() routine).
695                 Upon completion of an IPC transaction (consisting of a message and an optional reply),
696                 the IPC service invokes this callback routine to return the message buffer to the sender
697                 and to provide the received reply, if requested.
698 
699                 User provides this function. Driver invokes it.
700 
701  @Param[in]     h_Module        - Abstract handle to the sending module -  the same handle as was passed
702                                   in the XX_IpcSendMessage() function; This handle is typically used to point
703                                   to the internal data structure of the source endpoint.
704  @Param[in]     p_Msg           - Pointer to original (sent) message buffer;
705                                   The source endpoint can free (or reuse) this buffer when message
706                                   completion callback is called.
707  @Param[in]     p_Reply         - Pointer to (received) reply buffer;
708                                   This pointer is the same as was provided by the source endpoint in
709                                   XX_IpcSendMessage().
710  @Param[in]     replyLength     - Length (in bytes) of actual data in the reply buffer.
711  @Param[in]     status          - Completion status - E_OK or failure indication, e.g. IPC transaction completion
712                                   timeout.
713 
714  @Return        None
715  *//***************************************************************************/
716 typedef void    (t_IpcMsgCompletion)(t_Handle   h_Module,
717                                      uint8_t    *p_Msg,
718                                      uint8_t    *p_Reply,
719                                      uint32_t   replyLength,
720                                      t_Error    status);
721 
722 /**************************************************************************//**
723  @Function      t_IpcMsgHandler
724 
725  @Description   Callback function used as IPC message handler.
726 
727                 The IPC service invokes message handlers for each IPC message received.
728                 The actual function pointer should be registered by each destination endpoint
729                 via the XX_IpcRegisterMsgHandler() routine.
730 
731                 User provides this function. Driver invokes it.
732 
733  @Param[in]     h_Module        - Abstract handle to the message handling module -  the same handle as
734                                   was passed in the XX_IpcRegisterMsgHandler() function; this handle is
735                                   typically used to point to the internal data structure of the destination
736                                   endpoint.
737  @Param[in]     p_Msg           - Pointer to message buffer with data received from peer.
738  @Param[in]     msgLength       - Length (in bytes) of message data.
739  @Param[in]     p_Reply         - Pointer to reply buffer, to be filled by the message handler and then sent
740                                   by the IPC service;
741                                   The reply buffer is allocated by the IPC service with size equals to the
742                                   replyLength parameter provided in message handler registration (see
743                                   XX_IpcRegisterMsgHandler() function);
744                                   If replyLength was initially specified as zero during message handler registration,
745                                   the IPC service may set this pointer to NULL and assume that a reply is not needed;
746                                   The IPC service is also responsible for freeing the reply buffer after the
747                                   reply has been sent or dismissed.
748  @Param[in,out] p_ReplyLength   - Pointer to reply length, which has a dual role in this function:
749                                   [In] equals the replyLength parameter provided in message handler
750                                   registration (see XX_IpcRegisterMsgHandler() function), and
751                                   [Out] should be updated by message handler to the actual reply length; if
752                                   this value is set to zero, the IPC service must assume that a reply should
753                                   not be sent;
754                                   Note: If p_Reply is not NULL, p_ReplyLength must not be NULL as well.
755 
756  @Return        E_OK on success; Error code otherwise.
757  *//***************************************************************************/
758 typedef t_Error (t_IpcMsgHandler)(t_Handle  h_Module,
759                                   uint8_t   *p_Msg,
760                                   uint32_t  msgLength,
761                                   uint8_t   *p_Reply,
762                                   uint32_t  *p_ReplyLength);
763 
764 /**************************************************************************//**
765  @Function      XX_IpcRegisterMsgHandler
766 
767  @Description   IPC mailbox registration.
768 
769                 This function is used for registering an IPC message handler in the IPC service.
770                 This function is called by each destination endpoint to indicate that it is ready
771                 to handle incoming messages. The IPC service invokes the message handler upon receiving
772                 a message addressed to the specified destination endpoint.
773 
774  @Param[in]     addr                - The address name string associated with the destination endpoint;
775                                       This address must be unique across the IPC service domain to ensure
776                                       correct message routing.
777  @Param[in]     f_MsgHandler        - Pointer to the message handler callback for processing incoming
778                                       message; invoked by the IPC service upon receiving a message
779                                       addressed to the destination endpoint specified by the addr
780                                       parameter.
781  @Param[in]     h_Module            - Abstract handle to the message handling module, passed unchanged
782                                       to f_MsgHandler callback function.
783  @Param[in]     replyLength         - The maximal data length (in bytes) of any reply that the specified message handler
784                                       may generate; the IPC service provides the message handler with buffer
785                                       for reply according to the length specified here (refer also to the description
786                                       of #t_IpcMsgHandler callback function type);
787                                       This size shall be zero if the message handler never generates replies.
788 
789  @Return        E_OK on success; Error code otherwise.
790 *//***************************************************************************/
791 t_Error XX_IpcRegisterMsgHandler(char                   addr[XX_IPC_MAX_ADDR_NAME_LENGTH],
792                                  t_IpcMsgHandler        *f_MsgHandler,
793                                  t_Handle               h_Module,
794                                  uint32_t               replyLength);
795 
796 /**************************************************************************//**
797  @Function      XX_IpcUnregisterMsgHandler
798 
799  @Description   Release IPC mailbox routine.
800 
801                  This function is used for unregistering an IPC message handler from the IPC service.
802                  This function is called by each destination endpoint to indicate that it is no longer
803                  capable of handling incoming messages.
804 
805  @Param[in]     addr          - The address name string associated with the destination endpoint;
806                                 This address is the same as was used when the message handler was
807                                 registered via XX_IpcRegisterMsgHandler().
808 
809  @Return        E_OK on success; Error code otherwise.
810 *//***************************************************************************/
811 t_Error XX_IpcUnregisterMsgHandler(char addr[XX_IPC_MAX_ADDR_NAME_LENGTH]);
812 
813 /**************************************************************************//**
814  @Function      XX_IpcInitSession
815 
816  @Description   This function is used for creating an IPC session between the source endpoint
817                 and the destination endpoint.
818 
819                 The actual implementation and representation of a session is left for the IPC service.
820                 The function returns an abstract handle to the created session. This handle shall be used
821                 by the source endpoint in subsequent calls to XX_IpcSendMessage().
822                 The IPC service assumes that before this function is called, no messages are sent from
823                 the specified source endpoint to the specified destination endpoint.
824 
825                 The IPC service may use a connection-oriented approach or a connectionless approach (or both)
826                 as described below.
827 
828                 @par Connection-Oriented Approach
829 
830                 The IPC service may implement a session in a connection-oriented approach -  when this function is called,
831                 the IPC service should take the necessary steps to bring up a source-to-destination channel for messages
832                 and a destination-to-source channel for replies. The returned handle should represent the internal
833                 representation of these channels.
834 
835                 @par Connectionless Approach
836 
837                 The IPC service may implement a session in a connectionless approach -  when this function is called, the
838                 IPC service should not perform any particular steps, but it must store the pair of source and destination
839                 addresses in some session representation and return it as a handle. When XX_IpcSendMessage() shall be
840                 called, the IPC service may use this handle to provide the necessary identifiers for routing the messages
841                 through the connectionless medium.
842 
843  @Param[in]     destAddr      - The address name string associated with the destination endpoint.
844  @Param[in]     srcAddr       - The address name string associated with the source endpoint.
845 
846  @Return        Abstract handle to the initialized session, or NULL on error.
847 *//***************************************************************************/
848 t_Handle XX_IpcInitSession(char destAddr[XX_IPC_MAX_ADDR_NAME_LENGTH],
849                            char srcAddr[XX_IPC_MAX_ADDR_NAME_LENGTH]);
850 
851 /**************************************************************************//**
852  @Function      XX_IpcFreeSession
853 
854  @Description   This function is used for terminating an existing IPC session between a source endpoint
855                 and a destination endpoint.
856 
857                 The IPC service assumes that after this function is called, no messages shall be sent from
858                 the associated source endpoint to the associated destination endpoint.
859 
860  @Param[in]     h_Session      - Abstract handle to the IPC session -  the same handle as was originally
861                                  returned by the XX_IpcInitSession() function.
862 
863  @Return        E_OK on success; Error code otherwise.
864 *//***************************************************************************/
865 t_Error XX_IpcFreeSession(t_Handle h_Session);
866 
867 /**************************************************************************//**
868  @Function      XX_IpcSendMessage
869 
870  @Description   IPC message send routine.
871 
872                 This function may be used by a source endpoint to send an IPC message to a destination
873                 endpoint. The source endpoint cannot send a message to the destination endpoint without
874                 first initiating a session with that destination endpoint via XX_IpcInitSession() routine.
875 
876                 The source endpoint must provide the buffer pointer and length of the outgoing message.
877                 Optionally, it may also provide a buffer for an expected reply. In the latter case, the
878                 transaction is not considered complete by the IPC service until the reply has been received.
879                 If the source endpoint does not provide a reply buffer, the transaction is considered
880                 complete after the message has been sent. The source endpoint must keep the message (and
881                 optional reply) buffers valid until the transaction is complete.
882 
883                 @par Non-blocking mode
884 
885                 The source endpoint may request a non-blocking send by providing a non-NULL pointer to a message
886                 completion callback function (f_Completion). Upon completion of the IPC transaction (consisting of a
887                 message and an optional reply), the IPC service invokes this callback routine to return the message
888                 buffer to the sender and to provide the received reply, if requested.
889 
890                 @par Blocking mode
891 
892                 The source endpoint may request a blocking send by setting f_Completion to NULL. The function is
893                 expected to block until the IPC transaction is complete -  either the reply has been received or (if no reply
894                 was requested) the message has been sent.
895 
896  @Param[in]     h_Session       - Abstract handle to the IPC session -  the same handle as was originally
897                                   returned by the XX_IpcInitSession() function.
898  @Param[in]     p_Msg           - Pointer to message buffer to send.
899  @Param[in]     msgLength       - Length (in bytes) of actual data in the message buffer.
900  @Param[in]     p_Reply         - Pointer to reply buffer -  if this buffer is not NULL, the IPC service
901                                   fills this buffer with the received reply data;
902                                   In blocking mode, the reply data must be valid when the function returns;
903                                   In non-blocking mode, the reply data is valid when f_Completion is called;
904                                   If this pointer is NULL, no reply is expected.
905  @Param[in,out] p_ReplyLength   - Pointer to reply length, which has a dual role in this function:
906                                   [In] specifies the maximal length (in bytes) of the reply buffer pointed by
907                                   p_Reply, and
908                                   [Out] in non-blocking mode this value is updated by the IPC service to the
909                                   actual reply length (in bytes).
910  @Param[in]     f_Completion    - Pointer to a completion callback to be used in non-blocking send mode;
911                                   The completion callback is invoked by the IPC service upon
912                                   completion of the IPC transaction (consisting of a message and an optional
913                                   reply);
914                                   If this pointer is NULL, the function is expected to block until the IPC
915                                   transaction is complete.
916  @Param[in]     h_Arg           - Abstract handle to the sending module; passed unchanged to the f_Completion
917                                   callback function as the first argument.
918 
919  @Return        E_OK on success; Error code otherwise.
920 *//***************************************************************************/
921 t_Error XX_IpcSendMessage(t_Handle           h_Session,
922                           uint8_t            *p_Msg,
923                           uint32_t           msgLength,
924                           uint8_t            *p_Reply,
925                           uint32_t           *p_ReplyLength,
926                           t_IpcMsgCompletion *f_Completion,
927                           t_Handle           h_Arg);
928 
929 
930 /** @} */ /* end of xx_ipc group */
931 /** @} */ /* end of xx_id group */
932 
933 /** FreeBSD Specific additions. */
934 void XX_TrackInit(void);
935 void XX_TrackAddress(void *addr);
936 void XX_UntrackAddress(void *addr);
937 
938 #endif /* __XX_EXT_H */
939