1/* 2 * strm.h 3 * 4 * DSP-BIOS Bridge driver support functions for TI OMAP processors. 5 * 6 * DSPBridge Stream Manager. 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 STRM_ 20#define STRM_ 21 22#include <dspbridge/dev.h> 23 24#include <dspbridge/strmdefs.h> 25#include <dspbridge/proc.h> 26 27/* 28 * ======== strm_allocate_buffer ======== 29 * Purpose: 30 * Allocate data buffer(s) for use with a stream. 31 * Parameter: 32 * strmres: Stream resource info handle returned from strm_open(). 33 * usize: Size (GPP bytes) of the buffer(s). 34 * num_bufs: Number of buffers to allocate. 35 * ap_buffer: Array to hold buffer addresses. 36 * Returns: 37 * 0: Success. 38 * -EFAULT: Invalid stream_obj. 39 * -ENOMEM: Insufficient memory. 40 * -EPERM: Failure occurred, unable to allocate buffers. 41 * -EINVAL: usize must be > 0 bytes. 42 * Requires: 43 * ap_buffer != NULL. 44 * Ensures: 45 */ 46extern int strm_allocate_buffer(struct strm_res_object *strmres, 47 u32 usize, 48 u8 **ap_buffer, 49 u32 num_bufs, 50 struct process_context *pr_ctxt); 51 52/* 53 * ======== strm_close ======== 54 * Purpose: 55 * Close a stream opened with strm_open(). 56 * Parameter: 57 * strmres: Stream resource info handle returned from strm_open(). 58 * Returns: 59 * 0: Success. 60 * -EFAULT: Invalid stream_obj. 61 * -EPIPE: Some data buffers issued to the stream have not 62 * been reclaimed. 63 * -EPERM: Failure to close stream. 64 * Requires: 65 * Ensures: 66 */ 67extern int strm_close(struct strm_res_object *strmres, 68 struct process_context *pr_ctxt); 69 70/* 71 * ======== strm_create ======== 72 * Purpose: 73 * Create a STRM manager object. This object holds information about the 74 * device needed to open streams. 75 * Parameters: 76 * strm_man: Location to store handle to STRM manager object on 77 * output. 78 * dev_obj: Device for this processor. 79 * Returns: 80 * 0: Success; 81 * -ENOMEM: Insufficient memory for requested resources. 82 * -EPERM: General failure. 83 * Requires: 84 * strm_man != NULL. 85 * dev_obj != NULL. 86 * Ensures: 87 * 0: Valid *strm_man. 88 * error: *strm_man == NULL. 89 */ 90extern int strm_create(struct strm_mgr **strm_man, 91 struct dev_object *dev_obj); 92 93/* 94 * ======== strm_delete ======== 95 * Purpose: 96 * Delete the STRM Object. 97 * Parameters: 98 * strm_mgr_obj: Handle to STRM manager object from strm_create. 99 * Returns: 100 * Requires: 101 * Valid strm_mgr_obj. 102 * Ensures: 103 * strm_mgr_obj is not valid. 104 */ 105extern void strm_delete(struct strm_mgr *strm_mgr_obj); 106 107/* 108 * ======== strm_free_buffer ======== 109 * Purpose: 110 * Free buffer(s) allocated with strm_allocate_buffer. 111 * Parameter: 112 * strmres: Stream resource info handle returned from strm_open(). 113 * ap_buffer: Array containing buffer addresses. 114 * num_bufs: Number of buffers to be freed. 115 * Returns: 116 * 0: Success. 117 * -EFAULT: Invalid stream handle. 118 * -EPERM: Failure occurred, unable to free buffers. 119 * Requires: 120 * ap_buffer != NULL. 121 * Ensures: 122 */ 123extern int strm_free_buffer(struct strm_res_object *strmres, 124 u8 **ap_buffer, u32 num_bufs, 125 struct process_context *pr_ctxt); 126 127/* 128 * ======== strm_get_info ======== 129 * Purpose: 130 * Get information about a stream. User's dsp_streaminfo is contained 131 * in stream_info struct. stream_info also contains Bridge private info. 132 * Parameters: 133 * stream_obj: Stream handle returned from strm_open(). 134 * stream_info: Location to store stream info on output. 135 * uSteamInfoSize: Size of user's dsp_streaminfo structure. 136 * Returns: 137 * 0: Success. 138 * -EFAULT: Invalid stream_obj. 139 * -EINVAL: stream_info_size < sizeof(dsp_streaminfo). 140 * -EPERM: Unable to get stream info. 141 * Requires: 142 * stream_info != NULL. 143 * Ensures: 144 */ 145extern int strm_get_info(struct strm_object *stream_obj, 146 struct stream_info *stream_info, 147 u32 stream_info_size); 148 149/* 150 * ======== strm_idle ======== 151 * Purpose: 152 * Idle a stream and optionally flush output data buffers. 153 * If this is an output stream and flush_data is TRUE, all data currently 154 * enqueued will be discarded. 155 * If this is an output stream and flush_data is FALSE, this function 156 * will block until all currently buffered data is output, or the timeout 157 * specified has been reached. 158 * After a successful call to strm_idle(), all buffers can immediately 159 * be reclaimed. 160 * Parameters: 161 * stream_obj: Stream handle returned from strm_open(). 162 * flush_data: If TRUE, discard output buffers. 163 * Returns: 164 * 0: Success. 165 * -EFAULT: Invalid stream_obj. 166 * -ETIME: A timeout occurred before the stream could be idled. 167 * -EPERM: Unable to idle stream. 168 * Requires: 169 * Ensures: 170 */ 171extern int strm_idle(struct strm_object *stream_obj, bool flush_data); 172 173/* 174 * ======== strm_issue ======== 175 * Purpose: 176 * Send a buffer of data to a stream. 177 * Parameters: 178 * stream_obj: Stream handle returned from strm_open(). 179 * pbuf: Pointer to buffer of data to be sent to the stream. 180 * ul_bytes: Number of bytes of data in the buffer. 181 * ul_buf_size: Actual buffer size in bytes. 182 * dw_arg: A user argument that travels with the buffer. 183 * Returns: 184 * 0: Success. 185 * -EFAULT: Invalid stream_obj. 186 * -ENOSR: The stream is full. 187 * -EPERM: Failure occurred, unable to issue buffer. 188 * Requires: 189* pbuf != NULL. 190 * Ensures: 191 */ 192extern int strm_issue(struct strm_object *stream_obj, u8 * pbuf, 193 u32 ul_bytes, u32 ul_buf_size, u32 dw_arg); 194 195/* 196 * ======== strm_open ======== 197 * Purpose: 198 * Open a stream for sending/receiving data buffers to/from a task of 199 * DAIS socket node on the DSP. 200 * Parameters: 201 * hnode: Node handle returned from node_allocate(). 202 * dir: DSP_TONODE or DSP_FROMNODE. 203 * index: Stream index. 204 * pattr: Pointer to structure containing attributes to be 205 * applied to stream. Cannot be NULL. 206 * strmres: Location to store stream resource info handle on output. 207 * Returns: 208 * 0: Success. 209 * -EFAULT: Invalid hnode. 210 * -EPERM: Invalid direction. 211 * hnode is not a task or DAIS socket node. 212 * Unable to open stream. 213 * -EINVAL: Invalid index. 214 * Requires: 215 * strmres != NULL. 216 * pattr != NULL. 217 * Ensures: 218 * 0: *strmres is valid. 219 * error: *strmres == NULL. 220 */ 221extern int strm_open(struct node_object *hnode, u32 dir, 222 u32 index, struct strm_attr *pattr, 223 struct strm_res_object **strmres, 224 struct process_context *pr_ctxt); 225 226/* 227 * ======== strm_reclaim ======== 228 * Purpose: 229 * Request a buffer back from a stream. 230 * Parameters: 231 * stream_obj: Stream handle returned from strm_open(). 232 * buf_ptr: Location to store pointer to reclaimed buffer. 233 * nbytes: Location where number of bytes of data in the 234 * buffer will be written. 235 * buff_size: Location where actual buffer size will be written. 236 * pdw_arg: Location where user argument that travels with 237 * the buffer will be written. 238 * Returns: 239 * 0: Success. 240 * -EFAULT: Invalid stream_obj. 241 * -ETIME: A timeout occurred before a buffer could be 242 * retrieved. 243 * -EPERM: Failure occurred, unable to reclaim buffer. 244 * Requires: 245 * buf_ptr != NULL. 246 * nbytes != NULL. 247 * pdw_arg != NULL. 248 * Ensures: 249 */ 250extern int strm_reclaim(struct strm_object *stream_obj, 251 u8 **buf_ptr, u32 * nbytes, 252 u32 *buff_size, u32 *pdw_arg); 253 254/* 255 * ======== strm_register_notify ======== 256 * Purpose: 257 * Register to be notified on specific events for this stream. 258 * Parameters: 259 * stream_obj: Stream handle returned by strm_open(). 260 * event_mask: Mask of types of events to be notified about. 261 * notify_type: Type of notification to be sent. 262 * hnotification: Handle to be used for notification. 263 * Returns: 264 * 0: Success. 265 * -EFAULT: Invalid stream_obj. 266 * -ENOMEM: Insufficient memory on GPP. 267 * -EINVAL: event_mask is invalid. 268 * -ENOSYS: Notification type specified by notify_type is not 269 * supported. 270 * Requires: 271 * hnotification != NULL. 272 * Ensures: 273 */ 274extern int strm_register_notify(struct strm_object *stream_obj, 275 u32 event_mask, u32 notify_type, 276 struct dsp_notification 277 *hnotification); 278 279/* 280 * ======== strm_select ======== 281 * Purpose: 282 * Select a ready stream. 283 * Parameters: 284 * strm_tab: Array of stream handles returned from strm_open(). 285 * strms: Number of stream handles in array. 286 * pmask: Location to store mask of ready streams on output. 287 * utimeout: Timeout value (milliseconds). 288 * Returns: 289 * 0: Success. 290 * -EDOM: strms out of range. 291 292 * -EFAULT: Invalid stream handle in array. 293 * -ETIME: A timeout occurred before a stream became ready. 294 * -EPERM: Failure occurred, unable to select a stream. 295 * Requires: 296 * strm_tab != NULL. 297 * strms > 0. 298 * pmask != NULL. 299 * Ensures: 300 * 0: *pmask != 0 || utimeout == 0. 301 * Error: *pmask == 0. 302 */ 303extern int strm_select(struct strm_object **strm_tab, 304 u32 strms, u32 *pmask, u32 utimeout); 305 306#endif /* STRM_ */ 307