51199528a3dc65d8cc9a89413d109aacd32c79f7
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / vayu / NotifySetup.xs
1 /*
2  * Copyright (c) 2012-2014 Texas Instruments Incorporated - http://www.ti.com
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * *  Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * *  Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * *  Neither the name of Texas Instruments Incorporated nor the names of
17  *    its contributors may be used to endorse or promote products derived
18  *    from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
27  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
29  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 /*
34  *  ======== NotifySetup.xs ========
35  */
36 var MultiProc = null;
37 var Core = null;
38 var isaChain = "";
40 /*
41  *  ======== module$use ========
42  */
43 function module$use()
44 {
45     /* load modules needed in meta domain and in target domain */
46     var TableInit = xdc.useModule("ti.sdo.ipc.family.vayu.TableInit");
47     MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
48     xdc.useModule('xdc.runtime.Assert');
49     xdc.useModule('xdc.runtime.Error');
50     xdc.useModule('xdc.runtime.Startup');
52     /* concatinate isa chain into single string for easier matching */
53     isaChain = "#" + Program.build.target.getISAChain().join("#") + "#";
55     if (isaChain.match(/#64P#/)) {
56         xdc.useModule('ti.sysbios.family.c64p.EventCombiner');
57         xdc.useModule('ti.sysbios.family.c64p.Hwi');
58         xdc.useModule('ti.sysbios.family.shared.vayu.IntXbar');
59     }
60     else if (isaChain.match(/#arp32#/)) {
61         xdc.useModule('ti.sysbios.family.arp32.Hwi');
62     }
63     else if (isaChain.match(/#v7M#/)) {
64         Core = xdc.useModule("ti.sysbios.family.arm.ducati.Core");
65     }
67     xdc.useModule('ti.sdo.ipc.Ipc');
68     xdc.useModule('ti.sdo.ipc.Notify');
70     /* initialize procIdTable */
71     TableInit.initProcId(this);
73     /* initialize mailboxTable */
74     TableInit.generateTable(this);
76     if (isaChain.match(/#64P#|#v7M#|#v7A#/)) {
77         /* initialize mailbox base address table */
78         this.mailboxBaseAddr[0]  = 0x4208B000;  /* EVE1 Internal Mailbox 0 */
79         this.mailboxBaseAddr[1]  = 0x4208C000;  /* EVE1 Internal Mailbox 1 */
80         this.mailboxBaseAddr[2]  = 0x4208D000;  /* EVE1 Internal Mailbox 2 */
81         this.mailboxBaseAddr[3]  = 0x4218B000;  /* EVE2 Internal Mailbox 0 */
82         this.mailboxBaseAddr[4]  = 0x4218C000;  /* EVE2 Internal Mailbox 1 */
83         this.mailboxBaseAddr[5]  = 0x4218D000;  /* EVE2 Internal Mailbox 2 */
84         this.mailboxBaseAddr[6]  = 0x4228B000;  /* EVE3 Internal Mailbox 0 */
85         this.mailboxBaseAddr[7]  = 0x4228C000;  /* EVE3 Internal Mailbox 1 */
86         this.mailboxBaseAddr[8]  = 0x4228D000;  /* EVE3 Internal Mailbox 2 */
87         this.mailboxBaseAddr[9]  = 0x4238B000;  /* EVE4 Internal Mailbox 0 */
88         this.mailboxBaseAddr[10] = 0x4238C000;  /* EVE4 Internal Mailbox 1 */
89         this.mailboxBaseAddr[11] = 0x4238D000;  /* EVE4 Internal Mailbox 2 */
90         this.mailboxBaseAddr[12] = 0x48840000;  /* System Mailbox 5 */
91         this.mailboxBaseAddr[13] = 0x48842000;  /* System Mailbox 6 */
92         this.mailboxBaseAddr[14] = 0x48844000;  /* System Mailbox 7 */
93         this.mailboxBaseAddr[15] = 0x48846000;  /* System Mailbox 8 */
94     }
95     else if (isaChain.match(/#arp32#/)) {
96         this.mailboxBaseAddr[0]  = 0x4008B000;  /* EVE1 Internal Mailbox 0 */
97         this.mailboxBaseAddr[1]  = 0x4008C000;  /* EVE1 Internal Mailbox 1 */
98         this.mailboxBaseAddr[2]  = 0x4208D000;  /* EVE1 Internal Mailbox 2 */
99         this.mailboxBaseAddr[3]  = 0x4008B000;  /* EVE2 Internal Mailbox 0 */
100         this.mailboxBaseAddr[4]  = 0x4008C000;  /* EVE2 Internal Mailbox 1 */
101         this.mailboxBaseAddr[5]  = 0x4218D000;  /* EVE2 Internal Mailbox 2 */
102         this.mailboxBaseAddr[6]  = 0x4008B000;  /* EVE3 Internal Mailbox 0 */
103         this.mailboxBaseAddr[7]  = 0x4008C000;  /* EVE3 Internal Mailbox 1 */
104         this.mailboxBaseAddr[8]  = 0x4228D000;  /* EVE3 Internal Mailbox 2 */
105         this.mailboxBaseAddr[9]  = 0x4008B000;  /* EVE4 Internal Mailbox 0 */
106         this.mailboxBaseAddr[10] = 0x4008C000;  /* EVE4 Internal Mailbox 1 */
107         this.mailboxBaseAddr[11] = 0x4238D000;  /* EVE4 Internal Mailbox 2 */
108         this.mailboxBaseAddr[12] = 0x48840000;  /* System Mailbox 5 */
109         this.mailboxBaseAddr[13] = 0x48842000;  /* System Mailbox 6 */
110         this.mailboxBaseAddr[14] = 0x48844000;  /* System Mailbox 7 */
111         this.mailboxBaseAddr[15] = 0x48846000;  /* System Mailbox 8 */
113         /* each EVE receives its message using the local mailbox address */
114         if (MultiProc.id == this.eve1ProcId) {
115             this.mailboxBaseAddr[2] = 0x4008D000;
116         }
117         else if (MultiProc.id == this.eve2ProcId) {
118             this.mailboxBaseAddr[5] = 0x4008D000;
119         }
120         else if (MultiProc.id == this.eve3ProcId) {
121             this.mailboxBaseAddr[8] = 0x4008D000;
122         }
123         else if (MultiProc.id == this.eve4ProcId) {
124             this.mailboxBaseAddr[11] = 0x4008D000;
125         }
126     }
127     else {
128         throw("Invalid target: " + Program.build.target.$name);
129     }
131     /* determine which notify drivers to include */
132     this.$private.driverMask = 0;
134     /* for unspecfied connections, the default is shared memory */
135     if (this.connections.length < (MultiProc.numProcessors - 1)) {
136         this.$private.driverMask |= this.Driver_SHAREDMEMORY;
137     }
139     /* remember which notify drivers have been specified */
140     for (var i = 0; i < this.connections.length; i++) {
141         if (this.connections[i].driver == this.Driver_SHAREDMEMORY) {
142             this.$private.driverMask |= this.Driver_SHAREDMEMORY;
143         }
144         if (this.connections[i].driver == this.Driver_MAILBOX) {
145             this.$private.driverMask |= this.Driver_MAILBOX;
146         }
147     }
149     /* load notify drivers into configuration model */
150     if (this.$private.driverMask & this.Driver_SHAREDMEMORY) {
151         xdc.useModule('ti.sdo.ipc.notifyDrivers.NotifyDriverShm');
152     }
153     if (this.$private.driverMask & this.Driver_MAILBOX) {
154         xdc.useModule('ti.sdo.ipc.family.vayu.NotifyDriverMbx');
155     }
158 /*
159  *  ======== module$static$init ========
160  *  Initialize the target state object.
161  */
162 function module$static$init(state, mod)
164     var procId;
166     /* Initialize the state connAry from the config params. Translate
167      * processor names into IDs for better runtime performance.
168      */
169     state.connAry.length = mod.connections.length;
171     for (var i = 0; i < mod.connections.length; i++) {
172         procId = MultiProc.getIdMeta(mod.connections[i].procName);
173         state.connAry[i].procId = procId;
174         state.connAry[i].driver = mod.connections[i].driver;
175     }
177     if (isaChain.match(/#64P#/)) {
178         state.numPlugged.length = 1;
180         /* interrupt event IDs used by this processor */
181         state.interruptTable[0] = 55; /* EVE1 -> DSP1 or DSP2 */
182         state.interruptTable[1] = 56; /* EVE2 -> DSP1 or DSP2 */
183         state.interruptTable[2] = 58; /* EVE3 -> DSP1 or DSP2 */
184         state.interruptTable[3] = 59; /* EVE4 -> DSP1 or DSP2 */
185         state.interruptTable[4] = 60; /* DSP1 -> DSP2 */
186         state.interruptTable[5] = 60; /* DSP2 -> DSP1 */
187         state.interruptTable[8] = 57; /* HOST -> DSP1 or DSP2 */
189         /* these are not known at config time, set at runtime */
190         state.interruptTable[6] = 0; /* IPU1 -> DSP1 or DSP2 */
191         state.interruptTable[7] = 0; /* IPU2 -> DSP1 or DSP2 */
192         state.interruptTable[9] = 0; /* IPU1-1 -> DSP1 or DSP2 */
193         state.interruptTable[10] = 0; /* IPU2-1 -> DSP1 or DSP2 */
194     }
195     else if (isaChain.match(/#arp32#/)) {
196         state.numPlugged.length = this.NUM_EVE_MBX / this.NUM_EVES;
198         /* interrupt event IDs used by this processor */
199         state.interruptTable[0] = 60; /* EVE1 - Group1/INTC1 */
200         state.interruptTable[1] = 60; /* EVE2 - Group1/INTC1 */
201         state.interruptTable[2] = 60; /* EVE3 - Group1/INTC1 */
202         state.interruptTable[3] = 60; /* EVE4 - Group1/INTC1 */
203         state.interruptTable[4] = 29; /* DSP1 - Group0/INTC0 */
204         state.interruptTable[5] = 30; /* DSP2 - Group0/INTC0 */
205         state.interruptTable[6] = 29; /* IPU1-0 */
206         state.interruptTable[7] = 30; /* IPU2-0 */
207         state.interruptTable[8] = 29; /* HOST */
208         state.interruptTable[9] = 30; /* IPU1-1 */
209         state.interruptTable[10] = 30; /* IPU2-1 */
210     }
211     else if (isaChain.match(/#v7M#/)) {
212         state.numPlugged.length = 1;
214         /* TODO */
215 //      if (Core.id == 0) {
216 //          Hwi.construct(state.hwi, 53, NotifyDriverMbx.isr);
217 //      }
218 //      else {
219 //          Hwi.construct(state.hwi, 54, NotifyDriverMbx.isr);
220 //      }
222         /* interrupt event IDs used by this processor */
223         for (var i = 0; i < state.interruptTable.length; i++) {
224             state.interruptTable[i] = 0xFFFF; /* TODO */
225         }
226     }
227     else if (isaChain.match(/#v7A#/)) {
228         state.numPlugged.length = 1;
230         /* interrupt event IDs used by this processor */
231         for (var i = 0; i < state.interruptTable.length; i++) {
232             state.interruptTable[i] = 0xFFFF; /* TODO */
233         }
235         /* TODO */
236         // Hwi.construct(state.hwi, 77, NotifyDriverMbx.isr);
237     }
238     else {
239         throw("Invalid target: " + Program.build.target.$name);
240     }
242     /* initialize the driver table */
243     for (var i = 0; i < state.isrDispatchTable.length; i++) {
244         state.isrDispatchTable[i] = null;
245     }