1b9450e43SRui Paulo /*-
2b9450e43SRui Paulo  * Copyright (C) 2013-2014 Daisuke Aoyama <aoyama@peach.ne.jp>
3b9450e43SRui Paulo  * All rights reserved.
4b9450e43SRui Paulo  *
5b9450e43SRui Paulo  * Redistribution and use in source and binary forms, with or without
6b9450e43SRui Paulo  * modification, are permitted provided that the following conditions
7b9450e43SRui Paulo  * are met:
8b9450e43SRui Paulo  * 1. Redistributions of source code must retain the above copyright
9b9450e43SRui Paulo  *    notice, this list of conditions and the following disclaimer.
10b9450e43SRui Paulo  * 2. Redistributions in binary form must reproduce the above copyright
11b9450e43SRui Paulo  *    notice, this list of conditions and the following disclaimer in the
12b9450e43SRui Paulo  *    documentation and/or other materials provided with the distribution.
13b9450e43SRui Paulo  *
14b9450e43SRui Paulo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15b9450e43SRui Paulo  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16b9450e43SRui Paulo  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17b9450e43SRui Paulo  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18b9450e43SRui Paulo  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19b9450e43SRui Paulo  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20b9450e43SRui Paulo  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21b9450e43SRui Paulo  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22b9450e43SRui Paulo  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23b9450e43SRui Paulo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24b9450e43SRui Paulo  * SUCH DAMAGE.
25b9450e43SRui Paulo  */
26b9450e43SRui Paulo 
27b9450e43SRui Paulo #ifndef _BCM2835_MBOX_PROP_H_
28b9450e43SRui Paulo #define _BCM2835_MBOX_PROP_H_
29b9450e43SRui Paulo 
30b9450e43SRui Paulo #include <sys/types.h>
31b9450e43SRui Paulo 
32b9450e43SRui Paulo /*
33b9450e43SRui Paulo  * Mailbox property interface:
34b9450e43SRui Paulo  * https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface
35b9450e43SRui Paulo  */
36b9450e43SRui Paulo #define BCM2835_MBOX_CODE_REQ			0
37b9450e43SRui Paulo #define BCM2835_MBOX_CODE_RESP_SUCCESS		0x80000000
38b9450e43SRui Paulo #define BCM2835_MBOX_CODE_RESP_ERROR		0x80000001
39b9450e43SRui Paulo #define BCM2835_MBOX_TAG_VAL_LEN_RESPONSE	0x80000000
40b9450e43SRui Paulo 
41b9450e43SRui Paulo struct bcm2835_mbox_hdr {
42b9450e43SRui Paulo 	uint32_t	buf_size;
43b9450e43SRui Paulo 	uint32_t	code;
44b9450e43SRui Paulo };
45b9450e43SRui Paulo 
46b9450e43SRui Paulo struct bcm2835_mbox_tag_hdr {
47b9450e43SRui Paulo 	uint32_t	tag;
48b9450e43SRui Paulo 	uint32_t	val_buf_size;
49b9450e43SRui Paulo 	uint32_t	val_len;
50b9450e43SRui Paulo };
51b9450e43SRui Paulo 
52ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_INIT_TAG(tag_, tagid_) do {		\
53ae29e2d8SLuiz Otavio O Souza 	(tag_)->tag_hdr.tag = BCM2835_MBOX_TAG_##tagid_;	\
54ae29e2d8SLuiz Otavio O Souza 	(tag_)->tag_hdr.val_buf_size = sizeof((tag_)->body);	\
55ae29e2d8SLuiz Otavio O Souza 	(tag_)->tag_hdr.val_len = sizeof((tag_)->body.req);	\
56ae29e2d8SLuiz Otavio O Souza } while (0)
57ae29e2d8SLuiz Otavio O Souza 
58201a1f34SAndrew Turner #define BCM2835_MBOX_TAG_FIRMWARE_REVISION	0x00000001
59201a1f34SAndrew Turner 
6088cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_EMMC		0x00000000
6188cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_UART0		0x00000001
6288cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_UART1		0x00000002
6388cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_USB_HCD		0x00000003
6488cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_I2C0		0x00000004
6588cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_I2C1		0x00000005
6688cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_I2C2		0x00000006
6788cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_SPI		0x00000007
6888cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ID_CCP2TX		0x00000008
6988cb7e28SAndrew Turner 
7088cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_ON			(1 << 0)
7188cb7e28SAndrew Turner #define BCM2835_MBOX_POWER_WAIT			(1 << 1)
7288cb7e28SAndrew Turner 
7388cb7e28SAndrew Turner #define BCM2835_MBOX_TAG_GET_POWER_STATE	0x00020001
7488cb7e28SAndrew Turner #define BCM2835_MBOX_TAG_SET_POWER_STATE	0x00028001
7588cb7e28SAndrew Turner 
7688cb7e28SAndrew Turner struct msg_get_power_state {
7788cb7e28SAndrew Turner 	struct bcm2835_mbox_hdr hdr;
7888cb7e28SAndrew Turner 	struct bcm2835_mbox_tag_hdr tag_hdr;
7988cb7e28SAndrew Turner 	union {
8088cb7e28SAndrew Turner 		struct {
8188cb7e28SAndrew Turner 			uint32_t device_id;
8288cb7e28SAndrew Turner 		} req;
8388cb7e28SAndrew Turner 		struct {
8488cb7e28SAndrew Turner 			uint32_t device_id;
8588cb7e28SAndrew Turner 			uint32_t state;
8688cb7e28SAndrew Turner 		} resp;
8788cb7e28SAndrew Turner 	} body;
8888cb7e28SAndrew Turner 	uint32_t end_tag;
8988cb7e28SAndrew Turner };
9088cb7e28SAndrew Turner 
9188cb7e28SAndrew Turner struct msg_set_power_state {
9288cb7e28SAndrew Turner 	struct bcm2835_mbox_hdr hdr;
9388cb7e28SAndrew Turner 	struct bcm2835_mbox_tag_hdr tag_hdr;
9488cb7e28SAndrew Turner 	union {
9588cb7e28SAndrew Turner 		struct {
9688cb7e28SAndrew Turner 			uint32_t device_id;
9788cb7e28SAndrew Turner 			uint32_t state;
9888cb7e28SAndrew Turner 		} req;
9988cb7e28SAndrew Turner 		struct {
10088cb7e28SAndrew Turner 			uint32_t device_id;
10188cb7e28SAndrew Turner 			uint32_t state;
10288cb7e28SAndrew Turner 		} resp;
10388cb7e28SAndrew Turner 	} body;
10488cb7e28SAndrew Turner 	uint32_t end_tag;
10588cb7e28SAndrew Turner };
10688cb7e28SAndrew Turner 
107b812d0adSAndrew Turner /* Sets the power state for a given device */
1088826550bSOleksandr Tymoshenko int bcm2835_mbox_set_power_state(uint32_t, boolean_t);
109b812d0adSAndrew Turner 
11031e34625SAndrew Turner #define BCM2835_MBOX_TAG_NOTIFY_XHCI_RESET	0x00030058
11131e34625SAndrew Turner 
11231e34625SAndrew Turner struct msg_notify_xhci_reset {
11331e34625SAndrew Turner 	struct bcm2835_mbox_hdr hdr;
11431e34625SAndrew Turner 	struct bcm2835_mbox_tag_hdr tag_hdr;
11531e34625SAndrew Turner 	union {
11631e34625SAndrew Turner 		struct {
11731e34625SAndrew Turner 			uint32_t pci_device_addr;
11831e34625SAndrew Turner 		} req;
11931e34625SAndrew Turner 		struct {
12031e34625SAndrew Turner 		} resp;
12131e34625SAndrew Turner 	} body;
12231e34625SAndrew Turner 	uint32_t end_tag;
12331e34625SAndrew Turner };
12431e34625SAndrew Turner 
12531e34625SAndrew Turner /* Prompts the VideoCore processor to reload the xhci firmware. */
12631e34625SAndrew Turner int bcm2835_mbox_notify_xhci_reset(uint32_t);
12731e34625SAndrew Turner 
128b9450e43SRui Paulo #define BCM2835_MBOX_CLOCK_ID_EMMC		0x00000001
129ff3b277bSKyle Evans #define BCM2838_MBOX_CLOCK_ID_EMMC2		0x0000000c
130b9450e43SRui Paulo 
131b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_CLOCK_RATE		0x00030002
132b9450e43SRui Paulo 
133b9450e43SRui Paulo struct msg_get_clock_rate {
134b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
135b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
136b9450e43SRui Paulo 	union {
137b9450e43SRui Paulo 		struct {
138b9450e43SRui Paulo 			uint32_t clock_id;
139b9450e43SRui Paulo 		} req;
140b9450e43SRui Paulo 		struct {
141b9450e43SRui Paulo 			uint32_t clock_id;
142b9450e43SRui Paulo 			uint32_t rate_hz;
143b9450e43SRui Paulo 		} resp;
144b9450e43SRui Paulo 	} body;
145b9450e43SRui Paulo 	uint32_t end_tag;
146b9450e43SRui Paulo };
147b9450e43SRui Paulo 
1488826550bSOleksandr Tymoshenko int bcm2835_mbox_get_clock_rate(uint32_t, uint32_t *);
14927eb3304SAndrew Turner 
150b9450e43SRui Paulo #define BCM2835_MBOX_TURBO_ON			1
151b9450e43SRui Paulo #define BCM2835_MBOX_TURBO_OFF			0
152b9450e43SRui Paulo 
153b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_TURBO		0x00030009
154b9450e43SRui Paulo #define BCM2835_MBOX_TAG_SET_TURBO		0x00038009
155b9450e43SRui Paulo 
156b9450e43SRui Paulo struct msg_get_turbo {
157b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
158b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
159b9450e43SRui Paulo 	union {
160b9450e43SRui Paulo 		struct {
161b9450e43SRui Paulo 			uint32_t id;
162b9450e43SRui Paulo 		} req;
163b9450e43SRui Paulo 		struct {
164b9450e43SRui Paulo 			uint32_t id;
165b9450e43SRui Paulo 			uint32_t level;
166b9450e43SRui Paulo 		} resp;
167b9450e43SRui Paulo 	} body;
168b9450e43SRui Paulo 	uint32_t end_tag;
169b9450e43SRui Paulo };
170b9450e43SRui Paulo 
171b9450e43SRui Paulo struct msg_set_turbo {
172b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
173b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
174b9450e43SRui Paulo 	union {
175b9450e43SRui Paulo 		struct {
176b9450e43SRui Paulo 			uint32_t id;
177b9450e43SRui Paulo 			uint32_t level;
178b9450e43SRui Paulo 		} req;
179b9450e43SRui Paulo 		struct {
180b9450e43SRui Paulo 			uint32_t id;
181b9450e43SRui Paulo 			uint32_t level;
182b9450e43SRui Paulo 		} resp;
183b9450e43SRui Paulo 	} body;
184b9450e43SRui Paulo 	uint32_t end_tag;
185b9450e43SRui Paulo };
186b9450e43SRui Paulo 
187b9450e43SRui Paulo #define BCM2835_MBOX_VOLTAGE_ID_CORE		0x00000001
188b9450e43SRui Paulo #define BCM2835_MBOX_VOLTAGE_ID_SDRAM_C		0x00000002
189b9450e43SRui Paulo #define BCM2835_MBOX_VOLTAGE_ID_SDRAM_P		0x00000003
190b9450e43SRui Paulo #define BCM2835_MBOX_VOLTAGE_ID_SDRAM_I		0x00000004
191b9450e43SRui Paulo 
192b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_VOLTAGE		0x00030003
193b9450e43SRui Paulo #define BCM2835_MBOX_TAG_SET_VOLTAGE		0x00038003
194b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_MAX_VOLTAGE	0x00030005
195b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_MIN_VOLTAGE	0x00030008
196b9450e43SRui Paulo 
197b9450e43SRui Paulo struct msg_get_voltage {
198b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
199b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
200b9450e43SRui Paulo 	union {
201b9450e43SRui Paulo 		struct {
202b9450e43SRui Paulo 			uint32_t voltage_id;
203b9450e43SRui Paulo 		} req;
204b9450e43SRui Paulo 		struct {
205b9450e43SRui Paulo 			uint32_t voltage_id;
206b9450e43SRui Paulo 			uint32_t value;
207b9450e43SRui Paulo 		} resp;
208b9450e43SRui Paulo 	} body;
209b9450e43SRui Paulo 	uint32_t end_tag;
210b9450e43SRui Paulo };
211b9450e43SRui Paulo 
212b9450e43SRui Paulo struct msg_set_voltage {
213b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
214b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
215b9450e43SRui Paulo 	union {
216b9450e43SRui Paulo 		struct {
217b9450e43SRui Paulo 			uint32_t voltage_id;
218b9450e43SRui Paulo 			uint32_t value;
219b9450e43SRui Paulo 		} req;
220b9450e43SRui Paulo 		struct {
221b9450e43SRui Paulo 			uint32_t voltage_id;
222b9450e43SRui Paulo 			uint32_t value;
223b9450e43SRui Paulo 		} resp;
224b9450e43SRui Paulo 	} body;
225b9450e43SRui Paulo 	uint32_t end_tag;
226b9450e43SRui Paulo };
227b9450e43SRui Paulo 
228b9450e43SRui Paulo struct msg_get_max_voltage {
229b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
230b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
231b9450e43SRui Paulo 	union {
232b9450e43SRui Paulo 		struct {
233b9450e43SRui Paulo 			uint32_t voltage_id;
234b9450e43SRui Paulo 		} req;
235b9450e43SRui Paulo 		struct {
236b9450e43SRui Paulo 			uint32_t voltage_id;
237b9450e43SRui Paulo 			uint32_t value;
238b9450e43SRui Paulo 		} resp;
239b9450e43SRui Paulo 	} body;
240b9450e43SRui Paulo 	uint32_t end_tag;
241b9450e43SRui Paulo };
242b9450e43SRui Paulo 
243b9450e43SRui Paulo struct msg_get_min_voltage {
244b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
245b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
246b9450e43SRui Paulo 	union {
247b9450e43SRui Paulo 		struct {
248b9450e43SRui Paulo 			uint32_t voltage_id;
249b9450e43SRui Paulo 		} req;
250b9450e43SRui Paulo 		struct {
251b9450e43SRui Paulo 			uint32_t voltage_id;
252b9450e43SRui Paulo 			uint32_t value;
253b9450e43SRui Paulo 		} resp;
254b9450e43SRui Paulo 	} body;
255b9450e43SRui Paulo 	uint32_t end_tag;
256b9450e43SRui Paulo };
257b9450e43SRui Paulo 
258b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_TEMPERATURE	0x00030006
259b9450e43SRui Paulo #define BCM2835_MBOX_TAG_GET_MAX_TEMPERATURE	0x0003000a
260b9450e43SRui Paulo 
261b9450e43SRui Paulo struct msg_get_temperature {
262b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
263b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
264b9450e43SRui Paulo 	union {
265b9450e43SRui Paulo 		struct {
266b9450e43SRui Paulo 			uint32_t temperature_id;
267b9450e43SRui Paulo 		} req;
268b9450e43SRui Paulo 		struct {
269b9450e43SRui Paulo 			uint32_t temperature_id;
270b9450e43SRui Paulo 			uint32_t value;
271b9450e43SRui Paulo 		} resp;
272b9450e43SRui Paulo 	} body;
273b9450e43SRui Paulo 	uint32_t end_tag;
274b9450e43SRui Paulo };
275b9450e43SRui Paulo 
276b9450e43SRui Paulo struct msg_get_max_temperature {
277b9450e43SRui Paulo 	struct bcm2835_mbox_hdr hdr;
278b9450e43SRui Paulo 	struct bcm2835_mbox_tag_hdr tag_hdr;
279b9450e43SRui Paulo 	union {
280b9450e43SRui Paulo 		struct {
281b9450e43SRui Paulo 			uint32_t temperature_id;
282b9450e43SRui Paulo 		} req;
283b9450e43SRui Paulo 		struct {
284b9450e43SRui Paulo 			uint32_t temperature_id;
285b9450e43SRui Paulo 			uint32_t value;
286b9450e43SRui Paulo 		} resp;
287b9450e43SRui Paulo 	} body;
288b9450e43SRui Paulo 	uint32_t end_tag;
289b9450e43SRui Paulo };
290b9450e43SRui Paulo 
291ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_GET_PHYSICAL_W_H	0x00040003
292ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_SET_PHYSICAL_W_H	0x00048003
293ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_GET_VIRTUAL_W_H	0x00040004
294ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_SET_VIRTUAL_W_H	0x00048004
295ae29e2d8SLuiz Otavio O Souza 
296ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_fb_w_h {
297ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
298ae29e2d8SLuiz Otavio O Souza 	union {
299ae29e2d8SLuiz Otavio O Souza 		struct {
300ae29e2d8SLuiz Otavio O Souza 			uint32_t width;
301ae29e2d8SLuiz Otavio O Souza 			uint32_t height;
302ae29e2d8SLuiz Otavio O Souza 		} req;
303ae29e2d8SLuiz Otavio O Souza 		struct {
304ae29e2d8SLuiz Otavio O Souza 			uint32_t width;
305ae29e2d8SLuiz Otavio O Souza 			uint32_t height;
306ae29e2d8SLuiz Otavio O Souza 		} resp;
307ae29e2d8SLuiz Otavio O Souza 	} body;
308ae29e2d8SLuiz Otavio O Souza };
309ae29e2d8SLuiz Otavio O Souza 
310ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_GET_DEPTH		0x00040005
311ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_SET_DEPTH		0x00048005
312ae29e2d8SLuiz Otavio O Souza 
313ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_depth {
314ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
315ae29e2d8SLuiz Otavio O Souza 	union {
316ae29e2d8SLuiz Otavio O Souza 		struct {
317ae29e2d8SLuiz Otavio O Souza 			uint32_t bpp;
318ae29e2d8SLuiz Otavio O Souza 		} req;
319ae29e2d8SLuiz Otavio O Souza 		struct {
320ae29e2d8SLuiz Otavio O Souza 			uint32_t bpp;
321ae29e2d8SLuiz Otavio O Souza 		} resp;
322ae29e2d8SLuiz Otavio O Souza 	} body;
323ae29e2d8SLuiz Otavio O Souza };
324ae29e2d8SLuiz Otavio O Souza 
325ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_GET_ALPHA_MODE		0x00040007
326ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_SET_ALPHA_MODE		0x00048007
327ae29e2d8SLuiz Otavio O Souza 
328ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_ALPHA_MODE_0_OPAQUE	0
329ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_ALPHA_MODE_0_TRANSPARENT	1
330ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_ALPHA_MODE_IGNORED		2
331ae29e2d8SLuiz Otavio O Souza 
332ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_alpha_mode {
333ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
334ae29e2d8SLuiz Otavio O Souza 	union {
335ae29e2d8SLuiz Otavio O Souza 		struct {
336ae29e2d8SLuiz Otavio O Souza 			uint32_t alpha;
337ae29e2d8SLuiz Otavio O Souza 		} req;
338ae29e2d8SLuiz Otavio O Souza 		struct {
339ae29e2d8SLuiz Otavio O Souza 			uint32_t alpha;
340ae29e2d8SLuiz Otavio O Souza 		} resp;
341ae29e2d8SLuiz Otavio O Souza 	} body;
342ae29e2d8SLuiz Otavio O Souza };
343ae29e2d8SLuiz Otavio O Souza 
344ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_GET_VIRTUAL_OFFSET	0x00040009
345ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_SET_VIRTUAL_OFFSET	0x00048009
346ae29e2d8SLuiz Otavio O Souza 
347ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_virtual_offset {
348ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
349ae29e2d8SLuiz Otavio O Souza 	union {
350ae29e2d8SLuiz Otavio O Souza 		struct {
351ae29e2d8SLuiz Otavio O Souza 			uint32_t x;
352ae29e2d8SLuiz Otavio O Souza 			uint32_t y;
353ae29e2d8SLuiz Otavio O Souza 		} req;
354ae29e2d8SLuiz Otavio O Souza 		struct {
355ae29e2d8SLuiz Otavio O Souza 			uint32_t x;
356ae29e2d8SLuiz Otavio O Souza 			uint32_t y;
357ae29e2d8SLuiz Otavio O Souza 		} resp;
358ae29e2d8SLuiz Otavio O Souza 	} body;
359ae29e2d8SLuiz Otavio O Souza };
360ae29e2d8SLuiz Otavio O Souza 
361ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_GET_PITCH		0x00040008
362ae29e2d8SLuiz Otavio O Souza 
363ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_pitch {
364ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
365ae29e2d8SLuiz Otavio O Souza 	union {
366ae29e2d8SLuiz Otavio O Souza 		struct {
367ae29e2d8SLuiz Otavio O Souza 		} req;
368ae29e2d8SLuiz Otavio O Souza 		struct {
369ae29e2d8SLuiz Otavio O Souza 			uint32_t pitch;
370ae29e2d8SLuiz Otavio O Souza 		} resp;
371ae29e2d8SLuiz Otavio O Souza 	} body;
372ae29e2d8SLuiz Otavio O Souza };
373ae29e2d8SLuiz Otavio O Souza 
374ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_ALLOCATE_BUFFER	0x00040001
375ae29e2d8SLuiz Otavio O Souza 
376ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_allocate_buffer {
377ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
378ae29e2d8SLuiz Otavio O Souza 	union {
379ae29e2d8SLuiz Otavio O Souza 		struct {
380ae29e2d8SLuiz Otavio O Souza 			uint32_t alignment;
381ae29e2d8SLuiz Otavio O Souza 		} req;
382ae29e2d8SLuiz Otavio O Souza 		struct {
383ae29e2d8SLuiz Otavio O Souza 			uint32_t fb_address;
384ae29e2d8SLuiz Otavio O Souza 			uint32_t fb_size;
385ae29e2d8SLuiz Otavio O Souza 		} resp;
386ae29e2d8SLuiz Otavio O Souza 	} body;
387ae29e2d8SLuiz Otavio O Souza };
388ae29e2d8SLuiz Otavio O Souza 
389ae29e2d8SLuiz Otavio O Souza #define	BCM2835_MBOX_TAG_RELEASE_BUFFER		0x00048001
390ae29e2d8SLuiz Otavio O Souza 
391ae29e2d8SLuiz Otavio O Souza struct bcm2835_mbox_tag_release_buffer {
392ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_hdr tag_hdr;
393ae29e2d8SLuiz Otavio O Souza 	union {
394ae29e2d8SLuiz Otavio O Souza 		struct {
395ae29e2d8SLuiz Otavio O Souza 		} req;
396ae29e2d8SLuiz Otavio O Souza 		struct {
397ae29e2d8SLuiz Otavio O Souza 		} resp;
398ae29e2d8SLuiz Otavio O Souza 	} body;
399ae29e2d8SLuiz Otavio O Souza };
400ae29e2d8SLuiz Otavio O Souza 
40185645c56SOleksandr Tymoshenko #define	BCM2835_MBOX_TAG_GET_TOUCHBUF		0x0004000f
40285645c56SOleksandr Tymoshenko 
40385645c56SOleksandr Tymoshenko struct bcm2835_mbox_tag_touchbuf {
40485645c56SOleksandr Tymoshenko 	struct bcm2835_mbox_hdr hdr;
40585645c56SOleksandr Tymoshenko 	struct bcm2835_mbox_tag_hdr tag_hdr;
40685645c56SOleksandr Tymoshenko 	union {
40785645c56SOleksandr Tymoshenko 		struct {
40885645c56SOleksandr Tymoshenko 		} req;
40985645c56SOleksandr Tymoshenko 		struct {
41085645c56SOleksandr Tymoshenko 			uint32_t address;
41185645c56SOleksandr Tymoshenko 		} resp;
41285645c56SOleksandr Tymoshenko 	} body;
41385645c56SOleksandr Tymoshenko 	uint32_t end_tag;
41485645c56SOleksandr Tymoshenko };
41585645c56SOleksandr Tymoshenko 
416ae29e2d8SLuiz Otavio O Souza struct bcm2835_fb_config {
417ae29e2d8SLuiz Otavio O Souza 	uint32_t xres;
418ae29e2d8SLuiz Otavio O Souza 	uint32_t yres;
419ae29e2d8SLuiz Otavio O Souza 	uint32_t vxres;
420ae29e2d8SLuiz Otavio O Souza 	uint32_t vyres;
421ae29e2d8SLuiz Otavio O Souza 	uint32_t xoffset;
422ae29e2d8SLuiz Otavio O Souza 	uint32_t yoffset;
423ae29e2d8SLuiz Otavio O Souza 	uint32_t bpp;
424ae29e2d8SLuiz Otavio O Souza 	uint32_t pitch;
425ae29e2d8SLuiz Otavio O Souza 	uint32_t base;
426ae29e2d8SLuiz Otavio O Souza 	uint32_t size;
427ae29e2d8SLuiz Otavio O Souza };
428ae29e2d8SLuiz Otavio O Souza 
429ae29e2d8SLuiz Otavio O Souza struct msg_fb_get_w_h {
430ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_hdr hdr;
431ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_fb_w_h physical_w_h;
432ae29e2d8SLuiz Otavio O Souza 	uint32_t end_tag;
433ae29e2d8SLuiz Otavio O Souza };
434ae29e2d8SLuiz Otavio O Souza 
4358826550bSOleksandr Tymoshenko int bcm2835_mbox_fb_get_w_h(struct bcm2835_fb_config *);
436ae29e2d8SLuiz Otavio O Souza 
437c344416eSOleksandr Tymoshenko struct msg_fb_get_bpp {
438c344416eSOleksandr Tymoshenko 	struct bcm2835_mbox_hdr hdr;
439c344416eSOleksandr Tymoshenko 	struct bcm2835_mbox_tag_depth bpp;
440c344416eSOleksandr Tymoshenko 	uint32_t end_tag;
441c344416eSOleksandr Tymoshenko };
442c344416eSOleksandr Tymoshenko 
443c344416eSOleksandr Tymoshenko int bcm2835_mbox_fb_get_bpp(struct bcm2835_fb_config *);
444c344416eSOleksandr Tymoshenko 
445ae29e2d8SLuiz Otavio O Souza struct msg_fb_setup {
446ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_hdr hdr;
447ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_fb_w_h physical_w_h;
448ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_fb_w_h virtual_w_h;
449ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_virtual_offset offset;
450ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_depth depth;
451ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_alpha_mode alpha;
452ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_allocate_buffer buffer;
453ae29e2d8SLuiz Otavio O Souza 	struct bcm2835_mbox_tag_pitch pitch;
454ae29e2d8SLuiz Otavio O Souza 	uint32_t end_tag;
455ae29e2d8SLuiz Otavio O Souza };
456ae29e2d8SLuiz Otavio O Souza 
4578826550bSOleksandr Tymoshenko int bcm2835_mbox_fb_init(struct bcm2835_fb_config *);
4588826550bSOleksandr Tymoshenko 
4598826550bSOleksandr Tymoshenko int bcm2835_mbox_property(void *, size_t);
460ae29e2d8SLuiz Otavio O Souza 
461b9450e43SRui Paulo #endif /* _BCM2835_MBOX_PROP_H_ */
462