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 20 struct 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 273 struct 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 335 void s5p_mfc_init_hw_ops(struct s5p_mfc_dev *dev); 336 void s5p_mfc_init_regs(struct s5p_mfc_dev *dev); 337 int s5p_mfc_alloc_priv_buf(struct device *dev, 338 struct s5p_mfc_priv_buf *b); 339 void s5p_mfc_release_priv_buf(struct device *dev, 340 struct s5p_mfc_priv_buf *b); 341 342 343 #endif /* S5P_MFC_OPR_H_ */ 344