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