1 /* 2 * disp.h 3 * 4 * DSP-BIOS Bridge driver support functions for TI OMAP processors. 5 * 6 * DSP/BIOS Bridge Node Dispatcher. 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 DISP_ 20 #define DISP_ 21 22 #include <dspbridge/dbdefs.h> 23 #include <dspbridge/nodedefs.h> 24 #include <dspbridge/nodepriv.h> 25 26 struct disp_object; 27 28 /* Node Dispatcher attributes */ 29 struct disp_attr { 30 u32 chnl_offset; /* Offset of channel ids reserved for RMS */ 31 /* Size of buffer for sending data to RMS */ 32 u32 chnl_buf_size; 33 int proc_family; /* eg, 5000 */ 34 int proc_type; /* eg, 5510 */ 35 void *reserved1; /* Reserved for future use. */ 36 u32 reserved2; /* Reserved for future use. */ 37 }; 38 39 40 /* 41 * ======== disp_create ======== 42 * Create a NODE Dispatcher object. This object handles the creation, 43 * deletion, and execution of nodes on the DSP target, through communication 44 * with the Resource Manager Server running on the target. Each NODE 45 * Manager object should have exactly one NODE Dispatcher. 46 * 47 * Parameters: 48 * dispatch_obj: Location to store node dispatcher object on output. 49 * hdev_obj: Device for this processor. 50 * disp_attrs: Node dispatcher attributes. 51 * Returns: 52 * 0: Success; 53 * -ENOMEM: Insufficient memory for requested resources. 54 * -EPERM: Unable to create dispatcher. 55 * Requires: 56 * disp_attrs != NULL. 57 * hdev_obj != NULL. 58 * dispatch_obj != NULL. 59 * Ensures: 60 * 0: IS_VALID(*dispatch_obj). 61 * error: *dispatch_obj == NULL. 62 */ 63 extern int disp_create(struct disp_object **dispatch_obj, 64 struct dev_object *hdev_obj, 65 const struct disp_attr *disp_attrs); 66 67 /* 68 * ======== disp_delete ======== 69 * Delete the NODE Dispatcher. 70 * 71 * Parameters: 72 * disp_obj: Node Dispatcher object. 73 * Returns: 74 * Requires: 75 * Valid disp_obj. 76 * Ensures: 77 * disp_obj is invalid. 78 */ 79 extern void disp_delete(struct disp_object *disp_obj); 80 81 /* 82 * ======== disp_node_change_priority ======== 83 * Change the priority of a node currently running on the target. 84 * 85 * Parameters: 86 * disp_obj: Node Dispatcher object. 87 * hnode: Node object representing a node currently 88 * allocated or running on the DSP. 89 * ulFxnAddress: Address of RMS function for changing priority. 90 * node_env: Address of node's environment structure. 91 * prio: New priority level to set node's priority to. 92 * Returns: 93 * 0: Success. 94 * -ETIME: A timeout occurred before the DSP responded. 95 * Requires: 96 * Valid disp_obj. 97 * hnode != NULL. 98 * Ensures: 99 */ 100 extern int disp_node_change_priority(struct disp_object 101 *disp_obj, 102 struct node_object *hnode, 103 u32 rms_fxn, 104 nodeenv node_env, s32 prio); 105 106 /* 107 * ======== disp_node_create ======== 108 * Create a node on the DSP by remotely calling the node's create function. 109 * 110 * Parameters: 111 * disp_obj: Node Dispatcher object. 112 * hnode: Node handle obtained from node_allocate(). 113 * ul_fxn_addr: Address or RMS create node function. 114 * ul_create_fxn: Address of node's create function. 115 * pargs: Arguments to pass to RMS node create function. 116 * node_env: Location to store node environment pointer on 117 * output. 118 * Returns: 119 * 0: Success. 120 * -ETIME: A timeout occurred before the DSP responded. 121 * -EPERM: A failure occurred, unable to create node. 122 * Requires: 123 * Valid disp_obj. 124 * pargs != NULL. 125 * hnode != NULL. 126 * node_env != NULL. 127 * node_get_type(hnode) != NODE_DEVICE. 128 * Ensures: 129 */ 130 extern int disp_node_create(struct disp_object *disp_obj, 131 struct node_object *hnode, 132 u32 rms_fxn, 133 u32 ul_create_fxn, 134 const struct node_createargs 135 *pargs, nodeenv *node_env); 136 137 /* 138 * ======== disp_node_delete ======== 139 * Delete a node on the DSP by remotely calling the node's delete function. 140 * 141 * Parameters: 142 * disp_obj: Node Dispatcher object. 143 * hnode: Node object representing a node currently 144 * loaded on the DSP. 145 * ul_fxn_addr: Address or RMS delete node function. 146 * ul_delete_fxn: Address of node's delete function. 147 * node_env: Address of node's environment structure. 148 * Returns: 149 * 0: Success. 150 * -ETIME: A timeout occurred before the DSP responded. 151 * Requires: 152 * Valid disp_obj. 153 * hnode != NULL. 154 * Ensures: 155 */ 156 extern int disp_node_delete(struct disp_object *disp_obj, 157 struct node_object *hnode, 158 u32 rms_fxn, 159 u32 ul_delete_fxn, nodeenv node_env); 160 161 /* 162 * ======== disp_node_run ======== 163 * Start execution of a node's execute phase, or resume execution of a node 164 * that has been suspended (via DISP_NodePause()) on the DSP. 165 * 166 * Parameters: 167 * disp_obj: Node Dispatcher object. 168 * hnode: Node object representing a node to be executed 169 * on the DSP. 170 * ul_fxn_addr: Address or RMS node execute function. 171 * ul_execute_fxn: Address of node's execute function. 172 * node_env: Address of node's environment structure. 173 * Returns: 174 * 0: Success. 175 * -ETIME: A timeout occurred before the DSP responded. 176 * Requires: 177 * Valid disp_obj. 178 * hnode != NULL. 179 * Ensures: 180 */ 181 extern int disp_node_run(struct disp_object *disp_obj, 182 struct node_object *hnode, 183 u32 rms_fxn, 184 u32 ul_execute_fxn, nodeenv node_env); 185 186 #endif /* DISP_ */ 187