vcodec_hw_info.h 4.79 KB
Newer Older
Tony Feng committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
/**
 * Copyright (C) 2015 Fuzhou Rockchip Electronics Co., Ltd
 * author: Herman Chen herman.chen@rock-chips.com
 *         Alpha Lin, alpha.lin@rock-chips.com
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#ifndef __ARCH_ARM_MACH_ROCKCHIP_VCODEC_HW_INFO_H
#define __ARCH_ARM_MACH_ROCKCHIP_VCODEC_HW_INFO_H

/*
 * Hardware id is for hardware detection
 * Driver will read the hardware ID register first, then try to find a mactch
 * hardware from the enum ID below.
 */
enum VPU_HW_ID {
	VPU_DEC_ID_9190		= 0x6731,
	VPU_ID_8270		= 0x8270,
	VPU_ID_4831		= 0x4831,
	HEVC_ID			= 0x6867,
	RKV_DEC_ID		= 0x6876,
	RKV_DEC_ID2             = 0x3410,
	VPU2_ID			= 0x0000,
};

/*
 * Different hardware has different feature. So we catalogue these features
 * into three class:
 *
 * 1. register io feature determined by hardware type
 *    including register offset, register file size, etc
 *
 * 2. runtime register config feature determined by task type
 *    including irq / enable / length register, bit mask, etc
 *
 * 3. file handle translate feature determined by vcodec format type
 *    register translation map table
 *
 * These three type features composite a complete codec information structure
 */

/* VPU1 and VPU2 */
#define VCODEC_DEVICE_TYPE_VPUX		0x56505558
/* VPU Combo */
#define VCODEC_DEVICE_TYPE_VPUC		0x56505543
#define VCODEC_DEVICE_TYPE_HEVC		0x56505532
#define VCODEC_DEVICE_TYPE_RKVD		0x524B5644

enum TASK_TYPE {
	TASK_ENC,
	TASK_DEC,
	TASK_PP,
	TASK_DEC_PP,
	TASK_TYPE_BUTT,
};

enum FORMAT_TYPE {
	FMT_DEC_BASE = 0,
	FMT_JPEGD = FMT_DEC_BASE,

	FMT_H263D,
	FMT_H264D,
	FMT_H265D,

	FMT_MPEG1D,
	FMT_MPEG2D,
	FMT_MPEG4D,

	FMT_VP6D,
	FMT_VP7D,
	FMT_VP8D,
	FMT_VP9D,

	FMT_VC1D,
	FMT_AVSD,

	FMT_DEC_BUTT,

	FMT_PP_BASE = FMT_DEC_BUTT,
	FMT_PP = FMT_PP_BASE,
	FMT_PP_BUTT,

	FMT_ENC_BASE = FMT_PP_BUTT,
	FMT_JPEGE = FMT_ENC_BASE,

	FMT_H264E,

	FMT_VP8E,

	FMT_ENC_BUTT,
	FMT_TYPE_BUTT = FMT_ENC_BUTT,
};

/**
 * struct for hardware task operation
 */
struct vpu_hw_info {
	enum VPU_HW_ID	hw_id;
	u32		enc_offset;
	u32		enc_reg_num;
	u32		enc_io_size;

	u32		dec_offset;
	u32		dec_reg_num;
	u32		dec_io_size;

	/*
	 * register range for enc/dec/pp/dec_pp
	 * base/end of dec/pp/dec_pp specify the register range to config
	 */
	u32		base_dec;
	u32		base_pp;
	u32		base_dec_pp;
	u32		end_dec;
	u32		end_pp;
	u32		end_dec_pp;
};

struct vpu_task_info {
	char *name;
	struct timeval start;
	struct timeval end;

	/*
	 * input stream register
	 * use for map/unmap drm buffer for avoiding
	 * cache sync issue
	 */
	int reg_rlc;
	/*
	 * task enable register
	 * use for enable hardware task process
	 *  -1 for invalid
	 */
	int reg_en;

	/* register of task auto gating, alway valid */
	int reg_gating;

	/* register of task irq, alway valid */
	int reg_irq;

	/*
	 * stream length register
	 * only valid for decoder task
	 * -1 for invalid (encoder)
	 */
	int reg_len;

	/*
	 * direct mv register
	 * special offset scale, offset multiply by 16
	 *
	 * valid on vpu & vpu2
	 * -1 for invalid
	 */
	int reg_dir_mv;

	/*
	 * pps register
	 * special register for scaling list address process
	 *
	 * valid on rkv
	 * -1 for invalid
	 */
	int reg_pps;

177 178 179 180 181 182 183
	/*
	 * soft reset register
	 * special register for soft reset
	 * valid on vpu & vpu2 & rkv
	 */
	int reg_reset;

Tony Feng committed
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
	/*
	 * decoder pipeline mode register
	 *
	 * valid on vpu & vpu2
	 * -1 for invalid
	 */
	int reg_pipe;

	/* task enable bit mask for enable register */
	u32 enable_mask;

	/* task auto gating mask for enable register */
	u32 gating_mask;

	/* task pipeline mode mask for pipe register */
	u32 pipe_mask;

	/* task inturrpt bit mask for irq register */
	u32 irq_mask;

	/* task ready bit mask for irq register */
	u32 ready_mask;

	/* task error bit mask for irq register */
	u32 error_mask;

210 211 212
	/* task reset bit mask for reset register */
	u32 reset_mask;

Tony Feng committed
213 214 215 216
	enum FORMAT_TYPE (*get_fmt)(u32 *regs);
};

struct vpu_trans_info {
217
	const size_t count;
Tony Feng committed
218 219 220 221 222 223 224 225 226 227 228
	const char * const table;
};

struct vcodec_info {
	enum VPU_HW_ID			hw_id;
	struct vpu_hw_info		*hw_info;
	struct vpu_task_info		*task_info;
	const struct vpu_trans_info	*trans_info;
};

struct vcodec_device_info {
229 230
	s32 device_type;
	s8 *name;
Tony Feng committed
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
};

#define DEF_FMT_TRANS_TBL(fmt, args...) \
	static const char trans_tbl_##fmt[] = { \
		args \
	}

#define SETUP_FMT_TBL(id, fmt) \
	[id] = { \
		.count = sizeof(trans_tbl_##fmt), \
		.table = trans_tbl_##fmt, \
	}

#define EMPTY_FMT_TBL(id) \
	[id] = { \
		.count = 0, \
		.table = NULL, \
	}

#endif