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