linux/drivers/media/platform/s5p-mfc/s5p_mfc_opr.h
<<
>>
Prefs
   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