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