| /******************************************************************************* |
| * Copyright (C) Marvell International Ltd. and its affiliates |
| * |
| * Marvell GPL License Option |
| * |
| * If you received this File from Marvell, you may opt to use, redistribute and/or |
| * modify this File in accordance with the terms and conditions of the General |
| * Public License Version 2, June 1991 (the "GPL License"), a copy of which is |
| * available along with the File in the license.txt file or by writing to the Free |
| * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or |
| * on the worldwide web at http://www.gnu.org/licenses/gpl.txt. |
| * |
| * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED |
| * WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY |
| * DISCLAIMED. The GPL License provides additional details about this warranty |
| * disclaimer. |
| ********************************************************************************/ |
| |
| #ifndef _VPP_MODULE_H_ |
| #define _VPP_MODULE_H_ |
| |
| #include "api_avio_dhub.h" |
| #include "thinvpp_common.h" |
| #include "thinvpp_api.h" |
| #include "thinvpp_bcmbuf.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define THINVPP_MALLOC(s) UtilMemAlloc(s) |
| #define THINVPP_MEMSET UtilMemSet |
| #define THINVPP_MEMCPY UtilMemCpy |
| #define THINVPP_FREE(x) |
| |
| |
| /* helper MACROs */ |
| #define CPCB_OF_CHAN(vpp_obj, chanID) (vpp_obj->chan[chanID].dvID) |
| #define CPCB_OF_VOUT(vpp_obj, voutID) (vpp_obj->vout[voutID].dvID) |
| |
| #if BOOTLOADER_SHOWLOGO |
| #define START_1DDMA(dhubID, dmaID, start_addr, size, cfgQ, ptr) \ |
| dhub_channel_big_write_cmd(&(((HDL_dhub2d *)dhubID)->dhub), dmaID, (int)start_addr, size, 0, 0, 0, 1, cfgQ, ptr) |
| |
| #define START_2DDMA(dhubID, dmaID, start_addr, stride, width, height, cfgQ) \ |
| dhub2d_channel_cfg((HDL_dhub2d *)dhubID, dmaID, start_addr, stride, width, height, 1, 0, 0, 0, 0, 1, cfgQ) |
| #endif |
| |
| #define VPP_REG_WRITE32(reg, val) THINVPP_BCMBUF_Write(vpp_obj->pVbiBcmBuf, vpp_obj->base_addr+(reg), (val)) |
| #define VPP_REG_WRITE8(reg, val) THINVPP_BCMBUF_Write(vpp_obj->pVbiBcmBuf, vpp_obj->base_addr+((reg)<<2), (val)) |
| |
| #define GLB_REG_WRITE32(reg, val) *(volatile int *)(reg) = (val) |
| #define GLB_REG_READ32(reg) (*(volatile int *)(reg)) |
| #define VPP_REG_READ32_RAW(reg) (*(volatile int *)(vpp_obj->base_addr+(reg))) |
| #define VPP_REG_READ8_RAW(reg) (*(volatile int *)(vpp_obj->base_addr+((reg)<<2))) |
| #define VPP_REG_WRITE32_RAW(reg, val) *(volatile int *)(vpp_obj->base_addr+(reg)) = (val) |
| #define VPP_REG_WRITE8_RAW(reg, val) *(volatile int *)(vpp_obj->base_addr+((reg)<<2)) = (val) |
| |
| /*************************************************************** |
| * DESCR: get the one byte of a unsigned int |
| * PARAMS: uint32 - an unsigned int |
| ****************************************************************/ |
| #define GET_LOWEST_BYTE(uint32) ((uint32) & 0xFF) |
| #define GET_SECOND_BYTE(uint32) (((uint32) & 0xFF00) >> 8) |
| #define GET_THIRD_BYTE(uint32) (((uint32) & 0xFF0000) >> 16) |
| |
| /*************************************************************** |
| * DESCR: load register default value by name |
| * PARAMS: RegName - register name in maddr.h |
| * DefValues - register default value |
| ****************************************************************/ |
| #define WRITE_REG_DEFAULT_VAL(RegName, DefValues)\ |
| do{\ |
| THINVPP_BCMBUF_Write(vpp_obj->pVbiBcmBuf, vpp_obj->base_addr + (RegName << 2), DefValues.VPP_##RegName);\ |
| }while(0) |
| |
| #define WRITE_REG_DEFAULT_VAL_32BITS(RegName, DefValues)\ |
| do{\ |
| THINVPP_BCMBUF_Write(vpp_obj->pVbiBcmBuf, vpp_obj->base_addr + RegName, DefValues.VPP_##RegName);\ |
| }while(0) |
| |
| /*Enum for maintaining CPCB 0,1 and 2 at Backend*/ |
| typedef enum VPP_CPCB_UNIT_NUM/////////////////////////////////temp put here |
| { |
| VPP_CPCB0 = 0, |
| VPP_CPCB1, |
| VPP_CPCB2, |
| VPP_CPCB_MAX |
| }VPP_CPCB_UNIT_NUM, *PVPP_CPCB_UNIT_NUM; |
| |
| /* default window attributes */ |
| #define DEFAULT_BGCOLOR 0 // green |
| #define DEFAULT_ALPHA 0xff // opaque |
| |
| /* definition of video resolution type */ |
| enum { |
| TYPE_SD = 0, |
| TYPE_HD = 1, |
| }; |
| |
| /* definition of video scan mode */ |
| enum { |
| SCAN_PROGRESSIVE = 0, |
| SCAN_INTERLACED = 1, |
| }; |
| |
| /* definition of video frame-rate */ |
| enum { |
| FRAME_RATE_23P98 = 0, |
| FRAME_RATE_24 = 1, |
| FRAME_RATE_25 = 2, |
| FRAME_RATE_29P97 = 3, |
| FRAME_RATE_30 = 4, |
| FRAME_RATE_47P96 = 5, |
| FRAME_RATE_48 = 6, |
| FRAME_RATE_50 = 7, |
| FRAME_RATE_59P94 = 8, |
| FRAME_RATE_60 = 9, |
| FRAME_RATE_100 = 10, |
| FRAME_RATE_119P88 = 11, |
| FRAME_RATE_120 = 12, |
| }; |
| |
| /* definition of EE working mode */ |
| enum { |
| EE_MODE_OFF = 0, /* disable EE */ |
| EE_MODE_ON = 1, /* enable EE*/ |
| }; |
| |
| /* definition of VPP in-line and off-line modes */ |
| enum { |
| MODE_INLINE = 0, |
| MODE_OFFLINE = 1, |
| }; |
| |
| /* definition of HV scaling coeff selection */ |
| enum { |
| MODE_COEFF_SEL_AUTO = 0, |
| MODE_COEFF_SEL_FORCE_H = 1, |
| MODE_COEFF_SEL_FORCE_V = 2, |
| MODE_COEFF_SEL_FORCE_HV = 3, |
| }; |
| |
| /* definition of stages of a pipeline */ |
| enum { |
| STAGE_FE = 0, |
| STAGE_SCL = 1, |
| STAGE_CPCB = 2, |
| STAGE_BE = 3, |
| MAX_NUM_STAGES = 4 |
| }; |
| |
| enum { |
| SENSIO_DISABLE = 0, |
| SENSIO_SCALE_ONLY = 1, |
| SENSIO_FILTER_ONLY = 2, |
| SENSIO_FULL = 3, |
| }; |
| |
| typedef struct EVENT_CALLBACK_T{ |
| volatile int status; // registered or not |
| FUNCPTR cb_func; // callback function |
| int params[MAX_NUM_PARAMS]; // function parameters |
| } EVENT_CALLBACK; |
| |
| typedef struct OFFLINE_BUFF_DESCR_T{ |
| void *addr; // offline buffer address |
| int size; // data size in byte |
| VPP_WIN disp_win; // display window in end display for content in this offline buffer |
| VPP_WIN content_win; // content window in end display for content in this offline buffer |
| }OFFLINE_BUFF_DESCR; |
| |
| typedef struct PLANE_T { |
| volatile int status; // active or not |
| int mode; // off-line or in-line mode, only valid for main & PIP video |
| int srcfmt; // video component data format in input frame buffer |
| int order; // video component data order in input frame buffer |
| |
| int wpl; // beat per line of current frame |
| |
| int dmaRID; // plane inline read DMA channel ID |
| int dmaRdhubID; // ID of Dhub on which inline read DMA channel is connected |
| |
| /* offline write-back/read-back DMAs are only available for Berlin Main/PIP/AUX plane */ |
| int offline_dmaWID; // plane offline write-back DMA channel ID |
| int offline_dmaWdhubID; // ID of Dhub on which offline write-back DMA channel is connected |
| int offline_dmaRID; // plane offline read-back DMA channel ID |
| int offline_dmaRdhubID; // ID of Dhub on which offline read-back DMA channel is connected |
| |
| VPP_WIN actv_win; // plane display content location and size in reference window |
| // this information is a copy from frame descriptor for register updating purpose. |
| VPP_WIN ref_win; // plane display reference window |
| #if BOOTLOADER_SHOWLOGO |
| VBUF_INFO * pinfo; |
| #endif |
| } PLANE; |
| |
| |
| typedef struct CHAN_T { |
| volatile int status; // active or not |
| int dvID; // ID of the DV, which this channel belongs to |
| int dvlayerID; // ID of DV layer, which this channel connects to |
| int zorder; // Z-order of DV plane, which this channel connects to |
| int scl_in_out_mode; |
| |
| VPP_WIN disp_win; // channel display window in end display |
| VPP_WIN_ATTR disp_win_attr; // channel display window attribute: bgcolor and alpha |
| } CHAN; |
| |
| typedef struct DV_T { |
| volatile int status; // active or not |
| int num_of_chans; // number of the channels, which belong to this channel |
| int chanID[MAX_NUM_CHANS]; // ID of the channels, which belong to this DV |
| int num_of_vouts; // number of the VOUTs, which belong to this channel |
| int voutID[MAX_NUM_VOUTS]; // ID of the VOUTs, which belong to this DV |
| int output_res; // ID of CPCB(for Berlin) or DV(for Galois) output resolution, i.e. end display resolution |
| |
| #if BOOTLOADER_SHOWLOGO |
| DHUB_CFGQ vbi_dma_cfgQ[2]; |
| DHUB_CFGQ *curr_cpcb_vbi_dma_cfgQ; |
| DHUB_CFGQ vbi_bcm_cfgQ[2]; |
| DHUB_CFGQ *curr_cpcb_vbi_bcm_cfgQ; |
| #endif |
| |
| volatile int vbi_num; // VBI interrupt counter |
| } DV; |
| |
| typedef struct VOUT_T { |
| volatile int status; // active or not |
| int dvID; // ID of the DV, which this VOUT belongs to |
| } VOUT; |
| |
| /************************************************/ |
| /************** FE data structures **************/ |
| /************************************************/ |
| |
| /* structure of FE block */ |
| typedef struct FE_T { |
| /* NR register local copy */ |
| unsigned int NrCtrl; |
| unsigned int NrMode; |
| unsigned int NrYMode; |
| unsigned int NrCMode; |
| |
| unsigned int CarCtrl1Regs; |
| unsigned int CarCtrl2Regs; |
| unsigned int NeFbCtrl; |
| } FE; |
| |
| /************************************************/ |
| /************** SCL data structures **************/ |
| /************************************************/ |
| |
| /* structure of SCL block */ |
| typedef struct SCL_T { |
| /*FRC scaler local buffer*/ |
| #if (BERLIN_CHIP_VERSION >= BERLIN_C_2) |
| unsigned int VppFrcSclAlphaCtrl0; |
| unsigned int VppFrcSclAlphaCtrl1; |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2) |
| unsigned int VppFrcSclAlphaCtrl2; |
| #endif |
| #endif |
| #if (BERLIN_CHIP_VERSION >= BERLIN_B_0) |
| unsigned int VppFrcSclBeSwitch0; |
| unsigned int VppFrcSclBeSwitch1; |
| #else |
| unsigned int VppFrcSclBeSwitch; |
| #endif |
| } SCL; |
| |
| /************************************************/ |
| /************** CPCB data structures **************/ |
| /************************************************/ |
| |
| /* structure of CPCB block */ |
| typedef struct CPCB_T { |
| /*CPCB interlacer local buffer*/ |
| unsigned int VppCpcb0IntCtrl; |
| #if (BERLIN_CHIP_VERSION >= BERLIN_B_0) |
| unsigned int Cpcb1SrcAlphaPol; |
| unsigned int Cpcb1BgAlphaPol; |
| unsigned int Cpcb2SrcAlphaPol; |
| unsigned int Cpcb2BgAlphaPol; |
| unsigned int VppCpcb2IntCtrl; |
| #else |
| unsigned int VppCpcb1IntCtrl; |
| #endif |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2) |
| unsigned int QtcCtrl1; |
| #endif |
| unsigned int *GmBcmBuf[2]; |
| unsigned int GmBcmBufWIdx; |
| unsigned int GmBcmBufRIdx; |
| } CPCB; |
| |
| /************************************************/ |
| /************** BE data structures **************/ |
| /************************************************/ |
| |
| typedef struct ENC_T { |
| // DACs control |
| unsigned int SdDacMode; |
| unsigned int HdDacMode; |
| |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_B0) |
| /* BE Encoder DACs Ctrl0 */ |
| unsigned int DacCtrl0_a; |
| unsigned int DacCtrl0_b; |
| unsigned int DacCtrl0_c; |
| unsigned int DacCtrl0_d; |
| #endif |
| |
| // SD/HD WSS/CGMS control |
| unsigned int SdWssCgmsCtrl; |
| unsigned int HdWssCgmsCtrl; |
| |
| // mute control |
| unsigned int EncIOMuteCtrl; |
| |
| // HD Output control0 |
| unsigned int HdCtrl0; |
| } ENC; |
| |
| typedef struct HDMI_TX_DRV_T |
| { |
| unsigned char acrCtrl; |
| unsigned char audCtrl; |
| unsigned char i2sCtrl; |
| unsigned char gcpCfg0; |
| unsigned char gcpCfg1; |
| unsigned char videoCtrl; |
| unsigned char hdmiCtrl; |
| unsigned char avMuteCtrl; |
| unsigned char hostPktCtrl0; |
| unsigned char hostPktCtrl1; |
| unsigned char hostPktData[6][32]; |
| unsigned int hostPktCfg[6]; |
| } HDMI_TX_DRV; |
| typedef struct HDMI_HDCP_DRV_T |
| { |
| unsigned char ctrlReg; |
| unsigned char stsReg; |
| unsigned int srmData; |
| } HDMI_HDCP_DRV; |
| |
| /* structure of BE block */ |
| typedef struct BE_T { |
| ENC enc; |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_Z2) |
| unsigned char* VppBeVopLVDSMappingTab; |
| unsigned int VppBeVopLVDSFrmtCtrl; |
| #endif |
| #if (BERLIN_CHIP_VERSION >= BERLIN_BG2_A0) |
| unsigned short *VppBeVopLVDSGammaLUT[3]; |
| unsigned int VppBeVopLVDSDeGammaLUTSt; |
| unsigned int VppBeVopLVDSGammaLUTSt; |
| unsigned int VppBeVopLVDSDeGammaBypass; |
| unsigned int VppBeVopLVDSDeGammaCtrl; |
| unsigned int VppBeVopLVDSGammaCtrl; |
| unsigned int *LvdsGmBcmBuf[2]; |
| unsigned int LvdsGmBcmBufWIdx; |
| unsigned int LvdsGmBcmBufRIdx; |
| #endif |
| // Addr of Hdmi Tx data store |
| unsigned int hdmiTx; |
| |
| // CEC enable control |
| int enableCec; |
| // CEC feature configuration |
| unsigned int cecFeatureSupportCfg; |
| // Addr of Hdmi Cec data store |
| unsigned int hdmiCec; |
| // HDMI Tx driver data |
| HDMI_TX_DRV hdmiTxDrv; |
| |
| // HDCP driver data |
| HDMI_HDCP_DRV hdmiHdcpDrv; |
| |
| // HDMI Interrupt Status for DSR handling |
| unsigned char hdmiIntSts; |
| unsigned char hdmiFrmIntrTrig; |
| |
| // Task control flag |
| unsigned char hdmiTaskExit; |
| unsigned char cecTaskExit; |
| |
| // CPCB0 Interrupt status for DSR handling |
| unsigned char cpcb0IntSts; |
| } BE; |
| |
| |
| /************************************************/ |
| /*********** VPP object data structures *********/ |
| /************************************************/ |
| typedef struct THINVPP_OBJ_T { |
| volatile int status; // active or not |
| |
| PLANE plane[MAX_NUM_PLANES]; // CURSOR, OSD, IG, PG, PIP, MAIN, BG |
| CHAN chan[MAX_NUM_CHANS]; // OSD, PG, PIP, MAIN and BG |
| DV dv[MAX_NUM_CPCBS]; // CPCB-0, CPCB-1, and CPCB-2 |
| VOUT vout[MAX_NUM_VOUTS]; // HDMI, Component, S-Video and CVBS |
| EVENT_CALLBACK event_cb[MAX_NUM_EVENTS]; // event callbacks |
| |
| unsigned int base_addr; // VPP object hardware base address |
| HDL_semaphore *pSemHandle; // semaphore handler of CPCB semaphores |
| |
| FE fe; // FE hardware related settings |
| SCL scl; // SCL hardware related settings |
| CPCB cpcb; // CPCB hardware related settings |
| BE be; // BE hardware related settings |
| |
| #if (BERLIN_CHIP_VERSION != BERLIN_BG2CD_A0) |
| int dhub_cmdQ[avioDhubChMap_vpp_TT_R]; |
| #else // (BERLIN_CHIP_VERSION != BERLIN_BG2CD_A0) |
| UINT32 dhub_cmdQ[avioDhubChMap_vpp_SPDIF_W]; |
| #endif // (BERLIN_CHIP_VERSION != BERLIN_BG2CD_A0) |
| |
| #if BOOTLOADER_SHOWLOGO |
| BCMBUF vbi_bcm_buf[2]; |
| BCMBUF *pVbiBcmBufCpcb[VPP_CPCB_MAX]; |
| #else |
| BCMBUF vbi_bcm_buf[1]; |
| #endif |
| BCMBUF *pVbiBcmBuf; //pointer to the VBI BCM buffer in use |
| unsigned options; |
| |
| } THINVPP_OBJ; |
| |
| |
| /************************************************/ |
| /*********** global VPP container ***************/ |
| /************************************************/ |
| #ifdef _THINVPP_API_C_ |
| THINVPP_OBJ *thinvpp_obj = NULL; |
| #else |
| extern THINVPP_OBJ *thinvpp_obj; |
| #endif |
| |
| /**************************************************************************/ |
| /****************** Common VPP object Function Calls **********************/ |
| /**************************************************************************/ |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |