1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2012,2015 Stephen Warren 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _BCM2835_MBOX_H 8*4882a593Smuzhiyun #define _BCM2835_MBOX_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/compiler.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun /* 13*4882a593Smuzhiyun * The BCM2835 SoC contains (at least) two CPUs; the VideoCore (a/k/a "GPU") 14*4882a593Smuzhiyun * and the ARM CPU. The ARM CPU is often thought of as the main CPU. 15*4882a593Smuzhiyun * However, the VideoCore actually controls the initial SoC boot, and hides 16*4882a593Smuzhiyun * much of the hardware behind a protocol. This protocol is transported 17*4882a593Smuzhiyun * using the SoC's mailbox hardware module. 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * The mailbox hardware supports passing 32-bit values back and forth. 20*4882a593Smuzhiyun * Presumably by software convention of the firmware, the bottom 4 bits of the 21*4882a593Smuzhiyun * value are used to indicate a logical channel, and the upper 28 bits are the 22*4882a593Smuzhiyun * actual payload. Various channels exist using these simple raw messages. See 23*4882a593Smuzhiyun * https://github.com/raspberrypi/firmware/wiki/Mailboxes for a list. As an 24*4882a593Smuzhiyun * example, the messages on the power management channel are a bitmask of 25*4882a593Smuzhiyun * devices whose power should be enabled. 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * The property mailbox channel passes messages that contain the (16-byte 28*4882a593Smuzhiyun * aligned) ARM physical address of a memory buffer. This buffer is passed to 29*4882a593Smuzhiyun * the VC for processing, is modified in-place by the VC, and the address then 30*4882a593Smuzhiyun * passed back to the ARM CPU as the response mailbox message to indicate 31*4882a593Smuzhiyun * request completion. The buffers have a generic and extensible format; each 32*4882a593Smuzhiyun * buffer contains a standard header, a list of "tags", and a terminating zero 33*4882a593Smuzhiyun * entry. Each tag contains an ID indicating its type, and length fields for 34*4882a593Smuzhiyun * generic parsing. With some limitations, an arbitrary set of tags may be 35*4882a593Smuzhiyun * combined together into a single message buffer. This file defines structs 36*4882a593Smuzhiyun * representing the header and many individual tag layouts and IDs. 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Raw mailbox HW */ 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #ifndef CONFIG_BCM2835 42*4882a593Smuzhiyun #define BCM2835_MBOX_PHYSADDR 0x3f00b880 43*4882a593Smuzhiyun #else 44*4882a593Smuzhiyun #define BCM2835_MBOX_PHYSADDR 0x2000b880 45*4882a593Smuzhiyun #endif 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun struct bcm2835_mbox_regs { 48*4882a593Smuzhiyun u32 read; 49*4882a593Smuzhiyun u32 rsvd0[5]; 50*4882a593Smuzhiyun u32 status; 51*4882a593Smuzhiyun u32 config; 52*4882a593Smuzhiyun u32 write; 53*4882a593Smuzhiyun }; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define BCM2835_MBOX_STATUS_WR_FULL 0x80000000 56*4882a593Smuzhiyun #define BCM2835_MBOX_STATUS_RD_EMPTY 0x40000000 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Lower 4-bits are channel ID */ 59*4882a593Smuzhiyun #define BCM2835_CHAN_MASK 0xf 60*4882a593Smuzhiyun #define BCM2835_MBOX_PACK(chan, data) (((data) & (~BCM2835_CHAN_MASK)) | \ 61*4882a593Smuzhiyun (chan & BCM2835_CHAN_MASK)) 62*4882a593Smuzhiyun #define BCM2835_MBOX_UNPACK_CHAN(val) ((val) & BCM2835_CHAN_MASK) 63*4882a593Smuzhiyun #define BCM2835_MBOX_UNPACK_DATA(val) ((val) & (~BCM2835_CHAN_MASK)) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun /* Property mailbox buffer structures */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define BCM2835_MBOX_PROP_CHAN 8 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* All message buffers must start with this header */ 70*4882a593Smuzhiyun struct bcm2835_mbox_hdr { 71*4882a593Smuzhiyun u32 buf_size; 72*4882a593Smuzhiyun u32 code; 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define BCM2835_MBOX_REQ_CODE 0 76*4882a593Smuzhiyun #define BCM2835_MBOX_RESP_CODE_SUCCESS 0x80000000 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun #define BCM2835_MBOX_INIT_HDR(_m_) { \ 79*4882a593Smuzhiyun memset((_m_), 0, sizeof(*(_m_))); \ 80*4882a593Smuzhiyun (_m_)->hdr.buf_size = sizeof(*(_m_)); \ 81*4882a593Smuzhiyun (_m_)->hdr.code = 0; \ 82*4882a593Smuzhiyun (_m_)->end_tag = 0; \ 83*4882a593Smuzhiyun } 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* 86*4882a593Smuzhiyun * A message buffer contains a list of tags. Each tag must also start with 87*4882a593Smuzhiyun * a standardized header. 88*4882a593Smuzhiyun */ 89*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr { 90*4882a593Smuzhiyun u32 tag; 91*4882a593Smuzhiyun u32 val_buf_size; 92*4882a593Smuzhiyun u32 val_len; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define BCM2835_MBOX_INIT_TAG(_t_, _id_) { \ 96*4882a593Smuzhiyun (_t_)->tag_hdr.tag = BCM2835_MBOX_TAG_##_id_; \ 97*4882a593Smuzhiyun (_t_)->tag_hdr.val_buf_size = sizeof((_t_)->body); \ 98*4882a593Smuzhiyun (_t_)->tag_hdr.val_len = sizeof((_t_)->body.req); \ 99*4882a593Smuzhiyun } 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define BCM2835_MBOX_INIT_TAG_NO_REQ(_t_, _id_) { \ 102*4882a593Smuzhiyun (_t_)->tag_hdr.tag = BCM2835_MBOX_TAG_##_id_; \ 103*4882a593Smuzhiyun (_t_)->tag_hdr.val_buf_size = sizeof((_t_)->body); \ 104*4882a593Smuzhiyun (_t_)->tag_hdr.val_len = 0; \ 105*4882a593Smuzhiyun } 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* When responding, the VC sets this bit in val_len to indicate a response */ 108*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_VAL_LEN_RESPONSE 0x80000000 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* 111*4882a593Smuzhiyun * Below we define the ID and struct for many possible tags. This header only 112*4882a593Smuzhiyun * defines individual tag structs, not entire message structs, since in 113*4882a593Smuzhiyun * general an arbitrary set of tags may be combined into a single message. 114*4882a593Smuzhiyun * Clients of the mbox API are expected to define their own overall message 115*4882a593Smuzhiyun * structures by combining the header, a set of tags, and a terminating 116*4882a593Smuzhiyun * entry. For example, 117*4882a593Smuzhiyun * 118*4882a593Smuzhiyun * struct msg { 119*4882a593Smuzhiyun * struct bcm2835_mbox_hdr hdr; 120*4882a593Smuzhiyun * struct bcm2835_mbox_tag_get_arm_mem get_arm_mem; 121*4882a593Smuzhiyun * ... perhaps other tags here ... 122*4882a593Smuzhiyun * u32 end_tag; 123*4882a593Smuzhiyun * }; 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_BOARD_REV 0x00010002 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_board_rev { 129*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 130*4882a593Smuzhiyun union { 131*4882a593Smuzhiyun struct { 132*4882a593Smuzhiyun } req; 133*4882a593Smuzhiyun struct { 134*4882a593Smuzhiyun u32 rev; 135*4882a593Smuzhiyun } resp; 136*4882a593Smuzhiyun } body; 137*4882a593Smuzhiyun }; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_MAC_ADDRESS 0x00010003 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_mac_address { 142*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 143*4882a593Smuzhiyun union { 144*4882a593Smuzhiyun struct { 145*4882a593Smuzhiyun } req; 146*4882a593Smuzhiyun struct { 147*4882a593Smuzhiyun u8 mac[6]; 148*4882a593Smuzhiyun u8 pad[2]; 149*4882a593Smuzhiyun } resp; 150*4882a593Smuzhiyun } body; 151*4882a593Smuzhiyun }; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_BOARD_SERIAL 0x00010004 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_board_serial { 156*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 157*4882a593Smuzhiyun union { 158*4882a593Smuzhiyun struct __packed { 159*4882a593Smuzhiyun u64 serial; 160*4882a593Smuzhiyun } resp; 161*4882a593Smuzhiyun } body; 162*4882a593Smuzhiyun }; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_ARM_MEMORY 0x00010005 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_arm_mem { 167*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 168*4882a593Smuzhiyun union { 169*4882a593Smuzhiyun struct { 170*4882a593Smuzhiyun } req; 171*4882a593Smuzhiyun struct { 172*4882a593Smuzhiyun u32 mem_base; 173*4882a593Smuzhiyun u32 mem_size; 174*4882a593Smuzhiyun } resp; 175*4882a593Smuzhiyun } body; 176*4882a593Smuzhiyun }; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_SDHCI 0 179*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_UART0 1 180*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_UART1 2 181*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_USB_HCD 3 182*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_I2C0 4 183*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_I2C1 5 184*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_I2C2 6 185*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_SPI 7 186*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_DEVID_CCP2TX 8 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_STATE_RESP_ON (1 << 0) 189*4882a593Smuzhiyun /* Device doesn't exist */ 190*4882a593Smuzhiyun #define BCM2835_MBOX_POWER_STATE_RESP_NODEV (1 << 1) 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_POWER_STATE 0x00020001 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_power_state { 195*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 196*4882a593Smuzhiyun union { 197*4882a593Smuzhiyun struct { 198*4882a593Smuzhiyun u32 device_id; 199*4882a593Smuzhiyun } req; 200*4882a593Smuzhiyun struct { 201*4882a593Smuzhiyun u32 device_id; 202*4882a593Smuzhiyun u32 state; 203*4882a593Smuzhiyun } resp; 204*4882a593Smuzhiyun } body; 205*4882a593Smuzhiyun }; 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_POWER_STATE 0x00028001 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun #define BCM2835_MBOX_SET_POWER_STATE_REQ_ON (1 << 0) 210*4882a593Smuzhiyun #define BCM2835_MBOX_SET_POWER_STATE_REQ_WAIT (1 << 1) 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun struct bcm2835_mbox_tag_set_power_state { 213*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 214*4882a593Smuzhiyun union { 215*4882a593Smuzhiyun struct { 216*4882a593Smuzhiyun u32 device_id; 217*4882a593Smuzhiyun u32 state; 218*4882a593Smuzhiyun } req; 219*4882a593Smuzhiyun struct { 220*4882a593Smuzhiyun u32 device_id; 221*4882a593Smuzhiyun u32 state; 222*4882a593Smuzhiyun } resp; 223*4882a593Smuzhiyun } body; 224*4882a593Smuzhiyun }; 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_CLOCK_RATE 0x00030002 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_EMMC 1 229*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_UART 2 230*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_ARM 3 231*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_CORE 4 232*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_V3D 5 233*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_H264 6 234*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_ISP 7 235*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_SDRAM 8 236*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_PIXEL 9 237*4882a593Smuzhiyun #define BCM2835_MBOX_CLOCK_ID_PWM 10 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_clock_rate { 240*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 241*4882a593Smuzhiyun union { 242*4882a593Smuzhiyun struct { 243*4882a593Smuzhiyun u32 clock_id; 244*4882a593Smuzhiyun } req; 245*4882a593Smuzhiyun struct { 246*4882a593Smuzhiyun u32 clock_id; 247*4882a593Smuzhiyun u32 rate_hz; 248*4882a593Smuzhiyun } resp; 249*4882a593Smuzhiyun } body; 250*4882a593Smuzhiyun }; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_ALLOCATE_BUFFER 0x00040001 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun struct bcm2835_mbox_tag_allocate_buffer { 255*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 256*4882a593Smuzhiyun union { 257*4882a593Smuzhiyun struct { 258*4882a593Smuzhiyun u32 alignment; 259*4882a593Smuzhiyun } req; 260*4882a593Smuzhiyun struct { 261*4882a593Smuzhiyun u32 fb_address; 262*4882a593Smuzhiyun u32 fb_size; 263*4882a593Smuzhiyun } resp; 264*4882a593Smuzhiyun } body; 265*4882a593Smuzhiyun }; 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_RELEASE_BUFFER 0x00048001 268*4882a593Smuzhiyun 269*4882a593Smuzhiyun struct bcm2835_mbox_tag_release_buffer { 270*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 271*4882a593Smuzhiyun union { 272*4882a593Smuzhiyun struct { 273*4882a593Smuzhiyun } req; 274*4882a593Smuzhiyun struct { 275*4882a593Smuzhiyun } resp; 276*4882a593Smuzhiyun } body; 277*4882a593Smuzhiyun }; 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_BLANK_SCREEN 0x00040002 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun struct bcm2835_mbox_tag_blank_screen { 282*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 283*4882a593Smuzhiyun union { 284*4882a593Smuzhiyun struct { 285*4882a593Smuzhiyun /* bit 0 means on, other bots reserved */ 286*4882a593Smuzhiyun u32 state; 287*4882a593Smuzhiyun } req; 288*4882a593Smuzhiyun struct { 289*4882a593Smuzhiyun u32 state; 290*4882a593Smuzhiyun } resp; 291*4882a593Smuzhiyun } body; 292*4882a593Smuzhiyun }; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun /* Physical means output signal */ 295*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_PHYSICAL_W_H 0x00040003 296*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_PHYSICAL_W_H 0x00044003 297*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_PHYSICAL_W_H 0x00048003 298*4882a593Smuzhiyun 299*4882a593Smuzhiyun struct bcm2835_mbox_tag_physical_w_h { 300*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 301*4882a593Smuzhiyun union { 302*4882a593Smuzhiyun /* req not used for get */ 303*4882a593Smuzhiyun struct { 304*4882a593Smuzhiyun u32 width; 305*4882a593Smuzhiyun u32 height; 306*4882a593Smuzhiyun } req; 307*4882a593Smuzhiyun struct { 308*4882a593Smuzhiyun u32 width; 309*4882a593Smuzhiyun u32 height; 310*4882a593Smuzhiyun } resp; 311*4882a593Smuzhiyun } body; 312*4882a593Smuzhiyun }; 313*4882a593Smuzhiyun 314*4882a593Smuzhiyun /* Virtual means display buffer */ 315*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_VIRTUAL_W_H 0x00040004 316*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_VIRTUAL_W_H 0x00044004 317*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_VIRTUAL_W_H 0x00048004 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun struct bcm2835_mbox_tag_virtual_w_h { 320*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 321*4882a593Smuzhiyun union { 322*4882a593Smuzhiyun /* req not used for get */ 323*4882a593Smuzhiyun struct { 324*4882a593Smuzhiyun u32 width; 325*4882a593Smuzhiyun u32 height; 326*4882a593Smuzhiyun } req; 327*4882a593Smuzhiyun struct { 328*4882a593Smuzhiyun u32 width; 329*4882a593Smuzhiyun u32 height; 330*4882a593Smuzhiyun } resp; 331*4882a593Smuzhiyun } body; 332*4882a593Smuzhiyun }; 333*4882a593Smuzhiyun 334*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_DEPTH 0x00040005 335*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_DEPTH 0x00044005 336*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_DEPTH 0x00048005 337*4882a593Smuzhiyun 338*4882a593Smuzhiyun struct bcm2835_mbox_tag_depth { 339*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 340*4882a593Smuzhiyun union { 341*4882a593Smuzhiyun /* req not used for get */ 342*4882a593Smuzhiyun struct { 343*4882a593Smuzhiyun u32 bpp; 344*4882a593Smuzhiyun } req; 345*4882a593Smuzhiyun struct { 346*4882a593Smuzhiyun u32 bpp; 347*4882a593Smuzhiyun } resp; 348*4882a593Smuzhiyun } body; 349*4882a593Smuzhiyun }; 350*4882a593Smuzhiyun 351*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_PIXEL_ORDER 0x00040006 352*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_PIXEL_ORDER 0x00044005 353*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_PIXEL_ORDER 0x00048006 354*4882a593Smuzhiyun 355*4882a593Smuzhiyun #define BCM2835_MBOX_PIXEL_ORDER_BGR 0 356*4882a593Smuzhiyun #define BCM2835_MBOX_PIXEL_ORDER_RGB 1 357*4882a593Smuzhiyun 358*4882a593Smuzhiyun struct bcm2835_mbox_tag_pixel_order { 359*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 360*4882a593Smuzhiyun union { 361*4882a593Smuzhiyun /* req not used for get */ 362*4882a593Smuzhiyun struct { 363*4882a593Smuzhiyun u32 order; 364*4882a593Smuzhiyun } req; 365*4882a593Smuzhiyun struct { 366*4882a593Smuzhiyun u32 order; 367*4882a593Smuzhiyun } resp; 368*4882a593Smuzhiyun } body; 369*4882a593Smuzhiyun }; 370*4882a593Smuzhiyun 371*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_ALPHA_MODE 0x00040007 372*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_ALPHA_MODE 0x00044007 373*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_ALPHA_MODE 0x00048007 374*4882a593Smuzhiyun 375*4882a593Smuzhiyun #define BCM2835_MBOX_ALPHA_MODE_0_OPAQUE 0 376*4882a593Smuzhiyun #define BCM2835_MBOX_ALPHA_MODE_0_TRANSPARENT 1 377*4882a593Smuzhiyun #define BCM2835_MBOX_ALPHA_MODE_IGNORED 2 378*4882a593Smuzhiyun 379*4882a593Smuzhiyun struct bcm2835_mbox_tag_alpha_mode { 380*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 381*4882a593Smuzhiyun union { 382*4882a593Smuzhiyun /* req not used for get */ 383*4882a593Smuzhiyun struct { 384*4882a593Smuzhiyun u32 alpha; 385*4882a593Smuzhiyun } req; 386*4882a593Smuzhiyun struct { 387*4882a593Smuzhiyun u32 alpha; 388*4882a593Smuzhiyun } resp; 389*4882a593Smuzhiyun } body; 390*4882a593Smuzhiyun }; 391*4882a593Smuzhiyun 392*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_PITCH 0x00040008 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun struct bcm2835_mbox_tag_pitch { 395*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 396*4882a593Smuzhiyun union { 397*4882a593Smuzhiyun struct { 398*4882a593Smuzhiyun } req; 399*4882a593Smuzhiyun struct { 400*4882a593Smuzhiyun u32 pitch; 401*4882a593Smuzhiyun } resp; 402*4882a593Smuzhiyun } body; 403*4882a593Smuzhiyun }; 404*4882a593Smuzhiyun 405*4882a593Smuzhiyun /* Offset of display window within buffer */ 406*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_VIRTUAL_OFFSET 0x00040009 407*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_VIRTUAL_OFFSET 0x00044009 408*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_VIRTUAL_OFFSET 0x00048009 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun struct bcm2835_mbox_tag_virtual_offset { 411*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 412*4882a593Smuzhiyun union { 413*4882a593Smuzhiyun /* req not used for get */ 414*4882a593Smuzhiyun struct { 415*4882a593Smuzhiyun u32 x; 416*4882a593Smuzhiyun u32 y; 417*4882a593Smuzhiyun } req; 418*4882a593Smuzhiyun struct { 419*4882a593Smuzhiyun u32 x; 420*4882a593Smuzhiyun u32 y; 421*4882a593Smuzhiyun } resp; 422*4882a593Smuzhiyun } body; 423*4882a593Smuzhiyun }; 424*4882a593Smuzhiyun 425*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_OVERSCAN 0x0004000a 426*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_OVERSCAN 0x0004400a 427*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_OVERSCAN 0x0004800a 428*4882a593Smuzhiyun 429*4882a593Smuzhiyun struct bcm2835_mbox_tag_overscan { 430*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 431*4882a593Smuzhiyun union { 432*4882a593Smuzhiyun /* req not used for get */ 433*4882a593Smuzhiyun struct { 434*4882a593Smuzhiyun u32 top; 435*4882a593Smuzhiyun u32 bottom; 436*4882a593Smuzhiyun u32 left; 437*4882a593Smuzhiyun u32 right; 438*4882a593Smuzhiyun } req; 439*4882a593Smuzhiyun struct { 440*4882a593Smuzhiyun u32 top; 441*4882a593Smuzhiyun u32 bottom; 442*4882a593Smuzhiyun u32 left; 443*4882a593Smuzhiyun u32 right; 444*4882a593Smuzhiyun } resp; 445*4882a593Smuzhiyun } body; 446*4882a593Smuzhiyun }; 447*4882a593Smuzhiyun 448*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_GET_PALETTE 0x0004000b 449*4882a593Smuzhiyun 450*4882a593Smuzhiyun struct bcm2835_mbox_tag_get_palette { 451*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 452*4882a593Smuzhiyun union { 453*4882a593Smuzhiyun struct { 454*4882a593Smuzhiyun } req; 455*4882a593Smuzhiyun struct { 456*4882a593Smuzhiyun u32 data[1024]; 457*4882a593Smuzhiyun } resp; 458*4882a593Smuzhiyun } body; 459*4882a593Smuzhiyun }; 460*4882a593Smuzhiyun 461*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_TEST_PALETTE 0x0004400b 462*4882a593Smuzhiyun 463*4882a593Smuzhiyun struct bcm2835_mbox_tag_test_palette { 464*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 465*4882a593Smuzhiyun union { 466*4882a593Smuzhiyun struct { 467*4882a593Smuzhiyun u32 offset; 468*4882a593Smuzhiyun u32 num_entries; 469*4882a593Smuzhiyun u32 data[256]; 470*4882a593Smuzhiyun } req; 471*4882a593Smuzhiyun struct { 472*4882a593Smuzhiyun u32 is_invalid; 473*4882a593Smuzhiyun } resp; 474*4882a593Smuzhiyun } body; 475*4882a593Smuzhiyun }; 476*4882a593Smuzhiyun 477*4882a593Smuzhiyun #define BCM2835_MBOX_TAG_SET_PALETTE 0x0004800b 478*4882a593Smuzhiyun 479*4882a593Smuzhiyun struct bcm2835_mbox_tag_set_palette { 480*4882a593Smuzhiyun struct bcm2835_mbox_tag_hdr tag_hdr; 481*4882a593Smuzhiyun union { 482*4882a593Smuzhiyun struct { 483*4882a593Smuzhiyun u32 offset; 484*4882a593Smuzhiyun u32 num_entries; 485*4882a593Smuzhiyun u32 data[256]; 486*4882a593Smuzhiyun } req; 487*4882a593Smuzhiyun struct { 488*4882a593Smuzhiyun u32 is_invalid; 489*4882a593Smuzhiyun } resp; 490*4882a593Smuzhiyun } body; 491*4882a593Smuzhiyun }; 492*4882a593Smuzhiyun 493*4882a593Smuzhiyun /* 494*4882a593Smuzhiyun * Pass a raw u32 message to the VC, and receive a raw u32 back. 495*4882a593Smuzhiyun * 496*4882a593Smuzhiyun * Returns 0 for success, any other value for error. 497*4882a593Smuzhiyun */ 498*4882a593Smuzhiyun int bcm2835_mbox_call_raw(u32 chan, u32 send, u32 *recv); 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun /* 501*4882a593Smuzhiyun * Pass a complete property-style buffer to the VC, and wait until it has 502*4882a593Smuzhiyun * been processed. 503*4882a593Smuzhiyun * 504*4882a593Smuzhiyun * This function expects a pointer to the mbox_hdr structure in an attempt 505*4882a593Smuzhiyun * to ensure some degree of type safety. However, some number of tags and 506*4882a593Smuzhiyun * a termination value are expected to immediately follow the header in 507*4882a593Smuzhiyun * memory, as required by the property protocol. 508*4882a593Smuzhiyun * 509*4882a593Smuzhiyun * Each struct bcm2835_mbox_hdr passed must be allocated with 510*4882a593Smuzhiyun * ALLOC_CACHE_ALIGN_BUFFER(x, y, z) to ensure proper cache flush/invalidate. 511*4882a593Smuzhiyun * 512*4882a593Smuzhiyun * Returns 0 for success, any other value for error. 513*4882a593Smuzhiyun */ 514*4882a593Smuzhiyun int bcm2835_mbox_call_prop(u32 chan, struct bcm2835_mbox_hdr *buffer); 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun #endif 517