1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2 /* Copyright (c) 2010-2012 Broadcom. All rights reserved. */
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 /* For backwards compatibility */
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,         /* service, -, -             */
20 	VCHIQ_SERVICE_CLOSED,         /* service, -, -             */
21 	VCHIQ_MESSAGE_AVAILABLE,      /* service, header, -        */
22 	VCHIQ_BULK_TRANSMIT_DONE,     /* service, -, bulk_userdata */
23 	VCHIQ_BULK_RECEIVE_DONE,      /* service, -, bulk_userdata */
24 	VCHIQ_BULK_TRANSMIT_ABORTED,  /* service, -, bulk_userdata */
25 	VCHIQ_BULK_RECEIVE_ABORTED    /* service, -, bulk_userdata */
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		/* Reserved for internal use */
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 	/* The message identifier - opaque to applications. */
51 	int msgid;
52 
53 	/* Size of message data. */
54 	unsigned int size;
55 
56 	char data[0];           /* message */
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;       /* Increment for non-trivial changes */
81 	short version_min;   /* Update for incompatible changes */
82 };
83 
84 struct vchiq_config {
85 	unsigned int max_msg_size;
86 	unsigned int bulk_threshold; /* The message size above which it
87 					is better to use a bulk transfer
88 					(<= max_msg_size) */
89 	unsigned int max_outstanding_bulks;
90 	unsigned int max_services;
91 	short version;      /* The version of VCHIQ */
92 	short version_min;  /* The minimum compatible version of VCHIQ */
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 /* VCHIQ_IF_H */
149