Move Interrupt and NotifyCircSetup modules into tci663x
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / tci663x / Interrupt.xs
1 /*
2  * Copyright (c) 2014-2015 Texas Instruments Incorporated - http://www.ti.com
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  *   Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  *
11  *   Redistributions in binary form must reproduce the above copyright
12  *   notice, this list of conditions and the following disclaimer in the
13  *   documentation and/or other materials provided with the
14  *   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
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
33 /*
34  *  ======== Interrupt.xs ========
35  */
37 var deviceSettings = {
38     /* all Keystone II devices inherit from TCI6634 */
39     'TMS320TCI6634' : {
40         IPCGR0:         0x02620240,
41         IPCAR0:         0x02620280,
42         IPCGRH:         0x02620260,
43         IPCARH:         0x026202A0,
44         KICK0:          0x02620038,
45         KICK1:          0x0262003C,
46         INTERDSPINT:    105
47     }
48 };
50 var Settings = xdc.loadCapsule('ti/sdo/ipc/family/Settings.xs');
51 Settings.setDeviceAliases(deviceSettings, Settings.deviceAliases);
53 var MultiProc;
55 /*
56  *  ======== module$meta$init ========
57  */
58 function module$meta$init()
59 {
60     /* only process during "cfg" phase */
61     if (xdc.om.$name != "cfg") {
62         return;
63     }
65     var settings = deviceSettings[Program.cpu.deviceName];
67     this.IPCGR0         = settings.IPCGR0;
68     this.IPCAR0         = settings.IPCAR0;
69     this.IPCGRH         = settings.IPCGRH;
70     this.IPCARH         = settings.IPCARH;
71     this.KICK0          = settings.KICK0;
72     this.KICK1          = settings.KICK1;
73     this.INTERDSPINT    = settings.INTERDSPINT;
74 }
76 /*
77  *  ======== module$use ========
78  */
79 function module$use()
80 {
81     xdc.useModule("ti.sysbios.hal.Hwi");
82     xdc.useModule("ti.sdo.ipc.family.tci663x.MultiProcSetup");
84     MultiProc = xdc.useModule("ti.sdo.utils.MultiProc");
86     /*  Hack: fix conflict between NotifyDriverCirc and VirtQueue.
87      *
88      *  If both of these modules are in the configuration, then instruct
89      *  the NotifyCircSetup module to exclude the host during the IPC
90      *  attach phase.
91      */
92     var ncsName = this.$package.$name + ".NotifyCircSetup";
93     var vqName = "ti.ipc.family.tci6638.VirtQueue";
95     var notifySetup = ((ncsName in xdc.om) && xdc.module(ncsName).$used);
96     var virtQue = ((vqName in xdc.om) && xdc.module(vqName).$used);
98     if (notifySetup && virtQue) {
99         xdc.module(ncsName).includeHost = false;
100     }
103 /*
104  *  ======== module$static$init ========
105  */
106 function module$static$init(state, mod)
108     state.numPlugged = 0;
109     state.baseId = MultiProc.baseIdOfCluster;
110     state.hwi = null;
112     /* initialize client function table */
113     state.clientTab.length = MultiProc.numProcsInCluster;
115     for (var i = 0; i < state.clientTab.length; i++) {
116         state.clientTab[i].func = null;
117         state.clientTab[i].arg = -1;
118     }
120     /* initialize ipcar source bit mapping */
121     state.hwTab.length = MultiProc.numProcsInCluster;
123     for (var i = 0; i < state.hwTab.length; i++) {
124         var name = MultiProc.nameList[i];
126         if (name == "HOST") {
127             state.hwTab[i].dnum = MultiProc.INVALIDID;
128             /* by convention, host is bit 31 in ipcgr and ipcar registers */
129             state.hwTab[i].srcsx = 31;
130         }
131         else {
132             /* the numeric part of the name string determines the coreId */
133             var coreId = Number(name.substring("CORE".length));
134             state.hwTab[i].dnum = coreId;
135             state.hwTab[i].srcsx = coreId + mod.SRCSx_SHIFT;
136         }
137     }
140 /*
141  *************************************************************************
142  *                       ROV View functions
143  *************************************************************************
144  */
146 /*
147  *  ======== viewInterruptsData ========
148  *  Module data view
149  */
150 function viewInterruptsData(view)
152     var Interrupt       = xdc.useModule('ti.sdo.ipc.family.tci663x.Interrupt');
153     var ScalarStructs   = xdc.useModule('xdc.rov.support.ScalarStructs');
154     var MultiProc       = xdc.useModule('ti.sdo.utils.MultiProc');
156     /* Retrieve the module state. */
157     var rawView = Program.scanRawView('ti.sdo.ipc.family.tci663x.Interrupt');
158     var mod = rawView.modState;
159     /* Retrieve the module configuration. */
160     var modCfg = Program.getModuleConfig('ti.sdo.ipc.family.tci663x.Interrupt');
161     var MultiProcCfg = Program.getModuleConfig('ti.sdo.utils.MultiProc');
163     var clientTab = Program.fetchArray(Interrupt.clientTab$fetchDesc,
164             mod.clientTab, MultiProcCfg.numProcessors);
166     var localId = MultiProc.self$view();
168     if (localId != MultiProc.INVALIDID) {
169         var ipcar0 = Program.fetchArray(ScalarStructs.S_Bits32$fetchDesc,
170             $addr(modCfg.IPCAR0), MultiProcCfg.numProcessors, false);
171     }
173     for (var i = 0; i < MultiProcCfg.numProcsInCluster; i++) {
174         var entryView =
175                 Program.newViewStruct('ti.sdo.ipc.family.tci663x.Interrupt',
176                 'Registered Interrupts');
178         entryView.remoteCoreId = MultiProc.baseIdOfCluster + i;
180         var fxn = Number(clientTab[i].func);
181         if (fxn != 0) {
182             entryView.isrFxn = Program.lookupFuncName(fxn)[0];
183             entryView.isrArg = "0x" + Number(clientTab[i].arg).toString(16);
184         }
185         else {
186             entryView.isrFxn = "(unplugged)";
187             entryView.isrArg = "";
188         }
190         if (localId != MultiProc.INVALIDID) {
191             var enableFlag = ipcar0[localId].elem;
193             if (enableFlag & (1 << (i + Interrupt.SRCSx_SHIFT))) {
194                 entryView.isFlagged = true;
195             }
196             else {
197                 entryView.isFlagged = false;
198             }
199         }
201         view.elements.$add(entryView);
202     }