xref: /netbsd-src/sys/arch/evbarm/rpi/vcprop.h (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /*	$NetBSD: vcprop.h,v 1.16 2017/06/17 17:03:40 jmcneill Exp $	*/
2 
3 /*-
4  * Copyright (c) 2012 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Nick Hudson
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Mailbox property interface
34  */
35 
36 #ifndef	_EVBARM_RPI_VCPROP_H_
37 #define	_EVBARM_RPI_VCPROP_H_
38 
39 #include "opt_vcprop.h"
40 
41 struct vcprop_tag {
42 	uint32_t vpt_tag;
43 #define	VCPROPTAG_NULL			0x00000000
44 #define	VCPROPTAG_GET_FIRMWAREREV	0x00000001
45 #define	VCPROPTAG_GET_BOARDMODEL	0x00010001
46 #define	VCPROPTAG_GET_BOARDREVISION	0x00010002
47 #define	VCPROPTAG_GET_MACADDRESS	0x00010003
48 #define	VCPROPTAG_GET_BOARDSERIAL	0x00010004
49 #define	VCPROPTAG_GET_ARMMEMORY		0x00010005
50 #define	VCPROPTAG_GET_VCMEMORY		0x00010006
51 #define	VCPROPTAG_GET_CLOCKS		0x00010007
52 
53 #define VCPROPTAG_GET_POWERSTATE	0x00020001
54 #define VCPROPTAG_GET_POWERTIMING	0x00020002
55 #define VCPROPTAG_SET_POWERSTATE	0x00028001
56 
57 #define	VCPROPTAG_GET_CLOCKSTATE	0x00030001
58 #define	VCPROPTAG_SET_CLOCKSTATE	0x00038001
59 #define	VCPROPTAG_GET_CLOCKRATE		0x00030002
60 #define	VCPROPTAG_SET_CLOCKRATE		0x00038002
61 #define	VCPROPTAG_GET_MIN_CLOCKRATE	0x00030007
62 #define	VCPROPTAG_GET_MAX_CLOCKRATE	0x00030004
63 #define	VCPROPTAG_GET_TURBO		0x00030009
64 #define	VCPROPTAG_SET_TURBO		0x00038009
65 
66 #define VCPROPTAG_GET_VOLTAGE		0x00030003
67 #define VCPROPTAG_SET_VOLTAGE		0x00038003
68 #define VCPROPTAG_GET_MIN_VOLTAGE	0x00030008
69 #define VCPROPTAG_GET_MAX_VOLTAGE	0x00030005
70 
71 #define VCPROPTAG_GET_TEMPERATURE	0x00030006
72 #define VCPROPTAG_GET_MAX_TEMPERATURE	0x0003000a
73 
74 #define	VCPROPTAG_GET_CMDLINE		0x00050001
75 #define	VCPROPTAG_GET_DMACHAN		0x00060001
76 
77 #define	VCPROPTAG_ALLOCATE_BUFFER	0x00040001
78 #define	VCPROPTAG_BLANK_SCREEN		0x00040002
79 #define	VCPROPTAG_GET_FB_RES		0x00040003
80 #define	VCPROPTAG_SET_FB_RES		0x00048003
81 #define	VCPROPTAG_GET_FB_VRES		0x00040004
82 #define	VCPROPTAG_SET_FB_VRES		0x00048004
83 #define	VCPROPTAG_GET_FB_DEPTH		0x00040005
84 #define	VCPROPTAG_SET_FB_DEPTH		0x00048005
85 #define	VCPROPTAG_GET_FB_PIXEL_ORDER	0x00040006
86 #define	VCPROPTAG_SET_FB_PIXEL_ORDER	0x00048006
87 #define	VCPROPTAG_GET_FB_ALPHA_MODE	0x00040007
88 #define	VCPROPTAG_SET_FB_ALPHA_MODE	0x00048007
89 #define	VCPROPTAG_GET_FB_PITCH		0x00040008
90 
91 #define	VCPROPTAG_GET_EDID_BLOCK	0x00030020
92 
93 #define	VCPROPTAG_ALLOCMEM		0x0003000c
94 #define	VCPROPTAG_LOCKMEM		0x0003000d
95 #define	VCPROPTAG_UNLOCKMEM		0x0003000e
96 #define	VCPROPTAG_RELEASEMEM		0x0003000f
97 #define	VCPROPTAG_EXECUTE_CODE		0x00030010
98 #define	VCPROPTAG_EXECUTE_QPU		0x00030011
99 #define	VCPROPTAG_SET_ENABLE_QPU	0x00030012
100 #define	VCPROPTAG_GET_DISPMANX_HANDLE	0x00030014
101 
102 #define	VCPROPTAG_SET_CURSOR_INFO	0x00008010
103 #define	VCPROPTAG_SET_CURSOR_STATE	0x00008011
104 
105 	uint32_t vpt_len;
106 	uint32_t vpt_rcode;
107 #define	VCPROPTAG_REQUEST	(0U << 31)
108 #define	VCPROPTAG_RESPONSE	(1U << 31)
109 
110 };
111 
112 #define VCPROPTAG_LEN(x) (sizeof((x)) - sizeof(struct vcprop_tag))
113 
114 struct vcprop_memory {
115 	uint32_t base;
116 	uint32_t size;
117 };
118 
119 #define	VCPROP_MAXMEMBLOCKS 4
120 struct vcprop_tag_memory {
121 	struct vcprop_tag tag;
122 	struct vcprop_memory mem[VCPROP_MAXMEMBLOCKS];
123 };
124 
125 struct vcprop_tag_fwrev {
126 	struct vcprop_tag tag;
127 	uint32_t rev;
128 };
129 
130 struct vcprop_tag_boardmodel {
131 	struct vcprop_tag tag;
132 	uint32_t model;
133 } ;
134 
135 struct vcprop_tag_boardrev {
136 	struct vcprop_tag tag;
137 	uint32_t rev;
138 } ;
139 
140 #define	VCPROP_REV_PCBREV	__BITS(3,0)
141 #define	VCPROP_REV_MODEL	__BITS(11,4)
142 #define	 RPI_MODEL_A		0
143 #define	 RPI_MODEL_B		1
144 #define	 RPI_MODEL_A_PLUS	2
145 #define	 RPI_MODEL_B_PLUS	3
146 #define	 RPI_MODEL_B_PI2	4
147 #define	 RPI_MODEL_ALPHA	5
148 #define	 RPI_MODEL_COMPUTE	6
149 #define	 RPI_MODEL_ZERO		7
150 #define	 RPI_MODEL_B_PI3	8
151 #define	 RPI_MODEL_COMPUTE_PI3	9
152 #define	 RPI_MODEL_ZERO_W	10
153 #define	VCPROP_REV_PROCESSOR	__BITS(15,12)
154 #define	 RPI_PROCESSOR_BCM2835	0
155 #define	 RPI_PROCESSOR_BCM2836	1
156 #define	 RPI_PROCESSOR_BCM2837	2
157 #define	VCPROP_REV_MANUF	__BITS(19,16)
158 #define	VCPROP_REV_MEMSIZE	__BITS(22,20)
159 #define	VCPROP_REV_ENCFLAG	__BIT(23)
160 #define	VCPROP_REV_WARRANTY	__BITS(25,24)
161 
162 struct vcprop_tag_macaddr {
163 	struct vcprop_tag tag;
164 	uint64_t addr;
165 } __packed;
166 
167 struct vcprop_tag_boardserial {
168 	struct vcprop_tag tag;
169 	uint64_t sn;
170 } __packed;
171 
172 #define	VCPROP_CLK_EMMC		1
173 #define	VCPROP_CLK_UART		2
174 #define	VCPROP_CLK_ARM		3
175 #define	VCPROP_CLK_CORE		4
176 #define	VCPROP_CLK_V3D		5
177 #define	VCPROP_CLK_H264		6
178 #define	VCPROP_CLK_ISP		7
179 #define	VCPROP_CLK_SDRAM	8
180 #define	VCPROP_CLK_PIXEL	9
181 #define	VCPROP_CLK_PWM		10
182 
183 struct vcprop_clock {
184 	uint32_t pclk;
185 	uint32_t cclk;
186 };
187 
188 #define	VCPROP_MAXCLOCKS 16
189 struct vcprop_tag_clock {
190 	struct vcprop_tag tag;
191 	struct vcprop_clock clk[VCPROP_MAXCLOCKS];
192 };
193 
194 #ifndef	VCPROP_MAXCMDLINE
195 #define	VCPROP_MAXCMDLINE 1024
196 #endif
197 struct vcprop_tag_cmdline {
198 	struct vcprop_tag tag;
199 	uint8_t cmdline[VCPROP_MAXCMDLINE];
200 };
201 
202 struct vcprop_tag_dmachan {
203 	struct vcprop_tag tag;
204 	uint32_t mask;
205 };
206 
207 struct vcprop_tag_clockstate {
208 	struct vcprop_tag tag;
209 	uint32_t id;
210 	uint32_t state;
211 };
212 
213 struct vcprop_tag_clockrate {
214 	struct vcprop_tag tag;
215 	uint32_t id;
216 	uint32_t rate;
217 	uint32_t noturbo;
218 };
219 
220 #define VCPROP_VOLTAGE_CORE	1
221 #define VCPROP_VOLTAGE_SDRAM_C	2
222 #define VCPROP_VOLTAGE_SDRAM_P	3
223 #define VCPROP_VOLTAGE_SDRAM_I	4
224 
225 struct vcprop_tag_voltage {
226 	struct vcprop_tag tag;
227 	uint32_t id;
228 	uint32_t value;
229 };
230 
231 #define VCPROP_TEMP_SOC		0
232 
233 struct vcprop_tag_temperature {
234 	struct vcprop_tag tag;
235 	uint32_t id;
236 	uint32_t value;
237 };
238 
239 #define	VCPROP_POWER_SDCARD	0
240 #define	VCPROP_POWER_UART0	1
241 #define	VCPROP_POWER_UART1	2
242 #define	VCPROP_POWER_USB	3
243 #define	VCPROP_POWER_I2C0	4
244 #define	VCPROP_POWER_I2C1	5
245 #define	VCPROP_POWER_I2C2	6
246 #define	VCPROP_POWER_SPI	7
247 #define	VCPROP_POWER_CCP2TX	8
248 
249 struct vcprop_tag_powertiming {
250 	struct vcprop_tag tag;
251 	uint32_t id;
252 	uint32_t waitusec;
253 };
254 
255 struct vcprop_tag_powerstate {
256 	struct vcprop_tag tag;
257 	uint32_t id;
258 	uint32_t state;
259 };
260 
261 struct vcprop_tag_allocbuf {
262 	struct vcprop_tag tag;
263 	uint32_t address;	/* alignment for request */
264 	uint32_t size;
265 };
266 
267 #define VCPROP_BLANK_OFF	0
268 #define VCPROP_BLANK_ON		1
269 
270 struct vcprop_tag_blankscreen {
271 	struct vcprop_tag tag;
272 	uint32_t state;
273 };
274 
275 struct vcprop_tag_fbres {
276 	struct vcprop_tag tag;
277 	uint32_t width;
278 	uint32_t height;
279 };
280 
281 struct vcprop_tag_fbdepth {
282 	struct vcprop_tag tag;
283 	uint32_t bpp;
284 };
285 
286 #define VCPROP_PIXEL_BGR	0
287 #define VCPROP_PIXEL_RGB	1
288 
289 struct vcprop_tag_fbpixelorder {
290 	struct vcprop_tag tag;
291 	uint32_t state;
292 };
293 
294 struct vcprop_tag_fbpitch {
295 	struct vcprop_tag tag;
296 	uint32_t linebytes;
297 };
298 
299 #define VCPROP_ALPHA_ENABLED	0
300 #define VCPROP_ALPHA_REVERSED	1
301 #define VCPROP_ALPHA_IGNORED	2
302 
303 struct vcprop_tag_fbalpha {
304 	struct vcprop_tag tag;
305 	uint32_t state;
306 };
307 
308 struct vcprop_tag_edidblock {
309 	struct vcprop_tag tag;
310 	uint32_t blockno;
311 	uint32_t status;
312 	uint8_t data[128];
313 };
314 
315 struct vcprop_tag_cursorinfo {
316 	struct vcprop_tag tag;
317 	uint32_t width;
318 	uint32_t height;
319 	uint32_t format;
320 	uint32_t pixels;	/* bus address in VC memory */
321 	uint32_t hotspot_x;
322 	uint32_t hotspot_y;
323 };
324 
325 struct vcprop_tag_cursorstate {
326 	struct vcprop_tag tag;
327 	uint32_t enable;	/* 1 - visible */
328 	uint32_t x;
329 	uint32_t y;
330 	uint32_t flags;		/* 0 - display coord. 1 - fb coord. */
331 };
332 
333 struct vcprop_tag_allocmem {
334 	struct vcprop_tag tag;
335 	uint32_t size;	/* handle returned here */
336 	uint32_t align;
337 	uint32_t flags;
338 /*
339  * flag definitions from
340  * https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface
341  */
342 #define MEM_FLAG_DISCARDABLE	(1 << 0) /* can be resized to 0 at any time. Use for cached data */
343 #define MEM_FLAG_NORMAL		(0 << 2) /* normal allocating alias. Don't use from ARM */
344 #define MEM_FLAG_DIRECT		(1 << 2) /* 0xC alias uncached */
345 #define MEM_FLAG_COHERENT	(2 << 2) /* 0x8 alias. Non-allocating in L2 but coherent */
346 #define MEM_FLAG_L1_NONALLOCATING (MEM_FLAG_DIRECT | MEM_FLAG_COHERENT) /* Allocating in L2 */
347 #define MEM_FLAG_ZERO		(1 << 4)  /* initialise buffer to all zeros */
348 #define MEM_FLAG_NO_INIT	(1 << 5) /* don't initialise (default is initialise to all ones */
349 #define MEM_FLAG_HINT_PERMALOCK	(1 << 6) /* Likely to be locked for long periods of time. */
350 };
351 
352 /* also for unlock and release */
353 struct vcprop_tag_lockmem {
354 	struct vcprop_tag tag;
355 	uint32_t handle;	/* bus address returned here */
356 };
357 
358 struct vcprop_buffer_hdr {
359 	uint32_t vpb_len;
360 	uint32_t vpb_rcode;
361 #define	VCPROP_PROCESS_REQUEST 0
362 #define VCPROP_REQ_SUCCESS	(1U << 31)
363 #define VCPROP_REQ_EPARSE	(1U << 0)
364 };
365 
366 static inline bool
367 vcprop_buffer_success_p(struct vcprop_buffer_hdr *vpbh)
368 {
369 
370 	return (vpbh->vpb_rcode & VCPROP_REQ_SUCCESS);
371 }
372 
373 static inline bool
374 vcprop_tag_success_p(struct vcprop_tag *vpbt)
375 {
376 
377 	return (vpbt->vpt_rcode & VCPROPTAG_RESPONSE);
378 }
379 
380 static inline size_t
381 vcprop_tag_resplen(struct vcprop_tag *vpbt)
382 {
383 
384 	return (vpbt->vpt_rcode & ~VCPROPTAG_RESPONSE);
385 }
386 
387 #endif	/* _EVBARM_RPI_VCPROP_H_ */
388 
389 uint32_t rpi_alloc_mem(uint32_t, uint32_t, uint32_t);
390 bus_addr_t rpi_lock_mem(uint32_t);
391 int rpi_unlock_mem(uint32_t);
392 int rpi_release_mem(uint32_t);
393 
394 int rpi_fb_set_video(int);
395 
396 int rpi_fb_movecursor(int, int, int);
397 int rpi_fb_initcursor(bus_addr_t, int, int);
398