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 VCHIQ_IF_H 35 1.1 jmcneill #define VCHIQ_IF_H 36 1.1 jmcneill 37 1.1 jmcneill #include "interface/vchi/vchi_mh.h" 38 1.1 jmcneill 39 1.1 jmcneill #define VCHIQ_SERVICE_HANDLE_INVALID 0 40 1.1 jmcneill 41 1.1 jmcneill #define VCHIQ_SLOT_SIZE 4096 42 1.1 jmcneill #define VCHIQ_MAX_MSG_SIZE (VCHIQ_SLOT_SIZE - sizeof(VCHIQ_HEADER_T)) 43 1.1 jmcneill #define VCHIQ_CHANNEL_SIZE VCHIQ_MAX_MSG_SIZE /* For backwards compatibility */ 44 1.1 jmcneill 45 1.1 jmcneill #define VCHIQ_MAKE_FOURCC(x0, x1, x2, x3) \ 46 1.1 jmcneill (((x0) << 24) | ((x1) << 16) | ((x2) << 8) | (x3)) 47 1.1 jmcneill #define VCHIQ_GET_SERVICE_USERDATA(service) vchiq_get_service_userdata(service) 48 1.1 jmcneill #define VCHIQ_GET_SERVICE_FOURCC(service) vchiq_get_service_fourcc(service) 49 1.1 jmcneill 50 1.1 jmcneill typedef enum { 51 1.1 jmcneill VCHIQ_SERVICE_OPENED, /* service, -, - */ 52 1.1 jmcneill VCHIQ_SERVICE_CLOSED, /* service, -, - */ 53 1.1 jmcneill VCHIQ_MESSAGE_AVAILABLE, /* service, header, - */ 54 1.1 jmcneill VCHIQ_BULK_TRANSMIT_DONE, /* service, -, bulk_userdata */ 55 1.1 jmcneill VCHIQ_BULK_RECEIVE_DONE, /* service, -, bulk_userdata */ 56 1.1 jmcneill VCHIQ_BULK_TRANSMIT_ABORTED, /* service, -, bulk_userdata */ 57 1.1 jmcneill VCHIQ_BULK_RECEIVE_ABORTED /* service, -, bulk_userdata */ 58 1.1 jmcneill } VCHIQ_REASON_T; 59 1.1 jmcneill 60 1.1 jmcneill typedef enum { 61 1.1 jmcneill VCHIQ_ERROR = -1, 62 1.1 jmcneill VCHIQ_SUCCESS = 0, 63 1.1 jmcneill VCHIQ_RETRY = 1 64 1.1 jmcneill } VCHIQ_STATUS_T; 65 1.1 jmcneill 66 1.1 jmcneill typedef enum { 67 1.1 jmcneill VCHIQ_BULK_MODE_CALLBACK, 68 1.1 jmcneill VCHIQ_BULK_MODE_BLOCKING, 69 1.1 jmcneill VCHIQ_BULK_MODE_NOCALLBACK, 70 1.1 jmcneill VCHIQ_BULK_MODE_WAITING /* Reserved for internal use */ 71 1.1 jmcneill } VCHIQ_BULK_MODE_T; 72 1.1 jmcneill 73 1.1 jmcneill typedef enum { 74 1.1 jmcneill VCHIQ_SERVICE_OPTION_AUTOCLOSE, 75 1.1 jmcneill VCHIQ_SERVICE_OPTION_SLOT_QUOTA, 76 1.1 jmcneill VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA, 77 1.3 skrll VCHIQ_SERVICE_OPTION_SYNCHRONOUS, 78 1.3 skrll VCHIQ_SERVICE_OPTION_TRACE 79 1.1 jmcneill } VCHIQ_SERVICE_OPTION_T; 80 1.1 jmcneill 81 1.1 jmcneill typedef struct vchiq_header_struct { 82 1.1 jmcneill /* The message identifier - opaque to applications. */ 83 1.1 jmcneill int msgid; 84 1.1 jmcneill 85 1.1 jmcneill /* Size of message data. */ 86 1.1 jmcneill unsigned int size; 87 1.1 jmcneill 88 1.1 jmcneill char data[0]; /* message */ 89 1.1 jmcneill } VCHIQ_HEADER_T; 90 1.1 jmcneill 91 1.1 jmcneill typedef struct { 92 1.1 jmcneill const void *data; 93 1.2 skrll unsigned int size; 94 1.1 jmcneill } VCHIQ_ELEMENT_T; 95 1.1 jmcneill 96 1.1 jmcneill typedef unsigned int VCHIQ_SERVICE_HANDLE_T; 97 1.1 jmcneill 98 1.1 jmcneill typedef VCHIQ_STATUS_T (*VCHIQ_CALLBACK_T)(VCHIQ_REASON_T, VCHIQ_HEADER_T *, 99 1.1 jmcneill VCHIQ_SERVICE_HANDLE_T, void *); 100 1.1 jmcneill 101 1.1 jmcneill typedef struct vchiq_service_base_struct { 102 1.1 jmcneill int fourcc; 103 1.1 jmcneill VCHIQ_CALLBACK_T callback; 104 1.1 jmcneill void *userdata; 105 1.1 jmcneill } VCHIQ_SERVICE_BASE_T; 106 1.1 jmcneill 107 1.1 jmcneill typedef struct vchiq_service_params_struct { 108 1.1 jmcneill int fourcc; 109 1.1 jmcneill VCHIQ_CALLBACK_T callback; 110 1.1 jmcneill void *userdata; 111 1.1 jmcneill short version; /* Increment for non-trivial changes */ 112 1.1 jmcneill short version_min; /* Update for incompatible changes */ 113 1.1 jmcneill } VCHIQ_SERVICE_PARAMS_T; 114 1.1 jmcneill 115 1.1 jmcneill typedef struct vchiq_config_struct { 116 1.2 skrll unsigned int max_msg_size; 117 1.2 skrll unsigned int bulk_threshold; /* The message size above which it 118 1.2 skrll is better to use a bulk transfer 119 1.2 skrll (<= max_msg_size) */ 120 1.2 skrll unsigned int max_outstanding_bulks; 121 1.2 skrll unsigned int max_services; 122 1.1 jmcneill short version; /* The version of VCHIQ */ 123 1.1 jmcneill short version_min; /* The minimum compatible version of VCHIQ */ 124 1.1 jmcneill } VCHIQ_CONFIG_T; 125 1.1 jmcneill 126 1.1 jmcneill typedef struct vchiq_instance_struct *VCHIQ_INSTANCE_T; 127 1.1 jmcneill typedef void (*VCHIQ_REMOTE_USE_CALLBACK_T)(void *cb_arg); 128 1.1 jmcneill 129 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_initialise(VCHIQ_INSTANCE_T *pinstance); 130 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance); 131 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_connect(VCHIQ_INSTANCE_T instance); 132 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_add_service(VCHIQ_INSTANCE_T instance, 133 1.1 jmcneill const VCHIQ_SERVICE_PARAMS_T *params, 134 1.1 jmcneill VCHIQ_SERVICE_HANDLE_T *pservice); 135 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_open_service(VCHIQ_INSTANCE_T instance, 136 1.1 jmcneill const VCHIQ_SERVICE_PARAMS_T *params, 137 1.1 jmcneill VCHIQ_SERVICE_HANDLE_T *pservice); 138 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_close_service(VCHIQ_SERVICE_HANDLE_T service); 139 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T service); 140 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_use_service(VCHIQ_SERVICE_HANDLE_T service); 141 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_use_service_no_resume( 142 1.1 jmcneill VCHIQ_SERVICE_HANDLE_T service); 143 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_release_service(VCHIQ_SERVICE_HANDLE_T service); 144 1.1 jmcneill 145 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_queue_message(VCHIQ_SERVICE_HANDLE_T service, 146 1.2 skrll const VCHIQ_ELEMENT_T *elements, unsigned int count); 147 1.1 jmcneill extern void vchiq_release_message(VCHIQ_SERVICE_HANDLE_T service, 148 1.1 jmcneill VCHIQ_HEADER_T *header); 149 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_queue_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service, 150 1.2 skrll void *data, unsigned int size, void *userdata); 151 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_queue_bulk_receive(VCHIQ_SERVICE_HANDLE_T service, 152 1.2 skrll void *data, unsigned int size, void *userdata); 153 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_queue_bulk_transmit_handle( 154 1.1 jmcneill VCHIQ_SERVICE_HANDLE_T service, VCHI_MEM_HANDLE_T handle, 155 1.2 skrll const void *offset, unsigned int size, void *userdata); 156 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_queue_bulk_receive_handle( 157 1.1 jmcneill VCHIQ_SERVICE_HANDLE_T service, VCHI_MEM_HANDLE_T handle, 158 1.2 skrll void *offset, unsigned int size, void *userdata); 159 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service, 160 1.2 skrll void *data, unsigned int size, void *userdata, 161 1.2 skrll VCHIQ_BULK_MODE_T mode); 162 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_bulk_receive(VCHIQ_SERVICE_HANDLE_T service, 163 1.2 skrll void *data, unsigned int size, void *userdata, 164 1.2 skrll VCHIQ_BULK_MODE_T mode); 165 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_bulk_transmit_handle(VCHIQ_SERVICE_HANDLE_T service, 166 1.2 skrll VCHI_MEM_HANDLE_T handle, const void *offset, unsigned int size, 167 1.2 skrll void *userdata, VCHIQ_BULK_MODE_T mode); 168 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_bulk_receive_handle(VCHIQ_SERVICE_HANDLE_T service, 169 1.2 skrll VCHI_MEM_HANDLE_T handle, void *offset, unsigned int size, 170 1.2 skrll void *userdata, VCHIQ_BULK_MODE_T mode); 171 1.1 jmcneill extern int vchiq_get_client_id(VCHIQ_SERVICE_HANDLE_T service); 172 1.1 jmcneill extern void *vchiq_get_service_userdata(VCHIQ_SERVICE_HANDLE_T service); 173 1.1 jmcneill extern int vchiq_get_service_fourcc(VCHIQ_SERVICE_HANDLE_T service); 174 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_get_config(VCHIQ_INSTANCE_T instance, 175 1.1 jmcneill int config_size, VCHIQ_CONFIG_T *pconfig); 176 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_set_service_option(VCHIQ_SERVICE_HANDLE_T service, 177 1.1 jmcneill VCHIQ_SERVICE_OPTION_T option, int value); 178 1.1 jmcneill 179 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_remote_use(VCHIQ_INSTANCE_T instance, 180 1.1 jmcneill VCHIQ_REMOTE_USE_CALLBACK_T callback, void *cb_arg); 181 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_remote_release(VCHIQ_INSTANCE_T instance); 182 1.1 jmcneill 183 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_dump_phys_mem(VCHIQ_SERVICE_HANDLE_T service, 184 1.1 jmcneill void *ptr, size_t num_bytes); 185 1.1 jmcneill 186 1.1 jmcneill extern VCHIQ_STATUS_T vchiq_get_peer_version(VCHIQ_SERVICE_HANDLE_T handle, 187 1.1 jmcneill short *peer_version); 188 1.1 jmcneill 189 1.1 jmcneill #endif /* VCHIQ_IF_H */ 190