OPBU Merge: Merge omapzoom VirtQueue API changes into this tree.
authorG Anthony <a0783926@ti.com>
Fri, 22 Feb 2013 01:29:33 +0000 (17:29 -0800)
committerG Anthony <a0783926@ti.com>
Tue, 26 Feb 2013 18:10:37 +0000 (10:10 -0800)
Source: omapzoom.org, sysbios-rpmsg repo, tag: 2.00.11.31.

See commits:
2a18339bd4662731346c3e3acbbd1d55e12f5ecf IPC: Extend VirtQueue slave API
c2a1808c2ceca057c3252d4fa62baa30fcccf4b2 IPC: Redefine VirtQueue ids sequentiall
y for each processor

OMAP5 VirtQueue is not included in this commit.

omapl138/VirtQueue was cleaned up (removed MBOX-isms).

VirtQueue parameters were trimmed, in anticipation of use solely by
MessageQCopy.

This commit breaks TransportVirtio.

Signed-off-by: G Anthony <a0783926@ti.com>
src/ti/ipc/family/omapl138/VirtQueue.c
src/ti/ipc/family/omapl138/VirtQueue.xdc
src/ti/ipc/family/omapl138/VirtQueue.xs
src/ti/ipc/family/tci6614/VirtQueue.c
src/ti/ipc/family/tci6614/VirtQueue.xdc
src/ti/ipc/family/tci6614/VirtQueue.xs
src/ti/ipc/family/tci6638/VirtQueue.c
src/ti/ipc/family/tci6638/VirtQueue.xdc
src/ti/ipc/family/tci6638/VirtQueue.xs

index 317d5f432eaef4c01ee8c2536f37436d53d2cf67..3c449e9d3be4b678fc5aec950546b94d77eeabc4 100644 (file)
 
 #include <string.h>
 
+#include <ti/ipc/rpmsg/_VirtQueue.h>
 #include <ti/ipc/rpmsg/virtio_ring.h>
 
 /* Used for defining the size of the virtqueue registry */
-#define NUM_QUEUES                      5
+#define NUM_QUEUES                      2
 
 /* Predefined device addresses */
 #define IPU_MEM_VRING0          0xc3000000
 #define IPU_MEM_VRING1          0xc3004000
 
-#define CONSOLE_VRING0_PA       0xc3008000
-#define CONSOLE_VRING1_PA       0xc300c000
-
-/*
- * enum - Predefined Mailbox Messages
- *
- * @RP_MSG_MBOX_READY: informs the M3's that we're up and running. will be
- * followed by another mailbox message that carries the A9's virtual address
- * of the shared buffer. This would allow the A9's drivers to send virtual
- * addresses of the buffers.
- *
- * @RP_MSG_MBOX_STATE_CHANGE: informs the receiver that there is an inbound
- * message waiting in its own receive-side vring. please note that currently
- * this message is optional: alternatively, one can explicitly send the index
- * of the triggered virtqueue itself. the preferred approach will be decided
- * as we progress and experiment with those design ideas.
- *
- * @RP_MSG_MBOX_CRASH: this message indicates that the BIOS side is unhappy
- *
- * @RP_MBOX_ECHO_REQUEST: this message requests the remote processor to reply
- * with RP_MBOX_ECHO_REPLY
- *
- * @RP_MBOX_ECHO_REPLY: this is a reply that is sent when RP_MBOX_ECHO_REQUEST
- * is received.
- *
- * @RP_MBOX_ABORT_REQUEST:  tells the M3 to crash on demand
- */
-enum {
-    RP_MSG_MBOX_READY           = (Int)0xFFFFFF00,
-    RP_MSG_MBOX_STATE_CHANGE    = (Int)0xFFFFFF01,
-    RP_MSG_MBOX_CRASH           = (Int)0xFFFFFF02,
-    RP_MBOX_ECHO_REQUEST        = (Int)0xFFFFFF03,
-    RP_MBOX_ECHO_REPLY          = (Int)0xFFFFFF04,
-    RP_MBOX_ABORT_REQUEST       = (Int)0xFFFFFF05,
-    RP_MSG_FLUSH_CACHE          = (Int)0xFFFFFF06,
-    RP_MSG_HIBERNATION          = (Int)0xFFFFFF07
-};
 
 #define DIV_ROUND_UP(n,d)   (((n) + (d) - 1) / (d))
