1 /***************************************************************************
2  * Copyright (c) 2005-2009, Broadcom Corporation.
3  *
4  *  Name: crystalhd_fw_if . h
5  *
6  *  Description:
7  *		BCM70012 Firmware interface definitions.
8  *
9  *  HISTORY:
10  *
11  **********************************************************************
12  * This file is part of the crystalhd device driver.
13  *
14  * This driver is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation, version 2 of the License.
17  *
18  * This driver is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this driver.  If not, see <http://www.gnu.org/licenses/>.
25  **********************************************************************/
26 
27 #ifndef _CRYSTALHD_FW_IF_H_
28 #define _CRYSTALHD_FW_IF_H_
29 
30 /* TBD: Pull in only required defs into this file.. */
31 
32 /* User Data Header */
33 struct user_data {
34 	struct user_data	*next;
35 	uint32_t		type;
36 	uint32_t		size;
37 };
38 
39 /*------------------------------------------------------*
40  *    MPEG Extension to the PPB			 *
41  *------------------------------------------------------*/
42 struct ppb_mpeg {
43 	uint32_t		to_be_defined;
44 	uint32_t		valid;
45 
46 	/* Always valid, defaults to picture size if no
47 	   sequence display extension in the stream. */
48 	uint32_t		display_horizontal_size;
49 	uint32_t		display_vertical_size;
50 
51 	/* MPEG_VALID_PANSCAN
52 	   Offsets are a copy values from the MPEG stream. */
53 	uint32_t		offset_count;
54 	int32_t		horizontal_offset[3];
55 	int32_t		vertical_offset[3];
56 
57 	/* MPEG_VALID_USERDATA
58 	   User data is in the form of a linked list. */
59 	int32_t		userDataSize;
60 	struct user_data	*userData;
61 
62 };
63 
64 
65 /*------------------------------------------------------*
66  *    VC1 Extension to the PPB			  *
67  *------------------------------------------------------*/
68 struct ppb_vc1 {
69 	uint32_t		to_be_defined;
70 	uint32_t		valid;
71 
72 	/* Always valid, defaults to picture size if no
73 	   sequence display extension in the stream. */
74 	uint32_t		display_horizontal_size;
75 	uint32_t		display_vertical_size;
76 
77 	/* VC1 pan scan windows */
78 	uint32_t		num_panscan_windows;
79 	int32_t		ps_horiz_offset[4];
80 	int32_t		ps_vert_offset[4];
81 	int32_t		ps_width[4];
82 	int32_t		ps_height[4];
83 
84 	/* VC1_VALID_USERDATA
85 	   User data is in the form of a linked list. */
86 	int32_t		userDataSize;
87 	struct user_data	*userData;
88 
89 };
90 
91 /*------------------------------------------------------*
92  *    H.264 Extension to the PPB			*
93  *------------------------------------------------------*/
94 
95 /**
96  * @brief Film grain SEI message.
97  *
98  * Content of the film grain SEI message.
99  */
100 
101 /* maximum number of model-values as for Thomson spec(standard says 5) */
102 #define MAX_FGT_MODEL_VALUE	 (3)
103 
104 /* maximum number of intervals(as many as 256 intervals?) */
105 #define MAX_FGT_VALUE_INTERVAL	(256)
106 
107 struct fgt_sei {
108 	struct fgt_sei *next;
109 	unsigned char model_values[3][MAX_FGT_VALUE_INTERVAL][MAX_FGT_MODEL_VALUE];
110 	unsigned char upper_bound[3][MAX_FGT_VALUE_INTERVAL];
111 	unsigned char lower_bound[3][MAX_FGT_VALUE_INTERVAL];
112 
113 	unsigned char cancel_flag;	/* Cancel flag: 1 no film grain. */
114 	unsigned char model_id;	/* Model id. */
115 
116 	/* +unused SE based on Thomson spec */
117 	unsigned char color_desc_flag;	/* Separate color descrition flag. */
118 	unsigned char bit_depth_luma;	/* Bit depth luma minus 8. */
119 	unsigned char bit_depth_chroma;	/* Bit depth chroma minus 8. */
120 	unsigned char full_range_flag;	/* Full range flag. */
121 	unsigned char color_primaries;	/* Color primaries. */
122 	unsigned char transfer_charact;	/* Transfer characteristics. */
123 	unsigned char matrix_coeff;		/*< Matrix coefficients. */
124 	/* -unused SE based on Thomson spec */
125 
126 	unsigned char blending_mode_id;	/* Blending mode. */
127 	unsigned char log2_scale_factor;	/* Log2 scale factor (2-7). */
128 	unsigned char comp_flag[3];		/* Components [0,2] parameters present flag. */
129 	unsigned char num_intervals_minus1[3]; /* Number of intensity level intervals. */
130 	unsigned char num_model_values[3];	/* Number of model values. */
131 	uint16_t      repetition_period;	/* Repetition period (0-16384) */
132 
133 };
134 
135 struct ppb_h264 {
136 	/* 'valid' specifies which fields (or sets of
137 	 * fields) below are valid.  If the corresponding
138 	 * bit in 'valid' is NOT set then that field(s)
139 	 * is (are) not initialized. */
140 	uint32_t	valid;
141 
142 	int32_t		poc_top;	/* POC for Top Field/Frame */
143 	int32_t		poc_bottom;	/* POC for Bottom Field    */
144 	uint32_t		idr_pic_id;
145 
146 	/* H264_VALID_PANSCAN */
147 	uint32_t		pan_scan_count;
148 	int32_t		pan_scan_left[3];
149 	int32_t		pan_scan_right[3];
150 	int32_t		pan_scan_top[3];
151 	int32_t		pan_scan_bottom[3];
152 
153 	/* H264_VALID_CT_TYPE */
154 	uint32_t		ct_type_count;
155 	uint32_t		ct_type[3];
156 
157 	/* H264_VALID_SPS_CROP */
158 	int32_t		sps_crop_left;
159 	int32_t		sps_crop_right;
160 	int32_t		sps_crop_top;
161 	int32_t		sps_crop_bottom;
162 
163 	/* H264_VALID_VUI */
164 	uint32_t		chroma_top;
165 	uint32_t		chroma_bottom;
166 
167 	/* H264_VALID_USER */
168 	uint32_t		user_data_size;
169 	struct user_data	*user_data;
170 
171 	/* H264 VALID FGT */
172 	struct fgt_sei	*pfgt;
173 
174 };
175 
176 struct ppb {
177 	/* Common fields. */
178 	uint32_t	picture_number;	/* Ordinal display number */
179 	uint32_t	video_buffer;	/* Video (picbuf) number */
180 	uint32_t	video_address;	/* Address of picbuf Y */
181 	uint32_t	video_address_uv; /* Address of picbuf UV */
182 	uint32_t	video_stripe;	/* Picbuf stripe */
183 	uint32_t	video_width;	/* Picbuf width */
184 	uint32_t	video_height;	/* Picbuf height */
185 
186 	uint32_t	channel_id;	/* Decoder channel ID */
187 	uint32_t	status;		/* reserved */
188 	uint32_t	width;		/* pixels */
189 	uint32_t	height;		/* pixels */
190 	uint32_t	chroma_format;	/* see above */
191 	uint32_t	pulldown;	/* see above */
192 	uint32_t	flags;		/* see above */
193 	uint32_t	pts;		/* 32 LSBs of PTS */
194 	uint32_t	protocol;	/* protocolXXX (above) */
195 
196 	uint32_t	frame_rate;	/* see above */
197 	uint32_t	matrix_coeff;	/* see above */
198 	uint32_t	aspect_ratio;	/* see above */
199 	uint32_t	colour_primaries; /* see above */
200 	uint32_t	transfer_char;	/* see above */
201 	uint32_t	pcr_offset;	/* 45kHz if PCR type; else 27MHz */
202 	uint32_t	n_drop;		/* Number of pictures to be dropped */
203 
204 	uint32_t	custom_aspect_ratio_width_height;
205 	/* upper 16-bits is Y and lower 16-bits is X */
206 
207 	uint32_t	picture_tag;	/* Indexing tag from BUD packets */
208 	uint32_t	picture_done_payload;
209 	uint32_t	picture_meta_payload;
210 	uint32_t	reserved[1];
211 
212 	/* Protocol-specific extensions. */
213 	union {
214 		struct ppb_h264	h264;
215 		struct ppb_mpeg	mpeg;
216 		struct ppb_vc1	 vc1;
217 	} other;
218 
219 };
220 
221 struct c011_pib {
222 	uint32_t	bFormatChange;
223 	uint32_t	resolution;
224 	uint32_t	channelId;
225 	uint32_t	ppbPtr;
226 	int32_t	ptsStcOffset;
227 	uint32_t	zeroPanscanValid;
228 	uint32_t	dramOutBufAddr;
229 	uint32_t	yComponent;
230 	struct ppb	ppb;
231 
232 };
233 
234 struct dec_rsp_channel_start_video {
235 	uint32_t	command;
236 	uint32_t	sequence;
237 	uint32_t	status;
238 	uint32_t	picBuf;
239 	uint32_t	picRelBuf;
240 	uint32_t	picInfoDeliveryQ;
241 	uint32_t	picInfoReleaseQ;
242 	uint32_t	channelStatus;
243 	uint32_t	userDataDeliveryQ;
244 	uint32_t	userDataReleaseQ;
245 	uint32_t	transportStreamCaptureAddr;
246 	uint32_t	asyncEventQ;
247 
248 };
249 
250 #define eCMD_C011_CMD_BASE	  (0x73763000)
251 
252 /* host commands */
253 enum  c011_ts_cmd {
254 	eCMD_TS_GET_NEXT_PIC	= 0x7376F100, /* debug get next picture */
255 	eCMD_TS_GET_LAST_PIC	= 0x7376F102, /* debug get last pic status */
256 	eCMD_TS_READ_WRITE_MEM	= 0x7376F104, /* debug read write memory */
257 
258 	/* New API commands */
259 	/* General commands */
260 	eCMD_C011_INIT		= eCMD_C011_CMD_BASE + 0x01,
261 	eCMD_C011_RESET		= eCMD_C011_CMD_BASE + 0x02,
262 	eCMD_C011_SELF_TEST		= eCMD_C011_CMD_BASE + 0x03,
263 	eCMD_C011_GET_VERSION	= eCMD_C011_CMD_BASE + 0x04,
264 	eCMD_C011_GPIO		= eCMD_C011_CMD_BASE + 0x05,
265 	eCMD_C011_DEBUG_SETUP	= eCMD_C011_CMD_BASE + 0x06,
266 
267 	/* Decoding commands */
268 	eCMD_C011_DEC_CHAN_OPEN			= eCMD_C011_CMD_BASE + 0x100,
269 	eCMD_C011_DEC_CHAN_CLOSE			= eCMD_C011_CMD_BASE + 0x101,
270 	eCMD_C011_DEC_CHAN_ACTIVATE			= eCMD_C011_CMD_BASE + 0x102,
271 	eCMD_C011_DEC_CHAN_STATUS			= eCMD_C011_CMD_BASE + 0x103,
272 	eCMD_C011_DEC_CHAN_FLUSH			= eCMD_C011_CMD_BASE + 0x104,
273 	eCMD_C011_DEC_CHAN_TRICK_PLAY		= eCMD_C011_CMD_BASE + 0x105,
274 	eCMD_C011_DEC_CHAN_TS_PIDS			= eCMD_C011_CMD_BASE + 0x106,
275 	eCMD_C011_DEC_CHAN_PS_STREAM_ID		= eCMD_C011_CMD_BASE + 0x107,
276 	eCMD_C011_DEC_CHAN_INPUT_PARAMS		= eCMD_C011_CMD_BASE + 0x108,
277 	eCMD_C011_DEC_CHAN_VIDEO_OUTPUT		= eCMD_C011_CMD_BASE + 0x109,
278 	eCMD_C011_DEC_CHAN_OUTPUT_FORMAT		= eCMD_C011_CMD_BASE + 0x10A,
279 	eCMD_C011_DEC_CHAN_SCALING_FILTERS		= eCMD_C011_CMD_BASE + 0x10B,
280 	eCMD_C011_DEC_CHAN_OSD_MODE			= eCMD_C011_CMD_BASE + 0x10D,
281 	eCMD_C011_DEC_CHAN_DROP			= eCMD_C011_CMD_BASE + 0x10E,
282 	eCMD_C011_DEC_CHAN_RELEASE			= eCMD_C011_CMD_BASE + 0x10F,
283 	eCMD_C011_DEC_CHAN_STREAM_SETTINGS		= eCMD_C011_CMD_BASE + 0x110,
284 	eCMD_C011_DEC_CHAN_PAUSE_OUTPUT		= eCMD_C011_CMD_BASE + 0x111,
285 	eCMD_C011_DEC_CHAN_CHANGE			= eCMD_C011_CMD_BASE + 0x112,
286 	eCMD_C011_DEC_CHAN_SET_STC			= eCMD_C011_CMD_BASE + 0x113,
287 	eCMD_C011_DEC_CHAN_SET_PTS			= eCMD_C011_CMD_BASE + 0x114,
288 	eCMD_C011_DEC_CHAN_CC_MODE			= eCMD_C011_CMD_BASE + 0x115,
289 	eCMD_C011_DEC_CREATE_AUDIO_CONTEXT		= eCMD_C011_CMD_BASE + 0x116,
290 	eCMD_C011_DEC_COPY_AUDIO_CONTEXT		= eCMD_C011_CMD_BASE + 0x117,
291 	eCMD_C011_DEC_DELETE_AUDIO_CONTEXT		= eCMD_C011_CMD_BASE + 0x118,
292 	eCMD_C011_DEC_CHAN_SET_DECYPTION		= eCMD_C011_CMD_BASE + 0x119,
293 	eCMD_C011_DEC_CHAN_START_VIDEO		= eCMD_C011_CMD_BASE + 0x11A,
294 	eCMD_C011_DEC_CHAN_STOP_VIDEO		= eCMD_C011_CMD_BASE + 0x11B,
295 	eCMD_C011_DEC_CHAN_PIC_CAPTURE		= eCMD_C011_CMD_BASE + 0x11C,
296 	eCMD_C011_DEC_CHAN_PAUSE			= eCMD_C011_CMD_BASE + 0x11D,
297 	eCMD_C011_DEC_CHAN_PAUSE_STATE		= eCMD_C011_CMD_BASE + 0x11E,
298 	eCMD_C011_DEC_CHAN_SET_SLOWM_RATE		= eCMD_C011_CMD_BASE + 0x11F,
299 	eCMD_C011_DEC_CHAN_GET_SLOWM_RATE		= eCMD_C011_CMD_BASE + 0x120,
300 	eCMD_C011_DEC_CHAN_SET_FF_RATE		= eCMD_C011_CMD_BASE + 0x121,
301 	eCMD_C011_DEC_CHAN_GET_FF_RATE		= eCMD_C011_CMD_BASE + 0x122,
302 	eCMD_C011_DEC_CHAN_FRAME_ADVANCE		= eCMD_C011_CMD_BASE + 0x123,
303 	eCMD_C011_DEC_CHAN_SET_SKIP_PIC_MODE	= eCMD_C011_CMD_BASE + 0x124,
304 	eCMD_C011_DEC_CHAN_GET_SKIP_PIC_MODE	= eCMD_C011_CMD_BASE + 0x125,
305 	eCMD_C011_DEC_CHAN_FILL_PIC_BUF		= eCMD_C011_CMD_BASE + 0x126,
306 	eCMD_C011_DEC_CHAN_SET_CONTINUITY_CHECK	= eCMD_C011_CMD_BASE + 0x127,
307 	eCMD_C011_DEC_CHAN_GET_CONTINUITY_CHECK	= eCMD_C011_CMD_BASE + 0x128,
308 	eCMD_C011_DEC_CHAN_SET_BRCM_TRICK_MODE	= eCMD_C011_CMD_BASE + 0x129,
309 	eCMD_C011_DEC_CHAN_GET_BRCM_TRICK_MODE	= eCMD_C011_CMD_BASE + 0x12A,
310 	eCMD_C011_DEC_CHAN_REVERSE_FIELD_STATUS	= eCMD_C011_CMD_BASE + 0x12B,
311 	eCMD_C011_DEC_CHAN_I_PICTURE_FOUND		= eCMD_C011_CMD_BASE + 0x12C,
312 	eCMD_C011_DEC_CHAN_SET_PARAMETER		= eCMD_C011_CMD_BASE + 0x12D,
313 	eCMD_C011_DEC_CHAN_SET_USER_DATA_MODE	= eCMD_C011_CMD_BASE + 0x12E,
314 	eCMD_C011_DEC_CHAN_SET_PAUSE_DISPLAY_MODE	= eCMD_C011_CMD_BASE + 0x12F,
315 	eCMD_C011_DEC_CHAN_SET_SLOW_DISPLAY_MODE	= eCMD_C011_CMD_BASE + 0x130,
316 	eCMD_C011_DEC_CHAN_SET_FF_DISPLAY_MODE	= eCMD_C011_CMD_BASE + 0x131,
317 	eCMD_C011_DEC_CHAN_SET_DISPLAY_TIMING_MODE	= eCMD_C011_CMD_BASE + 0x132,
318 	eCMD_C011_DEC_CHAN_SET_DISPLAY_MODE		= eCMD_C011_CMD_BASE + 0x133,
319 	eCMD_C011_DEC_CHAN_GET_DISPLAY_MODE		= eCMD_C011_CMD_BASE + 0x134,
320 	eCMD_C011_DEC_CHAN_SET_REVERSE_FIELD	= eCMD_C011_CMD_BASE + 0x135,
321 	eCMD_C011_DEC_CHAN_STREAM_OPEN		= eCMD_C011_CMD_BASE + 0x136,
322 	eCMD_C011_DEC_CHAN_SET_PCR_PID		= eCMD_C011_CMD_BASE + 0x137,
323 	eCMD_C011_DEC_CHAN_SET_VID_PID		= eCMD_C011_CMD_BASE + 0x138,
324 	eCMD_C011_DEC_CHAN_SET_PAN_SCAN_MODE	= eCMD_C011_CMD_BASE + 0x139,
325 	eCMD_C011_DEC_CHAN_START_DISPLAY_AT_PTS	= eCMD_C011_CMD_BASE + 0x140,
326 	eCMD_C011_DEC_CHAN_STOP_DISPLAY_AT_PTS	= eCMD_C011_CMD_BASE + 0x141,
327 	eCMD_C011_DEC_CHAN_SET_DISPLAY_ORDER	= eCMD_C011_CMD_BASE + 0x142,
328 	eCMD_C011_DEC_CHAN_GET_DISPLAY_ORDER	= eCMD_C011_CMD_BASE + 0x143,
329 	eCMD_C011_DEC_CHAN_SET_HOST_TRICK_MODE	= eCMD_C011_CMD_BASE + 0x144,
330 	eCMD_C011_DEC_CHAN_SET_OPERATION_MODE	= eCMD_C011_CMD_BASE + 0x145,
331 	eCMD_C011_DEC_CHAN_DISPLAY_PAUSE_UNTO_PTS	= eCMD_C011_CMD_BASE + 0x146,
332 	eCMD_C011_DEC_CHAN_SET_PTS_STC_DIFF_THRESHOLD = eCMD_C011_CMD_BASE + 0x147,
333 	eCMD_C011_DEC_CHAN_SEND_COMPRESSED_BUF	= eCMD_C011_CMD_BASE + 0x148,
334 	eCMD_C011_DEC_CHAN_SET_CLIPPING		= eCMD_C011_CMD_BASE + 0x149,
335 	eCMD_C011_DEC_CHAN_SET_PARAMETERS_FOR_HARD_RESET_INTERRUPT_TO_HOST
336 		= eCMD_C011_CMD_BASE + 0x150,
337 
338 	/* Decoder RevD commands */
339 	eCMD_C011_DEC_CHAN_SET_CSC	= eCMD_C011_CMD_BASE + 0x180, /* color space conversion */
340 	eCMD_C011_DEC_CHAN_SET_RANGE_REMAP	= eCMD_C011_CMD_BASE + 0x181,
341 	eCMD_C011_DEC_CHAN_SET_FGT		= eCMD_C011_CMD_BASE + 0x182,
342 	/* Note: 0x183 not implemented yet in Rev D main */
343 	eCMD_C011_DEC_CHAN_SET_LASTPICTURE_PADDING = eCMD_C011_CMD_BASE + 0x183,
344 
345 	/* Decoder 7412 commands (7412-only) */
346 	eCMD_C011_DEC_CHAN_SET_CONTENT_KEY	= eCMD_C011_CMD_BASE + 0x190,
347 	eCMD_C011_DEC_CHAN_SET_SESSION_KEY	= eCMD_C011_CMD_BASE + 0x191,
348 	eCMD_C011_DEC_CHAN_FMT_CHANGE_ACK	= eCMD_C011_CMD_BASE + 0x192,
349 
350 	eCMD_C011_DEC_CHAN_CUSTOM_VIDOUT    = eCMD_C011_CMD_BASE + 0x1FF,
351 
352 	/* Encoding commands */
353 	eCMD_C011_ENC_CHAN_OPEN		= eCMD_C011_CMD_BASE + 0x200,
354 	eCMD_C011_ENC_CHAN_CLOSE		= eCMD_C011_CMD_BASE + 0x201,
355 	eCMD_C011_ENC_CHAN_ACTIVATE		= eCMD_C011_CMD_BASE + 0x202,
356 	eCMD_C011_ENC_CHAN_CONTROL		= eCMD_C011_CMD_BASE + 0x203,
357 	eCMD_C011_ENC_CHAN_STATISTICS	= eCMD_C011_CMD_BASE + 0x204,
358 
359 	eNOTIFY_C011_ENC_CHAN_EVENT		= eCMD_C011_CMD_BASE + 0x210,
360 
361 };
362 
363 #endif
364