SDOCM00114730 Reserved message queues on Linux/Keystone II
authorRamsey Harris <ramsey@ti.com>
Fri, 13 Feb 2015 01:47:46 +0000 (17:47 -0800)
committerRobert Tivy <rtivy@ti.com>
Fri, 13 Feb 2015 19:00:06 +0000 (11:00 -0800)
Added numReservedEntries to MessageQ_Config structure; defines
how many queues to reserve. Moved all LAD config files into cfg
folder to separate configuration data from implementation code.
Added MessageQCfg.c file so users could specify MessageQ config
(such as reserved queues). New concept of queue port number: this
is computed by adding an offset to the queue index. Needed to
avoid collisions with port numbers reserved by services (such as
RPMessage, NameServer). Queue port number is embedded in queueId
and used to address messages. New macro MessageQ_getQueueIndex to
extract queue index from QID. Implemented MessageQ_openQueueId on
Linux. Added port number management to ti.sdo.ipc.MessageQ module.

LAD daemon: removed slot zero reservation for NameServer; added
queue index logic to manage reserved queues; use port number in
queueId construction; reference new MessageQ_cfg object.

TransportRpmsg: replaced queue index references with queue port.

18 files changed:
hlos_common/include/_MessageQ.h
linux/src/api/MessageQ.c
linux/src/daemon/Makefile.am
linux/src/daemon/MessageQ_daemon.c
linux/src/daemon/MultiProc_daemon.c
linux/src/daemon/NameServer_daemon.c
linux/src/daemon/cfg/GateHWSpinlockCfg_dra7xx.c [moved from linux/src/daemon/GateHWSpinlockCfg_dra7xx.c with 95% similarity]
linux/src/daemon/cfg/MessageQCfg.c [new file with mode: 0644]
linux/src/daemon/cfg/MultiProcCfg_66ak2e.c [moved from linux/src/daemon/MultiProcCfg_66ak2e.c with 100% similarity]
linux/src/daemon/cfg/MultiProcCfg_dra7xx.c [moved from linux/src/daemon/MultiProcCfg_dra7xx.c with 100% similarity]
linux/src/daemon/cfg/MultiProcCfg_omap54xx_smp.c [moved from linux/src/daemon/MultiProcCfg_omap54xx_smp.c with 100% similarity]
linux/src/daemon/cfg/MultiProcCfg_omapl138.c [moved from linux/src/daemon/MultiProcCfg_omapl138.c with 100% similarity]
linux/src/daemon/cfg/MultiProcCfg_tci6614.c [moved from linux/src/daemon/MultiProcCfg_tci6614.c with 100% similarity]
linux/src/daemon/cfg/MultiProcCfg_tci6630.c [moved from linux/src/daemon/MultiProcCfg_tci6630.c with 100% similarity]
linux/src/daemon/cfg/MultiProcCfg_tci6638.c [moved from linux/src/daemon/MultiProcCfg_tci6638.c with 100% similarity]
linux/src/transport/TransportRpmsg.c
packages/ti/ipc/MessageQ.h
packages/ti/sdo/ipc/MessageQ.c

index d24a6a168d0c9a04ec3e9d84e7a49b1b9e7d2a0e..d9721079c6102471a7794a5418af3944ca6134f3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2008-2014, Texas Instruments Incorporated
+ *  Copyright (c) 2008-2015 Texas Instruments Incorporated - http://www.ti.com
  *  All rights reserved.
  *
  *  Redistribution and use in source and binary forms, with or without
@@ -41,6 +41,7 @@
 #define MESSAGEQ_H_0xded2
 
 /* Utilities headers */
+#include <ti/ipc/MessageQ.h>
 #include <ti/ipc/NameServer.h>
 
 
@@ -79,7 +80,6 @@ extern "C" {
 /*! Shift for Trace setting */
 #define MessageQ_TRACESHIFT      (UInt) 12
 
-
 /*!
  *  @brief  Structure defining config parameters for the MessageQ Buf module.
  */
@@ -93,6 +93,8 @@ typedef struct MessageQ_Config_tag {
     /*!< Maximum number of MessageQs that can be dynamically created */
     UInt maxNameLen;
     /*!< Maximum length for Message queue names */
+    UInt numReservedEntries;
+    /*!< Number of reserved message queue indexes */
 } MessageQ_Config;
 
 /* =============================================================================
index 1929e173c6ebe49fe2a389e6f59ed3b830ed39e0..a2cbfd6a6abe48505f50564dcec3245f18495fd7 100644 (file)
@@ -70,9 +70,6 @@
 #include <pthread.h>
 #include <semaphore.h>
 
-/* Socket Protocol Family */
-#include <net/rpmsg.h>
-
 #include <ladclient.h>
 #include <_lad.h>
 
@@ -455,7 +452,7 @@ Void MessageQ_Params_init__S(MessageQ_Params *params, Int version)
 }
 
 /*
- *  MessageQ_create - create a MessageQ object for receiving.
+ *  ======== MessageQ_create ========
  */
 MessageQ_Handle MessageQ_create(String name, const MessageQ_Params *pp)
 {
@@ -546,7 +543,6 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params *pp)
    /* Populate the params member */
     memcpy(&obj->params, &ps, sizeof(ps));
 