-#define RP_MSG_BUFS_SPACE   (VirtQueue_RP_MSG_NUM_BUFS * VirtQueue_RP_MSG_BUF_SIZE * 2)
+#define RP_MSG_BUFS_SPACE   (VirtQueue_RP_MSG_NUM_BUFS * RPMSG_BUF_SIZE * 2)
 
 /* With 256 buffers, our vring will occupy 3 pages */
 #define RP_MSG_RING_SIZE    ((DIV_ROUND_UP(vring_size(VirtQueue_RP_MSG_NUM_BUFS, \
@@ -156,6 +120,48 @@ static inline UInt mapVAtoPA(Void * va)
     return ((UInt)va & 0x000fffffU) | 0xc9000000U;
 }
 
+/*
+ * ======== VirtQueue_Instance_init ========
+ */
+Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
+                             const VirtQueue_Params *params)
+{
+    void *vringAddr = NULL;
+    Error_Block eb;
+
+    VirtQueue_module->traceBufPtr = Resource_getTraceBufPtr();
+
+    Error_init(&eb);
+
+    vq->vringPtr = Memory_calloc(NULL, sizeof(struct vring), 0, &eb);
+    Assert_isTrue((vq->vringPtr != NULL), NULL);
+
+    vq->callback = params->callback;
+    vq->id = params->vqId;
+    vq->procId = remoteProcId;
+    vq->last_avail_idx = 0;
+    vq->last_used_idx = 0;
+    vq->num_free = VirtQueue_RP_MSG_NUM_BUFS;
+
+    switch (vq->id) {
+    /* sysm3 rpmsg vrings */
+        case ID_DSP_TO_A9:
+            vringAddr = (struct vring *) IPU_MEM_VRING0;
+            break;
+        case ID_A9_TO_DSP:
+            vringAddr = (struct vring *) IPU_MEM_VRING1;
+            break;
+    }
+
+    Log_print3(Diags_USER1,
+            "vring: %d 0x%x (0x%x)\n", vq->id, (IArg)vringAddr,
+            RP_MSG_RING_SIZE);
+
+    vring_init(vq->vringPtr, VirtQueue_RP_MSG_NUM_BUFS, vringAddr, VirtQueue_RP_MSG_VRING_ALIGN);
+
+    queueRegistry[vq->id] = vq;
+}
+
 /*
  * ======== VirtQueue_kick ========
  */
@@ -182,7 +188,7 @@ Void VirtQueue_kick(VirtQueue_Handle vq)
 /*
  * ======== VirtQueue_addUsedBuf ========
  */
-Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head)
+Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head, Int len)
 {
     struct vring_used_elem *used;
     struct vring *vring = vq->vringPtr;
@@ -197,7 +203,7 @@ Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head)
     */
     used = &vring->used->ring[vring->used->idx % vring->num];
     used->id = head;
-    used->len = VirtQueue_RP_MSG_BUF_SIZE;
+    used->len = len;
 
     vring->used->idx++;
 
@@ -222,7 +228,7 @@ Int VirtQueue_addAvailBuf(VirtQueue_Object *vq, Void *buf)
     avail =  vring->avail->idx++ % vring->num;
 
     vring->desc[avail].addr = mapVAtoPA(buf);
-    vring->desc[avail].len = VirtQueue_RP_MSG_BUF_SIZE;
+    vring->desc[avail].len = RPMSG_BUF_SIZE;
 
     return (vq->num_free);
 }
@@ -253,7 +259,7 @@ Void *VirtQueue_getUsedBuf(VirtQueue_Object *vq)
 /*
  * ======== VirtQueue_getAvailBuf ========
  */
-Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
+Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
 {
     UInt16 head;
     struct vring *vring = vq->vringPtr;
@@ -267,9 +273,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
     if (vq->last_avail_idx == vring->avail->idx) {
         /* We need to know about added buffers */
         vring->used->flags &= ~VRING_USED_F_NO_NOTIFY;
-        /* check again after setting flag */
-        if (vq->last_avail_idx == vring->avail->idx)
-            return -1;
+        return (-1);
     }
 
     /* No need to be kicked about added buffers anymore */
@@ -282,13 +286,14 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
     head = vring->avail->ring[vq->last_avail_idx++ % vring->num];
 
     *buf = mapPAtoVA(vring->desc[head].addr);
+    *len = vring->desc[head].len;
 
     return (head);
 }
 
 /*
  * ======== VirtQueue_isr ========
- * Note 'arg' is ignored: it is the Hwi argument, not the mailbox argument.
+ * Note 'msg' is ignored: it is only used where there is a mailbox payload.
  */
 Void VirtQueue_isr(UArg msg)
 {
@@ -300,7 +305,6 @@ Void VirtQueue_isr(UArg msg)
     intInfo.localIntId = DSPEVENTID;
     intInfo.remoteIntId = DSP2ARM_CHIPINT0;
 
-    Assert_isTrue((InterruptDsp_isIntSet(msg, &intInfo) == TRUE), NULL);
     InterruptDsp_intClear(msg, &intInfo);
 
     vq = queueRegistry[0];
@@ -314,57 +318,6 @@ Void VirtQueue_isr(UArg msg)
 }
 
 
