1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr.h
4  *
5  * Header file for Samsung MFC (Multi Function Codec - FIMV) driver
6  * Contains declarations of hw related functions.
7  *
8  * Kamil Debski, Copyright (C) 2012 Samsung Electronics Co., Ltd.
9  * http://www.samsung.com/
10  */
11 
12 #ifndef S5P_MFC_OPR_H_
13 #define S5P_MFC_OPR_H_
14 
15 #include "s5p_mfc_common.h"
16 
17 struct s5p_mfc_regs {
18 
19 	/* codec common registers */
20 	void __iomem *risc_on;
21 	void __iomem *risc2host_int;
22 	void __iomem *host2risc_int;
23 	void __iomem *risc_base_address;
24 	void __iomem *mfc_reset;
25 	void __iomem *host2risc_command;
26 	void __iomem *risc2host_command;
27 	void __iomem *mfc_bus_reset_ctrl;
28 	void __iomem *firmware_version;
29 	void __iomem *instance_id;
30 	void __iomem *codec_type;
31 	void __iomem *context_mem_addr;
32 	void __iomem *context_mem_size;
33 	void __iomem *pixel_format;
34 	void __iomem *metadata_enable;
35 	void __iomem *mfc_version;
36 	void __iomem *dbg_info_enable;
37 	void __iomem *dbg_buffer_addr;
38 	void __iomem *dbg_buffer_size;
39 	void __iomem *hed_control;
40 	void __iomem *mfc_timeout_value;
41 	void __iomem *hed_shared_mem_addr;
42 	void __iomem *dis_shared_mem_addr;/* only v7 */
43 	void __iomem *ret_instance_id;
44 	void __iomem *error_code;
45 	void __iomem *dbg_buffer_output_size;
46 	void __iomem *metadata_status;
47 	void __iomem *metadata_addr_mb_info;
48 	void __iomem *metadata_size_mb_info;
49 	void __iomem *dbg_info_stage_counter;
50 
51 	/* decoder registers */
52 	void __iomem *d_crc_ctrl;
53 	void __iomem *d_dec_options;
54 	void __iomem *d_display_delay;
55 	void __iomem *d_set_frame_width;
56 	void __iomem *d_set_frame_height;
57 	void __iomem *d_sei_enable;
58 	void __iomem *d_min_num_dpb;
59 	void __iomem *d_min_first_plane_dpb_size;
60 	void __iomem *d_min_second_plane_dpb_size;
61 	void __iomem *d_min_third_plane_dpb_size;/* only v8 */
62 	void __iomem *d_min_num_mv;
63 	void __iomem *d_mvc_num_views;
64 	void __iomem *d_min_num_dis;/* only v7 */
65 	void __iomem *d_min_first_dis_size;/* only v7 */
66 	void __iomem *d_min_second_dis_size;/* only v7 */
67 	void __iomem *d_min_third_dis_size;/* only v7 */
68 	void __iomem *d_post_filter_luma_dpb0;/*  v7 and v8 */
69 	void __iomem *d_post_filter_luma_dpb1;/* v7 and v8 */
70 	void __iomem *d_post_filter_luma_dpb2;/* only v7 */
71 	void __iomem *d_post_filter_chroma_dpb0;/* v7 and v8 */
72 	void __iomem *d_post_filter_chroma_dpb1;/* v7 and v8 */
73 	void __iomem *d_post_filter_chroma_dpb2;/* only v7 */
74 	void __iomem *d_num_dpb;
75 	void __iomem *d_num_mv;
76 	void __iomem *d_init_buffer_options;
77 	void __iomem *d_first_plane_dpb_stride_size;/* only v8 */
78 	void __iomem *d_second_plane_dpb_stride_size;/* only v8 */
79 	void __iomem *d_third_plane_dpb_stride_size;/* only v8 */
80 	void __iomem *d_first_plane_dpb_size;
81 	void __iomem *d_second_plane_dpb_size;
82 	void __iomem *d_third_plane_dpb_size;/* only v8 */
83 	void __iomem *d_mv_buffer_size;
84 	void __iomem *d_first_plane_dpb;
85 	void __iomem *d_second_plane_dpb;
86 	void __iomem *d_third_plane_dpb;
87 	void __iomem *d_mv_buffer;
88 	void __iomem *d_scratch_buffer_addr;
89 	void __iomem *d_scratch_buffer_size;
90 	void __iomem *d_metadata_buffer_addr;
91 	void __iomem *d_metadata_buffer_size;
92 	void __iomem *d_nal_start_options;/* v7 and v8 */
93 	void __iomem *d_cpb_buffer_addr;
94 	void __iomem *d_cpb_buffer_size;
95 	void __iomem *d_available_dpb_flag_upper;
96 	void __iomem *d_available_dpb_flag_lower;
97 	void __iomem *d_cpb_buffer_offset;
98 	void __iomem *d_slice_if_enable;
99 	void __iomem *d_picture_tag;
100 	void __iomem *d_stream_data_size;
101 	void __iomem *d_dynamic_dpb_flag_upper;/* v7 and v8 */
102 	void __iomem *d_dynamic_dpb_flag_lower;/* v7 and v8 */
103 	void __iomem *d_display_frame_width;
104 	void __iomem *d_display_frame_height;
105 	void __iomem *d_display_status;
106 	void __iomem *d_display_first_plane_addr;
107 	void __iomem *d_display_second_plane_addr;
108 	void __iomem *d_display_third_plane_addr;/* only v8 */
109 	void __iomem *d_display_frame_type;
110 	void __iomem *d_display_crop_info1;
111 	void __iomem *d_display_crop_info2;
112 	void __iomem *d_display_picture_profile;
113 	void __iomem *d_display_luma_crc;/* v7 and v8 */
114 	void __iomem *d_display_chroma0_crc;/* v7 and v8 */
115 	void __iomem *d_display_chroma1_crc;/* only v8 */
116 	void __iomem *d_display_luma_crc_top;/* only v6 */
117 	void __iomem *d_display_chroma_crc_top;/* only v6 */
118 	void __iomem *d_display_luma_crc_bot;/* only v6 */
119 	void __iomem *d_display_chroma_crc_bot;/* only v6 */
120 	void __iomem *d_display_aspect_ratio;
121 	void __iomem *d_display_extended_ar;
122 	void __iomem *d_decoded_frame_width;
123 	void __iomem *d_decoded_frame_height;
124 	void __iomem *d_decoded_status;
125 	void __iomem *d_decoded_first_plane_addr;
126 	void __iomem *d_decoded_second_plane_addr;
127 	void __iomem *d_decoded_third_plane_addr;/* only v8 */
128 	void __iomem *d_decoded_frame_type;
129 	void __iomem *d_decoded_crop_info1;
130 	void __iomem *d_decoded_crop_info2;
131 	void __iomem *d_decoded_picture_profile;
132 	void __iomem *d_decoded_nal_size;
133 	void __iomem *d_decoded_luma_crc;
134 	void __iomem *d_decoded_chroma0_crc;
135 	void __iomem *d_decoded_chroma1_crc;/* only v8 */
136 	void __iomem *d_ret_picture_tag_top;
137 	void __iomem *d_ret_picture_tag_bot;
138 	void __iomem *d_ret_picture_time_top;
139 	void __iomem *d_ret_picture_time_bot;
140 	void __iomem *d_chroma_format;
141 	void __iomem *d_vc1_info;/* v7 and v8 */
142 	void __iomem *d_mpeg4_info;
143 	void __iomem *d_h264_info;
144 	void __iomem *d_metadata_addr_concealed_mb;
145 	void __iomem *d_metadata_size_concealed_mb;
146 	void __iomem *d_metadata_addr_vc1_param;
147 	void __iomem *d_metadata_size_vc1_param;
148 	void __iomem *d_metadata_addr_sei_nal;
149 	void __iomem *d_metadata_size_sei_nal;
150 	void __iomem *d_metadata_addr_vui;
151 	void __iomem *d_metadata_size_vui;
152 	void __iomem *d_metadata_addr_mvcvui;/* v7 and v8 */
153 	void __iomem *d_metadata_size_mvcvui;/* v7 and v8 */
154 	void __iomem *d_mvc_view_id;
155 	void __iomem *d_frame_pack_sei_avail;
156 	void __iomem *d_frame_pack_arrgment_id;
157 	void __iomem *d_frame_pack_sei_info;
158 	void __iomem *d_frame_pack_grid_pos;
159 	void __iomem *d_display_recovery_sei_info;/* v7 and v8 */
160 	void __iomem *d_decoded_recovery_sei_info;/* v7 and v8 */
161 	void __iomem *d_display_first_addr;/* only v7 */
162 	void __iomem *d_display_second_addr;/* only v7 */
163 	void __iomem *d_display_third_addr;/* only v7 */
164 	void __iomem *d_decoded_first_addr;/* only v7 */
165 	void __iomem *d_decoded_second_addr;/* only v7 */
166 	void __iomem *d_decoded_third_addr;/* only v7 */
167 	void __iomem *d_used_dpb_flag_upper;/* v7 and v8 */
168 	void __iomem *d_used_dpb_flag_lower;/* v7 and v8 */
169 	void __iomem *d_min_scratch_buffer_size; /* v10 */
170 	void __iomem *d_static_buffer_addr; /* v10 */
171 	void __iomem *d_static_buffer_size; /* v10 */
172 
173 	/* encoder registers */
174 	void __iomem *e_frame_width;
175 	void __iomem *e_frame_height;
176 	void __iomem *e_cropped_frame_width;
177 	void __iomem *e_cropped_frame_height;
178 	void __iomem *e_frame_crop_offset;
179 	void __iomem *e_enc_options;
180 	void __iomem *e_picture_profile;
181 	void __iomem *e_vbv_buffer_size;
182 	void __iomem *e_vbv_init_delay;
183 	void __iomem *e_fixed_picture_qp;
184 	void __iomem *e_rc_config;
185 	void __iomem *e_rc_qp_bound;
186 	void __iomem *e_rc_qp_bound_pb;/* v7 and v8 */
187 	void __iomem *e_rc_mode;
188 	void __iomem *e_mb_rc_config;
189 	void __iomem *e_padding_ctrl;
190 	void __iomem *e_air_threshold;
191 	void __iomem *e_mv_hor_range;
192 	void __iomem *e_mv_ver_range;
193 	void __iomem *e_num_dpb;
194 	void __iomem *e_luma_dpb;
195 	void __iomem *e_chroma_dpb;
196 	void __iomem *e_me_buffer;
197 	void __iomem *e_scratch_buffer_addr;
198 	void __iomem *e_scratch_buffer_size;
199 	void __iomem *e_tmv_buffer0;
200 	void __iomem *e_tmv_buffer1;
201 	void __iomem *e_ir_buffer_addr;/* v7 and v8 */
202 	void __iomem *e_source_first_plane_addr;
203 	void __iomem *e_source_second_plane_addr;
204 	void __iomem *e_source_third_plane_addr;/* v7 and v8 */
205 	void __iomem *e_source_first_plane_stride;/* v7 and v8 */
206 	void __iomem *e_source_second_plane_stride;/* v7 and v8 */
207 	void __iomem *e_source_third_plane_stride;/* v7 and v8 */
208 	void __iomem *e_stream_buffer_addr;
209 	void __iomem *e_stream_buffer_size;
210 	void __iomem *e_roi_buffer_addr;
211 	void __iomem *e_param_change;
212 	void __iomem *e_ir_size;
213 	void __iomem *e_gop_config;
214 	void __iomem *e_mslice_mode;
215 	void __iomem *e_mslice_size_mb;
216 	void __iomem *e_mslice_size_bits;
217 	void __iomem *e_frame_insertion;
218 	void __iomem *e_rc_frame_rate;
219 	void __iomem *e_rc_bit_rate;
220 	void __iomem *e_rc_roi_ctrl;
221 	void __iomem *e_picture_tag;
222 	void __iomem *e_bit_count_enable;
223 	void __iomem *e_max_bit_count;
224 	void __iomem *e_min_bit_count;
225 	void __iomem *e_metadata_buffer_addr;
226 	void __iomem *e_metadata_buffer_size;
227 	void __iomem *e_encoded_source_first_plane_addr;
228 	void __iomem *e_encoded_source_second_plane_addr;
229 	void __iomem *e_encoded_source_third_plane_addr;/* v7 and v8 */
230 	void __iomem *e_stream_size;
231 	void __iomem *e_slice_type;
232 	void __iomem *e_picture_count;
233 	void __iomem *e_ret_picture_tag;
234 	void __iomem *e_stream_buffer_write_pointer; /*  only v6 */
235 	void __iomem *e_recon_luma_dpb_addr;
236 	void __iomem *e_recon_chroma_dpb_addr;
237 	void __iomem *e_metadata_addr_enc_slice;
238 	void __iomem *e_metadata_size_enc_slice;
239 	void __iomem *e_mpeg4_options;
240 	void __iomem *e_mpeg4_hec_period;
241 	void __iomem *e_aspect_ratio;
242 	void __iomem *e_extended_sar;
243 	void __iomem *e_h264_options;
244 	void __iomem *e_h264_options_2;/* v7 and v8 */
245 	void __iomem *e_h264_lf_alpha_offset;
246 	void __iomem *e_h264_lf_beta_offset;
247 	void __iomem *e_h264_i_period;
248 	void __iomem *e_h264_fmo_slice_grp_map_type;
249 	void __iomem *e_h264_fmo_num_slice_grp_minus1;
250 	void __iomem *e_h264_fmo_slice_grp_change_dir;
251 	void __iomem *e_h264_fmo_slice_grp_change_rate_minus1;
252 	void __iomem *e_h264_fmo_run_length_minus1_0;
253 	void __iomem *e_h264_aso_slice_order_0;
254 	void __iomem *e_h264_chroma_qp_offset;
255 	void __iomem *e_h264_num_t_layer;
256 	void __iomem *e_h264_hierarchical_qp_layer0;
257 	void __iomem *e_h264_frame_packing_sei_info;
258 	void __iomem *e_h264_nal_control;/* v7 and v8 */
259 	void __iomem *e_mvc_frame_qp_view1;
260 	void __iomem *e_mvc_rc_bit_rate_view1;
261 	void __iomem *e_mvc_rc_qbound_view1;
262 	void __iomem *e_mvc_rc_mode_view1;
263 	void __iomem *e_mvc_inter_view_prediction_on;
264 	void __iomem *e_vp8_options;/* v7 and v8 */
265 	void __iomem *e_vp8_filter_options;/* v7 and v8 */
266 	void __iomem *e_vp8_golden_frame_option;/* v7 and v8 */
267 	void __iomem *e_vp8_num_t_layer;/* v7 and v8 */
268 	void __iomem *e_vp8_hierarchical_qp_layer0;/* v7 and v8 */
269 	void __iomem *e_vp8_hierarchical_qp_layer1;/* v7 and v8 */
270 	void __iomem *e_vp8_hierarchical_qp_layer2;/* v7 and v8 */
271 	void __iomem *e_min_scratch_buffer_size; /* v10 */
272 	void __iomem *e_num_t_layer; /* v10 */
273 	void __iomem *e_hier_qp_layer0; /* v10 */
274 	void __iomem *e_hier_bit_rate_layer0; /* v10 */
275 	void __iomem *e_hevc_options; /* v10 */
276 	void __iomem *e_hevc_refresh_period; /* v10 */
277 	void __iomem *e_hevc_lf_beta_offset_div2; /* v10 */
278 	void __iomem *e_hevc_lf_tc_offset_div2; /* v10 */
279 	void __iomem *e_hevc_nal_control; /* v10 */
280 };
281 
282 struct s5p_mfc_hw_ops {
283 	int (*alloc_dec_temp_buffers)(struct s5p_mfc_ctx *ctx);
284 	void (*release_dec_desc_buffer)(struct s5p_mfc_ctx *ctx);
285 	int (*alloc_codec_buffers)(struct s5p_mfc_ctx *ctx);
286 	void (*release_codec_buffers)(struct s5p_mfc_ctx *ctx);
287 	int (*alloc_instance_buffer)(struct s5p_mfc_ctx *ctx);
288 	void (*release_instance_buffer)(struct s5p_mfc_ctx *ctx);
289 	int (*alloc_dev_context_buffer)(struct s5p_mfc_dev *dev);
290 	void (*release_dev_context_buffer)(struct s5p_mfc_dev *dev);
291 	void (*dec_calc_dpb_size)(struct s5p_mfc_ctx *ctx);
292 	void (*enc_calc_src_size)(struct s5p_mfc_ctx *ctx);
293 	int (*set_enc_stream_buffer)(struct s5p_mfc_ctx *ctx,
294 			unsigned long addr, unsigned int size);
295 	void (*set_enc_frame_buffer)(struct s5p_mfc_ctx *ctx,
296 			unsigned long y_addr, unsigned long c_addr);
297 	void (*get_enc_frame_buffer)(struct s5p_mfc_ctx *ctx,
298 			unsigned long *y_addr, unsigned long *c_addr);
299 	void (*try_run)(struct s5p_mfc_dev *dev);
300 	void (*clear_int_flags)(struct s5p_mfc_dev *dev);
301 	int (*get_dspl_y_adr)(struct s5p_mfc_dev *dev);
302 	int (*get_dec_y_adr)(struct s5p_mfc_dev *dev);
303 	int (*get_dspl_status)(struct s5p_mfc_dev *dev);
304 	int (*get_dec_status)(struct s5p_mfc_dev *dev);
305 	int (*get_dec_frame_type)(struct s5p_mfc_dev *dev);
306 	int (*get_disp_frame_type)(struct s5p_mfc_ctx *ctx);
307 	int (*get_consumed_stream)(struct s5p_mfc_dev *dev);
308 	int (*get_int_reason)(struct s5p_mfc_dev *dev);
309 	int (*get_int_err)(struct s5p_mfc_dev *dev);
310 	int (*err_dec)(unsigned int err);
311 	int (*get_img_width)(struct s5p_mfc_dev *dev);
312 	int (*get_img_height)(struct s5p_mfc_dev *dev);
313 	int (*get_dpb_count)(struct s5p_mfc_dev *dev);
314 	int (*get_mv_count)(struct s5p_mfc_dev *dev);
315 	int (*get_inst_no)(struct s5p_mfc_dev *dev);
316 	int (*get_enc_strm_size)(struct s5p_mfc_dev *dev);
317 	int (*get_enc_slice_type)(struct s5p_mfc_dev *dev);
318 	int (*get_enc_dpb_count)(struct s5p_mfc_dev *dev);
319 	unsigned int (*get_pic_type_top)(struct s5p_mfc_ctx *ctx);
320 	unsigned int (*get_pic_type_bot)(struct s5p_mfc_ctx *ctx);
321 	unsigned int (*get_crop_info_h)(struct s5p_mfc_ctx *ctx);
322 	unsigned int (*get_crop_info_v)(struct s5p_mfc_ctx *ctx);
323 	int (*get_min_scratch_buf_size)(struct s5p_mfc_dev *dev);
324 	int (*get_e_min_scratch_buf_size)(struct s5p_mfc_dev *dev);
325 };
326 
327 void s5p_mfc_init_hw_ops(struct s5p_mfc_dev *dev);
328 void s5p_mfc_init_regs(struct s5p_mfc_dev *dev);
329 int s5p_mfc_alloc_priv_buf(struct s5p_mfc_dev *dev, unsigned int mem_ctx,
330 			   struct s5p_mfc_priv_buf *b);
331 void s5p_mfc_release_priv_buf(struct s5p_mfc_dev *dev,
332 			      struct s5p_mfc_priv_buf *b);
333 int s5p_mfc_alloc_generic_buf(struct s5p_mfc_dev *dev, unsigned int mem_ctx,
334 			   struct s5p_mfc_priv_buf *b);
335 void s5p_mfc_release_generic_buf(struct s5p_mfc_dev *dev,
336 			      struct s5p_mfc_priv_buf *b);
337 
338 
339 #endif /* S5P_MFC_OPR_H_ */
340