1    /* --COPYRIGHT--,BSD
     2     * Copyright (c) $(CPYYEAR), Texas Instruments Incorporated
     3     * All rights reserved.
     4     *
     5     * Redistribution and use in source and binary forms, with or without
     6     * modification, are permitted provided that the following conditions
     7     * are met:
     8     *
     9     * *  Redistributions of source code must retain the above copyright
    10     *    notice, this list of conditions and the following disclaimer.
    11     *
    12     * *  Redistributions in binary form must reproduce the above copyright
    13     *    notice, this list of conditions and the following disclaimer in the
    14     *    documentation and/or other materials provided with the distribution.
    15     *
    16     * *  Neither the name of Texas Instruments Incorporated nor the names of
    17     *    its contributors may be used to endorse or promote products derived
    18     *    from this software without specific prior written permission.
    19     *
    20     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    21     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    22     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    23     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    24     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    25     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    26     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    27     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    28     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    29     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    30     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    31     * --/COPYRIGHT--*/
    32    /*
    33     *  ======== NameServerMessageQ.xdc ========
    34     */
    35     
    36    import xdc.runtime.Error;
    37    import xdc.runtime.Assert;
    38    
    39    import xdc.rov.ViewInfo;
    40    
    41    import ti.sysbios.knl.Swi;
    42    import ti.sysbios.syncs.SyncSwi;
    43    import ti.sysbios.knl.Semaphore;
    44    import ti.sysbios.gates.GateMutex;
    45    import ti.sdo.ipc.MessageQ;
    46    import ti.sdo.utils.INameServerRemote;
    47    
    48    /*!
    49     *  ======== NameServerMessageQ ========
    50     *  Used by NameServer to communicate to remote processors.
    51     *
    52     *  This module is used by {@link ti.sdo.utils.NameServer} to communicate
    53     *  to remote processors using {@link ti.sdo.ipc.MessageQ}.
    54     *  There needs to be one instance between each two cores in the system.
    55     *  Interrupts must be enabled before using this module.
    56     *  This module does not require any share memory.
    57     */
    58    @ModuleStartup
    59    @InstanceFinalize
    60    
    61    module NameServerMessageQ inherits INameServerRemote
    62    {
    63        /*! maximum number of characters for name in bytes */
    64        const UInt maxNameLen = 32;
    65        
    66        /*!
    67         *  Assert raised if first MessageQ created already
    68         */
    69        config Assert.Id A_reservedMsgQueueId = {
    70            msg: "MessageQ Id 0 is reserved for NameServer"
    71        };
    72        
    73        /*!
    74         *  Assert raised if too many characters in the name
    75         */
    76        config Assert.Id A_nameIsTooLong = {
    77            msg: "Too many characters in name"
    78        };
    79        
    80        /*!
    81         *  Error raised if all the message queue objects are taken
    82         */
    83        config Error.Id E_outOfMemory  = {
    84            msg: "E_outOfMemory: MessageQ_alloc faild from heap: %d"
    85        };
    86    
    87        /*!
    88         *  ======== heapId ========
    89         *  The heap from which to alloc a message.
    90         */
    91        config UInt16 heapId = 0;
    92        
    93        /*!
    94         *  ======== timeoutInMicroSecs ========
    95         *  The timeout value in terms of microseconds
    96         *
    97         *  A NameServer request will return after this amout of time
    98         *  without a response. The default timeout value is 1 s.
    99         *  To not wait, use the value of '0'.  To wait forever, use '~(0)'.
   100         */
   101        config UInt timeoutInMicroSecs = 1000000;
   102    
   103    internal:
   104    
   105        /*
   106         *  ======== timeout ========
   107         *  The timeout value to pass into Semaphore_pend
   108         *
   109         *  This value is calculated based on timeoutInMicroSecs and the
   110         *  SYSBIOS clock.tickPeriod.
   111         */
   112        config UInt timeout;
   113        
   114        /*!
   115         *  ======== Type ========
   116         *  The type of the message
   117         */
   118        enum Type {
   119            REQUEST =  0,
   120            RESPONSE = 1
   121        };
   122    
   123        /*!
   124         *  ======== swiFxn ========
   125         *  The swi function that will be executed during the call back.
   126         *
   127         *  @param(arg0)    argument 0 to swi function
   128         *  @param(arg1)    argument 1 to swi function
   129         */
   130        Void swiFxn(UArg arg0, UArg arg1);
   131        
   132        /* Instance state */
   133        struct Instance_State {
   134            UInt16              remoteProcId;   /* remote MultiProc id           */
   135        };
   136    
   137        /* Module state */
   138        struct Module_State {
   139            MessageQ.Handle     msgHandle;      /* messageQ for NameServer       */
   140            Swi.Handle          swiHandle;      /* instance swi object           */
   141            SyncSwi.Handle      syncSwiHandle;  /* syncSwi handle                */
   142            Semaphore.Handle    semRemoteWait;  /* sem to wait on remote proc    */
   143            GateMutex.Handle    gateMutex;      /* gate to protect critical code */
   144            Ptr                 msg;            /* pointer to response message   */
   145        };
   146    }