1278277Sgonzo/**
2278277Sgonzo * Copyright (c) 2010-2012 Broadcom. All rights reserved.
3278277Sgonzo *
4278277Sgonzo * Redistribution and use in source and binary forms, with or without
5278277Sgonzo * modification, are permitted provided that the following conditions
6278277Sgonzo * are met:
7278277Sgonzo * 1. Redistributions of source code must retain the above copyright
8278277Sgonzo *    notice, this list of conditions, and the following disclaimer,
9278277Sgonzo *    without modification.
10278277Sgonzo * 2. Redistributions in binary form must reproduce the above copyright
11278277Sgonzo *    notice, this list of conditions and the following disclaimer in the
12278277Sgonzo *    documentation and/or other materials provided with the distribution.
13278277Sgonzo * 3. The names of the above-listed copyright holders may not be used
14278277Sgonzo *    to endorse or promote products derived from this software without
15278277Sgonzo *    specific prior written permission.
16278277Sgonzo *
17278277Sgonzo * ALTERNATIVELY, this software may be distributed under the terms of the
18278277Sgonzo * GNU General Public License ("GPL") version 2, as published by the Free
19278277Sgonzo * Software Foundation.
20278277Sgonzo *
21278277Sgonzo * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
22278277Sgonzo * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
23278277Sgonzo * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24278277Sgonzo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
25278277Sgonzo * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26278277Sgonzo * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27278277Sgonzo * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28278277Sgonzo * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29278277Sgonzo * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30278277Sgonzo * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31278277Sgonzo * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32278277Sgonzo */
33278277Sgonzo
34278277Sgonzo#ifndef VCHIQ_IF_H
35278277Sgonzo#define VCHIQ_IF_H
36278277Sgonzo
37278277Sgonzo#include "interface/vchi/vchi_mh.h"
38278277Sgonzo
39278277Sgonzo#define VCHIQ_SERVICE_HANDLE_INVALID 0
40278277Sgonzo
41278277Sgonzo#define VCHIQ_SLOT_SIZE     4096
42278277Sgonzo#define VCHIQ_MAX_MSG_SIZE  (VCHIQ_SLOT_SIZE - sizeof(VCHIQ_HEADER_T))
43278277Sgonzo#define VCHIQ_CHANNEL_SIZE  VCHIQ_MAX_MSG_SIZE /* For backwards compatibility */
44278277Sgonzo
45278277Sgonzo#define VCHIQ_MAKE_FOURCC(x0, x1, x2, x3) \
46278277Sgonzo			(((x0) << 24) | ((x1) << 16) | ((x2) << 8) | (x3))
47278277Sgonzo#define VCHIQ_GET_SERVICE_USERDATA(service) vchiq_get_service_userdata(service)
48278277Sgonzo#define VCHIQ_GET_SERVICE_FOURCC(service)   vchiq_get_service_fourcc(service)
49278277Sgonzo
50278277Sgonzotypedef enum {
51278277Sgonzo	VCHIQ_SERVICE_OPENED,         /* service, -, -             */
52278277Sgonzo	VCHIQ_SERVICE_CLOSED,         /* service, -, -             */
53278277Sgonzo	VCHIQ_MESSAGE_AVAILABLE,      /* service, header, -        */
54278277Sgonzo	VCHIQ_BULK_TRANSMIT_DONE,     /* service, -, bulk_userdata */
55278277Sgonzo	VCHIQ_BULK_RECEIVE_DONE,      /* service, -, bulk_userdata */
56278277Sgonzo	VCHIQ_BULK_TRANSMIT_ABORTED,  /* service, -, bulk_userdata */
57278277Sgonzo	VCHIQ_BULK_RECEIVE_ABORTED    /* service, -, bulk_userdata */
58278277Sgonzo} VCHIQ_REASON_T;
59278277Sgonzo
60278277Sgonzotypedef enum {
61278277Sgonzo	VCHIQ_ERROR   = -1,
62278277Sgonzo	VCHIQ_SUCCESS = 0,
63278277Sgonzo	VCHIQ_RETRY   = 1
64278277Sgonzo} VCHIQ_STATUS_T;
65278277Sgonzo
66278277Sgonzotypedef enum {
67278277Sgonzo	VCHIQ_BULK_MODE_CALLBACK,
68278277Sgonzo	VCHIQ_BULK_MODE_BLOCKING,
69278277Sgonzo	VCHIQ_BULK_MODE_NOCALLBACK,
70278277Sgonzo	VCHIQ_BULK_MODE_WAITING		/* Reserved for internal use */
71278277Sgonzo} VCHIQ_BULK_MODE_T;
72278277Sgonzo
73278277Sgonzotypedef enum {
74278277Sgonzo	VCHIQ_SERVICE_OPTION_AUTOCLOSE,
75278277Sgonzo	VCHIQ_SERVICE_OPTION_SLOT_QUOTA,
76278277Sgonzo	VCHIQ_SERVICE_OPTION_MESSAGE_QUOTA,
77290245Sgonzo	VCHIQ_SERVICE_OPTION_SYNCHRONOUS,
78290245Sgonzo	VCHIQ_SERVICE_OPTION_TRACE
79278277Sgonzo} VCHIQ_SERVICE_OPTION_T;
80278277Sgonzo
81278277Sgonzotypedef struct vchiq_header_struct {
82278277Sgonzo	/* The message identifier - opaque to applications. */
83278277Sgonzo	int msgid;
84278277Sgonzo
85278277Sgonzo	/* Size of message data. */
86278277Sgonzo	unsigned int size;
87278277Sgonzo
88278277Sgonzo	char data[0];           /* message */
89278277Sgonzo} VCHIQ_HEADER_T;
90278277Sgonzo
91278277Sgonzotypedef struct {
92278277Sgonzo	const void *data;
93278277Sgonzo	unsigned int size;
94278277Sgonzo} VCHIQ_ELEMENT_T;
95278277Sgonzo
96278277Sgonzotypedef unsigned int VCHIQ_SERVICE_HANDLE_T;
97278277Sgonzo
98278277Sgonzotypedef VCHIQ_STATUS_T (*VCHIQ_CALLBACK_T)(VCHIQ_REASON_T, VCHIQ_HEADER_T *,
99278277Sgonzo	VCHIQ_SERVICE_HANDLE_T, void *);
100278277Sgonzo
101278277Sgonzotypedef struct vchiq_service_base_struct {
102278277Sgonzo	int fourcc;
103278277Sgonzo	VCHIQ_CALLBACK_T callback;
104278277Sgonzo	void *userdata;
105278277Sgonzo} VCHIQ_SERVICE_BASE_T;
106278277Sgonzo
107278277Sgonzotypedef struct vchiq_service_params_struct {
108278277Sgonzo	int fourcc;
109278277Sgonzo	VCHIQ_CALLBACK_T callback;
110278277Sgonzo	void *userdata;
111278277Sgonzo	short version;       /* Increment for non-trivial changes */
112278277Sgonzo	short version_min;   /* Update for incompatible changes */
113278277Sgonzo} VCHIQ_SERVICE_PARAMS_T;
114278277Sgonzo
115278277Sgonzotypedef struct vchiq_config_struct {
116278277Sgonzo	unsigned int max_msg_size;
117278277Sgonzo	unsigned int bulk_threshold; /* The message size above which it
118278277Sgonzo					is better to use a bulk transfer
119278277Sgonzo					(<= max_msg_size) */
120278277Sgonzo	unsigned int max_outstanding_bulks;
121278277Sgonzo	unsigned int max_services;
122278277Sgonzo	short version;      /* The version of VCHIQ */
123278277Sgonzo	short version_min;  /* The minimum compatible version of VCHIQ */
124278277Sgonzo} VCHIQ_CONFIG_T;
125278277Sgonzo
126278277Sgonzotypedef struct vchiq_instance_struct *VCHIQ_INSTANCE_T;
127278277Sgonzotypedef void (*VCHIQ_REMOTE_USE_CALLBACK_T)(void *cb_arg);
128278277Sgonzo
129278277Sgonzoextern VCHIQ_STATUS_T vchiq_initialise(VCHIQ_INSTANCE_T *pinstance);
130278277Sgonzoextern VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance);
131278277Sgonzoextern VCHIQ_STATUS_T vchiq_connect(VCHIQ_INSTANCE_T instance);
132278277Sgonzoextern VCHIQ_STATUS_T vchiq_add_service(VCHIQ_INSTANCE_T instance,
133278277Sgonzo	const VCHIQ_SERVICE_PARAMS_T *params,
134278277Sgonzo	VCHIQ_SERVICE_HANDLE_T *pservice);
135278277Sgonzoextern VCHIQ_STATUS_T vchiq_open_service(VCHIQ_INSTANCE_T instance,
136278277Sgonzo	const VCHIQ_SERVICE_PARAMS_T *params,
137278277Sgonzo	VCHIQ_SERVICE_HANDLE_T *pservice);
138278277Sgonzoextern VCHIQ_STATUS_T vchiq_close_service(VCHIQ_SERVICE_HANDLE_T service);
139278277Sgonzoextern VCHIQ_STATUS_T vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T service);
140278277Sgonzoextern VCHIQ_STATUS_T vchiq_use_service(VCHIQ_SERVICE_HANDLE_T service);
141278277Sgonzoextern VCHIQ_STATUS_T vchiq_use_service_no_resume(
142278277Sgonzo	VCHIQ_SERVICE_HANDLE_T service);
143278277Sgonzoextern VCHIQ_STATUS_T vchiq_release_service(VCHIQ_SERVICE_HANDLE_T service);
144278277Sgonzo
145278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_message(VCHIQ_SERVICE_HANDLE_T service,
146278277Sgonzo	const VCHIQ_ELEMENT_T *elements, unsigned int count);
147278277Sgonzoextern void           vchiq_release_message(VCHIQ_SERVICE_HANDLE_T service,
148278277Sgonzo	VCHIQ_HEADER_T *header);
149278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service,
150278277Sgonzo	void *data, unsigned int size, void *userdata);
151278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_receive(VCHIQ_SERVICE_HANDLE_T service,
152278277Sgonzo	void *data, unsigned int size, void *userdata);
153278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_transmit_handle(
154278277Sgonzo	VCHIQ_SERVICE_HANDLE_T service, VCHI_MEM_HANDLE_T handle,
155278277Sgonzo	const void *offset, unsigned int size, void *userdata);
156278277Sgonzoextern VCHIQ_STATUS_T vchiq_queue_bulk_receive_handle(
157278277Sgonzo	VCHIQ_SERVICE_HANDLE_T service, VCHI_MEM_HANDLE_T handle,
158278277Sgonzo	void *offset, unsigned int size, void *userdata);
159278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_transmit(VCHIQ_SERVICE_HANDLE_T service,
160278277Sgonzo	void *data, unsigned int size, void *userdata,
161278277Sgonzo	VCHIQ_BULK_MODE_T mode);
162278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_receive(VCHIQ_SERVICE_HANDLE_T service,
163278277Sgonzo	void *data, unsigned int size, void *userdata,
164278277Sgonzo	VCHIQ_BULK_MODE_T mode);
165278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_transmit_handle(VCHIQ_SERVICE_HANDLE_T service,
166278277Sgonzo	VCHI_MEM_HANDLE_T handle, const void *offset, unsigned int size,
167278277Sgonzo	void *userdata,	VCHIQ_BULK_MODE_T mode);
168278277Sgonzoextern VCHIQ_STATUS_T vchiq_bulk_receive_handle(VCHIQ_SERVICE_HANDLE_T service,
169278277Sgonzo	VCHI_MEM_HANDLE_T handle, void *offset, unsigned int size,
170278277Sgonzo	void *userdata, VCHIQ_BULK_MODE_T mode);
171278277Sgonzoextern int   vchiq_get_client_id(VCHIQ_SERVICE_HANDLE_T service);
172278277Sgonzoextern void *vchiq_get_service_userdata(VCHIQ_SERVICE_HANDLE_T service);
173278277Sgonzoextern int   vchiq_get_service_fourcc(VCHIQ_SERVICE_HANDLE_T service);
174278277Sgonzoextern VCHIQ_STATUS_T vchiq_get_config(VCHIQ_INSTANCE_T instance,
175278277Sgonzo	int config_size, VCHIQ_CONFIG_T *pconfig);
176278277Sgonzoextern VCHIQ_STATUS_T vchiq_set_service_option(VCHIQ_SERVICE_HANDLE_T service,
177278277Sgonzo	VCHIQ_SERVICE_OPTION_T option, int value);
178278277Sgonzo
179278277Sgonzoextern VCHIQ_STATUS_T vchiq_remote_use(VCHIQ_INSTANCE_T instance,
180278277Sgonzo	VCHIQ_REMOTE_USE_CALLBACK_T callback, void *cb_arg);
181278277Sgonzoextern VCHIQ_STATUS_T vchiq_remote_release(VCHIQ_INSTANCE_T instance);
182278277Sgonzo
183278277Sgonzoextern VCHIQ_STATUS_T vchiq_dump_phys_mem(VCHIQ_SERVICE_HANDLE_T service,
184278277Sgonzo	void *ptr, size_t num_bytes);
185278277Sgonzo
186278277Sgonzoextern VCHIQ_STATUS_T vchiq_get_peer_version(VCHIQ_SERVICE_HANDLE_T handle,
187278277Sgonzo      short *peer_version);
188278277Sgonzo
189278277Sgonzo#endif /* VCHIQ_IF_H */
190