In VirtQueue_create, clear the VRING_USED_F_NO_NOTIFY flag to ensure all VirtQueue_ki...
[ipc/ipcdev.git] / packages / ti / ipc / family / vayu / VirtQueue.c
index f7cdf2ce5c64c6e77ae04dbcff88aceca851ff36..8d3b4c4a8824a16926c3b8211d181ec0f61a5b2d 100644 (file)
@@ -62,7 +62,7 @@
 
 #include <ti/sysbios/hal/Hwi.h>
 #include <ti/sysbios/knl/Clock.h>
-#include <ti/sysbios/gates/GateAll.h>
+#include <ti/sysbios/gates/GateHwi.h>
 #include <ti/sysbios/BIOS.h>
 #include <ti/sysbios/hal/Cache.h>
 
 #define NUM_QUEUES              4
 
 /* Predefined device addresses */
+#ifdef DSP
 #define IPC_MEM_VRING0          0xA0000000
 #define IPC_MEM_VRING1          0xA0004000
 #define IPC_MEM_VRING2          0xA0008000
 #define IPC_MEM_VRING3          0xA000c000
+#else
+#define IPC_MEM_VRING0          0x60000000
+#define IPC_MEM_VRING1          0x60004000
+#define IPC_MEM_VRING2          0x60008000
+#define IPC_MEM_VRING3          0x6000c000
+#endif
 
 /*
  * Sizes of the virtqueues (expressed in number of buffers supported,
@@ -193,7 +200,7 @@ typedef struct VirtQueue_Object {
     UInt16                  procId;
 
     /* Gate to protect from multiple threads */
-    GateAll_Handle       gateH;
+    GateHwi_Handle       gateH;
 } VirtQueue_Object;
 
 static struct VirtQueue_Object *queueRegistry[NUM_QUEUES] = {NULL};
@@ -249,9 +256,9 @@ Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head, Int len)
     struct vring_used_elem *used;
     IArg key;
 
-    key = GateAll_enter(vq->gateH);
+    key = GateHwi_enter(vq->gateH);
     if ((head > vq->vring.num) || (head < 0)) {
-        GateAll_leave(vq->gateH, key);
+        GateHwi_leave(vq->gateH, key);
         Error_raise(NULL, Error_E_generic, 0, 0);
     }
 
@@ -264,7 +271,7 @@ Int VirtQueue_addUsedBuf(VirtQueue_Handle vq, Int16 head, Int len)
     used->len = len;
 
     vq->vring.used->idx++;
-    GateAll_leave(vq->gateH, key);
+    GateHwi_leave(vq->gateH, key);
 
     return (0);
 }
@@ -284,12 +291,12 @@ Int VirtQueue_addAvailBuf(VirtQueue_Object *vq, Void *buf)
 
     vq->num_free--;
 
-    key = GateAll_enter(vq->gateH);
+    key = GateHwi_enter(vq->gateH);
     avail =  vq->vring.avail->idx++ % vq->vring.num;
 
     vq->vring.desc[avail].addr = mapVAtoPA(buf);
     vq->vring.desc[avail].len = RP_MSG_BUF_SIZE;
-    GateAll_leave(vq->gateH, key);
+    GateHwi_leave(vq->gateH, key);
 
     return (vq->num_free);
 }
@@ -303,7 +310,7 @@ Void *VirtQueue_getUsedBuf(VirtQueue_Object *vq)
     Void *buf;
     IArg key;
 
-    key = GateAll_enter(vq->gateH);
+    key = GateHwi_enter(vq->gateH);
     /* There's nothing available? */
     if (vq->last_used_idx == vq->vring.used->idx) {
         buf = NULL;
@@ -314,7 +321,7 @@ Void *VirtQueue_getUsedBuf(VirtQueue_Object *vq)
 
         buf = mapPAtoVA(vq->vring.desc[head].addr);
     }
-    GateAll_leave(vq->gateH, key);
+    GateHwi_leave(vq->gateH, key);
 
     return (buf);
 }
@@ -327,7 +334,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
     Int16 head;
     IArg key;
 
-    key = GateAll_enter(vq->gateH);
+    key = GateHwi_enter(vq->gateH);
     Log_print6(Diags_USER1, "getAvailBuf vq: 0x%x %d %d %d 0x%x 0x%x\n",
         (IArg)vq, vq->last_avail_idx, vq->vring.avail->idx, vq->vring.num,
         (IArg)&vq->vring.avail, (IArg)vq->vring.avail);
@@ -348,7 +355,7 @@ Int16 VirtQueue_getAvailBuf(VirtQueue_Handle vq, Void **buf, Int *len)
         *buf = mapPAtoVA(vq->vring.desc[head].addr);
         *len = vq->vring.desc[head].len;
     }
-    GateAll_leave(vq->gateH, key);
+    GateHwi_leave(vq->gateH, key);
 
     return (head);
 }
@@ -497,7 +504,7 @@ VirtQueue_Handle VirtQueue_create(UInt16 remoteProcId, VirtQueue_Params *params,
     }
 
     /* Create the thread protection gate */
-    vq->gateH = GateAll_create(NULL, eb);
+    vq->gateH = GateHwi_create(NULL, eb);
     if (Error_check(eb)) {
         Log_error0("VirtQueue_create: could not create gate object");
         Memory_free(NULL, vq, sizeof(VirtQueue_Object));
@@ -538,7 +545,7 @@ VirtQueue_Handle VirtQueue_create(UInt16 remoteProcId, VirtQueue_Params *params,
             break;
 #endif
         default:
-            GateAll_delete(&vq->gateH);
+            GateHwi_delete(&vq->gateH);
             Memory_free(NULL, vq, sizeof(VirtQueue_Object));
             return (NULL);
     }
@@ -556,7 +563,7 @@ VirtQueue_Handle VirtQueue_create(UInt16 remoteProcId, VirtQueue_Params *params,
      *  available
      */
     if (vq->procId == hostProcId) {
-        vq->vring.used->flags |= VRING_USED_F_NO_NOTIFY;
+        vq->vring.used->flags &= ~VRING_USED_F_NO_NOTIFY;
     }
 
     queueRegistry[vq->id] = vq;