2 * Copyright (c) 2010-2012 Broadcom. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions, and the following disclaimer,
9 * without modification.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. The names of the above-listed copyright holders may not be used
14 * to endorse or promote products derived from this software without
15 * specific prior written permission.
17 * ALTERNATIVELY, this software may be distributed under the terms of the
18 * GNU General Public License ("GPL") version 2, as published by the Free
19 * Software Foundation.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #include "interface/vchi/vchi_mh.h"
39 #define VCHIQ_SERVICE_HANDLE_INVALID 0
41 #define VCHIQ_SLOT_SIZE 4096
42 #define VCHIQ_MAX_MSG_SIZE (VCHIQ_SLOT_SIZE - sizeof(VCHIQ_HEADER_T))
43 #define VCHIQ_CHANNEL_SIZE VCHIQ_MAX_MSG_SIZE /* For backwards compatibility */
45 #define VCHIQ_MAKE_FOURCC(x0, x1, x2, x3) \
46 (((x0) << 24) | ((x1) << 16) | ((x2) << 8) | (x3))
47 #define VCHIQ_GET_SERVICE_USERDATA(service) vchiq_get_service_userdata(service)
48 #define VCHIQ_GET_SERVICE_FOURCC(service) vchiq_get_service_fourcc(service)
51 VCHIQ_SERVICE_OPENED
, /* service, -, - */
52 VCHIQ_SERVICE_CLOSED
, /* service, -, - */
53 VCHIQ_MESSAGE_AVAILABLE
, /* service, header, - */
54 VCHIQ_BULK_TRANSMIT_DONE
, /* service, -, bulk_userdata */
55 VCHIQ_BULK_RECEIVE_DONE
, /* service, -, bulk_userdata */
56 VCHIQ_BULK_TRANSMIT_ABORTED
, /* service, -, bulk_userdata */
57 VCHIQ_BULK_RECEIVE_ABORTED
/* service, -, bulk_userdata */
67 VCHIQ_BULK_MODE_CALLBACK
,
68 VCHIQ_BULK_MODE_BLOCKING
,
69 VCHIQ_BULK_MODE_NOCALLBACK
,
70 VCHIQ_BULK_MODE_WAITING
/* Reserved for internal use */
74 VCHIQ_SERVICE_OPTION_AUTOCLOSE
,
75 VCHIQ_SERVICE_OPTION_SLOT_QUOTA
,
76 VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA
,
77 VCHIQ_SERVICE_OPTION_SYNCHRONOUS
,
78 VCHIQ_SERVICE_OPTION_TRACE
79 } VCHIQ_SERVICE_OPTION_T
;
81 typedef struct vchiq_header_struct
{
82 /* The message identifier - opaque to applications. */
85 /* Size of message data. */
88 char data
[0]; /* message */
96 typedef unsigned int VCHIQ_SERVICE_HANDLE_T
;
98 typedef VCHIQ_STATUS_T (*VCHIQ_CALLBACK_T
)(VCHIQ_REASON_T
, VCHIQ_HEADER_T
*,
99 VCHIQ_SERVICE_HANDLE_T
, void *);
101 typedef struct vchiq_service_base_struct
{
103 VCHIQ_CALLBACK_T callback
;
105 } VCHIQ_SERVICE_BASE_T
;
107 typedef struct vchiq_service_params_struct
{
109 VCHIQ_CALLBACK_T callback
;
111 short version
; /* Increment for non-trivial changes */
112 short version_min
; /* Update for incompatible changes */
113 } VCHIQ_SERVICE_PARAMS_T
;
115 typedef struct vchiq_config_struct
{
116 unsigned int max_msg_size
;
117 unsigned int bulk_threshold
; /* The message size above which it
118 is better to use a bulk transfer
120 unsigned int max_outstanding_bulks
;
121 unsigned int max_services
;
122 short version
; /* The version of VCHIQ */
123 short version_min
; /* The minimum compatible version of VCHIQ */
126 typedef struct vchiq_instance_struct
*VCHIQ_INSTANCE_T
;
127 typedef void (*VCHIQ_REMOTE_USE_CALLBACK_T
)(void *cb_arg
);
129 extern VCHIQ_STATUS_T
vchiq_initialise(VCHIQ_INSTANCE_T
*pinstance
);
130 extern VCHIQ_STATUS_T
vchiq_shutdown(VCHIQ_INSTANCE_T instance
);
131 extern VCHIQ_STATUS_T
vchiq_connect(VCHIQ_INSTANCE_T instance
);
132 extern VCHIQ_STATUS_T
vchiq_add_service(VCHIQ_INSTANCE_T instance
,
133 const VCHIQ_SERVICE_PARAMS_T
*params
,
134 VCHIQ_SERVICE_HANDLE_T
*pservice
);
135 extern VCHIQ_STATUS_T
vchiq_open_service(VCHIQ_INSTANCE_T instance
,
136 const VCHIQ_SERVICE_PARAMS_T
*params
,
137 VCHIQ_SERVICE_HANDLE_T
*pservice
);
138 extern VCHIQ_STATUS_T
vchiq_close_service(VCHIQ_SERVICE_HANDLE_T service
);
139 extern VCHIQ_STATUS_T
vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T service
);
140 extern VCHIQ_STATUS_T
vchiq_use_service(VCHIQ_SERVICE_HANDLE_T service
);
141 extern VCHIQ_STATUS_T
vchiq_use_service_no_resume(
142 VCHIQ_SERVICE_HANDLE_T service
);
143 extern VCHIQ_STATUS_T
vchiq_release_service(VCHIQ_SERVICE_HANDLE_T service
);
145 extern VCHIQ_STATUS_T
vchiq_queue_message(VCHIQ_SERVICE_HANDLE_T service
,
146 const VCHIQ_ELEMENT_T
*elements
, unsigned int count
);
147 extern void vchiq_release_message(VCHIQ_SERVICE_HANDLE_T service
,
148 VCHIQ_HEADER_T
*header
);
149 extern VCHIQ_STATUS_T
vchiq_queue_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service
,
150 const void *data
, unsigned int size
, void *userdata
);
151 extern VCHIQ_STATUS_T
vchiq_queue_bulk_receive(VCHIQ_SERVICE_HANDLE_T service
,
152 void *data
, unsigned int size
, void *userdata
);
153 extern VCHIQ_STATUS_T
vchiq_queue_bulk_transmit_handle(
154 VCHIQ_SERVICE_HANDLE_T service
, VCHI_MEM_HANDLE_T handle
,
155 const void *offset
, unsigned int size
, void *userdata
);
156 extern VCHIQ_STATUS_T
vchiq_queue_bulk_receive_handle(
157 VCHIQ_SERVICE_HANDLE_T service
, VCHI_MEM_HANDLE_T handle
,
158 void *offset
, unsigned int size
, void *userdata
);
159 extern VCHIQ_STATUS_T
vchiq_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service
,
160 const void *data
, unsigned int size
, void *userdata
,
161 VCHIQ_BULK_MODE_T mode
);
162 extern VCHIQ_STATUS_T
vchiq_bulk_receive(VCHIQ_SERVICE_HANDLE_T service
,
163 void *data
, unsigned int size
, void *userdata
,
164 VCHIQ_BULK_MODE_T mode
);
165 extern VCHIQ_STATUS_T
vchiq_bulk_transmit_handle(VCHIQ_SERVICE_HANDLE_T service
,
166 VCHI_MEM_HANDLE_T handle
, const void *offset
, unsigned int size
,
167 void *userdata
, VCHIQ_BULK_MODE_T mode
);
168 extern VCHIQ_STATUS_T
vchiq_bulk_receive_handle(VCHIQ_SERVICE_HANDLE_T service
,
169 VCHI_MEM_HANDLE_T handle
, void *offset
, unsigned int size
,
170 void *userdata
, VCHIQ_BULK_MODE_T mode
);
171 extern int vchiq_get_client_id(VCHIQ_SERVICE_HANDLE_T service
);
172 extern void *vchiq_get_service_userdata(VCHIQ_SERVICE_HANDLE_T service
);
173 extern int vchiq_get_service_fourcc(VCHIQ_SERVICE_HANDLE_T service
);
174 extern VCHIQ_STATUS_T
vchiq_get_config(VCHIQ_INSTANCE_T instance
,
175 int config_size
, VCHIQ_CONFIG_T
*pconfig
);
176 extern VCHIQ_STATUS_T
vchiq_set_service_option(VCHIQ_SERVICE_HANDLE_T service
,
177 VCHIQ_SERVICE_OPTION_T option
, int value
);
179 extern VCHIQ_STATUS_T
vchiq_remote_use(VCHIQ_INSTANCE_T instance
,
180 VCHIQ_REMOTE_USE_CALLBACK_T callback
, void *cb_arg
);
181 extern VCHIQ_STATUS_T
vchiq_remote_release(VCHIQ_INSTANCE_T instance
);
183 extern VCHIQ_STATUS_T
vchiq_dump_phys_mem(VCHIQ_SERVICE_HANDLE_T service
,
184 void *ptr
, size_t num_bytes
);
186 extern VCHIQ_STATUS_T
vchiq_get_peer_version(VCHIQ_SERVICE_HANDLE_T handle
,
187 short *peer_version
);
189 #endif /* VCHIQ_IF_H */