SDOCM00106584 Notify mailbox driver support on DRA7xx (IPU, HOST) - Part 2
authorRamsey Harris <ramsey@ti.com>
Mon, 26 May 2014 16:54:53 +0000 (09:54 -0700)
committerRobert Tivy <rtivy@ti.com>
Wed, 28 May 2014 00:19:48 +0000 (17:19 -0700)
Added notify mailbox driver support for HOST. This implementation is
very similar to the IPU version. Removed startup function. Interrupt
ISR re-write to match InterruptIpu module. Moved HOST MMU setup from
InterruptHost to NotifySetup.

Code cleanup in NotifyDriverMbx module. All processors now use the
same implementation. Fixed include files. Removed dead code from
InterruptArp32 and InterruptIpu modules. Code cleanup in InterruptDsp
and NotifySetup modules.

Added NotifyDriverMbx to Build.xs file list for A15g.

15 files changed:
packages/ti/sdo/ipc/Build.xdc
packages/ti/sdo/ipc/Build.xs
packages/ti/sdo/ipc/family/vayu/InterruptArp32.xdc
packages/ti/sdo/ipc/family/vayu/InterruptArp32.xs
packages/ti/sdo/ipc/family/vayu/InterruptDsp.c
packages/ti/sdo/ipc/family/vayu/InterruptHost.c
packages/ti/sdo/ipc/family/vayu/InterruptHost.xdc
packages/ti/sdo/ipc/family/vayu/InterruptHost.xs
packages/ti/sdo/ipc/family/vayu/InterruptIpu.c
packages/ti/sdo/ipc/family/vayu/InterruptIpu.xdc
packages/ti/sdo/ipc/family/vayu/InterruptIpu.xs
packages/ti/sdo/ipc/family/vayu/NotifyDriverMbx.c
packages/ti/sdo/ipc/family/vayu/NotifyDriverMbx.xs
packages/ti/sdo/ipc/family/vayu/NotifySetup.c
packages/ti/sdo/ipc/family/vayu/NotifySetup.xs

index e7b1188a19ede7b9af3cbb28be0e79e83a28f919..e4b742d576b4a06ddad98c1a4ca86272f9bd6ce6 100644 (file)
@@ -125,7 +125,7 @@ metaonly module Build
      *  to your config script:
      *
      *  @p(code)
-     *  print(Build.customCCOpts);
+     *  print("Build.customCCOpts="+Build.customCCOpts);
      *  @p
      *
      *  When {@link #libType Build.libType} is set to
index e0db7c89b25dc0fe62b79f2477bc2a98a01a986e..7ea7328f695329f20cfdf877a53807f382a867b5 100644 (file)
@@ -497,6 +497,7 @@ var A8gSources  = "ipc/gates/GateHWSpinlock.c " +
                    "ipc/family/omap3530/InterruptHost.c ";
 
 var A15gSources  = "ipc/family/vayu/InterruptHost.c " +
+                   "ipc/family/vayu/NotifyDriverMbx.c " +
                    "ipc/family/vayu/NotifySetup.c " +
                    "ipc/gates/GateHWSpinlock.c ";
 
index 40d5c9a84ceebd2565e3f0e3c8e9b51372851c08..80e419f507cfdf34813873f6a645662ed00b7b79 100644 (file)
@@ -98,14 +98,5 @@ internal:
          *  by virtual processor ID.
          */
         FxnTable fxnTable[NUM_CORES];
-
-        /*
-         * numPlugged is used to track number of times the interrupt was
-         * registered.
-         *
-         * numPlugged array length equals number of internal mailboxes per
-         * EVE.
-         */
-        UInt16 numPlugged[NUM_EVE_MBX/NUM_EVES];
     };
 }
index 66e250f52cfd69785dba99912806e06ec5800475..a44c03b1df7614d592e56bb35a832df3c6ef6612 100644 (file)
@@ -124,8 +124,4 @@ function module$static$init(state, mod)
         state.fxnTable[i].func  = null;
         state.fxnTable[i].arg   = 0;
     }
-
-    for (i = 0; i < (mod.NUM_EVE_MBX/mod.NUM_EVES); i++) {
-        state.numPlugged[i] = 0;
-    }
 }
index 5bb489c569b7d8660c20e625482a15e7d2b807d5..bd5a1bd4a00d5c553fae42e92b168295b83b005f 100644 (file)
@@ -36,7 +36,6 @@
  */
 #include <xdc/std.h>
 #include <xdc/runtime/Assert.h>
-#include <xdc/runtime/Startup.h>
 
 #include <ti/sysbios/family/c64p/EventCombiner.h>
 #include <ti/sysbios/family/c64p/Hwi.h>
 Void InterruptDsp_intEnable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 {
     UInt16 index;
+    UInt subMbxIdx;
 
     Assert_isTrue(((remoteProcId < MultiProc_getNumProcsInCluster()) &&
             (remoteProcId != MultiProc_self())), ti_sdo_ipc_Ipc_A_internal);
 
     index = MBX_TABLE_IDX(remoteProcId, MultiProc_self());
-
-    REG32(MAILBOX_IRQENABLE_SET_DSP(index))=MAILBOX_REG_VAL(SUBMBX_IDX(index));
+    subMbxIdx = SUBMBX_IDX(index);
+    REG32(MAILBOX_IRQENABLE_SET_DSP(index)) = MAILBOX_REG_VAL(subMbxIdx);
 }
 
 /*
@@ -111,13 +111,14 @@ Void InterruptDsp_intEnable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 Void InterruptDsp_intDisable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 {
     UInt16 index;
+    UInt subMbxIdx;
 
     Assert_isTrue(((remoteProcId < MultiProc_getNumProcsInCluster()) &&
             (remoteProcId != MultiProc_self())), ti_sdo_ipc_Ipc_A_internal);
 
     index = MBX_TABLE_IDX(remoteProcId, MultiProc_self());
-
-    REG32(MAILBOX_IRQENABLE_CLR_DSP(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
+    subMbxIdx = SUBMBX_IDX(index);
+    REG32(MAILBOX_IRQENABLE_CLR_DSP(index)) = MAILBOX_REG_VAL(subMbxIdx);
 }
 
 /*
@@ -133,18 +134,20 @@ Void InterruptDsp_intRegister(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
     Assert_isTrue(((remoteProcId < MultiProc_getNumProcsInCluster()) &&
             (remoteProcId != MultiProc_self())), ti_sdo_ipc_Ipc_A_internal);
 
+    /* index is the virtual id (invariant) */
     index = PROCID(remoteProcId);
 
     /* Disable global interrupts */
     key = Hwi_disable();
 
