1b8e80941Smrg/**************************************************************************
2b8e80941Smrg *
3b8e80941Smrg * Copyright 2011 Advanced Micro Devices, Inc.
4b8e80941Smrg * All Rights Reserved.
5b8e80941Smrg *
6b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a
7b8e80941Smrg * copy of this software and associated documentation files (the
8b8e80941Smrg * "Software"), to deal in the Software without restriction, including
9b8e80941Smrg * without limitation the rights to use, copy, modify, merge, publish,
10b8e80941Smrg * distribute, sub license, and/or sell copies of the Software, and to
11b8e80941Smrg * permit persons to whom the Software is furnished to do so, subject to
12b8e80941Smrg * the following conditions:
13b8e80941Smrg *
14b8e80941Smrg * The above copyright notice and this permission notice (including the
15b8e80941Smrg * next paragraph) shall be included in all copies or substantial portions
16b8e80941Smrg * of the Software.
17b8e80941Smrg *
18b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19b8e80941Smrg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b8e80941Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21b8e80941Smrg * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
22b8e80941Smrg * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23b8e80941Smrg * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24b8e80941Smrg * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25b8e80941Smrg *
26b8e80941Smrg **************************************************************************/
27b8e80941Smrg
28b8e80941Smrg/*
29b8e80941Smrg * Authors:
30b8e80941Smrg *      Christian König <christian.koenig@amd.com>
31b8e80941Smrg *
32b8e80941Smrg */
33b8e80941Smrg
34b8e80941Smrg#ifndef RADEON_UVD_H
35b8e80941Smrg#define RADEON_UVD_H
36b8e80941Smrg
37b8e80941Smrg#include "radeon/radeon_winsys.h"
38b8e80941Smrg#include "vl/vl_video_buffer.h"
39b8e80941Smrg
40b8e80941Smrg/* UVD uses PM4 packet type 0 and 2 */
41b8e80941Smrg#define RUVD_PKT_TYPE_S(x)		(((unsigned)(x) & 0x3) << 30)
42b8e80941Smrg#define RUVD_PKT_TYPE_G(x)		(((x) >> 30) & 0x3)
43b8e80941Smrg#define RUVD_PKT_TYPE_C			0x3FFFFFFF
44b8e80941Smrg#define RUVD_PKT_COUNT_S(x)		(((unsigned)(x) & 0x3FFF) << 16)
45b8e80941Smrg#define RUVD_PKT_COUNT_G(x)		(((x) >> 16) & 0x3FFF)
46b8e80941Smrg#define RUVD_PKT_COUNT_C		0xC000FFFF
47b8e80941Smrg#define RUVD_PKT0_BASE_INDEX_S(x)	(((unsigned)(x) & 0xFFFF) << 0)
48b8e80941Smrg#define RUVD_PKT0_BASE_INDEX_G(x)	(((x) >> 0) & 0xFFFF)
49b8e80941Smrg#define RUVD_PKT0_BASE_INDEX_C		0xFFFF0000
50b8e80941Smrg#define RUVD_PKT0(index, count)		(RUVD_PKT_TYPE_S(0) | RUVD_PKT0_BASE_INDEX_S(index) | RUVD_PKT_COUNT_S(count))
51b8e80941Smrg#define RUVD_PKT2()			(RUVD_PKT_TYPE_S(2))
52b8e80941Smrg
53b8e80941Smrg/* registers involved with UVD */
54b8e80941Smrg#define RUVD_GPCOM_VCPU_CMD		0xEF0C
55b8e80941Smrg#define RUVD_GPCOM_VCPU_DATA0		0xEF10
56b8e80941Smrg#define RUVD_GPCOM_VCPU_DATA1		0xEF14
57b8e80941Smrg#define RUVD_ENGINE_CNTL		0xEF18
58b8e80941Smrg
59b8e80941Smrg#define RUVD_GPCOM_VCPU_CMD_SOC15		0x2070c
60b8e80941Smrg#define RUVD_GPCOM_VCPU_DATA0_SOC15		0x20710
61b8e80941Smrg#define RUVD_GPCOM_VCPU_DATA1_SOC15		0x20714
62b8e80941Smrg#define RUVD_ENGINE_CNTL_SOC15			0x20718
63b8e80941Smrg
64b8e80941Smrg/* UVD commands to VCPU */
65b8e80941Smrg#define RUVD_CMD_MSG_BUFFER		0x00000000
66b8e80941Smrg#define RUVD_CMD_DPB_BUFFER		0x00000001
67b8e80941Smrg#define RUVD_CMD_DECODING_TARGET_BUFFER	0x00000002
68b8e80941Smrg#define RUVD_CMD_FEEDBACK_BUFFER	0x00000003
69b8e80941Smrg#define RUVD_CMD_SESSION_CONTEXT_BUFFER	0x00000005
70b8e80941Smrg#define RUVD_CMD_BITSTREAM_BUFFER	0x00000100
71b8e80941Smrg#define RUVD_CMD_ITSCALING_TABLE_BUFFER	0x00000204
72b8e80941Smrg#define RUVD_CMD_CONTEXT_BUFFER		0x00000206
73b8e80941Smrg
74b8e80941Smrg/* UVD message types */
75b8e80941Smrg#define RUVD_MSG_CREATE		0
76b8e80941Smrg#define RUVD_MSG_DECODE		1
77b8e80941Smrg#define RUVD_MSG_DESTROY	2
78b8e80941Smrg
79b8e80941Smrg/* UVD stream types */
80b8e80941Smrg#define RUVD_CODEC_H264		0x00000000
81b8e80941Smrg#define RUVD_CODEC_VC1		0x00000001
82b8e80941Smrg#define RUVD_CODEC_MPEG2	0x00000003
83b8e80941Smrg#define RUVD_CODEC_MPEG4	0x00000004
84b8e80941Smrg#define RUVD_CODEC_H264_PERF	0x00000007
85b8e80941Smrg#define RUVD_CODEC_MJPEG	0x00000008
86b8e80941Smrg#define RUVD_CODEC_H265		0x00000010
87b8e80941Smrg
88b8e80941Smrg/* UVD decode target buffer tiling mode */
89b8e80941Smrg#define RUVD_TILE_LINEAR	0x00000000
90b8e80941Smrg#define RUVD_TILE_8X4		0x00000001
91b8e80941Smrg#define RUVD_TILE_8X8		0x00000002
92b8e80941Smrg#define RUVD_TILE_32AS8		0x00000003
93b8e80941Smrg
94b8e80941Smrg/* UVD decode target buffer array mode */
95b8e80941Smrg#define RUVD_ARRAY_MODE_LINEAR				0x00000000
96b8e80941Smrg#define RUVD_ARRAY_MODE_MACRO_LINEAR_MICRO_TILED	0x00000001
97b8e80941Smrg#define RUVD_ARRAY_MODE_1D_THIN				0x00000002
98b8e80941Smrg#define RUVD_ARRAY_MODE_2D_THIN				0x00000004
99b8e80941Smrg#define RUVD_ARRAY_MODE_MACRO_TILED_MICRO_LINEAR	0x00000004
100b8e80941Smrg#define RUVD_ARRAY_MODE_MACRO_TILED_MICRO_TILED		0x00000005
101b8e80941Smrg
102b8e80941Smrg/* UVD tile config */
103b8e80941Smrg#define RUVD_BANK_WIDTH(x)		((x) << 0)
104b8e80941Smrg#define RUVD_BANK_HEIGHT(x)		((x) << 3)
105b8e80941Smrg#define RUVD_MACRO_TILE_ASPECT_RATIO(x)	((x) << 6)
106b8e80941Smrg#define RUVD_NUM_BANKS(x)		((x) << 9)
107b8e80941Smrg
108b8e80941Smrg/* H.264 profile definitions */
109b8e80941Smrg#define RUVD_H264_PROFILE_BASELINE	0x00000000
110b8e80941Smrg#define RUVD_H264_PROFILE_MAIN		0x00000001
111b8e80941Smrg#define RUVD_H264_PROFILE_HIGH		0x00000002
112b8e80941Smrg#define RUVD_H264_PROFILE_STEREO_HIGH	0x00000003
113b8e80941Smrg#define RUVD_H264_PROFILE_MVC		0x00000004
114b8e80941Smrg
115b8e80941Smrg/* VC-1 profile definitions */
116b8e80941Smrg#define RUVD_VC1_PROFILE_SIMPLE		0x00000000
117b8e80941Smrg#define RUVD_VC1_PROFILE_MAIN		0x00000001
118b8e80941Smrg#define RUVD_VC1_PROFILE_ADVANCED	0x00000002
119b8e80941Smrg
120b8e80941Smrgstruct ruvd_mvc_element {
121b8e80941Smrg	uint16_t	viewOrderIndex;
122b8e80941Smrg	uint16_t	viewId;
123b8e80941Smrg	uint16_t	numOfAnchorRefsInL0;
124b8e80941Smrg	uint16_t	viewIdOfAnchorRefsInL0[15];
125b8e80941Smrg	uint16_t	numOfAnchorRefsInL1;
126b8e80941Smrg	uint16_t	viewIdOfAnchorRefsInL1[15];
127b8e80941Smrg	uint16_t	numOfNonAnchorRefsInL0;
128b8e80941Smrg	uint16_t	viewIdOfNonAnchorRefsInL0[15];
129b8e80941Smrg	uint16_t	numOfNonAnchorRefsInL1;
130b8e80941Smrg	uint16_t	viewIdOfNonAnchorRefsInL1[15];
131b8e80941Smrg};
132b8e80941Smrg
133b8e80941Smrgstruct ruvd_h264 {
134b8e80941Smrg	uint32_t	profile;
135b8e80941Smrg	uint32_t	level;
136b8e80941Smrg
137b8e80941Smrg	uint32_t	sps_info_flags;
138b8e80941Smrg	uint32_t	pps_info_flags;
139b8e80941Smrg	uint8_t		chroma_format;
140b8e80941Smrg	uint8_t		bit_depth_luma_minus8;
141b8e80941Smrg	uint8_t		bit_depth_chroma_minus8;
142b8e80941Smrg	uint8_t		log2_max_frame_num_minus4;
143b8e80941Smrg
144b8e80941Smrg	uint8_t		pic_order_cnt_type;
145b8e80941Smrg	uint8_t		log2_max_pic_order_cnt_lsb_minus4;
146b8e80941Smrg	uint8_t		num_ref_frames;
147b8e80941Smrg	uint8_t		reserved_8bit;
148b8e80941Smrg
149b8e80941Smrg	int8_t		pic_init_qp_minus26;
150b8e80941Smrg	int8_t		pic_init_qs_minus26;
151b8e80941Smrg	int8_t		chroma_qp_index_offset;
152b8e80941Smrg	int8_t		second_chroma_qp_index_offset;
153b8e80941Smrg
154b8e80941Smrg	uint8_t		num_slice_groups_minus1;
155b8e80941Smrg	uint8_t		slice_group_map_type;
156b8e80941Smrg	uint8_t		num_ref_idx_l0_active_minus1;
157b8e80941Smrg	uint8_t		num_ref_idx_l1_active_minus1;
158b8e80941Smrg
159b8e80941Smrg	uint16_t	slice_group_change_rate_minus1;
160b8e80941Smrg	uint16_t	reserved_16bit_1;
161b8e80941Smrg
162b8e80941Smrg	uint8_t		scaling_list_4x4[6][16];
163b8e80941Smrg	uint8_t		scaling_list_8x8[2][64];
164b8e80941Smrg
165b8e80941Smrg	uint32_t	frame_num;
166b8e80941Smrg	uint32_t	frame_num_list[16];
167b8e80941Smrg	int32_t		curr_field_order_cnt_list[2];
168b8e80941Smrg	int32_t		field_order_cnt_list[16][2];
169b8e80941Smrg
170b8e80941Smrg	uint32_t	decoded_pic_idx;
171b8e80941Smrg
172b8e80941Smrg	uint32_t	curr_pic_ref_frame_num;
173b8e80941Smrg
174b8e80941Smrg	uint8_t		ref_frame_list[16];
175b8e80941Smrg
176b8e80941Smrg	uint32_t	reserved[122];
177b8e80941Smrg
178b8e80941Smrg	struct {
179b8e80941Smrg		uint32_t			numViews;
180b8e80941Smrg		uint32_t			viewId0;
181b8e80941Smrg		struct ruvd_mvc_element	mvcElements[1];
182b8e80941Smrg	} mvc;
183b8e80941Smrg};
184b8e80941Smrg
185b8e80941Smrgstruct ruvd_h265 {
186b8e80941Smrg	uint32_t	sps_info_flags;
187b8e80941Smrg	uint32_t	pps_info_flags;
188b8e80941Smrg
189b8e80941Smrg	uint8_t		chroma_format;
190b8e80941Smrg	uint8_t		bit_depth_luma_minus8;
191b8e80941Smrg	uint8_t		bit_depth_chroma_minus8;
192b8e80941Smrg	uint8_t		log2_max_pic_order_cnt_lsb_minus4;
193b8e80941Smrg
194b8e80941Smrg	uint8_t		sps_max_dec_pic_buffering_minus1;
195b8e80941Smrg	uint8_t		log2_min_luma_coding_block_size_minus3;
196b8e80941Smrg	uint8_t		log2_diff_max_min_luma_coding_block_size;
197b8e80941Smrg	uint8_t		log2_min_transform_block_size_minus2;
198b8e80941Smrg
199b8e80941Smrg	uint8_t		log2_diff_max_min_transform_block_size;
200b8e80941Smrg	uint8_t		max_transform_hierarchy_depth_inter;
201b8e80941Smrg	uint8_t		max_transform_hierarchy_depth_intra;
202b8e80941Smrg	uint8_t		pcm_sample_bit_depth_luma_minus1;
203b8e80941Smrg
204b8e80941Smrg	uint8_t		pcm_sample_bit_depth_chroma_minus1;
205b8e80941Smrg	uint8_t		log2_min_pcm_luma_coding_block_size_minus3;
206b8e80941Smrg	uint8_t		log2_diff_max_min_pcm_luma_coding_block_size;
207b8e80941Smrg	uint8_t		num_extra_slice_header_bits;
208b8e80941Smrg
209b8e80941Smrg	uint8_t		num_short_term_ref_pic_sets;
210b8e80941Smrg	uint8_t		num_long_term_ref_pic_sps;
211b8e80941Smrg	uint8_t		num_ref_idx_l0_default_active_minus1;
212b8e80941Smrg	uint8_t		num_ref_idx_l1_default_active_minus1;
213b8e80941Smrg
214b8e80941Smrg	int8_t		pps_cb_qp_offset;
215b8e80941Smrg	int8_t		pps_cr_qp_offset;
216b8e80941Smrg	int8_t		pps_beta_offset_div2;
217b8e80941Smrg	int8_t		pps_tc_offset_div2;
218b8e80941Smrg
219b8e80941Smrg	uint8_t		diff_cu_qp_delta_depth;
220b8e80941Smrg	uint8_t		num_tile_columns_minus1;
221b8e80941Smrg	uint8_t		num_tile_rows_minus1;
222b8e80941Smrg	uint8_t		log2_parallel_merge_level_minus2;
223b8e80941Smrg
224b8e80941Smrg	uint16_t	column_width_minus1[19];
225b8e80941Smrg	uint16_t	row_height_minus1[21];
226b8e80941Smrg
227b8e80941Smrg	int8_t		init_qp_minus26;
228b8e80941Smrg	uint8_t		num_delta_pocs_ref_rps_idx;
229b8e80941Smrg	uint8_t		curr_idx;
230b8e80941Smrg	uint8_t		reserved1;
231b8e80941Smrg	int32_t		curr_poc;
232b8e80941Smrg	uint8_t		ref_pic_list[16];
233b8e80941Smrg	int32_t		poc_list[16];
234b8e80941Smrg	uint8_t		ref_pic_set_st_curr_before[8];
235b8e80941Smrg	uint8_t		ref_pic_set_st_curr_after[8];
236b8e80941Smrg	uint8_t		ref_pic_set_lt_curr[8];
237b8e80941Smrg
238b8e80941Smrg	uint8_t		ucScalingListDCCoefSizeID2[6];
239b8e80941Smrg	uint8_t		ucScalingListDCCoefSizeID3[2];
240b8e80941Smrg
241b8e80941Smrg	uint8_t		highestTid;
242b8e80941Smrg	uint8_t		isNonRef;
243b8e80941Smrg
244b8e80941Smrg	uint8_t 	p010_mode;
245b8e80941Smrg	uint8_t 	msb_mode;
246b8e80941Smrg	uint8_t 	luma_10to8;
247b8e80941Smrg	uint8_t 	chroma_10to8;
248b8e80941Smrg	uint8_t 	sclr_luma10to8;
249b8e80941Smrg	uint8_t 	sclr_chroma10to8;
250b8e80941Smrg
251b8e80941Smrg	uint8_t 	direct_reflist[2][15];
252b8e80941Smrg};
253b8e80941Smrg
254b8e80941Smrgstruct ruvd_vc1 {
255b8e80941Smrg	uint32_t	profile;
256b8e80941Smrg	uint32_t	level;
257b8e80941Smrg	uint32_t	sps_info_flags;
258b8e80941Smrg	uint32_t	pps_info_flags;
259b8e80941Smrg	uint32_t	pic_structure;
260b8e80941Smrg	uint32_t	chroma_format;
261b8e80941Smrg};
262b8e80941Smrg
263b8e80941Smrgstruct ruvd_mpeg2 {
264b8e80941Smrg	uint32_t	decoded_pic_idx;
265b8e80941Smrg	uint32_t	ref_pic_idx[2];
266b8e80941Smrg
267b8e80941Smrg	uint8_t		load_intra_quantiser_matrix;
268b8e80941Smrg	uint8_t		load_nonintra_quantiser_matrix;
269b8e80941Smrg	uint8_t		reserved_quantiser_alignement[2];
270b8e80941Smrg	uint8_t		intra_quantiser_matrix[64];
271b8e80941Smrg	uint8_t		nonintra_quantiser_matrix[64];
272b8e80941Smrg
273b8e80941Smrg	uint8_t		profile_and_level_indication;
274b8e80941Smrg	uint8_t		chroma_format;
275b8e80941Smrg
276b8e80941Smrg	uint8_t		picture_coding_type;
277b8e80941Smrg
278b8e80941Smrg	uint8_t		reserved_1;
279b8e80941Smrg
280b8e80941Smrg	uint8_t		f_code[2][2];
281b8e80941Smrg	uint8_t		intra_dc_precision;
282b8e80941Smrg	uint8_t		pic_structure;
283b8e80941Smrg	uint8_t		top_field_first;
284b8e80941Smrg	uint8_t		frame_pred_frame_dct;
285b8e80941Smrg	uint8_t		concealment_motion_vectors;
286b8e80941Smrg	uint8_t		q_scale_type;
287b8e80941Smrg	uint8_t		intra_vlc_format;
288b8e80941Smrg	uint8_t		alternate_scan;
289b8e80941Smrg};
290b8e80941Smrg
291b8e80941Smrgstruct ruvd_mpeg4
292b8e80941Smrg{
293b8e80941Smrg	uint32_t	decoded_pic_idx;
294b8e80941Smrg	uint32_t	ref_pic_idx[2];
295b8e80941Smrg
296b8e80941Smrg	uint32_t	variant_type;
297b8e80941Smrg	uint8_t		profile_and_level_indication;
298b8e80941Smrg
299b8e80941Smrg	uint8_t		video_object_layer_verid;
300b8e80941Smrg	uint8_t		video_object_layer_shape;
301b8e80941Smrg
302b8e80941Smrg	uint8_t		reserved_1;
303b8e80941Smrg
304b8e80941Smrg	uint16_t	video_object_layer_width;
305b8e80941Smrg	uint16_t	video_object_layer_height;
306b8e80941Smrg
307b8e80941Smrg	uint16_t	vop_time_increment_resolution;
308b8e80941Smrg
309b8e80941Smrg	uint16_t	reserved_2;
310b8e80941Smrg
311b8e80941Smrg	uint32_t	flags;
312b8e80941Smrg
313b8e80941Smrg	uint8_t		quant_type;
314b8e80941Smrg
315b8e80941Smrg	uint8_t		reserved_3[3];
316b8e80941Smrg
317b8e80941Smrg	uint8_t		intra_quant_mat[64];
318b8e80941Smrg	uint8_t		nonintra_quant_mat[64];
319b8e80941Smrg
320b8e80941Smrg	struct {
321b8e80941Smrg		uint8_t		sprite_enable;
322b8e80941Smrg
323b8e80941Smrg		uint8_t		reserved_4[3];
324b8e80941Smrg
325b8e80941Smrg		uint16_t	sprite_width;
326b8e80941Smrg		uint16_t	sprite_height;
327b8e80941Smrg		int16_t		sprite_left_coordinate;
328b8e80941Smrg		int16_t		sprite_top_coordinate;
329b8e80941Smrg
330b8e80941Smrg		uint8_t		no_of_sprite_warping_points;
331b8e80941Smrg		uint8_t		sprite_warping_accuracy;
332b8e80941Smrg		uint8_t		sprite_brightness_change;
333b8e80941Smrg		uint8_t		low_latency_sprite_enable;
334b8e80941Smrg	} sprite_config;
335b8e80941Smrg
336b8e80941Smrg	struct {
337b8e80941Smrg		uint32_t	flags;
338b8e80941Smrg		uint8_t		vol_mode;
339b8e80941Smrg		uint8_t		reserved_5[3];
340b8e80941Smrg	} divx_311_config;
341b8e80941Smrg};
342b8e80941Smrg
343b8e80941Smrg/* message between driver and hardware */
344b8e80941Smrgstruct ruvd_msg {
345b8e80941Smrg
346b8e80941Smrg	uint32_t	size;
347b8e80941Smrg	uint32_t	msg_type;
348b8e80941Smrg	uint32_t	stream_handle;
349b8e80941Smrg	uint32_t	status_report_feedback_number;
350b8e80941Smrg
351b8e80941Smrg	union {
352b8e80941Smrg		struct {
353b8e80941Smrg			uint32_t	stream_type;
354b8e80941Smrg			uint32_t	session_flags;
355b8e80941Smrg			uint32_t	asic_id;
356b8e80941Smrg			uint32_t	width_in_samples;
357b8e80941Smrg			uint32_t	height_in_samples;
358b8e80941Smrg			uint32_t	dpb_buffer;
359b8e80941Smrg			uint32_t	dpb_size;
360b8e80941Smrg			uint32_t	dpb_model;
361b8e80941Smrg			uint32_t	version_info;
362b8e80941Smrg		} create;
363b8e80941Smrg
364b8e80941Smrg		struct {
365b8e80941Smrg			uint32_t	stream_type;
366b8e80941Smrg			uint32_t	decode_flags;
367b8e80941Smrg			uint32_t	width_in_samples;
368b8e80941Smrg			uint32_t	height_in_samples;
369b8e80941Smrg
370b8e80941Smrg			uint32_t	dpb_buffer;
371b8e80941Smrg			uint32_t	dpb_size;
372b8e80941Smrg			uint32_t	dpb_model;
373b8e80941Smrg			uint32_t	dpb_reserved;
374b8e80941Smrg
375b8e80941Smrg			uint32_t	db_offset_alignment;
376b8e80941Smrg			uint32_t	db_pitch;
377b8e80941Smrg			uint32_t	db_tiling_mode;
378b8e80941Smrg			uint32_t	db_array_mode;
379b8e80941Smrg			uint32_t	db_field_mode;
380b8e80941Smrg			uint32_t	db_surf_tile_config;
381b8e80941Smrg			uint32_t	db_aligned_height;
382b8e80941Smrg			uint32_t	db_reserved;
383b8e80941Smrg
384b8e80941Smrg			uint32_t	use_addr_macro;
385b8e80941Smrg
386b8e80941Smrg			uint32_t	bsd_buffer;
387b8e80941Smrg			uint32_t	bsd_size;
388b8e80941Smrg
389b8e80941Smrg			uint32_t	pic_param_buffer;
390b8e80941Smrg			uint32_t	pic_param_size;
391b8e80941Smrg			uint32_t	mb_cntl_buffer;
392b8e80941Smrg			uint32_t	mb_cntl_size;
393b8e80941Smrg
394b8e80941Smrg			uint32_t	dt_buffer;
395b8e80941Smrg			uint32_t	dt_pitch;
396b8e80941Smrg			uint32_t	dt_tiling_mode;
397b8e80941Smrg			uint32_t	dt_array_mode;
398b8e80941Smrg			uint32_t	dt_field_mode;
399b8e80941Smrg			uint32_t	dt_luma_top_offset;
400b8e80941Smrg			uint32_t	dt_luma_bottom_offset;
401b8e80941Smrg			uint32_t	dt_chroma_top_offset;
402b8e80941Smrg			uint32_t	dt_chroma_bottom_offset;
403b8e80941Smrg			uint32_t	dt_surf_tile_config;
404b8e80941Smrg			uint32_t	dt_uv_surf_tile_config;
405b8e80941Smrg			// re-use dt_wa_chroma_top_offset as dt_ext_info for UV pitch in stoney
406b8e80941Smrg			uint32_t	dt_wa_chroma_top_offset;
407b8e80941Smrg			uint32_t	dt_wa_chroma_bottom_offset;
408b8e80941Smrg
409b8e80941Smrg			uint32_t	reserved[16];
410b8e80941Smrg
411b8e80941Smrg			union {
412b8e80941Smrg				struct ruvd_h264	h264;
413b8e80941Smrg				struct ruvd_h265	h265;
414b8e80941Smrg				struct ruvd_vc1		vc1;
415b8e80941Smrg				struct ruvd_mpeg2	mpeg2;
416b8e80941Smrg				struct ruvd_mpeg4	mpeg4;
417b8e80941Smrg
418b8e80941Smrg				uint32_t info[768];
419b8e80941Smrg			} codec;
420b8e80941Smrg
421b8e80941Smrg			uint8_t		extension_support;
422b8e80941Smrg			uint8_t		reserved_8bit_1;
423b8e80941Smrg			uint8_t		reserved_8bit_2;
424b8e80941Smrg			uint8_t		reserved_8bit_3;
425b8e80941Smrg			uint32_t	extension_reserved[64];
426b8e80941Smrg		} decode;
427b8e80941Smrg	} body;
428b8e80941Smrg};
429b8e80941Smrg
430b8e80941Smrg/* driver dependent callback */
431b8e80941Smrgtypedef struct pb_buffer* (*ruvd_set_dtb)
432b8e80941Smrg(struct ruvd_msg* msg, struct vl_video_buffer *vb);
433b8e80941Smrg
434b8e80941Smrg/* create an UVD decode */
435b8e80941Smrgstruct pipe_video_codec *ruvd_create_decoder(struct pipe_context *context,
436b8e80941Smrg					     const struct pipe_video_codec *templat,
437b8e80941Smrg					     ruvd_set_dtb set_dtb);
438b8e80941Smrg
439b8e80941Smrg/* fill decoding target field from the luma and chroma surfaces */
440b8e80941Smrgvoid ruvd_set_dt_surfaces(struct ruvd_msg *msg, struct radeon_surf *luma,
441b8e80941Smrg			  struct radeon_surf *chroma);
442b8e80941Smrg#endif
443