-/*
- * ======== VirtQueue_create ========
- */
-Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
-                             const VirtQueue_Params *params)
-{
-    void *vring_phys = NULL;
-    Error_Block eb;
-
-    VirtQueue_module->traceBufPtr = Resource_getTraceBufPtr();
-
-    Error_init(&eb);
-
-    vq->vringPtr = Memory_calloc(NULL, sizeof(struct vring), 0, &eb);
-    Assert_isTrue((vq->vringPtr != NULL), NULL);
-
-    vq->callback = params->callback;
-    vq->id = VirtQueue_module->numQueues++;
-    vq->procId = remoteProcId;
-    vq->last_avail_idx = 0;
-    vq->last_used_idx = 0;
-    vq->num_free = VirtQueue_RP_MSG_NUM_BUFS;
-    vq->swiHandle = params->swiHandle;
-
-    switch (vq->id) {
-    /* sysm3 rpmsg vrings */
-        case ID_DSP_TO_A9:
-            vring_phys = (struct vring *) IPU_MEM_VRING0;
-            break;
-        case ID_A9_TO_DSP:
-            vring_phys = (struct vring *) IPU_MEM_VRING1;
-            break;
-
-    /* sysm3 console vrings */
-        case CONSOLE_DSP_TO_A9:
-            vring_phys = (struct vring *) CONSOLE_VRING0_PA;
-            break;
-        case CONSOLE_A9_TO_DSP:
-            vring_phys = (struct vring *) CONSOLE_VRING1_PA;
-            break;
-    }
-
-    Log_print3(Diags_USER1,
-            "vring: %d 0x%x (0x%x)\n", vq->id, (IArg)vring_phys,
-            RP_MSG_RING_SIZE);
-
-    vring_init(vq->vringPtr, VirtQueue_RP_MSG_NUM_BUFS, vring_phys, VirtQueue_RP_MSG_VRING_ALIGN);
-
-    queueRegistry[vq->id] = vq;
-}
-
 /*
  * ======== VirtQueue_startup ========
  */
@@ -384,13 +337,7 @@ Void VirtQueue_startup(UInt16 remoteProcId, Bool isHost)
     while (InterruptDsp_isIntSet(remoteProcId, &intInfo) == FALSE);
     InterruptDsp_intClear(remoteProcId, &intInfo);
 
-    /*
-     *  DSP can be used to prototype communications with CORE0 instead of
-     *  HOST
-     */
-    if (MultiProc_self() == VirtQueue_dspProcId) {
-        InterruptDsp_intRegister(remoteProcId, &intInfo, (Fxn)VirtQueue_isr, NULL);
-    }
+    InterruptDsp_intRegister(remoteProcId, &intInfo, (Fxn)VirtQueue_isr, NULL);
     Log_print0(Diags_USER1, "Passed VirtQueue_startup\n");
 }
 
@@ -410,25 +357,6 @@ UInt16 VirtQueue_getId(VirtQueue_Handle vq)
   return (vq->id);
 }
 
-Swi_Handle VirtQueue_getSwiHandle(VirtQueue_Handle vq)
-{
-  return (vq->swiHandle);
-}
-
-/*
- * ======== postCrashToMailbox ========
- */
-Void postCrashToMailbox(Error_Block * eb)
-{
-    IInterrupt_IntInfo intInfo;
-
-    intInfo.remoteIntId = DSP2ARM_CHIPINT0;
-
-    Error_print(eb);
-    InterruptDsp_intSend(0, &intInfo, (UInt)RP_MSG_MBOX_CRASH);
-}
-
-
 #define CACHE_WB_TICK_PERIOD    5
 
 /*
@@ -453,4 +381,5 @@ Void VirtQueue_cacheWb()
     Assert_isTrue((VirtQueue_module->traceBufPtr != NULL), NULL);
     Cache_wb(VirtQueue_module->traceBufPtr, SysMin_bufSize, Cache_Type_ALL,
              FALSE);
+
 }
index 58eecdff5619e9ff788134f04f4e4132e30d4fd6..8c1a2c64ce26baeb635b4f820922863e8deadd15 100644 (file)
@@ -143,8 +143,6 @@ module VirtQueue
 
     /* See VirtQueue.c also for other constants:   */
     config UInt RP_MSG_NUM_BUFS = VQ0_SIZE; /* must be power of two */
