/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Samsung S5P Multi Format Codec v 5.0 * * This file contains definitions of enums and structs used by the codec * driver. * * Copyright (C) 2011 Samsung Electronics Co., Ltd. * Kamil Debski, <k.debski@samsung.com>
*/
/** * struct s5p_mfc_priv_buf - represents internal used buffer * @ofs: offset of each buffer, will be used for MFC * @virt: kernel virtual address, only valid when the * buffer accessed by driver * @dma: DMA address, only valid when kernel DMA API used * @size: size of the buffer * @ctx: memory context (bank) used for this allocation
*/ struct s5p_mfc_priv_buf { unsignedlong ofs; void *virt;
dma_addr_t dma;
size_t size; unsignedint ctx;
};
/** * struct s5p_mfc_dev - The struct containing driver internal parameters. * * @v4l2_dev: v4l2_device * @vfd_dec: video device for decoding * @vfd_enc: video device for encoding * @plat_dev: platform device * @mem_dev: child devices of the memory banks * @regs_base: base address of the MFC hw registers * @irq: irq resource * @dec_ctrl_handler: control framework handler for decoding * @enc_ctrl_handler: control framework handler for encoding * @pm: power management control * @variant: MFC hardware variant information * @num_inst: counter of active MFC instances * @irqlock: lock for operations on videobuf2 queues * @condlock: lock for changing/checking if a context is ready to be * processed * @mfc_mutex: lock for video_device * @int_cond: variable used by the waitqueue * @int_type: type of last interrupt * @int_err: error number for last interrupt * @queue: waitqueue for waiting for completion of device commands * @fw_buf: the firmware buffer data structure * @mem_size: size of the firmware operation memory * @mem_base: base DMA address of the firmware operation memory * @mem_bitmap: bitmap for managing MFC internal buffer allocations * @mem_virt: virtual address of the firmware operation memory * @dma_base: address of the beginning of memory banks * @hw_lock: used for hardware locking * @ctx: array of driver contexts * @curr_ctx: number of the currently running context * @ctx_work_bits: used to mark which contexts are waiting for hardware * @watchdog_cnt: counter for the watchdog * @watchdog_timer: timer for the watchdog * @watchdog_workqueue: workqueue for the watchdog * @watchdog_work: worker for the watchdog * @enter_suspend: flag set when entering suspend * @ctx_buf: common context memory (MFCv6) * @warn_start: hardware error code from which warnings start * @mfc_ops: ops structure holding HW operation function pointers * @mfc_cmds: cmd structure holding HW commands function pointers * @mfc_regs: structure holding MFC registers * @fw_ver: loaded firmware sub-version * @fw_get_done: flag set when request_firmware() is complete and * copied into fw_buf * @risc_on: flag indicates RISC is on or off *
*/ struct s5p_mfc_dev { struct v4l2_device v4l2_dev; struct video_device *vfd_dec; struct video_device *vfd_enc; struct platform_device *plat_dev; struct device *mem_dev[BANK_CTX_NUM]; void __iomem *regs_base; int irq; struct v4l2_ctrl_handler dec_ctrl_handler; struct v4l2_ctrl_handler enc_ctrl_handler; struct s5p_mfc_pm pm; conststruct s5p_mfc_variant *variant; int num_inst;
spinlock_t irqlock; /* lock when operating on context */
spinlock_t condlock; /* lock when changing/checking if a context is
ready to be processed */ struct mutex mfc_mutex; /* video_device lock */ int int_cond; int int_type; unsignedint int_err;
wait_queue_head_t queue; struct s5p_mfc_priv_buf fw_buf;
size_t mem_size;
dma_addr_t mem_base; unsignedlong *mem_bitmap; void *mem_virt;
dma_addr_t dma_base[BANK_CTX_NUM]; unsignedlong hw_lock; struct s5p_mfc_ctx *ctx[MFC_NUM_CONTEXTS]; int curr_ctx; unsignedlong ctx_work_bits;
atomic_t watchdog_cnt; struct timer_list watchdog_timer; struct workqueue_struct *watchdog_workqueue; struct work_struct watchdog_work; unsignedlong enter_suspend;
struct s5p_mfc_priv_buf ctx_buf; int warn_start; conststruct s5p_mfc_hw_ops *mfc_ops; conststruct s5p_mfc_hw_cmds *mfc_cmds; conststruct s5p_mfc_regs *mfc_regs; enum s5p_mfc_fw_ver fw_ver; bool fw_get_done; bool risc_on; /* indicates if RISC is on or off */
};
/* * struct s5p_mfc_h264_enc_params - encoding parameters for h264
*/ struct s5p_mfc_h264_enc_params { enum v4l2_mpeg_video_h264_profile profile; enum v4l2_mpeg_video_h264_loop_filter_mode loop_filter_mode;
s8 loop_filter_alpha;
s8 loop_filter_beta; enum v4l2_mpeg_video_h264_entropy_mode entropy_mode;
u8 max_ref_pic;
u8 num_ref_pic_4p; int _8x8_transform; int rc_mb_dark; int rc_mb_smooth; int rc_mb_static; int rc_mb_activity; int vui_sar;
u8 vui_sar_idc;
u16 vui_ext_sar_width;
u16 vui_ext_sar_height; int open_gop;
u16 open_gop_size;
u8 rc_frame_qp;
u8 rc_min_qp;
u8 rc_max_qp;
u8 rc_p_frame_qp;
u8 rc_b_frame_qp; enum v4l2_mpeg_video_h264_level level_v4l2; int level;
u16 cpb_size; int interlace;
u8 hier_qp;
u8 hier_qp_type;
u8 hier_qp_layer;
u8 hier_qp_layer_qp[7];
u8 sei_frame_packing;
u8 sei_fp_curr_frame_0;
u8 sei_fp_arrangement_type;
/** * struct s5p_mfc_ctx - This struct contains the instance context * * @dev: pointer to the s5p_mfc_dev of the device * @fh: struct v4l2_fh * @num: number of the context that this structure describes * @int_cond: variable used by the waitqueue * @int_type: type of the last interrupt * @int_err: error number received from MFC hw in the interrupt * @queue: waitqueue that can be used to wait for this context to * finish * @src_fmt: source pixelformat information * @dst_fmt: destination pixelformat information * @vq_src: vb2 queue for source buffers * @vq_dst: vb2 queue for destination buffers * @src_queue: driver internal queue for source buffers * @dst_queue: driver internal queue for destination buffers * @src_queue_cnt: number of buffers queued on the source internal queue * @dst_queue_cnt: number of buffers queued on the dest internal queue * @type: type of the instance - decoder or encoder * @state: state of the context * @inst_no: number of hw instance associated with the context * @img_width: width of the image that is decoded or encoded * @img_height: height of the image that is decoded or encoded * @buf_width: width of the buffer for processed image * @buf_height: height of the buffer for processed image * @luma_size: size of a luma plane * @chroma_size: size of a chroma plane * @mv_size: size of a motion vectors buffer * @consumed_stream: number of bytes that have been used so far from the * decoding buffer * @dpb_flush_flag: flag used to indicate that a DPB buffers are being * flushed * @head_processed: flag mentioning whether the header data is processed * completely or not * @bank1: handle to memory allocated for temporary buffers from * memory bank 1 * @bank2: handle to memory allocated for temporary buffers from * memory bank 2 * @capture_state: state of the capture buffers queue * @output_state: state of the output buffers queue * @src_bufs: information on allocated source buffers * @src_bufs_cnt: number of allocated source buffers * @dst_bufs: information on allocated destination buffers * @dst_bufs_cnt: number of allocated destination buffers * @sequence: counter for the sequence number for v4l2 * @dec_dst_flag: flags for buffers queued in the hardware * @dec_src_buf_size: size of the buffer for source buffers in decoding * @codec_mode: number of codec mode used by MFC hw * @slice_interface: slice interface flag * @loop_filter_mpeg4: loop filter for MPEG4 flag * @display_delay: value of the display delay for H264 * @display_delay_enable: display delay for H264 enable flag * @after_packed_pb: flag used to track buffer when stream is in * Packed PB format * @sei_fp_parse: enable/disable parsing of frame packing SEI information * @pb_count: count of the DPB buffers required by MFC hw * @total_dpb_count: count of DPB buffers with additional buffers * requested by the application * @ctx: context buffer information * @dsc: descriptor buffer information * @shm: shared memory buffer information * @mv_count: number of MV buffers allocated for decoding * @enc_params: encoding parameters for MFC * @enc_dst_buf_size: size of the buffers for encoder output * @luma_dpb_size: dpb buffer size for luma * @chroma_dpb_size: dpb buffer size for chroma * @me_buffer_size: size of the motion estimation buffer * @tmv_buffer_size: size of temporal predictor motion vector buffer * @ref_queue: list of the reference buffers for encoding * @force_frame_type: encoder's frame type forcing control * @ref_queue_cnt: number of the buffers in the reference list * @slice_size: slice size * @slice_mode: mode of dividing frames into slices * @c_ops: ops for encoding * @ctrls: array of controls, used when adding controls to the * v4l2 control framework * @ctrl_handler: handler for v4l2 framework * @scratch_buf_size: scratch buffer size * @is_10bit: state to check 10bit support * @is_422: state to check YUV422 10bit format * @chroma_size_1: size of a chroma third plane * @stride: size of stride for all planes
*/ struct s5p_mfc_ctx { struct s5p_mfc_dev *dev; struct v4l2_fh fh;
int num;
int int_cond; int int_type; unsignedint int_err;
wait_queue_head_t queue;
/* Control values */ int codec_mode; int slice_interface; int loop_filter_mpeg4; int display_delay; int display_delay_enable; int after_packed_pb; int sei_fp_parse;
int pb_count; int total_dpb_count; int mv_count; /* Buffers */ struct s5p_mfc_priv_buf ctx; struct s5p_mfc_priv_buf dsc; struct s5p_mfc_priv_buf shm;
struct v4l2_ctrl *ctrls[MFC_MAX_CTRLS]; struct v4l2_ctrl_handler ctrl_handler;
size_t scratch_buf_size; int is_10bit; int is_422; int stride[VB2_MAX_PLANE_COUNT];
};
/* * struct s5p_mfc_fmt - structure used to store information about pixelformats * used by the MFC
*/ struct s5p_mfc_fmt {
u32 fourcc;
u32 codec_mode; enum s5p_mfc_fmt_type type;
u32 num_planes;
u32 versions;
u32 flags;
};
/* * struct mfc_control - structure used to store information about MFC controls * it is used to initialize the control framework.
*/ struct mfc_control {
__u32 id; enum v4l2_ctrl_type type;
__u8 name[32]; /* Whatever */
__s32 minimum; /* Note signedness */
__s32 maximum;
__s32 step;
__u32 menu_skip_mask;
__s32 default_value;
__u32 flags;
__u32 reserved[2];
__u8 is_volatile;
};
/* Macro for making hardware specific calls */ #define s5p_mfc_hw_call(f, op, args...) \
((f && f->op) ? f->op(args) : (typeof(f->op(args)))(-ENODEV))
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.