1
2
3
4 #ifndef VCHIQ_IF_H
5 #define VCHIQ_IF_H
6
7 #define VCHIQ_SERVICE_HANDLE_INVALID 0
8
9 #define VCHIQ_SLOT_SIZE 4096
10 #define VCHIQ_MAX_MSG_SIZE (VCHIQ_SLOT_SIZE - sizeof(struct vchiq_header))
11 #define VCHIQ_CHANNEL_SIZE VCHIQ_MAX_MSG_SIZE
12
13 #define VCHIQ_MAKE_FOURCC(x0, x1, x2, x3) \
14 (((x0) << 24) | ((x1) << 16) | ((x2) << 8) | (x3))
15 #define VCHIQ_GET_SERVICE_USERDATA(service) vchiq_get_service_userdata(service)
16 #define VCHIQ_GET_SERVICE_FOURCC(service) vchiq_get_service_fourcc(service)
17
18 typedef enum {
19 VCHIQ_SERVICE_OPENED,
20 VCHIQ_SERVICE_CLOSED,
21 VCHIQ_MESSAGE_AVAILABLE,
22 VCHIQ_BULK_TRANSMIT_DONE,
23 VCHIQ_BULK_RECEIVE_DONE,
24 VCHIQ_BULK_TRANSMIT_ABORTED,
25 VCHIQ_BULK_RECEIVE_ABORTED
26 } VCHIQ_REASON_T;
27
28 typedef enum {
29 VCHIQ_ERROR = -1,
30 VCHIQ_SUCCESS = 0,
31 VCHIQ_RETRY = 1
32 } VCHIQ_STATUS_T;
33
34 typedef enum {
35 VCHIQ_BULK_MODE_CALLBACK,
36 VCHIQ_BULK_MODE_BLOCKING,
37 VCHIQ_BULK_MODE_NOCALLBACK,
38 VCHIQ_BULK_MODE_WAITING
39 } VCHIQ_BULK_MODE_T;
40
41 typedef enum {
42 VCHIQ_SERVICE_OPTION_AUTOCLOSE,
43 VCHIQ_SERVICE_OPTION_SLOT_QUOTA,
44 VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA,
45 VCHIQ_SERVICE_OPTION_SYNCHRONOUS,
46 VCHIQ_SERVICE_OPTION_TRACE
47 } VCHIQ_SERVICE_OPTION_T;
48
49 struct vchiq_header {
50
51 int msgid;
52
53
54 unsigned int size;
55
56 char data[0];
57 };
58
59 struct vchiq_element {
60 const void __user *data;
61 unsigned int size;
62 };
63
64 typedef unsigned int VCHIQ_SERVICE_HANDLE_T;
65
66 typedef VCHIQ_STATUS_T (*VCHIQ_CALLBACK_T)(VCHIQ_REASON_T,
67 struct vchiq_header *,
68 VCHIQ_SERVICE_HANDLE_T, void *);
69
70 struct vchiq_service_base {
71 int fourcc;
72 VCHIQ_CALLBACK_T callback;
73 void *userdata;
74 };
75
76 struct vchiq_service_params {
77 int fourcc;
78 VCHIQ_CALLBACK_T callback;
79 void *userdata;
80 short version;
81 short version_min;
82 };
83
84 struct vchiq_config {
85 unsigned int max_msg_size;
86 unsigned int bulk_threshold;
87
88
89 unsigned int max_outstanding_bulks;
90 unsigned int max_services;
91 short version;
92 short version_min;
93 };
94
95 typedef struct vchiq_instance_struct *VCHIQ_INSTANCE_T;
96 typedef void (*VCHIQ_REMOTE_USE_CALLBACK_T)(void *cb_arg);
97
98 extern VCHIQ_STATUS_T vchiq_initialise(VCHIQ_INSTANCE_T *pinstance);
99 extern VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance);
100 extern VCHIQ_STATUS_T vchiq_connect(VCHIQ_INSTANCE_T instance);
101 extern VCHIQ_STATUS_T vchiq_add_service(VCHIQ_INSTANCE_T instance,
102 const struct vchiq_service_params *params,
103 VCHIQ_SERVICE_HANDLE_T *pservice);
104 extern VCHIQ_STATUS_T vchiq_open_service(VCHIQ_INSTANCE_T instance,
105 const struct vchiq_service_params *params,
106 VCHIQ_SERVICE_HANDLE_T *pservice);
107 extern VCHIQ_STATUS_T vchiq_close_service(VCHIQ_SERVICE_HANDLE_T service);
108 extern VCHIQ_STATUS_T vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T service);
109 extern VCHIQ_STATUS_T vchiq_use_service(VCHIQ_SERVICE_HANDLE_T service);
110 extern VCHIQ_STATUS_T vchiq_release_service(VCHIQ_SERVICE_HANDLE_T service);
111 extern VCHIQ_STATUS_T
112 vchiq_queue_message(VCHIQ_SERVICE_HANDLE_T handle,
113 ssize_t (*copy_callback)(void *context, void *dest,
114 size_t offset, size_t maxsize),
115 void *context,
116 size_t size);
117 extern void vchiq_release_message(VCHIQ_SERVICE_HANDLE_T service,
118 struct vchiq_header *header);
119 extern VCHIQ_STATUS_T vchiq_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service,
120 const void *data, unsigned int size, void *userdata,
121 VCHIQ_BULK_MODE_T mode);
122 extern VCHIQ_STATUS_T vchiq_bulk_receive(VCHIQ_SERVICE_HANDLE_T service,
123 void *data, unsigned int size, void *userdata,
124 VCHIQ_BULK_MODE_T mode);
125 extern VCHIQ_STATUS_T vchiq_bulk_transmit_handle(VCHIQ_SERVICE_HANDLE_T service,
126 const void *offset, unsigned int size,
127 void *userdata, VCHIQ_BULK_MODE_T mode);
128 extern VCHIQ_STATUS_T vchiq_bulk_receive_handle(VCHIQ_SERVICE_HANDLE_T service,
129 void *offset, unsigned int size, void *userdata,
130 VCHIQ_BULK_MODE_T mode);
131 extern int vchiq_get_client_id(VCHIQ_SERVICE_HANDLE_T service);
132 extern void *vchiq_get_service_userdata(VCHIQ_SERVICE_HANDLE_T service);
133 extern int vchiq_get_service_fourcc(VCHIQ_SERVICE_HANDLE_T service);
134 extern void vchiq_get_config(struct vchiq_config *config);
135 extern VCHIQ_STATUS_T vchiq_set_service_option(VCHIQ_SERVICE_HANDLE_T service,
136 VCHIQ_SERVICE_OPTION_T option, int value);
137
138 extern VCHIQ_STATUS_T vchiq_remote_use(VCHIQ_INSTANCE_T instance,
139 VCHIQ_REMOTE_USE_CALLBACK_T callback, void *cb_arg);
140 extern VCHIQ_STATUS_T vchiq_remote_release(VCHIQ_INSTANCE_T instance);
141
142 extern VCHIQ_STATUS_T vchiq_dump_phys_mem(VCHIQ_SERVICE_HANDLE_T service,
143 void *ptr, size_t num_bytes);
144
145 extern VCHIQ_STATUS_T vchiq_get_peer_version(VCHIQ_SERVICE_HANDLE_T handle,
146 short *peer_version);
147
148 #endif