+    /* store callback function by virtual id */
     table = &(InterruptDsp_module->fxnTable[index]);
     table->func = func;
     table->arg  = arg;
 
     InterruptDsp_intClear(remoteProcId, intInfo);
 
-    /* plug the cpu interrupt */
+    /* plug the cpu interrupt with notify setup dispatch isr */
     NotifySetup_plugHwi(remoteProcId, intInfo->intVectorId,
             InterruptDsp_intShmStub);
 
@@ -185,15 +188,14 @@ Void InterruptDsp_intUnregister(UInt16 remoteProcId,
  *  Send interrupt to the remote processor
  */
 Void InterruptDsp_intSend(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
-                          UArg arg)
+        UArg arg)
 {
     UInt key;
     UInt16 index;
 
     index = MBX_TABLE_IDX(MultiProc_self(), remoteProcId);
 
-    /*
-     *  Before writing to a mailbox, check whether it already contains a
+    /*  Before writing to a mailbox, check whether it already contains a
      *  message. If so, wait for the message to be read since we want one
      *  and only one message per interrupt. Disable interrupts between reading
      *  the MSGSTATUS_X register and writing to the mailbox to protect from
index 574f6f744babda773e35f7f040852caa0938a266..868800067cded980ebca4bd415be9a2cd6a29509 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -29,6 +29,7 @@
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /*
  *  ======== InterruptHost.c ========
  *  Ducati/A8 based interupt manager
 
 #include <xdc/std.h>
 #include <xdc/runtime/Assert.h>
-#include <xdc/runtime/System.h>
-#include <xdc/runtime/Startup.h>
 
 #include <ti/sysbios/family/shared/vayu/IntXbar.h>
 #include <ti/sysbios/family/arm/gic/Hwi.h>
+
+#include <ti/sdo/ipc/family/vayu/NotifySetup.h>
 #include <ti/sdo/ipc/notifyDrivers/IInterrupt.h>
 #include <ti/sdo/ipc/_Ipc.h>
 #include <ti/sdo/utils/_MultiProc.h>
  *************************************************************************
  */
 
-/*
- *  ======== InterruptHost_Module_startup ========
- */
-Int InterruptHost_Module_startup(Int phase)
-{
-    if (IntXbar_Module_startupDone()) {
-        /* connect mailbox interrupts at startup */
-        IntXbar_connect(127, 286);  // eve1 mailbox 0 user 3
-        IntXbar_connect(128, 295);  // eve2 mailbox 0 user 3
-        IntXbar_connect(129, 251);  // system mailbox 5 user 2
-
-        /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
-        if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
-            (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
-            IntXbar_connect(130, 304);  // eve3 mailbox 0 user 3
-            IntXbar_connect(131, 313);  // eve4 mailbox 0 user 3
-        }
-
-        /* plug mbx6 only if DSP2 or IPU2 exists */
-        if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
-            (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
-            (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
-            IntXbar_connect(134, 255);  // system mailbox 6 user 2
-        }
-
-        return (Startup_DONE);
-    }
-
-    return (Startup_NOTDONE);
-}
-
 /*
  *  ======== InterruptHost_intEnable ========
  *  Enable remote processor interrupt
@@ -125,44 +95,44 @@ Int InterruptHost_Module_startup(Int phase)
 Void InterruptHost_intEnable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 {
     UInt16 index;
+    UInt subMbxIdx;
 
     index = MBX_TABLE_IDX(remoteProcId, MultiProc_self());
-    /*
-     *  If the remote processor communicates via mailboxes, we should enable
+
+    /*  If the remote processor communicates via mailboxes, we should enable
      *  the Mailbox IRQ instead of enabling the Hwi because multiple mailboxes
      *  share the same Hwi
      */
-    REG32(MAILBOX_IRQENABLE_SET(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
+    subMbxIdx = SUBMBX_IDX(index);
+    REG32(MAILBOX_IRQENABLE_SET(index)) = MAILBOX_REG_VAL(subMbxIdx);
 }
 
 /*
  *  ======== InterruptHost_intDisable ========
  *  Disables remote processor interrupt
  */
-Void InterruptHost_intDisable(UInt16 remoteProcId,
-                                IInterrupt_IntInfo *intInfo)
+Void InterruptHost_intDisable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 {
     UInt16 index;
+    UInt subMbxIdx;
 
     index = MBX_TABLE_IDX(remoteProcId, MultiProc_self());
-    /*
-     *  If the remote processor communicates via mailboxes, we should disable
+
+    /*  If the remote processor communicates via mailboxes, we should disable
      *  the Mailbox IRQ instead of disabling the Hwi because multiple mailboxes
      *  share the same Hwi
      */
-    REG32(MAILBOX_IRQENABLE_CLR(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
+    subMbxIdx = SUBMBX_IDX(index);
+    REG32(MAILBOX_IRQENABLE_CLR(index)) = MAILBOX_REG_VAL(subMbxIdx);
 }
 
 /*
  *  ======== InterruptHost_intRegister ========
  */
-Void InterruptHost_intRegister(UInt16 remoteProcId,
-                                 IInterrupt_IntInfo *intInfo,
-                                 Fxn func, UArg arg)
+Void InterruptHost_intRegister(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
+        Fxn func, UArg arg)
 {
-    Hwi_Params  hwiAttrs;
     UInt        key;
-    UInt        mbxIdx;
     Int         index;
     InterruptHost_FxnTable *table;
 
@@ -171,37 +141,26 @@ Void InterruptHost_intRegister(UInt16 remoteProcId,
 
     /* Assert that our MultiProc id is set correctly */
     Assert_isTrue((InterruptHost_hostProcId == MultiProc_self()),
-                  ti_sdo_ipc_Ipc_A_internal);
-
-    mbxIdx = MBX_BASEADDR_IDX(MBX_TABLE_IDX(remoteProcId, MultiProc_self()));
+            ti_sdo_ipc_Ipc_A_internal);
 
+    /* index is the virtual id (invariant) */
     index = PROCID(remoteProcId);
 
-    intInfo->localIntId = InterruptHost_hostInterruptTable[index];
+    intInfo->localIntId = NotifySetup_interruptTable(index);
 
     /* Disable global interrupts */
     key = Hwi_disable();
 
+    /* store callback function by virtual id */
     table = &(InterruptHost_module->fxnTable[index]);
     table->func = func;
     table->arg  = arg;
 
     InterruptHost_intClear(remoteProcId, intInfo);
 
-    Hwi_Params_init(&hwiAttrs);
-    hwiAttrs.maskSetting = Hwi_MaskingOption_LOWER;
-
-    /* Make sure the interrupt only gets plugged once */
-    InterruptHost_module->numPlugged[mbxIdx]++;
-    if (InterruptHost_module->numPlugged[mbxIdx] == 1) {
-        Hwi_create(intInfo->localIntId,
-                   (Hwi_FuncPtr)InterruptHost_intShmStub,
-                    &hwiAttrs,
-                    NULL);
-
-        /* Interrupt_intEnable won't enable the Hwi */
-        Hwi_enableInterrupt(intInfo->localIntId);
-    }
+    /* plug the cpu interrupt with notify setup dispatch isr */
+    NotifySetup_plugHwi(remoteProcId, intInfo->localIntId,
+            InterruptHost_intShmStub);
 
     InterruptHost_intEnable(remoteProcId, intInfo);
 
@@ -213,26 +172,18 @@ Void InterruptHost_intRegister(UInt16 remoteProcId,
  *  ======== InterruptHost_intUnregister ========
  */
 Void InterruptHost_intUnregister(UInt16 remoteProcId,
-                                   IInterrupt_IntInfo *intInfo)
+        IInterrupt_IntInfo *intInfo)
 {
-    UInt                       mbxIdx;
-    Int                        index;
+    Int index;
     InterruptHost_FxnTable *table;
-    Hwi_Handle                 hwiHandle;
-
-    mbxIdx = MBX_BASEADDR_IDX(MBX_TABLE_IDX(remoteProcId, MultiProc_self()));
-
-    index = PROCID(remoteProcId);
 
     /* Disable the mailbox interrupt source */
     InterruptHost_intDisable(remoteProcId, intInfo);
 
-    /* Disable the interrupt itself */
-    InterruptHost_module->numPlugged[mbxIdx]--;
-    if (InterruptHost_module->numPlugged[mbxIdx] == 0) {
-        hwiHandle = Hwi_getHandle(intInfo->localIntId);
-        Hwi_delete(&hwiHandle);
-    }
+    NotifySetup_unplugHwi(remoteProcId, intInfo->localIntId);
+
+    /* index is the virtual id (invariant) */
+    index = PROCID(remoteProcId);
 
     /* Clear the FxnTable entry for the remote processor */
     table = &(InterruptHost_module->fxnTable[index]);
@@ -240,13 +191,12 @@ Void InterruptHost_intUnregister(UInt16 remoteProcId,
     table->arg  = 0;
 }
 
-
 /*
  *  ======== InterruptHost_intSend ========
  *  Send interrupt to the remote processor
  */
 Void InterruptHost_intSend(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
-                             UArg arg)
+        UArg arg)
 {
     UInt key;
     UInt16 index;
@@ -259,7 +209,6 @@ Void InterruptHost_intSend(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
     Hwi_restore(key);
 }
 
-
 /*
  *  ======== InterruptHost_intPost ========
  *  Simulate an interrupt from a remote processor
@@ -278,7 +227,6 @@ Void InterruptHost_intPost(UInt16 srcProcId, IInterrupt_IntInfo *intInfo,
     Hwi_restore(key);
 }
 
-
 /*
  *  ======== InterruptHost_intClear ========
  *  Clear interrupt
@@ -304,28 +252,12 @@ UInt InterruptHost_intClear(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 /*
  *  ======== InterruptHost_intShmMbxStub ========
  */
-Void InterruptHost_intShmStub(UArg arg)
+Void InterruptHost_intShmStub(UInt16 idx)
 {
-    UInt16 index;
-    UInt16 selfIdx;
-    UInt16 loopIdx;
+    UInt16 srcVirtId;
     InterruptHost_FxnTable *table;
 
-    selfIdx = MultiProc_self();
-
-    for (loopIdx = 0; loopIdx < MultiProc_getNumProcsInCluster(); loopIdx++) {
-
-        if (loopIdx == selfIdx) {
-            continue;
-        }
-
-        index = MBX_TABLE_IDX(loopIdx, selfIdx);
-
-        if (((REG32(MAILBOX_STATUS(index)) != 0) &&
-             (REG32(MAILBOX_IRQENABLE_SET(index)) &
-              MAILBOX_REG_VAL(SUBMBX_IDX(index))))) {
-            table = &(InterruptHost_module->fxnTable[PROCID(loopIdx)]);
-            (table->func)(table->arg);
-        }
-    }
+    srcVirtId = idx / InterruptHost_NUM_CORES;
+    table = &(InterruptHost_module->fxnTable[srcVirtId]);
+    (table->func)(table->arg);
 }
index 6e6738969d16fd72ce3a4e11a1862d39f1d73f02..78476c3d3e0e360a6d19ca7b24416ab5d1ff6c59 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -40,9 +40,6 @@ import ti.sdo.utils.MultiProc;
  *  ======== InterruptHost ========
  *  TI81xx/A8 based interrupt manager
  */
-
-@ModuleStartup
-
 module InterruptHost inherits ti.sdo.ipc.notifyDrivers.IInterrupt
 {
     /* Total number of cores on Vayu SoC */
@@ -72,11 +69,9 @@ module InterruptHost inherits ti.sdo.ipc.notifyDrivers.IInterrupt
      */
     config UInt32 mailboxTable[NUM_CORES * NUM_CORES];
 
-    config UInt32 hostInterruptTable[NUM_CORES];
-
     config UInt32 procIdTable[NUM_CORES];
-internal:
 
+internal:
     /*! Statically retrieve procIds to avoid doing this at runtime */
     config UInt eve1ProcId     = MultiProc.INVALIDID;
     config UInt eve2ProcId     = MultiProc.INVALIDID;
@@ -100,7 +95,7 @@ internal:
      *  ======== intShmStub ========
      *  Stub to be plugged
      */
-    Void intShmStub(UArg arg);
+    Void intShmStub(UInt16 idx);
 
     struct Module_State {
         /*
@@ -108,8 +103,5 @@ internal:
          * in the System).
          */
         FxnTable   fxnTable[NUM_CORES];
-
-        /* # of times interrupt registered */
-        UInt16       numPlugged[NUM_EVE_MBX + NUM_SYS_MBX];
     };
 }
index 8e62fcb746758a390ced4ccfd4566b72863361cd..652dbc63154eaa480e5647c9bbfedd930f26be01 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012-2013, Texas Instruments Incorporated
+ * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
+
 /*
  *  ======== InterruptHost.xs ========
  *
  */
-
-var Hwi         = null;
-var Host        = null;
-var Ipc         = null;
-var Xbar        = null;
-var Mmu         = null;
+var Hwi = null;
+var Host = null;
+var Ipc = null;
+var Xbar = null;
+var Mmu = null;
 
 /*
  *  ======== module$use ========
  */
 function module$use()
 {
-    Hwi              = xdc.useModule("ti.sysbios.family.arm.gic.Hwi");
-    Ipc              = xdc.useModule("ti.sdo.ipc.Ipc");
-    Host             = xdc.useModule("ti.sdo.ipc.family.vayu.InterruptHost");
-    Xbar             = xdc.useModule("ti.sysbios.family.shared.vayu.IntXbar");
-    Mmu              = xdc.useModule("ti.sysbios.family.arm.a15.Mmu");
-    TableInit        = xdc.useModule("ti.sdo.ipc.family.vayu.TableInit");
+    Hwi = xdc.useModule("ti.sysbios.family.arm.gic.Hwi");
+    Ipc = xdc.useModule("ti.sdo.ipc.Ipc");
+    Host = xdc.useModule("ti.sdo.ipc.family.vayu.InterruptHost");
+    Xbar = xdc.useModule("ti.sysbios.family.shared.vayu.IntXbar");
+    Mmu = xdc.useModule("ti.sysbios.family.arm.a15.Mmu");
+    TableInit = xdc.useModule("ti.sdo.ipc.family.vayu.TableInit");
 
-    /* Initisalize procIdTable */
-    TableInit.initProcId(Host);
+    /* initialize procIdTable */
+    TableInit.initProcId(this);
 
-    /* Initialize mailboxTable */
-    TableInit.generateTable(Host);
+    /* initialize mailboxTable */
+    TableInit.generateTable(this);
 
     /* Initialize mailbox base address table */
     this.mailboxBaseAddr[0]  = 0x4208B000;  /* EVE1 Internal Mailbox 0 */
@@ -75,67 +75,16 @@ function module$use()
     this.mailboxBaseAddr[13] = 0x48842000;  /* System Mailbox 6 */
     this.mailboxBaseAddr[14] = 0x48844000;  /* System Mailbox 7 */
     this.mailboxBaseAddr[15] = 0x48846000;  /* System Mailbox 8 */
-
-    /* These are obtained by looking at MPU IRQ + 32 */
-    this.hostInterruptTable[0] = 134 + 32;        /* EVE1 */
-    this.hostInterruptTable[1] = 135 + 32;        /* EVE2 */
-    this.hostInterruptTable[2] = 137 + 32;        /* EVE3 */
-    this.hostInterruptTable[3] = 138 + 32;        /* EVE4 */
-    this.hostInterruptTable[4] = 136 + 32;        /* DSP1 */
-    this.hostInterruptTable[5] = 141 + 32;        /* DSP2 */
-    this.hostInterruptTable[6] = 136 + 32;        /* IPU1-0 */
-    this.hostInterruptTable[7] = 141 + 32;        /* IPU2-0 */
-    this.hostInterruptTable[8] = 0;               /* HOST */
-    this.hostInterruptTable[9] = 136 + 32;        /* IPU1-1 */
-    this.hostInterruptTable[10] = 141 + 32;       /* IPU2-1 */
-
-    /*
-     * In case of a spec change, follow the process shown below:
-     * 1. Update the mailboxBaseAddr Table.
-     * 2. Update the dspInterruptTable.
-     * 3. Update Virtual Index assignment.
-     * 4. Update numCores, numEves and eveMbx2BaseIdx variables
-     *    in order to correctly intialize the mailboxTable.
-     */
-
-    /* Add mailbox addresses to the Mmu table */
-    /* Force mailbox addresses to be NON cacheable */
-    var peripheralAttrs = {
-        type : Mmu.DescriptorType_BLOCK,  // BLOCK descriptor
-        accPerm    : 0,                   // read/write at PL1
-        noExecute  : true,                // not executable
-        attrIndx   : 1                    // MAIR0 Byte1 describes mem attr
-    };
-
-    /* Configure the corresponding MMU page descriptor accordingly */
-    Mmu.setSecondLevelDescMeta(0x42000000,
-                               0x42000000,
-                               peripheralAttrs);
-
-    Mmu.setSecondLevelDescMeta(0x42200000,
-                               0x42200000,
-                               peripheralAttrs);
-
-    Mmu.setSecondLevelDescMeta(0x48800000,
-                               0x48800000,
-                               peripheralAttrs);
 }
 
 /*
  *  ======== module$static$init ========
- *  Initialize module values.
+ *  Initialize the target state object.
  */
-function module$static$init(mod, params)
+function module$static$init(state, mod)
 {
-    var remoteProcId;
-    var mbxId;
-
-    for (remoteProcId = 0; remoteProcId < Host.procIdTable.length; remoteProcId++) {
-        mod.fxnTable[remoteProcId].func  = null;
-        mod.fxnTable[remoteProcId].arg   = 0;
-    }
-
-    for (mbxId = 0; mbxId < Host.mailboxBaseAddr.length; mbxId++) {
-        mod.numPlugged[mbxId] = 0;
+    for (var i = 0; i < this.procIdTable.length; i++) {
+        state.fxnTable[i].func = null;
+        state.fxnTable[i].arg = 0;
     }
 }
index 32f64b32b593b34fcdf2d39602dd47c6c72f3109..fe2fd83e317fd8febc8d918e6178653a64c9c961 100644 (file)
@@ -36,7 +36,6 @@
 
 #include <xdc/std.h>
 #include <xdc/runtime/Assert.h>
-#include <xdc/runtime/Startup.h>
 
 #include <ti/sysbios/BIOS.h>
 #include <ti/sysbios/family/shared/vayu/IntXbar.h>
@@ -108,7 +107,7 @@ Void InterruptIpu_intEnable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 {
     UInt16 index;
     Bool useMailbox = TRUE;
-    UInt8 subMbxIdx;
+    UInt subMbxIdx;
 
     index = MBX_TABLE_IDX(remoteProcId, MultiProc_self());
 
@@ -145,7 +144,7 @@ Void InterruptIpu_intDisable(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo)
 {
     UInt16 index;
     Bool useMailbox = TRUE;
-    UInt8 subMbxIdx;
+    UInt subMbxIdx;
 
     if (Core_ipuId == 1) {
         if ((remoteProcId == InterruptIpu_ipu1_0ProcId) ||
@@ -246,12 +245,9 @@ Void InterruptIpu_intRegister(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
 Void InterruptIpu_intUnregister(UInt16 remoteProcId,
         IInterrupt_IntInfo *intInfo)
 {
-    Int                        index;
+    Int index;
+    Hwi_Handle hwiHandle;
     InterruptIpu_FxnTable *table;
-    Hwi_Handle                 hwiHandle;
-
-    /* index is the virtual id (invariant) */
-    index = PROCID(remoteProcId);
 
     /* Disable the mailbox interrupt source */
     InterruptIpu_intDisable(remoteProcId, intInfo);
@@ -277,6 +273,9 @@ Void InterruptIpu_intUnregister(UInt16 remoteProcId,
         }
     }
 
+    /* index is the virtual id (invariant) */
+    index = PROCID(remoteProcId);
+
     /* Clear the FxnTable entry for the remote processor */
     table = &(InterruptIpu_module->fxnTable[index]);
     table->func = NULL;
@@ -289,7 +288,7 @@ Void InterruptIpu_intUnregister(UInt16 remoteProcId,
  *  Send interrupt to the remote processor
  */
 Void InterruptIpu_intSend(UInt16 remoteProcId, IInterrupt_IntInfo *intInfo,
-                             UArg arg)
+        UArg arg)
 {
     UInt key;
     UInt16 index;
index b1da830c1038e34af5bfeac728ddbaf4638d0fc6..3a4e63fa505252daa0cc1eda98225b3ec6af916d 100644 (file)
@@ -169,8 +169,5 @@ internal:
          * System) for each M4 core.
          */
         FxnTable   fxnTable[NUM_CORES];
-
-        /* # of times interrupt registered */
-        UInt16     numPlugged[NUM_EVE_MBX + NUM_SYS_MBX];
     };
 }
index 37c9905474cf9fc51a5cdd3d7f11e17004db995a..4bc20f0e45fd08a6bdb3ba2fdc2e3c976328d86f 100644 (file)
@@ -142,17 +142,10 @@ function module$use()
  *  ======== module$static$init ========
  *  Initialize module values.
  */
-function module$static$init(mod, params)
+function module$static$init(state, mod)
 {
-    var remoteProcId;
-    var mbxId;
-
-    for (remoteProcId = 0; remoteProcId < Ipu.procIdTable.length; remoteProcId++) {
-        mod.fxnTable[remoteProcId].func  = null;
-        mod.fxnTable[remoteProcId].arg   = 0;
-    }
-
-    for (mbxId = 0; mbxId < mod.numPlugged.length; mbxId++) {
-        mod.numPlugged[mbxId] = 0;
+    for (var i = 0; i < this.procIdTable.length; i++) {
+        state.fxnTable[i].func  = null;
+        state.fxnTable[i].arg   = 0;
     }
 }
index bb840bd47b7dc04b36366121066fd84fe1c729a8..3885395bf816eab7913743c2087d318a4c27d965 100644 (file)
 #include <xdc/runtime/Assert.h>
 #include <xdc/runtime/Startup.h>
 
-#include <ti/sysbios/BIOS.h>
-#include <ti/sysbios/family/c64p/EventCombiner.h>
+#if defined(xdc_target__isaCompatible_64P)
+
 #include <ti/sysbios/family/c64p/Hwi.h>
-#include <ti/sysbios/family/shared/vayu/IntXbar.h>
+
+#elif defined(xdc_target__isaCompatible_arp32)
+
+#include <ti/sysbios/family/arp32/Hwi.h>
+
+#elif defined(xdc_target__isaCompatible_v7M)
+
+#include <ti/sysbios/family/arm/m3/Hwi.h>
+
+#elif defined(xdc_target__isaCompatible_v7A)
+
+#include <ti/sysbios/family/arm/gic/Hwi.h>
+
+#else
+#error Invalid target
+#endif
 
 #include <ti/sdo/ipc/_Ipc.h>
 #include <ti/sdo/ipc/_Notify.h>
 #include <ti/sdo/ipc/family/vayu/NotifySetup.h>
-#include <ti/sdo/ipc/interfaces/INotifyDriver.h>
 #include <ti/sdo/utils/_MultiProc.h>
 
 #include "package/internal/NotifyDriverMbx.xdc.h"
@@ -131,7 +145,6 @@ Int NotifyDriverMbx_Module_startup(Int phase)
 
 #elif defined(xdc_target__isaCompatible_v7A)
 
-    /* TODO */
     return (Startup_DONE);
 
 #else
@@ -307,23 +320,9 @@ Int NotifyDriverMbx_sendEvent(NotifyDriverMbx_Object *obj, UInt32 eventId,
         numMsgs = 2;
     }
 
-#if defined(xdc_target__isaCompatible_64P) || \
-    defined(xdc_target__isaCompatible_arp32) || \
-    defined(xdc_target__isaCompatible_v7M)
-
     index = (selfVirtId * NotifyDriverMbx_NUM_CORES) + obj->remoteVirtId;
     PUT_NOTIFICATION(index);
 
-#elif defined(xdc_target__isaCompatible_v7A)
-
-    /* TODO */
-    index = (selfVirtId * NotifyDriverMbx_NUM_CORES) + obj->remoteVirtId;
-    PUT_NOTIFICATION(index);
-
-#else
-#error Invalid target
-#endif
-
     return (Notify_S_SUCCESS);
 }
 
@@ -335,22 +334,8 @@ Void NotifyDriverMbx_disable(NotifyDriverMbx_Object *obj)
     UInt16 selfVirtId = PROCID(MultiProc_self());
     UInt16 index;
 
-#if defined(xdc_target__isaCompatible_64P) || \
-    defined(xdc_target__isaCompatible_arp32) || \
-    defined(xdc_target__isaCompatible_v7M)
-
-    index = (obj->remoteVirtId * NotifyDriverMbx_NUM_CORES) + selfVirtId;
-    REG32(MAILBOX_IRQENABLE_CLR(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
-
-#elif defined(xdc_target__isaCompatible_v7A)
-
-    /* TODO */
     index = (obj->remoteVirtId * NotifyDriverMbx_NUM_CORES) + selfVirtId;
     REG32(MAILBOX_IRQENABLE_CLR(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
-
-#else
-#error Invalid target
-#endif
 }
 
 /*
@@ -361,22 +346,8 @@ Void NotifyDriverMbx_enable(NotifyDriverMbx_Object *obj)
     UInt16 selfVirtId = PROCID(MultiProc_self());
     UInt16 index;
 
-#if defined(xdc_target__isaCompatible_64P) || \
-    defined(xdc_target__isaCompatible_arp32) || \
-    defined(xdc_target__isaCompatible_v7M)
-
     index = (obj->remoteVirtId * NotifyDriverMbx_NUM_CORES) + selfVirtId;
     REG32(MAILBOX_IRQENABLE_SET(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
-
-#elif defined(xdc_target__isaCompatible_v7A)
-
-    /* TODO */
-    index = (obj->remoteVirtId * NotifyDriverMbx_NUM_CORES) + selfVirtId;
-    REG32(MAILBOX_IRQENABLE_SET(index)) = MAILBOX_REG_VAL(SUBMBX_IDX(index));
-
-#else
-#error Invalid target
-#endif
 }
 
 /*
@@ -438,27 +409,10 @@ Void NotifyDriverMbx_isr(UInt16 idx)
     NotifyDriverMbx_Object *obj;
     UInt32 msg, payload;
     UInt16 eventId;
-
-#if defined(xdc_target__isaCompatible_64P) || \
-    defined(xdc_target__isaCompatible_arp32) || \
-    defined(xdc_target__isaCompatible_v7M)
-
-    UInt16 srcVirtId;
-
-    srcVirtId = idx / NotifyDriverMbx_NUM_CORES;
-    MESSAGE_DELIVERY(idx)
-
-#elif defined(xdc_target__isaCompatible_v7A)
-
-    /* TODO */
     UInt16 srcVirtId;
 
     srcVirtId = idx / NotifyDriverMbx_NUM_CORES;
     MESSAGE_DELIVERY(idx)
-
-#else
-#error Invalid target
-#endif
 }
 
 /*
index d6b0b6972ecf6ed1c510453db9288a72fb23e37f..cc5f2ab20941bf3725fe84fb038f37d308f52d89 100644 (file)
@@ -34,7 +34,6 @@
  *  ======== NotifyDriverMbx.xs ================
  */
 var NotifyDriverMbx = null;
-var Core = null;
 var isaChain = "";
 
 /*
@@ -47,29 +46,27 @@ function module$use()
     var MultiProc = xdc.useModule("ti.sdo.utils.MultiProc");
     NotifyDriverMbx = this;
     xdc.useModule('xdc.runtime.Assert');
-    xdc.useModule('xdc.runtime.Error');
     xdc.useModule('xdc.runtime.Startup');
-    xdc.useModule("ti.sysbios.BIOS");
 
     /* concatenate isa chain into single string for easier matching */
     isaChain = "#" + Program.build.target.getISAChain().join("#") + "#";
 
     if (isaChain.match(/#64P#/)) {
-        xdc.useModule("ti.sysbios.family.c64p.EventCombiner");
         xdc.useModule("ti.sysbios.family.c64p.Hwi");
-        xdc.useModule("ti.sysbios.family.shared.vayu.IntXbar");
     }
     else if (isaChain.match(/#arp32#/)) {
         xdc.useModule('ti.sysbios.family.arp32.Hwi');
     }
     else if (isaChain.match(/#v7M#/)) {
-        Core = xdc.useModule("ti.sysbios.family.arm.ducati.Core");
+        xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
+    }
+    else if (isaChain.match(/#v7A#/)) {
+        xdc.useModule('ti.sysbios.family.arm.gic.Hwi');
     }
 
     xdc.useModule('ti.sdo.ipc.Ipc');
     xdc.useModule("ti.sdo.ipc.Notify");
     xdc.useModule('ti.sdo.ipc.family.vayu.NotifySetup');
-    xdc.useModule('ti.sdo.ipc.interfaces.INotifyDriver');
 
     /* initialize procIdTable */
     TableInit.initProcId(this);
@@ -222,8 +219,6 @@ function module$static$init(state, mod)
     else if (isaChain.match(/#v7M#/)) {
     }
     else if (isaChain.match(/#v7A#/)) {
-        /* TODO */
-//      Hwi.construct(state.hwi, 77, NotifyDriverMbx.isr);
     }
     else {
         throw("Invalid target: " + Program.build.target.$name);
index b217f10cfdb703e7e7bec71c9350e79bef6fffbf..0da08cfba2670f7c5411d4c7d3cd08422732a46b 100644 (file)
@@ -64,6 +64,7 @@
 #elif defined(xdc_target__isaCompatible_v7A)
 
 #include <ti/sysbios/family/arm/gic/Hwi.h>
+#include <ti/sysbios/family/shared/vayu/IntXbar.h>
 
 #else
 #error Invalid target
@@ -120,68 +121,69 @@ Int NotifySetup_Module_startup(Int phase)
 
     extern cregister volatile UInt DNUM;
 
-    if (IntXbar_Module_startupDone()) {
-        /* connect mailbox interrupts at startup */
-        if (DNUM == 0) {               /* DSP1 */
-            IntXbar_connect(24, 284);  // eve1 mailbox 0 user 1
-            IntXbar_connect(25, 293);  // eve2 mailbox 0 user 1
-            IntXbar_connect(26, 249);  // system mailbox 5 user 0
-            NotifySetup_module->interruptTable[6] = 57; // IPU1-0
-            NotifySetup_module->interruptTable[9] = 57; // IPU1-1
-
-            /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
-            if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
-                (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
-                IntXbar_connect(27, 302);  // eve3 mailbox 0 user 1
-                IntXbar_connect(28, 311);  // eve4 mailbox 0 user 1
-            }
+    if (!IntXbar_Module_startupDone()) {
+        return (Startup_NOTDONE);
+    }
 
-            /* plug mbx7 only if DSP2 or IPU2 exists */
-            if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
-                (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
-                (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
-                IntXbar_connect(29, 257);  // system mailbox 7 user 0
-                NotifySetup_module->interruptTable[7] = 60; // IPU2-0
-            }
+    /* connect mailbox interrupts at startup */
+    if (DNUM == 0) {               /* DSP1 */
+        IntXbar_connect(24, 284);  // eve1 mailbox 0 user 1
+        IntXbar_connect(25, 293);  // eve2 mailbox 0 user 1
+        IntXbar_connect(26, 249);  // system mailbox 5 user 0
+        NotifySetup_module->interruptTable[6] = 57; // IPU1-0
+        NotifySetup_module->interruptTable[9] = 57; // IPU1-1
+
+        /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
+        if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
+            (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
+            IntXbar_connect(27, 302);  // eve3 mailbox 0 user 1
+            IntXbar_connect(28, 311);  // eve4 mailbox 0 user 1
+        }
 
-            /* plug mbx8 only if IPU2-1 exists */
-            if (MultiProc_getId("IPU2-1") != MultiProc_INVALIDID) {
-                IntXbar_connect(30, 261);  // system mailbox 8 user 0
-                NotifySetup_module->interruptTable[10] = 61; // IPU2-1
-            }
+        /* plug mbx7 only if DSP2 or IPU2 exists */
+        if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
+            (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
+            (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
+            IntXbar_connect(29, 257);  // system mailbox 7 user 0
+            NotifySetup_module->interruptTable[7] = 60; // IPU2-0
         }
-        else if (DNUM == 1) {          /* DSP2 */
-            IntXbar_connect(24, 287);  // eve1 mailbox 1 user 1
-            IntXbar_connect(25, 296);  // eve2 mailbox 1 user 1
-            IntXbar_connect(26, 253);  // system mailbox 6 user 0
-            NotifySetup_module->interruptTable[7] = 57; // IPU2-0
-            NotifySetup_module->interruptTable[10] = 57; // IPU2-1
 
-            /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
-            if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
-                (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
-                IntXbar_connect(27, 305);  // eve3 mailbox 1 user 1
-                IntXbar_connect(28, 314);  // eve4 mailbox 1 user 1
-            }
+        /* plug mbx8 only if IPU2-1 exists */
+        if (MultiProc_getId("IPU2-1") != MultiProc_INVALIDID) {
+            IntXbar_connect(30, 261);  // system mailbox 8 user 0
+            NotifySetup_module->interruptTable[10] = 61; // IPU2-1
+        }
+    }
+    else if (DNUM == 1) {          /* DSP2 */
+        IntXbar_connect(24, 287);  // eve1 mailbox 1 user 1
+        IntXbar_connect(25, 296);  // eve2 mailbox 1 user 1
+        IntXbar_connect(26, 253);  // system mailbox 6 user 0
+        NotifySetup_module->interruptTable[7] = 57; // IPU2-0
+        NotifySetup_module->interruptTable[10] = 57; // IPU2-1
+
+        /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
+        if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
+            (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
+            IntXbar_connect(27, 305);  // eve3 mailbox 1 user 1
+            IntXbar_connect(28, 314);  // eve4 mailbox 1 user 1
+        }
 
-            /* plug mbx7 only if DSP1 or IPU1 exists */
-            if ((MultiProc_getId("DSP1") != MultiProc_INVALIDID) ||
-                (MultiProc_getId("IPU1") != MultiProc_INVALIDID) ||
-                (MultiProc_getId("IPU1-0") != MultiProc_INVALIDID)) {
-                IntXbar_connect(29, 258);  // system mailbox 7 user 1
-                NotifySetup_module->interruptTable[6] = 60; // IPU1-0
-            }
+        /* plug mbx7 only if DSP1 or IPU1 exists */
+        if ((MultiProc_getId("DSP1") != MultiProc_INVALIDID) ||
+            (MultiProc_getId("IPU1") != MultiProc_INVALIDID) ||
+            (MultiProc_getId("IPU1-0") != MultiProc_INVALIDID)) {
+            IntXbar_connect(29, 258);  // system mailbox 7 user 1
+            NotifySetup_module->interruptTable[6] = 60; // IPU1-0
+        }
 
-            /* plug mbx8 only if IPU1-1 exists */
-            if (MultiProc_getId("IPU1-1") != MultiProc_INVALIDID) {
-                IntXbar_connect(30, 262);  // system mailbox 8 user 1
-                NotifySetup_module->interruptTable[9] = 61; // IPU1-1
-            }
+        /* plug mbx8 only if IPU1-1 exists */
+        if (MultiProc_getId("IPU1-1") != MultiProc_INVALIDID) {
+            IntXbar_connect(30, 262);  // system mailbox 8 user 1
+            NotifySetup_module->interruptTable[9] = 61; // IPU1-1
         }
-        return (Startup_DONE);
     }
 
-    return (Startup_NOTDONE);
+    return (Startup_DONE);
 
 #elif defined(xdc_target__isaCompatible_arp32)
 
@@ -294,7 +296,29 @@ Int NotifySetup_Module_startup(Int phase)
 
 #elif defined(xdc_target__isaCompatible_v7A)
 
-    /* TODO */
+    if (!IntXbar_Module_startupDone()) {
+        return (Startup_NOTDONE);
+    }
+
+    /* connect mailbox interrupts at startup */
+    IntXbar_connect(127, 286);  // eve1 mailbox 0 user 3
+    IntXbar_connect(128, 295);  // eve2 mailbox 0 user 3
+    IntXbar_connect(129, 251);  // system mailbox 5 user 2
+
+    /* plug eve3 and eve4 mbxs only if eve3 and eve4 exists */
+    if ((MultiProc_getId("EVE3") != MultiProc_INVALIDID) ||
+        (MultiProc_getId("EVE4") != MultiProc_INVALIDID)) {
+        IntXbar_connect(130, 304);  // eve3 mailbox 0 user 3
+        IntXbar_connect(131, 313);  // eve4 mailbox 0 user 3
+    }
+
+    /* plug mbx6 only if DSP2 or IPU2 exists */
+    if ((MultiProc_getId("DSP2") != MultiProc_INVALIDID) ||
+        (MultiProc_getId("IPU2") != MultiProc_INVALIDID) ||
+        (MultiProc_getId("IPU2-0") != MultiProc_INVALIDID)) {
+        IntXbar_connect(134, 255);  // system mailbox 6 user 2
+    }
+
     return (Startup_DONE);
 
 #else
@@ -364,9 +388,7 @@ Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
 {
     Error_Block eb;
     UInt        key;
-#if !defined(xdc_target__isaCompatible_v7A)
     Hwi_Params  hwiParams;
-#endif
     UInt16      srcVirtId;
 #if defined(xdc_target__isaCompatible_64P)
     Int         eventId;
@@ -375,7 +397,8 @@ Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
     UInt        mbxIdx;
     Int         eventId;
     Bits16      mask;
-#elif defined(xdc_target__isaCompatible_v7M)
+#elif defined(xdc_target__isaCompatible_v7M) \
+    || defined(xdc_target__isaCompatible_v7A)
     UInt16      idx;
     UInt        mbxIdx;
 #endif
@@ -385,10 +408,10 @@ Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
     /* disable interrupts */
     key = Hwi_disable();
 
-    /* map processor id to virtual id */
+    /* map remote processor id to virtual id */
     srcVirtId = VIRTID(remoteProcId);
 
-    /* save driver isr in dispatch table */
+    /* save driver ISR in dispatch table */
     NotifySetup_module->isrDispatchTable[srcVirtId] = isr;
 
 #if defined(xdc_target__isaCompatible_64P)
@@ -457,7 +480,8 @@ Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
         Hwi_enableInterrupt(NotifySetup_module->interruptTable[srcVirtId]);
     }
 
-#elif defined(xdc_target__isaCompatible_v7M)
+#elif defined(xdc_target__isaCompatible_v7M) \
+    || defined(xdc_target__isaCompatible_v7A)
 
     /* compute table index for given source and destination */
     idx = (srcVirtId * NotifySetup_NUM_CORES) + MultiProc_self();
@@ -480,10 +504,6 @@ Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
         Hwi_enableInterrupt(cpuIntrNum);
     }
 
-#elif defined(xdc_target__isaCompatible_v7A)
-
-    /* TODO */
-
 #else
 #error Invalid target
 #endif
@@ -498,15 +518,14 @@ Void NotifySetup_plugHwi(UInt16 remoteProcId, Int cpuIntrNum,
 Void NotifySetup_unplugHwi(UInt16 remoteProcId, Int cpuIntrNum)
 {
     UInt        key;
-#if !defined(xdc_target__isaCompatible_v7A)
     Hwi_Handle  hwi;
-#endif
     UInt16      srcVirtId;
 #if defined(xdc_target__isaCompatible_64P)
     Int         eventId;
 #elif defined(xdc_target__isaCompatible_arp32)
     UInt        mbxIdx;
-#elif defined(xdc_target__isaCompatible_v7M)
+#elif defined(xdc_target__isaCompatible_v7M) \
+    || defined(xdc_target__isaCompatible_v7A)
     UInt16      idx;
     UInt        mbxIdx;
 #endif
@@ -561,7 +580,8 @@ Void NotifySetup_unplugHwi(UInt16 remoteProcId, Int cpuIntrNum)
         Hwi_delete(&hwi);
     }
 
-#elif defined(xdc_target__isaCompatible_v7M)
+#elif defined(xdc_target__isaCompatible_v7M) \
+    || defined(xdc_target__isaCompatible_v7A)
 
     /* decrement plug count */
     idx = (srcVirtId * NotifySetup_NUM_CORES) + MultiProc_self();
@@ -574,10 +594,6 @@ Void NotifySetup_unplugHwi(UInt16 remoteProcId, Int cpuIntrNum)
         Hwi_delete(&hwi);
     }
 
-#elif defined(xdc_target__isaCompatible_v7A)
-
-    /* TODO */
-
 #else
 #error Invalid target
 #endif
@@ -702,7 +718,12 @@ Int NotifySetup_Mbx_attach(UInt16 remoteProcId, Ptr sharedAddr)
         (MultiProc_self() == NotifySetup_ipu2_0ProcId) ||
         (MultiProc_self() == NotifySetup_ipu2_1ProcId)) {
 
-        /* map processor id to virtual id */
+        virtId = VIRTID(remoteProcId);
+        params.intVectorId = NotifySetup_module->interruptTable[virtId];
+    }
+
+    /* set the intVectorId if on the HOST */
+    if (MultiProc_self() == NotifySetup_hostProcId) {
         virtId = VIRTID(remoteProcId);
         params.intVectorId = NotifySetup_module->interruptTable[virtId];
     }
index 9f2426a5e176ca098c4b9cd0462cf4b77e2dbf83..d9f3967bf8b77f0a51dbee4186c6dbac28b640e4 100644 (file)
@@ -35,6 +35,7 @@
  */
 var MultiProc = null;
 var Core = null;
+var Mmu = null;
 var isaChain = "";
 
 /*
@@ -84,7 +85,15 @@ function module$use()
         xdc.useModule('ti.sysbios.family.arp32.Hwi');
     }
     else if (isaChain.match(/#v7M#/)) {
+        xdc.useModule("ti.sysbios.BIOS");
         Core = xdc.useModule("ti.sysbios.family.arm.ducati.Core");
+        xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
+        xdc.useModule('ti.sysbios.family.shared.vayu.IntXbar');
+    }
+    else if (isaChain.match(/#v7A#/)) {
+        Mmu = xdc.useModule("ti.sysbios.family.arm.a15.Mmu");
+        xdc.useModule('ti.sysbios.family.arm.gic.Hwi');
+        xdc.useModule('ti.sysbios.family.shared.vayu.IntXbar');
     }
 
     xdc.useModule('ti.sdo.ipc.Ipc');
@@ -221,6 +230,23 @@ function module$use()
         throw("Invalid target: " + Program.build.target.$name);
     }
 
+    if (isaChain.match(/#v7A#/)) {
+        /*  Add mailbox addresses to the Mmu table.
+         *  Force mailbox addresses to be NON cacheable.
+         */
+        var peripheralAttrs = {
+            type : Mmu.DescriptorType_BLOCK,  // BLOCK descriptor
+            accPerm    : 0,                   // read/write at PL1
+            noExecute  : true,                // not executable
+            attrIndx   : 1                    // MAIR0 Byte1 describes mem attr
+        };
+
+        /* configure the corresponding MMU page descriptor */
+        Mmu.setSecondLevelDescMeta(0x42000000, 0x42000000, peripheralAttrs);
+        Mmu.setSecondLevelDescMeta(0x42200000, 0x42200000, peripheralAttrs);
+        Mmu.setSecondLevelDescMeta(0x48800000, 0x48800000, peripheralAttrs);
+    }
+
     /* determine which notify drivers to include */
     this.$private.driverMask = 0;
 
@@ -369,15 +395,23 @@ function module$static$init(state, mod)
         }
     }
     else if (isaChain.match(/#v7A#/)) {
-        state.numPlugged.length = 1;
-
-        /* interrupt event IDs used by this processor */
-        for (var i = 0; i < state.interruptTable.length; i++) {
-            state.interruptTable[i] = 0xFFFF; /* TODO */
+        state.numPlugged.length = mod.NUM_EVE_MBX + mod.NUM_SYS_MBX;
+        for (var i = 0; i < state.numPlugged.length; i++) {
+            state.numPlugged[i] = 0;
         }
 
-        /* TODO */
-        // Hwi.construct(state.hwi, 77, NotifyDriverMbx.isr);
+        /* obtained by looking at MPU IRQ + 32 */
+        state.interruptTable[0] = 134 + 32;   /* EVE1 */
+        state.interruptTable[1] = 135 + 32;   /* EVE2 */
+        state.interruptTable[2] = 137 + 32;   /* EVE3 */
+        state.interruptTable[3] = 138 + 32;   /* EVE4 */
+        state.interruptTable[4] = 136 + 32;   /* DSP1 */
+        state.interruptTable[5] = 141 + 32;   /* DSP2 */
+        state.interruptTable[6] = 136 + 32;   /* IPU1-0 */
+        state.interruptTable[7] = 141 + 32;   /* IPU2-0 */
+        state.interruptTable[8] = 0;          /* HOST */
+        state.interruptTable[9] = 136 + 32;   /* IPU1-1 */
+        state.interruptTable[10] = 141 + 32;  /* IPU2-1 */
     }
     else {
         throw("Invalid target: " + Program.build.target.$name);