-    config UInt RP_MSG_BUF_SIZE = 512;
-
 
     config UInt PAGE_SIZE = 4096;
 
@@ -278,6 +276,7 @@ instance:
      *
      *  @param[in]  vq        the VirtQueue.
      *  @param[out] buf       Pointer to location of available buffer;
+     *  @param[out] len       Length of the available buffer message.
      *
      *  @return     Returns a token used to identify the available buffer, to be
      *              passed back into VirtQueue_addUsedBuf();
@@ -286,31 +285,28 @@ instance:
      *  @sa         VirtQueue_addUsedBuf
      */
     @DirectCall
-    Int16 getAvailBuf(Void **buf);
+    Int16 getAvailBuf(Void **buf, Int *len);
 
     /*!
      *  @brief      Add used buffer to virtqueue's used buffer list.
      *              Only used by Slave.
      *
      *  @param[in]  vq        the VirtQueue.
-     *  @param[in]  token     token of the buffer to be added to vring used list.
+     *  @param[in]  token     token of the buffer added to vring used list.
+     *  @param[in]  len       length of the message being added.
      *
      *  @return     Remaining capacity of queue or a negative error.
      *
      *  @sa         VirtQueue_getAvailBuf
      */
     @DirectCall
-    Int addUsedBuf(Int16 head);
+    Int addUsedBuf(Int16 token, Int len);
 
     // -------- Handle Parameters --------
 
-    config Bool host = false;
-
     config Fxn callback = null;
 
-    config Swi.Handle swiHandle = null;
-
-    config UInt intVectorId = ~1u;
+    config Int vqId = 0;
 
     // -------- Handle Functions --------
 
@@ -336,7 +332,6 @@ internal:   /* not for client use */
      */
     struct Module_State
     {
-        UInt16 numQueues;
         UInt16 hostSlaveSynced;
         UInt16 virtQueueInitialized;
         UInt32 *queueRegistry;
@@ -351,7 +346,6 @@ internal:   /* not for client use */
         Bool hostSlaveSynced;
         UInt16 id;
         Fxn callback;
-        Swi.Handle swiHandle;
         Void *vringPtr;
         UInt16 num_free;
         UInt16 last_avail_idx;
index 0d19236dfe1b157f31f7157faa39698e36e0a17e..e97e5cb4de96fde141c8dda149335a29da04ca5f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, Texas Instruments Incorporated
+ * Copyright (c) 2012-2013, Texas Instruments Incorporated
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -45,7 +45,6 @@ function module$use()
     xdc.useModule("ti.ipc.remoteproc.Resource");
 
     this.hostProcId = MultiProc.getIdMeta("HOST");
-    this.dspProcId = MultiProc.getIdMeta("DSP");
 }
 
 /*
@@ -54,7 +53,6 @@ function module$use()
 function module$static$init(mod, params)
 {
   /* Init VirtQueue params */
-  mod.numQueues = 0;
   mod.hostSlaveSynced = 0;
   mod.virtQueueInitialized = 0;
   mod.queueRegistry = null;
index e8258cf900d5df68fcff814b0e999d18972b3f0a..208a8f50ebfb6591b08f09f353127cf0725c6233 100644 (file)
 
 #include <string.h>
 
+#include <ti/ipc/rpmsg/_VirtQueue.h>
 #include <ti/ipc/rpmsg/virtio_ring.h>
 
 /* Used for defining the size of the virtqueue registry */
 #define NUM_QUEUES                      2
 
 #define DIV_ROUND_UP(n,d)   (((n) + (d) - 1) / (d))
