Standardize #ifdef usage in the Interrupt Module
[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 isaChain = "";
38 var deviceSettings = {
39     /* all Keystone II devices inherit from TCI6634 */
40     'TMS320TCI6634' : {
41         IPCGR0:         0x02620240,
42         IPCAR0:         0x02620280,
43         IPCGRH:         0x02620260,
44         IPCARH:         0x026202A0,
45         KICK0:          0x02620038,
46         KICK1:          0x0262003C,
47         INTERDSPINT:    105,
48         IPCHOSTINT:     4
49     }
50 };
52 var Settings = xdc.loadCapsule('ti/sdo/ipc/family/Settings.xs');
53 Settings.setDeviceAliases(deviceSettings, Settings.deviceAliases);
55 var MultiProc;
57 /*
58  *  ======== module$meta$init ========
59  */
60 function module$meta$init()
61 {
62     /* only process during "cfg" phase */
63     if (xdc.om.$name != "cfg") {
64         return;
65     }
67     /* concatinate isa chain into single string for easier matching */
68     isaChain = "#" + Program.build.target.getISAChain().join("#") + "#";
70     var settings = deviceSettings[Program.cpu.deviceName];
72     this.IPCGR0         = settings.IPCGR0;
73     this.IPCAR0         = settings.IPCAR0;
74     this.IPCGRH         = settings.IPCGRH;
75     this.IPCARH         = settings.IPCARH;
76     this.KICK0          = settings.KICK0;
77     this.KICK1          = settings.KICK1;
78     if (isaChain.match(/#64P#/)) {
79         this.INTERDSPINT    = settings.INTERDSPINT;
80     }
81     else if (isaChain.match(/#v7A#/)) {
82         this.INTERDSPINT    = settings.IPCHOSTINT;
83     }
84 }
86 /*
87  *  ======== module$use ========
88  */
89 function module$use()
90 {
91     xdc.useModule("ti.sysbios.hal.Hwi");
92     xdc.useModule("ti.sdo.ipc.family.tci663x.MultiProcSetup");
94     MultiProc = xdc.useModule("ti.sdo.utils.MultiProc");
96     /*  Hack: fix conflict between NotifyDriverCirc and VirtQueue.
97      *
98      *  If both of these modules are in the configuration, then instruct
99      *  the NotifyCircSetup module to exclude the host during the IPC
100      *  attach phase.
101      */
102     var ncsName = this.$package.$name + ".NotifyCircSetup";
103     var vqName = "ti.ipc.family.tci6638.VirtQueue";
105     var notifySetup = ((ncsName in xdc.om) && xdc.module(ncsName).$used);
106     var virtQue = ((vqName in xdc.om) && xdc.module(vqName).$used);
108     if (notifySetup && virtQue) {
109         xdc.module(ncsName).includeHost = false;
110     }
113 /*
114  *  ======== module$static$init ========
115  */
116 function module$static$init(state, mod)
118     state.numPlugged = 0;
119     state.baseId = MultiProc.baseIdOfCluster;
120     state.hwi = null;
122     /* initialize client function table */
123     state.clientTab.length = MultiProc.numProcsInCluster;
125     for (var i = 0; i < state.clientTab.length; i++) {
126         state.clientTab[i].func = null;
127         state.clientTab[i].arg = -1;
128     }
130     /* initialize ipcar source bit mapping */
131     state.hwTab.length = MultiProc.numProcsInCluster;
133     for (var i = 0; i < state.hwTab.length; i++) {
134         var name = MultiProc.nameList[i];
136         if (name == "HOST") {
137             state.hwTab[i].dnum = MultiProc.INVALIDID;
138             /* by convention, host is bit 31 in ipcgr and ipcar registers */
139             state.hwTab[i].srcsx = 31;
140         }
141         else {
142             /* the numeric part of the name string determines the coreId */
143             var coreId = Number(name.substring("CORE".length));
144             state.hwTab[i].dnum = coreId;
145             state.hwTab[i].srcsx = coreId + mod.SRCSx_SHIFT;
146         }
147     }
150 /*
151  *************************************************************************
152  *                       ROV View functions
153  *************************************************************************
154  */
156 /*
157  *  ======== viewInterruptsData ========
158  *  Module data view
159  */
160 function viewInterruptsData(view)
162     var Interrupt       = xdc.useModule('ti.sdo.ipc.family.tci663x.Interrupt');
163     var ScalarStructs   = xdc.useModule('xdc.rov.support.ScalarStructs');
164     var MultiProc       = xdc.useModule('ti.sdo.utils.MultiProc');
166     /* Retrieve the module state. */
167     var rawView = Program.scanRawView('ti.sdo.ipc.family.tci663x.Interrupt');
168     var mod = rawView.modState;
169     /* Retrieve the module configuration. */
170     var modCfg = Program.getModuleConfig('ti.sdo.ipc.family.tci663x.Interrupt');
171     var MultiProcCfg = Program.getModuleConfig('ti.sdo.utils.MultiProc');
173     var clientTab = Program.fetchArray(Interrupt.clientTab$fetchDesc,
174             mod.clientTab, MultiProcCfg.numProcessors);
176     var localId = MultiProc.self$view();
178     if (localId != MultiProc.INVALIDID) {
179         var ipcar0 = Program.fetchArray(ScalarStructs.S_Bits32$fetchDesc,
180             $addr(modCfg.IPCAR0), MultiProcCfg.numProcessors, false);
181     }
183     for (var i = 0; i < MultiProcCfg.numProcsInCluster; i++) {
184         var entryView =
185                 Program.newViewStruct('ti.sdo.ipc.family.tci663x.Interrupt',
186                 'Registered Interrupts');
188         entryView.remoteCoreId = MultiProc.baseIdOfCluster + i;
190         var fxn = Number(clientTab[i].func);
191         if (fxn != 0) {
192             entryView.isrFxn = Program.lookupFuncName(fxn)[0];
193             entryView.isrArg = "0x" + Number(clientTab[i].arg).toString(16);
194         }
195         else {
196             entryView.isrFxn = "(unplugged)";
197             entryView.isrArg = "";
198         }
200         if (localId != MultiProc.INVALIDID) {
201             var enableFlag = ipcar0[localId].elem;
203             if (enableFlag & (1 << (i + Interrupt.SRCSx_SHIFT))) {
204                 entryView.isFlagged = true;
205             }
206             else {
207                 entryView.isFlagged = false;
208             }
209         }
211         view.elements.$add(entryView);
212     }