/** * file vsp.h * Author: Binglin Chen <binglin.chen@intel.com> * */ /************************************************************************** * Copyright (c) 2007, Intel Corporation. * All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, * version 2, as published by the Free Software Foundation. * * This program is distributed in the hope 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. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. * **************************************************************************/ #ifndef _VSP_FW_H_ #define _VSP_FW_H_ #pragma pack(4) #define VssProcPipelineMaxNumFilters 5 #define VSS_PROC_MAX_INPUT_PICTURES 1 #define VSS_PROC_MAX_OUTPUT_PICTURES 4 /* Application IDs for applications that use secure boot * and context-switching * */ #define VSP_APP_ID_NONE 0 #define VSP_APP_ID_FRC_VPP 1 #define VSP_APP_ID_VP8_ENC 2 #define VSP_APP_ID_WIDI_ENC 3 enum VssProcFilterType { VssProcFilterDenoise, VssProcFilterSharpening, VssProcFilterColorEnhancement, VssProcFilterFrameRateConversion }; enum VssDenoiseType { VssProcDegrain, VssProcDeblock }; enum VssFrcQuality { /* VssFrcLowQuality, */ VssFrcMediumQuality, VssFrcHighQuality }; enum VssFrcConversionRate { VssFrc2xConversionRate, VssFrc2_5xConversionRate, VssFrc4xConversionRate, VssFrc1_25xConversionRate }; struct VssProcPipelineParameterBuffer { unsigned int num_filters; enum VssProcFilterType filter_pipeline[VssProcPipelineMaxNumFilters]; unsigned int intermediate_buffer_base; unsigned int intermediate_buffer_size; }; struct VssProcSharpenParameterBuffer { int quality; /* to make multiple of 32 bytes*/ unsigned int _pad[7]; }; struct VssProcDenoiseParameterBuffer { enum VssDenoiseType type; int value_thr; int cnt_thr; int coef; int temp_thr1; int temp_thr2; /* to make multiple of 32 bytes*/ int _pad[2]; }; struct VssProcColorEnhancementParameterBuffer { int temp_detect; int temp_correct; int clip_thr; int mid_thr; int luma_amm; int chroma_amm; /* to make multiple of 32 bytes*/ int _pad[2]; }; struct VssProcFrcParameterBuffer { enum VssFrcQuality quality; enum VssFrcConversionRate conversion_rate; /* to make multiple of 32 bytes*/ int _pad[6]; }; /* Set the rotation angle */ #define VSP_ROTATION_NONE 0 #define VSP_ROTATION_90 90 #define VSP_ROTATION_180 180 #define VSP_ROTATION_270 270 struct VssProcPicture { unsigned int surface_id; /* send interupt when input or output surface is ready */ unsigned int irq; unsigned int base; unsigned int height; unsigned int width; unsigned int rot_angle; unsigned int stride; /* frame raw format */ unsigned int format; /* flag indicating if frame is stored in tiled format */ unsigned int tiled; /* to make multiple of 32 bytes*/ int _pad[7]; }; struct VssProcPictureParameterBuffer { unsigned int num_input_pictures; unsigned int num_output_pictures; /* to make multiple of 32 bytes*/ int _pad[6]; struct VssProcPicture input_picture[VSS_PROC_MAX_INPUT_PICTURES]; struct VssProcPicture output_picture[VSS_PROC_MAX_OUTPUT_PICTURES]; }; union VssProcBuffer { struct VssProcPipelineParameterBuffer pipeline; struct VssProcSharpenParameterBuffer sharpen_base; struct VssProcDenoiseParameterBuffer denoiser_base; struct VssProcColorEnhancementParameterBuffer enhancer_base; struct VssProcFrcParameterBuffer frc; struct VssProcPictureParameterBuffer picture; }; enum VssProcCommandType { VssProcPipelineParameterCommand = 0xFFFE, VssProcSharpenParameterCommand = 0xFFFD, VssProcDenoiseParameterCommand = 0xFFFC, VssProcColorEnhancementParameterCommand = 0xFFFB, VssProcFrcParameterCommand = 0xFFFA, VssProcPictureCommand = 0xFFF9, VspFencePictureParamCommand = 0xEBEC, VspSetContextCommand = 0xEBED, Vss_Sys_STATE_BUF_COMMAND = 0xEBEE, VspFenceComposeCommand = 0xEBEF }; #define VSP_CMD_QUEUE_SIZE (64) #define VSP_ACK_QUEUE_SIZE (64) /* * Command types and data structure. * Each command has a type. Depending on the type there is some kind * of data in external memory, * The VSS will use its DMA to load data from the buffer into local memory. */ struct vss_command_t { unsigned int context; unsigned int type; unsigned int buffer; unsigned int size; unsigned int buffer_id; unsigned int irq; unsigned int reserved6; unsigned int reserved7; }; struct vss_response_t { unsigned int context; unsigned int type; unsigned int buffer; unsigned int size; unsigned int vss_cc; unsigned int reserved5; unsigned int reserved6; unsigned int reserved7; }; /* Default initial values for vsp-command and vsp-response * Using those avoids the risk of uninitialized warnings when * the definition changes. */ #define VSP_COMMAND_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0} #define VSP_RESPONSE_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0} /* * Response types */ enum VssResponseType { VssIdleResponse = 0x80010000, VssErrorResponse = 0x80020000, VssEndOfSequenceResponse = 0x80030000, VssCommandBufferReadyResponse = 0x80040000, VssInputSurfaceReadyResponse = 0x80050000, VssOutputSurfaceReadyResponse = 0x80060000, VssVp8encSetSequenceParametersResponse = 150, VssVp8encEncodeFrameResponse }; enum VssStatus { VssOK = 0x8001, VssInvalidCommandType = 0x8002, VssInvalidCommandArgument = 0x8003, VssInvalidProcPictureCommand = 0x8004, VssInvalidDdrAddress = 0x8005, VssInvalidSequenceParameters_VP8 = 0x1, VssInvalidPictureParameters_VP8 = 0x2, VssContextMustBeDestroyed_VP8 = 0x3, VssInitFailure_VP8 = 0x5, VssCorruptFrame = 0x6, VssCorruptFramecontinue_VP8 = 0x7 }; enum FrcResponseType { VssOutputSurfaceFreeResponse = 0x0000F001, VssOutputSurfaceCrcResponse = 0x0000F002 }; enum vsp_format { VSP_NV12, VSP_YV12, VSP_UYVY, VSP_YUY2, VSP_NV11, VSP_NV16, VSP_IYUV, VSP_TYPE_ERROR }; struct vsp_data { unsigned int fw_state; unsigned int uninit_req; }; #define VSP_SECURE_BOOT_MAGIC_NR 0xb0070001 enum vsp_processor { vsp_sp0 = 0, vsp_sp1 = 1, vsp_vp0 = 2, vsp_vp1 = 3, vsp_mea = 4 }; /** * Header-data/struct by PUnit to start VSP boot-processor * This struct is mapped directly into the header of the multi-application-blob * * For each value that is to be written to the VSP, the register-address to * write to is listed directly after the value to be written. * * Entries that contain values can be written directly into the VSP-system. * Offsets need to have the secure-boot-header-address added and then be written * into the VSP * * boot_start_value should always be the last value written. (Since it starts * the VSP) */ struct vsp_secure_boot_header { /* Magic number to identify header version */ unsigned int magic_number; /* Offset to text section of boot-program in blob */ unsigned int boot_text_offset; /* iCache base-address of boot-processor */ unsigned int boot_text_reg; /* Value of icache-control-bits to write to boot-processor */ unsigned int boot_icache_value; /* status&control register of boot-processor */ unsigned int boot_icache_reg; /* Value of program counter to write to boot-processor */ /* address of main-function in boot-program */ unsigned int boot_pc_value; /* pc-start-register of boot-processor */ unsigned int boot_pc_reg; /* Offset of multi-application-header in blob */ unsigned int ma_header_offset; unsigned int ma_header_reg; /* Value to write to start the boot-processor */ unsigned int boot_start_value; /* status&control register of boot-processor */ unsigned int boot_start_reg; }; #define VSP_MULTI_APP_MAGIC_NR 0xb10b0005 /* * Note: application index/id 0 is reserved. * So the maximum number of applications is one less than listed here. * */ #define VSP_MULTI_APP_MAX_APPS 16 /* * With a 1MB state-buffer in IMR and a 50k context-buffer-size, we could run * * max 20 apps. Using 32 as a nice round number of maximum nr of contexts. * * Actual maximum allowed contexts is currently less, since context-buffer-size * * is larger than 50k. * */ #define VSP_MULTI_APP_MAX_CONTEXTS 32 #define VSP_API_GENERIC_CONTEXT_ID (0xffffffff) /* * Struct used by VSP-boot-processor to start the correct application * Read from header in firmware ma-blob. * Address of the header is communicated by p-unit. * * Note: this is a VIED internal header */ struct vsp_multi_app_blob_data { unsigned int magic_number; unsigned int offset_from_start; /** State buffer address in virtual memory, default location on TNG B0 and ANN * * is 0xA0000000 (2.5GB memory offset, master port 2, 2nd IMR region) */ unsigned int imr_state_buffer_addr; /** Size of state-buffer in IMR (in bytes). Default state buffer size for TNG * * B0 and ANN is 1 MB */ unsigned int imr_state_buffer_size; /** default context-buffer size of apps in this blob (each app also has it's * context-size in it's header. */ unsigned int apps_default_context_buffer_size; /** * Address of genboot-helper-program in blob (relative to start of this header) */ unsigned int genboot_helper_prog_offset; /* * * This table contains a zero (offset of zero) for unused entries * * Offsets here are relative to the start-address of this header. */ unsigned int application_blob_offsets[VSP_MULTI_APP_MAX_APPS]; }; /* * Struct for the settings of a single context. Normally placed in an array in * the multi-app header in IMR * * Context-id is determined by the position in the array, so it is not stored in * the struct itself. * * State_buffer_size and state_buffer_addr are currently not stored, since they * can/will be determined automatically based on generic IMR parameters. * * Usage field is the last field, so that it gets written last during a memory * transfer. */ struct vsp_multi_app_context_settings { unsigned int app_id; /* Which app this context belongs to */ unsigned int usage; /* Indicates if this context is in use */ }; /* * Datastructure placed at the beginning of the VSP IMR state-save region. * */ struct vsp_multi_app_imr_header { /* * Usage field (32-bit), set to 0 by Chaabi during system bootup, set to 1 * by VSP if it is safe for PUnit to perform a restart without power-cycle. * Set to any other value by VSP if VSP is running. * */ unsigned int vsp_and_imr_state; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_1; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_2; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_3; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_4; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_5; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_6; /* Reserved field for 256-bit alignment of header */ unsigned int reserved_7; /* Settings of all active/available contexts */ struct vsp_multi_app_context_settings context_settings[VSP_MULTI_APP_MAX_CONTEXTS]; }; enum vsp_imr_state{ /** State when no data for VSP is initialized */ vsp_imr_uninitialized = 0, /** State where datastructures are initialized, but no VSP is running */ vsp_imr_safe_to_resume = 1, /** State where datastructures are initialized and VSP(-API) is running */ vsp_imr_initialized = 2, /** State where datastructures are initialized and VSP(-APP) is running */ vsp_imr_app_is_running = 3 }; enum vsp_ctrl_reg_addr { VSP_SETTING_ADDR_REG = 3, VSP_SECBOOT_DEBUG_REG = 4, VSP_ENTRY_KIND_REG = 5, VSP_POWER_SAVING_MODE_REG = 6, VSP_MMU_TLB_SOFT_INVALIDATE_REG = 7, VSP_CMD_QUEUE_RD_REG = 12, VSP_CMD_QUEUE_WR_REG = 13, VSP_ACK_QUEUE_RD_REG = 14, VSP_ACK_QUEUE_WR_REG = 15 }; struct vsp_ctrl_reg { unsigned int reserved_2; /* setting address from host to firmware */ unsigned int setting_addr; /* used for sending debug-status from firmware to host */ unsigned int secboot_debug; /* entry type from host to firmware * If it contains vsp_exit, uninitialize the firmware */ unsigned int entry_kind; /* set the power-saving-mode setting */ unsigned int power_saving_mode; /* config reg to request firmware to perform an MMU TLB invalidate. * MMU TLB invalidation for VSP on TNG needs to be done through firmware * due to a hardware bug that could trigger if TLB invalidation is done * while VSP DMA is not idle. */ unsigned int mmu_tlb_soft_invalidate; unsigned int reserved_8; unsigned int reserved_9; unsigned int reserved_10; unsigned int reserved_11; /* used for the command and response queues */ unsigned int cmd_rd; unsigned int cmd_wr; unsigned int ack_rd; unsigned int ack_wr; }; /* constant parameters passed from host to firmware, * address of this struct is passed via config reg * struct is written to ddr in vsp_init call, destroyed upon uninit */ struct vsp_settings_t { /* Extra field to align to 256 bit (for DMA) */ unsigned int reserved0; unsigned int command_queue_size; unsigned int command_queue_addr; unsigned int response_queue_size; unsigned int response_queue_addr; /* Extra field to align to 256 bit (for DMA) */ unsigned int reserved5; /* Extra field to align to 256 bit (for DMA) */ unsigned int reserved6; unsigned int reserved7; }; /** * The host should only modify the vsp_context_settings_entry when the usage * field is vsp_context_unused or vsp_context_uninit. The host can do the * following state-transitions for the usage field: * 1) vsp_context_unused->vsp_context_starting: start a new stream/context. * After this transition, the host can submit commands into the command-queue * for the context-id associated with this vsp_context_settings entry. * 2) vsp_context_deinit->vsp_context_unused: destroy resources (free state * buffer) from the no longer needed context and mark the context as being * unused. * * The VSP will only modify the vsp_context_settings_entry when the usage * field is vsp_context_starting or vsp_context_in_use. The VSP will do the * following state-transitions for the usage field: * 3) vsp_context_starting->vsp_context_in_use: Perform initialisation of * state-buffers and other VSP-side initialisation required to start a new * stream/context. This is typically done when the first command for this * context is received from the host. * 4) vsp_context_in_use->vsp_context_deinit: Mark a context as being no longer * used by the VSP. The VSP will no longer access any resource used by this * context after this transition. This transition is done after an * end-of-stream response or similar response to the host to indicate that an * application finished for a specific context. */ enum vsp_context_usage { vsp_context_unused = 0, vsp_context_deinit = 1, vsp_context_starting = 16, vsp_context_in_use = 17 }; /* default initializer to initialize vsp_settings struct * (including the extra alignment fields) */ #define VSP_SETTINGS_INITIALIZER {0, 0, 0, 0, 0, 0, 0, 0} /* values passed via VSP_ENTRY_TYPE_REG * vsp_entry_booted is the default value, it means no init or resume has been * communicated by the host yet. * vsp_entry_init and vsp_entry_resume are used for initial starting of the * system and for resuming after a suspend/power-down. */ enum vsp_entry_kind { vsp_entry_booted = 0, vsp_entry_init = 1, vsp_entry_resume = 2, vsp_exit = 3 }; /* values passed via VSP_POWER_SAVING_MODE_REG */ enum vsp_power_saving_mode { vsp_always_on = 0, vsp_suspend_on_empty_queue = 1, vsp_hw_idle_on_empty_queue = 2, vsp_suspend_and_hw_idle_on_empty_queue }; /**************************** * VP8enc data structures ****************************/ /** * Picture data structure. Currently the same as frc */ struct VssProcPictureVP8 { uint32_t surface_id; uint32_t irq; /* send interupt when input or output surface is ready */ uint32_t base; /* pointer to luma picture in DDR */ uint32_t base_uv; /* pointer to chroma picture in DDR */ uint32_t height; uint32_t width; uint32_t stride; uint32_t format; /* frame raw format */ }; /** * Enumeration for recon_buffer_mode */ typedef enum { vss_vp8enc_seq_param_recon_buffer_mode_per_seq = 0, /* send 4 ref/recon frame buffers at seq lvl */ vss_vp8enc_seq_param_recon_buffer_mode_per_pic, /* send 1 recon frame buffer per picture */ vss_vp8enc_seq_param_recon_buffer_mode_cnt /* nr of modes */ } vss_vp8enc_seq_param_recon_buffer_mode_t; /** * Sequence parameter data structure. */ struct VssVp8encSequenceParameterBuffer { uint32_t frame_width; uint32_t frame_height; uint32_t frame_rate; uint32_t error_resilient; uint32_t num_token_partitions; uint32_t kf_mode; uint32_t kf_min_dist; uint32_t kf_max_dist; uint32_t rc_target_bitrate; uint32_t rc_min_quantizer; uint32_t rc_max_quantizer; uint32_t rc_undershoot_pct; uint32_t rc_overshoot_pct; uint32_t rc_end_usage; uint32_t rc_buf_sz; uint32_t rc_buf_initial_sz; uint32_t rc_buf_optimal_sz; uint32_t max_intra_rate; uint32_t cyclic_intra_refresh; uint32_t concatenate_partitions; uint32_t recon_buffer_mode; uint32_t generate_skip_frames; uint32_t max_num_dropped_frames; uint32_t ts_number_layers; uint32_t ts_target_bitrate[3]; uint32_t ts_rate_decimator[3]; uint32_t ts_periodicity; uint8_t ts_layer_id[32]; struct VssProcPictureVP8 ref_frame_buffers[4]; }; struct VssVp8encEncodedFrame { uint32_t frame_size; uint32_t status; uint32_t partitions; uint32_t partition_size[9]; uint32_t partition_start[9]; uint32_t segments; uint32_t quantizer[4]; uint32_t frame_flags; uint32_t partition_id; uint32_t buffer_level[3]; uint32_t quality; uint32_t overflow_bytes; uint32_t surfaceId_of_ref_frame[4]; uint32_t reserved[15]; uint32_t coded_data[1]; }; /** * Encode frame command buffer */ struct VssVp8encPictureParameterBuffer { struct VssProcPictureVP8 input_frame; struct VssProcPictureVP8 recon_frame; uint32_t version; uint32_t pic_flags; uint32_t prev_frame_dropped; uint32_t cpuused; uint32_t sharpness; uint32_t num_token_partitions; uint32_t encoded_frame_size; uint32_t encoded_frame_base; }; /** * Command enumeration */ enum VssVp8encCommandType { VssVp8encSetSequenceParametersCommand = 123, VssVp8encEncodeFrameCommand, VssVp8encEndOfSequenceCommand, VssVp8encInit, Vss_Sys_Ref_Frame_COMMAND }; /* * Generic VSP commands * * Generic VSP commands should be sent with the context field set to * VSP_API_GENERIC_CONTEXT_ID. */ enum VssGenCommandType { /** Generic command to instruct the VSP to (create and) initialize a context. * * The buffer field contains the context-id of the new context to initialize. * The size-field contains the app-id for the new context to initialize */ VssGenInitializeContext = 0xab01, /** Generic command to instruct the VSP to de-initialize and destroy a * context. The buffer field contains the context-id of the context to * de-initialize and destroy. The size-field should always be set to 0. */ VssGenDestroyContext = 0xab02 }; /**************************** * WiDi Compose data structures ****************************/ enum VssWiDi_ComposeCommandType { VssWiDi_ComposeSetSequenceParametersCommand = 200, VssWiDi_ComposeFrameCommand, VssWiDi_ComposeEndOfSequenceCommand }; enum VssWiDi_ComposeResponseType { VssWiDi_ComposeSetSequenceParametersResponse = 250, VssWiDi_ComposeFrameResponse, }; enum VssWiDi_ColorFormat { MonoChrome = 0, YUV_4_2_0, YUV_4_2_0_NV12, YUV_4_2_2, YUV_4_4_4 }; /** * WiDi Compose sequence parameter data structure. */ struct VssWiDi_ComposeSequenceParameterBuffer { unsigned int R_Buffer; unsigned int G_Buffer; unsigned int B_Buffer; unsigned int RGBA_Buffer; unsigned int Y_Buffer; unsigned int UV_Buffer; unsigned int U_Buffer; unsigned int V_Buffer; unsigned int A_Buffer; int ActualWidth; int ActualHeight; int ProcessedWidth; int ProcessedHeight; int TotalMBCount; int Stride; /*Video related*/ int Video_IN_xsize; int Video_IN_ysize; int Video_IN_stride; int Video_IN_yuv_format; unsigned int Video_IN_Y_Buffer; unsigned int Video_IN_UV_Buffer; unsigned int Video_IN_U_Buffer; unsigned int Video_IN_V_Buffer; int Video_OUT_xsize; int Video_OUT_ysize; int Video_OUT_stride; int Video_OUT_yuv_format; unsigned int Video_OUT_Y_Buffer; unsigned int Video_OUT_UV_Buffer; unsigned int Video_OUT_V_Buffer; unsigned int scaled_width; unsigned int scaled_height; unsigned int scalefactor_dx; unsigned int scalefactor_dy; /*Blending related params*/ int Is_Blending_Enabled; int ROI_width; int ROI_height; int ROI_x1; int ROI_y1; int ROI_x2; int ROI_y2; int alpha1; int alpha2; int Is_video_the_back_ground; int Is_source_1_image_available; int Is_source_2_image_available; int Is_alpha_channel_available; int Video_TotalMBCount; int CSC_FormatSelect; /* 0: YUV420NV12; 1: YUV444; */ int CSC_InputFormatSelect; // 0: RGB Planar; 1: RGBA Interleaved }; #pragma pack() #endif