linux/drivers/media/platform/mtk-vcodec/mtk_vcodec_drv.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3* Copyright (c) 2016 MediaTek Inc.
   4* Author: PC Chen <pc.chen@mediatek.com>
   5*         Tiffany Lin <tiffany.lin@mediatek.com>
   6*/
   7
   8#ifndef _MTK_VCODEC_DRV_H_
   9#define _MTK_VCODEC_DRV_H_
  10
  11#include <linux/platform_device.h>
  12#include <linux/videodev2.h>
  13#include <media/v4l2-ctrls.h>
  14#include <media/v4l2-device.h>
  15#include <media/v4l2-ioctl.h>
  16#include <media/videobuf2-core.h>
  17#include "mtk_vcodec_util.h"
  18
  19#define MTK_VCODEC_DRV_NAME     "mtk_vcodec_drv"
  20#define MTK_VCODEC_DEC_NAME     "mtk-vcodec-dec"
  21#define MTK_VCODEC_ENC_NAME     "mtk-vcodec-enc"
  22#define MTK_PLATFORM_STR        "platform:mt8173"
  23
  24#define MTK_VCODEC_MAX_PLANES   3
  25#define MTK_V4L2_BENCHMARK      0
  26#define WAIT_INTR_TIMEOUT_MS    1000
  27
  28/*
  29 * enum mtk_hw_reg_idx - MTK hw register base index
  30 */
  31enum mtk_hw_reg_idx {
  32        VDEC_SYS,
  33        VDEC_MISC,
  34        VDEC_LD,
  35        VDEC_TOP,
  36        VDEC_CM,
  37        VDEC_AD,
  38        VDEC_AV,
  39        VDEC_PP,
  40        VDEC_HWD,
  41        VDEC_HWQ,
  42        VDEC_HWB,
  43        VDEC_HWG,
  44        NUM_MAX_VDEC_REG_BASE,
  45        /* h264 encoder */
  46        VENC_SYS = NUM_MAX_VDEC_REG_BASE,
  47        /* vp8 encoder */
  48        VENC_LT_SYS,
  49        NUM_MAX_VCODEC_REG_BASE
  50};
  51
  52/*
  53 * enum mtk_instance_type - The type of an MTK Vcodec instance.
  54 */
  55enum mtk_instance_type {
  56        MTK_INST_DECODER                = 0,
  57        MTK_INST_ENCODER                = 1,
  58};
  59
  60/**
  61 * enum mtk_instance_state - The state of an MTK Vcodec instance.
  62 * @MTK_STATE_FREE: default state when instance is created
  63 * @MTK_STATE_INIT: vcodec instance is initialized
  64 * @MTK_STATE_HEADER: vdec had sps/pps header parsed or venc
  65 *                      had sps/pps header encoded
  66 * @MTK_STATE_FLUSH: vdec is flushing. Only used by decoder
  67 * @MTK_STATE_ABORT: vcodec should be aborted
  68 */
  69enum mtk_instance_state {
  70        MTK_STATE_FREE = 0,
  71        MTK_STATE_INIT = 1,
  72        MTK_STATE_HEADER = 2,
  73        MTK_STATE_FLUSH = 3,
  74        MTK_STATE_ABORT = 4,
  75};
  76
  77/*
  78 * enum mtk_encode_param - General encoding parameters type
  79 */
  80enum mtk_encode_param {
  81        MTK_ENCODE_PARAM_NONE = 0,
  82        MTK_ENCODE_PARAM_BITRATE = (1 << 0),
  83        MTK_ENCODE_PARAM_FRAMERATE = (1 << 1),
  84        MTK_ENCODE_PARAM_INTRA_PERIOD = (1 << 2),
  85        MTK_ENCODE_PARAM_FORCE_INTRA = (1 << 3),
  86        MTK_ENCODE_PARAM_GOP_SIZE = (1 << 4),
  87};
  88
  89enum mtk_fmt_type {
  90        MTK_FMT_DEC = 0,
  91        MTK_FMT_ENC = 1,
  92        MTK_FMT_FRAME = 2,
  93};
  94
  95/*
  96 * struct mtk_video_fmt - Structure used to store information about pixelformats
  97 */
  98struct mtk_video_fmt {
  99        u32     fourcc;
 100        enum mtk_fmt_type       type;
 101        u32     num_planes;
 102        u32     flags;
 103};
 104
 105/*
 106 * struct mtk_codec_framesizes - Structure used to store information about
 107 *                                                      framesizes
 108 */
 109struct mtk_codec_framesizes {
 110        u32     fourcc;
 111        struct  v4l2_frmsize_stepwise   stepwise;
 112};
 113
 114/*
 115 * enum mtk_q_type - Type of queue
 116 */
 117enum mtk_q_type {
 118        MTK_Q_DATA_SRC = 0,
 119        MTK_Q_DATA_DST = 1,
 120};
 121
 122/*
 123 * struct mtk_q_data - Structure used to store information about queue
 124 */
 125struct mtk_q_data {
 126        unsigned int    visible_width;
 127        unsigned int    visible_height;
 128        unsigned int    coded_width;
 129        unsigned int    coded_height;
 130        enum v4l2_field field;
 131        unsigned int    bytesperline[MTK_VCODEC_MAX_PLANES];
 132        unsigned int    sizeimage[MTK_VCODEC_MAX_PLANES];
 133        const struct mtk_video_fmt      *fmt;
 134};
 135
 136/**
 137 * struct mtk_enc_params - General encoding parameters
 138 * @bitrate: target bitrate in bits per second
 139 * @num_b_frame: number of b frames between p-frame
 140 * @rc_frame: frame based rate control
 141 * @rc_mb: macroblock based rate control
 142 * @seq_hdr_mode: H.264 sequence header is encoded separately or joined
 143 *                with the first frame
 144 * @intra_period: I frame period
 145 * @gop_size: group of picture size, it's used as the intra frame period
 146 * @framerate_num: frame rate numerator. ex: framerate_num=30 and
 147 *                 framerate_denom=1 means FPS is 30
 148 * @framerate_denom: frame rate denominator. ex: framerate_num=30 and
 149 *                   framerate_denom=1 means FPS is 30
 150 * @h264_max_qp: Max value for H.264 quantization parameter
 151 * @h264_profile: V4L2 defined H.264 profile
 152 * @h264_level: V4L2 defined H.264 level
 153 * @force_intra: force/insert intra frame
 154 */
 155struct mtk_enc_params {
 156        unsigned int    bitrate;
 157        unsigned int    num_b_frame;
 158        unsigned int    rc_frame;
 159        unsigned int    rc_mb;
 160        unsigned int    seq_hdr_mode;
 161        unsigned int    intra_period;
 162        unsigned int    gop_size;
 163        unsigned int    framerate_num;
 164        unsigned int    framerate_denom;
 165        unsigned int    h264_max_qp;
 166        unsigned int    h264_profile;
 167        unsigned int    h264_level;
 168        unsigned int    force_intra;
 169};
 170
 171/*
 172 * struct mtk_vcodec_clk_info - Structure used to store clock name
 173 */
 174struct mtk_vcodec_clk_info {
 175        const char      *clk_name;
 176        struct clk      *vcodec_clk;
 177};
 178
 179/*
 180 * struct mtk_vcodec_clk - Structure used to store vcodec clock information
 181 */
 182struct mtk_vcodec_clk {
 183        struct mtk_vcodec_clk_info      *clk_info;
 184        int     clk_num;
 185};
 186
 187/*
 188 * struct mtk_vcodec_pm - Power management data structure
 189 */
 190struct mtk_vcodec_pm {
 191        struct mtk_vcodec_clk   vdec_clk;
 192        struct device   *larbvdec;
 193
 194        struct mtk_vcodec_clk   venc_clk;
 195        struct device   *larbvenc;
 196        struct device   *dev;
 197        struct mtk_vcodec_dev   *mtkdev;
 198};
 199
 200/**
 201 * struct vdec_pic_info  - picture size information
 202 * @pic_w: picture width
 203 * @pic_h: picture height
 204 * @buf_w: picture buffer width (64 aligned up from pic_w)
 205 * @buf_h: picture buffer heiht (64 aligned up from pic_h)
 206 * @fb_sz: bitstream size of each plane
 207 * E.g. suppose picture size is 176x144,
 208 *      buffer size will be aligned to 176x160.
 209 * @cap_fourcc: fourcc number(may changed when resolution change)
 210 * @reserved: align struct to 64-bit in order to adjust 32-bit and 64-bit os.
 211 */
 212struct vdec_pic_info {
 213        unsigned int pic_w;
 214        unsigned int pic_h;
 215        unsigned int buf_w;
 216        unsigned int buf_h;
 217        unsigned int fb_sz[VIDEO_MAX_PLANES];
 218        unsigned int cap_fourcc;
 219        unsigned int reserved;
 220};
 221
 222/**
 223 * struct mtk_vcodec_ctx - Context (instance) private data.
 224 *
 225 * @type: type of the instance - decoder or encoder
 226 * @dev: pointer to the mtk_vcodec_dev of the device
 227 * @list: link to ctx_list of mtk_vcodec_dev
 228 * @fh: struct v4l2_fh
 229 * @m2m_ctx: pointer to the v4l2_m2m_ctx of the context
 230 * @q_data: store information of input and output queue
 231 *          of the context
 232 * @id: index of the context that this structure describes
 233 * @state: state of the context
 234 * @param_change: indicate encode parameter type
 235 * @enc_params: encoding parameters
 236 * @dec_if: hooked decoder driver interface
 237 * @enc_if: hoooked encoder driver interface
 238 * @drv_handle: driver handle for specific decode/encode instance
 239 *
 240 * @picinfo: store picture info after header parsing
 241 * @dpb_size: store dpb count after header parsing
 242 * @int_cond: variable used by the waitqueue
 243 * @int_type: type of the last interrupt
 244 * @queue: waitqueue that can be used to wait for this context to
 245 *         finish
 246 * @irq_status: irq status
 247 *
 248 * @ctrl_hdl: handler for v4l2 framework
 249 * @decode_work: worker for the decoding
 250 * @encode_work: worker for the encoding
 251 * @last_decoded_picinfo: pic information get from latest decode
 252 * @empty_flush_buf: a fake size-0 capture buffer that indicates flush
 253 *
 254 * @colorspace: enum v4l2_colorspace; supplemental to pixelformat
 255 * @ycbcr_enc: enum v4l2_ycbcr_encoding, Y'CbCr encoding
 256 * @quantization: enum v4l2_quantization, colorspace quantization
 257 * @xfer_func: enum v4l2_xfer_func, colorspace transfer function
 258 * @decoded_frame_cnt: number of decoded frames
 259 * @lock: protect variables accessed by V4L2 threads and worker thread such as
 260 *        mtk_video_dec_buf.
 261 */
 262struct mtk_vcodec_ctx {
 263        enum mtk_instance_type type;
 264        struct mtk_vcodec_dev *dev;
 265        struct list_head list;
 266
 267        struct v4l2_fh fh;
 268        struct v4l2_m2m_ctx *m2m_ctx;
 269        struct mtk_q_data q_data[2];
 270        int id;
 271        enum mtk_instance_state state;
 272        enum mtk_encode_param param_change;
 273        struct mtk_enc_params enc_params;
 274
 275        const struct vdec_common_if *dec_if;
 276        const struct venc_common_if *enc_if;
 277        void *drv_handle;
 278
 279        struct vdec_pic_info picinfo;
 280        int dpb_size;
 281
 282        int int_cond;
 283        int int_type;
 284        wait_queue_head_t queue;
 285        unsigned int irq_status;
 286
 287        struct v4l2_ctrl_handler ctrl_hdl;
 288        struct work_struct decode_work;
 289        struct work_struct encode_work;
 290        struct vdec_pic_info last_decoded_picinfo;
 291        struct mtk_video_dec_buf *empty_flush_buf;
 292
 293        enum v4l2_colorspace colorspace;
 294        enum v4l2_ycbcr_encoding ycbcr_enc;
 295        enum v4l2_quantization quantization;
 296        enum v4l2_xfer_func xfer_func;
 297
 298        int decoded_frame_cnt;
 299        struct mutex lock;
 300
 301};
 302
 303enum mtk_chip {
 304        MTK_MT8173,
 305        MTK_MT8183,
 306        MTK_MT8192,
 307};
 308
 309/**
 310 * struct mtk_vcodec_enc_pdata - compatible data for each IC
 311 *
 312 * @chip: chip this encoder is compatible with
 313 *
 314 * @uses_ext: whether the encoder uses the extended firmware messaging format
 315 * @min_bitrate: minimum supported encoding bitrate
 316 * @max_bitrate: maximum supported encoding bitrate
 317 * @capture_formats: array of supported capture formats
 318 * @num_capture_formats: number of entries in capture_formats
 319 * @output_formats: array of supported output formats
 320 * @num_output_formats: number of entries in output_formats
 321 * @core_id: stand for h264 or vp8 encode index
 322 */
 323struct mtk_vcodec_enc_pdata {
 324        enum mtk_chip chip;
 325
 326        bool uses_ext;
 327        unsigned long min_bitrate;
 328        unsigned long max_bitrate;
 329        const struct mtk_video_fmt *capture_formats;
 330        size_t num_capture_formats;
 331        const struct mtk_video_fmt *output_formats;
 332        size_t num_output_formats;
 333        int core_id;
 334};
 335
 336#define MTK_ENC_CTX_IS_EXT(ctx) ((ctx)->dev->venc_pdata->uses_ext)
 337
 338/**
 339 * struct mtk_vcodec_dev - driver data
 340 * @v4l2_dev: V4L2 device to register video devices for.
 341 * @vfd_dec: Video device for decoder
 342 * @vfd_enc: Video device for encoder.
 343 *
 344 * @m2m_dev_dec: m2m device for decoder
 345 * @m2m_dev_enc: m2m device for encoder.
 346 * @plat_dev: platform device
 347 * @ctx_list: list of struct mtk_vcodec_ctx
 348 * @irqlock: protect data access by irq handler and work thread
 349 * @curr_ctx: The context that is waiting for codec hardware
 350 *
 351 * @reg_base: Mapped address of MTK Vcodec registers.
 352 * @venc_pdata: encoder IC-specific data
 353 *
 354 * @fw_handler: used to communicate with the firmware.
 355 * @id_counter: used to identify current opened instance
 356 *
 357 * @decode_workqueue: decode work queue
 358 * @encode_workqueue: encode work queue
 359 *
 360 * @int_cond: used to identify interrupt condition happen
 361 * @int_type: used to identify what kind of interrupt condition happen
 362 * @dev_mutex: video_device lock
 363 * @queue: waitqueue for waiting for completion of device commands
 364 *
 365 * @dec_irq: decoder irq resource
 366 * @enc_irq: h264 encoder irq resource
 367 *
 368 * @dec_mutex: decoder hardware lock
 369 * @enc_mutex: encoder hardware lock.
 370 *
 371 * @pm: power management control
 372 * @dec_capability: used to identify decode capability, ex: 4k
 373 * @enc_capability: used to identify encode capability
 374 */
 375struct mtk_vcodec_dev {
 376        struct v4l2_device v4l2_dev;
 377        struct video_device *vfd_dec;
 378        struct video_device *vfd_enc;
 379
 380        struct v4l2_m2m_dev *m2m_dev_dec;
 381        struct v4l2_m2m_dev *m2m_dev_enc;
 382        struct platform_device *plat_dev;
 383        struct list_head ctx_list;
 384        spinlock_t irqlock;
 385        struct mtk_vcodec_ctx *curr_ctx;
 386        void __iomem *reg_base[NUM_MAX_VCODEC_REG_BASE];
 387        const struct mtk_vcodec_enc_pdata *venc_pdata;
 388
 389        struct mtk_vcodec_fw *fw_handler;
 390
 391        unsigned long id_counter;
 392
 393        struct workqueue_struct *decode_workqueue;
 394        struct workqueue_struct *encode_workqueue;
 395        int int_cond;
 396        int int_type;
 397        struct mutex dev_mutex;
 398        wait_queue_head_t queue;
 399
 400        int dec_irq;
 401        int enc_irq;
 402
 403        struct mutex dec_mutex;
 404        struct mutex enc_mutex;
 405
 406        struct mtk_vcodec_pm pm;
 407        unsigned int dec_capability;
 408        unsigned int enc_capability;
 409};
 410
 411static inline struct mtk_vcodec_ctx *fh_to_ctx(struct v4l2_fh *fh)
 412{
 413        return container_of(fh, struct mtk_vcodec_ctx, fh);
 414}
 415
 416static inline struct mtk_vcodec_ctx *ctrl_to_ctx(struct v4l2_ctrl *ctrl)
 417{
 418        return container_of(ctrl->handler, struct mtk_vcodec_ctx, ctrl_hdl);
 419}
 420
 421#endif /* _MTK_VCODEC_DRV_H_ */
 422