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