Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/vchiq/interface/vchi/connections/connection.h
48531 views
1
/**
2
* Copyright (c) 2010-2012 Broadcom. All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions
6
* are met:
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.
16
*
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.
20
*
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.
32
*/
33
34
#ifndef CONNECTION_H_
35
#define CONNECTION_H_
36
37
#include "interface/vchi/vchi_cfg_internal.h"
38
#include "interface/vchi/vchi_common.h"
39
#include "interface/vchi/message_drivers/message.h"
40
41
/******************************************************************************
42
Global defs
43
*****************************************************************************/
44
45
// Opaque handle for a connection / service pair
46
typedef struct opaque_vchi_connection_connected_service_handle_t *VCHI_CONNECTION_SERVICE_HANDLE_T;
47
48
// opaque handle to the connection state information
49
typedef struct opaque_vchi_connection_info_t VCHI_CONNECTION_STATE_T;
50
51
typedef struct vchi_connection_t VCHI_CONNECTION_T;
52
53
54
/******************************************************************************
55
API
56
*****************************************************************************/
57
58
// Routine to init a connection with a particular low level driver
59
typedef VCHI_CONNECTION_STATE_T * (*VCHI_CONNECTION_INIT_T)( struct vchi_connection_t * connection,
60
const VCHI_MESSAGE_DRIVER_T * driver );
61
62
// Routine to control CRC enabling at a connection level
63
typedef int32_t (*VCHI_CONNECTION_CRC_CONTROL_T)( VCHI_CONNECTION_STATE_T *state_handle,
64
VCHI_CRC_CONTROL_T control );
65
66
// Routine to create a service
67
typedef int32_t (*VCHI_CONNECTION_SERVICE_CONNECT_T)( VCHI_CONNECTION_STATE_T *state_handle,
68
int32_t service_id,
69
uint32_t rx_fifo_size,
70
uint32_t tx_fifo_size,
71
int server,
72
VCHI_CALLBACK_T callback,
73
void *callback_param,
74
int32_t want_crc,
75
int32_t want_unaligned_bulk_rx,
76
int32_t want_unaligned_bulk_tx,
77
VCHI_CONNECTION_SERVICE_HANDLE_T *service_handle );
78
79
// Routine to close a service
80
typedef int32_t (*VCHI_CONNECTION_SERVICE_DISCONNECT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle );
81
82
// Routine to queue a message
83
typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
84
const void *data,
85
uint32_t data_size,
86
VCHI_FLAGS_T flags,
87
void *msg_handle );
88
89
// scatter-gather (vector) message queueing
90
typedef int32_t (*VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
91
VCHI_MSG_VECTOR_T *vector,
92
uint32_t count,
93
VCHI_FLAGS_T flags,
94
void *msg_handle );
95
96
// Routine to dequeue a message
97
typedef int32_t (*VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
98
void *data,
99
uint32_t max_data_size_to_read,
100
uint32_t *actual_msg_size,
101
VCHI_FLAGS_T flags );
102
103
// Routine to peek at a message
104
typedef int32_t (*VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
105
void **data,
106
uint32_t *msg_size,
107
VCHI_FLAGS_T flags );
108
109
// Routine to hold a message
110
typedef int32_t (*VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
111
void **data,
112
uint32_t *msg_size,
113
VCHI_FLAGS_T flags,
114
void **message_handle );
115
116
// Routine to initialise a received message iterator
117
typedef int32_t (*VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
118
VCHI_MSG_ITER_T *iter,
119
VCHI_FLAGS_T flags );
120
121
// Routine to release a held message
122
typedef int32_t (*VCHI_CONNECTION_HELD_MSG_RELEASE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
123
void *message_handle );
124
125
// Routine to get info on a held message
126
typedef int32_t (*VCHI_CONNECTION_HELD_MSG_INFO_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
127
void *message_handle,
128
void **data,
129
int32_t *msg_size,
130
uint32_t *tx_timestamp,
131
uint32_t *rx_timestamp );
132
133
// Routine to check whether the iterator has a next message
134
typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
135
const VCHI_MSG_ITER_T *iter );
136
137
// Routine to advance the iterator
138
typedef int32_t (*VCHI_CONNECTION_MSG_ITER_NEXT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
139
VCHI_MSG_ITER_T *iter,
140
void **data,
141
uint32_t *msg_size );
142
143
// Routine to remove the last message returned by the iterator
144
typedef int32_t (*VCHI_CONNECTION_MSG_ITER_REMOVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
145
VCHI_MSG_ITER_T *iter );
146
147
// Routine to hold the last message returned by the iterator
148
typedef int32_t (*VCHI_CONNECTION_MSG_ITER_HOLD_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service,
149
VCHI_MSG_ITER_T *iter,
150
void **msg_handle );
151
152
// Routine to transmit bulk data
153
typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
154
const void *data_src,
155
uint32_t data_size,
156
VCHI_FLAGS_T flags,
157
void *bulk_handle );
158
159
// Routine to receive data
160
typedef int32_t (*VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T)( VCHI_CONNECTION_SERVICE_HANDLE_T service_handle,
161
void *data_dst,
162
uint32_t data_size,
163
VCHI_FLAGS_T flags,
164
void *bulk_handle );
165
166
// Routine to report if a server is available
167
typedef int32_t (*VCHI_CONNECTION_SERVER_PRESENT)( VCHI_CONNECTION_STATE_T *state, int32_t service_id, int32_t peer_flags );
168
169
// Routine to report the number of RX slots available
170
typedef int (*VCHI_CONNECTION_RX_SLOTS_AVAILABLE)( const VCHI_CONNECTION_STATE_T *state );
171
172
// Routine to report the RX slot size
173
typedef uint32_t (*VCHI_CONNECTION_RX_SLOT_SIZE)( const VCHI_CONNECTION_STATE_T *state );
174
175
// Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO
176
typedef void (*VCHI_CONNECTION_RX_BULK_BUFFER_ADDED)(VCHI_CONNECTION_STATE_T *state,
177
int32_t service,
178
uint32_t length,
179
MESSAGE_TX_CHANNEL_T channel,
180
uint32_t channel_params,
181
uint32_t data_length,
182
uint32_t data_offset);
183
184
// Callback to inform a service that a Xon or Xoff message has been received
185
typedef void (*VCHI_CONNECTION_FLOW_CONTROL)(VCHI_CONNECTION_STATE_T *state, int32_t service_id, int32_t xoff);
186
187
// Callback to inform a service that a server available reply message has been received
188
typedef void (*VCHI_CONNECTION_SERVER_AVAILABLE_REPLY)(VCHI_CONNECTION_STATE_T *state, int32_t service_id, uint32_t flags);
189
190
// Callback to indicate that bulk auxiliary messages have arrived
191
typedef void (*VCHI_CONNECTION_BULK_AUX_RECEIVED)(VCHI_CONNECTION_STATE_T *state);
192
193
// Callback to indicate that bulk auxiliary messages have arrived
194
typedef void (*VCHI_CONNECTION_BULK_AUX_TRANSMITTED)(VCHI_CONNECTION_STATE_T *state, void *handle);
195
196
// Callback with all the connection info you require
197
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
199
// Callback to inform of a disconnect
200
typedef void (*VCHI_CONNECTION_DISCONNECT)(VCHI_CONNECTION_STATE_T *state, uint32_t flags);
201
202
// Callback to inform of a power control request
203
typedef void (*VCHI_CONNECTION_POWER_CONTROL)(VCHI_CONNECTION_STATE_T *state, MESSAGE_TX_CHANNEL_T channel, int32_t enable);
204
205
// allocate memory suitably aligned for this connection
206
typedef void * (*VCHI_BUFFER_ALLOCATE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, uint32_t * length);
207
208
// free memory allocated by buffer_allocate
209
typedef void (*VCHI_BUFFER_FREE)(VCHI_CONNECTION_SERVICE_HANDLE_T service_handle, void * address);
210
211
212
/******************************************************************************
213
System driver struct
214
*****************************************************************************/
215
216
struct opaque_vchi_connection_api_t
217
{
218
// Routine to init the connection
219
VCHI_CONNECTION_INIT_T init;
220
221
// Connection-level CRC control
222
VCHI_CONNECTION_CRC_CONTROL_T crc_control;
223
224
// Routine to connect to or create service
225
VCHI_CONNECTION_SERVICE_CONNECT_T service_connect;
226
227
// Routine to disconnect from a service
228
VCHI_CONNECTION_SERVICE_DISCONNECT_T service_disconnect;
229
230
// Routine to queue a message
231
VCHI_CONNECTION_SERVICE_QUEUE_MESSAGE_T service_queue_msg;
232
233
// scatter-gather (vector) message queue
234
VCHI_CONNECTION_SERVICE_QUEUE_MESSAGEV_T service_queue_msgv;
235
236
// Routine to dequeue a message
237
VCHI_CONNECTION_SERVICE_DEQUEUE_MESSAGE_T service_dequeue_msg;
238
239
// Routine to peek at a message
240
VCHI_CONNECTION_SERVICE_PEEK_MESSAGE_T service_peek_msg;
241
242
// Routine to hold a message
243
VCHI_CONNECTION_SERVICE_HOLD_MESSAGE_T service_hold_msg;
244
245
// Routine to initialise a received message iterator
246
VCHI_CONNECTION_SERVICE_LOOKAHEAD_MESSAGE_T service_look_ahead_msg;
247
248
// Routine to release a message
249
VCHI_CONNECTION_HELD_MSG_RELEASE_T held_msg_release;
250
251
// Routine to get information on a held message
252
VCHI_CONNECTION_HELD_MSG_INFO_T held_msg_info;
253
254
// Routine to check for next message on iterator
255
VCHI_CONNECTION_MSG_ITER_HAS_NEXT_T msg_iter_has_next;
256
257
// Routine to get next message on iterator
258
VCHI_CONNECTION_MSG_ITER_NEXT_T msg_iter_next;
259
260
// Routine to remove the last message returned by iterator
261
VCHI_CONNECTION_MSG_ITER_REMOVE_T msg_iter_remove;
262
263
// Routine to hold the last message returned by iterator
264
VCHI_CONNECTION_MSG_ITER_HOLD_T msg_iter_hold;
265
266
// Routine to transmit bulk data
267
VCHI_CONNECTION_BULK_QUEUE_TRANSMIT_T bulk_queue_transmit;
268
269
// Routine to receive data
270
VCHI_CONNECTION_BULK_QUEUE_RECEIVE_T bulk_queue_receive;
271
272
// Routine to report the available servers
273
VCHI_CONNECTION_SERVER_PRESENT server_present;
274
275
// Routine to report the number of RX slots available
276
VCHI_CONNECTION_RX_SLOTS_AVAILABLE connection_rx_slots_available;
277
278
// Routine to report the RX slot size
279
VCHI_CONNECTION_RX_SLOT_SIZE connection_rx_slot_size;
280
281
// Callback to indicate that the other side has added a buffer to the rx bulk DMA FIFO
282
VCHI_CONNECTION_RX_BULK_BUFFER_ADDED rx_bulk_buffer_added;
283
284
// Callback to inform a service that a Xon or Xoff message has been received
285
VCHI_CONNECTION_FLOW_CONTROL flow_control;
286
287
// Callback to inform a service that a server available reply message has been received
288
VCHI_CONNECTION_SERVER_AVAILABLE_REPLY server_available_reply;
289
290
// Callback to indicate that bulk auxiliary messages have arrived
291
VCHI_CONNECTION_BULK_AUX_RECEIVED bulk_aux_received;
292
293
// Callback to indicate that a bulk auxiliary message has been transmitted
294
VCHI_CONNECTION_BULK_AUX_TRANSMITTED bulk_aux_transmitted;
295
296
// Callback to provide information about the connection
297
VCHI_CONNECTION_INFO connection_info;
298
299
// Callback to notify that peer has requested disconnect
300
VCHI_CONNECTION_DISCONNECT disconnect;
301
302
// Callback to notify that peer has requested power change
303
VCHI_CONNECTION_POWER_CONTROL power_control;
304
305
// allocate memory suitably aligned for this connection
306
VCHI_BUFFER_ALLOCATE buffer_allocate;
307
308
// free memory allocated by buffer_allocate
309
VCHI_BUFFER_FREE buffer_free;
310
311
};
312
313
struct vchi_connection_t {
314
const VCHI_CONNECTION_API_T *api;
315
VCHI_CONNECTION_STATE_T *state;
316
#ifdef VCHI_COARSE_LOCKING
317
struct semaphore sem;
318
#endif
319
};
320
321
322
#endif /* CONNECTION_H_ */
323
324
/****************************** End of file **********************************/
325
326