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