-#define RP_MSG_BUFS_SPACE   (VirtQueue_RP_MSG_NUM_BUFS * VirtQueue_RP_MSG_BUF_SIZE * 2)
+#define RP_MSG_BUFS_SPACE   (VirtQueue_RP_MSG_NUM_BUFS * RPMSG_BUF_SIZE * 2)
 
 /* With 256 buffers, our vring will occupy 3 pages */
 #define RP_MSG_RING_SIZE    ((DIV_ROUND_UP(vring_size(VirtQueue_RP_MSG_NUM_BUFS, \
@@ -106,9 +107,6 @@ static VirtQueue_Object *queueRegistry[NUM_QUEUES] = {NULL};
     offset = (DNUM * VirtQueue_VRING_OFFSET);
     va = (Void *)((pa & 0x000fffffU) | offset | 0xa0000000U);
 
-    Log_print3(Diags_USER1,
-            "mapPAtoVA: pa: 0x%x, offset: 0x%x, va: 0x%x\n",
-             pa, offset, (UInt)va);
     return va;
 }
 
@@ -148,7 +146,7 @@ Void VirtQueue_init()
 Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
                              const VirtQueue_Params *params)
 {
-    void *vring_phys = NULL;
+    void *vringAddr = NULL;
     Error_Block eb;
 
     VirtQueue_module->traceBufPtr = Resource_getTraceBufPtr();
@@ -159,7 +157,7 @@ Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
     Assert_isTrue((vq->vringPtr != NULL), NULL);
 
     vq->callback = params->callback;
-    vq->id = VirtQueue_module->numQueues++;
+    vq->id = params->vqId;
     vq->procId = remoteProcId;
     vq->last_avail_idx = 0;
     vq->last_used_idx = 0;
@@ -168,20 +166,20 @@ Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
 
     switch (vq->id) {
         case ID_DSP_TO_A9:
-            vring_phys = (struct vring *) (VirtQueue_CORE0_MEM_VRING0 +
+            vringAddr = (struct vring *) (VirtQueue_CORE0_MEM_VRING0 +
                 (DNUM * VirtQueue_VRING_OFFSET));
             break;
         case ID_A9_TO_DSP:
-            vring_phys = (struct vring *) (VirtQueue_CORE0_MEM_VRING1 +
+            vringAddr = (struct vring *) (VirtQueue_CORE0_MEM_VRING1 +
                 (DNUM * VirtQueue_VRING_OFFSET));
             break;
     }
 
     Log_print3(Diags_USER1,
-            "vring: %d 0x%x (0x%x)\n", vq->id, (IArg)vring_phys,
+            "vring: %d 0x%x (0x%x)\n", vq->id, (IArg)vringAddr,
             RP_MSG_RING_SIZE);
 
-    vring_init(vq->vringPtr, VirtQueue_RP_MSG_NUM_BUFS, vring_phys, VirtQueue_RP_MSG_VRING_ALIGN);
+    vring_init(vq->vringPtr, VirtQueue_RP_MSG_NUM_BUFS, vringAddr, VirtQueue_RP_MSG_VRING_ALIGN);
 
     queueRegistry[vq->id] = vq;
 }
@@ -191,8 +189,8 @@ Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
  */
 Void VirtQueue_kick(VirtQueue_Handle vq)
 {
-    IInterrupt_IntInfo intInfo;
     struct vring *vring = vq->vringPtr;
+    IInterrupt_IntInfo intInfo;
 
     /* For now, simply interrupt remote processor */
     if (vring->avail->flags & VRING_AVAIL_F_NO_INTERRUPT) {
@@ -212,7 +210,7 @@ Void VirtQueue_kick(VirtQueue_Handle vq)
 /*
  * ======== VirtQueue_addUsedBuf ========
  */
-Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head)
+Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head, Int len)
 {
     struct vring_used_elem *used;
     struct vring *vring = vq->vringPtr;
@@ -227,7 +225,7 @@ Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head)
     */
     used = &vring->used->ring[vring->used->idx % vring->num];
     used->id = head;
-    used->len = VirtQueue_RP_MSG_BUF_SIZE;
+    used->len = len;
 
     vring->used->idx++;
 
@@ -252,7 +250,7 @@ Int VirtQueue_addAvailBuf(VirtQueue_Object *vq, Void *buf)
     avail =  vring->avail->idx++ % vring->num;
 
     vring->desc[avail].addr = mapVAtoPA(buf);
-    vring->desc[avail].len = VirtQueue_RP_MSG_BUF_SIZE;
+    vring->desc[avail].len = RPMSG_BUF_SIZE;
 
     return (vq->num_free);
 }
@@ -283,7 +281,7 @@ Void *VirtQueue_getUsedBuf(VirtQueue_Object *vq)
 /*
  * ======== VirtQueue_getAvailBuf ========
  */
-Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
+Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
 {
     UInt16 head;
     struct vring *vring = vq->vringPtr;
@@ -297,9 +295,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
     if (vq->last_avail_idx == vring->avail->idx) {
         /* We need to know about added buffers */
         vring->used->flags &= ~VRING_USED_F_NO_NOTIFY;
-        /* check again after setting flag */
-        if (vq->last_avail_idx == vring->avail->idx)
-            return -1;
+        return (-1);
     }
 
     /* No need to be kicked about added buffers anymore */
@@ -312,6 +308,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
     head = vring->avail->ring[vq->last_avail_idx++ % vring->num];
 
     *buf = mapPAtoVA(vring->desc[head].addr);
+    *len = vring->desc[head].len;
 
     return (head);
 }
index ad5d2ee2a907ae21c2bc3226cfe35a352de1929d..498dbbb2fa148bce42130f37c9d5228411ab7579 100644 (file)
@@ -149,8 +149,6 @@ module VirtQueue
 
     /* See VirtQueue.c also for other constants:   */
     config UInt RP_MSG_NUM_BUFS = VQ0_SIZE; /* must be power of two */
-    config UInt RP_MSG_BUF_SIZE = 512;
-
 
     config UInt PAGE_SIZE = 4096;
 
@@ -284,6 +282,7 @@ instance:
      *
      *  @param[in]  vq        the VirtQueue.
      *  @param[out] buf       Pointer to location of available buffer;
+     *  @param[out] len       Length of the available buffer message.
      *
      *  @return     Returns a token used to identify the available buffer, to be
      *              passed back into VirtQueue_addUsedBuf();
@@ -292,21 +291,22 @@ instance:
      *  @sa         VirtQueue_addUsedBuf
      */
     @DirectCall
-    Int16 getAvailBuf(Void **buf);
+    Int16 getAvailBuf(Void **buf, Int *len);
 
     /*!
      *  @brief      Add used buffer to virtqueue's used buffer list.
      *              Only used by Slave.
      *
      *  @param[in]  vq        the VirtQueue.
-     *  @param[in]  token     token of the buffer to be added to vring used list.
+     *  @param[in]  token     token of the buffer added to vring used list.
+     *  @param[in]  len       length of the message being added.
      *
      *  @return     Remaining capacity of queue or a negative error.
      *
      *  @sa         VirtQueue_getAvailBuf
      */
     @DirectCall
-    Int addUsedBuf(Int16 head);
+    Int addUsedBuf(Int16 token, Int len);
 
     // -------- Handle Parameters --------
 
@@ -318,10 +318,15 @@ instance:
 
     config UInt intVectorId = ~1u;
 
+    config Int vqId = 0;
+
     // -------- Handle Functions --------
 
 internal:   /* not for client use */
 
+    /*! Statically retrieve procIds to avoid doing this at runtime */
+    config UInt hostProcId  = MultiProc.INVALIDID;
+
     void init();
 
     /*!
@@ -340,7 +345,6 @@ internal:   /* not for client use */
      */
     struct Module_State
     {
-        UInt16 numQueues;
         UInt16 hostSlaveSynced;
         UInt16 virtQueueInitialized;
         UInt32 *queueRegistry;
index 8f16ba4b018115b4055d0f588dc9aba5d84e24f8..642a58a527218187b2aea5f364ecd5fbcad05e47 100644 (file)
@@ -50,6 +50,8 @@ function module$use()
         var Startup = xdc.useModule('xdc.runtime.Startup');
         Startup.firstFxns.$add(VirtQueue.init);
     }
+
+    this.hostProcId = MultiProc.getIdMeta("HOST");
 }
 
 /*
@@ -58,7 +60,6 @@ function module$use()
 function module$static$init(mod, params)
 {
   /* Init VirtQueue params */
