xref: /netbsd-src/sys/arch/evbarm/rpi/vcprop.h (revision cef8759bd76c1b621f8eab8faa6f208faabc2e15)
1 /*	$NetBSD: vcprop.h,v 1.17 2019/12/30 15:58:12 skrll 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 #define	VCPROP_CLK_EMMC2	12
183 
184 struct vcprop_clock {
185 	uint32_t pclk;
186 	uint32_t cclk;
187 };
188 
189 #define	VCPROP_MAXCLOCKS 16
190 struct vcprop_tag_clock {
191 	struct vcprop_tag tag;
192 	struct vcprop_clock clk[VCPROP_MAXCLOCKS];
193 };
194 
195 #ifndef	VCPROP_MAXCMDLINE
196 #define	VCPROP_MAXCMDLINE 1024
197 #endif
198 struct vcprop_tag_cmdline {
199 	struct vcprop_tag tag;
200 	uint8_t cmdline[VCPROP_MAXCMDLINE];
201 };
202 
203 struct vcprop_tag_dmachan {
204 	struct vcprop_tag tag;
205 	uint32_t mask;
206 };
207 
208 struct vcprop_tag_clockstate {
209 	struct vcprop_tag tag;
210 	uint32_t id;
211 	uint32_t state;
212 };
213 
214 struct vcprop_tag_clockrate {
215 	struct vcprop_tag tag;
216 	uint32_t id;
217 	uint32_t rate;
218 	uint32_t noturbo;
219 };
220 
221 #define VCPROP_VOLTAGE_CORE	1
222 #define VCPROP_VOLTAGE_SDRAM_C	2
223 #define VCPROP_VOLTAGE_SDRAM_P	3
224 #define VCPROP_VOLTAGE_SDRAM_I	4
225 
226 struct vcprop_tag_voltage {
227 	struct vcprop_tag tag;
228 	uint32_t id;
229 	uint32_t value;
230 };
231 
232 #define VCPROP_TEMP_SOC		0
233 
234 struct vcprop_tag_temperature {
235 	struct vcprop_tag tag;
236 	uint32_t id;
237 	uint32_t value;
238 };
239 
240 #define	VCPROP_POWER_SDCARD	0
241 #define	VCPROP_POWER_UART0	1
242 #define	VCPROP_POWER_UART1	2
243 #define	VCPROP_POWER_USB	3
244 #define	VCPROP_POWER_I2C0	4
245 #define	VCPROP_POWER_I2C1	5
246 #define	VCPROP_POWER_I2C2	6
247 #define	VCPROP_POWER_SPI	7
248 #define	VCPROP_POWER_CCP2TX	8
249 
250 struct vcprop_tag_powertiming {
251 	struct vcprop_tag tag;
252 	uint32_t id;
253 	uint32_t waitusec;
254 };
255 
256 struct vcprop_tag_powerstate {
257 	struct vcprop_tag tag;
258 	uint32_t id;
259 	uint32_t state;
260 };
261 
262 struct vcprop_tag_allocbuf {
263 	struct vcprop_tag tag;
264 	uint32_t address;	/* alignment for request */
265 	uint32_t size;
266 };
267 
268 #define VCPROP_BLANK_OFF	0
269 #define VCPROP_BLANK_ON		1
270 
271 struct vcprop_tag_blankscreen {
272 	struct vcprop_tag tag;
273 	uint32_t state;
274 };
275 
276 struct vcprop_tag_fbres {
277 	struct vcprop_tag tag;
278 	uint32_t width;
279 	uint32_t height;
280 };
281 
282 struct vcprop_tag_fbdepth {
283 	struct vcprop_tag tag;
284 	uint32_t bpp;
285 };
286 
287 #define VCPROP_PIXEL_BGR	0
288 #define VCPROP_PIXEL_RGB	1
289 
290 struct vcprop_tag_fbpixelorder {
291 	struct vcprop_tag tag;
292 	uint32_t state;
293 };
294 
295 struct vcprop_tag_fbpitch {
296 	struct vcprop_tag tag;
297 	uint32_t linebytes;
298 };
299 
300 #define VCPROP_ALPHA_ENABLED	0
301 #define VCPROP_ALPHA_REVERSED	1
302 #define VCPROP_ALPHA_IGNORED	2
303 
304 struct vcprop_tag_fbalpha {
305 	struct vcprop_tag tag;
306 	uint32_t state;
307 };
308 
309 struct vcprop_tag_edidblock {
310 	struct vcprop_tag tag;
311 	uint32_t blockno;
312 	uint32_t status;
313 	uint8_t data[128];
314 };
315 
316 struct vcprop_tag_cursorinfo {
317 	struct vcprop_tag tag;
318 	uint32_t width;
319 	uint32_t height;
320 	uint32_t format;
321 	uint32_t pixels;	/* bus address in VC memory */
322 	uint32_t hotspot_x;
323 	uint32_t hotspot_y;
324 };
325 
326 struct vcprop_tag_cursorstate {
327 	struct vcprop_tag tag;
328 	uint32_t enable;	/* 1 - visible */
329 	uint32_t x;
330 	uint32_t y;
331 	uint32_t flags;		/* 0 - display coord. 1 - fb coord. */
332 };
333 
334 struct vcprop_tag_allocmem {
335 	struct vcprop_tag tag;
336 	uint32_t size;	/* handle returned here */
337 	uint32_t align;
338 	uint32_t flags;
339 /*
340  * flag definitions from
341  * https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface
342  */
343 #define MEM_FLAG_DISCARDABLE	(1 << 0) /* can be resized to 0 at any time. Use for cached data */
344 #define MEM_FLAG_NORMAL		(0 << 2) /* normal allocating alias. Don't use from ARM */
345 #define MEM_FLAG_DIRECT		(1 << 2) /* 0xC alias uncached */
346 #define MEM_FLAG_COHERENT	(2 << 2) /* 0x8 alias. Non-allocating in L2 but coherent */
347 #define MEM_FLAG_L1_NONALLOCATING (MEM_FLAG_DIRECT | MEM_FLAG_COHERENT) /* Allocating in L2 */
348 #define MEM_FLAG_ZERO		(1 << 4)  /* initialise buffer to all zeros */
349 #define MEM_FLAG_NO_INIT	(1 << 5) /* don't initialise (default is initialise to all ones */
350 #define MEM_FLAG_HINT_PERMALOCK	(1 << 6) /* Likely to be locked for long periods of time. */
351 };
352 
353 /* also for unlock and release */
354 struct vcprop_tag_lockmem {
355 	struct vcprop_tag tag;
356 	uint32_t handle;	/* bus address returned here */
357 };
358 
359 struct vcprop_buffer_hdr {
360 	uint32_t vpb_len;
361 	uint32_t vpb_rcode;
362 #define	VCPROP_PROCESS_REQUEST 0
363 #define VCPROP_REQ_SUCCESS	(1U << 31)
364 #define VCPROP_REQ_EPARSE	(1U << 0)
365 };
366 
367 static inline bool
368 vcprop_buffer_success_p(struct vcprop_buffer_hdr *vpbh)
369 {
370 
371 	return (vpbh->vpb_rcode & VCPROP_REQ_SUCCESS);
372 }
373 
374 static inline bool
375 vcprop_tag_success_p(struct vcprop_tag *vpbt)
376 {
377 
378 	return (vpbt->vpt_rcode & VCPROPTAG_RESPONSE);
379 }
380 
381 static inline size_t
382 vcprop_tag_resplen(struct vcprop_tag *vpbt)
383 {
384 
385 	return (vpbt->vpt_rcode & ~VCPROPTAG_RESPONSE);
386 }
387 
388 #endif	/* _EVBARM_RPI_VCPROP_H_ */
389 
390 uint32_t rpi_alloc_mem(uint32_t, uint32_t, uint32_t);
391 bus_addr_t rpi_lock_mem(uint32_t);
392 int rpi_unlock_mem(uint32_t);
393 int rpi_release_mem(uint32_t);
394 
395 int rpi_fb_set_video(int);
396 
397 int rpi_fb_movecursor(int, int, int);
398 int rpi_fb_initcursor(bus_addr_t, int, int);
399