-    queueIndex = (MessageQ_QueueIndex)(rsp.messageQCreate.queueId & 0x0000ffff);
 
     obj->queue = rsp.messageQCreate.queueId;
     obj->serverHandle = rsp.messageQCreate.serverHandle;
@@ -560,8 +556,11 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params *pp)
         return NULL;
     }
 
+    /* lad returns the queue port # (queueIndex + PORT_OFFSET) */
+    queueIndex = MessageQ_getQueueIndex(rsp.messageQCreate.queueId);
+
     PRINTVERBOSE2("MessageQ_create: creating endpoints for '%s' "
-            "queueIndex %d\n", name, queueIndex)
+            "queueIndex %d\n", (name == NULL) ? "NULL" : name , queueIndex)
 
     for (clusterId = 0; clusterId < MultiProc_MAXPROCESSORS; clusterId++) {
        for (priority = 0; priority < 2; priority++) {
@@ -592,16 +591,13 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params *pp)
         }
     }
 
-    /*
-     * Since LAD's MessageQ_module can grow, we need to be able to grow as well
-     */
+    /* LAD's MessageQ module can grow, we need to grow as well */
     if (queueIndex >= MessageQ_module->numQueues) {
         _MessageQ_grow(queueIndex);
     }
 
-    /*
-     * No need to "allocate" slot since the queueIndex returned by
-     * LAD is guaranteed to be unique.
+    /*  No need to "allocate" slot since the queueIndex returned by
+     *  LAD is guaranteed to be unique.
      */
     MessageQ_module->queues[queueIndex] = (MessageQ_Handle)obj;
 
@@ -609,7 +605,7 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params *pp)
 }
 
 /*
- * MessageQ_delete - delete a MessageQ object.
+ *  ======== MessageQ_delete ========
  */
 Int MessageQ_delete(MessageQ_Handle *handlePtr)
 {
@@ -685,7 +681,8 @@ Int MessageQ_delete(MessageQ_Handle *handlePtr)
         }
     }
 
-    queueIndex = (MessageQ_QueueIndex)(obj->queue & 0x0000ffff);
+    /* extract the queue index from the queueId */
+    queueIndex = MessageQ_getQueueIndex(obj->queue);
     MessageQ_module->queues[queueIndex] = NULL;
 
     free(obj);
