1262f27b2SOleksandr Tymoshenko /** 2262f27b2SOleksandr Tymoshenko * Copyright (c) 2010-2012 Broadcom. All rights reserved. 3262f27b2SOleksandr Tymoshenko * 4262f27b2SOleksandr Tymoshenko * Redistribution and use in source and binary forms, with or without 5262f27b2SOleksandr Tymoshenko * modification, are permitted provided that the following conditions 6262f27b2SOleksandr Tymoshenko * are met: 7262f27b2SOleksandr Tymoshenko * 1. Redistributions of source code must retain the above copyright 8262f27b2SOleksandr Tymoshenko * notice, this list of conditions, and the following disclaimer, 9262f27b2SOleksandr Tymoshenko * without modification. 10262f27b2SOleksandr Tymoshenko * 2. Redistributions in binary form must reproduce the above copyright 11262f27b2SOleksandr Tymoshenko * notice, this list of conditions and the following disclaimer in the 12262f27b2SOleksandr Tymoshenko * documentation and/or other materials provided with the distribution. 13262f27b2SOleksandr Tymoshenko * 3. The names of the above-listed copyright holders may not be used 14262f27b2SOleksandr Tymoshenko * to endorse or promote products derived from this software without 15262f27b2SOleksandr Tymoshenko * specific prior written permission. 16262f27b2SOleksandr Tymoshenko * 17262f27b2SOleksandr Tymoshenko * ALTERNATIVELY, this software may be distributed under the terms of the 18262f27b2SOleksandr Tymoshenko * GNU General Public License ("GPL") version 2, as published by the Free 19262f27b2SOleksandr Tymoshenko * Software Foundation. 20262f27b2SOleksandr Tymoshenko * 21262f27b2SOleksandr Tymoshenko * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 22262f27b2SOleksandr Tymoshenko * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23262f27b2SOleksandr Tymoshenko * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24262f27b2SOleksandr Tymoshenko * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 25262f27b2SOleksandr Tymoshenko * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26262f27b2SOleksandr Tymoshenko * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27262f27b2SOleksandr Tymoshenko * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28262f27b2SOleksandr Tymoshenko * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29262f27b2SOleksandr Tymoshenko * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30262f27b2SOleksandr Tymoshenko * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31262f27b2SOleksandr Tymoshenko * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32262f27b2SOleksandr Tymoshenko */ 33262f27b2SOleksandr Tymoshenko 34262f27b2SOleksandr Tymoshenko #ifndef VCHI_H_ 35262f27b2SOleksandr Tymoshenko #define VCHI_H_ 36262f27b2SOleksandr Tymoshenko 37262f27b2SOleksandr Tymoshenko #include "interface/vchi/vchi_cfg.h" 38262f27b2SOleksandr Tymoshenko #include "interface/vchi/vchi_common.h" 39262f27b2SOleksandr Tymoshenko #include "interface/vchi/connections/connection.h" 40262f27b2SOleksandr Tymoshenko #include "vchi_mh.h" 41262f27b2SOleksandr Tymoshenko 42262f27b2SOleksandr Tymoshenko 43262f27b2SOleksandr Tymoshenko /****************************************************************************** 44262f27b2SOleksandr Tymoshenko Global defs 45262f27b2SOleksandr Tymoshenko *****************************************************************************/ 46262f27b2SOleksandr Tymoshenko 47262f27b2SOleksandr Tymoshenko #define VCHI_BULK_ROUND_UP(x) ((((unsigned long)(x))+VCHI_BULK_ALIGN-1) & ~(VCHI_BULK_ALIGN-1)) 48262f27b2SOleksandr Tymoshenko #define VCHI_BULK_ROUND_DOWN(x) (((unsigned long)(x)) & ~(VCHI_BULK_ALIGN-1)) 49262f27b2SOleksandr Tymoshenko #define VCHI_BULK_ALIGN_NBYTES(x) (VCHI_BULK_ALIGNED(x) ? 0 : (VCHI_BULK_ALIGN - ((unsigned long)(x) & (VCHI_BULK_ALIGN-1)))) 50262f27b2SOleksandr Tymoshenko 51262f27b2SOleksandr Tymoshenko #ifdef USE_VCHIQ_ARM 52262f27b2SOleksandr Tymoshenko #define VCHI_BULK_ALIGNED(x) 1 53262f27b2SOleksandr Tymoshenko #else 54262f27b2SOleksandr Tymoshenko #define VCHI_BULK_ALIGNED(x) (((unsigned long)(x) & (VCHI_BULK_ALIGN-1)) == 0) 55262f27b2SOleksandr Tymoshenko #endif 56262f27b2SOleksandr Tymoshenko 57262f27b2SOleksandr Tymoshenko struct vchi_version { 58262f27b2SOleksandr Tymoshenko uint32_t version; 59262f27b2SOleksandr Tymoshenko uint32_t version_min; 60262f27b2SOleksandr Tymoshenko }; 61262f27b2SOleksandr Tymoshenko #define VCHI_VERSION(v_) { v_, v_ } 62262f27b2SOleksandr Tymoshenko #define VCHI_VERSION_EX(v_, m_) { v_, m_ } 63262f27b2SOleksandr Tymoshenko 64262f27b2SOleksandr Tymoshenko typedef enum 65262f27b2SOleksandr Tymoshenko { 66262f27b2SOleksandr Tymoshenko VCHI_VEC_POINTER, 67262f27b2SOleksandr Tymoshenko VCHI_VEC_HANDLE, 68262f27b2SOleksandr Tymoshenko VCHI_VEC_LIST 69262f27b2SOleksandr Tymoshenko } VCHI_MSG_VECTOR_TYPE_T; 70262f27b2SOleksandr Tymoshenko 71262f27b2SOleksandr Tymoshenko typedef struct vchi_msg_vector_ex { 72262f27b2SOleksandr Tymoshenko 73262f27b2SOleksandr Tymoshenko VCHI_MSG_VECTOR_TYPE_T type; 74262f27b2SOleksandr Tymoshenko union 75262f27b2SOleksandr Tymoshenko { 76262f27b2SOleksandr Tymoshenko // a memory handle 77262f27b2SOleksandr Tymoshenko struct 78262f27b2SOleksandr Tymoshenko { 79262f27b2SOleksandr Tymoshenko VCHI_MEM_HANDLE_T handle; 80262f27b2SOleksandr Tymoshenko uint32_t offset; 81262f27b2SOleksandr Tymoshenko int32_t vec_len; 82262f27b2SOleksandr Tymoshenko } handle; 83262f27b2SOleksandr Tymoshenko 84262f27b2SOleksandr Tymoshenko // an ordinary data pointer 85262f27b2SOleksandr Tymoshenko struct 86262f27b2SOleksandr Tymoshenko { 87262f27b2SOleksandr Tymoshenko const void *vec_base; 88262f27b2SOleksandr Tymoshenko int32_t vec_len; 89262f27b2SOleksandr Tymoshenko } ptr; 90262f27b2SOleksandr Tymoshenko 91262f27b2SOleksandr Tymoshenko // a nested vector list 92262f27b2SOleksandr Tymoshenko struct 93262f27b2SOleksandr Tymoshenko { 94262f27b2SOleksandr Tymoshenko struct vchi_msg_vector_ex *vec; 95262f27b2SOleksandr Tymoshenko uint32_t vec_len; 96262f27b2SOleksandr Tymoshenko } list; 97262f27b2SOleksandr Tymoshenko } u; 98262f27b2SOleksandr Tymoshenko } VCHI_MSG_VECTOR_EX_T; 99262f27b2SOleksandr Tymoshenko 100262f27b2SOleksandr Tymoshenko 101262f27b2SOleksandr Tymoshenko // Construct an entry in a msg vector for a pointer (p) of length (l) 102262f27b2SOleksandr Tymoshenko #define VCHI_VEC_POINTER(p,l) VCHI_VEC_POINTER, { { (VCHI_MEM_HANDLE_T)(p), (l) } } 103262f27b2SOleksandr Tymoshenko 104262f27b2SOleksandr Tymoshenko // Construct an entry in a msg vector for a message handle (h), starting at offset (o) of length (l) 105262f27b2SOleksandr Tymoshenko #define VCHI_VEC_HANDLE(h,o,l) VCHI_VEC_HANDLE, { { (h), (o), (l) } } 106262f27b2SOleksandr Tymoshenko 107262f27b2SOleksandr Tymoshenko // Macros to manipulate 'FOURCC' values 108262f27b2SOleksandr Tymoshenko #define MAKE_FOURCC(x) ((int32_t)( (x[0] << 24) | (x[1] << 16) | (x[2] << 8) | x[3] )) 109262f27b2SOleksandr Tymoshenko #define FOURCC_TO_CHAR(x) (x >> 24) & 0xFF,(x >> 16) & 0xFF,(x >> 8) & 0xFF, x & 0xFF 110262f27b2SOleksandr Tymoshenko 111262f27b2SOleksandr Tymoshenko 112262f27b2SOleksandr Tymoshenko // Opaque service information 113262f27b2SOleksandr Tymoshenko struct opaque_vchi_service_t; 114262f27b2SOleksandr Tymoshenko 115262f27b2SOleksandr Tymoshenko // Descriptor for a held message. Allocated by client, initialised by vchi_msg_hold, 116262f27b2SOleksandr Tymoshenko // vchi_msg_iter_hold or vchi_msg_iter_hold_next. Fields are for internal VCHI use only. 117262f27b2SOleksandr Tymoshenko typedef struct 118262f27b2SOleksandr Tymoshenko { 119262f27b2SOleksandr Tymoshenko struct opaque_vchi_service_t *service; 120262f27b2SOleksandr Tymoshenko void *message; 121262f27b2SOleksandr Tymoshenko } VCHI_HELD_MSG_T; 122262f27b2SOleksandr Tymoshenko 123262f27b2SOleksandr Tymoshenko 124262f27b2SOleksandr Tymoshenko 125262f27b2SOleksandr Tymoshenko // structure used to provide the information needed to open a server or a client 126262f27b2SOleksandr Tymoshenko typedef struct { 127262f27b2SOleksandr Tymoshenko struct vchi_version version; 128262f27b2SOleksandr Tymoshenko int32_t service_id; 129262f27b2SOleksandr Tymoshenko VCHI_CONNECTION_T *connection; 130262f27b2SOleksandr Tymoshenko uint32_t rx_fifo_size; 131262f27b2SOleksandr Tymoshenko uint32_t tx_fifo_size; 132262f27b2SOleksandr Tymoshenko VCHI_CALLBACK_T callback; 133262f27b2SOleksandr Tymoshenko void *callback_param; 134262f27b2SOleksandr Tymoshenko /* client intends to receive bulk transfers of 135262f27b2SOleksandr Tymoshenko odd lengths or into unaligned buffers */ 136262f27b2SOleksandr Tymoshenko int32_t want_unaligned_bulk_rx; 137262f27b2SOleksandr Tymoshenko /* client intends to transmit bulk transfers of 138262f27b2SOleksandr Tymoshenko odd lengths or out of unaligned buffers */ 139262f27b2SOleksandr Tymoshenko int32_t want_unaligned_bulk_tx; 140262f27b2SOleksandr Tymoshenko /* client wants to check CRCs on (bulk) xfers. 141262f27b2SOleksandr Tymoshenko Only needs to be set at 1 end - will do both directions. */ 142262f27b2SOleksandr Tymoshenko int32_t want_crc; 143262f27b2SOleksandr Tymoshenko } SERVICE_CREATION_T; 144262f27b2SOleksandr Tymoshenko 145262f27b2SOleksandr Tymoshenko // Opaque handle for a VCHI instance 146262f27b2SOleksandr Tymoshenko typedef struct opaque_vchi_instance_handle_t *VCHI_INSTANCE_T; 147262f27b2SOleksandr Tymoshenko 148262f27b2SOleksandr Tymoshenko // Opaque handle for a server or client 149262f27b2SOleksandr Tymoshenko typedef struct opaque_vchi_service_handle_t *VCHI_SERVICE_HANDLE_T; 150262f27b2SOleksandr Tymoshenko 151262f27b2SOleksandr Tymoshenko // Service registration & startup 152262f27b2SOleksandr Tymoshenko typedef void (*VCHI_SERVICE_INIT)(VCHI_INSTANCE_T initialise_instance, VCHI_CONNECTION_T **connections, uint32_t num_connections); 153262f27b2SOleksandr Tymoshenko 154262f27b2SOleksandr Tymoshenko typedef struct service_info_tag { 155262f27b2SOleksandr Tymoshenko const char * const vll_filename; /* VLL to load to start this service. This is an empty string if VLL is "static" */ 156262f27b2SOleksandr Tymoshenko VCHI_SERVICE_INIT init; /* Service initialisation function */ 157262f27b2SOleksandr Tymoshenko void *vll_handle; /* VLL handle; NULL when unloaded or a "static VLL" in build */ 158262f27b2SOleksandr Tymoshenko } SERVICE_INFO_T; 159262f27b2SOleksandr Tymoshenko 160262f27b2SOleksandr Tymoshenko /****************************************************************************** 161262f27b2SOleksandr Tymoshenko Global funcs - implementation is specific to which side you are on (local / remote) 162262f27b2SOleksandr Tymoshenko *****************************************************************************/ 163262f27b2SOleksandr Tymoshenko 164262f27b2SOleksandr Tymoshenko #ifdef __cplusplus 165262f27b2SOleksandr Tymoshenko extern "C" { 166262f27b2SOleksandr Tymoshenko #endif 167262f27b2SOleksandr Tymoshenko 168262f27b2SOleksandr Tymoshenko extern /*@observer@*/ VCHI_CONNECTION_T * vchi_create_connection( const VCHI_CONNECTION_API_T * function_table, 169262f27b2SOleksandr Tymoshenko const VCHI_MESSAGE_DRIVER_T * low_level); 170262f27b2SOleksandr Tymoshenko 171262f27b2SOleksandr Tymoshenko 172262f27b2SOleksandr Tymoshenko // Routine used to initialise the vchi on both local + remote connections 173262f27b2SOleksandr Tymoshenko extern int32_t vchi_initialise( VCHI_INSTANCE_T *instance_handle ); 174262f27b2SOleksandr Tymoshenko 175262f27b2SOleksandr Tymoshenko extern int32_t vchi_exit( void ); 176262f27b2SOleksandr Tymoshenko 177262f27b2SOleksandr Tymoshenko extern int32_t vchi_connect( VCHI_CONNECTION_T **connections, 178262f27b2SOleksandr Tymoshenko const uint32_t num_connections, 179262f27b2SOleksandr Tymoshenko VCHI_INSTANCE_T instance_handle ); 180262f27b2SOleksandr Tymoshenko 181262f27b2SOleksandr Tymoshenko //When this is called, ensure that all services have no data pending. 182262f27b2SOleksandr Tymoshenko //Bulk transfers can remain 'queued' 183262f27b2SOleksandr Tymoshenko extern int32_t vchi_disconnect( VCHI_INSTANCE_T instance_handle ); 184262f27b2SOleksandr Tymoshenko 185262f27b2SOleksandr Tymoshenko // Global control over bulk CRC checking 186262f27b2SOleksandr Tymoshenko extern int32_t vchi_crc_control( VCHI_CONNECTION_T *connection, 187262f27b2SOleksandr Tymoshenko VCHI_CRC_CONTROL_T control ); 188262f27b2SOleksandr Tymoshenko 189262f27b2SOleksandr Tymoshenko // helper functions 190262f27b2SOleksandr Tymoshenko extern void * vchi_allocate_buffer(VCHI_SERVICE_HANDLE_T handle, uint32_t *length); 191262f27b2SOleksandr Tymoshenko extern void vchi_free_buffer(VCHI_SERVICE_HANDLE_T handle, void *address); 192262f27b2SOleksandr Tymoshenko extern uint32_t vchi_current_time(VCHI_INSTANCE_T instance_handle); 193262f27b2SOleksandr Tymoshenko 194262f27b2SOleksandr Tymoshenko 195262f27b2SOleksandr Tymoshenko /****************************************************************************** 196262f27b2SOleksandr Tymoshenko Global service API 197262f27b2SOleksandr Tymoshenko *****************************************************************************/ 198262f27b2SOleksandr Tymoshenko // Routine to create a named service 199262f27b2SOleksandr Tymoshenko extern int32_t vchi_service_create( VCHI_INSTANCE_T instance_handle, 200262f27b2SOleksandr Tymoshenko SERVICE_CREATION_T *setup, 201262f27b2SOleksandr Tymoshenko VCHI_SERVICE_HANDLE_T *handle ); 202262f27b2SOleksandr Tymoshenko 203262f27b2SOleksandr Tymoshenko // Routine to destory a service 204262f27b2SOleksandr Tymoshenko extern int32_t vchi_service_destroy( const VCHI_SERVICE_HANDLE_T handle ); 205262f27b2SOleksandr Tymoshenko 206262f27b2SOleksandr Tymoshenko // Routine to open a named service 207262f27b2SOleksandr Tymoshenko extern int32_t vchi_service_open( VCHI_INSTANCE_T instance_handle, 208262f27b2SOleksandr Tymoshenko SERVICE_CREATION_T *setup, 209262f27b2SOleksandr Tymoshenko VCHI_SERVICE_HANDLE_T *handle); 210262f27b2SOleksandr Tymoshenko 211262f27b2SOleksandr Tymoshenko extern int32_t vchi_get_peer_version( const VCHI_SERVICE_HANDLE_T handle, 212262f27b2SOleksandr Tymoshenko short *peer_version ); 213262f27b2SOleksandr Tymoshenko 214262f27b2SOleksandr Tymoshenko // Routine to close a named service 215262f27b2SOleksandr Tymoshenko extern int32_t vchi_service_close( const VCHI_SERVICE_HANDLE_T handle ); 216262f27b2SOleksandr Tymoshenko 217262f27b2SOleksandr Tymoshenko // Routine to increment ref count on a named service 218262f27b2SOleksandr Tymoshenko extern int32_t vchi_service_use( const VCHI_SERVICE_HANDLE_T handle ); 219262f27b2SOleksandr Tymoshenko 220262f27b2SOleksandr Tymoshenko // Routine to decrement ref count on a named service 221262f27b2SOleksandr Tymoshenko extern int32_t vchi_service_release( const VCHI_SERVICE_HANDLE_T handle ); 222262f27b2SOleksandr Tymoshenko 223*a0b87461SOleksandr Tymoshenko // Routine to set a control option for a named service 224*a0b87461SOleksandr Tymoshenko extern int32_t vchi_service_set_option( const VCHI_SERVICE_HANDLE_T handle, 225*a0b87461SOleksandr Tymoshenko VCHI_SERVICE_OPTION_T option, 226*a0b87461SOleksandr Tymoshenko int value); 227*a0b87461SOleksandr Tymoshenko 228*a0b87461SOleksandr Tymoshenko // Routine to send a message across a service 229262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_queue( VCHI_SERVICE_HANDLE_T handle, 230262f27b2SOleksandr Tymoshenko const void *data, 231262f27b2SOleksandr Tymoshenko uint32_t data_size, 232262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 233262f27b2SOleksandr Tymoshenko void *msg_handle ); 234262f27b2SOleksandr Tymoshenko 235262f27b2SOleksandr Tymoshenko // scatter-gather (vector) and send message 236262f27b2SOleksandr Tymoshenko int32_t vchi_msg_queuev_ex( VCHI_SERVICE_HANDLE_T handle, 237262f27b2SOleksandr Tymoshenko VCHI_MSG_VECTOR_EX_T *vector, 238262f27b2SOleksandr Tymoshenko uint32_t count, 239262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 240262f27b2SOleksandr Tymoshenko void *msg_handle ); 241262f27b2SOleksandr Tymoshenko 242262f27b2SOleksandr Tymoshenko // legacy scatter-gather (vector) and send message, only handles pointers 243262f27b2SOleksandr Tymoshenko int32_t vchi_msg_queuev( VCHI_SERVICE_HANDLE_T handle, 244262f27b2SOleksandr Tymoshenko VCHI_MSG_VECTOR_T *vector, 245262f27b2SOleksandr Tymoshenko uint32_t count, 246262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 247262f27b2SOleksandr Tymoshenko void *msg_handle ); 248262f27b2SOleksandr Tymoshenko 249262f27b2SOleksandr Tymoshenko // Routine to receive a msg from a service 250262f27b2SOleksandr Tymoshenko // Dequeue is equivalent to hold, copy into client buffer, release 251262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_dequeue( VCHI_SERVICE_HANDLE_T handle, 252262f27b2SOleksandr Tymoshenko void *data, 253262f27b2SOleksandr Tymoshenko uint32_t max_data_size_to_read, 254262f27b2SOleksandr Tymoshenko uint32_t *actual_msg_size, 255262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags ); 256262f27b2SOleksandr Tymoshenko 257262f27b2SOleksandr Tymoshenko // Routine to look at a message in place. 258262f27b2SOleksandr Tymoshenko // The message is not dequeued, so a subsequent call to peek or dequeue 259262f27b2SOleksandr Tymoshenko // will return the same message. 260262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_peek( VCHI_SERVICE_HANDLE_T handle, 261262f27b2SOleksandr Tymoshenko void **data, 262262f27b2SOleksandr Tymoshenko uint32_t *msg_size, 263262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags ); 264262f27b2SOleksandr Tymoshenko 265262f27b2SOleksandr Tymoshenko // Routine to remove a message after it has been read in place with peek 266262f27b2SOleksandr Tymoshenko // The first message on the queue is dequeued. 267262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_remove( VCHI_SERVICE_HANDLE_T handle ); 268262f27b2SOleksandr Tymoshenko 269262f27b2SOleksandr Tymoshenko // Routine to look at a message in place. 270262f27b2SOleksandr Tymoshenko // The message is dequeued, so the caller is left holding it; the descriptor is 271262f27b2SOleksandr Tymoshenko // filled in and must be released when the user has finished with the message. 272262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_hold( VCHI_SERVICE_HANDLE_T handle, 273262f27b2SOleksandr Tymoshenko void **data, // } may be NULL, as info can be 274262f27b2SOleksandr Tymoshenko uint32_t *msg_size, // } obtained from HELD_MSG_T 275262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 276262f27b2SOleksandr Tymoshenko VCHI_HELD_MSG_T *message_descriptor ); 277262f27b2SOleksandr Tymoshenko 278262f27b2SOleksandr Tymoshenko // Initialise an iterator to look through messages in place 279262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_look_ahead( VCHI_SERVICE_HANDLE_T handle, 280262f27b2SOleksandr Tymoshenko VCHI_MSG_ITER_T *iter, 281262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags ); 282262f27b2SOleksandr Tymoshenko 283262f27b2SOleksandr Tymoshenko /****************************************************************************** 284262f27b2SOleksandr Tymoshenko Global service support API - operations on held messages and message iterators 285262f27b2SOleksandr Tymoshenko *****************************************************************************/ 286262f27b2SOleksandr Tymoshenko 287262f27b2SOleksandr Tymoshenko // Routine to get the address of a held message 288262f27b2SOleksandr Tymoshenko extern void *vchi_held_msg_ptr( const VCHI_HELD_MSG_T *message ); 289262f27b2SOleksandr Tymoshenko 290262f27b2SOleksandr Tymoshenko // Routine to get the size of a held message 291262f27b2SOleksandr Tymoshenko extern int32_t vchi_held_msg_size( const VCHI_HELD_MSG_T *message ); 292262f27b2SOleksandr Tymoshenko 293262f27b2SOleksandr Tymoshenko // Routine to get the transmit timestamp as written into the header by the peer 294262f27b2SOleksandr Tymoshenko extern uint32_t vchi_held_msg_tx_timestamp( const VCHI_HELD_MSG_T *message ); 295262f27b2SOleksandr Tymoshenko 296262f27b2SOleksandr Tymoshenko // Routine to get the reception timestamp, written as we parsed the header 297262f27b2SOleksandr Tymoshenko extern uint32_t vchi_held_msg_rx_timestamp( const VCHI_HELD_MSG_T *message ); 298262f27b2SOleksandr Tymoshenko 299262f27b2SOleksandr Tymoshenko // Routine to release a held message after it has been processed 300262f27b2SOleksandr Tymoshenko extern int32_t vchi_held_msg_release( VCHI_HELD_MSG_T *message ); 301262f27b2SOleksandr Tymoshenko 302262f27b2SOleksandr Tymoshenko // Indicates whether the iterator has a next message. 303262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_iter_has_next( const VCHI_MSG_ITER_T *iter ); 304262f27b2SOleksandr Tymoshenko 305262f27b2SOleksandr Tymoshenko // Return the pointer and length for the next message and advance the iterator. 306262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_iter_next( VCHI_MSG_ITER_T *iter, 307262f27b2SOleksandr Tymoshenko void **data, 308262f27b2SOleksandr Tymoshenko uint32_t *msg_size ); 309262f27b2SOleksandr Tymoshenko 310262f27b2SOleksandr Tymoshenko // Remove the last message returned by vchi_msg_iter_next. 311262f27b2SOleksandr Tymoshenko // Can only be called once after each call to vchi_msg_iter_next. 312262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_iter_remove( VCHI_MSG_ITER_T *iter ); 313262f27b2SOleksandr Tymoshenko 314262f27b2SOleksandr Tymoshenko // Hold the last message returned by vchi_msg_iter_next. 315262f27b2SOleksandr Tymoshenko // Can only be called once after each call to vchi_msg_iter_next. 316262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_iter_hold( VCHI_MSG_ITER_T *iter, 317262f27b2SOleksandr Tymoshenko VCHI_HELD_MSG_T *message ); 318262f27b2SOleksandr Tymoshenko 319262f27b2SOleksandr Tymoshenko // Return information for the next message, and hold it, advancing the iterator. 320262f27b2SOleksandr Tymoshenko extern int32_t vchi_msg_iter_hold_next( VCHI_MSG_ITER_T *iter, 321262f27b2SOleksandr Tymoshenko void **data, // } may be NULL 322262f27b2SOleksandr Tymoshenko uint32_t *msg_size, // } 323262f27b2SOleksandr Tymoshenko VCHI_HELD_MSG_T *message ); 324262f27b2SOleksandr Tymoshenko 325262f27b2SOleksandr Tymoshenko 326262f27b2SOleksandr Tymoshenko /****************************************************************************** 327262f27b2SOleksandr Tymoshenko Global bulk API 328262f27b2SOleksandr Tymoshenko *****************************************************************************/ 329262f27b2SOleksandr Tymoshenko 330262f27b2SOleksandr Tymoshenko // Routine to prepare interface for a transfer from the other side 331262f27b2SOleksandr Tymoshenko extern int32_t vchi_bulk_queue_receive( VCHI_SERVICE_HANDLE_T handle, 332262f27b2SOleksandr Tymoshenko void *data_dst, 333262f27b2SOleksandr Tymoshenko uint32_t data_size, 334262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 335262f27b2SOleksandr Tymoshenko void *transfer_handle ); 336262f27b2SOleksandr Tymoshenko 337262f27b2SOleksandr Tymoshenko 338262f27b2SOleksandr Tymoshenko // Prepare interface for a transfer from the other side into relocatable memory. 339262f27b2SOleksandr Tymoshenko int32_t vchi_bulk_queue_receive_reloc( const VCHI_SERVICE_HANDLE_T handle, 340262f27b2SOleksandr Tymoshenko VCHI_MEM_HANDLE_T h_dst, 341262f27b2SOleksandr Tymoshenko uint32_t offset, 342262f27b2SOleksandr Tymoshenko uint32_t data_size, 343262f27b2SOleksandr Tymoshenko const VCHI_FLAGS_T flags, 344262f27b2SOleksandr Tymoshenko void * const bulk_handle ); 345262f27b2SOleksandr Tymoshenko 346262f27b2SOleksandr Tymoshenko // Routine to queue up data ready for transfer to the other (once they have signalled they are ready) 347262f27b2SOleksandr Tymoshenko extern int32_t vchi_bulk_queue_transmit( VCHI_SERVICE_HANDLE_T handle, 348262f27b2SOleksandr Tymoshenko void *data_src, 349262f27b2SOleksandr Tymoshenko uint32_t data_size, 350262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 351262f27b2SOleksandr Tymoshenko void *transfer_handle ); 352262f27b2SOleksandr Tymoshenko 353262f27b2SOleksandr Tymoshenko 354262f27b2SOleksandr Tymoshenko /****************************************************************************** 355262f27b2SOleksandr Tymoshenko Configuration plumbing 356262f27b2SOleksandr Tymoshenko *****************************************************************************/ 357262f27b2SOleksandr Tymoshenko 358262f27b2SOleksandr Tymoshenko // function prototypes for the different mid layers (the state info gives the different physical connections) 359262f27b2SOleksandr Tymoshenko extern const VCHI_CONNECTION_API_T *single_get_func_table( void ); 360262f27b2SOleksandr Tymoshenko //extern const VCHI_CONNECTION_API_T *local_server_get_func_table( void ); 361262f27b2SOleksandr Tymoshenko //extern const VCHI_CONNECTION_API_T *local_client_get_func_table( void ); 362262f27b2SOleksandr Tymoshenko 363262f27b2SOleksandr Tymoshenko // declare all message drivers here 364262f27b2SOleksandr Tymoshenko const VCHI_MESSAGE_DRIVER_T *vchi_mphi_message_driver_func_table( void ); 365262f27b2SOleksandr Tymoshenko 366262f27b2SOleksandr Tymoshenko #ifdef __cplusplus 367262f27b2SOleksandr Tymoshenko } 368262f27b2SOleksandr Tymoshenko #endif 369262f27b2SOleksandr Tymoshenko 370262f27b2SOleksandr Tymoshenko extern int32_t vchi_bulk_queue_transmit_reloc( VCHI_SERVICE_HANDLE_T handle, 371262f27b2SOleksandr Tymoshenko VCHI_MEM_HANDLE_T h_src, 372262f27b2SOleksandr Tymoshenko uint32_t offset, 373262f27b2SOleksandr Tymoshenko uint32_t data_size, 374262f27b2SOleksandr Tymoshenko VCHI_FLAGS_T flags, 375262f27b2SOleksandr Tymoshenko void *transfer_handle ); 376262f27b2SOleksandr Tymoshenko #endif /* VCHI_H_ */ 377262f27b2SOleksandr Tymoshenko 378262f27b2SOleksandr Tymoshenko /****************************** End of file **********************************/ 379