513947a3746f23e13701c7f87e75e9da15aa3788
[ipc/ipcdev.git] / packages / ti / sdo / ipc / family / f28m35x / IpcMgr.xdc
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.xdc ========
34  */
36 import xdc.runtime.Assert;
37 import xdc.runtime.Error;
39 /*!
40  *  ======== IpcMgr ========
41  *  IPC Manager
42  *
43  *  This modules is used only for F28M35x devices.  Users can statically
44  *  configure which shared memory segments to enable, the owner processor
45  *  and the owner's write access.  This module used for specifying shared
46  *  memory for IPC between the M3 and C28 processors.
47  *
48  *  There are no API's that need to be called.  The necessary drivers for
49  *  IPC are all created within this module's startup function.  The shared
50  *  memory is also programmed within this function.  There is handshake
51  *  between the processors.  The M3 releases the C28 and both processors
52  *  will synchronize at this point.
53  *
54  *  The {@link #readAddr} must point to shared memory which is writeable
55  *  by the remote core while the {@link #writeAddr} must point to shared
56  *  memory which is writeable by the local core.  The {@link #readAddr}
57  *  and {@link #writeAddr} pointers must point to different shared memory
58  *  blocks.  Memory addresses must be specified in the local core's
59  *  memory space.
60  *
61  *  For example on the M3:
62  *  @p(code)
63  *  var IpcMgr = xdc.useModule('ti.sdo.ipc.family.f28m35x.IpcMgr');
64  *  IpcMgr.readAddr  = 0x20016000;
65  *  IpcMgr.writeAddr = 0x20014000;
66  *  IpcMgr.sharedMemoryOwnerMask = 0x80;
67  *  @p
68  *
69  *  On the C28:
70  *  @p(code)
71  *  var IpcMgr = xdc.useModule('ti.sdo.ipc.family.f28m35x.IpcMgr');
72  *  IpcMgr.readAddr  = 0x12000;
73  *  IpcMgr.writeAddr = 0x13000;
74  *  @p
75  */
77 @ModuleStartup
79 module IpcMgr
80 {
81     /*!
82      *  This value is used for setting {@link #sharedMemoryAccess}.
83      *  If value specified, fetch is not allowed by owner.
84      */
85     const Bits32 NOFETCH    = 1;
87     /*!
88      *  This value is used for setting {@link #sharedMemoryAccess}.
89      *  If value specified, DMA writes are not allowed by owner.
90      */
91     const Bits32 NODMAWRITE = 2;
93     /*!
94      *  This value is used for setting {@link #sharedMemoryAccess}.
95      *  If value specified, CPU writes are not allowed by owner.
96      */
97     const Bits32 NOCPUWRITE = 4;
99     /*
100      *************************************************************************
101      *                       Generic Errors/Asserts
102      *************************************************************************
103      */
105     /*!
106      *  ======== A_internal ========
107      *  Assert raised when an internal error is encountered
108      */
109     config Assert.Id A_internal = {
110         msg: "A_internal: An internal error has occurred"
111     };
113     /*!
114      *  ======== A_invParam ========
115      *  Assert raised when a parameter is invalid
116      */
117     config Assert.Id A_invParam  = {
118         msg: "A_invParam: Invalid configuration parameter supplied"
119     };
121     /*!
122      *  ======== A_notEnoughMemory ========
123      *  Assert raised when there's not enough memory for creating instances.
124      */
125     config Assert.Id A_notEnoughMemory  = {
126         msg: "A_notEnoughMemory: There is not enough memory for operation"
127     };
129     /*!
130      *  ======== A_nullArgument ========
131      *  Assert raised when a required argument is null
132      */
133     config Assert.Id A_nullArgument  = {
134         msg: "A_nullArgument: Required argument is null"
135     };
137     /*!
138      *  ======== E_internal ========
139      *  Error raised when an internal error occured
140      */
141     config Error.Id E_internal  = {
142         msg: "E_internal: An internal error occurred"
143     };
145     /*
146      *************************************************************************
147      *                       Module-wide Config Parameters
148      *************************************************************************
149      */
151     /*!
152      *  ======== genLinkerSections ========
153      *  For generating or not generating the linker sections
154      *
155      *  By default this is set to 'true' so the following linker sections
156      *  are generated for the amount of memory used for IPC. For the
157      *  read address - "ti.sdo.ipc.family.f28m35x.IpcMgr.readSect" and for
158      *  the write address - "ti.sdo.ipc.family.f28m35x.IpcMgr.writeSect".
159      *  To disable generation, set this to 'false'.
160      */
161     metaonly config Bool genLinkerSections = true;
163     /*!
164      *  ======== ipcSetFlag ========
165      *  The IPC set flag used for generating IPC interrupt
166      *
167      *  Only a value of 0, 1, 2, or 3 are valid since only those flags
168      *  have an interrupt associated with them. This value must be the
169      *  same on both processors.
170      */
171     config UInt32 ipcSetFlag = 3;
173     /*!
174      *  ======== messageQSize ========
175      *  The largest MessageQ size (in bytes) supported by the transport
176      *
177      *  This value must be large enough to handle the largest message.
178      *  The size must be specified in bytes.
179      */
180     config UInt32 messageQSize = 128;
182     /*!
183      *  ======== messageQEventId ========
184      *  Notify event ID for MessageQ transport.
185      */
186     config UInt16 messageQEventId = 2;
188     /*!
189      *  ======== nameServerEventId ========
190      *  Notify event ID for NameServer.
191      */
192     config UInt16 nameServerEventId = 4;
194     /*!
195      *  ======== numNotifyMsgs ========
196      *  The number of messages for the Notify driver's circular buffer
197      *
198      *  This is use to determine the size of the put and get buffers.
199      *  This value must be a power of 2.  A value of 'N' allows 'N-1'
200      *  outstanding notifications.
201      */
202     config UInt32 numNotifyMsgs = 32;
204     /*!
205      *  ======== numMessageQMsgs ========
206      *  The number of messages for the MessageQ transport's circular buffer
207      *
208      *  This is use to determine the size of the put and get buffers.
209      *  This value must be a power of 2.  A value of 'N' allows 'N-1'
210      *  outstanding notifications.
211      */
212     config UInt32 numMessageQMsgs = 4;
214     /*!
215      *  ======== sharedMemoryEnable ========
216      *  Shared RAM memory configuration.
217      *
218      *  This parameter is only applicable to the M3 processor.  It is
219      *  used for writing the MEMCNF register from the M3.
220      *  By default, all shared RAM segments will be enabled at runtime.
221      *  To disable a shared RAM segment, set the corresponding bit to 0.
222      *  If any data is loaded to a shared RAM segment, the segment must
223      *  be enabled prior to loading the program through other means.
224      */
225     config Bits32 sharedMemoryEnable = 0xffffffff;
227     /*!
228      *  ======== sharedMemoryOwnerMask ========
229      *  Shared RAM owner select configuration.
230      *
231      *  This parameter is only applicable to the M3 processor.  It is
232      *  used for writing the MSxMSEL register from the M3.
233      *  By default, each value of each shared RAM select bit is '0'.
234      *  This means the M3 is the owner and has write access based upon
235      *  the sharedMemoryAccess bits.  Setting a '1' in any bit position
236      *  makes the C28 the owner of that shared RAM segment.
237      */
238     config Bits32 sharedMemoryOwnerMask = 0;
240     /*!
241      *  ======== sharedMemoryAccess ========
242      *  Shared RAM write configuration.
243      *
244      *  This parameter is only applicable to the M3 processor.  It is
245      *  used for writing the MSxSRCR register from the M3.
246      *  It determines the owner write access to each shared RAM segment.
247      *  By default, the owner is allowed to fetch, DMA write, and CPU write.
248      */
249     config Bits32 sharedMemoryAccess[8];
251     /*!
252      *  ======== readAddr ========
253      *  The base address of read-only shared memory.
254      *
255      *  The address must be specified in the local core's memory space.
256      *  It must point to the same physical address as the writeAddr for
257      *  the remote processor.
258      */
259     config Ptr readAddr;
261     /*!
262      *  ======== writeAddr ========
263      *  The base address of read/write shared memory.
264      *
265      *  The address must be specified in the local core's memory space.
266      *  It must point to the same physical address as the readAddr for
267      *  the remote processor.
268      */
269     config Ptr writeAddr;
271 internal:
273     /* M3 control registers */
274     const UInt32 MWRALLOW = 0x400FB980;
275     const UInt32 MEMCNF  = 0x400FB930;
276     const UInt32 MSxMSEL = 0x400FB210;
277     const UInt32 MSxSRCR = 0x400FB220;
278     const UInt32 C28RTESTINIT = 0x4920;
279     const UInt32 C28RINITDONE = 0x4930;
280     const UInt32 MTOCRTESTINIT = 0x400FB260;
281     const UInt32 MTOCRINITDONE = 0x400FB288;
283     /* the amount of shared memory used */
284     config UInt32 sharedMemSizeUsed;
286     /* initialize the MsgRams */
287     Void init();
289     /* function to create NotifyCirc driver instances */
290     Int notifyCircAttach(UInt16 remoteProcId, Ptr writeAddr, Ptr readAddr);
292     /* function to create NameServer remote instances */
293     Int nameServerAttach(UInt16 remoteProcId, Ptr writeAddr, Ptr readAddr);
295     /* function to create MessageQ transport instances */
296     Int transportCircAttach(UInt16 remoteProcId, Ptr writeAddr, Ptr readAddr);