1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (c) 2023 MediaTek Inc. 4 * Author: Yunfei Dong <yunfei.dong@mediatek.com> 5 */ 6 7 #ifndef _MTK_VCODEC_COM_DRV_H_ 8 #define _MTK_VCODEC_COM_DRV_H_ 9 10 #include <linux/platform_device.h> 11 #include <linux/videodev2.h> 12 #include <media/v4l2-ctrls.h> 13 #include <media/v4l2-device.h> 14 #include <media/v4l2-ioctl.h> 15 #include <media/v4l2-mem2mem.h> 16 #include <media/videobuf2-core.h> 17 18 #define MTK_VCODEC_MAX_PLANES 3 19 20 #define WAIT_INTR_TIMEOUT_MS 1000 21 22 /* 23 * enum mtk_q_type - Type of queue 24 */ 25 enum mtk_q_type { 26 MTK_Q_DATA_SRC = 0, 27 MTK_Q_DATA_DST = 1, 28 }; 29 30 /* 31 * enum mtk_hw_reg_idx - MTK hw register base index 32 */ 33 enum mtk_hw_reg_idx { 34 VDEC_SYS, 35 VDEC_MISC, 36 VDEC_LD, 37 VDEC_TOP, 38 VDEC_CM, 39 VDEC_AD, 40 VDEC_AV, 41 VDEC_PP, 42 VDEC_HWD, 43 VDEC_HWQ, 44 VDEC_HWB, 45 VDEC_HWG, 46 NUM_MAX_VDEC_REG_BASE, 47 /* h264 encoder */ 48 VENC_SYS = NUM_MAX_VDEC_REG_BASE, 49 /* vp8 encoder */ 50 VENC_LT_SYS, 51 NUM_MAX_VCODEC_REG_BASE 52 }; 53 54 /* 55 * struct mtk_vcodec_clk_info - Structure used to store clock name 56 */ 57 struct mtk_vcodec_clk_info { 58 const char *clk_name; 59 struct clk *vcodec_clk; 60 }; 61 62 /* 63 * struct mtk_vcodec_clk - Structure used to store vcodec clock information 64 */ 65 struct mtk_vcodec_clk { 66 struct mtk_vcodec_clk_info *clk_info; 67 int clk_num; 68 }; 69 70 /* 71 * struct mtk_vcodec_pm - Power management data structure 72 */ 73 struct mtk_vcodec_pm { 74 struct mtk_vcodec_clk vdec_clk; 75 struct mtk_vcodec_clk venc_clk; 76 struct device *dev; 77 }; 78 79 /* 80 * enum mtk_vdec_hw_id - Hardware index used to separate 81 * different hardware 82 */ 83 enum mtk_vdec_hw_id { 84 MTK_VDEC_CORE, 85 MTK_VDEC_LAT0, 86 MTK_VDEC_LAT1, 87 MTK_VDEC_LAT_SOC, 88 MTK_VDEC_HW_MAX, 89 }; 90 91 /** 92 * enum mtk_instance_state - The state of an MTK Vcodec instance. 93 * @MTK_STATE_FREE: default state when instance is created 94 * @MTK_STATE_INIT: vcodec instance is initialized 95 * @MTK_STATE_HEADER: vdec had sps/pps header parsed or venc 96 * had sps/pps header encoded 97 * @MTK_STATE_FLUSH: vdec is flushing. Only used by decoder 98 * @MTK_STATE_ABORT: vcodec should be aborted 99 */ 100 enum mtk_instance_state { 101 MTK_STATE_FREE = 0, 102 MTK_STATE_INIT = 1, 103 MTK_STATE_HEADER = 2, 104 MTK_STATE_FLUSH = 3, 105 MTK_STATE_ABORT = 4, 106 }; 107 108 enum mtk_fmt_type { 109 MTK_FMT_DEC = 0, 110 MTK_FMT_ENC = 1, 111 MTK_FMT_FRAME = 2, 112 }; 113 114 /* 115 * struct mtk_video_fmt - Structure used to store information about pixelformats 116 */ 117 struct mtk_video_fmt { 118 u32 fourcc; 119 enum mtk_fmt_type type; 120 u32 num_planes; 121 u32 flags; 122 struct v4l2_frmsize_stepwise frmsize; 123 }; 124 125 /* 126 * struct mtk_q_data - Structure used to store information about queue 127 */ 128 struct mtk_q_data { 129 unsigned int visible_width; 130 unsigned int visible_height; 131 unsigned int coded_width; 132 unsigned int coded_height; 133 enum v4l2_field field; 134 unsigned int bytesperline[MTK_VCODEC_MAX_PLANES]; 135 unsigned int sizeimage[MTK_VCODEC_MAX_PLANES]; 136 const struct mtk_video_fmt *fmt; 137 }; 138 139 /* 140 * enum mtk_instance_type - The type of an MTK Vcodec instance. 141 */ 142 enum mtk_instance_type { 143 MTK_INST_DECODER = 0, 144 MTK_INST_ENCODER = 1, 145 }; 146 147 #endif /* _MTK_VCODEC_COM_DRV_H_ */ 148