Merge git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-linus
[linux-2.6-block.git] / drivers / staging / tidspbridge / include / dspbridge / nldrdefs.h
CommitLineData
6280238c
ORL
1/*
2 * nldrdefs.h
3 *
4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5 *
6 * Global Dynamic + static/overlay Node loader (NLDR) constants and types.
7 *
8 * Copyright (C) 2008 Texas Instruments, Inc.
9 *
10 * This package is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17 */
18
19#ifndef NLDRDEFS_
20#define NLDRDEFS_
21
22#include <dspbridge/dbdcddef.h>
23#include <dspbridge/devdefs.h>
24
25#define NLDR_MAXPATHLENGTH 255
26/* NLDR Objects: */
27struct nldr_object;
28struct nldr_nodeobject;
29
30/*
31 * ======== nldr_loadtype ========
32 * Load types for a node. Must match values in node.h55.
33 */
34enum nldr_loadtype {
35 NLDR_STATICLOAD, /* Linked in base image, not overlay */
36 NLDR_DYNAMICLOAD, /* Dynamically loaded node */
37 NLDR_OVLYLOAD /* Linked in base image, overlay node */
38};
39
40/*
41 * ======== nldr_ovlyfxn ========
42 * Causes code or data to be copied from load address to run address. This
43 * is the "cod_writefxn" that gets passed to the DBLL_Library and is used as
44 * the ZL write function.
45 *
46 * Parameters:
47 * priv_ref: Handle to identify the node.
5e2eae57
RS
48 * dsp_run_addr: Run address of code or data.
49 * dsp_load_addr: Load address of code or data.
6280238c 50 * ul_num_bytes: Number of (GPP) bytes to copy.
95870a88 51 * mem_space: RMS_CODE or RMS_DATA.
6280238c
ORL
52 * Returns:
53 * ul_num_bytes: Success.
54 * 0: Failure.
55 * Requires:
56 * Ensures:
57 */
5e2eae57
RS
58typedef u32(*nldr_ovlyfxn) (void *priv_ref, u32 dsp_run_addr,
59 u32 dsp_load_addr, u32 ul_num_bytes, u32 mem_space);
6280238c
ORL
60
61/*
62 * ======== nldr_writefxn ========
63 * Write memory function. Used for dynamic load writes.
64 * Parameters:
65 * priv_ref: Handle to identify the node.
5e2eae57 66 * dsp_add: Address of code or data.
6280238c
ORL
67 * pbuf: Code or data to be written
68 * ul_num_bytes: Number of (GPP) bytes to write.
95870a88 69 * mem_space: DBLL_DATA or DBLL_CODE.
6280238c
ORL
70 * Returns:
71 * ul_num_bytes: Success.
72 * 0: Failure.
73 * Requires:
74 * Ensures:
75 */
76typedef u32(*nldr_writefxn) (void *priv_ref,
5e2eae57 77 u32 dsp_add, void *pbuf,
95870a88 78 u32 ul_num_bytes, u32 mem_space);
6280238c
ORL
79
80/*
81 * ======== nldr_attrs ========
82 * Attributes passed to nldr_create function.
83 */
84struct nldr_attrs {
09f13304 85 nldr_ovlyfxn ovly;
dab7f7fe 86 nldr_writefxn write;
085467b8
RS
87 u16 dsp_word_size;
88 u16 dsp_mau_size;
6280238c
ORL
89};
90
91/*
92 * ======== nldr_phase ========
93 * Indicates node create, delete, or execute phase function.
94 */
95enum nldr_phase {
96 NLDR_CREATE,
97 NLDR_DELETE,
98 NLDR_EXECUTE,
99 NLDR_NOPHASE
100};
101
102/*
103 * Typedefs of loader functions imported from a DLL, or defined in a
104 * function table.
105 */
106
107/*
108 * ======== nldr_allocate ========
109 * Allocate resources to manage the loading of a node on the DSP.
110 *
111 * Parameters:
112 * nldr_obj: Handle of loader that will load the node.
113 * priv_ref: Handle to identify the node.
114 * node_props: Pointer to a dcd_nodeprops for the node.
e436d07d 115 * nldr_nodeobj: Location to store node handle on output. This handle
6280238c
ORL
116 * will be passed to nldr_load/nldr_unload.
117 * pf_phase_split: pointer to int variable referenced in node.c
118 * Returns:
119 * 0: Success.
120 * -ENOMEM: Insufficient memory on GPP.
121 * Requires:
122 * nldr_init(void) called.
123 * Valid nldr_obj.
124 * node_props != NULL.
e436d07d 125 * nldr_nodeobj != NULL.
6280238c 126 * Ensures:
e436d07d
RS
127 * 0: IsValidNode(*nldr_nodeobj).
128 * error: *nldr_nodeobj == NULL.
6280238c
ORL
129 */
130typedef int(*nldr_allocatefxn) (struct nldr_object *nldr_obj,
131 void *priv_ref,
9d7d0a52 132 const struct dcd_nodeprops
6280238c 133 * node_props,
e6bf74f0 134 struct nldr_nodeobject
e436d07d 135 **nldr_nodeobj,
e6bf74f0 136 bool *pf_phase_split);
6280238c
ORL
137
138/*
139 * ======== nldr_create ========
140 * Create a loader object. This object handles the loading and unloading of
141 * create, delete, and execute phase functions of nodes on the DSP target.
142 *
143 * Parameters:
daa89e6c 144 * nldr: Location to store loader handle on output.
6280238c
ORL
145 * hdev_obj: Device for this processor.
146 * pattrs: Loader attributes.
147 * Returns:
148 * 0: Success;
149 * -ENOMEM: Insufficient memory for requested resources.
150 * Requires:
151 * nldr_init(void) called.
daa89e6c 152 * nldr != NULL.
6280238c
ORL
153 * hdev_obj != NULL.
154 * pattrs != NULL.
155 * Ensures:
daa89e6c
RS
156 * 0: Valid *nldr.
157 * error: *nldr == NULL.
6280238c 158 */
e6bf74f0 159typedef int(*nldr_createfxn) (struct nldr_object **nldr,
6280238c 160 struct dev_object *hdev_obj,
9d7d0a52 161 const struct nldr_attrs *pattrs);
6280238c
ORL
162
163/*
164 * ======== nldr_delete ========
165 * Delete the NLDR loader.
166 *
167 * Parameters:
168 * nldr_obj: Node manager object.
169 * Returns:
170 * Requires:
171 * nldr_init(void) called.
172 * Valid nldr_obj.
173 * Ensures:
174 * nldr_obj invalid
175 */
176typedef void (*nldr_deletefxn) (struct nldr_object *nldr_obj);
177
178/*
179 * ======== nldr_exit ========
180 * Discontinue usage of NLDR module.
181 *
182 * Parameters:
183 * Returns:
184 * Requires:
185 * nldr_init(void) successfully called before.
186 * Ensures:
187 * Any resources acquired in nldr_init(void) will be freed when last NLDR
188 * client calls nldr_exit(void).
189 */
190typedef void (*nldr_exitfxn) (void);
191
192/*
193 * ======== NLDR_Free ========
194 * Free resources allocated in nldr_allocate.
195 *
196 * Parameters:
197 * nldr_node_obj: Handle returned from nldr_allocate().
198 * Returns:
199 * Requires:
200 * nldr_init(void) called.
201 * Valid nldr_node_obj.
202 * Ensures:
203 */
204typedef void (*nldr_freefxn) (struct nldr_nodeobject *nldr_node_obj);
205
206/*
207 * ======== nldr_get_fxn_addr ========
208 * Get address of create, delete, or execute phase function of a node on
209 * the DSP.
210 *
211 * Parameters:
212 * nldr_node_obj: Handle returned from nldr_allocate().
383b8345
RS
213 * str_fxn: Name of function.
214 * addr: Location to store function address.
6280238c
ORL
215 * Returns:
216 * 0: Success.
217 * -ESPIPE: Address of function not found.
218 * Requires:
219 * nldr_init(void) called.
220 * Valid nldr_node_obj.
383b8345
RS
221 * addr != NULL;
222 * str_fxn != NULL;
6280238c
ORL
223 * Ensures:
224 */
225typedef int(*nldr_getfxnaddrfxn) (struct nldr_nodeobject
226 * nldr_node_obj,
383b8345 227 char *str_fxn, u32 * addr);
6280238c
ORL
228
229/*
230 * ======== nldr_init ========
231 * Initialize the NLDR module.
232 *
233 * Parameters:
234 * Returns:
235 * TRUE if initialization succeeded, FALSE otherwise.
236 * Ensures:
237 */
238typedef bool(*nldr_initfxn) (void);
239
240/*
241 * ======== nldr_load ========
242 * Load create, delete, or execute phase function of a node on the DSP.
243 *
244 * Parameters:
245 * nldr_node_obj: Handle returned from nldr_allocate().
246 * phase: Type of function to load (create, delete, or execute).
247 * Returns:
248 * 0: Success.
249 * -ENOMEM: Insufficient memory on GPP.
250 * -ENXIO: Can't overlay phase because overlay memory
251 * is already in use.
252 * -EILSEQ: Failure in dynamic loader library.
253 * Requires:
254 * nldr_init(void) called.
255 * Valid nldr_node_obj.
256 * Ensures:
257 */
258typedef int(*nldr_loadfxn) (struct nldr_nodeobject *nldr_node_obj,
259 enum nldr_phase phase);
260
261/*
262 * ======== nldr_unload ========
263 * Unload create, delete, or execute phase function of a node on the DSP.
264 *
265 * Parameters:
266 * nldr_node_obj: Handle returned from nldr_allocate().
267 * phase: Node function to unload (create, delete, or execute).
268 * Returns:
269 * 0: Success.
270 * -ENOMEM: Insufficient memory on GPP.
271 * Requires:
272 * nldr_init(void) called.
273 * Valid nldr_node_obj.
274 * Ensures:
275 */
276typedef int(*nldr_unloadfxn) (struct nldr_nodeobject *nldr_node_obj,
277 enum nldr_phase phase);
278
279/*
280 * ======== node_ldr_fxns ========
281 */
282struct node_ldr_fxns {
3c882de5 283 nldr_allocatefxn allocate;
e17ba7f2
RS
284 nldr_createfxn create;
285 nldr_deletefxn delete;
09f13304
RS
286 nldr_exitfxn exit;
287 nldr_getfxnaddrfxn get_fxn_addr;
288 nldr_initfxn init;
289 nldr_loadfxn load;
290 nldr_unloadfxn unload;
6280238c
ORL
291};
292
293#endif /* NLDRDEFS_ */