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