Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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