SDOCM00100662: Move code to config shared RAMs to Boot module
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / f28m35x / IpcMgr.xs
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  *  ======== IpcMgr.xs ========
34  */
36 var IpcMgr           = null;
37 var Startup          = null;
38 var MultiProc        = null;
39 var NotifyDriverCirc = null;
40 var NameServerBlock  = null;
41 var TransportCirc    = null;
42 var Hwi              = null;
43 var Boot             = null;
45 /*
46  *  ======== module$meta$init ========
47  */
48 function module$meta$init()
49 {
50     /* Only process during "cfg" phase */
51     if (xdc.om.$name != "cfg") {
52         return;
53     }
55     IpcMgr = this;
57     /* initialize the config parameter */
58     for (var i=0; i < IpcMgr.sharedMemoryAccess.length; i++) {
59         IpcMgr.sharedMemoryAccess[i] = 0;
60     }
62     var NameServer = xdc.useModule('ti.sdo.utils.NameServer');
63     NameServer.SetupProxy = xdc.useModule('ti.sdo.ipc.family.f28m35x.NameServerBlock');
65     var Startup = xdc.useModule('xdc.runtime.Startup');
67     /* RAMINIT */
68     Startup.firstFxns.$add(IpcMgr.init);
69 }
71 /*
72  *  ======== module$use ========
73  */
74 function module$use()
75 {
76     MultiProc = xdc.useModule("ti.sdo.utils.MultiProc");
77     NotifyDriverCirc =
78         xdc.useModule("ti.sdo.ipc.family.f28m35x.NotifyDriverCirc");
79     NameServerBlock =
80         xdc.useModule("ti.sdo.ipc.family.f28m35x.NameServerBlock");
81     TransportCirc =
82         xdc.useModule("ti.sdo.ipc.family.f28m35x.TransportCirc");
83     Hwi = xdc.useModule("ti.sysbios.hal.Hwi");
84     Startup = xdc.useModule("xdc.runtime.Startup");
86     if (Program.build.target.name.match(/M3.*/)) {
87         Boot = xdc.useModule("ti.catalog.arm.cortexm3.concertoInit.Boot");
88     }
90     /* Init the number of messages for notify driver */
91     NotifyDriverCirc.numMsgs = IpcMgr.numNotifyMsgs;
93     /* Init the number of messages for messageQ transport */
94     TransportCirc.numMsgs = IpcMgr.numMessageQMsgs;
95     TransportCirc.maxMsgSizeInBytes = IpcMgr.messageQSize;
96     TransportCirc.notifyEventId = IpcMgr.messageQEventId;
98     /* Make sure that sharedMemoryOwnerMask is only configured on the M3 */
99     if (!Program.build.target.name.match(/M3.*/) &&
100         IpcMgr.$written("sharedMemoryOwnerMask") == true) {
101         this.$logWarning("Warning: IpcMgr.sharedMemoryOwnerMask must only be " +
102         "configured on the M3 core.  Configuring this on the C28 core has no " +
103         "effect", this);
104     }
106     if ((Program.build.target.name.match(/M3.*/)) &&
107         ("sharedMemoryEnable" in Boot)) {
108         if (Boot.$written("sharedMemoryEnable") &&
109             Boot.sharedMemoryEnable != IpcMgr.sharedMemoryEnable) {
110             IpcMgr.$logWarning("Boot.sharedMemoryEnable was set to " +
111             "a value different from IpcMgr.sharedMemoryEnable. " +
112             "IpcMgr.sharedMemoryEnable will override the Boot setting.",
113             IpcMgr, "sharedMemoryEnable");
114         }
116         /* override Boot's sharedMemoryEnable with IpcMgr's */
117         Boot.sharedMemoryEnable = IpcMgr.sharedMemoryEnable;
119         if (Boot.$written("sharedMemoryOwnerMask") &&
120             Boot.sharedMemoryOwnerMask != IpcMgr.sharedMemoryOwnerMask) {
121             IpcMgr.$logWarning("Boot.sharedMemoryOwnerMask was set to " +
122             "a value different from IpcMgr.sharedMemoryOwnerMask. " +
123             "IpcMgr.sharedMemoryOwnerMask will override the Boot setting.",
124             IpcMgr, "sharedMemoryOwnerMask");
125         }
127         /* override Boot's sharedMemoryOwnerMask with IpcMgr's */
128         Boot.sharedMemoryOwnerMask = IpcMgr.sharedMemoryOwnerMask;
130         if (Boot.$written("sharedMemoryAccess")) {
131             IpcMgr.$logWarning("Boot.sharedMemoryAccess was modified " +
132             "but IpcMgr.sharedMemoryAccess will override the Boot setting.",
133             IpcMgr, "sharedMemoryAccess");
134         }
136         /* override Boot's sharedMemoryAccess with IpcMgr's */
137         for (var i = 0; i < IpcMgr.sharedMemoryAccess.length; i++) {
138             Boot.sharedMemoryAccess[i] = IpcMgr.sharedMemoryAccess[i];
139         }
140     }
143 /*
144  *  ======== module$static$init ========
145  */
146 function module$static$init(mod, params)
148     /* check to make sure readAddr and writeAddr have been set */
149     if (params.readAddr == undefined) {
150         IpcMgr.$logError("IpcMgr.readAddr is undefined", IpcMgr);
151     }
153     if (params.writeAddr == undefined) {
154         IpcMgr.$logError("IpcMgr.writeAddr is undefined", IpcMgr);
155     }
158     /* init the interrupt ids */
159     if (params.ipcSetFlag < 0 || params.ipcSetFlag > 3) {
160         IpcMgr.$logError("IpcMgr.ipcSetFlag must be 0, 1, 2, or 3 " +
161             "because they are the only flags associated with an interrupt.",
162             IpcMgr);
163     }
165     /* calculate the amount of shared memory used */
166     IpcMgr.sharedMemSizeUsed = NotifyDriverCirc.sharedMemReqMeta(null) +
167                                NameServerBlock.sharedMemReqMeta(null) +
168                                TransportCirc.sharedMemReqMeta(null);
170     /* validate sharedMemoryOwnerMask is correct for the readAddr/writeAddr */
171     if (Program.build.target.name.match(/M3.*/)) {
172         if ((IpcMgr.writeAddr >= 0x20008000) &&
173             (IpcMgr.writeAddr < 0x20018000)) {
174             /*
175              *  Determine segment being used for the M3 writeAddr.
176              *  The shared RAM base address starts 0x20008000 to 0x20016000.
177              *  Each segment with a length of 0x2000 (byte addressing).
178              */
179             var writeSeg = (IpcMgr.writeAddr - 0x20008000) >> 13;
181             /* The M3 must be owner of writeAddr shared memory segment */
182             if (IpcMgr.sharedMemoryOwnerMask & (1 << writeSeg)) {
183                 IpcMgr.$logError("IpcMgr.writeAddr is set to address: " +
184                 utils.toHex(IpcMgr.writeAddr) + "," +
185                 " but IpcMgr.sharedMemoryOwnerMask bit: " + writeSeg +
186                 " must not be set. Unset this bit to make M3 the owner.", IpcMgr);
187             }
188         }
190         if ((IpcMgr.readAddr >= 0x20008000) &&
191             (IpcMgr.readAddr < 0x20018000)) {
192             /*
193              *  Determine segment being used for the M3 readAddr.
194              *  The shared RAM base address starts 0x20008000 to 0x20016000.
195              *  Each segment with a length of 0x2000 (byte addressing).
196              */
197             var readSeg = (IpcMgr.readAddr - 0x20008000) >> 13;
199             /* The C28 must be owner of readAddr shared memory segment */
200             if (!(IpcMgr.sharedMemoryOwnerMask & (1 << readSeg))) {
201                 IpcMgr.$logError("IpcMgr.readAddr is set to address: " +
202                 utils.toHex(IpcMgr.readAddr) + "," +
203                 " but IpcMgr.sharedMemoryOwnerMask bit: " + readSeg +
204                 " is not set. This bit must be set so C28 is the owner.", IpcMgr);
205             }
206         }
207     }
210 /*
211  *  ======== module$validate ========
212  */
213 function module$validate()
215     if ((xdc.module('ti.sdo.ipc.Ipc').$used) ||
216         (xdc.module('ti.sdo.ipc.GateMP').$used) ||
217         (xdc.module('ti.sdo.ipc.SharedRegion').$used) ||
218         (xdc.module('ti.sdo.ipc.ListMP').$used)) {
219         IpcMgr.$logError("One or more of the following modules " +
220             "[Ipc, GateMP, ListMP, SharedRegion] are being used " +
221             "but are not supported on this device.", IpcMgr);
222     }