1 /*
2 * Copyright (c) 2012-2013, Texas Instruments Incorporated
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 * ======== InterruptHost.xs ========
34 *
35 */
37 var Hwi = null;
38 var Mmu = null;
39 var MultiProc = null;
40 var Ipc = null;
41 var SECTION_DESC_SHIFT = 20;
43 /*
44 * ======== module$use ========
45 */
46 function module$use()
47 {
48 Hwi = xdc.useModule("ti.sysbios.family.arm.a8.intcps.Hwi");
49 Mmu = xdc.useModule("ti.sysbios.family.arm.a8.Mmu");
50 MultiProc = xdc.useModule("ti.sdo.utils.MultiProc");
51 Ipc = xdc.useModule("ti.sdo.ipc.Ipc");
53 this.dspProcId = MultiProc.getIdMeta("DSP");
54 this.videoProcId = MultiProc.getIdMeta("VIDEO-M3");
55 this.vpssProcId = MultiProc.getIdMeta("VPSS-M3");
56 this.hostProcId = MultiProc.getIdMeta("HOST");
57 this.eveProcId = MultiProc.getIdMeta("EVE");
59 }
61 function module$static$init(mod, params)
62 {
63 /*
64 * By default the internal eve mailbox registers are in a cacheable
65 * region because the eve internal DMEM is part of the platform memory
66 * map. Add this code here to make the memory region non-cacheable.
67 */
68 var addr = this.mailboxEveBaseAddr
69 var attrs = {
70 type : Mmu.FirstLevelDesc_SECTION,
71 bufferable: false,
72 cacheable: false,
73 shareable: false,
74 noexecute: true,
75 };
77 Mmu.setFirstLevelDescMeta(addr, addr, attrs);
79 /* DSP to HOST */
80 mod.fxnTable[0].func = null;
81 mod.fxnTable[0].arg = 0;
83 /* VIDEO-M3 to HOST */
84 mod.fxnTable[1].func = null;
85 mod.fxnTable[1].arg = 0;
87 /* VPSS-M3 to HOST */
88 mod.fxnTable[2].func = null;
89 mod.fxnTable[2].arg = 0;
91 /* EVE to HOST */
92 mod.fxnTable[3].func = null;
93 mod.fxnTable[3].arg = 0;
95 mod.numPlugged = 0;
96 }
98 /*
99 * ======== viewInitInterrupt ========
100 */
101 function viewInitInterrupt(view)
102 {
103 var InterruptHostModStr = "ti.sdo.ipc.family.ti81xx.InterruptHost";
104 var Program = xdc.useModule('xdc.rov.Program');
105 var InterruptHost = xdc.useModule(InterruptHostModStr);
106 var MultiProc = xdc.useModule('ti.sdo.utils.MultiProc');
107 var MultiProcCfg = Program.getModuleConfig('ti.sdo.utils.MultiProc');
108 var InterruptHostCfg = Program.getModuleConfig(InterruptHostModStr);
109 var ScalarStructs = xdc.useModule('xdc.rov.support.ScalarStructs');
110 var mod = Program.scanRawView(InterruptHostModStr).modState;
112 var remoteProcIds = [
113 /*
114 * [remoteProcId,
115 * fxnTable index,
116 * MBX# (from remote),
117 * MBX# (to remote)]
118 */
119 [InterruptHostCfg.dspProcId, 0, 0, 3],
120 [InterruptHostCfg.videoProcId, 1, 6, 4],
121 [InterruptHostCfg.vpssProcId, 2, 8, 5]
122 ];
124 var MAILBOX_IRQSTATUS_CLR_HOST = (InterruptHostCfg.mailboxBaseAddr + 0x104);
125 var MAILBOX_IRQENABLE_SET_HOST = (InterruptHostCfg.mailboxBaseAddr + 0x108);
126 var MAILBOX_IRQENABLE_CLR_HOST = (InterruptHostCfg.mailboxBaseAddr + 0x10C);
128 function MAILBOX_MESSAGE(M) {
129 return (InterruptHostCfg.mailboxBaseAddr + 0x040 + (0x4 * M));
130 }
132 function MAILBOX_STATUS(M) {
133 return (InterruptHostCfg.mailboxBaseAddr + 0x0C0 + (0x4 * M));
134 }
136 function MAILBOX_REG_VAL(M) {
137 return (0x1 << (2 * M));
138 }
140 for each (procId in remoteProcIds) {
141 if (procId[0] != MultiProc.INVALIDID) {
142 var entryView = Program.newViewStruct(InterruptHostModStr,
143 'IncomingInterrupts');
144 entryView.remoteProcName = MultiProc.getName$view(procId[0]) + " ("
145 + procId[0] + ")";
146 entryView.registered = (Number(mod.fxnTable[procId[1]].func) != 0);
147 print(entryView.remoteProcName + ": " + mod.fxnTable[procId[1]].func);
149 var enabled = Program.fetchStruct(
150 ScalarStructs.S_Bits32$fetchDesc,
151 $addr(MAILBOX_IRQENABLE_SET_HOST), false).elem;
152 entryView.enabled = ((enabled & MAILBOX_REG_VAL(procId[2])) != 0);
154 var intPending = Program.fetchStruct(
155 ScalarStructs.S_Bits32$fetchDesc,
156 $addr(MAILBOX_STATUS(procId[2])), false).elem;
157 entryView.intPending = (intPending != 0);
159 entryView.payload = $addr(Program.fetchStruct(
160 ScalarStructs.S_Bits32$fetchDesc,
161 $addr(MAILBOX_MESSAGE(procId[2])), false).elem);
163 view.elements.$add(entryView);
164 }
165 }
166 }