1278277Sgonzo/** 2278277Sgonzo * Copyright (c) 2010-2012 Broadcom. All rights reserved. 3278277Sgonzo * 4278277Sgonzo * Redistribution and use in source and binary forms, with or without 5278277Sgonzo * modification, are permitted provided that the following conditions 6278277Sgonzo * are met: 7278277Sgonzo * 1. Redistributions of source code must retain the above copyright 8278277Sgonzo * notice, this list of conditions, and the following disclaimer, 9278277Sgonzo * without modification. 10278277Sgonzo * 2. Redistributions in binary form must reproduce the above copyright 11278277Sgonzo * notice, this list of conditions and the following disclaimer in the 12278277Sgonzo * documentation and/or other materials provided with the distribution. 13278277Sgonzo * 3. The names of the above-listed copyright holders may not be used 14278277Sgonzo * to endorse or promote products derived from this software without 15278277Sgonzo * specific prior written permission. 16278277Sgonzo * 17278277Sgonzo * ALTERNATIVELY, this software may be distributed under the terms of the 18278277Sgonzo * GNU General Public License ("GPL") version 2, as published by the Free 19278277Sgonzo * Software Foundation. 20278277Sgonzo * 21278277Sgonzo * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 22278277Sgonzo * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 23278277Sgonzo * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24278277Sgonzo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 25278277Sgonzo * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 26278277Sgonzo * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 27278277Sgonzo * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 28278277Sgonzo * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29278277Sgonzo * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30278277Sgonzo * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31278277Sgonzo * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32278277Sgonzo */ 33278277Sgonzo 34278277Sgonzo#ifndef VCHIQ_IF_H 35278277Sgonzo#define VCHIQ_IF_H 36278277Sgonzo 37278277Sgonzo#include "interface/vchi/vchi_mh.h" 38278277Sgonzo 39278277Sgonzo#define VCHIQ_SERVICE_HANDLE_INVALID 0 40278277Sgonzo 41278277Sgonzo#define VCHIQ_SLOT_SIZE 4096 42278277Sgonzo#define VCHIQ_MAX_MSG_SIZE (VCHIQ_SLOT_SIZE - sizeof(VCHIQ_HEADER_T)) 43278277Sgonzo#define VCHIQ_CHANNEL_SIZE VCHIQ_MAX_MSG_SIZE /* For backwards compatibility */ 44278277Sgonzo 45278277Sgonzo#define VCHIQ_MAKE_FOURCC(x0, x1, x2, x3) \ 46278277Sgonzo (((x0) << 24) | ((x1) << 16) | ((x2) << 8) | (x3)) 47278277Sgonzo#define VCHIQ_GET_SERVICE_USERDATA(service) vchiq_get_service_userdata(service) 48278277Sgonzo#define VCHIQ_GET_SERVICE_FOURCC(service) vchiq_get_service_fourcc(service) 49278277Sgonzo 50278277Sgonzotypedef enum { 51278277Sgonzo VCHIQ_SERVICE_OPENED, /* service, -, - */ 52278277Sgonzo VCHIQ_SERVICE_CLOSED, /* service, -, - */ 53278277Sgonzo VCHIQ_MESSAGE_AVAILABLE, /* service, header, - */ 54278277Sgonzo VCHIQ_BULK_TRANSMIT_DONE, /* service, -, bulk_userdata */ 55278277Sgonzo VCHIQ_BULK_RECEIVE_DONE, /* service, -, bulk_userdata */ 56278277Sgonzo VCHIQ_BULK_TRANSMIT_ABORTED, /* service, -, bulk_userdata */ 57278277Sgonzo VCHIQ_BULK_RECEIVE_ABORTED /* service, -, bulk_userdata */ 58278277Sgonzo} VCHIQ_REASON_T; 59278277Sgonzo 60278277Sgonzotypedef enum { 61278277Sgonzo VCHIQ_ERROR = -1, 62278277Sgonzo VCHIQ_SUCCESS = 0, 63278277Sgonzo VCHIQ_RETRY = 1 64278277Sgonzo} VCHIQ_STATUS_T; 65278277Sgonzo 66278277Sgonzotypedef enum { 67278277Sgonzo VCHIQ_BULK_MODE_CALLBACK, 68278277Sgonzo VCHIQ_BULK_MODE_BLOCKING, 69278277Sgonzo VCHIQ_BULK_MODE_NOCALLBACK, 70278277Sgonzo VCHIQ_BULK_MODE_WAITING /* Reserved for internal use */ 71278277Sgonzo} VCHIQ_BULK_MODE_T; 72278277Sgonzo 73278277Sgonzotypedef enum { 74278277Sgonzo VCHIQ_SERVICE_OPTION_AUTOCLOSE, 75278277Sgonzo VCHIQ_SERVICE_OPTION_SLOT_QUOTA, 76278277Sgonzo VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA, 77290245Sgonzo VCHIQ_SERVICE_OPTION_SYNCHRONOUS, 78290245Sgonzo VCHIQ_SERVICE_OPTION_TRACE 79278277Sgonzo} VCHIQ_SERVICE_OPTION_T; 80278277Sgonzo 81278277Sgonzotypedef struct vchiq_header_struct { 82278277Sgonzo /* The message identifier - opaque to applications. */ 83278277Sgonzo int msgid; 84278277Sgonzo 85278277Sgonzo /* Size of message data. */ 86278277Sgonzo unsigned int size; 87278277Sgonzo 88278277Sgonzo char data[0]; /* message */ 89278277Sgonzo} VCHIQ_HEADER_T; 90278277Sgonzo 91278277Sgonzotypedef struct { 92278277Sgonzo const void *data; 93278277Sgonzo unsigned int size; 94278277Sgonzo} VCHIQ_ELEMENT_T; 95278277Sgonzo 96278277Sgonzotypedef unsigned int VCHIQ_SERVICE_HANDLE_T; 97278277Sgonzo 98278277Sgonzotypedef VCHIQ_STATUS_T (*VCHIQ_CALLBACK_T)(VCHIQ_REASON_T, VCHIQ_HEADER_T *, 99278277Sgonzo VCHIQ_SERVICE_HANDLE_T, void *); 100278277Sgonzo 101278277Sgonzotypedef struct vchiq_service_base_struct { 102278277Sgonzo int fourcc; 103278277Sgonzo VCHIQ_CALLBACK_T callback; 104278277Sgonzo void *userdata; 105278277Sgonzo} VCHIQ_SERVICE_BASE_T; 106278277Sgonzo 107278277Sgonzotypedef struct vchiq_service_params_struct { 108278277Sgonzo int fourcc; 109278277Sgonzo VCHIQ_CALLBACK_T callback; 110278277Sgonzo void *userdata; 111278277Sgonzo short version; /* Increment for non-trivial changes */ 112278277Sgonzo short version_min; /* Update for incompatible changes */ 113278277Sgonzo} VCHIQ_SERVICE_PARAMS_T; 114278277Sgonzo 115278277Sgonzotypedef struct vchiq_config_struct { 116278277Sgonzo unsigned int max_msg_size; 117278277Sgonzo unsigned int bulk_threshold; /* The message size above which it 118278277Sgonzo is better to use a bulk transfer 119278277Sgonzo (<= max_msg_size) */ 120278277Sgonzo unsigned int max_outstanding_bulks; 121278277Sgonzo unsigned int max_services; 122278277Sgonzo short version; /* The version of VCHIQ */ 123278277Sgonzo short version_min; /* The minimum compatible version of VCHIQ */ 124278277Sgonzo} VCHIQ_CONFIG_T; 125278277Sgonzo 126278277Sgonzotypedef struct vchiq_instance_struct *VCHIQ_INSTANCE_T; 127278277Sgonzotypedef void (*VCHIQ_REMOTE_USE_CALLBACK_T)(void *cb_arg); 128278277Sgonzo 129278277Sgonzoextern VCHIQ_STATUS_T vchiq_initialise(VCHIQ_INSTANCE_T *pinstance); 130278277Sgonzoextern VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance); 131278277Sgonzoextern VCHIQ_STATUS_T vchiq_connect(VCHIQ_INSTANCE_T instance); 132278277Sgonzoextern VCHIQ_STATUS_T vchiq_add_service(VCHIQ_INSTANCE_T instance, 133278277Sgonzo const VCHIQ_SERVICE_PARAMS_T *params, 134278277Sgonzo VCHIQ_SERVICE_HANDLE_T *pservice); 135278277Sgonzoextern VCHIQ_STATUS_T vchiq_open_service(VCHIQ_INSTANCE_T instance, 136278277Sgonzo const VCHIQ_SERVICE_PARAMS_T *params, 137278277Sgonzo VCHIQ_SERVICE_HANDLE_T *pservice); 138278277Sgonzoextern VCHIQ_STATUS_T vchiq_close_service(VCHIQ_SERVICE_HANDLE_T service); 139278277Sgonzoextern VCHIQ_STATUS_T vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T service); 140278277Sgonzoextern VCHIQ_STATUS_T vchiq_use_service(VCHIQ_SERVICE_HANDLE_T service); 141278277Sgonzoextern VCHIQ_STATUS_T vchiq_use_service_no_resume( 142278277Sgonzo VCHIQ_SERVICE_HANDLE_T service); 143278277Sgonzoextern VCHIQ_STATUS_T vchiq_release_service(VCHIQ_SERVICE_HANDLE_T service); 144278277Sgonzo 145278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_message(VCHIQ_SERVICE_HANDLE_T service, 146278277Sgonzo const VCHIQ_ELEMENT_T *elements, unsigned int count); 147278277Sgonzoextern void vchiq_release_message(VCHIQ_SERVICE_HANDLE_T service, 148278277Sgonzo VCHIQ_HEADER_T *header); 149278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service, 150278277Sgonzo void *data, unsigned int size, void *userdata); 151278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_receive(VCHIQ_SERVICE_HANDLE_T service, 152278277Sgonzo void *data, unsigned int size, void *userdata); 153278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_transmit_handle( 154278277Sgonzo VCHIQ_SERVICE_HANDLE_T service, VCHI_MEM_HANDLE_T handle, 155278277Sgonzo const void *offset, unsigned int size, void *userdata); 156278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_receive_handle( 157278277Sgonzo VCHIQ_SERVICE_HANDLE_T service, VCHI_MEM_HANDLE_T handle, 158278277Sgonzo void *offset, unsigned int size, void *userdata); 159278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service, 160278277Sgonzo void *data, unsigned int size, void *userdata, 161278277Sgonzo VCHIQ_BULK_MODE_T mode); 162278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_receive(VCHIQ_SERVICE_HANDLE_T service, 163278277Sgonzo void *data, unsigned int size, void *userdata, 164278277Sgonzo VCHIQ_BULK_MODE_T mode); 165278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_transmit_handle(VCHIQ_SERVICE_HANDLE_T service, 166278277Sgonzo VCHI_MEM_HANDLE_T handle, const void *offset, unsigned int size, 167278277Sgonzo void *userdata, VCHIQ_BULK_MODE_T mode); 168278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_receive_handle(VCHIQ_SERVICE_HANDLE_T service, 169278277Sgonzo VCHI_MEM_HANDLE_T handle, void *offset, unsigned int size, 170278277Sgonzo void *userdata, VCHIQ_BULK_MODE_T mode); 171278277Sgonzoextern int vchiq_get_client_id(VCHIQ_SERVICE_HANDLE_T service); 172278277Sgonzoextern void *vchiq_get_service_userdata(VCHIQ_SERVICE_HANDLE_T service); 173278277Sgonzoextern int vchiq_get_service_fourcc(VCHIQ_SERVICE_HANDLE_T service); 174278277Sgonzoextern VCHIQ_STATUS_T vchiq_get_config(VCHIQ_INSTANCE_T instance, 175278277Sgonzo int config_size, VCHIQ_CONFIG_T *pconfig); 176278277Sgonzoextern VCHIQ_STATUS_T vchiq_set_service_option(VCHIQ_SERVICE_HANDLE_T service, 177278277Sgonzo VCHIQ_SERVICE_OPTION_T option, int value); 178278277Sgonzo 179278277Sgonzoextern VCHIQ_STATUS_T vchiq_remote_use(VCHIQ_INSTANCE_T instance, 180278277Sgonzo VCHIQ_REMOTE_USE_CALLBACK_T callback, void *cb_arg); 181278277Sgonzoextern VCHIQ_STATUS_T vchiq_remote_release(VCHIQ_INSTANCE_T instance); 182278277Sgonzo 183278277Sgonzoextern VCHIQ_STATUS_T vchiq_dump_phys_mem(VCHIQ_SERVICE_HANDLE_T service, 184278277Sgonzo void *ptr, size_t num_bytes); 185278277Sgonzo 186278277Sgonzoextern VCHIQ_STATUS_T vchiq_get_peer_version(VCHIQ_SERVICE_HANDLE_T handle, 187278277Sgonzo short *peer_version); 188278277Sgonzo 189278277Sgonzo#endif /* VCHIQ_IF_H */ 190