1145519Sdarrenr/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2145510Sdarrenr/* Copyright (c) 2010-2012 Broadcom. All rights reserved. */
331183Speter
4255332Scy#ifndef VCHIQ_H
531183Speter#define VCHIQ_H
680486Sdarrenr
731183Speter#define VCHIQ_MAKE_FOURCC(x0, x1, x2, x3) \
831183Speter			(((x0) << 24) | ((x1) << 16) | ((x2) << 8) | (x3))
931183Speter
1031183Speterenum vchiq_reason {
1131183Speter	VCHIQ_SERVICE_OPENED,         /* service, -, -             */
1231183Speter	VCHIQ_SERVICE_CLOSED,         /* service, -, -             */
1331183Speter	VCHIQ_MESSAGE_AVAILABLE,      /* service, header, -        */
1431183Speter	VCHIQ_BULK_TRANSMIT_DONE,     /* service, -, bulk_userdata */
1531183Speter	VCHIQ_BULK_RECEIVE_DONE,      /* service, -, bulk_userdata */
1631183Speter	VCHIQ_BULK_TRANSMIT_ABORTED,  /* service, -, bulk_userdata */
1731183Speter	VCHIQ_BULK_RECEIVE_ABORTED    /* service, -, bulk_userdata */
1831183Speter};
1931183Speter
2031183Speterenum vchiq_bulk_mode {
2131183Speter	VCHIQ_BULK_MODE_CALLBACK,
2231183Speter	VCHIQ_BULK_MODE_BLOCKING,
2331183Speter	VCHIQ_BULK_MODE_NOCALLBACK,
2431183Speter	VCHIQ_BULK_MODE_WAITING		/* Reserved for internal use */
2531183Speter};
2631183Speter
2731183Speterenum vchiq_service_option {
2831183Speter	VCHIQ_SERVICE_OPTION_AUTOCLOSE,
2931183Speter	VCHIQ_SERVICE_OPTION_SLOT_QUOTA,
3031183Speter	VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA,
3131183Speter	VCHIQ_SERVICE_OPTION_SYNCHRONOUS,
3231183Speter	VCHIQ_SERVICE_OPTION_TRACE
3331183Speter};
3431183Speter
3531183Speterstruct vchiq_header {
3631183Speter	/* The message identifier - opaque to applications. */
3731183Speter	int msgid;
3831183Speter
3931183Speter	/* Size of message data. */
4031183Speter	unsigned int size;
4131183Speter
4231183Speter	char data[];           /* message */
4331183Speter};
4431183Speter
4531183Speterstruct vchiq_element {
4631183Speter	const void __user *data;
4731183Speter	unsigned int size;
4831183Speter};
4931183Speter
5031183Speterstruct vchiq_instance;
5131183Speter
5253024Sguidostruct vchiq_service_base {
53369245Sgit2svn	int fourcc;
5453024Sguido	int (*callback)(struct vchiq_instance *instance,
55			enum vchiq_reason reason,
56			struct vchiq_header *header,
57			unsigned int handle,
58			void *bulk_userdata);
59	void *userdata;
60};
61
62struct vchiq_completion_data_kernel {
63	enum vchiq_reason reason;
64	struct vchiq_header *header;
65	void *service_userdata;
66	void *bulk_userdata;
67};
68
69struct vchiq_service_params_kernel {
70	int fourcc;
71	int (*callback)(struct vchiq_instance *instance,
72			enum vchiq_reason reason,
73			struct vchiq_header *header,
74			unsigned int handle,
75			void *bulk_userdata);
76	void *userdata;
77	short version;       /* Increment for non-trivial changes */
78	short version_min;   /* Update for incompatible changes */
79};
80
81extern int vchiq_initialise(struct vchiq_instance **pinstance);
82extern int vchiq_shutdown(struct vchiq_instance *instance);
83extern int vchiq_connect(struct vchiq_instance *instance);
84extern int vchiq_open_service(struct vchiq_instance *instance,
85			      const struct vchiq_service_params_kernel *params,
86			      unsigned int *pservice);
87extern int vchiq_close_service(struct vchiq_instance *instance,
88			       unsigned int service);
89extern int vchiq_use_service(struct vchiq_instance *instance, unsigned int service);
90extern int vchiq_release_service(struct vchiq_instance *instance,
91				 unsigned int service);
92extern void vchiq_msg_queue_push(struct vchiq_instance *instance, unsigned int handle,
93				 struct vchiq_header *header);
94extern void vchiq_release_message(struct vchiq_instance *instance, unsigned int service,
95				  struct vchiq_header *header);
96extern int vchiq_queue_kernel_message(struct vchiq_instance *instance, unsigned int handle,
97				      void *data, unsigned int size);
98extern int vchiq_bulk_transmit(struct vchiq_instance *instance, unsigned int service,
99			       const void *data, unsigned int size, void *userdata,
100			       enum vchiq_bulk_mode mode);
101extern int vchiq_bulk_receive(struct vchiq_instance *instance, unsigned int service,
102			      void *data, unsigned int size, void *userdata,
103			      enum vchiq_bulk_mode mode);
104extern void *vchiq_get_service_userdata(struct vchiq_instance *instance, unsigned int service);
105extern int vchiq_get_peer_version(struct vchiq_instance *instance, unsigned int handle,
106				  short *peer_version);
107extern struct vchiq_header *vchiq_msg_hold(struct vchiq_instance *instance, unsigned int handle);
108
109#endif /* VCHIQ_H */
110