^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright © 2015 Broadcom
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef __SOC_RASPBERRY_FIRMWARE_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define __SOC_RASPBERRY_FIRMWARE_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct rpi_firmware;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) enum rpi_firmware_property_status {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) RPI_FIRMWARE_STATUS_REQUEST = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) RPI_FIRMWARE_STATUS_SUCCESS = 0x80000000,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) RPI_FIRMWARE_STATUS_ERROR = 0x80000001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * struct rpi_firmware_property_tag_header - Firmware property tag header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * @tag: One of enum_mbox_property_tag.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * @buf_size: The number of bytes in the value buffer following this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * struct.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * @req_resp_size: On submit, the length of the request (though it doesn't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * appear to be currently used by the firmware). On return,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * the length of the response (always 4 byte aligned), with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * the low bit set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) struct rpi_firmware_property_tag_header {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) u32 tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) u32 buf_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) u32 req_resp_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) enum rpi_firmware_property_tag {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) RPI_FIRMWARE_PROPERTY_END = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) RPI_FIRMWARE_GET_FIRMWARE_REVISION = 0x00000001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) RPI_FIRMWARE_SET_CURSOR_INFO = 0x00008010,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) RPI_FIRMWARE_SET_CURSOR_STATE = 0x00008011,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) RPI_FIRMWARE_GET_BOARD_MODEL = 0x00010001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) RPI_FIRMWARE_GET_BOARD_REVISION = 0x00010002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) RPI_FIRMWARE_GET_BOARD_MAC_ADDRESS = 0x00010003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) RPI_FIRMWARE_GET_BOARD_SERIAL = 0x00010004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) RPI_FIRMWARE_GET_ARM_MEMORY = 0x00010005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) RPI_FIRMWARE_GET_VC_MEMORY = 0x00010006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) RPI_FIRMWARE_GET_CLOCKS = 0x00010007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) RPI_FIRMWARE_GET_POWER_STATE = 0x00020001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) RPI_FIRMWARE_GET_TIMING = 0x00020002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) RPI_FIRMWARE_SET_POWER_STATE = 0x00028001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) RPI_FIRMWARE_GET_CLOCK_STATE = 0x00030001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) RPI_FIRMWARE_GET_CLOCK_RATE = 0x00030002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) RPI_FIRMWARE_GET_VOLTAGE = 0x00030003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) RPI_FIRMWARE_GET_MAX_CLOCK_RATE = 0x00030004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) RPI_FIRMWARE_GET_MAX_VOLTAGE = 0x00030005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) RPI_FIRMWARE_GET_TEMPERATURE = 0x00030006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) RPI_FIRMWARE_GET_MIN_CLOCK_RATE = 0x00030007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) RPI_FIRMWARE_GET_MIN_VOLTAGE = 0x00030008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) RPI_FIRMWARE_GET_TURBO = 0x00030009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) RPI_FIRMWARE_GET_MAX_TEMPERATURE = 0x0003000a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) RPI_FIRMWARE_GET_STC = 0x0003000b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) RPI_FIRMWARE_ALLOCATE_MEMORY = 0x0003000c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) RPI_FIRMWARE_LOCK_MEMORY = 0x0003000d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) RPI_FIRMWARE_UNLOCK_MEMORY = 0x0003000e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) RPI_FIRMWARE_RELEASE_MEMORY = 0x0003000f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) RPI_FIRMWARE_EXECUTE_CODE = 0x00030010,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) RPI_FIRMWARE_EXECUTE_QPU = 0x00030011,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) RPI_FIRMWARE_SET_ENABLE_QPU = 0x00030012,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 0x00030014,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) RPI_FIRMWARE_GET_EDID_BLOCK = 0x00030020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) RPI_FIRMWARE_GET_CUSTOMER_OTP = 0x00030021,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) RPI_FIRMWARE_GET_DOMAIN_STATE = 0x00030030,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) RPI_FIRMWARE_GET_THROTTLED = 0x00030046,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) RPI_FIRMWARE_GET_CLOCK_MEASURED = 0x00030047,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) RPI_FIRMWARE_NOTIFY_REBOOT = 0x00030048,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) RPI_FIRMWARE_SET_CLOCK_STATE = 0x00038001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) RPI_FIRMWARE_SET_CLOCK_RATE = 0x00038002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) RPI_FIRMWARE_SET_VOLTAGE = 0x00038003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) RPI_FIRMWARE_SET_TURBO = 0x00038009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) RPI_FIRMWARE_SET_CUSTOMER_OTP = 0x00038021,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) RPI_FIRMWARE_SET_DOMAIN_STATE = 0x00038030,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) RPI_FIRMWARE_GET_GPIO_STATE = 0x00030041,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) RPI_FIRMWARE_SET_GPIO_STATE = 0x00038041,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) RPI_FIRMWARE_SET_SDHOST_CLOCK = 0x00038042,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) RPI_FIRMWARE_GET_GPIO_CONFIG = 0x00030043,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) RPI_FIRMWARE_SET_GPIO_CONFIG = 0x00038043,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) RPI_FIRMWARE_GET_PERIPH_REG = 0x00030045,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) RPI_FIRMWARE_SET_PERIPH_REG = 0x00038045,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) RPI_FIRMWARE_GET_POE_HAT_VAL = 0x00030049,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) RPI_FIRMWARE_SET_POE_HAT_VAL = 0x00030050,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) RPI_FIRMWARE_NOTIFY_XHCI_RESET = 0x00030058,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* Dispmanx TAGS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) RPI_FIRMWARE_FRAMEBUFFER_BLANK = 0x00040002,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) RPI_FIRMWARE_FRAMEBUFFER_GET_PHYSICAL_WIDTH_HEIGHT = 0x00040003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_WIDTH_HEIGHT = 0x00040004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) RPI_FIRMWARE_FRAMEBUFFER_GET_DEPTH = 0x00040005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) RPI_FIRMWARE_FRAMEBUFFER_GET_PIXEL_ORDER = 0x00040006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) RPI_FIRMWARE_FRAMEBUFFER_GET_ALPHA_MODE = 0x00040007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH = 0x00040008,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) RPI_FIRMWARE_FRAMEBUFFER_GET_VIRTUAL_OFFSET = 0x00040009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) RPI_FIRMWARE_FRAMEBUFFER_GET_OVERSCAN = 0x0004000a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) RPI_FIRMWARE_FRAMEBUFFER_GET_PALETTE = 0x0004000b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) RPI_FIRMWARE_FRAMEBUFFER_GET_TOUCHBUF = 0x0004000f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) RPI_FIRMWARE_FRAMEBUFFER_GET_GPIOVIRTBUF = 0x00040010,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) RPI_FIRMWARE_FRAMEBUFFER_RELEASE = 0x00048001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) RPI_FIRMWARE_FRAMEBUFFER_TEST_PHYSICAL_WIDTH_HEIGHT = 0x00044003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_WIDTH_HEIGHT = 0x00044004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) RPI_FIRMWARE_FRAMEBUFFER_TEST_DEPTH = 0x00044005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) RPI_FIRMWARE_FRAMEBUFFER_TEST_PIXEL_ORDER = 0x00044006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) RPI_FIRMWARE_FRAMEBUFFER_TEST_ALPHA_MODE = 0x00044007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) RPI_FIRMWARE_FRAMEBUFFER_TEST_VIRTUAL_OFFSET = 0x00044009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) RPI_FIRMWARE_FRAMEBUFFER_TEST_OVERSCAN = 0x0004400a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) RPI_FIRMWARE_FRAMEBUFFER_TEST_PALETTE = 0x0004400b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) RPI_FIRMWARE_FRAMEBUFFER_TEST_VSYNC = 0x0004400e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) RPI_FIRMWARE_FRAMEBUFFER_SET_PHYSICAL_WIDTH_HEIGHT = 0x00048003,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_WIDTH_HEIGHT = 0x00048004,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 0x00048005,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER = 0x00048006,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE = 0x00048007,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) RPI_FIRMWARE_FRAMEBUFFER_SET_TOUCHBUF = 0x0004801f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) RPI_FIRMWARE_FRAMEBUFFER_SET_GPIOVIRTBUF = 0x00048020,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) RPI_FIRMWARE_FRAMEBUFFER_SET_VSYNC = 0x0004800e,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) RPI_FIRMWARE_FRAMEBUFFER_SET_BACKLIGHT = 0x0004800f,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) RPI_FIRMWARE_VCHIQ_INIT = 0x00048010,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) RPI_FIRMWARE_GET_COMMAND_LINE = 0x00050001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) RPI_FIRMWARE_GET_DMA_CHANNELS = 0x00060001,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #if IS_ENABLED(CONFIG_RASPBERRYPI_FIRMWARE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) int rpi_firmware_property(struct rpi_firmware *fw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) u32 tag, void *data, size_t len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) int rpi_firmware_property_list(struct rpi_firmware *fw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) void *data, size_t tag_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) void rpi_firmware_put(struct rpi_firmware *fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) static inline int rpi_firmware_property(struct rpi_firmware *fw, u32 tag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) void *data, size_t len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) static inline int rpi_firmware_property_list(struct rpi_firmware *fw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) void *data, size_t tag_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static inline void rpi_firmware_put(struct rpi_firmware *fw) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static inline struct rpi_firmware *rpi_firmware_get(struct device_node *firmware_node)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #endif /* __SOC_RASPBERRY_FIRMWARE_H__ */