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