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