18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Coda multi-standard codec IP 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2012 Vista Silicon S.L. 68c2ecf20Sopenharmony_ci * Javier Martin, <javier.martin@vista-silicon.com> 78c2ecf20Sopenharmony_ci * Xavier Duret 88c2ecf20Sopenharmony_ci * Copyright (C) 2012-2014 Philipp Zabel, Pengutronix 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifndef __CODA_H__ 128c2ecf20Sopenharmony_ci#define __CODA_H__ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci#include <linux/debugfs.h> 158c2ecf20Sopenharmony_ci#include <linux/idr.h> 168c2ecf20Sopenharmony_ci#include <linux/irqreturn.h> 178c2ecf20Sopenharmony_ci#include <linux/mutex.h> 188c2ecf20Sopenharmony_ci#include <linux/kfifo.h> 198c2ecf20Sopenharmony_ci#include <linux/videodev2.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#include <media/v4l2-ctrls.h> 228c2ecf20Sopenharmony_ci#include <media/v4l2-device.h> 238c2ecf20Sopenharmony_ci#include <media/v4l2-fh.h> 248c2ecf20Sopenharmony_ci#include <media/videobuf2-v4l2.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include "coda_regs.h" 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#define CODA_MAX_FRAMEBUFFERS 19 298c2ecf20Sopenharmony_ci#define FMO_SLICE_SAVE_BUF_SIZE (32) 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cienum { 328c2ecf20Sopenharmony_ci V4L2_M2M_SRC = 0, 338c2ecf20Sopenharmony_ci V4L2_M2M_DST = 1, 348c2ecf20Sopenharmony_ci}; 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cienum coda_inst_type { 378c2ecf20Sopenharmony_ci CODA_INST_ENCODER, 388c2ecf20Sopenharmony_ci CODA_INST_DECODER, 398c2ecf20Sopenharmony_ci}; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cienum coda_product { 428c2ecf20Sopenharmony_ci CODA_DX6 = 0xf001, 438c2ecf20Sopenharmony_ci CODA_HX4 = 0xf00a, 448c2ecf20Sopenharmony_ci CODA_7541 = 0xf012, 458c2ecf20Sopenharmony_ci CODA_960 = 0xf020, 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_cistruct coda_video_device; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistruct coda_devtype { 518c2ecf20Sopenharmony_ci char *firmware[3]; 528c2ecf20Sopenharmony_ci enum coda_product product; 538c2ecf20Sopenharmony_ci const struct coda_codec *codecs; 548c2ecf20Sopenharmony_ci unsigned int num_codecs; 558c2ecf20Sopenharmony_ci const struct coda_video_device **vdevs; 568c2ecf20Sopenharmony_ci unsigned int num_vdevs; 578c2ecf20Sopenharmony_ci size_t workbuf_size; 588c2ecf20Sopenharmony_ci size_t tempbuf_size; 598c2ecf20Sopenharmony_ci size_t iram_size; 608c2ecf20Sopenharmony_ci}; 618c2ecf20Sopenharmony_ci 628c2ecf20Sopenharmony_cistruct coda_aux_buf { 638c2ecf20Sopenharmony_ci void *vaddr; 648c2ecf20Sopenharmony_ci dma_addr_t paddr; 658c2ecf20Sopenharmony_ci u32 size; 668c2ecf20Sopenharmony_ci struct debugfs_blob_wrapper blob; 678c2ecf20Sopenharmony_ci struct dentry *dentry; 688c2ecf20Sopenharmony_ci}; 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_cistruct coda_dev { 718c2ecf20Sopenharmony_ci struct v4l2_device v4l2_dev; 728c2ecf20Sopenharmony_ci struct video_device vfd[6]; 738c2ecf20Sopenharmony_ci struct device *dev; 748c2ecf20Sopenharmony_ci const struct coda_devtype *devtype; 758c2ecf20Sopenharmony_ci int firmware; 768c2ecf20Sopenharmony_ci struct vdoa_data *vdoa; 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci void __iomem *regs_base; 798c2ecf20Sopenharmony_ci struct clk *clk_per; 808c2ecf20Sopenharmony_ci struct clk *clk_ahb; 818c2ecf20Sopenharmony_ci struct reset_control *rstc; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci struct coda_aux_buf codebuf; 848c2ecf20Sopenharmony_ci struct coda_aux_buf tempbuf; 858c2ecf20Sopenharmony_ci struct coda_aux_buf workbuf; 868c2ecf20Sopenharmony_ci struct gen_pool *iram_pool; 878c2ecf20Sopenharmony_ci struct coda_aux_buf iram; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci struct mutex dev_mutex; 908c2ecf20Sopenharmony_ci struct mutex coda_mutex; 918c2ecf20Sopenharmony_ci struct workqueue_struct *workqueue; 928c2ecf20Sopenharmony_ci struct v4l2_m2m_dev *m2m_dev; 938c2ecf20Sopenharmony_ci struct ida ida; 948c2ecf20Sopenharmony_ci struct dentry *debugfs_root; 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_cistruct coda_codec { 988c2ecf20Sopenharmony_ci u32 mode; 998c2ecf20Sopenharmony_ci u32 src_fourcc; 1008c2ecf20Sopenharmony_ci u32 dst_fourcc; 1018c2ecf20Sopenharmony_ci u32 max_w; 1028c2ecf20Sopenharmony_ci u32 max_h; 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_cistruct coda_huff_tab; 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_cistruct coda_params { 1088c2ecf20Sopenharmony_ci u8 rot_mode; 1098c2ecf20Sopenharmony_ci u8 h264_intra_qp; 1108c2ecf20Sopenharmony_ci u8 h264_inter_qp; 1118c2ecf20Sopenharmony_ci u8 h264_min_qp; 1128c2ecf20Sopenharmony_ci u8 h264_max_qp; 1138c2ecf20Sopenharmony_ci u8 h264_disable_deblocking_filter_idc; 1148c2ecf20Sopenharmony_ci s8 h264_slice_alpha_c0_offset_div2; 1158c2ecf20Sopenharmony_ci s8 h264_slice_beta_offset_div2; 1168c2ecf20Sopenharmony_ci bool h264_constrained_intra_pred_flag; 1178c2ecf20Sopenharmony_ci s8 h264_chroma_qp_index_offset; 1188c2ecf20Sopenharmony_ci u8 h264_profile_idc; 1198c2ecf20Sopenharmony_ci u8 h264_level_idc; 1208c2ecf20Sopenharmony_ci u8 mpeg2_profile_idc; 1218c2ecf20Sopenharmony_ci u8 mpeg2_level_idc; 1228c2ecf20Sopenharmony_ci u8 mpeg4_intra_qp; 1238c2ecf20Sopenharmony_ci u8 mpeg4_inter_qp; 1248c2ecf20Sopenharmony_ci u8 gop_size; 1258c2ecf20Sopenharmony_ci int intra_refresh; 1268c2ecf20Sopenharmony_ci enum v4l2_jpeg_chroma_subsampling jpeg_chroma_subsampling; 1278c2ecf20Sopenharmony_ci u8 jpeg_quality; 1288c2ecf20Sopenharmony_ci u8 jpeg_restart_interval; 1298c2ecf20Sopenharmony_ci u8 *jpeg_qmat_tab[3]; 1308c2ecf20Sopenharmony_ci int jpeg_qmat_index[3]; 1318c2ecf20Sopenharmony_ci int jpeg_huff_dc_index[3]; 1328c2ecf20Sopenharmony_ci int jpeg_huff_ac_index[3]; 1338c2ecf20Sopenharmony_ci u32 *jpeg_huff_data; 1348c2ecf20Sopenharmony_ci struct coda_huff_tab *jpeg_huff_tab; 1358c2ecf20Sopenharmony_ci int codec_mode; 1368c2ecf20Sopenharmony_ci int codec_mode_aux; 1378c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_multi_slice_mode slice_mode; 1388c2ecf20Sopenharmony_ci u32 framerate; 1398c2ecf20Sopenharmony_ci u16 bitrate; 1408c2ecf20Sopenharmony_ci u16 vbv_delay; 1418c2ecf20Sopenharmony_ci u32 vbv_size; 1428c2ecf20Sopenharmony_ci u32 slice_max_bits; 1438c2ecf20Sopenharmony_ci u32 slice_max_mb; 1448c2ecf20Sopenharmony_ci bool force_ipicture; 1458c2ecf20Sopenharmony_ci bool gop_size_changed; 1468c2ecf20Sopenharmony_ci bool bitrate_changed; 1478c2ecf20Sopenharmony_ci bool framerate_changed; 1488c2ecf20Sopenharmony_ci bool h264_intra_qp_changed; 1498c2ecf20Sopenharmony_ci bool intra_refresh_changed; 1508c2ecf20Sopenharmony_ci bool slice_mode_changed; 1518c2ecf20Sopenharmony_ci bool frame_rc_enable; 1528c2ecf20Sopenharmony_ci bool mb_rc_enable; 1538c2ecf20Sopenharmony_ci}; 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_cistruct coda_buffer_meta { 1568c2ecf20Sopenharmony_ci struct list_head list; 1578c2ecf20Sopenharmony_ci u32 sequence; 1588c2ecf20Sopenharmony_ci struct v4l2_timecode timecode; 1598c2ecf20Sopenharmony_ci u64 timestamp; 1608c2ecf20Sopenharmony_ci unsigned int start; 1618c2ecf20Sopenharmony_ci unsigned int end; 1628c2ecf20Sopenharmony_ci bool last; 1638c2ecf20Sopenharmony_ci}; 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci/* Per-queue, driver-specific private data */ 1668c2ecf20Sopenharmony_cistruct coda_q_data { 1678c2ecf20Sopenharmony_ci unsigned int width; 1688c2ecf20Sopenharmony_ci unsigned int height; 1698c2ecf20Sopenharmony_ci unsigned int bytesperline; 1708c2ecf20Sopenharmony_ci unsigned int sizeimage; 1718c2ecf20Sopenharmony_ci unsigned int fourcc; 1728c2ecf20Sopenharmony_ci struct v4l2_rect rect; 1738c2ecf20Sopenharmony_ci}; 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_cistruct coda_iram_info { 1768c2ecf20Sopenharmony_ci u32 axi_sram_use; 1778c2ecf20Sopenharmony_ci phys_addr_t buf_bit_use; 1788c2ecf20Sopenharmony_ci phys_addr_t buf_ip_ac_dc_use; 1798c2ecf20Sopenharmony_ci phys_addr_t buf_dbk_y_use; 1808c2ecf20Sopenharmony_ci phys_addr_t buf_dbk_c_use; 1818c2ecf20Sopenharmony_ci phys_addr_t buf_ovl_use; 1828c2ecf20Sopenharmony_ci phys_addr_t buf_btp_use; 1838c2ecf20Sopenharmony_ci phys_addr_t search_ram_paddr; 1848c2ecf20Sopenharmony_ci int search_ram_size; 1858c2ecf20Sopenharmony_ci int remaining; 1868c2ecf20Sopenharmony_ci phys_addr_t next_paddr; 1878c2ecf20Sopenharmony_ci}; 1888c2ecf20Sopenharmony_ci 1898c2ecf20Sopenharmony_ci#define GDI_LINEAR_FRAME_MAP 0 1908c2ecf20Sopenharmony_ci#define GDI_TILED_FRAME_MB_RASTER_MAP 1 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_cistruct coda_ctx; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_cistruct coda_context_ops { 1958c2ecf20Sopenharmony_ci int (*queue_init)(void *priv, struct vb2_queue *src_vq, 1968c2ecf20Sopenharmony_ci struct vb2_queue *dst_vq); 1978c2ecf20Sopenharmony_ci int (*reqbufs)(struct coda_ctx *ctx, struct v4l2_requestbuffers *rb); 1988c2ecf20Sopenharmony_ci int (*start_streaming)(struct coda_ctx *ctx); 1998c2ecf20Sopenharmony_ci int (*prepare_run)(struct coda_ctx *ctx); 2008c2ecf20Sopenharmony_ci void (*finish_run)(struct coda_ctx *ctx); 2018c2ecf20Sopenharmony_ci void (*run_timeout)(struct coda_ctx *ctx); 2028c2ecf20Sopenharmony_ci void (*seq_init_work)(struct work_struct *work); 2038c2ecf20Sopenharmony_ci void (*seq_end_work)(struct work_struct *work); 2048c2ecf20Sopenharmony_ci void (*release)(struct coda_ctx *ctx); 2058c2ecf20Sopenharmony_ci}; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_cistruct coda_internal_frame { 2088c2ecf20Sopenharmony_ci struct coda_aux_buf buf; 2098c2ecf20Sopenharmony_ci struct coda_buffer_meta meta; 2108c2ecf20Sopenharmony_ci u32 type; 2118c2ecf20Sopenharmony_ci u32 error; 2128c2ecf20Sopenharmony_ci}; 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_cistruct coda_ctx { 2158c2ecf20Sopenharmony_ci struct coda_dev *dev; 2168c2ecf20Sopenharmony_ci struct mutex buffer_mutex; 2178c2ecf20Sopenharmony_ci struct work_struct pic_run_work; 2188c2ecf20Sopenharmony_ci struct work_struct seq_init_work; 2198c2ecf20Sopenharmony_ci struct work_struct seq_end_work; 2208c2ecf20Sopenharmony_ci struct completion completion; 2218c2ecf20Sopenharmony_ci const struct coda_video_device *cvd; 2228c2ecf20Sopenharmony_ci const struct coda_context_ops *ops; 2238c2ecf20Sopenharmony_ci int aborting; 2248c2ecf20Sopenharmony_ci int initialized; 2258c2ecf20Sopenharmony_ci int streamon_out; 2268c2ecf20Sopenharmony_ci int streamon_cap; 2278c2ecf20Sopenharmony_ci u32 qsequence; 2288c2ecf20Sopenharmony_ci u32 osequence; 2298c2ecf20Sopenharmony_ci u32 sequence_offset; 2308c2ecf20Sopenharmony_ci struct coda_q_data q_data[2]; 2318c2ecf20Sopenharmony_ci enum coda_inst_type inst_type; 2328c2ecf20Sopenharmony_ci const struct coda_codec *codec; 2338c2ecf20Sopenharmony_ci enum v4l2_colorspace colorspace; 2348c2ecf20Sopenharmony_ci enum v4l2_xfer_func xfer_func; 2358c2ecf20Sopenharmony_ci enum v4l2_ycbcr_encoding ycbcr_enc; 2368c2ecf20Sopenharmony_ci enum v4l2_quantization quantization; 2378c2ecf20Sopenharmony_ci struct coda_params params; 2388c2ecf20Sopenharmony_ci struct v4l2_ctrl_handler ctrls; 2398c2ecf20Sopenharmony_ci struct v4l2_ctrl *h264_profile_ctrl; 2408c2ecf20Sopenharmony_ci struct v4l2_ctrl *h264_level_ctrl; 2418c2ecf20Sopenharmony_ci struct v4l2_ctrl *mpeg2_profile_ctrl; 2428c2ecf20Sopenharmony_ci struct v4l2_ctrl *mpeg2_level_ctrl; 2438c2ecf20Sopenharmony_ci struct v4l2_ctrl *mpeg4_profile_ctrl; 2448c2ecf20Sopenharmony_ci struct v4l2_ctrl *mpeg4_level_ctrl; 2458c2ecf20Sopenharmony_ci struct v4l2_fh fh; 2468c2ecf20Sopenharmony_ci int gopcounter; 2478c2ecf20Sopenharmony_ci int runcounter; 2488c2ecf20Sopenharmony_ci int jpeg_ecs_offset; 2498c2ecf20Sopenharmony_ci char vpu_header[3][64]; 2508c2ecf20Sopenharmony_ci int vpu_header_size[3]; 2518c2ecf20Sopenharmony_ci struct kfifo bitstream_fifo; 2528c2ecf20Sopenharmony_ci struct mutex bitstream_mutex; 2538c2ecf20Sopenharmony_ci struct coda_aux_buf bitstream; 2548c2ecf20Sopenharmony_ci bool hold; 2558c2ecf20Sopenharmony_ci struct coda_aux_buf parabuf; 2568c2ecf20Sopenharmony_ci struct coda_aux_buf psbuf; 2578c2ecf20Sopenharmony_ci struct coda_aux_buf slicebuf; 2588c2ecf20Sopenharmony_ci struct coda_internal_frame internal_frames[CODA_MAX_FRAMEBUFFERS]; 2598c2ecf20Sopenharmony_ci struct list_head buffer_meta_list; 2608c2ecf20Sopenharmony_ci spinlock_t buffer_meta_lock; 2618c2ecf20Sopenharmony_ci int num_metas; 2628c2ecf20Sopenharmony_ci struct coda_aux_buf workbuf; 2638c2ecf20Sopenharmony_ci int num_internal_frames; 2648c2ecf20Sopenharmony_ci int idx; 2658c2ecf20Sopenharmony_ci int reg_idx; 2668c2ecf20Sopenharmony_ci struct coda_iram_info iram_info; 2678c2ecf20Sopenharmony_ci int tiled_map_type; 2688c2ecf20Sopenharmony_ci u32 bit_stream_param; 2698c2ecf20Sopenharmony_ci u32 frm_dis_flg; 2708c2ecf20Sopenharmony_ci u32 frame_mem_ctrl; 2718c2ecf20Sopenharmony_ci u32 para_change; 2728c2ecf20Sopenharmony_ci int display_idx; 2738c2ecf20Sopenharmony_ci struct dentry *debugfs_entry; 2748c2ecf20Sopenharmony_ci bool use_bit; 2758c2ecf20Sopenharmony_ci bool use_vdoa; 2768c2ecf20Sopenharmony_ci struct vdoa_ctx *vdoa; 2778c2ecf20Sopenharmony_ci /* 2788c2ecf20Sopenharmony_ci * wakeup mutex used to serialize encoder stop command and finish_run, 2798c2ecf20Sopenharmony_ci * ensures that finish_run always either flags the last returned buffer 2808c2ecf20Sopenharmony_ci * or wakes up the capture queue to signal EOS afterwards. 2818c2ecf20Sopenharmony_ci */ 2828c2ecf20Sopenharmony_ci struct mutex wakeup_mutex; 2838c2ecf20Sopenharmony_ci}; 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_ciextern int coda_debug; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci#define coda_dbg(level, ctx, fmt, arg...) \ 2888c2ecf20Sopenharmony_ci do { \ 2898c2ecf20Sopenharmony_ci if (coda_debug >= (level)) \ 2908c2ecf20Sopenharmony_ci v4l2_dbg((level), coda_debug, &(ctx)->dev->v4l2_dev, \ 2918c2ecf20Sopenharmony_ci "%u: " fmt, (ctx)->idx, ##arg); \ 2928c2ecf20Sopenharmony_ci } while (0) 2938c2ecf20Sopenharmony_ci 2948c2ecf20Sopenharmony_civoid coda_write(struct coda_dev *dev, u32 data, u32 reg); 2958c2ecf20Sopenharmony_ciunsigned int coda_read(struct coda_dev *dev, u32 reg); 2968c2ecf20Sopenharmony_civoid coda_write_base(struct coda_ctx *ctx, struct coda_q_data *q_data, 2978c2ecf20Sopenharmony_ci struct vb2_v4l2_buffer *buf, unsigned int reg_y); 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ciint coda_alloc_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf, 3008c2ecf20Sopenharmony_ci size_t size, const char *name, struct dentry *parent); 3018c2ecf20Sopenharmony_civoid coda_free_aux_buf(struct coda_dev *dev, struct coda_aux_buf *buf); 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ciint coda_encoder_queue_init(void *priv, struct vb2_queue *src_vq, 3048c2ecf20Sopenharmony_ci struct vb2_queue *dst_vq); 3058c2ecf20Sopenharmony_ciint coda_decoder_queue_init(void *priv, struct vb2_queue *src_vq, 3068c2ecf20Sopenharmony_ci struct vb2_queue *dst_vq); 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ciint coda_hw_reset(struct coda_ctx *ctx); 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_civoid coda_fill_bitstream(struct coda_ctx *ctx, struct list_head *buffer_list); 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_civoid coda_set_gdi_regs(struct coda_ctx *ctx); 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_cistatic inline struct coda_q_data *get_q_data(struct coda_ctx *ctx, 3158c2ecf20Sopenharmony_ci enum v4l2_buf_type type) 3168c2ecf20Sopenharmony_ci{ 3178c2ecf20Sopenharmony_ci switch (type) { 3188c2ecf20Sopenharmony_ci case V4L2_BUF_TYPE_VIDEO_OUTPUT: 3198c2ecf20Sopenharmony_ci return &(ctx->q_data[V4L2_M2M_SRC]); 3208c2ecf20Sopenharmony_ci case V4L2_BUF_TYPE_VIDEO_CAPTURE: 3218c2ecf20Sopenharmony_ci return &(ctx->q_data[V4L2_M2M_DST]); 3228c2ecf20Sopenharmony_ci default: 3238c2ecf20Sopenharmony_ci return NULL; 3248c2ecf20Sopenharmony_ci } 3258c2ecf20Sopenharmony_ci} 3268c2ecf20Sopenharmony_ci 3278c2ecf20Sopenharmony_ciconst char *coda_product_name(int product); 3288c2ecf20Sopenharmony_ci 3298c2ecf20Sopenharmony_ciint coda_check_firmware(struct coda_dev *dev); 3308c2ecf20Sopenharmony_ci 3318c2ecf20Sopenharmony_cistatic inline unsigned int coda_get_bitstream_payload(struct coda_ctx *ctx) 3328c2ecf20Sopenharmony_ci{ 3338c2ecf20Sopenharmony_ci return kfifo_len(&ctx->bitstream_fifo); 3348c2ecf20Sopenharmony_ci} 3358c2ecf20Sopenharmony_ci 3368c2ecf20Sopenharmony_ci/* 3378c2ecf20Sopenharmony_ci * The bitstream prefetcher needs to read at least 2 256 byte periods past 3388c2ecf20Sopenharmony_ci * the desired bitstream position for all data to reach the decoder. 3398c2ecf20Sopenharmony_ci */ 3408c2ecf20Sopenharmony_cistatic inline bool coda_bitstream_can_fetch_past(struct coda_ctx *ctx, 3418c2ecf20Sopenharmony_ci unsigned int pos) 3428c2ecf20Sopenharmony_ci{ 3438c2ecf20Sopenharmony_ci return (int)(ctx->bitstream_fifo.kfifo.in - ALIGN(pos, 256)) > 512; 3448c2ecf20Sopenharmony_ci} 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cibool coda_bitstream_can_fetch_past(struct coda_ctx *ctx, unsigned int pos); 3478c2ecf20Sopenharmony_ciint coda_bitstream_flush(struct coda_ctx *ctx); 3488c2ecf20Sopenharmony_ci 3498c2ecf20Sopenharmony_civoid coda_bit_stream_end_flag(struct coda_ctx *ctx); 3508c2ecf20Sopenharmony_ci 3518c2ecf20Sopenharmony_civoid coda_m2m_buf_done(struct coda_ctx *ctx, struct vb2_v4l2_buffer *buf, 3528c2ecf20Sopenharmony_ci enum vb2_buffer_state state); 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ciint coda_h264_filler_nal(int size, char *p); 3558c2ecf20Sopenharmony_ciint coda_h264_padding(int size, char *p); 3568c2ecf20Sopenharmony_ciint coda_h264_profile(int profile_idc); 3578c2ecf20Sopenharmony_ciint coda_h264_level(int level_idc); 3588c2ecf20Sopenharmony_ciint coda_sps_parse_profile(struct coda_ctx *ctx, struct vb2_buffer *vb); 3598c2ecf20Sopenharmony_ciint coda_h264_sps_fixup(struct coda_ctx *ctx, int width, int height, char *buf, 3608c2ecf20Sopenharmony_ci int *size, int max_size); 3618c2ecf20Sopenharmony_ci 3628c2ecf20Sopenharmony_ciint coda_mpeg2_profile(int profile_idc); 3638c2ecf20Sopenharmony_ciint coda_mpeg2_level(int level_idc); 3648c2ecf20Sopenharmony_ciu32 coda_mpeg2_parse_headers(struct coda_ctx *ctx, u8 *buf, u32 size); 3658c2ecf20Sopenharmony_ciint coda_mpeg4_profile(int profile_idc); 3668c2ecf20Sopenharmony_ciint coda_mpeg4_level(int level_idc); 3678c2ecf20Sopenharmony_ciu32 coda_mpeg4_parse_headers(struct coda_ctx *ctx, u8 *buf, u32 size); 3688c2ecf20Sopenharmony_ci 3698c2ecf20Sopenharmony_civoid coda_update_profile_level_ctrls(struct coda_ctx *ctx, u8 profile_idc, 3708c2ecf20Sopenharmony_ci u8 level_idc); 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_cibool coda_jpeg_check_buffer(struct coda_ctx *ctx, struct vb2_buffer *vb); 3738c2ecf20Sopenharmony_ciint coda_jpeg_decode_header(struct coda_ctx *ctx, struct vb2_buffer *vb); 3748c2ecf20Sopenharmony_ciint coda_jpeg_write_tables(struct coda_ctx *ctx); 3758c2ecf20Sopenharmony_civoid coda_set_jpeg_compression_quality(struct coda_ctx *ctx, int quality); 3768c2ecf20Sopenharmony_ci 3778c2ecf20Sopenharmony_ciextern const struct coda_context_ops coda_bit_encode_ops; 3788c2ecf20Sopenharmony_ciextern const struct coda_context_ops coda_bit_decode_ops; 3798c2ecf20Sopenharmony_ciextern const struct coda_context_ops coda9_jpeg_encode_ops; 3808c2ecf20Sopenharmony_ciextern const struct coda_context_ops coda9_jpeg_decode_ops; 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ciirqreturn_t coda_irq_handler(int irq, void *data); 3838c2ecf20Sopenharmony_ciirqreturn_t coda9_jpeg_irq_handler(int irq, void *data); 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci#endif /* __CODA_H__ */ 386