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 */
32 /*
33 * ======== TableInit.xs ========
34 *
35 */
37 /*
38 * When assigning virtual indexes to each core make sure
39 * to assign even virtual indexes to DSP/M4 cores with
40 * even Core Ids, and assign odd virtual indexes to DSP/M4
41 * cores with odd Core Ids.
42 *
43 * Example:
44 * DSP physical Core Id = 0 -> Virtual Index = 4;
45 * DSP physical Core Id = 1 -> Virtual Index = 5;
46 *
47 * Virtual Index Assignment:
48 *
49 * | EVE1 -> 0 | EVE2 -> 1 | EVE3 -> 2 | EVE4 -> 3 |
50 * | DSP1 -> 4 | DSP2 -> 5 | IPU1-0 -> 6 | IPU2-0 -> 7 |
51 * | HOST -> 8 | IPU1-1 -> 9 | IPU2-1 -> 10
52 *
53 */
54 var eve1VirtId = 0;
55 var eve2VirtId = 1;
56 var eve3VirtId = 2;
57 var eve4VirtId = 3;
58 var dsp1VirtId = 4;
59 var dsp2VirtId = 5;
60 var ipu1_0VirtId = 6;
61 var ipu2_0VirtId = 7;
62 var hostVirtId = 8;
63 var ipu1_1VirtId = 9;
64 var ipu2_1VirtId = 10;
67 /*
68 * ======== initProcId ========
69 * Assign MultiProc ids and virtual processor ids.
70 */
71 function initProcId(mod)
72 {
73 var MultiProc = xdc.useModule("ti.sdo.utils.MultiProc");
75 for (var i = 0; i < mod.procIdTable.length; i++) {
76 mod.procIdTable[i] = -1;
77 }
79 mod.eve1ProcId = MultiProc.getIdMeta("EVE1");
80 mod.eve2ProcId = MultiProc.getIdMeta("EVE2");
81 mod.eve3ProcId = MultiProc.getIdMeta("EVE3");
82 mod.eve4ProcId = MultiProc.getIdMeta("EVE4");
83 mod.dsp1ProcId = MultiProc.getIdMeta("DSP1");
84 mod.dsp2ProcId = MultiProc.getIdMeta("DSP2");
85 mod.ipu1_0ProcId = MultiProc.getIdMeta("IPU1"); /* assume smp */
86 mod.ipu1_1ProcId = MultiProc.getIdMeta("IPU1-1");
87 mod.ipu2_0ProcId = MultiProc.getIdMeta("IPU2"); /* assume smp */
88 mod.ipu2_1ProcId = MultiProc.getIdMeta("IPU2-1");
89 mod.hostProcId = MultiProc.getIdMeta("HOST");
91 if (mod.eve1ProcId != MultiProc.INVALIDID) {
92 mod.procIdTable[mod.eve1ProcId] = eve1VirtId;
93 }
94 if (mod.eve2ProcId != MultiProc.INVALIDID) {
95 mod.procIdTable[mod.eve2ProcId] = eve2VirtId;
96 }
97 if (mod.eve3ProcId != MultiProc.INVALIDID) {
98 mod.procIdTable[mod.eve3ProcId] = eve3VirtId;
99 }
100 if (mod.eve4ProcId != MultiProc.INVALIDID) {
101 mod.procIdTable[mod.eve4ProcId] = eve4VirtId;
102 }
103 if (mod.dsp1ProcId != MultiProc.INVALIDID) {
104 mod.procIdTable[mod.dsp1ProcId] = dsp1VirtId;
105 }
106 if (mod.dsp2ProcId != MultiProc.INVALIDID) {
107 mod.procIdTable[mod.dsp2ProcId] = dsp2VirtId;
108 }
110 if (mod.ipu1_0ProcId != MultiProc.INVALIDID) {
111 mod.procIdTable[mod.ipu1_0ProcId] = ipu1_0VirtId;
112 }
113 else {
114 /* IPU1 not smp */
115 mod.ipu1_0ProcId = MultiProc.getIdMeta("IPU1-0");
117 if (mod.ipu1_0ProcId != MultiProc.INVALIDID) {
118 mod.procIdTable[mod.ipu1_0ProcId] = ipu1_0VirtId;
119 }
120 }
122 if (mod.ipu1_1ProcId != MultiProc.INVALIDID) {
123 mod.procIdTable[mod.ipu1_1ProcId] = ipu1_1VirtId;
124 }
126 if (mod.ipu2_0ProcId != MultiProc.INVALIDID) {
127 mod.procIdTable[mod.ipu2_0ProcId] = ipu2_0VirtId;
128 }
129 else {
130 /* IPU2 not smp */
131 mod.ipu2_0ProcId = MultiProc.getIdMeta("IPU2-0");
133 if (mod.ipu2_0ProcId != MultiProc.INVALIDID) {
134 mod.procIdTable[mod.ipu2_0ProcId] = ipu2_0VirtId;
135 }
136 }
138 if (mod.ipu2_1ProcId != MultiProc.INVALIDID) {
139 mod.procIdTable[mod.ipu2_1ProcId] = ipu2_1VirtId;
140 }
142 if (mod.hostProcId != MultiProc.INVALIDID) {
143 mod.procIdTable[mod.hostProcId] = hostVirtId;
144 }
145 }
147 /*
148 * Function to generate mailbox table
149 */
150 function generateTable(InterruptCore)
151 {
152 var SYS_MBX5_OFFSET = 0;
153 var SYS_MBX6_OFFSET = 1;
154 var SYS_MBX7_OFFSET = 2;
155 var SYS_MBX8_OFFSET = 3;
156 var eveMbx2BaseIdx = 2;
158 var subMbxIdx;
159 var tableEntry;
160 var mbxUserIdx;
161 var mbxBaseAddrIdx;
163 /*
164 * Each entry in the mailbox table stores 3 indexes.
165 * The breakup of each entry is shown below:
166 * Entry format : 0xAAAABBCC
167 * AAAA : Mailbox base address table index
168 * BB : Mailbox User Id
169 * CC : Sub-mailbox index
170 *
171 * In order to lookup the User Id, Sub-mailbox Index and mailbox base
172 * address for a given src and dst core from the mailboxTable, the
173 * procedure shown below is followed:
174 * 1. Find the right entry for the given src and dst core.
175 * mailboxTable index is given by:
176 * Index = (src * NumCores) + dst
177 * 2. Mbx BaseAddr Index = mailboxTable[Index] >> 16
178 * 2. dst Mailbox UserId = (mailboxTable[Index] >> 8) & 0xFF
179 * 3. Sub-Mailbox Index = mailboxTable[Index] & 0xFF
180 */
182 /*
183 * 'i' is src core index, and
184 * 'j' is dst core index
185 */
186 for (var i = 0; i < InterruptCore.NUM_CORES; i++) {
187 for (var j = 0; j < InterruptCore.NUM_CORES; j++) {
188 /* init mailboxTable */
189 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = -1;
191 /* EVE Internal Mailbox 2 */
192 if ((i < InterruptCore.NUM_EVES) && (j < InterruptCore.NUM_EVES)) {
194 /* Generate 3 masks forming a single table entry */
195 mbxBaseAddrIdx = ((j * 3) + eveMbx2BaseIdx) << 16;
197 /*
198 * Determined based on the send remote receive local
199 * methodology being followed for EVE-to-EVE communication.
200 */
201 mbxUserIdx = 0 << 8;
202 subMbxIdx = i;
204 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
205 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
206 continue;
207 }
209 /* EVE Internal Mailbox 0/1 */
210 if ((i < InterruptCore.NUM_EVES) || (j < InterruptCore.NUM_EVES)) {
211 if (i < InterruptCore.NUM_EVES) {
212 mbxBaseAddrIdx = ((i * 3) + (j % 2)) << 16;
214 if ((j == dsp1VirtId) || (j == dsp2VirtId)) {
215 /* Destination is DSP1 or DSP2 */
216 mbxUserIdx = 1 << 8;
217 subMbxIdx = 0;
218 }
219 else if ((j == ipu1_0VirtId) || (j == ipu2_0VirtId)) {
220 /* Destination is IPU1-0 or IPU2-0 */
221 mbxUserIdx = 2 << 8;
222 subMbxIdx = 2;
223 }
224 else if ((j == ipu1_1VirtId) || (j == hostVirtId) ||
225 (j == ipu2_1VirtId)) {
226 /* Destination is Host or IPU1-1 */
227 mbxUserIdx = 3 << 8;
228 subMbxIdx = 4;
230 if (j == ipu2_1VirtId) {
231 mbxBaseAddrIdx = ((i * 3) + ((j - 1) % 2)) << 16;
232 }
233 }
235 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
236 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
237 continue;
238 }
239 else if (j < InterruptCore.NUM_EVES) {
240 mbxBaseAddrIdx = ((j * 3) + (i % 2)) << 16;
241 mbxUserIdx = 0 << 8; /* destination is always EVE */
243 if ((i == dsp1VirtId) || (i == dsp2VirtId)) {
244 /* Source is DSP1 or DSP2 */
245 subMbxIdx = 1;
246 }
247 else if ((i == ipu1_0VirtId) || (i == ipu2_0VirtId)) {
248 /* Source is IPU1-0 or IPU2-0 */
249 subMbxIdx = 3;
250 }
251 else if ((i == ipu1_1VirtId) || (i == hostVirtId) ||
252 (i == ipu2_1VirtId)) {
253 /* Source is Host or IPU1-1*/
254 subMbxIdx = 5;
256 if (i == ipu2_1VirtId) {
257 mbxBaseAddrIdx = ((j * 3) + ((i - 1) % 2)) << 16;
258 }
259 }
261 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
262 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
263 continue;
264 }
265 }
267 /* System Mailbox 5 */
268 /* For communication between HOST<->DSP1/IPU1 */
269 if (((i == dsp1VirtId) || (i == ipu1_0VirtId) ||
270 (i == hostVirtId) || (i == ipu1_1VirtId)) &&
271 ((j == dsp1VirtId) || (j == ipu1_0VirtId) ||
272 (j == hostVirtId) || (j == ipu1_1VirtId))) {
273 mbxBaseAddrIdx = ((InterruptCore.NUM_EVES * 3) +
274 SYS_MBX5_OFFSET) << 16;
276 /* These combinations does not need mailbox */
277 if ((i == j) ||
278 (i == ipu1_0VirtId && j == ipu1_1VirtId) ||
279 (i == ipu1_1VirtId && j == ipu1_0VirtId)) {
280 continue;
281 }
283 if (j == dsp1VirtId) {
284 mbxUserIdx = 0;
285 if (i == ipu1_0VirtId) {
286 subMbxIdx = 3;
287 }
288 else if (i == hostVirtId) {
289 subMbxIdx = 5;
290 }
291 else if (i == ipu1_1VirtId) {
292 subMbxIdx = 8;
293 }
294 }
295 else if (j == ipu1_0VirtId) {
296 mbxUserIdx = 1 << 8;
297 if (i == dsp1VirtId) {
298 subMbxIdx = 0;
299 }
300 else if (i == hostVirtId) {
301 subMbxIdx = 6;
302 }
303 }
304 else if (j == hostVirtId) {
305 mbxUserIdx = 2 << 8;
306 if (i == dsp1VirtId) {
307 subMbxIdx = 1;
308 }
309 else if (i == ipu1_0VirtId) {
310 subMbxIdx = 4;
311 }
312 else if (i == ipu1_1VirtId) {
313 subMbxIdx = 9;
314 }
315 }
316 else if (j == ipu1_1VirtId) {
317 mbxUserIdx = 3 << 8;
318 if (i == dsp1VirtId) {
319 subMbxIdx = 2;
320 }
321 else if (i == hostVirtId) {
322 subMbxIdx = 7;
323 }
324 }
326 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
327 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
328 continue;
329 }
331 /* System Mailbox 6 */
332 /* For communication between HOST<->DSP2/IPU2 */
333 if (((i == dsp2VirtId) || (i == ipu2_0VirtId) ||
334 (i == hostVirtId) || (i == ipu2_1VirtId)) &&
335 ((j == dsp2VirtId) || (j == ipu2_0VirtId) ||
336 (j == hostVirtId) || (j ==ipu2_1VirtId))) {
337 mbxBaseAddrIdx = ((InterruptCore.NUM_EVES * 3) +
338 SYS_MBX6_OFFSET) << 16;
340 /* These combinations does not need mailbox */
341 if ((i == j) ||
342 (i == ipu2_0VirtId && j == ipu2_1VirtId) ||
343 (i == ipu2_1VirtId && j == ipu2_0VirtId)) {
344 continue;
345 }
347 if (j == dsp2VirtId) {
348 mbxUserIdx = 0;
349 if (i == ipu2_0VirtId) {
350 subMbxIdx = 3;
351 }
352 else if (i == hostVirtId) {
353 subMbxIdx = 5;
354 }
355 else if (i == ipu2_1VirtId) {
356 subMbxIdx = 8;
357 }
358 }
359 else if (j == ipu2_0VirtId) {
360 mbxUserIdx = 1 << 8;
361 if (i == dsp2VirtId) {
362 subMbxIdx = 0;
363 }
364 else if (i == hostVirtId) {
365 subMbxIdx = 6;
366 }
367 }
368 else if (j == hostVirtId) {
369 mbxUserIdx = 2 << 8;
370 if (i == dsp2VirtId) {
371 subMbxIdx = 1;
372 }
373 else if (i == ipu2_0VirtId) {
374 subMbxIdx = 4;
375 }
376 else if (i == ipu2_1VirtId) {
377 subMbxIdx = 9;
378 }
379 }
380 else if (j == ipu2_1VirtId) {
381 mbxUserIdx = 3 << 8;
382 if (i == dsp2VirtId) {
383 subMbxIdx = 2;
384 }
385 else if (i == hostVirtId) {
386 subMbxIdx = 7;
387 }
388 }
390 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
391 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
392 continue;
393 }
395 /*
396 * System Mailbox 7
397 * This is for communication between DSP1/IPU1_0<->DSP2/IPU2-0
398 * but not DSP1<->IPU1-0 or DSP<->IPU2-0. Those communication
399 * lines have already been established above.
400 */
401 if (((i == dsp1VirtId) || (i == dsp2VirtId) ||
402 (i == ipu1_0VirtId) || (i == ipu2_0VirtId)) &&
403 ((j == dsp1VirtId) || (j == dsp2VirtId) ||
404 (j == ipu1_0VirtId) || (j == ipu2_0VirtId))) {
406 mbxBaseAddrIdx = ((InterruptCore.NUM_EVES * 3) +
407 SYS_MBX7_OFFSET) << 16;
409 /* DSP1/IPU1 and DSP2/IPU2 already established previously */
410 if (i == j) {
411 continue;
412 }
413 if ((i == dsp1VirtId && j == ipu1_0VirtId) ||
414 (i == dsp2VirtId && j == ipu2_0VirtId)) {
415 continue;
416 }
418 if (j == dsp1VirtId) {
419 mbxUserIdx = 0;
420 if (i == dsp2VirtId) {
421 subMbxIdx = 2;
422 }
423 else if (i == ipu2_0VirtId) {
424 subMbxIdx = 6;
425 }
426 }
427 else if (j == dsp2VirtId) {
428 mbxUserIdx = 1 << 8;
429 if (i == dsp1VirtId) {
430 subMbxIdx = 0;
431 }
432 else if (i == ipu1_0VirtId) {
433 subMbxIdx = 4;
434 }
435 }
436 else if (j == ipu1_0VirtId) {
437 mbxUserIdx = 2 << 8;
438 if (i == dsp2VirtId) {
439 subMbxIdx = 3;
440 }
441 else if (i == ipu2_0VirtId) {
442 subMbxIdx = 7;
443 }
444 }
445 else if (j == ipu2_0VirtId) {
446 mbxUserIdx = 3 << 8;
447 if (i == dsp1VirtId) {
448 subMbxIdx = 1;
449 }
450 else if (i == ipu1_0VirtId) {
451 subMbxIdx = 5;
452 }
453 }
455 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
456 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
457 }
459 /*
460 * System Mailbox 8
461 * This only required only if one of the IPU is running
462 * NON-SMP BIOS. This is for the second core of
463 * IPU1-1<->DSP2/IPU2 or second core of IPU2-1<->DSP1/IPU1.
464 */
465 if (((i == dsp1VirtId) || (i == dsp2VirtId) ||
466 (i == ipu1_0VirtId) || (i == ipu1_1VirtId) ||
467 (i == ipu2_0VirtId) || (i == ipu2_1VirtId)) &&
468 ((j == dsp1VirtId) || (j == dsp2VirtId) ||
469 (j == ipu1_0VirtId) || (j == ipu1_1VirtId) ||
470 (j == ipu2_0VirtId) || (j == ipu2_1VirtId))) {
472 mbxBaseAddrIdx = ((InterruptCore.NUM_EVES * 3) +
473 SYS_MBX8_OFFSET) << 16;
475 //print("i= " + i + " j= " + j);
477 /* Don't set any previously established lines */
478 if (i == j) {
479 continue;
480 }
482 if ((i == dsp1VirtId) && (j != ipu2_1VirtId)) {
483 continue;
484 }
486 if ((i == dsp2VirtId) && (j != ipu1_1VirtId)) {
487 continue;
488 }
490 if ((i == ipu1_0VirtId) && (j != ipu2_1VirtId)) {
491 continue;
492 }
494 if ((i == ipu1_1VirtId) &&
495 ((j != dsp2VirtId) && (j != ipu2_0VirtId))) {
496 continue;
497 }
499 if ((i == ipu2_0VirtId) && (j != ipu1_1VirtId)) {
500 continue;
501 }
503 if ((i == ipu2_1VirtId) &&
504 ((j != dsp1VirtId) && (j != ipu1_0VirtId))) {
505 continue;
506 }
508 /* Set new communication lines */
509 if (j == dsp1VirtId) {
510 /* only required when IPU2 is NON-SMP BIOS */
511 mbxUserIdx = 0;
512 if (i == ipu2_1VirtId) {
513 subMbxIdx = 2;
514 }
515 }
516 else if (j == dsp2VirtId) {
517 /* only required when IPU1 is NON-SMP BIOS */
518 mbxUserIdx = 1 << 8;
519 if (i == ipu1_1VirtId) {
520 subMbxIdx = 1;
521 }
522 }
523 else if (j == ipu1_0VirtId) {
524 /* only required when IPU2 is NON-SMP BIOS */
525 mbxUserIdx = 2 << 8;
526 if (i == ipu2_1VirtId) {
527 subMbxIdx = 3;
528 }
529 }
530 else if (j == ipu1_1VirtId) {
531 /* only required when IPU1 is NON-SMP BIOS */
532 mbxUserIdx = 2 << 8;
533 if (i == dsp2VirtId) {
534 subMbxIdx = 0;
535 }
536 else if (i == ipu2_0VirtId) {
537 subMbxIdx = 3;
538 }
539 }
540 else if (j == ipu2_0VirtId) {
541 /* only required when IPU1 is NON-SMP BIOS */
542 mbxUserIdx = 3 << 8;
543 if (i == ipu1_1VirtId) {
544 subMbxIdx = 2;
545 }
546 }
547 else if (j == ipu2_1VirtId) {
548 /* only required when IPU2 is NON-SMP BIOS */
549 mbxUserIdx = 3 << 8;
550 if (i == dsp1VirtId) {
551 subMbxIdx = 0;
552 }
553 else if (i == ipu1_0VirtId) {
554 subMbxIdx = 1;
555 }
556 }
558 tableEntry = mbxBaseAddrIdx | mbxUserIdx | subMbxIdx;
559 InterruptCore.mailboxTable[i*InterruptCore.NUM_CORES + j] = tableEntry;
560 }
561 }
562 }
563 }