1 1.1 jmcneill /** 2 1.1 jmcneill * Copyright (c) 2010-2012 Broadcom. All rights reserved. 3 1.1 jmcneill * 4 1.1 jmcneill * Redistribution and use in source and binary forms, with or without 5 1.1 jmcneill * modification, are permitted provided that the following conditions 6 1.1 jmcneill * are met: 7 1.1 jmcneill * 1. Redistributions of source code must retain the above copyright 8 1.1 jmcneill * notice, this list of conditions, and the following disclaimer, 9 1.1 jmcneill * without modification. 10 1.1 jmcneill * 2. Redistributions in binary form must reproduce the above copyright 11 1.1 jmcneill * notice, this list of conditions and the following disclaimer in the 12 1.1 jmcneill * documentation and/or other materials provided with the distribution. 13 1.1 jmcneill * 3. The names of the above-listed copyright holders may not be used 14 1.1 jmcneill * to endorse or promote products derived from this software without 15 1.1 jmcneill * specific prior written permission. 16 1.1 jmcneill * 17 1.1 jmcneill * ALTERNATIVELY, this software may be distributed under the terms of the 18 1.1 jmcneill * GNU General Public License ("GPL") version 2, as published by the Free 19 1.1 jmcneill * Software Foundation. 20 1.1 jmcneill * 21 1.1 jmcneill * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 22 1.1 jmcneill * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23 1.1 jmcneill * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 1.1 jmcneill * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 25 1.1 jmcneill * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26 1.1 jmcneill * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27 1.1 jmcneill * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28 1.1 jmcneill * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 1.1 jmcneill * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 1.1 jmcneill * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 1.1 jmcneill * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 1.1 jmcneill */ 33 1.1 jmcneill 34 1.1 jmcneill #ifndef CONNECTION_H_ 35 1.1 jmcneill #define CONNECTION_H_ 36 1.1 jmcneill 37 1.1 jmcneill #include "interface/vchi/vchi_cfg_internal.h" 38 1.1 jmcneill #include "interface/vchi/vchi_common.h" 39 1.1 jmcneill #include "interface/vchi/message_drivers/message.h" 40 1.1 jmcneill 41 1.1 jmcneill /****************************************************************************** 42 1.1 jmcneill Global defs 43 1.1 jmcneill *****************************************************************************/ 44 1.1 jmcneill 45 1.1 jmcneill // Opaque handle for a connection / service pair 46 1.1 jmcneill typedef struct opaque_vchi_connection_connected_service_handle_t *VCHI_CONNECTION_SERVICE_HANDLE_T; 47 1.1 jmcneill 48 1.1 jmcneill // opaque handle to the connection state information 49 1.1 jmcneill typedef struct opaque_vchi_connection_info_t VCHI_CONNECTION_STATE_T; 50 1.1 jmcneill 51 1.1 jmcneill typedef struct vchi_connection_t VCHI_CONNECTION_T; 52 1.1 jmcneill 53 1.1 jmcneill 54 1.1 jmcneill /****************************************************************************** 55 1.1 jmcneill API 56 1.1 jmcneill *****************************************************************************/ 57 1.1 jmcneill 58 1.1 jmcneill // Routine to init a connection with a particular low level driver 59 1.1 jmcneill typedef VCHI_CONNECTION_STATE_T * (*VCHI_CONNECTION_INIT_T)( struct vchi_connection_t * connection, 60 1.1 jmcneill const VCHI_MESSAGE_DRIVER_T * driver ); 61 1.1 jmcneill 62 1.1 jmcneill // Routine to control CRC enabling at a connection level 63 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_CRC_CONTROL_T)( VCHI_CONNECTION_STATE_T *state_handle, 64 1.1 jmcneill VCHI_CRC_CONTROL_T control ); 65 1.1 jmcneill 66 1.1 jmcneill // Routine to create a service 67 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_CONNECT_T)( VCHI_CONNECTION_STATE_T *state_handle, 68 1.1 jmcneill int32_t service_id, 69 1.1 jmcneill uint32_t rx_fifo_size, 70 1.1 jmcneill uint32_t tx_fifo_size, 71 1.1 jmcneill int server, 72 1.1 jmcneill VCHI_CALLBACK_T callback, 73 1.1 jmcneill void *callback_param, 74 1.1 jmcneill int32_t want_crc, 75 1.1 jmcneill int32_t want_unaligned_bulk_rx, 76 1.1 jmcneill int32_t want_unaligned_bulk_tx, 77 1.1 jmcneill VCHI_CONNECTION_SERVICE_HANDLE_T *service_handle ); 78 1.1 jmcneill 79 1.1 jmcneill // Routine to close a service 80 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_DISCONNECT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle ); 81 1.1 jmcneill 82 1.1 jmcneill // Routine to queue a message 83 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 84 1.1 jmcneill const void *data, 85 1.1 jmcneill uint32_t data_size, 86 1.1 jmcneill VCHI_FLAGS_T flags, 87 1.1 jmcneill void *msg_handle ); 88 1.1 jmcneill 89 1.1 jmcneill // scatter-gather (vector) message queueing 90 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 91 1.1 jmcneill VCHI_MSG_VECTOR_T *vector, 92 1.1 jmcneill uint32_t count, 93 1.1 jmcneill VCHI_FLAGS_T flags, 94 1.1 jmcneill void *msg_handle ); 95 1.1 jmcneill 96 1.1 jmcneill // Routine to dequeue a message 97 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 98 1.1 jmcneill void *data, 99 1.1 jmcneill uint32_t max_data_size_to_read, 100 1.1 jmcneill uint32_t *actual_msg_size, 101 1.1 jmcneill VCHI_FLAGS_T flags ); 102 1.1 jmcneill 103 1.1 jmcneill // Routine to peek at a message 104 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 105 1.1 jmcneill void **data, 106 1.1 jmcneill uint32_t *msg_size, 107 1.1 jmcneill VCHI_FLAGS_T flags ); 108 1.1 jmcneill 109 1.1 jmcneill // Routine to hold a message 110 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 111 1.1 jmcneill void **data, 112 1.1 jmcneill uint32_t *msg_size, 113 1.1 jmcneill VCHI_FLAGS_T flags, 114 1.1 jmcneill void **message_handle ); 115 1.1 jmcneill 116 1.1 jmcneill // Routine to initialise a received message iterator 117 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 118 1.1 jmcneill VCHI_MSG_ITER_T *iter, 119 1.1 jmcneill VCHI_FLAGS_T flags ); 120 1.1 jmcneill 121 1.1 jmcneill // Routine to release a held message 122 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_HELD_MSG_RELEASE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 123 1.1 jmcneill void *message_handle ); 124 1.1 jmcneill 125 1.1 jmcneill // Routine to get info on a held message 126 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_HELD_MSG_INFO_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 127 1.1 jmcneill void *message_handle, 128 1.1 jmcneill void **data, 129 1.1 jmcneill int32_t *msg_size, 130 1.1 jmcneill uint32_t *tx_timestamp, 131 1.1 jmcneill uint32_t *rx_timestamp ); 132 1.1 jmcneill 133 1.1 jmcneill // Routine to check whether the iterator has a next message 134 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service, 135 1.1 jmcneill const VCHI_MSG_ITER_T *iter ); 136 1.1 jmcneill 137 1.1 jmcneill // Routine to advance the iterator 138 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_MSG_ITER_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service, 139 1.1 jmcneill VCHI_MSG_ITER_T *iter, 140 1.1 jmcneill void **data, 141 1.1 jmcneill uint32_t *msg_size ); 142 1.1 jmcneill 143 1.1 jmcneill // Routine to remove the last message returned by the iterator 144 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_MSG_ITER_REMOVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service, 145 1.1 jmcneill VCHI_MSG_ITER_T *iter ); 146 1.1 jmcneill 147 1.1 jmcneill // Routine to hold the last message returned by the iterator 148 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HOLD_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service, 149 1.1 jmcneill VCHI_MSG_ITER_T *iter, 150 1.1 jmcneill void **msg_handle ); 151 1.1 jmcneill 152 1.1 jmcneill // Routine to transmit bulk data 153 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 154 1.1 jmcneill const void *data_src, 155 1.1 jmcneill uint32_t data_size, 156 1.1 jmcneill VCHI_FLAGS_T flags, 157 1.1 jmcneill void *bulk_handle ); 158 1.1 jmcneill 159 1.1 jmcneill // Routine to receive data 160 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, 161 1.1 jmcneill void *data_dst, 162 1.1 jmcneill uint32_t data_size, 163 1.1 jmcneill VCHI_FLAGS_T flags, 164 1.1 jmcneill void *bulk_handle ); 165 1.1 jmcneill 166 1.1 jmcneill // Routine to report if a server is available 167 1.1 jmcneill typedef int32_t (*VCHI_CONNECTION_SERVER_PRESENT)( VCHI_CONNECTION_STATE_T *state, int32_t service_id, int32_t peer_flags ); 168 1.1 jmcneill 169 1.1 jmcneill // Routine to report the number of RX slots available 170 1.1 jmcneill typedef int (*VCHI_CONNECTION_RX_SLOTS_AVAILABLE)( const VCHI_CONNECTION_STATE_T *state ); 171 1.1 jmcneill 172 1.1 jmcneill // Routine to report the RX slot size 173 1.1 jmcneill typedef uint32_t (*VCHI_CONNECTION_RX_SLOT_SIZE)( const VCHI_CONNECTION_STATE_T *state ); 174 1.1 jmcneill 175 1.1 jmcneill // Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO 176 1.1 jmcneill typedef void (*VCHI_CONNECTION_RX_BULK_BUFFER_ADDED)(VCHI_CONNECTION_STATE_T *state, 177 1.1 jmcneill int32_t service, 178 1.1 jmcneill uint32_t length, 179 1.1 jmcneill MESSAGE_TX_CHANNEL_T channel, 180 1.1 jmcneill uint32_t channel_params, 181 1.1 jmcneill uint32_t data_length, 182 1.1 jmcneill uint32_t data_offset); 183 1.1 jmcneill 184 1.1 jmcneill // Callback to inform a service that a Xon or Xoff message has been received 185 1.1 jmcneill typedef void (*VCHI_CONNECTION_FLOW_CONTROL)(VCHI_CONNECTION_STATE_T *state, int32_t service_id, int32_t xoff); 186 1.1 jmcneill 187 1.1 jmcneill // Callback to inform a service that a server available reply message has been received 188 1.1 jmcneill typedef void (*VCHI_CONNECTION_SERVER_AVAILABLE_REPLY)(VCHI_CONNECTION_STATE_T *state, int32_t service_id, uint32_t flags); 189 1.1 jmcneill 190 1.1 jmcneill // Callback to indicate that bulk auxiliary messages have arrived 191 1.1 jmcneill typedef void (*VCHI_CONNECTION_BULK_AUX_RECEIVED)(VCHI_CONNECTION_STATE_T *state); 192 1.1 jmcneill 193 1.1 jmcneill // Callback to indicate that bulk auxiliary messages have arrived 194 1.1 jmcneill typedef void (*VCHI_CONNECTION_BULK_AUX_TRANSMITTED)(VCHI_CONNECTION_STATE_T *state, void *handle); 195 1.1 jmcneill 196 1.1 jmcneill // Callback with all the connection info you require 197 1.1 jmcneill typedef void (*VCHI_CONNECTION_INFO)(VCHI_CONNECTION_STATE_T *state, uint32_t protocol_version, uint32_t slot_size, uint32_t num_slots, uint32_t min_bulk_size); 198 1.1 jmcneill 199 1.1 jmcneill // Callback to inform of a disconnect 200 1.1 jmcneill typedef void (*VCHI_CONNECTION_DISCONNECT)(VCHI_CONNECTION_STATE_T *state, uint32_t flags); 201 1.1 jmcneill 202 1.1 jmcneill // Callback to inform of a power control request 203 1.1 jmcneill typedef void (*VCHI_CONNECTION_POWER_CONTROL)(VCHI_CONNECTION_STATE_T *state, MESSAGE_TX_CHANNEL_T channel, int32_t enable); 204 1.1 jmcneill 205 1.1 jmcneill // allocate memory suitably aligned for this connection 206 1.1 jmcneill typedef void * (*VCHI_BUFFER_ALLOCATE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, uint32_t * length); 207 1.1 jmcneill 208 1.1 jmcneill // free memory allocated by buffer_allocate 209 1.1 jmcneill typedef void (*VCHI_BUFFER_FREE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, void * address); 210 1.1 jmcneill 211 1.1 jmcneill 212 1.1 jmcneill /****************************************************************************** 213 1.1 jmcneill System driver struct 214 1.1 jmcneill *****************************************************************************/ 215 1.1 jmcneill 216 1.1 jmcneill struct opaque_vchi_connection_api_t 217 1.1 jmcneill { 218 1.1 jmcneill // Routine to init the connection 219 1.1 jmcneill VCHI_CONNECTION_INIT_T init; 220 1.1 jmcneill 221 1.1 jmcneill // Connection-level CRC control 222 1.1 jmcneill VCHI_CONNECTION_CRC_CONTROL_T crc_control; 223 1.1 jmcneill 224 1.1 jmcneill // Routine to connect to or create service 225 1.1 jmcneill VCHI_CONNECTION_SERVICE_CONNECT_T service_connect; 226 1.1 jmcneill 227 1.1 jmcneill // Routine to disconnect from a service 228 1.1 jmcneill VCHI_CONNECTION_SERVICE_DISCONNECT_T service_disconnect; 229 1.1 jmcneill 230 1.1 jmcneill // Routine to queue a message 231 1.1 jmcneill VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T service_queue_msg; 232 1.1 jmcneill 233 1.1 jmcneill // scatter-gather (vector) message queue 234 1.1 jmcneill VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T service_queue_msgv; 235 1.1 jmcneill 236 1.1 jmcneill // Routine to dequeue a message 237 1.1 jmcneill VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T service_dequeue_msg; 238 1.1 jmcneill 239 1.1 jmcneill // Routine to peek at a message 240 1.1 jmcneill VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T service_peek_msg; 241 1.1 jmcneill 242 1.1 jmcneill // Routine to hold a message 243 1.1 jmcneill VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T service_hold_msg; 244 1.1 jmcneill 245 1.1 jmcneill // Routine to initialise a received message iterator 246 1.1 jmcneill VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T service_look_ahead_msg; 247 1.1 jmcneill 248 1.1 jmcneill // Routine to release a message 249 1.1 jmcneill VCHI_CONNECTION_HELD_MSG_RELEASE_T held_msg_release; 250 1.1 jmcneill 251 1.1 jmcneill // Routine to get information on a held message 252 1.1 jmcneill VCHI_CONNECTION_HELD_MSG_INFO_T held_msg_info; 253 1.1 jmcneill 254 1.1 jmcneill // Routine to check for next message on iterator 255 1.1 jmcneill VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T msg_iter_has_next; 256 1.1 jmcneill 257 1.1 jmcneill // Routine to get next message on iterator 258 1.1 jmcneill VCHI_CONNECTION_MSG_ITER_NEXT_T msg_iter_next; 259 1.1 jmcneill 260 1.1 jmcneill // Routine to remove the last message returned by iterator 261 1.1 jmcneill VCHI_CONNECTION_MSG_ITER_REMOVE_T msg_iter_remove; 262 1.1 jmcneill 263 1.1 jmcneill // Routine to hold the last message returned by iterator 264 1.1 jmcneill VCHI_CONNECTION_MSG_ITER_HOLD_T msg_iter_hold; 265 1.1 jmcneill 266 1.1 jmcneill // Routine to transmit bulk data 267 1.1 jmcneill VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T bulk_queue_transmit; 268 1.1 jmcneill 269 1.1 jmcneill // Routine to receive data 270 1.1 jmcneill VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T bulk_queue_receive; 271 1.1 jmcneill 272 1.1 jmcneill // Routine to report the available servers 273 1.1 jmcneill VCHI_CONNECTION_SERVER_PRESENT server_present; 274 1.1 jmcneill 275 1.1 jmcneill // Routine to report the number of RX slots available 276 1.1 jmcneill VCHI_CONNECTION_RX_SLOTS_AVAILABLE connection_rx_slots_available; 277 1.1 jmcneill 278 1.1 jmcneill // Routine to report the RX slot size 279 1.1 jmcneill VCHI_CONNECTION_RX_SLOT_SIZE connection_rx_slot_size; 280 1.1 jmcneill 281 1.1 jmcneill // Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO 282 1.1 jmcneill VCHI_CONNECTION_RX_BULK_BUFFER_ADDED rx_bulk_buffer_added; 283 1.1 jmcneill 284 1.1 jmcneill // Callback to inform a service that a Xon or Xoff message has been received 285 1.1 jmcneill VCHI_CONNECTION_FLOW_CONTROL flow_control; 286 1.1 jmcneill 287 1.1 jmcneill // Callback to inform a service that a server available reply message has been received 288 1.1 jmcneill VCHI_CONNECTION_SERVER_AVAILABLE_REPLY server_available_reply; 289 1.1 jmcneill 290 1.1 jmcneill // Callback to indicate that bulk auxiliary messages have arrived 291 1.1 jmcneill VCHI_CONNECTION_BULK_AUX_RECEIVED bulk_aux_received; 292 1.1 jmcneill 293 1.1 jmcneill // Callback to indicate that a bulk auxiliary message has been transmitted 294 1.1 jmcneill VCHI_CONNECTION_BULK_AUX_TRANSMITTED bulk_aux_transmitted; 295 1.1 jmcneill 296 1.1 jmcneill // Callback to provide information about the connection 297 1.1 jmcneill VCHI_CONNECTION_INFO connection_info; 298 1.1 jmcneill 299 1.1 jmcneill // Callback to notify that peer has requested disconnect 300 1.1 jmcneill VCHI_CONNECTION_DISCONNECT disconnect; 301 1.1 jmcneill 302 1.1 jmcneill // Callback to notify that peer has requested power change 303 1.1 jmcneill VCHI_CONNECTION_POWER_CONTROL power_control; 304 1.1 jmcneill 305 1.1 jmcneill // allocate memory suitably aligned for this connection 306 1.1 jmcneill VCHI_BUFFER_ALLOCATE buffer_allocate; 307 1.1 jmcneill 308 1.1 jmcneill // free memory allocated by buffer_allocate 309 1.1 jmcneill VCHI_BUFFER_FREE buffer_free; 310 1.1 jmcneill 311 1.1 jmcneill }; 312 1.1 jmcneill 313 1.1 jmcneill struct vchi_connection_t { 314 1.1 jmcneill const VCHI_CONNECTION_API_T *api; 315 1.1 jmcneill VCHI_CONNECTION_STATE_T *state; 316 1.1 jmcneill #ifdef VCHI_COARSE_LOCKING 317 1.1 jmcneill struct semaphore sem; 318 1.1 jmcneill #endif 319 1.1 jmcneill }; 320 1.1 jmcneill 321 1.1 jmcneill 322 1.1 jmcneill #endif /* CONNECTION_H_ */ 323 1.1 jmcneill 324 1.1 jmcneill /****************************** End of file **********************************/ 325