1 /**
2  * file vsp.h
3  * Author: Binglin Chen <binglin.chen@intel.com>
4  *
5  */
6 
7 /**************************************************************************
8  * Copyright (c) 2007, Intel Corporation.
9  * All Rights Reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify it
12  * under the terms and conditions of the GNU General Public License,
13  * version 2, as published by the Free Software Foundation.
14  *
15  * This program is distributed in the hope it will be useful, but WITHOUT
16  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
18  * more details.
19  *
20  * You should have received a copy of the GNU General Public License along with
21  * this program; if not, write to the Free Software Foundation, Inc.,
22  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23  *
24  **************************************************************************/
25 
26 #ifndef _VSP_FW_H_
27 #define _VSP_FW_H_
28 
29 #pragma pack(4)
30 #define VssProcPipelineMaxNumFilters 5
31 #define VSS_PROC_MAX_INPUT_PICTURES  1
32 #define VSS_PROC_MAX_OUTPUT_PICTURES 4
33 
34 /* Application IDs for applications that use secure boot
35  * and context-switching
36  * */
37 #define VSP_APP_ID_NONE 0
38 #define VSP_APP_ID_FRC_VPP 1
39 #define VSP_APP_ID_VP8_ENC 2
40 #define VSP_APP_ID_WIDI_ENC 3
41 
42 enum VssProcFilterType {
43 	VssProcFilterDenoise,
44 	VssProcFilterSharpening,
45 	VssProcFilterColorEnhancement,
46 	VssProcFilterFrameRateConversion
47 };
48 
49 enum VssDenoiseType {
50 	VssProcDegrain,
51 	VssProcDeblock
52 };
53 
54 enum VssFrcQuality {
55 	/* VssFrcLowQuality, */
56 	VssFrcMediumQuality,
57 	VssFrcHighQuality
58 };
59 
60 enum VssFrcConversionRate {
61 	VssFrc2xConversionRate,
62 	VssFrc2_5xConversionRate,
63 	VssFrc4xConversionRate,
64 	VssFrc1_25xConversionRate
65 };
66 
67 struct VssProcPipelineParameterBuffer {
68 	unsigned int      num_filters;
69 	enum VssProcFilterType filter_pipeline[VssProcPipelineMaxNumFilters];
70 	unsigned int intermediate_buffer_base;
71 	unsigned int intermediate_buffer_size;
72 };
73 
74 struct VssProcSharpenParameterBuffer {
75 	int quality;
76 	/* to make multiple of 32 bytes*/
77 	unsigned int _pad[7];
78 };
79 
80 struct VssProcDenoiseParameterBuffer {
81 	enum VssDenoiseType     type;
82 	int                value_thr;
83 	int                cnt_thr;
84 	int                coef;
85 	int                temp_thr1;
86 	int                temp_thr2;
87 	/* to make multiple of 32 bytes*/
88 	int                _pad[2];
89 };
90 
91 struct VssProcColorEnhancementParameterBuffer {
92 	int                temp_detect;
93 	int                temp_correct;
94 	int                clip_thr;
95 	int                mid_thr;
96 	int                luma_amm;
97 	int                chroma_amm;
98 	/* to make multiple of 32 bytes*/
99 	int                _pad[2];
100 };
101 
102 struct VssProcFrcParameterBuffer {
103 	enum VssFrcQuality quality;
104 	enum VssFrcConversionRate conversion_rate;
105 	/* to make multiple of 32 bytes*/
106 	int  _pad[6];
107 };
108 
109 /* Set the rotation angle */
110 #define VSP_ROTATION_NONE 0
111 #define VSP_ROTATION_90   90
112 #define VSP_ROTATION_180  180
113 #define VSP_ROTATION_270  270
114 
115 struct VssProcPicture {
116 	unsigned int surface_id;
117 	/* send interupt when input or output surface is ready */
118 	unsigned int irq;
119 	unsigned int base;
120 	unsigned int height;
121 	unsigned int width;
122 	unsigned int rot_angle;
123 	unsigned int stride;
124 	/* frame raw format */
125 	unsigned int format;
126 	/* flag indicating if frame is stored in tiled format */
127 	unsigned int tiled;
128 	/* to make multiple of 32 bytes*/
129 	int _pad[7];
130 };
131 
132 struct VssProcPictureParameterBuffer {
133 	unsigned int num_input_pictures;
134 	unsigned int num_output_pictures;
135 	/* to make multiple of 32 bytes*/
136 	int          _pad[6];
137 	struct VssProcPicture input_picture[VSS_PROC_MAX_INPUT_PICTURES];
138 	struct VssProcPicture output_picture[VSS_PROC_MAX_OUTPUT_PICTURES];
139 };
140 
141 union VssProcBuffer {
142 	struct VssProcPipelineParameterBuffer         pipeline;
143 	struct VssProcSharpenParameterBuffer          sharpen_base;
144 	struct VssProcDenoiseParameterBuffer          denoiser_base;
145 	struct VssProcColorEnhancementParameterBuffer enhancer_base;
146 	struct VssProcFrcParameterBuffer              frc;
147 	struct VssProcPictureParameterBuffer          picture;
148 };
149 
150 enum VssProcCommandType {
151 	VssProcPipelineParameterCommand =         0xFFFE,
152 	VssProcSharpenParameterCommand =          0xFFFD,
153 	VssProcDenoiseParameterCommand =          0xFFFC,
154 	VssProcColorEnhancementParameterCommand = 0xFFFB,
155 	VssProcFrcParameterCommand =              0xFFFA,
156 	VssProcPictureCommand =                   0xFFF9,
157 	VspFencePictureParamCommand =             0xEBEC,
158 	VspSetContextCommand =                    0xEBED,
159 	Vss_Sys_STATE_BUF_COMMAND =		  0xEBEE,
160 	VspFenceComposeCommand =		  0xEBEF
161 };
162 
163 #define VSP_CMD_QUEUE_SIZE (64)
164 #define VSP_ACK_QUEUE_SIZE (64)
165 
166 /*
167  * Command types and data structure.
168  * Each command has a type. Depending on the type there is some kind
169  * of data in external memory,
170  * The VSS will use its DMA to load data from the buffer into local memory.
171  */
172 struct vss_command_t {
173 	unsigned int       context;
174 	unsigned int       type;
175 	unsigned int       buffer;
176 	unsigned int       size;
177 	unsigned int       buffer_id;
178 	unsigned int       irq;
179 	unsigned int       reserved6;
180 	unsigned int       reserved7;
181 };
182 
183 struct vss_response_t {
184 	unsigned int       context;
185 	unsigned int       type;
186 	unsigned int       buffer;
187 	unsigned int       size;
188 	unsigned int       vss_cc;
189 	unsigned int       reserved5;
190 	unsigned int       reserved6;
191 	unsigned int       reserved7;
192 };
193 
194 /* Default initial values for vsp-command and vsp-response
195 * Using those avoids the risk of uninitialized warnings when
196 * the definition changes.
197 */
198 #define VSP_COMMAND_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0}
199 #define VSP_RESPONSE_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0}
200 
201 /*
202  * Response types
203  */
204 enum VssResponseType {
205 	VssIdleResponse               = 0x80010000,
206 	VssErrorResponse              = 0x80020000,
207 	VssEndOfSequenceResponse      = 0x80030000,
208 	VssCommandBufferReadyResponse = 0x80040000,
209 	VssInputSurfaceReadyResponse  = 0x80050000,
210 	VssOutputSurfaceReadyResponse = 0x80060000,
211 	VssVp8encSetSequenceParametersResponse = 150,
212 	VssVp8encEncodeFrameResponse
213 };
214 
215 enum VssStatus {
216 	VssOK                         = 0x8001,
217 	VssInvalidCommandType         = 0x8002,
218 	VssInvalidCommandArgument     = 0x8003,
219 	VssInvalidProcPictureCommand  = 0x8004,
220 	VssInvalidDdrAddress          = 0x8005,
221 	VssInvalidSequenceParameters_VP8 = 0x1,
222 	VssInvalidPictureParameters_VP8  = 0x2,
223 	VssContextMustBeDestroyed_VP8    = 0x3,
224 	VssInitFailure_VP8               = 0x5,
225 	VssCorruptFrame                  = 0x6,
226 	VssCorruptFramecontinue_VP8      = 0x7
227 };
228 
229 enum FrcResponseType {
230 	VssOutputSurfaceFreeResponse = 0x0000F001,
231 	VssOutputSurfaceCrcResponse  = 0x0000F002
232 };
233 
234 enum vsp_format {
235 	VSP_NV12,
236 	VSP_YV12,
237 	VSP_UYVY,
238 	VSP_YUY2,
239 	VSP_NV11,
240 	VSP_NV16,
241 	VSP_IYUV,
242 	VSP_TYPE_ERROR
243 };
244 
245 struct vsp_data {
246 	unsigned int fw_state;
247 	unsigned int uninit_req;
248 };
249 
250 #define VSP_SECURE_BOOT_MAGIC_NR 0xb0070001
251 
252 enum vsp_processor {
253 	vsp_sp0 = 0,
254 	vsp_sp1 = 1,
255 	vsp_vp0 = 2,
256 	vsp_vp1 = 3,
257 	vsp_mea = 4
258 };
259 
260 /**
261 * Header-data/struct by PUnit to start VSP boot-processor
262 * This struct is mapped directly into the header of the multi-application-blob
263 *
264 * For each value that is to be written to the VSP, the register-address to
265 * write to is listed directly after the value to be written.
266 *
267 * Entries that contain values can be written directly into the VSP-system.
268 * Offsets need to have the secure-boot-header-address added and then be written
269 * into the VSP
270 *
271 * boot_start_value should always be the last value written. (Since it starts
272 * the VSP)
273 */
274 struct vsp_secure_boot_header {
275 	/* Magic number to identify header version */
276 	unsigned int magic_number;
277 
278 	/* Offset to text section of boot-program in blob */
279 	unsigned int boot_text_offset;
280 	/* iCache base-address of boot-processor */
281 	unsigned int boot_text_reg;
282 
283 	/* Value of icache-control-bits to write to boot-processor */
284 	unsigned int boot_icache_value;
285 	/* status&control register of boot-processor */
286 	unsigned int boot_icache_reg;
287 
288 	/* Value of program counter to write to boot-processor */
289 	/* address of main-function in boot-program */
290 	unsigned int boot_pc_value;
291 	/* pc-start-register of boot-processor */
292 	unsigned int boot_pc_reg;
293 
294 	/* Offset of multi-application-header in blob */
295 	unsigned int ma_header_offset;
296 	unsigned int ma_header_reg;
297 
298 	/* Value to write to start the boot-processor */
299 	unsigned int boot_start_value;
300 	/* status&control register of boot-processor */
301 	unsigned int boot_start_reg;
302 };
303 
304 #define VSP_MULTI_APP_MAGIC_NR 0xb10b0005
305 /*
306  * Note: application index/id 0 is reserved.
307  * So the maximum number of applications is one less than listed here.
308  * */
309 #define VSP_MULTI_APP_MAX_APPS 16
310 
311 /*
312  * With a 1MB state-buffer in IMR and a 50k context-buffer-size, we could run
313  * * max 20 apps. Using 32 as a nice round number of maximum nr of contexts.
314  * * Actual maximum allowed contexts is currently less, since context-buffer-size
315  * * is larger than 50k.
316  * */
317 #define VSP_MULTI_APP_MAX_CONTEXTS 32
318 #define VSP_API_GENERIC_CONTEXT_ID (0xffffffff)
319 /*
320  * Struct used by VSP-boot-processor to start the correct application
321  * Read from header in firmware ma-blob.
322  * Address of the header is communicated by p-unit.
323  *
324  * Note: this is a VIED internal header
325  */
326 struct vsp_multi_app_blob_data {
327 	unsigned int magic_number;
328 	unsigned int offset_from_start;
329 	/** State buffer address in virtual memory, default location on TNG B0 and ANN
330 	 * * is 0xA0000000 (2.5GB memory offset, master port 2, 2nd IMR region) */
331 	unsigned int imr_state_buffer_addr;
332 	/** Size of state-buffer in IMR (in bytes). Default state buffer size for TNG
333 	 * * B0 and ANN is 1 MB */
334 	unsigned int imr_state_buffer_size;
335 	/** default context-buffer size of apps in this blob (each app also has it's
336 	 * context-size in it's header. */
337 	unsigned int apps_default_context_buffer_size;
338 	/**
339 	* Address of genboot-helper-program in blob (relative to start of this header)
340 	*/
341 	unsigned int genboot_helper_prog_offset;
342 	/*
343 	 * * This table contains a zero (offset of zero) for unused entries
344 	 * * Offsets here are relative to the start-address of this header.
345 	 */
346 	unsigned int application_blob_offsets[VSP_MULTI_APP_MAX_APPS];
347 };
348 
349 /*
350  * Struct for the settings of a single context. Normally placed in an array in
351  * the multi-app header in IMR
352  *
353  * Context-id is determined by the position in the array, so it is not stored in
354  * the struct itself.
355  *
356  * State_buffer_size and state_buffer_addr are currently not stored, since they
357  * can/will be determined automatically based on generic IMR parameters.
358  *
359  * Usage field is the last field, so that it gets written last during a memory
360  * transfer.
361  */
362 struct vsp_multi_app_context_settings {
363 	unsigned int app_id;  /* Which app this context belongs to */
364 	unsigned int usage; /* Indicates if this context is in use */
365 };
366 
367 /*
368  * Datastructure placed at the beginning of the VSP IMR state-save region.
369  * */
370 struct vsp_multi_app_imr_header {
371 	/*
372 	 * Usage field (32-bit), set to 0 by Chaabi during system bootup, set to 1
373 	 * by VSP if it is safe for PUnit to perform a restart without power-cycle.
374 	 * Set to any other value by VSP if VSP is running.
375 	 * */
376 	unsigned int vsp_and_imr_state;
377 	/* Reserved field for 256-bit alignment of header */
378 	unsigned int reserved_1;
379 	/* Reserved field for 256-bit alignment of header */
380 	unsigned int reserved_2;
381 	/* Reserved field for 256-bit alignment of header */
382 	unsigned int reserved_3;
383 	/* Reserved field for 256-bit alignment of header */
384 	unsigned int reserved_4;
385 	/* Reserved field for 256-bit alignment of header */
386 	unsigned int reserved_5;
387 	/* Reserved field for 256-bit alignment of header */
388 	unsigned int reserved_6;
389 	/* Reserved field for 256-bit alignment of header */
390 	unsigned int reserved_7;
391 	/* Settings of all active/available contexts */
392 	struct vsp_multi_app_context_settings context_settings[VSP_MULTI_APP_MAX_CONTEXTS];
393 };
394 
395 enum vsp_imr_state{
396 	/** State when no data for VSP is initialized */
397 	vsp_imr_uninitialized = 0,
398 	/** State where datastructures are initialized, but no VSP is running */
399 	vsp_imr_safe_to_resume = 1,
400 	/** State where datastructures are initialized and VSP(-API) is running */
401 	vsp_imr_initialized = 2,
402 	/** State where datastructures are initialized and VSP(-APP) is running */
403 	vsp_imr_app_is_running = 3
404 };
405 
406 enum vsp_ctrl_reg_addr {
407 	VSP_SETTING_ADDR_REG      = 3,
408 	VSP_SECBOOT_DEBUG_REG     = 4,
409 	VSP_ENTRY_KIND_REG        = 5,
410 	VSP_POWER_SAVING_MODE_REG = 6,
411 	VSP_MMU_TLB_SOFT_INVALIDATE_REG = 7,
412 	VSP_CMD_QUEUE_RD_REG      = 12,
413 	VSP_CMD_QUEUE_WR_REG      = 13,
414 	VSP_ACK_QUEUE_RD_REG      = 14,
415 	VSP_ACK_QUEUE_WR_REG      = 15
416 };
417 
418 struct vsp_ctrl_reg {
419 	unsigned int reserved_2;
420 
421 	/* setting address from host to firmware */
422 	unsigned int setting_addr;
423 
424 	/* used for sending debug-status from firmware to host */
425 	unsigned int secboot_debug;
426 
427 	/* entry type from host to firmware
428 	 * If it contains vsp_exit, uninitialize the firmware
429 	 */
430 	unsigned int entry_kind;
431 
432 	/* set the power-saving-mode setting */
433 	unsigned int power_saving_mode;
434 
435 	/* config reg to request firmware to perform an MMU TLB invalidate.
436 	* MMU TLB invalidation for VSP on TNG needs to be done through firmware
437 	* due to a hardware bug that could trigger if TLB invalidation is done
438 	* while VSP DMA is not idle.
439 	*/
440 	unsigned int mmu_tlb_soft_invalidate;
441 
442 	unsigned int reserved_8;
443 	unsigned int reserved_9;
444 	unsigned int reserved_10;
445 	unsigned int reserved_11;
446 
447 	/* used for the command and response queues */
448 	unsigned int cmd_rd;
449 	unsigned int cmd_wr;
450 	unsigned int ack_rd;
451 	unsigned int ack_wr;
452 };
453 
454 /* constant parameters passed from host to firmware,
455  * address of this struct is passed via config reg
456  * struct is written to ddr in vsp_init call, destroyed upon uninit
457  */
458 struct vsp_settings_t {
459 	/* Extra field to align to 256 bit (for DMA) */
460 	unsigned int reserved0;
461 	unsigned int command_queue_size;
462 	unsigned int command_queue_addr;
463 	unsigned int response_queue_size;
464 	unsigned int response_queue_addr;
465 	/* Extra field to align to 256 bit (for DMA) */
466 	unsigned int reserved5;
467 	/* Extra field to align to 256 bit (for DMA) */
468 	unsigned int reserved6;
469 	unsigned int reserved7;
470 };
471 
472 /**
473 * The host should only modify the vsp_context_settings_entry when the usage
474 * field is vsp_context_unused or vsp_context_uninit. The host can do the
475 * following state-transitions for the usage field:
476 * 1) vsp_context_unused->vsp_context_starting: start a new stream/context.
477 * After this transition, the host can submit commands into the command-queue
478 * for the context-id associated with this vsp_context_settings entry.
479 * 2) vsp_context_deinit->vsp_context_unused: destroy resources (free state
480 * buffer) from the no longer needed context and mark the context as being
481 * unused.
482 *
483 * The VSP will only modify the vsp_context_settings_entry when the usage
484 * field is vsp_context_starting or vsp_context_in_use. The VSP will do the
485 * following state-transitions for the usage field:
486 * 3) vsp_context_starting->vsp_context_in_use: Perform initialisation of
487 * state-buffers and other VSP-side initialisation required to start a new
488 * stream/context. This is typically done when the first command for this
489 * context is received from the host.
490 * 4) vsp_context_in_use->vsp_context_deinit: Mark a context as being no longer
491 * used by the VSP. The VSP will no longer access any resource used by this
492 * context after this transition. This transition is done after an
493 * end-of-stream response or similar response to the host to indicate that an
494 * application finished for a specific context.
495 */
496 enum vsp_context_usage {
497 	vsp_context_unused   = 0,
498 	vsp_context_deinit   = 1,
499 	vsp_context_starting = 16,
500 	vsp_context_in_use   = 17
501 };
502 
503 /* default initializer to initialize vsp_settings struct
504  * (including the extra alignment fields)
505  */
506 #define VSP_SETTINGS_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0}
507 
508 /* values passed via VSP_ENTRY_TYPE_REG
509  * vsp_entry_booted is the default value, it means no init or resume has been
510  * communicated by the host yet.
511  * vsp_entry_init and vsp_entry_resume are used for initial starting of the
512  * system and for resuming after a suspend/power-down.
513 */
514 enum vsp_entry_kind {
515 	vsp_entry_booted   = 0,
516 	vsp_entry_init     = 1,
517 	vsp_entry_resume   = 2,
518 	vsp_exit           = 3
519 };
520 
521 /* values passed via VSP_POWER_SAVING_MODE_REG */
522 enum vsp_power_saving_mode {
523 	vsp_always_on              = 0,
524 	vsp_suspend_on_empty_queue = 1,
525 	vsp_hw_idle_on_empty_queue = 2,
526 	vsp_suspend_and_hw_idle_on_empty_queue
527 };
528 
529 /****************************
530  * VP8enc data structures
531  ****************************/
532 
533 /**
534  * Picture data structure. Currently the same as frc
535  */
536 struct VssProcPictureVP8 {
537 	uint32_t surface_id;
538 	uint32_t irq;  /* send interupt when input or output surface is ready */
539 	uint32_t base; /* pointer to luma picture in DDR */
540 	uint32_t base_uv; /* pointer to chroma picture in DDR */
541 	uint32_t height;
542 	uint32_t width;
543 	uint32_t stride;
544 	uint32_t format; /* frame raw format */
545 };
546 
547 /**
548  * Enumeration for recon_buffer_mode
549  */
550 typedef enum {
551 	vss_vp8enc_seq_param_recon_buffer_mode_per_seq = 0, /* send 4 ref/recon frame buffers at seq lvl */
552 	vss_vp8enc_seq_param_recon_buffer_mode_per_pic,     /* send 1 recon frame buffer per picture */
553 	vss_vp8enc_seq_param_recon_buffer_mode_cnt          /* nr of modes */
554 } vss_vp8enc_seq_param_recon_buffer_mode_t;
555 
556 /**
557  * Sequence parameter data structure.
558  */
559 struct VssVp8encSequenceParameterBuffer {
560 	uint32_t frame_width;
561 	uint32_t frame_height;
562 	uint32_t frame_rate;
563 	uint32_t error_resilient;
564 	uint32_t num_token_partitions;
565 	uint32_t kf_mode;
566 	uint32_t kf_min_dist;
567 	uint32_t kf_max_dist;
568 	uint32_t rc_target_bitrate;
569 	uint32_t rc_min_quantizer;
570 	uint32_t rc_max_quantizer;
571 	uint32_t rc_undershoot_pct;
572 	uint32_t rc_overshoot_pct;
573 	uint32_t rc_end_usage;
574 	uint32_t rc_buf_sz;
575 	uint32_t rc_buf_initial_sz;
576 	uint32_t rc_buf_optimal_sz;
577 	uint32_t max_intra_rate;
578 	uint32_t cyclic_intra_refresh;
579 	uint32_t concatenate_partitions;
580 	uint32_t recon_buffer_mode;
581 	uint32_t generate_skip_frames;
582 	uint32_t max_num_dropped_frames;
583 	uint32_t ts_number_layers;
584 	uint32_t ts_target_bitrate[3];
585 	uint32_t ts_rate_decimator[3];
586 	uint32_t ts_periodicity;
587 	uint8_t ts_layer_id[32];
588 	struct VssProcPictureVP8 ref_frame_buffers[4];
589 };
590 
591 struct VssVp8encEncodedFrame {
592 	uint32_t frame_size;
593 	uint32_t status;
594 	uint32_t partitions;
595 	uint32_t partition_size[9];
596 	uint32_t partition_start[9];
597 	uint32_t segments;
598 	uint32_t quantizer[4];
599 	uint32_t frame_flags;
600 	uint32_t partition_id;
601 	uint32_t buffer_level[3];
602 	uint32_t quality;
603 	uint32_t overflow_bytes;
604 	uint32_t surfaceId_of_ref_frame[4];
605 	uint32_t reserved[15];
606 	uint32_t coded_data[1];
607 };
608 
609 /**
610  * Encode frame command buffer
611  */
612 struct VssVp8encPictureParameterBuffer {
613 	struct VssProcPictureVP8 input_frame;
614 	struct VssProcPictureVP8 recon_frame;
615 
616 	uint32_t version;
617 	uint32_t pic_flags;
618 	uint32_t prev_frame_dropped;
619 	uint32_t cpuused;
620 	uint32_t sharpness;
621 	uint32_t num_token_partitions;
622 	uint32_t encoded_frame_size;
623 	uint32_t encoded_frame_base;
624 };
625 
626 /**
627  * Command enumeration
628  */
629 enum VssVp8encCommandType {
630 	VssVp8encSetSequenceParametersCommand = 123,
631 	VssVp8encEncodeFrameCommand,
632 	VssVp8encEndOfSequenceCommand,
633 	VssVp8encInit,
634 	Vss_Sys_Ref_Frame_COMMAND
635 };
636 
637 /*
638  * Generic VSP commands
639  *
640  * Generic VSP commands should be sent with the context field set to
641  * VSP_API_GENERIC_CONTEXT_ID.
642  */
643 enum VssGenCommandType {
644 	/** Generic command to instruct the VSP to (create and) initialize a context.
645 	 * * The buffer field contains the context-id of the new context to initialize.
646 	 * The size-field contains the app-id for the new context to initialize
647 	 */
648 	VssGenInitializeContext       = 0xab01,
649 	/** Generic command to instruct the VSP to de-initialize and destroy a
650 	 * context. The buffer field contains the context-id of the context to
651 	 * de-initialize and destroy. The size-field should always be set to 0.
652 	 */
653 	VssGenDestroyContext          = 0xab02
654 };
655 
656 /****************************
657  * WiDi Compose data structures
658  ****************************/
659 enum VssWiDi_ComposeCommandType {
660 	VssWiDi_ComposeSetSequenceParametersCommand = 200,
661 	VssWiDi_ComposeFrameCommand,
662 	VssWiDi_ComposeEndOfSequenceCommand
663 };
664 
665 enum VssWiDi_ComposeResponseType {
666 	VssWiDi_ComposeSetSequenceParametersResponse = 250,
667 	VssWiDi_ComposeFrameResponse,
668 };
669 
670 enum VssWiDi_ColorFormat {
671 	MonoChrome = 0,
672 	YUV_4_2_0,
673 	YUV_4_2_0_NV12,
674 	YUV_4_2_2,
675 	YUV_4_4_4
676 };
677 /**
678  * WiDi Compose sequence parameter data structure.
679  */
680 struct VssWiDi_ComposeSequenceParameterBuffer {
681 	unsigned int R_Buffer;
682 	unsigned int G_Buffer;
683 	unsigned int B_Buffer;
684 	unsigned int RGBA_Buffer;
685 	unsigned int Y_Buffer;
686 	unsigned int UV_Buffer;
687 	unsigned int U_Buffer;
688 	unsigned int V_Buffer;
689 	unsigned int A_Buffer;
690 	int ActualWidth;
691 	int ActualHeight;
692 	int ProcessedWidth;
693 	int ProcessedHeight;
694 	int TotalMBCount;
695 	int Stride;
696 	/*Video related*/
697 	int Video_IN_xsize;
698 	int Video_IN_ysize;
699 	int Video_IN_stride;
700 	int Video_IN_yuv_format;
701 
702 	unsigned int Video_IN_Y_Buffer;
703 	unsigned int Video_IN_UV_Buffer;
704         unsigned int Video_IN_U_Buffer;
705 	unsigned int Video_IN_V_Buffer;
706 	int Video_OUT_xsize;
707 	int Video_OUT_ysize;
708 	int Video_OUT_stride;
709 	int Video_OUT_yuv_format;
710 
711 	unsigned int Video_OUT_Y_Buffer;
712 	unsigned int Video_OUT_UV_Buffer;
713 	unsigned int Video_OUT_V_Buffer;
714 
715 	unsigned int scaled_width;
716 	unsigned int scaled_height;
717 	unsigned int scalefactor_dx;
718 	unsigned int scalefactor_dy;
719 
720 	/*Blending related params*/
721 	int Is_Blending_Enabled;
722 	int ROI_width;
723 	int ROI_height;
724 	int ROI_x1;
725 	int ROI_y1;
726 	int ROI_x2;
727 	int ROI_y2;
728 	int alpha1;
729 	int alpha2;
730 	int Is_video_the_back_ground;
731 	int Is_source_1_image_available;
732 	int Is_source_2_image_available;
733 	int Is_alpha_channel_available;
734 	int Video_TotalMBCount;
735 	int CSC_FormatSelect; /* 0: YUV420NV12; 1: YUV444; */
736 	int CSC_InputFormatSelect; // 0: RGB Planar; 1: RGBA Interleaved
737 };
738 
739 #pragma pack()
740 #endif
741