Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
proc.h
Go to the documentation of this file.
1 /*
2  * proc.h
3  *
4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5  *
6  * This is the DSP API RM module interface.
7  *
8  * Copyright (C) 2005-2006 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 PROC_
20 #define PROC_
21 
22 #include <dspbridge/cfgdefs.h>
23 #include <dspbridge/devdefs.h>
24 #include <dspbridge/drv.h>
25 
26 extern char *iva_img;
27 
28 /*
29  * ======== proc_attach ========
30  * Purpose:
31  * Prepare for communication with a particular DSP processor, and return
32  * a handle to the processor object. The PROC Object gets created
33  * Parameters:
34  * processor_id : The processor index (zero-based).
35  * hmgr_obj : Handle to the Manager Object
36  * attr_in : Ptr to the dsp_processorattrin structure.
37  * A NULL value means use default values.
38  * ph_processor : Ptr to location to store processor handle.
39  * Returns:
40  * 0 : Success.
41  * -EPERM : General failure.
42  * -EFAULT : Invalid processor handle.
43  * 0: Success; Processor already attached.
44  * Requires:
45  * ph_processor != NULL.
46  * PROC Initialized.
47  * Ensures:
48  * -EPERM, and *ph_processor == NULL, OR
49  * Success and *ph_processor is a Valid Processor handle OR
50  * 0 and *ph_processor is a Valid Processor.
51  * Details:
52  * When attr_in is NULL, the default timeout value is 10 seconds.
53  */
54 extern int proc_attach(u32 processor_id,
55  const struct dsp_processorattrin
56  *attr_in, void **ph_processor,
57  struct process_context *pr_ctxt);
58 
59 /*
60  * ======== proc_auto_start =========
61  * Purpose:
62  * A Particular device gets loaded with the default image
63  * if the AutoStart flag is set.
64  * Parameters:
65  * hdev_obj : Handle to the Device
66  * Returns:
67  * 0 : On Successful Loading
68  * -ENOENT : No DSP exec file found.
69  * -EPERM : General Failure
70  * Requires:
71  * hdev_obj != NULL.
72  * dev_node_obj != NULL.
73  * PROC Initialized.
74  * Ensures:
75  */
76 extern int proc_auto_start(struct cfg_devnode *dev_node_obj,
77  struct dev_object *hdev_obj);
78 
79 /*
80  * ======== proc_ctrl ========
81  * Purpose:
82  * Pass control information to the GPP device driver managing the DSP
83  * processor. This will be an OEM-only function, and not part of the
84  * 'Bridge application developer's API.
85  * Parameters:
86  * hprocessor : The processor handle.
87  * dw_cmd : Private driver IOCTL cmd ID.
88  * pargs : Ptr to an driver defined argument structure.
89  * Returns:
90  * 0 : SUCCESS
91  * -EFAULT : Invalid processor handle.
92  * -ETIME: A Timeout Occurred before the Control information
93  * could be sent.
94  * -EPERM : General Failure.
95  * Requires:
96  * PROC Initialized.
97  * Ensures
98  * Details:
99  * This function Calls bridge_dev_ctrl.
100  */
101 extern int proc_ctrl(void *hprocessor,
102  u32 dw_cmd, struct dsp_cbdata *arg);
103 
104 /*
105  * ======== proc_detach ========
106  * Purpose:
107  * Close a DSP processor and de-allocate all (GPP) resources reserved
108  * for it. The Processor Object is deleted.
109  * Parameters:
110  * pr_ctxt : The processor handle.
111  * Returns:
112  * 0 : Success.
113  * -EFAULT : InValid Handle.
114  * -EPERM : General failure.
115  * Requires:
116  * PROC Initialized.
117  * Ensures:
118  * PROC Object is destroyed.
119  */
120 extern int proc_detach(struct process_context *pr_ctxt);
121 
122 /*
123  * ======== proc_enum_nodes ========
124  * Purpose:
125  * Enumerate the nodes currently allocated on a processor.
126  * Parameters:
127  * hprocessor : The processor handle.
128  * node_tab : The first Location of an array allocated for node
129  * handles.
130  * node_tab_size: The number of (DSP_HNODE) handles that can be held
131  * to the memory the client has allocated for node_tab
132  * pu_num_nodes : Location where DSPProcessor_EnumNodes will return
133  * the number of valid handles written to node_tab
134  * pu_allocated : Location where DSPProcessor_EnumNodes will return
135  * the number of nodes that are allocated on the DSP.
136  * Returns:
137  * 0 : Success.
138  * -EFAULT : Invalid processor handle.
139  * -EINVAL : The amount of memory allocated for node_tab is
140  * insufficent. That is the number of nodes actually
141  * allocated on the DSP is greater than the value
142  * specified for node_tab_size.
143  * -EPERM : Unable to get Resource Information.
144  * Details:
145  * Requires
146  * pu_num_nodes is not NULL.
147  * pu_allocated is not NULL.
148  * node_tab is not NULL.
149  * PROC Initialized.
150  * Ensures:
151  * Details:
152  */
153 extern int proc_enum_nodes(void *hprocessor,
154  void **node_tab,
155  u32 node_tab_size,
156  u32 *pu_num_nodes,
157  u32 *pu_allocated);
158 
159 /*
160  * ======== proc_get_resource_info ========
161  * Purpose:
162  * Enumerate the resources currently available on a processor.
163  * Parameters:
164  * hprocessor : The processor handle.
165  * resource_type: Type of resource .
166  * resource_info: Ptr to the dsp_resourceinfo structure.
167  * resource_info_size: Size of the structure.
168  * Returns:
169  * 0 : Success.
170  * -EFAULT : Invalid processor handle.
171  * -EBADR: The processor is not in the PROC_RUNNING state.
172  * -ETIME: A timeout occurred before the DSP responded to the
173  * querry.
174  * -EPERM : Unable to get Resource Information
175  * Requires:
176  * resource_info is not NULL.
177  * Parameter resource_type is Valid.[TBD]
178  * resource_info_size is >= sizeof dsp_resourceinfo struct.
179  * PROC Initialized.
180  * Ensures:
181  * Details:
182  * This function currently returns
183  * -ENOSYS, and does not write any data to the resource_info struct.
184  */
185 extern int proc_get_resource_info(void *hprocessor,
187  struct dsp_resourceinfo
188  *resource_info,
189  u32 resource_info_size);
190 
191 /*
192  * ======== proc_get_dev_object =========
193  * Purpose:
194  * Returns the DEV Hanlde for a given Processor handle
195  * Parameters:
196  * hprocessor : Processor Handle
197  * device_obj : Location to store the DEV Handle.
198  * Returns:
199  * 0 : Success; *device_obj has Dev handle
200  * -EPERM : Failure; *device_obj is zero.
201  * Requires:
202  * device_obj is not NULL
203  * PROC Initialized.
204  * Ensures:
205  * 0 : *device_obj is not NULL
206  * -EPERM : *device_obj is NULL.
207  */
208 extern int proc_get_dev_object(void *hprocessor,
209  struct dev_object **device_obj);
210 
211 /*
212  * ======== proc_get_state ========
213  * Purpose:
214  * Report the state of the specified DSP processor.
215  * Parameters:
216  * hprocessor : The processor handle.
217  * proc_state_obj : Ptr to location to store the dsp_processorstate
218  * structure.
219  * state_info_size: Size of dsp_processorstate.
220  * Returns:
221  * 0 : Success.
222  * -EFAULT : Invalid processor handle.
223  * -EPERM : General failure while querying processor state.
224  * Requires:
225  * proc_state_obj is not NULL
226  * state_info_size is >= than the size of dsp_processorstate structure.
227  * PROC Initialized.
228  * Ensures:
229  * Details:
230  */
231 extern int proc_get_state(void *hprocessor, struct dsp_processorstate
232  *proc_state_obj, u32 state_info_size);
233 
234 /*
235  * ======== PROC_GetProcessorID ========
236  * Purpose:
237  * Report the state of the specified DSP processor.
238  * Parameters:
239  * hprocessor : The processor handle.
240  * proc_id : Processor ID
241  *
242  * Returns:
243  * 0 : Success.
244  * -EFAULT : Invalid processor handle.
245  * -EPERM : General failure while querying processor state.
246  * Requires:
247  * proc_state_obj is not NULL
248  * state_info_size is >= than the size of dsp_processorstate structure.
249  * PROC Initialized.
250  * Ensures:
251  * Details:
252  */
253 extern int proc_get_processor_id(void *proc, u32 * proc_id);
254 
255 /*
256  * ======== proc_get_trace ========
257  * Purpose:
258  * Retrieve the trace buffer from the specified DSP processor.
259  * Parameters:
260  * hprocessor : The processor handle.
261  * pbuf : Ptr to buffer to hold trace output.
262  * max_size : Maximum size of the output buffer.
263  * Returns:
264  * 0 : Success.
265  * -EFAULT : Invalid processor handle.
266  * -EPERM : General failure while retrieving processor trace
267  * Buffer.
268  * Requires:
269  * pbuf is not NULL
270  * max_size is > 0.
271  * PROC Initialized.
272  * Ensures:
273  * Details:
274  */
275 extern int proc_get_trace(void *hprocessor, u8 * pbuf, u32 max_size);
276 
277 /*
278  * ======== proc_load ========
279  * Purpose:
280  * Reset a processor and load a new base program image.
281  * This will be an OEM-only function.
282  * Parameters:
283  * hprocessor: The processor handle.
284  * argc_index: The number of Arguments(strings)in the aArgV[]
285  * user_args: An Array of Arguments(Unicode Strings)
286  * user_envp: An Array of Environment settings(Unicode Strings)
287  * Returns:
288  * 0: Success.
289  * -ENOENT: The DSP Execuetable was not found.
290  * -EFAULT: Invalid processor handle.
291  * -EPERM : Unable to Load the Processor
292  * Requires:
293  * user_args is not NULL
294  * argc_index is > 0
295  * PROC Initialized.
296  * Ensures:
297  * Success and ProcState == PROC_LOADED
298  * or DSP_FAILED status.
299  * Details:
300  * Does not implement access rights to control which GPP application
301  * can load the processor.
302  */
303 extern int proc_load(void *hprocessor,
304  const s32 argc_index, const char **user_args,
305  const char **user_envp);
306 
307 /*
308  * ======== proc_register_notify ========
309  * Purpose:
310  * Register to be notified of specific processor events
311  * Parameters:
312  * hprocessor : The processor handle.
313  * event_mask : Mask of types of events to be notified about.
314  * notify_type : Type of notification to be sent.
315  * hnotification: Handle to be used for notification.
316  * Returns:
317  * 0 : Success.
318  * -EFAULT : Invalid processor handle or hnotification.
319  * -EINVAL : Parameter event_mask is Invalid
320  * DSP_ENOTIMP : The notification type specified in uNotifyMask
321  * is not supported.
322  * -EPERM : Unable to register for notification.
323  * Requires:
324  * hnotification is not NULL
325  * PROC Initialized.
326  * Ensures:
327  * Details:
328  */
329 extern int proc_register_notify(void *hprocessor,
330  u32 event_mask, u32 notify_type,
331  struct dsp_notification
332  *hnotification);
333 
334 /*
335  * ======== proc_notify_clients ========
336  * Purpose:
337  * Notify the Processor Clients
338  * Parameters:
339  * proc : The processor handle.
340  * events : Event to be notified about.
341  * Returns:
342  * 0 : Success.
343  * -EFAULT : Invalid processor handle.
344  * -EPERM : Failure to Set or Reset the Event
345  * Requires:
346  * events is Supported or Valid type of Event
347  * proc is a valid handle
348  * PROC Initialized.
349  * Ensures:
350  */
351 extern int proc_notify_clients(void *proc, u32 events);
352 
353 /*
354  * ======== proc_notify_all_clients ========
355  * Purpose:
356  * Notify the Processor Clients
357  * Parameters:
358  * proc : The processor handle.
359  * events : Event to be notified about.
360  * Returns:
361  * 0 : Success.
362  * -EFAULT : Invalid processor handle.
363  * -EPERM : Failure to Set or Reset the Event
364  * Requires:
365  * events is Supported or Valid type of Event
366  * proc is a valid handle
367  * PROC Initialized.
368  * Ensures:
369  * Details:
370  * NODE And STRM would use this function to notify their clients
371  * about the state changes in NODE or STRM.
372  */
373 extern int proc_notify_all_clients(void *proc, u32 events);
374 
375 /*
376  * ======== proc_start ========
377  * Purpose:
378  * Start a processor running.
379  * Processor must be in PROC_LOADED state.
380  * This will be an OEM-only function, and not part of the 'Bridge
381  * application developer's API.
382  * Parameters:
383  * hprocessor : The processor handle.
384  * Returns:
385  * 0 : Success.
386  * -EFAULT : Invalid processor handle.
387  * -EBADR: Processor is not in PROC_LOADED state.
388  * -EPERM : Unable to start the processor.
389  * Requires:
390  * PROC Initialized.
391  * Ensures:
392  * Success and ProcState == PROC_RUNNING or DSP_FAILED status.
393  * Details:
394  */
395 extern int proc_start(void *hprocessor);
396 
397 /*
398  * ======== proc_stop ========
399  * Purpose:
400  * Start a processor running.
401  * Processor must be in PROC_LOADED state.
402  * This will be an OEM-only function, and not part of the 'Bridge
403  * application developer's API.
404  * Parameters:
405  * hprocessor : The processor handle.
406  * Returns:
407  * 0 : Success.
408  * -EFAULT : Invalid processor handle.
409  * -EBADR: Processor is not in PROC_LOADED state.
410  * -EPERM : Unable to start the processor.
411  * Requires:
412  * PROC Initialized.
413  * Ensures:
414  * Success and ProcState == PROC_RUNNING or DSP_FAILED status.
415  * Details:
416  */
417 extern int proc_stop(void *hprocessor);
418 
419 /*
420  * ======== proc_end_dma ========
421  * Purpose:
422  * Begin a DMA transfer
423  * Parameters:
424  * hprocessor : The processor handle.
425  * pmpu_addr : Buffer start address
426  * ul_size : Buffer size
427  * dir : The direction of the transfer
428  * Requires:
429  * Memory was previously mapped.
430  */
431 extern int proc_end_dma(void *hprocessor, void *pmpu_addr, u32 ul_size,
432  enum dma_data_direction dir);
433 /*
434  * ======== proc_begin_dma ========
435  * Purpose:
436  * Begin a DMA transfer
437  * Parameters:
438  * hprocessor : The processor handle.
439  * pmpu_addr : Buffer start address
440  * ul_size : Buffer size
441  * dir : The direction of the transfer
442  * Requires:
443  * Memory was previously mapped.
444  */
445 extern int proc_begin_dma(void *hprocessor, void *pmpu_addr, u32 ul_size,
446  enum dma_data_direction dir);
447 
448 /*
449  * ======== proc_flush_memory ========
450  * Purpose:
451  * Flushes a buffer from the MPU data cache.
452  * Parameters:
453  * hprocessor : The processor handle.
454  * pmpu_addr : Buffer start address
455  * ul_size : Buffer size
456  * ul_flags : Reserved.
457  * Returns:
458  * 0 : Success.
459  * -EFAULT : Invalid processor handle.
460  * -EPERM : General failure.
461  * Requires:
462  * PROC Initialized.
463  * Ensures:
464  * Details:
465  * All the arguments are currently ignored.
466  */
467 extern int proc_flush_memory(void *hprocessor,
468  void *pmpu_addr, u32 ul_size, u32 ul_flags);
469 
470 /*
471  * ======== proc_invalidate_memory ========
472  * Purpose:
473  * Invalidates a buffer from the MPU data cache.
474  * Parameters:
475  * hprocessor : The processor handle.
476  * pmpu_addr : Buffer start address
477  * ul_size : Buffer size
478  * Returns:
479  * 0 : Success.
480  * -EFAULT : Invalid processor handle.
481  * -EPERM : General failure.
482  * Requires:
483  * PROC Initialized.
484  * Ensures:
485  * Details:
486  * All the arguments are currently ignored.
487  */
488 extern int proc_invalidate_memory(void *hprocessor,
489  void *pmpu_addr, u32 ul_size);
490 
491 /*
492  * ======== proc_map ========
493  * Purpose:
494  * Maps a MPU buffer to DSP address space.
495  * Parameters:
496  * hprocessor : The processor handle.
497  * pmpu_addr : Starting address of the memory region to map.
498  * ul_size : Size of the memory region to map.
499  * req_addr : Requested DSP start address. Offset-adjusted actual
500  * mapped address is in the last argument.
501  * pp_map_addr : Ptr to DSP side mapped u8 address.
502  * ul_map_attr : Optional endianness attributes, virt to phys flag.
503  * Returns:
504  * 0 : Success.
505  * -EFAULT : Invalid processor handle.
506  * -EPERM : General failure.
507  * -ENOMEM : MPU side memory allocation error.
508  * -ENOENT : Cannot find a reserved region starting with this
509  * : address.
510  * Requires:
511  * pmpu_addr is not NULL
512  * ul_size is not zero
513  * pp_map_addr is not NULL
514  * PROC Initialized.
515  * Ensures:
516  * Details:
517  */
518 extern int proc_map(void *hprocessor,
519  void *pmpu_addr,
520  u32 ul_size,
521  void *req_addr,
522  void **pp_map_addr, u32 ul_map_attr,
523  struct process_context *pr_ctxt);
524 
525 /*
526  * ======== proc_reserve_memory ========
527  * Purpose:
528  * Reserve a virtually contiguous region of DSP address space.
529  * Parameters:
530  * hprocessor : The processor handle.
531  * ul_size : Size of the address space to reserve.
532  * pp_rsv_addr : Ptr to DSP side reserved u8 address.
533  * Returns:
534  * 0 : Success.
535  * -EFAULT : Invalid processor handle.
536  * -EPERM : General failure.
537  * -ENOMEM : Cannot reserve chunk of this size.
538  * Requires:
539  * pp_rsv_addr is not NULL
540  * PROC Initialized.
541  * Ensures:
542  * Details:
543  */
544 extern int proc_reserve_memory(void *hprocessor,
545  u32 ul_size, void **pp_rsv_addr,
546  struct process_context *pr_ctxt);
547 
548 /*
549  * ======== proc_un_map ========
550  * Purpose:
551  * Removes a MPU buffer mapping from the DSP address space.
552  * Parameters:
553  * hprocessor : The processor handle.
554  * map_addr : Starting address of the mapped memory region.
555  * Returns:
556  * 0 : Success.
557  * -EFAULT : Invalid processor handle.
558  * -EPERM : General failure.
559  * -ENOENT : Cannot find a mapped region starting with this
560  * : address.
561  * Requires:
562  * map_addr is not NULL
563  * PROC Initialized.
564  * Ensures:
565  * Details:
566  */
567 extern int proc_un_map(void *hprocessor, void *map_addr,
568  struct process_context *pr_ctxt);
569 
570 /*
571  * ======== proc_un_reserve_memory ========
572  * Purpose:
573  * Frees a previously reserved region of DSP address space.
574  * Parameters:
575  * hprocessor : The processor handle.
576  * prsv_addr : Ptr to DSP side reservedBYTE address.
577  * Returns:
578  * 0 : Success.
579  * -EFAULT : Invalid processor handle.
580  * -EPERM : General failure.
581  * -ENOENT : Cannot find a reserved region starting with this
582  * : address.
583  * Requires:
584  * prsv_addr is not NULL
585  * PROC Initialized.
586  * Ensures:
587  * Details:
588  */
589 extern int proc_un_reserve_memory(void *hprocessor,
590  void *prsv_addr,
591  struct process_context *pr_ctxt);
592 
593 #endif /* PROC_ */