blob: 89b888929deb56214d0a0bfc5f7c41caa0768a92 [file] [log] [blame]
/**
* 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