@@ -695,7 +692,8 @@ Int MessageQ_delete(MessageQ_Handle *handlePtr)
 }
 
 /*
- *  MessageQ_open - Opens an instance of MessageQ for sending.
+ *  ======== MessageQ_open ========
+ *  Acquire a queueId for use in sending messages to the queue
  */
 Int MessageQ_open(String name, MessageQ_QueueId *queueId)
 {
@@ -730,7 +728,23 @@ Int MessageQ_open(String name, MessageQ_QueueId *queueId)
 }
 
 /*
- *  MessageQ_close - Closes previously opened instance of MessageQ.
+ *  ======== MessageQ_openQueueId ========
+ */
+MessageQ_QueueId MessageQ_openQueueId(UInt16 queueIndex, UInt16 procId)
+{
+    MessageQ_QueueIndex queuePort;
+    MessageQ_QueueId queueId;
+
+    /* queue port is embedded in the queueId */
+    queuePort = queueIndex + MessageQ_PORTOFFSET;
+    queueId = ((MessageQ_QueueId)(procId) << 16) | queuePort;
+
+    return (queueId);
+}
+
+/*
+ *  ======== MessageQ_close ========
+ *  Closes previously opened instance of MessageQ
  */
 Int MessageQ_close(MessageQ_QueueId *queueId)
 {
@@ -743,18 +757,19 @@ Int MessageQ_close(MessageQ_QueueId *queueId)
 }
 
 /*
- * MessageQ_put - place a message onto a message queue.
- *
- * Calls transport's put(), which handles the sending of the message using the
- * appropriate kernel interface (socket, device ioctl) call for the remote
- * procId encoded in the queueId argument.
+ *  ======== MessageQ_put ========
+ *  Place a message onto a message queue
  *
+ *  Calls transport's put(), which handles the sending of the message
+ *  using the appropriate kernel interface (socket, device ioctl) call
+ *  for the remote procId encoded in the queueId argument.
  */
 Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
 {
     MessageQ_Object *obj;
     UInt16   dstProcId  = (UInt16)(queueId >> 16);
-    UInt16   queueIndex = (MessageQ_QueueIndex)(queueId & 0x0000ffff);
+    UInt16   queueIndex;
+    UInt16   queuePort = (MessageQ_QueueIndex)(queueId & 0x0000ffff);
     Int      status = MessageQ_S_SUCCESS;
     ITransport_Handle baseTrans;
     IMessageQTransport_Handle msgTrans;
@@ -763,8 +778,9 @@ Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
     UInt tid;
     UInt16 clusterId;
 
-    msg->dstId     = queueIndex;
-    msg->dstProc   = dstProcId;
+    /* use the queue port # for destination address */
+    msg->dstId = queuePort;
+    msg->dstProc= dstProcId;
 
     /* invoke put hook function after addressing the message */
     if (MessageQ_module->putHookFxn != NULL) {
@@ -823,6 +839,8 @@ Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
         }
         else {
             /* check if destination queue is in this process */
+            queueIndex = queuePort - MessageQ_PORTOFFSET;
+
             if (queueIndex >= MessageQ_module->numQueues) {
                 printf("MessageQ_put: Error: unable to deliver message, "
                         "queueIndex too large or transportId missing.\n");
@@ -1116,7 +1134,11 @@ Void MessageQ_msgInit(MessageQ_Msg msg)
 }
 
 /*
- * Grow module's queues[] array to accommodate queueIndex from LAD
+ *  ======== _MessageQ_grow ========
+ *  Increase module's queues array to accommodate queueIndex from LAD
+ *
+ *  Note: this function takes the queue index value (i.e. without the
+ *  port offset).
  */
 Void _MessageQ_grow(UInt16 queueIndex)
 {
@@ -1126,7 +1148,7 @@ Void _MessageQ_grow(UInt16 queueIndex)
 
     oldSize = MessageQ_module->numQueues * sizeof (MessageQ_Handle);
 
-    queues = calloc(queueIndex + MessageQ_GROWSIZE, sizeof (MessageQ_Handle));
+    queues = calloc(queueIndex + MessageQ_GROWSIZE, sizeof(MessageQ_Handle));
     memcpy(queues, MessageQ_module->queues, oldSize);
 
     oldQueues = MessageQ_module->queues;
@@ -1137,4 +1159,3 @@ Void _MessageQ_grow(UInt16 queueIndex)
 
     return;
 }
-
index 5f337b2e3a34d741b2772567745b57bc9ed4e672..f81f0322dd6e39efa4faa57d00d13bc5fc835448 100644 (file)
@@ -92,6 +92,7 @@ endif
 common_sources = \
                 lad.c \
                 MessageQ_daemon.c \
+                cfg/MessageQCfg.c \
                 MultiProc_daemon.c \
                 NameServer_daemon.c \
                 $(top_srcdir)/linux/include/ti/ipc/Std.h \
@@ -112,7 +113,7 @@ common_sources += \
                 GateMP_daemon.c \
                GateHWSpinlock.c \
                GateHWSpinlock_daemon.c \
-               GateHWSpinlockCfg_dra7xx.c \
+               cfg/GateHWSpinlockCfg_dra7xx.c \
                $(top_srcdir)/linux/src/api/gates/GateMutex.c \
                $(top_srcdir)/linux/include/_GateMP.h \
                 $(top_srcdir)/linux/include/_GateMP_daemon.h \
@@ -127,14 +128,14 @@ endif
 #
 # NOTE:  6636_SOURCES using 6638.c is not a typo!  6636 has the same
 # MultiProc config as 6638, so we reuse that source file.
-lad_omap54xx_smp_SOURCES = $(common_sources) MultiProcCfg_omap54xx_smp.c
-lad_dra7xx_SOURCES = $(common_sources) MultiProcCfg_dra7xx.c
-lad_omapl138_SOURCES = $(common_sources) MultiProcCfg_omapl138.c
-lad_66ak2e_SOURCES = $(common_sources) MultiProcCfg_66ak2e.c
-lad_tci6614_SOURCES = $(common_sources) MultiProcCfg_tci6614.c
-lad_tci6630_SOURCES = $(common_sources) MultiProcCfg_tci6630.c
-lad_tci6636_SOURCES = $(common_sources) MultiProcCfg_tci6638.c
-lad_tci6638_SOURCES = $(common_sources) MultiProcCfg_tci6638.c
+lad_omap54xx_smp_SOURCES = $(common_sources) cfg/MultiProcCfg_omap54xx_smp.c
+lad_dra7xx_SOURCES = $(common_sources) cfg/MultiProcCfg_dra7xx.c
+lad_omapl138_SOURCES = $(common_sources) cfg/MultiProcCfg_omapl138.c
+lad_66ak2e_SOURCES = $(common_sources) cfg/MultiProcCfg_66ak2e.c
+lad_tci6614_SOURCES = $(common_sources) cfg/MultiProcCfg_tci6614.c
+lad_tci6630_SOURCES = $(common_sources) cfg/MultiProcCfg_tci6630.c
+lad_tci6636_SOURCES = $(common_sources) cfg/MultiProcCfg_tci6638.c
+lad_tci6638_SOURCES = $(common_sources) cfg/MultiProcCfg_tci6638.c
 
 common_libraries = -lpthread \
                 $(top_builddir)/linux/src/utils/libtiipcutils_lad.la
index ef6396ee76402380794ad01aebe9e91a9d2909f1..dc301c2652a6ef7ca1d213fee7b3789b9be4306c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Texas Instruments Incorporated - http://www.ti.com
+ * Copyright (c) 2014-2015 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -82,9 +82,6 @@
  */
 #define MessageQ_NAMESERVER  "MessageQ"
 
-/* Slot 0 reserved for NameServer messages: */
-#define RESERVED_MSGQ_INDEX  1
-
 /* Number of entries to grow when we run out of queueIndexs */
 #define MessageQ_GROWSIZE 32
 
@@ -104,7 +101,7 @@ typedef struct MessageQ_ModuleObject {
     /*!< Handle to the local NameServer used for storing GP objects */
     pthread_mutex_t     gate;
     /*!< Handle of gate to be used for local thread safety */
-    MessageQ_Config     cfg;
+    MessageQ_Config    *cfg;
     /*!< Current config values */
     MessageQ_Config     defaultCfg;
     /*!< Default config values */
@@ -139,6 +136,8 @@ typedef struct MessageQ_Object {
  *  Globals
  * =============================================================================
  */
+extern MessageQ_Config ti_ipc_MessageQ_cfg;
+
 static MessageQ_ModuleObject MessageQ_state =
 {
     .refCount               = 0,
@@ -151,9 +150,11 @@ static MessageQ_ModuleObject MessageQ_state =
 #else
     .gate                   = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP,
 #endif
+    .cfg = &ti_ipc_MessageQ_cfg,
     .defaultCfg.traceFlag   = FALSE,
     .defaultCfg.maxRuntimeEntries = 32u,
     .defaultCfg.maxNameLen    = 32u,
+    .defaultCfg.numReservedEntries = 0
 };
 
 /*!
@@ -187,7 +188,7 @@ Void MessageQ_getConfig(MessageQ_Config * cfg)
         memcpy(cfg, &MessageQ_module->defaultCfg, sizeof(MessageQ_Config));
     }
     else {
-        memcpy(cfg, &MessageQ_module->cfg, sizeof(MessageQ_Config));
+        memcpy(cfg, MessageQ_module->cfg, sizeof(MessageQ_Config));
     }
 }
 
@@ -204,24 +205,22 @@ Int MessageQ_setup(const MessageQ_Config * cfg)
     MessageQ_module->refCount++;
     if (MessageQ_module->refCount > 1) {
         status = MessageQ_S_ALREADYSETUP;
-        LOG1("MessageQ module has been already setup, refCount=%d\n", MessageQ_module->refCount)
-
+        LOG1("MessageQ module has been already setup, refCount=%d\n",
+                MessageQ_module->refCount)
         goto exitSetup;
     }
 
     /* Initialize the parameters */
     NameServer_Params_init(&params);
     params.maxValueLen = sizeof(UInt32);
-    params.maxNameLen  = cfg->maxNameLen;
+    params.maxNameLen  = MessageQ_module->cfg->maxNameLen;
 
     /* Create the nameserver for modules */
     MessageQ_module->nameServer = NameServer_create(MessageQ_NAMESERVER,
                                                     &params);
 
-    memcpy(&MessageQ_module->cfg, (void *)cfg, sizeof(MessageQ_Config));
-
     MessageQ_module->seqNum = 0;
-    MessageQ_module->numQueues = cfg->maxRuntimeEntries;
+    MessageQ_module->numQueues = MessageQ_module->cfg->maxRuntimeEntries;
     MessageQ_module->queues = (MessageQ_Handle *)
         calloc(1, sizeof(MessageQ_Handle) * MessageQ_module->numQueues);
     MessageQ_module->canFreeQueues = TRUE;
@@ -271,7 +270,6 @@ Int MessageQ_destroy(void)
         MessageQ_module->queues = NULL;
     }
 
-    memset(&MessageQ_module->cfg, 0, sizeof(MessageQ_Config));
     MessageQ_module->numQueues  = 0u;
 
 exitDestroy:
@@ -291,27 +289,62 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params * params)
     MessageQ_Object   * obj    = NULL;
     Bool                found  = FALSE;
     UInt16              count  = 0;
-    UInt16              queueIndex = 0u;
+    UInt16              queueIndex;
+    UInt16              queuePort;
     UInt16              procId;
     int                 i;
+    UInt                numReserved;
 
-    LOG1("MessageQ_create: creating '%s'\n", name)
+    LOG1("MessageQ_create: creating '%s'\n", (name == NULL) ? "NULL" : name)
 
     /* Create the generic obj */
     obj = (MessageQ_Object *)calloc(1, sizeof(MessageQ_Object));
 
+    if (obj == NULL) {
+        LOG0("MessageQ_create: Error: no memory\n")
+        return (NULL);
+    }
+
+    numReserved = MessageQ_module->cfg->numReservedEntries;
+
     pthread_mutex_lock(&(MessageQ_module->gate));
 
-    count = MessageQ_module->numQueues;
+    /* check if creating a reserved queue */
+    if (params->queueIndex != MessageQ_ANY) {
+        queueIndex = params->queueIndex;
 
-    /* Search the dynamic array for any holes */
-    /* We start from 1, as 0 is reserved for binding NameServer: */
-    for (i = RESERVED_MSGQ_INDEX; i < count ; i++) {
-        if (MessageQ_module->queues [i] == NULL) {
-            MessageQ_module->queues [i] = (MessageQ_Handle)obj;
-            queueIndex = i;
-            found = TRUE;
-            break;
+        if (queueIndex > numReserved) {
+            LOG2("MessageQ_create: Error: requested queue index %d is greater "
+                    "than reserved maximum %d\n", queueIndex, numReserved - 1)
+            free(obj);
+            obj = NULL;
+        }
+        else if (MessageQ_module->queues[queueIndex] != NULL) {
+            LOG1("MessageQ_create: Error: requested queue index %d is already "
+                    "in use.\n", queueIndex);
+            free(obj);
+            obj = NULL;
+        }
+
+        if (obj == NULL) {
+            pthread_mutex_unlock(&(MessageQ_module->gate));
+            return (NULL);
+        }
+
+        MessageQ_module->queues[queueIndex] = (MessageQ_Handle)obj;
+        found = TRUE;
+    }
+    else {
+        count = MessageQ_module->numQueues;
+
+        /* search the dynamic array for any holes */
+        for (i = numReserved; i < count ; i++) {
+            if (MessageQ_module->queues [i] == NULL) {
+                MessageQ_module->queues [i] = (MessageQ_Handle)obj;
+                queueIndex = i;
+                found = TRUE;
+                break;
+            }
         }
     }
 
@@ -327,14 +360,15 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params * params)
         memcpy((Ptr)&obj->params, (Ptr)params, sizeof(MessageQ_Params));
     }
 
+    /* create globally unique message queue ID */
     procId = MultiProc_self();
-    /* create globally unique messageQ ID: */
-    obj->queue = (MessageQ_QueueId)(((UInt32)procId << 16) | queueIndex);
+    queuePort = queueIndex + MessageQ_PORTOFFSET;
+    obj->queue = (MessageQ_QueueId)(((UInt32)procId << 16) | queuePort);
     obj->ownerPid = 0;
 
     if (name != NULL) {
         obj->nsKey = NameServer_addUInt32(MessageQ_module->nameServer, name,
-                                          obj->queue);
+                obj->queue);
     }
 
     /* Cleanup if fail */
@@ -342,7 +376,7 @@ MessageQ_Handle MessageQ_create(String name, const MessageQ_Params * params)
         MessageQ_delete((MessageQ_Handle *)&obj);
     }
 
