1/*
2 * dspbridge/mpu_api/inc/DSPNode.h
3 *
4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5 *
6 * Copyright (C) 2007 Texas Instruments, Inc.
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU Lesser General Public License as published
10 * by the Free Software Foundation version 2.1 of the License.
11 *
12 * This program is distributed .as is. WITHOUT ANY WARRANTY of any kind,
13 * whether express or implied; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * Lesser General Public License for more details.
16 */
17
18/*
19 *  ======== DSPNode.h ========
20 *  Description:
21 *      This is the header for the DSP/BIOS Bridge node module.
22 *
23 *  Public Functions:
24 *      DSPNode_Allocate
25 *      DSPNode_AllocMsgBuf
26 *      DSPNode_ChangePriority
27 *      DSPNode_Connect
28 *      DSPNode_ConnectEx
29 *      DSPNode_Create
30 *      DSPNode_Delete
31 *      DSPNode_FreeMsgBuf
32 *      DSPNode_GetAttr
33 *      DSPNode_GetMessage
34 *      DSPNode_Pause
35 *      DSPNode_PutMessage
36 *      DSPNode_RegisterNotify
37 *      DSPNode_Run
38 *      DSPNode_Terminate
39 *
40 *  Notes:
41 *
42 *! Revision History:
43 *! ================
44 *! 23-Nov-2002 gp: Comment change: uEventMask now referred to as a "type".
45 *!                 Comment cleanup, correspondence to db_api.doc.
46 *! 12-Dec-2001 ag  DSP_ENOTIMPL added to DSPNode_Connect().
47 *! 11-Sep-2001 ag  Added new error codes.
48 *! 23-Apr-2001 jeh Added pStatus parameter to DSPNode_Terminate.
49 *! 16-Feb-2001 jeh Added new error codes.
50 *! 13-Feb-2001 kc: DSP/BIOS Bridge name updates.
51 *! 27-Oct-2000 jeh Updated to version 0.9 API spec.
52 *! 07-Sep-2000 jeh Changed type HANDLE in DSPNode_RegisterNotify to
53 *!                 DSP_HNOTIFICATION. Added DSP_STRMATTR parameter to
54 *!                 DSPNode_Connect().
55 *! 27-Jul-2000 rr: Updated to ver 0.8 of DSPAPI.
56 *! 27-Jun-2000 rr: Created from DBAPI.h
57 */
58
59#ifndef DSPNode_
60#define DSPNode_
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66/*
67 *  ======== DSPNode_Allocate ========
68 *  Purpose:
69 *      Allocate data structures for controlling and communicating with a node
70 *      on a specific DSP processor.
71 *  Parameters:
72 *      hProcessor:         The processor handle.
73 *      pNodeID:            Ptr to DSP_UUID for the node.
74 *      pArgs:              Ptr to optional node arguments.
75 *      pAttrIn:            Ptr to optional node attributes.
76 *      phNode:             Ptr to location to store node handle on return.
77 *  Returns:
78 *      DSP_SOK:            Success.
79 *      DSP_EPOINTER:       One of the input parameters pointers is invalid.
80 *      DSP_EHANDLE:        Invalid processor handle.
81 *      DSP_EMEMORY:        Memory is not available to allocate a node
82 *      DSP_EUUID:          The node with the specified UUID is not registered.
83 *      DSP_EWRONGSTATE:    The specified processor is in the wrong state
84 *                          (not running)
85 *      DSP_ERANGE:         The iPriority field specified in pAttrIn is out
86 *                          of range.
87 *      DSP_EFAIL:          General failure.
88 */
89extern DBAPI
90DSPNode_Allocate(DSP_HPROCESSOR hProcessor,
91		 IN CONST struct DSP_UUID * pNodeID,
92		 IN CONST OPTIONAL struct DSP_CBDATA * pArgs,
93		 IN OPTIONAL struct DSP_NODEATTRIN * pAttrIn,
94		 OUT DSP_HNODE * phNode);
95
96/*
97 *  ======== DSPNode_AllocMsgBuf ========
98 *  Purpose:
99 *      Allocate and prepare a buffer whose descriptor will be passed to a DSP
100 *      Node within a (DSP_MSG) message
101 *  Parameters:
102 *      hNode:              The node handle.
103 *      uSize:              The size of the buffer (GPP bytes) to be allocated.
104 *      pAttr:              Pointer to a DSP_BUFFERATTR structure.
105 *      pBuffer:            Location to store the address of the allocated
106 *                          buffer on output.
107 *  Returns:
108 *      DSP_SOK:            Success.
109 *      DSP_EHANDLE:        Invalid node handle.
110 *      DSP_EMEMORY:        Insufficent memory.
111 *      DSP_EPOINTER:       pBuffer is not a valid address.
112 *      DSP_EFAIL:          General Failure.
113 *      DSP_EALIGNMENT:     Alignment value not supported.(Must be 0, 1, 2, 4)
114 *      DSP_EBADSEGID:      Invalid Segment Id.
115 *      DSP_ESIZE:          Invalid Size. Must be greater than zero.
116 */
117	extern DBAPI DSPNode_AllocMsgBuf(DSP_HNODE hNode, UINT uSize,
118					 IN OPTIONAL struct DSP_BUFFERATTR * pAttr,
119					 OUT BYTE ** pBuffer);
120
121/*
122 *  ======== DSPNode_ChangePriority ========
123 *  Purpose:
124 *      Change a task node's runtime priority within the DSP RTOS.
125 *  Parameters:
126 *      hNode:              The node handle.
127 *      iPriority:          New runtime priority level.
128 *  Returns:
129 *      DSP_SOK:            Success.
130 *      DSP_EHANDLE:        Invalid node handle.
131 *      DSP_ERANGE:         iPriority is out of range.
132 *      DSP_ENODETYPE:      Operation is invalid for this node type.
133 *      DSP_ETIMEOUT:       A timeout occured before DSP responded.
134 *      DSP_ERESTART:       A critical error occurred and the DSP is being
135 *                          restarted.
136 *      DSP_EWRONGSTATE:    The node is not allocated, paused, or running.
137 *      DSP_EFAIL:          Unable to change the priority level.
138 */
139	extern DBAPI DSPNode_ChangePriority(DSP_HNODE hNode, INT iPriority);
140
141/*
142 *  ======== DSPNode_Connect ========
143 *  Purpose:
144 *      Make a stream connection, either between two nodes on a DSP,
145 *      or between a node on a DSP and the GPP.
146 *  Parameters:
147 *      hNode:                  The first node handle.
148 *      uStream:                Output stream index on first node (0 based).
149 *      hOtherNode:             The second node handle.
150 *      uOtherStream:           Input stream index on second node (0 based).
151 *      pAttrs:                 Stream attributes. If NULL, defaults used.
152 *  Returns:
153 *      DSP_SOK:                Success.
154 *      DSP_EHANDLE:            Invalid node handle.
155 *      DSP_EMEMORY:            GPP memory allocation failure.
156 *      DSP_EALREADYCONNCECTED: One of the specified connections has already
157 *                              been made.
158 *      DSP_EWRONGSTATE:        The node is not in the NODE_ALLOCATED state.
159 *      DSP_EVALUE:             A Stream index is not valid.
160 *      DSP_ENOMORECONNECTIONS: No more connections are allowed
161 *      DSP_EFAIL:              Unable to make connection.
162 *      DSP_ENOTIMPL:           Stream mode valid but not supported.
163 *      DSP_ESTRMMODE           Illegal Stream mode specified.
164 *
165 */
166	extern DBAPI DSPNode_Connect(DSP_HNODE hNode, UINT uStream,
167				     DSP_HNODE hOtherNode, UINT uOtherStream,
168				     IN OPTIONAL struct DSP_STRMATTR * pAttr);
169
170/*
171 *  ======== DSPNode_ConnectEx ========
172 *  Purpose:
173 *      Make a stream connection, either between two nodes on a DSP,
174 *      or between a node on a DSP and the GPP.
175 *  Parameters:
176 *      hNode:                  The first node handle.
177 *      uStream:                Output stream index on first node (0 based).
178 *      hOtherNode:             The second node handle.
179 *      uOtherStream:           Input stream index on second node (0 based).
180 *      pAttrs:                 Stream attributes. If NULL, defaults used.
181 *      pConnParam:             A pointer to a DSP_CBDATA structure that defines
182 *                              connection parameter for device nodes to pass to DSP side.
183 *                              If the value of this parameter is NULL, then this API behaves
184 *                              like DSPNode_Connect. This parameter will have length of the
185 *                              string and the null terminated string in DSP_CBDATA struct.
186 *                              This can be extended in future to pass binary data.
187 *
188 *  Returns:
189 *      DSP_SOK:                Success.
190 *      DSP_EHANDLE:            Invalid node handle.
191 *      DSP_EMEMORY:            GPP memory allocation failure.
192 *      DSP_EALREADYCONNCECTED: One of the specified connections has already
193 *                              been made.
194 *      DSP_EWRONGSTATE:        The node is not in the NODE_ALLOCATED state.
195 *      DSP_EVALUE:             A Stream index is not valid.
196 *      DSP_ENOMORECONNECTIONS: No more connections are allowed
197 *      DSP_EFAIL:              Unable to make connection.
198 *      DSP_ENOTIMPL:           Stream mode valid but not supported.
199 *      DSP_ESTRMMODE           Illegal Stream mode specified.
200 *
201 */
202	extern DBAPI DSPNode_ConnectEx(DSP_HNODE hNode, UINT uStream,
203				       DSP_HNODE hOtherNode, UINT uOtherStream,
204				       IN OPTIONAL struct DSP_STRMATTR * pAttr,
205				       IN OPTIONAL struct DSP_CBDATA * pConnParam);
206
207/*
208 *  ======== DSPNode_Create ========
209 *  Purpose:
210 *      Create a node in a pre-run (i.e., inactive) state on its DSP processor.
211 *  Parameters:
212 *      hNode:              The node handle.
213 *  Returns:
214 *      DSP_SOK:            Success.
215 *      DSP_EHANDLE:        Invalid node handle.
216 *      DSP_ESYMBOL:        Create function, or iAlg, not found in the COFF file
217 *      DSP_WRONGSTATE:     Operation is invalid for the current node state.
218 *      DSP_ETASK:          Unable to create the task or process on the DSP.
219 *      DSP_EMEMORY:        Memory Allocation failure on the DSP.
220 *      DSP_ERESOURCE:      A requested resource is not available.
221 *      DSP_EMULINST:       Multiple instances are not allowed.
222 *      DSP_ENOTFOUND:      A specified entity was not found.
223 *      DSP_EOUTOFIO:       An I/O resource is not available.
224 *      DSP_ESTREAM:        Stream creation failure on the DSP.
225 *      DSP_ETIMEOUT:       A timeout occurred before the DSP responded.
226 *      DSP_ERESTART:       A critical error has occurred and the DSP is
227 *                          being restarted.
228 *      DSP_EOVERLAYMEMORY: Overlay region for this phase in use by another node
229 *      DSP_EUSER1-16:      A node-specific failure occurred on the DSP.
230 *      DSP_EFAIL:          Unable to Create the node.
231 *  Details:
232 */
233
234	extern DBAPI DSPNode_Create(DSP_HNODE hNode);
235
236/*
237 *  ======== DSPNode_Delete ========
238 *  Purpose:
239 *      Delete all DSP-side and GPP-side resources for the node.
240 *  Parameters:
241 *      hNode:              The node handle.
242 *  Returns:
243 *      DSP_SOK:            Success.
244 *      DSP_EHANDLE:        Invalid node handle.
245 *      DSP_EDELETE:        A Deletion failure occured.
246 *      DSP_EFREE:          A DSP memory free operation failed.
247 *      DSP_EIOFREE:        A DSP I/O free operation failed.
248 *      DSP_ETIMEOUT:       Timeout occured before the DSP responded.
249 *      DSP_ERESTART:       A critical error has occurred and the DSP is
250 *                          being restarted.
251 *      DSP_EUSER1-16:      A node-specific failure occurred on the DSP.
252 *      DSP_EOVERLAYMEMORY: Overlay region for this phase in use by another node
253 *      DSP_EFAIL:          Unable to delete the node.
254 *      DSP_ESYMBOL:        Delete function not found in the COFF file.
255 */
256	extern DBAPI DSPNode_Delete(DSP_HNODE hNode);
257
258/*
259 *  ======== DSPNode_FreeMsgBuf ========
260 *  Purpose:
261 *      Free a message buffer previously allocated by DSPNode_AllocMsgBuf..
262 *  Parameters:
263 *      hNode:              The node handle.
264 *      pBuffer:            (Address) Buffer allocated by DSP_AllocMsgBuf.
265 *      pAttr:              Same buffer attributes passed to DSP_AllocMsgBuf.
266 *  Returns:
267 *      DSP_SOK:            Success.
268 *      DSP_EHANDLE:        Invalid node handle.
269 *      DSP_EPOINTER:       pBuffer is not valid.
270 *      DSP_EBADSEGID:      Invalid Segment Id.
271 *      DSP_EFAIL:          Failure to free the buffer.
272 */
273	extern DBAPI DSPNode_FreeMsgBuf(DSP_HNODE hNode, IN BYTE * pBuffer,
274					IN OPTIONAL struct DSP_BUFFERATTR * pAttr);
275
276/*
277 *  ======== DSPNode_GetAttr ========
278 *  Purpose:
279 *      Copy the current attributes of the specified node.
280 *  Parameters:
281 *      hNode:              The node handle.
282 *      pAttr:              Location to store the node attributes.
283 *      uAttrSize:          The size of structure.
284 *  Returns:
285 *      DSP_SOK:            Success.
286 *      DSP_EHANDLE:        Invalid node handle.
287 *      DSP_EPOINTER:       Parameter pAttr is not valid.
288 *      DSP_EFAIL:          Unable to retrieve node attributes.
289 *      DSP_ESIZE:          The size of the specified DSP_NODEATTR structure
290 *                          is too small to hold all node information.
291 */
292	extern DBAPI DSPNode_GetAttr(DSP_HNODE hNode,
293				     OUT struct DSP_NODEATTR * pAttr, UINT uAttrSize);
294
295/*
296 *  ======== DSPNode_GetMessage ========
297 *  Purpose:
298 *      Retrieve an event message from a task node.
299 *  Parameters:
300 *      hNode:              The node handle.
301 *      pMessage:           The message structure.
302 *      uTimeout:           Timeout to wait for message.
303 *  Returns:
304 *      DSP_SOK:            Success.
305 *      DSP_EHANDLE:        Invalid node handle.
306 *      DSP_EPOINTER:       Parameter pMessage is not valid.
307 *      DSP_ENODETYPE:      Messages cannot be retrieved from this type of
308 *                          node (eg a device node).
309 *      DSP_ETIMEOUT:       A timeout occurred and there is no message ready.
310 *      DSP_ERESTART:       A critical error has occurred and the DSP is
311 *                          being restarted.
312 *      DSP_EFAIL:          An error occurred trying to retrieve a message.
313 *      DSP_ETRANSLATE      Message contains a shared memory buffer and unable
314 *                          to map buffer to process.
315 */
316	extern DBAPI DSPNode_GetMessage(DSP_HNODE hNode, OUT struct DSP_MSG * pMessage,
317					UINT uTimeout);
318
319/*
320 *  ======== DSPNode_Pause ========
321 *  Purpose:
322 *      Temporarily suspend execution of a task node that is
323 *      currently running on a DSP.
324 *  Parameters:
325 *      hNode:              The node handle.
326 *  Returns:
327 *      DSP_SOK:            Success.
328 *      DSP_EHANDLE:        Invalid node handle.
329 *      DSP_ENODETYPE:      Invalid operation for this node type.
330 *      DSP_ETIMEOUT:       A timeout occured before the DSP responded.
331 *      DSP_EWRONGSTATE:    Operation is invalid for the current node state.
332 *      DSP_ERESTART:       A critical error has occurred and the DSP is
333 *                          being restarted.
334 *      DSP_EFAIL:          General failure.
335 */
336	extern DBAPI DSPNode_Pause(DSP_HNODE hNode);
337
338/*
339 *  ======== DSPNode_PutMessage ========
340 *  Purpose:
341 *      Send an event message to a task node.
342 *  Parameters:
343 *      hNode:              The node handle.
344 *      pMessage:           The message structure.
345 *      uTimeout:           Timeout (msecs) waiting for message to be queued.
346 *  Returns:
347 *      DSP_SOK:            Success.
348 *      DSP_EHANDLE:        Invalid node handle.
349 *      DSP_EPOINTER:       Parameter pMessage is not valid.
350 *      DSP_ENODETYPE:      Invalid operation for this node type
351 *      DSP_EWRONGSTATE:    Node is in an invalid state to send a message.
352 *      DSP_ETIMEOUT:       Time out occured.
353 *      DSP_ERESTART:       A critical error has occurred and the DSP is
354 *                          being restarted.
355 *      DSP_ETRANSLATE      The shared memory buffer contained in the message
356 *                          could not be mapped into the clients address space.
357 *      DSP_EFAIL:          General failure.
358 */
359	extern DBAPI DSPNode_PutMessage(DSP_HNODE hNode,
360					IN CONST struct DSP_MSG * pMessage,
361					UINT uTimeout);
362
363/*
364 *  ======== DSPNode_RegisterNotify ========
365 *  Purpose:
366 *      Register to be notified of specific events for this node.
367 *  Parameters:
368 *      hNode:              The node handle.
369 *      uEventMask:         Type of event about which to be notified.
370 *      uNotifyType:        Type of notification to be sent.
371 *      hNotification:      Handle of DSP_NOTIFICATION object.
372 *  Returns:
373 *      DSP_SOK:            Success.
374 *      DSP_EHANDLE:        Invalid node handle or hNotification.
375 *      DSP_EVALUE:         Invalid uEventMask.
376 *      DSP_ENOTIMP:        The specifed uNotifyType is not supported.
377 *      DSP_EFAIL:          Unable to register for notification.
378 */
379	extern DBAPI DSPNode_RegisterNotify(DSP_HNODE hNode, UINT uEventMask,
380					    UINT uNotifyType,
381					    struct DSP_NOTIFICATION* hNotification);
382
383/*
384 *  ======== DSPNode_Run ========
385 *  Purpose:
386 *      Start a node running, or resume execution of a previously paused node.
387 *  Parameters:
388 *      hNode:              The node handle.
389 *  Returns:
390 *      DSP_SOK:            Success.
391 *      DSP_EHANDLE:        Invalid node handle.
392 *      DSP_ENODETYPE:      Invalid operation for this type of node.
393 *      DSP_ESYMBOL:        Execute function not found in the COFF file.
394 *      DSP_EWRONGSTATE:    The node is not in the Created or Paused state.
395 *      DSP_ETIMEOUT:       A timeout occured before the DSP responded.
396 *      DSP_ERESTART:       A critical error has occurred and the DSP is
397 *                          being restarted.
398 *      DSP_EOVERLAYMEMORY: Overlay region for this phase in use by another node
399 *      DSP_EFAIL:          Unable to start or resume execution.
400 */
401	extern DBAPI DSPNode_Run(DSP_HNODE hNode);
402
403/*
404 *  ======== DSPNode_Terminate ========
405 *  Purpose:
406 *      Signal a task or xDAIS socket node running on a DSP processor that
407 *      it should exit its execute-phase function.
408 *  Parameters:
409 *      hNode:              Handle of node to terminate.
410 *      pStatus:            Location to execute-phase function return value.
411 *                          Possible values are between DSP_EUSER1-16.
412 *  Returns:
413 *      DSP_SOK:            Success.
414 *      DSP_EHANDLE:        Invalid node handle.
415 *      DSP_ENODETYPE:      Invalid operation for this type of node.
416 *      DSP_EWRONGSTATE:    The node is not in the Created or Paused state.
417 *      DSP_ETIMEOUT:       A timeout occured before the DSP responded.
418 *      DSP_ERESTART:       A critical error has occurred and the DSP is
419 *                          being restarted.
420 *      DSP_EFAIL:          Unable to Terminate the node.
421 */
422	extern DBAPI DSPNode_Terminate(DSP_HNODE hNode, DSP_STATUS * pStatus);
423
424
425
426/*
427 *  ======== DSPNode_GetUUIDProps ========
428 *  Purpose:
429 *      Fetch the Node Properties from the DCD/DOF file, give the UUID
430 *  Parameters:
431 *      hProcessor:         The processor handle.
432 *      pNodeID:            Ptr to DSP_UUID for the node.
433 *      pNodeProps:         Ptr to location to store node properties.
434 *  Returns:
435 *      DSP_SOK:            Success.
436 *      DSP_EPOINTER:       One of the input parameters pointers is invalid.
437 *      DSP_EHANDLE:        Invalid processor handle.
438 *      DSP_EMEMORY:        Memory is not available to allocate a node
439 *      DSP_EUUID:          The node with the specified UUID is not registered.
440 *      DSP_EWRONGSTATE:    The specified processor is in the wrong state
441 *                          (not running)
442 *      DSP_ERANGE:         The iPriority field specified in pAttrIn is out
443 *                          of range.
444 *      DSP_EFAIL:          General failure.
445 */
446	extern DBAPI DSPNode_GetUUIDProps(DSP_HPROCESSOR hProcessor,
447				      IN CONST struct DSP_UUID * pNodeID,
448				      OUT struct DSP_NDBPROPS * pNodeProps);
449#ifdef __cplusplus
450}
451#endif
452#endif				/* DSPNode_ */
453