1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2022 MediaTek Inc.
4  * Author: Yunfei Dong <yunfei.dong@mediatek.com>
5  */
6 
7 #ifndef _VDEC_H264_REQ_COMMON_H_
8 #define _VDEC_H264_REQ_COMMON_H_
9 
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <media/v4l2-h264.h>
13 #include <media/v4l2-mem2mem.h>
14 #include <media/videobuf2-dma-contig.h>
15 
16 #include "../mtk_vcodec_drv.h"
17 
18 #define NAL_NON_IDR_SLICE			0x01
19 #define NAL_IDR_SLICE				0x05
20 #define NAL_TYPE(value)				((value) & 0x1F)
21 
22 #define BUF_PREDICTION_SZ			(64 * 4096)
23 #define MB_UNIT_LEN				16
24 
25 /* motion vector size (bytes) for every macro block */
26 #define HW_MB_STORE_SZ				64
27 
28 #define H264_MAX_MV_NUM				32
29 
30 /**
31  * struct mtk_h264_dpb_info  - h264 dpb information
32  *
33  * @y_dma_addr:	Y bitstream physical address
34  * @c_dma_addr:	CbCr bitstream physical address
35  * @reference_flag:	reference picture flag (short/long term reference picture)
36  * @field:		field picture flag
37  */
38 struct mtk_h264_dpb_info {
39 	dma_addr_t y_dma_addr;
40 	dma_addr_t c_dma_addr;
41 	int reference_flag;
42 	int field;
43 };
44 
45 /*
46  * struct mtk_h264_sps_param  - parameters for sps
47  */
48 struct mtk_h264_sps_param {
49 	unsigned char chroma_format_idc;
50 	unsigned char bit_depth_luma_minus8;
51 	unsigned char bit_depth_chroma_minus8;
52 	unsigned char log2_max_frame_num_minus4;
53 	unsigned char pic_order_cnt_type;
54 	unsigned char log2_max_pic_order_cnt_lsb_minus4;
55 	unsigned char max_num_ref_frames;
56 	unsigned char separate_colour_plane_flag;
57 	unsigned short pic_width_in_mbs_minus1;
58 	unsigned short pic_height_in_map_units_minus1;
59 	unsigned int max_frame_nums;
60 	unsigned char qpprime_y_zero_transform_bypass_flag;
61 	unsigned char delta_pic_order_always_zero_flag;
62 	unsigned char frame_mbs_only_flag;
63 	unsigned char mb_adaptive_frame_field_flag;
64 	unsigned char direct_8x8_inference_flag;
65 	unsigned char reserved[3];
66 };
67 
68 /*
69  * struct mtk_h264_pps_param  - parameters for pps
70  */
71 struct mtk_h264_pps_param {
72 	unsigned char num_ref_idx_l0_default_active_minus1;
73 	unsigned char num_ref_idx_l1_default_active_minus1;
74 	unsigned char weighted_bipred_idc;
75 	char pic_init_qp_minus26;
76 	char chroma_qp_index_offset;
77 	char second_chroma_qp_index_offset;
78 	unsigned char entropy_coding_mode_flag;
79 	unsigned char pic_order_present_flag;
80 	unsigned char deblocking_filter_control_present_flag;
81 	unsigned char constrained_intra_pred_flag;
82 	unsigned char weighted_pred_flag;
83 	unsigned char redundant_pic_cnt_present_flag;
84 	unsigned char transform_8x8_mode_flag;
85 	unsigned char scaling_matrix_present_flag;
86 	unsigned char reserved[2];
87 };
88 
89 /*
90  * struct mtk_h264_slice_hd_param  - parameters for slice header
91  */
92 struct mtk_h264_slice_hd_param {
93 	unsigned int first_mb_in_slice;
94 	unsigned int field_pic_flag;
95 	unsigned int slice_type;
96 	unsigned int frame_num;
97 	int pic_order_cnt_lsb;
98 	int delta_pic_order_cnt_bottom;
99 	unsigned int bottom_field_flag;
100 	unsigned int direct_spatial_mv_pred_flag;
101 	int delta_pic_order_cnt0;
102 	int delta_pic_order_cnt1;
103 	unsigned int cabac_init_idc;
104 	int slice_qp_delta;
105 	unsigned int disable_deblocking_filter_idc;
106 	int slice_alpha_c0_offset_div2;
107 	int slice_beta_offset_div2;
108 	unsigned int num_ref_idx_l0_active_minus1;
109 	unsigned int num_ref_idx_l1_active_minus1;
110 	unsigned int reserved;
111 };
112 
113 /*
114  * struct slice_api_h264_scaling_matrix  - parameters for scaling list
115  */
116 struct slice_api_h264_scaling_matrix {
117 	unsigned char scaling_list_4x4[6][16];
118 	unsigned char scaling_list_8x8[6][64];
119 };
120 
121 /*
122  * struct slice_h264_dpb_entry  - each dpb information
123  */
124 struct slice_h264_dpb_entry {
125 	unsigned long long reference_ts;
126 	unsigned short frame_num;
127 	unsigned short pic_num;
128 	/* Note that field is indicated by v4l2_buffer.field */
129 	int top_field_order_cnt;
130 	int bottom_field_order_cnt;
131 	unsigned int flags;
132 };
133 
134 /*
135  * struct slice_api_h264_decode_param - parameters for decode.
136  */
137 struct slice_api_h264_decode_param {
138 	struct slice_h264_dpb_entry dpb[V4L2_H264_NUM_DPB_ENTRIES];
139 	unsigned short num_slices;
140 	unsigned short nal_ref_idc;
141 	unsigned char ref_pic_list_p0[32];
142 	unsigned char ref_pic_list_b0[32];
143 	unsigned char ref_pic_list_b1[32];
144 	int top_field_order_cnt;
145 	int bottom_field_order_cnt;
146 	unsigned int flags;
147 };
148 
149 /**
150  * struct h264_fb - h264 decode frame buffer information
151  *
152  * @vdec_fb_va:	virtual address of struct vdec_fb
153  * @y_fb_dma:		dma address of Y frame buffer (luma)
154  * @c_fb_dma:		dma address of C frame buffer (chroma)
155  * @poc:		picture order count of frame buffer
156  * @reserved:		for 8 bytes alignment
157  */
158 struct h264_fb {
159 	u64 vdec_fb_va;
160 	u64 y_fb_dma;
161 	u64 c_fb_dma;
162 	s32 poc;
163 	u32 reserved;
164 };
165 
166 /**
167  * mtk_vdec_h264_get_ref_list - translate V4L2 reference list
168  *
169  * @ref_list:		Mediatek reference picture list
170  * @v4l2_ref_list:	V4L2 reference picture list
171  * @num_valid:		used reference number
172  */
173 void mtk_vdec_h264_get_ref_list(u8 *ref_list,
174 				const struct v4l2_h264_reference *v4l2_ref_list,
175 				int num_valid);
176 
177 /**
178  * mtk_vdec_h264_get_ctrl_ptr - get each CID contrl address.
179  *
180  * @ctx:	v4l2 ctx
181  * @id:	CID control ID
182  *
183  * Return: returns CID ctrl address.
184  */
185 void *mtk_vdec_h264_get_ctrl_ptr(struct mtk_vcodec_ctx *ctx, int id);
186 
187 /**
188  * mtk_vdec_h264_fill_dpb_info - get each CID contrl address.
189  *
190  * @ctx:		v4l2 ctx
191  * @decode_params:	slice decode params
192  * @h264_dpb_info:	dpb buffer information
193  */
194 void mtk_vdec_h264_fill_dpb_info(struct mtk_vcodec_ctx *ctx,
195 				 struct slice_api_h264_decode_param *decode_params,
196 				 struct mtk_h264_dpb_info *h264_dpb_info);
197 
198 /**
199  * mtk_vdec_h264_copy_sps_params - get sps params.
200  *
201  * @dst_param:	sps params for hw decoder
202  * @src_param:	sps params from user driver
203  */
204 void mtk_vdec_h264_copy_sps_params(struct mtk_h264_sps_param *dst_param,
205 				   const struct v4l2_ctrl_h264_sps *src_param);
206 
207 /**
208  * mtk_vdec_h264_copy_pps_params - get pps params.
209  *
210  * @dst_param:	pps params for hw decoder
211  * @src_param:	pps params from user driver
212  */
213 void mtk_vdec_h264_copy_pps_params(struct mtk_h264_pps_param *dst_param,
214 				   const struct v4l2_ctrl_h264_pps *src_param);
215 
216 /**
217  * mtk_vdec_h264_copy_slice_hd_params - get slice header params.
218  *
219  * @dst_param:	slice params for hw decoder
220  * @src_param:	slice params from user driver
221  * @dec_param:	decode params from user driver
222  */
223 void mtk_vdec_h264_copy_slice_hd_params(struct mtk_h264_slice_hd_param *dst_param,
224 					const struct v4l2_ctrl_h264_slice_params *src_param,
225 					const struct v4l2_ctrl_h264_decode_params *dec_param);
226 
227 /**
228  * mtk_vdec_h264_copy_scaling_matrix - get each CID contrl address.
229  *
230  * @dst_matrix:	scaling list params for hw decoder
231  * @src_matrix:	scaling list params from user driver
232  */
233 void mtk_vdec_h264_copy_scaling_matrix(struct slice_api_h264_scaling_matrix *dst_matrix,
234 				       const struct v4l2_ctrl_h264_scaling_matrix *src_matrix);
235 
236 /**
237  * mtk_vdec_h264_copy_decode_params - get decode params.
238  *
239  * @dst_params:	dst params for hw decoder
240  * @src_params:	decode params from user driver
241  * @dpb:		dpb information
242  */
243 void
244 mtk_vdec_h264_copy_decode_params(struct slice_api_h264_decode_param *dst_params,
245 				 const struct v4l2_ctrl_h264_decode_params *src_params,
246 				 const struct v4l2_h264_dpb_entry dpb[V4L2_H264_NUM_DPB_ENTRIES]);
247 
248 /**
249  * mtk_vdec_h264_update_dpb - updata dpb list.
250  *
251  * @dec_param:	v4l2 control decode params
252  * @dpb:	dpb entry informaton
253  */
254 void mtk_vdec_h264_update_dpb(const struct v4l2_ctrl_h264_decode_params *dec_param,
255 			      struct v4l2_h264_dpb_entry *dpb);
256 
257 /**
258  * mtk_vdec_h264_find_start_code - find h264 start code using sofeware.
259  *
260  * @data:	input buffer address
261  * @data_sz:	input buffer size
262  *
263  * Return: returns start code position.
264  */
265 int mtk_vdec_h264_find_start_code(unsigned char *data, unsigned int data_sz);
266 
267 /**
268  * mtk_vdec_h264_get_mv_buf_size - get mv buffer size.
269  *
270  * @width:	picture width
271  * @height:	picture height
272  *
273  * Return: returns mv buffer size.
274  */
275 unsigned int mtk_vdec_h264_get_mv_buf_size(unsigned int width, unsigned int height);
276 
277 #endif
278