-    LOG1("MessageQ_create: returning %p\n", obj)
+    LOG2("MessageQ_create: returning obj=%p, qid=0x%x\n", obj, obj->queue)
 
     return ((MessageQ_Handle)obj);
 }
@@ -355,14 +389,16 @@ Int MessageQ_delete(MessageQ_Handle * handlePtr)
     Int              status = MessageQ_S_SUCCESS;
     MessageQ_Object *obj;
     MessageQ_Handle queue;
+    UInt16          queueIndex;
 
     obj = (MessageQ_Object *)(*handlePtr);
 
     LOG1("MessageQ_delete: deleting %p\n", obj)
 
-    queue = MessageQ_module->queues[(MessageQ_QueueIndex)(obj->queue)];
+    queueIndex = MessageQ_getQueueIndex(obj->queue);
+    queue = MessageQ_module->queues[queueIndex];
     if (queue != obj) {
-        LOG1("    ERROR: obj != MessageQ_module->queues[%d]\n", (MessageQ_QueueIndex)(obj->queue))
+        LOG1("ERROR: obj != MessageQ_module->queues[%d]\n", queueIndex)
     }
 
     if (obj->nsKey != NULL) {
@@ -381,7 +417,7 @@ Int MessageQ_delete(MessageQ_Handle * handlePtr)
     pthread_mutex_lock(&(MessageQ_module->gate));
 
     /* Clear the MessageQ obj from array. */
-    MessageQ_module->queues[(MessageQ_QueueIndex)(obj->queue)] = NULL;
+    MessageQ_module->queues[queueIndex] = NULL;
 
     /* Release the local lock */
     pthread_mutex_unlock(&(MessageQ_module->gate));
index 9c1becbda1e398696c550b814bb7de84aaac3c76..a551a4d3480f1094c42ed51c63fa466cbef1c078 100644 (file)
@@ -60,6 +60,7 @@
 Void MultiProc_getConfig (MultiProc_Config * cfg)
 {
     int i;
+    UInt16 baseId;
 
     assert (cfg != NULL);
 
@@ -67,10 +68,11 @@ Void MultiProc_getConfig (MultiProc_Config * cfg)
     memcpy (cfg, &_MultiProc_cfg, sizeof(MultiProc_Config));
 
     LOG1("MultiProc_getConfig() - %d procs\n", _MultiProc_cfg.numProcessors);
-    LOG1("# processors in cluster - %d\n", _MultiProc_cfg.numProcsInCluster);
-    LOG1("base procId of cluster - %d\n", _MultiProc_cfg.baseIdOfCluster);
+    LOG1("# processors in cluster: %d\n", _MultiProc_cfg.numProcsInCluster);
+    baseId = _MultiProc_cfg.baseIdOfCluster;
+    LOG1("cluster baseId: %d\n", baseId);
 
     for (i = 0; i < _MultiProc_cfg.numProcsInCluster; i++) {
-        LOG2("\tProc %d - \"%s\"\n", i, _MultiProc_cfg.nameList[i]);
+        LOG2("\tProcId %d - \"%s\"\n", baseId + i, _MultiProc_cfg.nameList[i]);
     }
 }
index 9d8b0005dc5a9a38ccd45eefbab8323747fac0c2..74cba7199e6554725f0c095e525e4ed99b49a08e 100644 (file)
@@ -457,7 +457,8 @@ Int NameServer_setup(Void)
                  errno, strerror(errno))
         }
         else  {
-            LOG1("NameServer_setup: created send socket: %d\n", sock)
+            LOG2("NameServer_setup: created send socket: %d, procId %d\n",
+                    sock, procId)
             err = ConnectSocket(sock, procId, MESSAGEQ_RPMSG_PORT);
             if (err < 0) {
                 status = NameServer_E_FAIL;
@@ -480,8 +481,8 @@ Int NameServer_setup(Void)
                  errno, strerror(errno))
         }
         else  {
-            LOG1("NameServer_setup: created recv socket: %d\n", sock)
-
+            LOG2("NameServer_setup: created recv socket: %d, procId %d\n",
+                    sock, procId)
             err = SocketBindAddr(sock, procId, NAME_SERVER_RPMSG_ADDR);
             if (err < 0) {
                 status = NameServer_E_FAIL;
similarity index 95%
rename from linux/src/daemon/GateHWSpinlockCfg_dra7xx.c
rename to linux/src/daemon/cfg/GateHWSpinlockCfg_dra7xx.c
index ebe323af6fd1ce7ae9cf478cf4773c71b573ae06..da701b9dbc7a14877b2d953ecf6bbbd6c7a755a6 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Texas Instruments Incorporated
+ * Copyright (c) 2014-2015 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
diff --git a/linux/src/daemon/cfg/MessageQCfg.c b/linux/src/daemon/cfg/MessageQCfg.c
new file mode 100644 (file)
index 0000000..aee79bf
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2015 Texas Instruments Incorporated - http://www.ti.com
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * *  Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * *  Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * *  Neither the name of Texas Instruments Incorporated nor the names of
+ *    its contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*============================================================================
+ *  @file   MessageQCfg.c
+ *
+ *  @brief  Module configuration
+ */
+
+#include <ti/ipc/Std.h>
+#include <_MessageQ.h>
+
+/*
+ *  ======== ti_ipc_MessageQ_cfg ========
+ *  The MessageQ module configuration object
+ */
+MessageQ_Config ti_ipc_MessageQ_cfg = {
+    .traceFlag   = FALSE,
+    .maxRuntimeEntries = 32,
+    .maxNameLen = 32,
+    .numReservedEntries = 8
+};
index cbc602e211974d785401ac2dd034fcd10732406f..2d9898d724dff922f7de5092253206fe12760c74 100644 (file)
@@ -289,7 +289,7 @@ static Int detach(UInt16 rprocId)
 Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
 {
     TransportRpmsg_Object *obj = (TransportRpmsg_Object *)handle;
-    UInt16   queueIndex = queueId & 0x0000ffff;
+    UInt16   queuePort = queueId & 0x0000ffff;
     int      fd;
     int      err;
     uint64_t buf;
@@ -298,7 +298,7 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
     rprocId = obj->rprocId;
 
     PRINTVERBOSE2("TransportRpmsg_bind: creating endpoint for rprocId %d "
-            "queueIndex %d\n", rprocId, queueIndex)
+            "queuePort 0x%x\n", rprocId, queuePort)
 
     /*  Create the socket to receive messages for this messageQ. */
     fd = socket(AF_RPMSG, SOCK_SEQPACKET, 0);
@@ -310,7 +310,7 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
 
     PRINTVERBOSE1("TransportRpmsg_bind: created socket fd %d\n", fd)
 
-    err = SocketBindAddr(fd, rprocId, (UInt32)queueIndex);
+    err = SocketBindAddr(fd, rprocId, (UInt32)queuePort);
     if (err < 0) {
         /* don't hard-printf since this is no longer fatal */
         PRINTVERBOSE2("TransportRpmsg_bind: bind failed: %d (%s)\n",
@@ -330,7 +330,7 @@ Int TransportRpmsg_bind(Void *handle, UInt32 queueId)
 
     pthread_mutex_unlock(&TransportRpmsg_module->gate);
 
-    bindFdToQueueIndex(obj, fd, queueIndex);
+    bindFdToQueueIndex(obj, fd, queuePort);
 
     /*
      * Even though we use the unblock event as just a signalling event with
@@ -353,7 +353,7 @@ exit:
 Int TransportRpmsg_unbind(Void *handle, UInt32 queueId)
 {
     TransportRpmsg_Object *obj = (TransportRpmsg_Object *)handle;
-    UInt16 queueIndex = queueId & 0x0000ffff;
+    UInt16 queuePort = queueId & 0x0000ffff;
     uint64_t buf;
     Int    status = MessageQ_S_SUCCESS;
     int    maxFd;
@@ -361,7 +361,7 @@ Int TransportRpmsg_unbind(Void *handle, UInt32 queueId)
     int    i;
     int    j;
 
-    fd = queueIndexToFd(obj, queueIndex);
+    fd = queueIndexToFd(obj, queuePort);
     if (!fd) {
         PRINTVERBOSE1("TransportRpmsg_unbind: queueId 0x%x not bound\n",
                       queueId)
@@ -410,7 +410,7 @@ Int TransportRpmsg_unbind(Void *handle, UInt32 queueId)
         close(fd);
     }
 
-    unbindQueueIndex(obj, queueIndex);
+    unbindQueueIndex(obj, queuePort);
 
     pthread_mutex_unlock(&TransportRpmsg_module->gate);
 
@@ -620,39 +620,58 @@ exit:
     return status;
 }
 
-Void bindFdToQueueIndex(TransportRpmsg_Object *obj, Int fd, UInt16 qIndex)
+Void bindFdToQueueIndex(TransportRpmsg_Object *obj, Int fd, UInt16 queuePort)
 {
     Int *queues;
     Int *oldQueues;
     UInt oldSize;
+    UInt queueIndex;
 
-    if (qIndex >= obj->numQueues) {
+    /* subtract port offset from queue index */
+    queueIndex = queuePort - MessageQ_PORTOFFSET;
+
+    if (queueIndex >= obj->numQueues) {
         PRINTVERBOSE1("TransportRpmsg_bind: growing numQueues to %d\n",
-                      qIndex + TransportRpmsg_GROWSIZE)
+                queueIndex + TransportRpmsg_GROWSIZE)
 
+        /* allocate larget table */
         oldSize = obj->numQueues * sizeof (Int);
+        queues = calloc(queueIndex + TransportRpmsg_GROWSIZE, sizeof(Int));
 
-        queues = calloc(qIndex + TransportRpmsg_GROWSIZE, sizeof (Int));
+        /* copy contents from old table int new table */
         memcpy(queues, obj->qIndexToFd, oldSize);
 
+        /* swap in new table, delete old table */
         oldQueues = obj->qIndexToFd;
         obj->qIndexToFd = queues;
-        obj->numQueues = qIndex + TransportRpmsg_GROWSIZE;
-
+        obj->numQueues = queueIndex + TransportRpmsg_GROWSIZE;
         free(oldQueues);
     }
 
-    obj->qIndexToFd[qIndex] = fd;
+    /* add new entry */
+    obj->qIndexToFd[queueIndex] = fd;
 }
 
-Void unbindQueueIndex(TransportRpmsg_Object *obj, UInt16 qIndex)
+Void unbindQueueIndex(TransportRpmsg_Object *obj, UInt16 queuePort)
 {
-    obj->qIndexToFd[qIndex] = 0;
+    UInt queueIndex;
+
+    /* subtract port offset from queue index */
+    queueIndex = queuePort - MessageQ_PORTOFFSET;
+
+    /* clear table entry */
+    obj->qIndexToFd[queueIndex] = 0;
 }
 
-Int queueIndexToFd(TransportRpmsg_Object *obj, UInt16 qIndex)
+Int queueIndexToFd(TransportRpmsg_Object *obj, UInt16 queuePort)
 {
-    return obj->qIndexToFd[qIndex];
+    UInt queueIndex;
+
+    /* subtract port offset from queue index */
+    queueIndex = queuePort - MessageQ_PORTOFFSET;
+
+    /* return file descriptor */
+    return (obj->qIndexToFd[queueIndex]);
 }
 
 /*
index 6076189ef7dee4bcc18585ba814ab741a38ff099..87e23153f604bf4026d50c27fb11fd5f776f8266 100644 (file)
@@ -279,6 +279,19 @@ extern "C" {
  */
 #define MessageQ_PRIORITYMASK           (0x3)
 
+/** @cond INTERNAL */
+/*!
+ *  @brief      Offset to avoid collision with reserved ports
+ *
+ *  A queue's port number is computed by adding this offset to the
+ *  queue index. Use the port number to address the message or when
+ *  binding a socket. Computing a port number with this offset avoids
+ *  collisions with reserved port numbers which are typically in the
+ *  same range as the queue indexes.
+ */
+#define MessageQ_PORTOFFSET             (0x800)
+/** @endcond INTERNAL */
+
 /*!
  *  @brief      Extract the destination queue ID from a message.
  *
@@ -345,6 +358,39 @@ extern "C" {
 #define MessageQ_getProcId(queueId)     \
                  ((UInt16)((queueId) >> 16))
 
+/*!
+ *  @brief   Extract the queue index from the given queue ID
+ *
+ *  When creating and opening queues, the queue index is embedded
+ *  into the queue ID using an implementation dependent format. This
+ *  function extracts the queue index from the queue ID.
+ *
+ *  For example, in the MessageQ_put() hook function, you might extract
+ *  the queue index in order to set the transport ID.
+ *
+ *      @code
+ *      Void msgqPutHook(MessageQ_QueueId queueId, MessageQ_Msg msg)
+ *      {
+ *          MessageQ_QueueIndex queueIndex;
+ *          UInt tid;
+ *
+ *          queueIndex = MessageQ_getQueueIndex(queueId);
+ *          ...
+ *          MessageQ_setTransportId(msg, tid);
+ *      }
+ *      @endcode
+ *
+ *  This function performs no error checking. Using an invalid queue ID
+ *  will result in undefined behavior.
+ *
+ *  @param[in]  queueId         Message queue ID of type #MessageQ_QueueId
+ *
+ *  @retval     queueIndex      The queue index of type #MessageQ_QueueIndex
+ */
+#define MessageQ_getQueueIndex(queueId) \
+        (((MessageQ_QueueIndex)((MessageQ_QueueId)0xFFFF & (queueId))) \
+        - MessageQ_PORTOFFSET)
+
 /*!
  *  @brief   Retrieves the message queue ID from a message.
  *
@@ -718,7 +764,7 @@ Int MessageQ_open(String name, MessageQ_QueueId *queueId);
  *  @brief      Opens a MessageQ given the queue index and remote processor ID
  *
  *  This function can be used instead of MessageQ_open() if the queue
- *  was created with a specified QueueIndex. In the example below, the
+ *  was created with a reserved queue index. In the example below, the
  *  serverFxn function must be running on the processor with PROCID 2.
  *
  *      @code
@@ -752,7 +798,7 @@ Int MessageQ_open(String name, MessageQ_QueueId *queueId);
  *  @return     The MessageQ_QueueId associated with the queueIndex
  *              and remoteProcId
  */
-MessageQ_QueueId MessageQ_openQueueId(UInt16 queueIndex, UInt16 remoteProcId);
+MessageQ_QueueId MessageQ_openQueueId(UInt16 queueIndex, UInt16 procId);
 
 /*!
  *  @brief      Close the opened handle
index 3c130e84ed03813cf5b096e3beb2c3efba11b81c..b10171bf545cb10339f8c89928031950263ec0fd 100644 (file)
@@ -466,11 +466,14 @@ Int MessageQ_open(String name, MessageQ_QueueId *queueId)
 /*
  *  ======== MessageQ_openQueueId ========
  */
-MessageQ_QueueId MessageQ_openQueueId(UInt16 queueIndex, UInt16 remoteProcId)
+MessageQ_QueueId MessageQ_openQueueId(UInt16 queueIndex, UInt16 procId)
 {
+    MessageQ_QueueIndex queuePort;
     MessageQ_QueueId queueId;
 
-    queueId = ((MessageQ_QueueId)(remoteProcId) << 16) | queueIndex;
+    /* queue port is embedded in the queueId */
+    queuePort = queueIndex + MessageQ_PORTOFFSET;
+    queueId = ((MessageQ_QueueId)(procId) << 16) | queuePort;
 
     return (queueId);
 }
@@ -494,6 +497,7 @@ Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
     Int tid;
     ITransport_Handle baseTrans;
     INetworkTransport_Handle netTrans;
+    MessageQ_QueueIndex queueIndex;
 
     Assert_isTrue((msg != NULL), ti_sdo_ipc_MessageQ_A_invalidMsg);
 
@@ -510,12 +514,13 @@ Int MessageQ_put(MessageQ_QueueId queueId, MessageQ_Msg msg)
 
     /* if recipient is local, use direct message delivery */
     if (dstProcId == MultiProc_self()) {
-        /* Assert queueId is valid */
-        Assert_isTrue((UInt16)queueId < MessageQ_module->numQueues,
+        /* assert queue index is valid */
+        queueIndex = MessageQ_getQueueIndex(queueId);
+        Assert_isTrue(queueIndex < MessageQ_module->numQueues,
                       ti_sdo_ipc_MessageQ_A_invalidQueueId);
 
         /* It is a local MessageQ */
-        obj = MessageQ_module->queues[(UInt16)(queueId)];
+        obj = MessageQ_module->queues[queueIndex];
 
         /* Assert object is not NULL */
         Assert_isTrue(obj != NULL, ti_sdo_ipc_MessageQ_A_invalidObj);
@@ -904,8 +909,8 @@ Void MessageQ_unregisterTransportId(UInt tid)
 /*
  *  ======== MessageQ_Instance_init ========
  */
-Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj, String name,
-        const ti_sdo_ipc_MessageQ_Params *params, Error_Block *eb)
+Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj,
+        String name, const ti_sdo_ipc_MessageQ_Params *params, Error_Block *eb)
 {
     Int              i;
     UInt16           start;
@@ -915,6 +920,7 @@ Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj, String na
     List_Handle      listHandle;
     SyncSem_Handle   syncSemHandle;
     MessageQ_QueueIndex queueIndex;
+    MessageQ_QueueIndex queuePort;
     Int tid;
     Int status;
     ITransport_Handle baseTrans;
@@ -937,7 +943,6 @@ Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj, String na
         found = TRUE;
     }
     else {
-
         start = ti_sdo_ipc_MessageQ_numReservedEntries;
         count = MessageQ_module->numQueues;
 
@@ -1007,7 +1012,9 @@ Int ti_sdo_ipc_MessageQ_Instance_init(ti_sdo_ipc_MessageQ_Object *obj, String na
     listHandle = ti_sdo_ipc_MessageQ_Instance_State_highList(obj);
     List_construct(List_struct(listHandle), NULL);
 
-    obj->queue = ((MessageQ_QueueId)(MultiProc_self()) << 16) | queueIndex;
+    /* queue port is embedded in the queueId */
+    queuePort = queueIndex + MessageQ_PORTOFFSET;
+    obj->queue = ((MessageQ_QueueId)(MultiProc_self()) << 16) | queuePort;
 
     obj->unblocked = FALSE;
 
@@ -1060,7 +1067,7 @@ Void ti_sdo_ipc_MessageQ_Instance_finalize(
         ti_sdo_ipc_MessageQ_Object* obj, Int status)
 {
     UInt key;
-    MessageQ_QueueIndex index = (MessageQ_QueueIndex)(obj->queue);
+    MessageQ_QueueIndex queueIndex;
     List_Handle listHandle;
     Int tid;
     ITransport_Handle baseTrans;
@@ -1116,7 +1123,8 @@ Void ti_sdo_ipc_MessageQ_Instance_finalize(
     key = IGateProvider_enter(MessageQ_module->gate);
 
     /* Null out entry in the array. */
-    MessageQ_module->queues[index] = NULL;
+    queueIndex = MessageQ_getQueueIndex(obj->queue);
+    MessageQ_module->queues[queueIndex] = NULL;
 
     /* unlock scheduler */
     IGateProvider_leave(MessageQ_module->gate, key);