1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2016 MediaTek Inc. 4 * Author: Jungchang Tsao <jungchang.tsao@mediatek.com> 5 * Daniel Hsiao <daniel.hsiao@mediatek.com> 6 * Tiffany Lin <tiffany.lin@mediatek.com> 7 */ 8 9 #ifndef _VENC_IPI_MSG_H_ 10 #define _VENC_IPI_MSG_H_ 11 12 #define AP_IPIMSG_VENC_BASE 0xC000 13 #define VPU_IPIMSG_VENC_BASE 0xD000 14 15 /* 16 * enum venc_ipi_msg_id - message id between AP and VPU 17 * (ipi stands for inter-processor interrupt) 18 * @AP_IPIMSG_ENC_XXX: AP to VPU cmd message id 19 * @VPU_IPIMSG_ENC_XXX_DONE: VPU ack AP cmd message id 20 */ 21 enum venc_ipi_msg_id { 22 AP_IPIMSG_ENC_INIT = AP_IPIMSG_VENC_BASE, 23 AP_IPIMSG_ENC_SET_PARAM, 24 AP_IPIMSG_ENC_ENCODE, 25 AP_IPIMSG_ENC_DEINIT, 26 27 VPU_IPIMSG_ENC_INIT_DONE = VPU_IPIMSG_VENC_BASE, 28 VPU_IPIMSG_ENC_SET_PARAM_DONE, 29 VPU_IPIMSG_ENC_ENCODE_DONE, 30 VPU_IPIMSG_ENC_DEINIT_DONE, 31 }; 32 33 /** 34 * struct venc_ap_ipi_msg_init - AP to VPU init cmd structure 35 * @msg_id: message id (AP_IPIMSG_XXX_ENC_INIT) 36 * @reserved: reserved for future use. vpu is running in 32bit. Without 37 * this reserved field, if kernel run in 64bit. this struct size 38 * will be different between kernel and vpu 39 * @venc_inst: AP encoder instance 40 * (struct venc_vp8_inst/venc_h264_inst *) 41 */ 42 struct venc_ap_ipi_msg_init { 43 uint32_t msg_id; 44 uint32_t reserved; 45 uint64_t venc_inst; 46 }; 47 48 /** 49 * struct venc_ap_ipi_msg_set_param - AP to VPU set_param cmd structure 50 * @msg_id: message id (AP_IPIMSG_XXX_ENC_SET_PARAM) 51 * @vpu_inst_addr: VPU encoder instance addr 52 * (struct venc_vp8_vsi/venc_h264_vsi *) 53 * @param_id: parameter id (venc_set_param_type) 54 * @data_item: number of items in the data array 55 * @data: data array to store the set parameters 56 */ 57 struct venc_ap_ipi_msg_set_param { 58 uint32_t msg_id; 59 uint32_t vpu_inst_addr; 60 uint32_t param_id; 61 uint32_t data_item; 62 uint32_t data[8]; 63 }; 64 65 struct venc_ap_ipi_msg_set_param_ext { 66 struct venc_ap_ipi_msg_set_param base; 67 uint32_t data_ext[24]; 68 }; 69 70 /** 71 * struct venc_ap_ipi_msg_enc - AP to VPU enc cmd structure 72 * @msg_id: message id (AP_IPIMSG_XXX_ENC_ENCODE) 73 * @vpu_inst_addr: VPU encoder instance addr 74 * (struct venc_vp8_vsi/venc_h264_vsi *) 75 * @bs_mode: bitstream mode for h264 76 * (H264_BS_MODE_SPS/H264_BS_MODE_PPS/H264_BS_MODE_FRAME) 77 * @input_addr: pointer to input image buffer plane 78 * @bs_addr: pointer to output bit stream buffer 79 * @bs_size: bit stream buffer size 80 */ 81 struct venc_ap_ipi_msg_enc { 82 uint32_t msg_id; 83 uint32_t vpu_inst_addr; 84 uint32_t bs_mode; 85 uint32_t input_addr[3]; 86 uint32_t bs_addr; 87 uint32_t bs_size; 88 }; 89 90 /** 91 * struct venc_ap_ipi_msg_enc_ext - AP to SCP extended enc cmd structure 92 * 93 * @base: base msg structure 94 * @data_item: number of items in the data array 95 * @data: data array to store the set parameters 96 */ 97 struct venc_ap_ipi_msg_enc_ext { 98 struct venc_ap_ipi_msg_enc base; 99 uint32_t data_item; 100 uint32_t data[32]; 101 }; 102 103 /** 104 * struct venc_ap_ipi_msg_enc_ext_34 - AP to SCP extended enc cmd structure 105 * @msg_id: message id (AP_IPIMSG_XXX_ENC_ENCODE) 106 * @vpu_inst_addr: VPU encoder instance addr 107 * @bs_mode: bitstream mode for h264 108 * @reserved: for struct padding 109 * @input_addr: input frame buffer 34 bit address 110 * @bs_addr: output bitstream buffer 34 bit address 111 * @bs_size: bitstream buffer size 112 * @data_item: number of items in the data array 113 * @data: data array to store the set parameters 114 */ 115 struct venc_ap_ipi_msg_enc_ext_34 { 116 u32 msg_id; 117 u32 vpu_inst_addr; 118 u32 bs_mode; 119 u32 reserved; 120 u64 input_addr[3]; 121 u64 bs_addr; 122 u32 bs_size; 123 u32 data_item; 124 u32 data[32]; 125 }; 126 127 /** 128 * struct venc_ap_ipi_msg_deinit - AP to VPU deinit cmd structure 129 * @msg_id: message id (AP_IPIMSG_XXX_ENC_DEINIT) 130 * @vpu_inst_addr: VPU encoder instance addr 131 * (struct venc_vp8_vsi/venc_h264_vsi *) 132 */ 133 struct venc_ap_ipi_msg_deinit { 134 uint32_t msg_id; 135 uint32_t vpu_inst_addr; 136 }; 137 138 /* 139 * enum venc_ipi_msg_status - VPU ack AP cmd status 140 */ 141 enum venc_ipi_msg_status { 142 VENC_IPI_MSG_STATUS_OK, 143 VENC_IPI_MSG_STATUS_FAIL, 144 }; 145 146 /** 147 * struct venc_vpu_ipi_msg_common - VPU ack AP cmd common structure 148 * @msg_id: message id (VPU_IPIMSG_XXX_DONE) 149 * @status: cmd status (venc_ipi_msg_status) 150 * @venc_inst: AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 151 */ 152 struct venc_vpu_ipi_msg_common { 153 uint32_t msg_id; 154 uint32_t status; 155 uint64_t venc_inst; 156 }; 157 158 /** 159 * struct venc_vpu_ipi_msg_init - VPU ack AP init cmd structure 160 * @msg_id: message id (VPU_IPIMSG_XXX_ENC_SET_PARAM_DONE) 161 * @status: cmd status (venc_ipi_msg_status) 162 * @venc_inst: AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 163 * @vpu_inst_addr: VPU encoder instance addr 164 * (struct venc_vp8_vsi/venc_h264_vsi *) 165 * @venc_abi_version: ABI version of the firmware. Kernel can use it to 166 * ensure that it is compatible with the firmware. 167 * For MT8173 the value of this field is undefined and 168 * should not be used. 169 */ 170 struct venc_vpu_ipi_msg_init { 171 uint32_t msg_id; 172 uint32_t status; 173 uint64_t venc_inst; 174 uint32_t vpu_inst_addr; 175 uint32_t venc_abi_version; 176 }; 177 178 /** 179 * struct venc_vpu_ipi_msg_set_param - VPU ack AP set_param cmd structure 180 * @msg_id: message id (VPU_IPIMSG_XXX_ENC_SET_PARAM_DONE) 181 * @status: cmd status (venc_ipi_msg_status) 182 * @venc_inst: AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 183 * @param_id: parameter id (venc_set_param_type) 184 * @data_item: number of items in the data array 185 * @data: data array to store the return result 186 */ 187 struct venc_vpu_ipi_msg_set_param { 188 uint32_t msg_id; 189 uint32_t status; 190 uint64_t venc_inst; 191 uint32_t param_id; 192 uint32_t data_item; 193 uint32_t data[6]; 194 }; 195 196 /** 197 * enum venc_ipi_msg_enc_state - Type of encode state 198 * @VEN_IPI_MSG_ENC_STATE_FRAME: one frame being encoded 199 * @VEN_IPI_MSG_ENC_STATE_PART: bit stream buffer full 200 * @VEN_IPI_MSG_ENC_STATE_SKIP: encoded skip frame 201 * @VEN_IPI_MSG_ENC_STATE_ERROR: encounter error 202 */ 203 enum venc_ipi_msg_enc_state { 204 VEN_IPI_MSG_ENC_STATE_FRAME, 205 VEN_IPI_MSG_ENC_STATE_PART, 206 VEN_IPI_MSG_ENC_STATE_SKIP, 207 VEN_IPI_MSG_ENC_STATE_ERROR, 208 }; 209 210 /** 211 * struct venc_vpu_ipi_msg_enc - VPU ack AP enc cmd structure 212 * @msg_id: message id (VPU_IPIMSG_XXX_ENC_ENCODE_DONE) 213 * @status: cmd status (venc_ipi_msg_status) 214 * @venc_inst: AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 215 * @state: encode state (venc_ipi_msg_enc_state) 216 * @is_key_frm: whether the encoded frame is key frame 217 * @bs_size: encoded bitstream size 218 * @reserved: reserved for future use. vpu is running in 32bit. Without 219 * this reserved field, if kernel run in 64bit. this struct size 220 * will be different between kernel and vpu 221 */ 222 struct venc_vpu_ipi_msg_enc { 223 uint32_t msg_id; 224 uint32_t status; 225 uint64_t venc_inst; 226 uint32_t state; 227 uint32_t is_key_frm; 228 uint32_t bs_size; 229 uint32_t reserved; 230 }; 231 232 /** 233 * struct venc_vpu_ipi_msg_deinit - VPU ack AP deinit cmd structure 234 * @msg_id: message id (VPU_IPIMSG_XXX_ENC_DEINIT_DONE) 235 * @status: cmd status (venc_ipi_msg_status) 236 * @venc_inst: AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 237 */ 238 struct venc_vpu_ipi_msg_deinit { 239 uint32_t msg_id; 240 uint32_t status; 241 uint64_t venc_inst; 242 }; 243 244 #endif /* _VENC_IPI_MSG_H_ */ 245