2021fcf4aaac2882e8c30b8600c1582d04143475
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / vayu / TableInit.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  */
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     }
147 /*
148  * Function to generate mailbox table
149  */
150 function generateTable(InterruptCore)
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     }