162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Coda multi-standard codec IP 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2012 Vista Silicon S.L. 662306a36Sopenharmony_ci * Javier Martin, <javier.martin@vista-silicon.com> 762306a36Sopenharmony_ci * Xavier Duret 862306a36Sopenharmony_ci * Copyright (C) 2012-2014 Philipp Zabel, Pengutronix 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#ifndef __CODA_H__ 1262306a36Sopenharmony_ci#define __CODA_H__ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/debugfs.h> 1562306a36Sopenharmony_ci#include <linux/idr.h> 1662306a36Sopenharmony_ci#include <linux/irqreturn.h> 1762306a36Sopenharmony_ci#include <linux/mutex.h> 1862306a36Sopenharmony_ci#include <linux/kfifo.h> 1962306a36Sopenharmony_ci#include <linux/videodev2.h> 2062306a36Sopenharmony_ci#include <linux/ratelimit.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <media/v4l2-ctrls.h> 2362306a36Sopenharmony_ci#include <media/v4l2-device.h> 2462306a36Sopenharmony_ci#include <media/v4l2-fh.h> 2562306a36Sopenharmony_ci#include <media/videobuf2-v4l2.h> 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#include "coda_regs.h" 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#define CODA_MAX_FRAMEBUFFERS 19 3062306a36Sopenharmony_ci#define FMO_SLICE_SAVE_BUF_SIZE (32) 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * This control allows applications to read the per-stream 3462306a36Sopenharmony_ci * (i.e. per-context) Macroblocks Error Count. This value 3562306a36Sopenharmony_ci * is CODA specific. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci#define V4L2_CID_CODA_MB_ERR_CNT (V4L2_CID_USER_CODA_BASE + 0) 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cienum { 4062306a36Sopenharmony_ci V4L2_M2M_SRC = 0, 4162306a36Sopenharmony_ci V4L2_M2M_DST = 1, 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cienum coda_inst_type { 4562306a36Sopenharmony_ci CODA_INST_ENCODER, 4662306a36Sopenharmony_ci CODA_INST_DECODER, 4762306a36Sopenharmony_ci}; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cienum coda_product { 5062306a36Sopenharmony_ci CODA_DX6 = 0xf001, 5162306a36Sopenharmony_ci CODA_HX4 = 0xf00a, 5262306a36Sopenharmony_ci CODA_7541 = 0xf012, 5362306a36Sopenharmony_ci CODA_960 = 0xf020, 5462306a36Sopenharmony_ci}; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistruct coda_video_device; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistruct coda_devtype { 5962306a36Sopenharmony_ci char *firmware[3]; 6062306a36Sopenharmony_ci enum coda_product product; 6162306a36Sopenharmony_ci const struct coda_codec *codecs; 6262306a36Sopenharmony_ci unsigned int num_codecs; 6362306a36Sopenharmony_ci const struct coda_video_device **vdevs; 6462306a36Sopenharmony_ci unsigned int num_vdevs; 6562306a36Sopenharmony_ci size_t workbuf_size; 6662306a36Sopenharmony_ci size_t tempbuf_size; 6762306a36Sopenharmony_ci size_t iram_size; 6862306a36Sopenharmony_ci}; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_cistruct coda_aux_buf { 7162306a36Sopenharmony_ci void *vaddr; 7262306a36Sopenharmony_ci dma_addr_t paddr; 7362306a36Sopenharmony_ci u32 size; 7462306a36Sopenharmony_ci struct debugfs_blob_wrapper blob; 7562306a36Sopenharmony_ci struct dentry *dentry; 7662306a36Sopenharmony_ci}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistruct coda_dev { 7962306a36Sopenharmony_ci struct v4l2_device v4l2_dev; 8062306a36Sopenharmony_ci struct video_device vfd[6]; 8162306a36Sopenharmony_ci struct device *dev; 8262306a36Sopenharmony_ci const struct coda_devtype *devtype; 8362306a36Sopenharmony_ci int firmware; 8462306a36Sopenharmony_ci struct vdoa_data *vdoa; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci void __iomem *regs_base; 8762306a36Sopenharmony_ci struct clk *clk_per; 8862306a36Sopenharmony_ci struct clk *clk_ahb; 8962306a36Sopenharmony_ci struct reset_control *rstc; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci struct coda_aux_buf codebuf; 9262306a36Sopenharmony_ci struct coda_aux_buf tempbuf; 9362306a36Sopenharmony_ci struct coda_aux_buf workbuf; 9462306a36Sopenharmony_ci struct gen_pool *iram_pool; 9562306a36Sopenharmony_ci struct coda_aux_buf iram; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci struct mutex dev_mutex; 9862306a36Sopenharmony_ci struct mutex coda_mutex; 9962306a36Sopenharmony_ci struct workqueue_struct *workqueue; 10062306a36Sopenharmony_ci struct v4l2_m2m_dev *m2m_dev; 10162306a36Sopenharmony_ci struct ida ida; 10262306a36Sopenharmony_ci struct dentry *debugfs_root; 10362306a36Sopenharmony_ci struct ratelimit_state mb_err_rs; 10462306a36Sopenharmony_ci}; 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistruct coda_codec { 10762306a36Sopenharmony_ci u32 mode; 10862306a36Sopenharmony_ci u32 src_fourcc; 10962306a36Sopenharmony_ci u32 dst_fourcc; 11062306a36Sopenharmony_ci u32 max_w; 11162306a36Sopenharmony_ci u32 max_h; 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cistruct coda_huff_tab; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistruct coda_params { 11762306a36Sopenharmony_ci u8 rot_mode; 11862306a36Sopenharmony_ci u8 h264_intra_qp; 11962306a36Sopenharmony_ci u8 h264_inter_qp; 12062306a36Sopenharmony_ci u8 h264_min_qp; 12162306a36Sopenharmony_ci u8 h264_max_qp; 12262306a36Sopenharmony_ci u8 h264_disable_deblocking_filter_idc; 12362306a36Sopenharmony_ci s8 h264_slice_alpha_c0_offset_div2; 12462306a36Sopenharmony_ci s8 h264_slice_beta_offset_div2; 12562306a36Sopenharmony_ci bool h264_constrained_intra_pred_flag; 12662306a36Sopenharmony_ci s8 h264_chroma_qp_index_offset; 12762306a36Sopenharmony_ci u8 h264_profile_idc; 12862306a36Sopenharmony_ci u8 h264_level_idc; 12962306a36Sopenharmony_ci u8 mpeg2_profile_idc; 13062306a36Sopenharmony_ci u8 mpeg2_level_idc; 13162306a36Sopenharmony_ci u8 mpeg4_intra_qp; 13262306a36Sopenharmony_ci u8 mpeg4_inter_qp; 13362306a36Sopenharmony_ci u8 gop_size; 13462306a36Sopenharmony_ci int intra_refresh; 13562306a36Sopenharmony_ci enum v4l2_jpeg_chroma_subsampling jpeg_chroma_subsampling; 13662306a36Sopenharmony_ci u8 jpeg_quality; 13762306a36Sopenharmony_ci u8 jpeg_restart_interval; 13862306a36Sopenharmony_ci u8 *jpeg_qmat_tab[3]; 13962306a36Sopenharmony_ci int jpeg_qmat_index[3]; 14062306a36Sopenharmony_ci int jpeg_huff_dc_index[3]; 14162306a36Sopenharmony_ci int jpeg_huff_ac_index[3]; 14262306a36Sopenharmony_ci u32 *jpeg_huff_data; 14362306a36Sopenharmony_ci struct coda_huff_tab *jpeg_huff_tab; 14462306a36Sopenharmony_ci int codec_mode; 14562306a36Sopenharmony_ci int codec_mode_aux; 14662306a36Sopenharmony_ci enum v4l2_mpeg_video_multi_slice_mode slice_mode; 14762306a36Sopenharmony_ci u32 framerate; 14862306a36Sopenharmony_ci u16 bitrate; 14962306a36Sopenharmony_ci u16 vbv_delay; 15062306a36Sopenharmony_ci u32 vbv_size; 15162306a36Sopenharmony_ci u32 slice_max_bits; 15262306a36Sopenharmony_ci u32 slice_max_mb; 15362306a36Sopenharmony_ci bool force_ipicture; 15462306a36Sopenharmony_ci bool gop_size_changed; 15562306a36Sopenharmony_ci bool bitrate_changed; 15662306a36Sopenharmony_ci bool framerate_changed; 15762306a36Sopenharmony_ci bool h264_intra_qp_changed; 15862306a36Sopenharmony_ci bool intra_refresh_changed; 15962306a36Sopenharmony_ci bool slice_mode_changed; 16062306a36Sopenharmony_ci bool frame_rc_enable; 16162306a36Sopenharmony_ci bool mb_rc_enable; 16262306a36Sopenharmony_ci}; 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct coda_buffer_meta { 16562306a36Sopenharmony_ci struct list_head list; 16662306a36Sopenharmony_ci u32 sequence; 16762306a36Sopenharmony_ci struct v4l2_timecode timecode; 16862306a36Sopenharmony_ci u64 timestamp; 16962306a36Sopenharmony_ci unsigned int start; 17062306a36Sopenharmony_ci unsigned int end; 17162306a36Sopenharmony_ci bool last; 17262306a36Sopenharmony_ci}; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci/* Per-queue, driver-specific private data */ 17562306a36Sopenharmony_cistruct coda_q_data { 17662306a36Sopenharmony_ci unsigned int width; 17762306a36Sopenharmony_ci unsigned int height; 17862306a36Sopenharmony_ci unsigned int bytesperline; 17962306a36Sopenharmony_ci unsigned int sizeimage; 18062306a36Sopenharmony_ci unsigned int fourcc; 18162306a36Sopenharmony_ci struct v4l2_rect rect; 18262306a36Sopenharmony_ci}; 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistruct coda_iram_info { 18562306a36Sopenharmony_ci u32 axi_sram_use; 18662306a36Sopenharmony_ci phys_addr_t buf_bit_use; 18762306a36Sopenharmony_ci phys_addr_t buf_ip_ac_dc_use; 18862306a36Sopenharmony_ci phys_addr_t buf_dbk_y_use; 18962306a36Sopenharmony_ci phys_addr_t buf_dbk_c_use; 19062306a36Sopenharmony_ci phys_addr_t buf_ovl_use; 19162306a36Sopenharmony_ci phys_addr_t buf_btp_use; 19262306a36Sopenharmony_ci phys_addr_t search_ram_paddr; 19362306a36Sopenharmony_ci int search_ram_size; 19462306a36Sopenharmony_ci int remaining; 19562306a36Sopenharmony_ci phys_addr_t next_paddr; 19662306a36Sopenharmony_ci}; 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ci#define GDI_LINEAR_FRAME_MAP 0 19962306a36Sopenharmony_ci#define GDI_TILED_FRAME_MB_RASTER_MAP 1 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistruct coda_ctx; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistruct coda_context_ops { 20462306a36Sopenharmony_ci int (*queue_init)(void *priv, struct vb2_queue *src_vq, 20562306a36Sopenharmony_ci struct vb2_queue *dst_vq); 20662306a36Sopenharmony_ci int (*reqbufs)(struct coda_ctx *ctx, struct v4l2_requestbuffers *rb); 20762306a36Sopenharmony_ci int (*start_streaming)(struct coda_ctx *ctx); 20862306a36Sopenharmony_ci int (*prepare_run)(struct coda_ctx *ctx); 20962306a36Sopenharmony_ci void (*finish_run)(struct coda_ctx *ctx); 21062306a36Sopenharmony_ci void (*run_timeout)(struct coda_ctx *ctx); 21162306a36Sopenharmony_ci void (*seq_init_work)(struct work_struct *work); 21262306a36Sopenharmony_ci void (*seq_end_work)(struct work_struct *work); 21362306a36Sopenharmony_ci void (*release)(struct coda_ctx *ctx); 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistruct coda_internal_frame { 21762306a36Sopenharmony_ci struct coda_aux_buf buf; 21862306a36Sopenharmony_ci struct coda_buffer_meta meta; 21962306a36Sopenharmony_ci u32 type; 22062306a36Sopenharmony_ci u32 error; 22162306a36Sopenharmony_ci}; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_cistruct coda_ctx { 22462306a36Sopenharmony_ci struct coda_dev *dev; 22562306a36Sopenharmony_ci struct mutex buffer_mutex; 22662306a36Sopenharmony_ci struct work_struct pic_run_work; 22762306a36Sopenharmony_ci struct work_struct seq_init_work; 22862306a36Sopenharmony_ci struct work_struct seq_end_work; 22962306a36Sopenharmony_ci struct completion completion; 23062306a36Sopenharmony_ci const struct coda_video_device *cvd; 23162306a36Sopenharmony_ci const struct coda_context_ops *ops; 23262306a36Sopenharmony_ci int aborting; 23362306a36Sopenharmony_ci int initialized; 23462306a36Sopenharmony_ci int streamon_out; 23562306a36Sopenharmony_ci int streamon_cap; 23662306a36Sopenharmony_ci u32 qsequence; 23762306a36Sopenharmony_ci u32 osequence; 23862306a36Sopenharmony_ci u32 sequence_offset; 23962306a36Sopenharmony_ci struct coda_q_data q_data[2]; 24062306a36Sopenharmony_ci enum coda_inst_type inst_type; 24162306a36Sopenharmony_ci const struct coda_codec *codec; 24262306a36Sopenharmony_ci enum v4l2_colorspace colorspace; 24362306a36Sopenharmony_ci enum v4l2_xfer_func xfer_func; 24462306a36Sopenharmony_ci enum v4l2_ycbcr_encoding ycbcr_enc; 24562306a36Sopenharmony_ci enum v4l2_quantization quantization; 24662306a36Sopenharmony_ci struct coda_params params; 24762306a36Sopenharmony_ci struct v4l2_ctrl_handler ctrls; 24862306a36Sopenharmony_ci struct v4l2_ctrl *h264_profile_ctrl; 24962306a36Sopenharmony_ci struct v4l2_ctrl *h264_level_ctrl; 25062306a36Sopenharmony_ci struct v4l2_ctrl *mpeg2_profile_ctrl; 25162306a36Sopenharmony_ci struct v4l2_ctrl *mpeg2_level_ctrl; 25262306a36Sopenharmony_ci struct v4l2_ctrl *mpeg4_profile_ctrl; 25362306a36Sopenharmony_ci struct v4l2_ctrl *mpeg4_level_ctrl; 25462306a36Sopenharmony_ci struct v4l2_ctrl *mb_err_cnt_ctrl; 25562306a36Sopenharmony_ci struct v4l2_fh fh; 25662306a36Sopenharmony_ci int gopcounter; 25762306a36Sopenharmony_ci int runcounter; 25862306a36Sopenharmony_ci int jpeg_ecs_offset; 25962306a36Sopenharmony_ci char vpu_header[3][64]; 26062306a36Sopenharmony_ci int vpu_header_size[3]; 26162306a36Sopenharmony_ci struct kfifo bitstream_fifo; 26262306a36Sopenharmony_ci struct mutex bitstream_mutex; 26362306a36Sopenharmony_ci struct coda_aux_buf bitstream; 26462306a36Sopenharmony_ci bool hold; 26562306a36Sopenharmony_ci struct coda_aux_buf parabuf; 26662306a36Sopenharmony_ci struct coda_aux_buf psbuf; 26762306a36Sopenharmony_ci struct coda_aux_buf slicebuf; 26862306a36Sopenharmony_ci struct coda_internal_frame internal_frames[CODA_MAX_FRAMEBUFFERS]; 26962306a36Sopenharmony_ci struct list_head buffer_meta_list; 27062306a36Sopenharmony_ci spinlock_t buffer_meta_lock; 27162306a36Sopenharmony_ci int num_metas; 27262306a36Sopenharmony_ci unsigned int first_frame_sequence; 27362306a36Sopenharmony_ci struct coda_aux_buf workbuf; 27462306a36Sopenharmony_ci int num_internal_frames; 27562306a36Sopenharmony_ci int idx; 27662306a36Sopenharmony_ci int reg_idx; 27762306a36Sopenharmony_ci struct coda_iram_info iram_info; 27862306a36Sopenharmony_ci int tiled_map_type; 27962306a36Sopenharmony_ci u32 bit_stream_param; 28062306a36Sopenharmony_ci u32 frm_dis_flg; 28162306a36Sopenharmony_ci u32 frame_mem_ctrl; 28262306a36Sopenharmony_ci u32 para_change; 28362306a36Sopenharmony_ci int display_idx; 28462306a36Sopenharmony_ci struct dentry *debugfs_entry; 28562306a36Sopenharmony_ci bool use_bit; 28662306a36Sopenharmony_ci bool use_vdoa; 28762306a36Sopenharmony_ci struct vdoa_ctx *vdoa; 28862306a36Sopenharmony_ci /* 28962306a36Sopenharmony_ci * wakeup mutex used to serialize encoder stop command and finish_run, 29062306a36Sopenharmony_ci * ensures that finish_run always either flags the last returned buffer 29162306a36Sopenharmony_ci * or wakes up the capture queue to signal EOS afterwards. 29262306a36Sopenharmony_ci */ 29362306a36Sopenharmony_ci struct mutex wakeup_mutex; 29462306a36Sopenharmony_ci}; 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ciextern int coda_debug; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci#define coda_dbg(level, ctx, fmt, arg...) \ 29962306a36Sopenharmony_ci do { \ 30062306a36Sopenharmony_ci if (coda_debug >= (level)) \ 30162306a36Sopenharmony_ci v4l2_dbg((level), coda_debug, &(ctx)->dev->v4l2_dev, \ 30262306a36Sopenharmony_ci "%u: " fmt, (ctx)->idx, ##arg); \ 30362306a36Sopenharmony_ci } while (0) 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_civoid coda_write(struct coda_dev *dev, u32 data, u32 reg); 30662306a36Sopenharmony_ciunsigned int coda_read(struct coda_dev *dev, u32 reg); 30762306a36Sopenharmony_civoid coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data, 30862306a36Sopenharmony_ci struct vb2_v4l2_buffer *buf, unsigned int reg_y); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ciint coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf, 31162306a36Sopenharmony_ci size_t size, const char *name, struct dentry *parent); 31262306a36Sopenharmony_civoid coda_free_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf); 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_ciint coda_encoder_queue_init(void *priv, struct vb2_queue *src_vq, 31562306a36Sopenharmony_ci struct vb2_queue *dst_vq); 31662306a36Sopenharmony_ciint coda_decoder_queue_init(void *priv, struct vb2_queue *src_vq, 31762306a36Sopenharmony_ci struct vb2_queue *dst_vq); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ciint coda_hw_reset(struct coda_ctx *ctx); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_civoid coda_fill_bitstream(struct coda_ctx *ctx, struct list_head *buffer_list); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_civoid coda_set_gdi_regs(struct coda_ctx *ctx); 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic inline struct coda_q_data *get_q_data(struct coda_ctx *ctx, 32662306a36Sopenharmony_ci enum v4l2_buf_type type) 32762306a36Sopenharmony_ci{ 32862306a36Sopenharmony_ci switch (type) { 32962306a36Sopenharmony_ci case V4L2_BUF_TYPE_VIDEO_OUTPUT: 33062306a36Sopenharmony_ci return &(ctx->q_data[V4L2_M2M_SRC]); 33162306a36Sopenharmony_ci case V4L2_BUF_TYPE_VIDEO_CAPTURE: 33262306a36Sopenharmony_ci return &(ctx->q_data[V4L2_M2M_DST]); 33362306a36Sopenharmony_ci default: 33462306a36Sopenharmony_ci return NULL; 33562306a36Sopenharmony_ci } 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ciconst char *coda_product_name(int product); 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ciint coda_check_firmware(struct coda_dev *dev); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_cistatic inline unsigned int coda_get_bitstream_payload(struct coda_ctx *ctx) 34362306a36Sopenharmony_ci{ 34462306a36Sopenharmony_ci return kfifo_len(&ctx->bitstream_fifo); 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci/* 34862306a36Sopenharmony_ci * The bitstream prefetcher needs to read at least 2 256 byte periods past 34962306a36Sopenharmony_ci * the desired bitstream position for all data to reach the decoder. 35062306a36Sopenharmony_ci */ 35162306a36Sopenharmony_cistatic inline bool coda_bitstream_can_fetch_past(struct coda_ctx *ctx, 35262306a36Sopenharmony_ci unsigned int pos) 35362306a36Sopenharmony_ci{ 35462306a36Sopenharmony_ci return (int)(ctx->bitstream_fifo.kfifo.in - ALIGN(pos, 256)) > 512; 35562306a36Sopenharmony_ci} 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cibool coda_bitstream_can_fetch_past(struct coda_ctx *ctx, unsigned int pos); 35862306a36Sopenharmony_ciint coda_bitstream_flush(struct coda_ctx *ctx); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_civoid coda_bit_stream_end_flag(struct coda_ctx *ctx); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_civoid coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf, 36362306a36Sopenharmony_ci enum vb2_buffer_state state); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ciint coda_h264_filler_nal(int size, char *p); 36662306a36Sopenharmony_ciint coda_h264_padding(int size, char *p); 36762306a36Sopenharmony_ciint coda_h264_profile(int profile_idc); 36862306a36Sopenharmony_ciint coda_h264_level(int level_idc); 36962306a36Sopenharmony_ciint coda_sps_parse_profile(struct coda_ctx *ctx, struct vb2_buffer *vb); 37062306a36Sopenharmony_ciint coda_h264_sps_fixup(struct coda_ctx *ctx, int width, int height, char *buf, 37162306a36Sopenharmony_ci int *size, int max_size); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ciint coda_mpeg2_profile(int profile_idc); 37462306a36Sopenharmony_ciint coda_mpeg2_level(int level_idc); 37562306a36Sopenharmony_ciu32 coda_mpeg2_parse_headers(struct coda_ctx *ctx, u8 *buf, u32 size); 37662306a36Sopenharmony_ciint coda_mpeg4_profile(int profile_idc); 37762306a36Sopenharmony_ciint coda_mpeg4_level(int level_idc); 37862306a36Sopenharmony_ciu32 coda_mpeg4_parse_headers(struct coda_ctx *ctx, u8 *buf, u32 size); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_civoid coda_update_profile_level_ctrls(struct coda_ctx *ctx, u8 profile_idc, 38162306a36Sopenharmony_ci u8 level_idc); 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic inline int coda_jpeg_scale(int src, int dst) 38462306a36Sopenharmony_ci{ 38562306a36Sopenharmony_ci return (dst <= src / 8) ? 3 : 38662306a36Sopenharmony_ci (dst <= src / 4) ? 2 : 38762306a36Sopenharmony_ci (dst <= src / 2) ? 1 : 0; 38862306a36Sopenharmony_ci} 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cibool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_buffer *vb); 39162306a36Sopenharmony_ciint coda_jpeg_decode_header(struct coda_ctx *ctx, struct vb2_buffer *vb); 39262306a36Sopenharmony_ciint coda_jpeg_write_tables(struct coda_ctx *ctx); 39362306a36Sopenharmony_civoid coda_set_jpeg_compression_quality(struct coda_ctx *ctx, int quality); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ciextern const struct coda_context_ops coda_bit_encode_ops; 39662306a36Sopenharmony_ciextern const struct coda_context_ops coda_bit_decode_ops; 39762306a36Sopenharmony_ciextern const struct coda_context_ops coda9_jpeg_encode_ops; 39862306a36Sopenharmony_ciextern const struct coda_context_ops coda9_jpeg_decode_ops; 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ciirqreturn_t coda_irq_handler(int irq, void *data); 40162306a36Sopenharmony_ciirqreturn_t coda9_jpeg_irq_handler(int irq, void *data); 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci#endif /* __CODA_H__ */ 404