-  mod.numQueues = 0;
   mod.hostSlaveSynced = 0;
   mod.virtQueueInitialized = 0;
   mod.queueRegistry = null;
index bf0dbbe2d5daad8ea88f1e52e013e7bf4a83b820..05671464f852574d4583596745b7471d3fb084ff 100644 (file)
 
 #include <string.h>
 
+#include <ti/ipc/rpmsg/_VirtQueue.h>
 #include <ti/ipc/rpmsg/virtio_ring.h>
 
 /* Used for defining the size of the virtqueue registry */
 #define NUM_QUEUES                      2
 
 #define DIV_ROUND_UP(n,d)   (((n) + (d) - 1) / (d))
-#define RP_MSG_BUFS_SPACE   (VirtQueue_RP_MSG_NUM_BUFS * VirtQueue_RP_MSG_BUF_SIZE * 2)
+#define RP_MSG_BUFS_SPACE   (VirtQueue_RP_MSG_NUM_BUFS * RPMSG_BUF_SIZE * 2)
 
 /* With 256 buffers, our vring will occupy 3 pages */
 #define RP_MSG_RING_SIZE    ((DIV_ROUND_UP(vring_size(VirtQueue_RP_MSG_NUM_BUFS, \
@@ -138,7 +139,7 @@ Void VirtQueue_init()
 Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
                              const VirtQueue_Params *params)
 {
-    void *vring_phys = NULL;
+    void *vringAddr = NULL;
     Error_Block eb;
 
     VirtQueue_module->traceBufPtr = Resource_getTraceBufPtr();
@@ -149,7 +150,7 @@ Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
     Assert_isTrue((vq->vringPtr != NULL), NULL);
 
     vq->callback = params->callback;
-    vq->id = VirtQueue_module->numQueues++;
+    vq->id = params->vqId;
     vq->procId = remoteProcId;
     vq->last_avail_idx = 0;
     vq->last_used_idx = 0;
@@ -158,20 +159,20 @@ Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
 
     switch (vq->id) {
         case ID_DSP_TO_A9:
-            vring_phys = (struct vring *) (VirtQueue_CORE0_MEM_VRING0 +
+            vringAddr = (struct vring *) (VirtQueue_CORE0_MEM_VRING0 +
                 (DNUM * VirtQueue_VRING_OFFSET));
             break;
         case ID_A9_TO_DSP:
-            vring_phys = (struct vring *) (VirtQueue_CORE0_MEM_VRING1 +
+            vringAddr = (struct vring *) (VirtQueue_CORE0_MEM_VRING1 +
                 (DNUM * VirtQueue_VRING_OFFSET));
             break;
     }
 
     Log_print3(Diags_USER1,
-            "vring: %d 0x%x (0x%x)\n", vq->id, (IArg)vring_phys,
+            "vring: %d 0x%x (0x%x)\n", vq->id, (IArg)vringAddr,
             RP_MSG_RING_SIZE);
 
-    vring_init(vq->vringPtr, VirtQueue_RP_MSG_NUM_BUFS, vring_phys, VirtQueue_RP_MSG_VRING_ALIGN);
+    vring_init(vq->vringPtr, VirtQueue_RP_MSG_NUM_BUFS, vringAddr, VirtQueue_RP_MSG_VRING_ALIGN);
 
     queueRegistry[vq->id] = vq;
 }
@@ -181,8 +182,8 @@ Void VirtQueue_Instance_init(VirtQueue_Object *vq, UInt16 remoteProcId,
  */
 Void VirtQueue_kick(VirtQueue_Handle vq)
 {
-    IInterrupt_IntInfo intInfo;
     struct vring *vring = vq->vringPtr;
+    IInterrupt_IntInfo intInfo;
 
     /* For now, simply interrupt remote processor */
     if (vring->avail->flags & VRING_AVAIL_F_NO_INTERRUPT) {
@@ -202,7 +203,7 @@ Void VirtQueue_kick(VirtQueue_Handle vq)
 /*
  * ======== VirtQueue_addUsedBuf ========
  */
-Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head)
+Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head, Int len)
 {
     struct vring_used_elem *used;
     struct vring *vring = vq->vringPtr;
@@ -217,7 +218,7 @@ Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head)
     */
     used = &vring->used->ring[vring->used->idx % vring->num];
     used->id = head;
-    used->len = VirtQueue_RP_MSG_BUF_SIZE;
+    used->len = len;
 
     vring->used->idx++;
 
@@ -242,7 +243,7 @@ Int VirtQueue_addAvailBuf(VirtQueue_Object *vq, Void *buf)
     avail =  vring->avail->idx++ % vring->num;
 
     vring->desc[avail].addr = mapVAtoPA(buf);
-    vring->desc[avail].len = VirtQueue_RP_MSG_BUF_SIZE;
+    vring->desc[avail].len = RPMSG_BUF_SIZE;
 
     return (vq->num_free);
 }
@@ -273,7 +274,7 @@ Void *VirtQueue_getUsedBuf(VirtQueue_Object *vq)
 /*
  * ======== VirtQueue_getAvailBuf ========
  */
-Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
+Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
 {
     UInt16 head;
     struct vring *vring = vq->vringPtr;
@@ -287,9 +288,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
     if (vq->last_avail_idx == vring->avail->idx) {
         /* We need to know about added buffers */
         vring->used->flags &= ~VRING_USED_F_NO_NOTIFY;
-        /* check again after setting flag */
-        if (vq->last_avail_idx == vring->avail->idx)
-            return -1;
+        return (-1);
     }
 
     /* No need to be kicked about added buffers anymore */
@@ -302,6 +301,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf)
     head = vring->avail->ring[vq->last_avail_idx++ % vring->num];
 
     *buf = mapPAtoVA(vring->desc[head].addr);
+    *len = vring->desc[head].len;
 
     return (head);
 }
index ad5d2ee2a907ae21c2bc3226cfe35a352de1929d..498dbbb2fa148bce42130f37c9d5228411ab7579 100644 (file)
@@ -149,8 +149,6 @@ module VirtQueue
 
     /* See VirtQueue.c also for other constants:   */
     config UInt RP_MSG_NUM_BUFS = VQ0_SIZE; /* must be power of two */
-    config UInt RP_MSG_BUF_SIZE = 512;
-
 
     config UInt PAGE_SIZE = 4096;
 
@@ -284,6 +282,7 @@ instance:
      *
      *  @param[in]  vq        the VirtQueue.
      *  @param[out] buf       Pointer to location of available buffer;
+     *  @param[out] len       Length of the available buffer message.
      *
      *  @return     Returns a token used to identify the available buffer, to be
      *              passed back into VirtQueue_addUsedBuf();
@@ -292,21 +291,22 @@ instance:
      *  @sa         VirtQueue_addUsedBuf
      */
     @DirectCall
-    Int16 getAvailBuf(Void **buf);
+    Int16 getAvailBuf(Void **buf, Int *len);
 
     /*!
      *  @brief      Add used buffer to virtqueue's used buffer list.
      *              Only used by Slave.
      *
      *  @param[in]  vq        the VirtQueue.
-     *  @param[in]  token     token of the buffer to be added to vring used list.
+     *  @param[in]  token     token of the buffer added to vring used list.
+     *  @param[in]  len       length of the message being added.
      *
      *  @return     Remaining capacity of queue or a negative error.
      *
      *  @sa         VirtQueue_getAvailBuf
      */
     @DirectCall
-    Int addUsedBuf(Int16 head);
+    Int addUsedBuf(Int16 token, Int len);
 
     // -------- Handle Parameters --------
 
@@ -318,10 +318,15 @@ instance:
 
     config UInt intVectorId = ~1u;
 
+    config Int vqId = 0;
+
     // -------- Handle Functions --------
 
 internal:   /* not for client use */
 
+    /*! Statically retrieve procIds to avoid doing this at runtime */
+    config UInt hostProcId  = MultiProc.INVALIDID;
+
     void init();
 
     /*!
@@ -340,7 +345,6 @@ internal:   /* not for client use */
      */
     struct Module_State
     {
-        UInt16 numQueues;
         UInt16 hostSlaveSynced;
         UInt16 virtQueueInitialized;
         UInt32 *queueRegistry;
index dcc5f3e601c4a44a1335161dbfe36e76565e8723..77a06e4c395ac8415887c1d7f0cb71fdebc5fc12 100644 (file)
  */
 
 
- /*
+/*
  *  ======== module$use ========
  */
 function module$use()
 {
-
     VirtQueue = this;
     var MultiProc   = xdc.useModule("ti.sdo.utils.MultiProc");
 
@@ -51,6 +50,8 @@ function module$use()
         var Startup = xdc.useModule('xdc.runtime.Startup');
         Startup.firstFxns.$add(VirtQueue.init);
     }
+
+    this.hostProcId = MultiProc.getIdMeta("HOST");
 }
 
 /*
@@ -59,7 +60,6 @@ function module$use()
 function module$static$init(mod, params)
 {
   /* Init VirtQueue params */
-  mod.numQueues = 0;
   mod.hostSlaveSynced = 0;
   mod.virtQueueInitialized = 0;
   mod.queueRegistry = null;