xref: /utopia/UTPA2-700.0.x/modules/graphic/api/gop/mapiGOP.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
2*53ee8cc1Swenshuai.xi //  Include Files
3*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
4*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL
5*53ee8cc1Swenshuai.xi #include <stdio.h>
6*53ee8cc1Swenshuai.xi #include <string.h>
7*53ee8cc1Swenshuai.xi #include <sys/types.h>
8*53ee8cc1Swenshuai.xi #include <signal.h>
9*53ee8cc1Swenshuai.xi #include <errno.h>
10*53ee8cc1Swenshuai.xi #else
11*53ee8cc1Swenshuai.xi #include <linux/slab.h>
12*53ee8cc1Swenshuai.xi #endif
13*53ee8cc1Swenshuai.xi #include "utopia.h"
14*53ee8cc1Swenshuai.xi #include "utopia_dapi.h"
15*53ee8cc1Swenshuai.xi #include "util_symbol.h"
16*53ee8cc1Swenshuai.xi #include "MsTypes.h"
17*53ee8cc1Swenshuai.xi #include "MsOS.h"
18*53ee8cc1Swenshuai.xi #include "MsCommon.h"
19*53ee8cc1Swenshuai.xi #include "MsVersion.h"
20*53ee8cc1Swenshuai.xi #include "apiGOP.h"
21*53ee8cc1Swenshuai.xi #include "apiGOP_priv.h"
22*53ee8cc1Swenshuai.xi #include "drvGOP.h"
23*53ee8cc1Swenshuai.xi #include "drvGFLIP.h"
24*53ee8cc1Swenshuai.xi #include "drvGOP_priv.h"
25*53ee8cc1Swenshuai.xi #include "halGOP.h"
26*53ee8cc1Swenshuai.xi #include "halCHIP.h"
27*53ee8cc1Swenshuai.xi 
28*53ee8cc1Swenshuai.xi enum
29*53ee8cc1Swenshuai.xi {
30*53ee8cc1Swenshuai.xi     GOP_POOL_ID_GOP0=0
31*53ee8cc1Swenshuai.xi } eGOPPoolID;
32*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
33*53ee8cc1Swenshuai.xi //  Local Compiler Options
34*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
35*53ee8cc1Swenshuai.xi #define DUMP_INFO   0
36*53ee8cc1Swenshuai.xi 
37*53ee8cc1Swenshuai.xi #define FPGA_TEST   0UL
38*53ee8cc1Swenshuai.xi 
39*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
40*53ee8cc1Swenshuai.xi //  Local Defines
41*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
42*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
43*53ee8cc1Swenshuai.xi #define atoi(str) simple_strtoul(((str != NULL) ? str : ""), NULL, 0)
44*53ee8cc1Swenshuai.xi #endif
45*53ee8cc1Swenshuai.xi 
46*53ee8cc1Swenshuai.xi #define GetMaxActiveGwinFalse               4UL
47*53ee8cc1Swenshuai.xi #define GetMaxActiveGwinFalse_op            5UL
48*53ee8cc1Swenshuai.xi #define GetMaxActiveGwinFalse_opened        6UL
49*53ee8cc1Swenshuai.xi #define GWIN_SDRAM_NULL                     0x30UL
50*53ee8cc1Swenshuai.xi #define msWarning(c)                        do {} while (0)
51*53ee8cc1Swenshuai.xi #define XC_MAIN_WINDOW                      0UL
52*53ee8cc1Swenshuai.xi 
53*53ee8cc1Swenshuai.xi 
54*53ee8cc1Swenshuai.xi // Define return values of check align
55*53ee8cc1Swenshuai.xi #define CHECKALIGN_SUCCESS                  1UL
56*53ee8cc1Swenshuai.xi #define CHECKALIGN_FORMAT_FAIL              2UL
57*53ee8cc1Swenshuai.xi #define CHECKALIGN_PARA_FAIL                3UL
58*53ee8cc1Swenshuai.xi 
59*53ee8cc1Swenshuai.xi //#define GWIN_SDRAM_PG_UNIT 0x00000010  // 16-byte page-unit for gwin_sdram
60*53ee8cc1Swenshuai.xi #define GWIN_SDRAM_PG_ALIGN(_x)    ALIGN_32(_x)
61*53ee8cc1Swenshuai.xi #define IS_GWIN_SDRAM_ALIGN(_x)  ((_x)== GWIN_SDRAM_PG_ALIGN(_x))
62*53ee8cc1Swenshuai.xi 
63*53ee8cc1Swenshuai.xi static MS_BOOL bInitFWR = FALSE;
64*53ee8cc1Swenshuai.xi static MS_BOOL bInitBkFWR[SHARED_GOP_MAX_COUNT]={[0 ... (SHARED_GOP_MAX_COUNT-1)] = FALSE};
65*53ee8cc1Swenshuai.xi 
66*53ee8cc1Swenshuai.xi static MS_BOOL bFirstInit = FALSE;
67*53ee8cc1Swenshuai.xi 
68*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
69*53ee8cc1Swenshuai.xi #define g_pGOPCtxLocal  psGOPInstPri->g_pGOPCtxLocal
70*53ee8cc1Swenshuai.xi #else
71*53ee8cc1Swenshuai.xi MS_GOP_CTX_LOCAL *g_pGOPCtxLocal = NULL;
72*53ee8cc1Swenshuai.xi #endif
73*53ee8cc1Swenshuai.xi static GOP_TYPE_DEF GOPTYPE;
74*53ee8cc1Swenshuai.xi 
75*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
76*53ee8cc1Swenshuai.xi static MS_U8 _devGFLIPCnt =0;
77*53ee8cc1Swenshuai.xi #endif
78*53ee8cc1Swenshuai.xi 
79*53ee8cc1Swenshuai.xi #include "ULog.h"
80*53ee8cc1Swenshuai.xi MS_U32 u32GOPDbgLevel_mapi;
81*53ee8cc1Swenshuai.xi 
82*53ee8cc1Swenshuai.xi // Debug Logs, level form low(INFO) to high(FATAL, always show)
83*53ee8cc1Swenshuai.xi // Function information, ex function entry
84*53ee8cc1Swenshuai.xi #define GOP_M_INFO(x, args...) if(u32GOPDbgLevel_mapi >= E_GOP_Debug_Level_HIGH) { ULOGI("GOP mAPI", x, ##args); }
85*53ee8cc1Swenshuai.xi // Warning, illegal paramter but can be self fixed in functions
86*53ee8cc1Swenshuai.xi #define GOP_M_WARN(x, args...) if(u32GOPDbgLevel_mapi >= E_GOP_Debug_Level_HIGH) { ULOGW("GOP mAPI", x, ##args); }
87*53ee8cc1Swenshuai.xi //  Need debug, illegal paramter.
88*53ee8cc1Swenshuai.xi #define GOP_M_DBUG(x, args...) if(u32GOPDbgLevel_mapi >= E_GOP_Debug_Level_MED) { ULOGD("GOP mAPI", x, ##args); }
89*53ee8cc1Swenshuai.xi // Error, function will be terminated but system not crash
90*53ee8cc1Swenshuai.xi #define GOP_M_ERR(x, args...) if(u32GOPDbgLevel_mapi >= E_GOP_Debug_Level_LOW) { ULOGE("GOP mAPI", x, ##args); }
91*53ee8cc1Swenshuai.xi // Critical, system crash. (ex. assert)
92*53ee8cc1Swenshuai.xi #define GOP_M_FATAL(x, args...) if(u32GOPDbgLevel_mapi >= E_GOP_Debug_Level_LOW) { ULOGF("GOP mAPI", x, ##args); }
93*53ee8cc1Swenshuai.xi 
94*53ee8cc1Swenshuai.xi #define APIGOP_RetFailPri(FailType) \
95*53ee8cc1Swenshuai.xi                do {\
96*53ee8cc1Swenshuai.xi                     switch ((E_GOP_API_Result)FailType)\
97*53ee8cc1Swenshuai.xi                     {\
98*53ee8cc1Swenshuai.xi                         case GOP_API_FAIL:\
99*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_FAIL");\
100*53ee8cc1Swenshuai.xi                             break;\
101*53ee8cc1Swenshuai.xi                         case GOP_API_NON_ALIGN_ADDRESS:\
102*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_NON_ALIGN_ADDRESS");\
103*53ee8cc1Swenshuai.xi                             break;\
104*53ee8cc1Swenshuai.xi                         case GOP_API_NON_ALIGN_PITCH:\
105*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_NON_ALIGN_PITCH");\
106*53ee8cc1Swenshuai.xi                             break;\
107*53ee8cc1Swenshuai.xi                         case GOP_API_DEPEND_NOAVAIL:\
108*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_DEPEND_NOAVAIL");\
109*53ee8cc1Swenshuai.xi                             break;\
110*53ee8cc1Swenshuai.xi                         case GOP_API_MUTEX_OBTAIN_FAIL:\
111*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_MUTEX_OBTAIN_FAIL");\
112*53ee8cc1Swenshuai.xi                             break;\
113*53ee8cc1Swenshuai.xi                         case GOP_API_MUTEX_OBTAINED:\
114*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_MUTEX_OBTAINED");\
115*53ee8cc1Swenshuai.xi                             break;\
116*53ee8cc1Swenshuai.xi                         case GOP_API_INVALID_BUFF_INFO:\
117*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_INVALID_BUFF_INFO");\
118*53ee8cc1Swenshuai.xi                             break;\
119*53ee8cc1Swenshuai.xi                         case GOP_API_INVALID_PARAMETERS:\
120*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_INVALID_PARAMETERS");\
121*53ee8cc1Swenshuai.xi                             break;\
122*53ee8cc1Swenshuai.xi                         case GOP_API_FUN_NOT_SUPPORTED:\
123*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_FUN_NOT_SUPPORTED");\
124*53ee8cc1Swenshuai.xi                             break;\
125*53ee8cc1Swenshuai.xi                         case GOP_API_ENUM_NOT_SUPPORTED:\
126*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_ENUM_NOT_SUPPORTED");\
127*53ee8cc1Swenshuai.xi                             break;\
128*53ee8cc1Swenshuai.xi                         case GOP_API_CRT_GWIN_FAIL:\
129*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_CRT_GWIN_FAIL");\
130*53ee8cc1Swenshuai.xi                             break;\
131*53ee8cc1Swenshuai.xi                         case GOP_API_CRT_GWIN_NOAVAIL:\
132*53ee8cc1Swenshuai.xi                             GOP_M_DBUG("\nGOP_CRT_GWIN_NOAVAIL");\
133*53ee8cc1Swenshuai.xi                             break;\
134*53ee8cc1Swenshuai.xi                         case GOP_API_SUCCESS:\
135*53ee8cc1Swenshuai.xi                             break;\
136*53ee8cc1Swenshuai.xi                         default:\
137*53ee8cc1Swenshuai.xi                             break;\
138*53ee8cc1Swenshuai.xi                     }\
139*53ee8cc1Swenshuai.xi                 }while(0)
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi 
142*53ee8cc1Swenshuai.xi #define APIGOP_CHECK_INIT() \
143*53ee8cc1Swenshuai.xi {                            \
144*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal ==NULL) \
145*53ee8cc1Swenshuai.xi     {                        \
146*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nshould call MApi_GOP_Init first\n")); \
147*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;\
148*53ee8cc1Swenshuai.xi     }                        \
149*53ee8cc1Swenshuai.xi }
150*53ee8cc1Swenshuai.xi 
151*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
152*53ee8cc1Swenshuai.xi //  Local Structures
153*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
154*53ee8cc1Swenshuai.xi /// GOP HVMirror GWIN position option define
155*53ee8cc1Swenshuai.xi typedef enum
156*53ee8cc1Swenshuai.xi {
157*53ee8cc1Swenshuai.xi     E_Set_HPos,
158*53ee8cc1Swenshuai.xi     E_Set_VPos,
159*53ee8cc1Swenshuai.xi     E_Set_X,
160*53ee8cc1Swenshuai.xi     E_Set_Y,
161*53ee8cc1Swenshuai.xi }HMirror_Opt;
162*53ee8cc1Swenshuai.xi 
163*53ee8cc1Swenshuai.xi static MS_U32 (*fpSetFBFmt)(MS_U16 ,MS_PHY , MS_U16 ) = NULL;
164*53ee8cc1Swenshuai.xi MS_BOOL (*_fpXCIsInterlace)(void) = NULL;
165*53ee8cc1Swenshuai.xi MS_U16 (*_fpXCGetCapHStart)(void) = NULL;
166*53ee8cc1Swenshuai.xi static void (*fpXCReduceBWForOSD)(MS_U8 , MS_BOOL) = NULL;
167*53ee8cc1Swenshuai.xi static void (*fpEventNotify)(MS_U32 , void* ) = NULL;
168*53ee8cc1Swenshuai.xi static MS_BOOL (*fpXCSetDwinInfo)(MS_U16 cmd,MS_U32 *arg,MS_U16 size) = NULL;
169*53ee8cc1Swenshuai.xi 
170*53ee8cc1Swenshuai.xi 
171*53ee8cc1Swenshuai.xi 
_GOP_IsFbIdValid(void * pInstance,MS_U32 u32FbId)172*53ee8cc1Swenshuai.xi static MS_BOOL _GOP_IsFbIdValid(void* pInstance,MS_U32 u32FbId)
173*53ee8cc1Swenshuai.xi {
174*53ee8cc1Swenshuai.xi     if (u32FbId > DRV_MAX_GWIN_FB_SUPPORT)
175*53ee8cc1Swenshuai.xi         return FALSE;
176*53ee8cc1Swenshuai.xi     else
177*53ee8cc1Swenshuai.xi         return TRUE;
178*53ee8cc1Swenshuai.xi }
179*53ee8cc1Swenshuai.xi 
180*53ee8cc1Swenshuai.xi 
_GetWinFB(void * pInstance,MS_U32 FbId)181*53ee8cc1Swenshuai.xi static GOP_WinFB_INFO* _GetWinFB(void* pInstance,MS_U32 FbId)
182*53ee8cc1Swenshuai.xi {
183*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
184*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
185*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
186*53ee8cc1Swenshuai.xi #endif
187*53ee8cc1Swenshuai.xi 
188*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,FbId))
189*53ee8cc1Swenshuai.xi     {
190*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)FbId);
191*53ee8cc1Swenshuai.xi         return NULL;
192*53ee8cc1Swenshuai.xi     }
193*53ee8cc1Swenshuai.xi #if WINFB_INSHARED
194*53ee8cc1Swenshuai.xi         //memcpy(pWinFB,&(g_pGOPCtxLocal->pGOPCtxShared->winFB[FbId]),sizeof(GOP_WinFB_INFO));
195*53ee8cc1Swenshuai.xi     return &(g_pGOPCtxLocal->pGOPCtxShared->winFB[FbId]);
196*53ee8cc1Swenshuai.xi #else
197*53ee8cc1Swenshuai.xi         //memcpy(pWinFB,g_pGOPCtxLocal->winFB[FbId],sizeof(GOP_WinFB_INFO));
198*53ee8cc1Swenshuai.xi     return &g_pGOPCtxLocal->winFB[FbId];
199*53ee8cc1Swenshuai.xi #endif
200*53ee8cc1Swenshuai.xi 
201*53ee8cc1Swenshuai.xi }
202*53ee8cc1Swenshuai.xi 
_GOP_MAP_FBID_AFBCCmd(void * pInstance,MS_U32 u32fbId,EN_DRV_GOP_AFBC_CNTL * AFBC_Cmd,MS_BOOL * AFBC_Enable)203*53ee8cc1Swenshuai.xi static void _GOP_MAP_FBID_AFBCCmd(void* pInstance,MS_U32 u32fbId,EN_DRV_GOP_AFBC_CNTL* AFBC_Cmd, MS_BOOL* AFBC_Enable)
204*53ee8cc1Swenshuai.xi {
205*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
206*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
207*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
208*53ee8cc1Swenshuai.xi #endif
209*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
210*53ee8cc1Swenshuai.xi 
211*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
212*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
213*53ee8cc1Swenshuai.xi     {
214*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
215*53ee8cc1Swenshuai.xi         return;
216*53ee8cc1Swenshuai.xi     }
217*53ee8cc1Swenshuai.xi 
218*53ee8cc1Swenshuai.xi     switch(pwinFB->FBString)
219*53ee8cc1Swenshuai.xi     {
220*53ee8cc1Swenshuai.xi         case E_DRV_GOP_FB_AFBC_SPLT_YUVTRNSFER_ARGB8888:
221*53ee8cc1Swenshuai.xi             *AFBC_Enable = TRUE;
222*53ee8cc1Swenshuai.xi             *AFBC_Cmd = E_DRV_GOP_AFBC_SPILT|E_DRV_GOP_AFBC_YUV_TRANSFER|E_DRV_GOP_AFBC_ARGB8888;
223*53ee8cc1Swenshuai.xi             break;
224*53ee8cc1Swenshuai.xi         case E_DRV_GOP_FB_AFBC_NONSPLT_YUVTRS_ARGB8888:
225*53ee8cc1Swenshuai.xi             *AFBC_Enable = TRUE;
226*53ee8cc1Swenshuai.xi             *AFBC_Cmd = E_DRV_GOP_AFBC_YUV_TRANSFER|E_DRV_GOP_AFBC_ARGB8888;
227*53ee8cc1Swenshuai.xi             break;
228*53ee8cc1Swenshuai.xi         case E_DRV_GOP_FB_AFBC_SPLT_NONYUVTRS_ARGB8888:
229*53ee8cc1Swenshuai.xi             *AFBC_Enable = TRUE;
230*53ee8cc1Swenshuai.xi             *AFBC_Cmd = E_DRV_GOP_AFBC_SPILT|E_DRV_GOP_AFBC_ARGB8888;
231*53ee8cc1Swenshuai.xi             break;
232*53ee8cc1Swenshuai.xi         case E_DRV_GOP_FB_AFBC_NONSPLT_NONYUVTRS_ARGB8888:
233*53ee8cc1Swenshuai.xi             *AFBC_Enable = TRUE;
234*53ee8cc1Swenshuai.xi             *AFBC_Cmd = E_DRV_GOP_AFBC_ARGB8888;
235*53ee8cc1Swenshuai.xi             break;
236*53ee8cc1Swenshuai.xi         default:
237*53ee8cc1Swenshuai.xi             *AFBC_Enable = FALSE;
238*53ee8cc1Swenshuai.xi             *AFBC_Cmd = E_DRV_GOP_FB_NULL;
239*53ee8cc1Swenshuai.xi             break;
240*53ee8cc1Swenshuai.xi     }
241*53ee8cc1Swenshuai.xi }
242*53ee8cc1Swenshuai.xi 
243*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
244*53ee8cc1Swenshuai.xi //  Debug Functions
245*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
246*53ee8cc1Swenshuai.xi 
_GOP_GetMaxGOPNum(void * pInstance)247*53ee8cc1Swenshuai.xi static MS_U8 _GOP_GetMaxGOPNum(void* pInstance)
248*53ee8cc1Swenshuai.xi {
249*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
250*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
251*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
252*53ee8cc1Swenshuai.xi #endif
253*53ee8cc1Swenshuai.xi 
254*53ee8cc1Swenshuai.xi     return MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal);
255*53ee8cc1Swenshuai.xi }
256*53ee8cc1Swenshuai.xi 
257*53ee8cc1Swenshuai.xi 
_GOP_IsGopNumValid(void * pInstance,MS_U32 gop)258*53ee8cc1Swenshuai.xi static MS_BOOL _GOP_IsGopNumValid(void* pInstance,MS_U32 gop)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi     if (gop>=_GOP_GetMaxGOPNum(pInstance))
261*53ee8cc1Swenshuai.xi         return FALSE;
262*53ee8cc1Swenshuai.xi     else
263*53ee8cc1Swenshuai.xi         return TRUE;
264*53ee8cc1Swenshuai.xi }
_GOP_IsGwinIdValid(void * pInstance,MS_U8 u8GwinID)265*53ee8cc1Swenshuai.xi static MS_BOOL _GOP_IsGwinIdValid(void* pInstance,MS_U8 u8GwinID)
266*53ee8cc1Swenshuai.xi {
267*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
268*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
269*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
270*53ee8cc1Swenshuai.xi #endif
271*53ee8cc1Swenshuai.xi 
272*53ee8cc1Swenshuai.xi     if(u8GwinID>=SHARED_GWIN_MAX_COUNT)
273*53ee8cc1Swenshuai.xi         return FALSE;
274*53ee8cc1Swenshuai.xi     else if (u8GwinID>=g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum)
275*53ee8cc1Swenshuai.xi         return FALSE;
276*53ee8cc1Swenshuai.xi     else
277*53ee8cc1Swenshuai.xi         return TRUE;
278*53ee8cc1Swenshuai.xi     }
279*53ee8cc1Swenshuai.xi 
280*53ee8cc1Swenshuai.xi 
_GOP_GetGop0WinInfo(void * pInstance,MS_U8 u8win,GOP_GwinInfo * pinfo)281*53ee8cc1Swenshuai.xi static void _GOP_GetGop0WinInfo(void* pInstance,MS_U8 u8win, GOP_GwinInfo* pinfo)
282*53ee8cc1Swenshuai.xi {
283*53ee8cc1Swenshuai.xi     DRV_GOP_GWIN_INFO sGetInfo;
284*53ee8cc1Swenshuai.xi     DRV_GOPDstType Gop0Dst =E_DRV_GOP_DST_INVALID;
285*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
286*53ee8cc1Swenshuai.xi 
287*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
288*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
289*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
290*53ee8cc1Swenshuai.xi #endif
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
293*53ee8cc1Swenshuai.xi     {
294*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
295*53ee8cc1Swenshuai.xi         return;
296*53ee8cc1Swenshuai.xi     }
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi 
299*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8win].u32CurFBId);
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
302*53ee8cc1Swenshuai.xi     {
303*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : gwinMap[%d].u32CurFBId=%td\n",__FUNCTION__,__LINE__,u8win,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8win].u32CurFBId);
304*53ee8cc1Swenshuai.xi         return;
305*53ee8cc1Swenshuai.xi     }
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, 0, &Gop0Dst);
308*53ee8cc1Swenshuai.xi     if (Gop0Dst ==E_DRV_GOP_DST_INVALID)
309*53ee8cc1Swenshuai.xi     {
310*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n Get GOP destination fail!\n"));
311*53ee8cc1Swenshuai.xi         return;
312*53ee8cc1Swenshuai.xi     }
313*53ee8cc1Swenshuai.xi     memset(&sGetInfo, 0, sizeof(DRV_GOP_GWIN_INFO));
314*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetGwinInfo(g_pGOPCtxLocal, u8win, &sGetInfo);
315*53ee8cc1Swenshuai.xi     pinfo->u16RBlkHPixSize = sGetInfo.u16RBlkHPixSize;
316*53ee8cc1Swenshuai.xi     pinfo->u16RBlkVPixSize = sGetInfo.u16RBlkVPixSize;
317*53ee8cc1Swenshuai.xi     //2009.03.14 Fix the TTX,CC position error
318*53ee8cc1Swenshuai.xi     sGetInfo.u16WinX = pwinFB->s_x;
319*53ee8cc1Swenshuai.xi     sGetInfo.u16WinY = pwinFB->s_y;
320*53ee8cc1Swenshuai.xi 
321*53ee8cc1Swenshuai.xi     pinfo->clrType = (EN_GOP_COLOR_TYPE)sGetInfo.clrType;
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_VMirror_VPos, u8win))
324*53ee8cc1Swenshuai.xi     {
325*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVStr;
326*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelEnd= g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVEnd;
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
329*53ee8cc1Swenshuai.xi             pinfo->u16DispVPixelEnd = (pinfo->u16DispVPixelEnd + pinfo->u16DispVPixelStart) >> 1;        // pix
330*53ee8cc1Swenshuai.xi     }
331*53ee8cc1Swenshuai.xi     else
332*53ee8cc1Swenshuai.xi     {
333*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelStart = sGetInfo.u16DispVPixelStart;              // pix
334*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
335*53ee8cc1Swenshuai.xi         {
336*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
337*53ee8cc1Swenshuai.xi 
338*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
339*53ee8cc1Swenshuai.xi             if( ((Gop0Dst == E_DRV_GOP_DST_IP0) || (Gop0Dst == E_DRV_GOP_DST_IP1)) && bInterlace)
340*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart) >> 1;
341*53ee8cc1Swenshuai.xi             else if((Gop0Dst == E_DRV_GOP_DST_VE) || (Gop0Dst == E_DRV_GOP_DST_OP1))
342*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart) >> 1;
343*53ee8cc1Swenshuai.xi             else
344*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (sGetInfo.u16DispVPixelEnd + pinfo->u16DispVPixelStart) >> 1;        // pix
345*53ee8cc1Swenshuai.xi         }
346*53ee8cc1Swenshuai.xi         else
347*53ee8cc1Swenshuai.xi         {
348*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
351*53ee8cc1Swenshuai.xi             if( ((Gop0Dst == E_DRV_GOP_DST_IP0) || (Gop0Dst == E_DRV_GOP_DST_IP1)) && bInterlace)
352*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
353*53ee8cc1Swenshuai.xi             else if((Gop0Dst == E_DRV_GOP_DST_VE) || (Gop0Dst == E_DRV_GOP_DST_OP1))
354*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
355*53ee8cc1Swenshuai.xi             else if (((Gop0Dst == E_DRV_GOP_DST_OP0) || (Gop0Dst == E_DRV_GOP_DST_FRC) || (Gop0Dst == E_DRV_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,0))
356*53ee8cc1Swenshuai.xi             {
357*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
358*53ee8cc1Swenshuai.xi             }
359*53ee8cc1Swenshuai.xi             else
360*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = sGetInfo.u16DispVPixelEnd;            // pix
361*53ee8cc1Swenshuai.xi         }
362*53ee8cc1Swenshuai.xi     }
363*53ee8cc1Swenshuai.xi 
364*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_HMirror_HPos, u8win))
365*53ee8cc1Swenshuai.xi     {
366*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHStr;
367*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelEnd= g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHEnd;
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
370*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (pinfo->u16DispHPixelEnd + pinfo->u16DispHPixelStart) >> 1;     // pix
371*53ee8cc1Swenshuai.xi     }
372*53ee8cc1Swenshuai.xi     else
373*53ee8cc1Swenshuai.xi     {
374*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelStart = sGetInfo.u16DispHPixelStart;               // pix
375*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelEnd = sGetInfo.u16DispHPixelEnd;                             // pix
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
378*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (pinfo->u16DispHPixelEnd + pinfo->u16DispHPixelStart) >> 1;     // pix
379*53ee8cc1Swenshuai.xi     }
380*53ee8cc1Swenshuai.xi 
381*53ee8cc1Swenshuai.xi     pinfo->u16RBlkHRblkSize = sGetInfo.u16RBlkHRblkSize; //3
382*53ee8cc1Swenshuai.xi     pinfo->u32DRAMRBlkStart = sGetInfo.u64DRAMRBlkStart;
383*53ee8cc1Swenshuai.xi     pinfo->u16WinY = sGetInfo.u16WinY;  //Original Y pix of FB
384*53ee8cc1Swenshuai.xi     pinfo->u16WinX= sGetInfo.u16WinX;   //Original X pix of FB
385*53ee8cc1Swenshuai.xi }
386*53ee8cc1Swenshuai.xi 
_GOP_GetGop1WinInfo(void * pInstance,MS_U8 u8win,GOP_GwinInfo * pinfo)387*53ee8cc1Swenshuai.xi static void _GOP_GetGop1WinInfo(void* pInstance,MS_U8 u8win, GOP_GwinInfo* pinfo)
388*53ee8cc1Swenshuai.xi {
389*53ee8cc1Swenshuai.xi     DRV_GOP_GWIN_INFO sGetInfo;
390*53ee8cc1Swenshuai.xi     DRV_GOPDstType Gop1Dst =E_DRV_GOP_DST_INVALID;
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
393*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
394*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
395*53ee8cc1Swenshuai.xi #endif
396*53ee8cc1Swenshuai.xi 
397*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
398*53ee8cc1Swenshuai.xi     {
399*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
400*53ee8cc1Swenshuai.xi         return;
401*53ee8cc1Swenshuai.xi     }
402*53ee8cc1Swenshuai.xi 
403*53ee8cc1Swenshuai.xi 
404*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, 1, &Gop1Dst);
405*53ee8cc1Swenshuai.xi     if (Gop1Dst ==E_DRV_GOP_DST_INVALID)
406*53ee8cc1Swenshuai.xi     {
407*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n Get GOP destination fail!\n"));
408*53ee8cc1Swenshuai.xi         return;
409*53ee8cc1Swenshuai.xi     }
410*53ee8cc1Swenshuai.xi 
411*53ee8cc1Swenshuai.xi     memset(&sGetInfo, 0, sizeof(DRV_GOP_GWIN_INFO));
412*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetGwinInfo(g_pGOPCtxLocal, u8win, &sGetInfo);
413*53ee8cc1Swenshuai.xi     pinfo->u16RBlkHPixSize = sGetInfo.u16RBlkHPixSize;
414*53ee8cc1Swenshuai.xi     pinfo->u16RBlkVPixSize = sGetInfo.u16RBlkVPixSize;
415*53ee8cc1Swenshuai.xi     pinfo->clrType = (EN_GOP_COLOR_TYPE)sGetInfo.clrType;
416*53ee8cc1Swenshuai.xi 
417*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_VMirror_VPos, u8win))
418*53ee8cc1Swenshuai.xi     {
419*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVStr;
420*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelEnd = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVEnd;
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
423*53ee8cc1Swenshuai.xi             pinfo->u16DispVPixelEnd = (pinfo->u16DispVPixelEnd + pinfo->u16DispVPixelStart) >> 1;       // pix
424*53ee8cc1Swenshuai.xi     }
425*53ee8cc1Swenshuai.xi     else
426*53ee8cc1Swenshuai.xi     {
427*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelStart = sGetInfo.u16DispVPixelStart;            // pix
428*53ee8cc1Swenshuai.xi 
429*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
430*53ee8cc1Swenshuai.xi         {
431*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
432*53ee8cc1Swenshuai.xi 
433*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
434*53ee8cc1Swenshuai.xi             if( ((Gop1Dst == E_DRV_GOP_DST_IP0) || (Gop1Dst == E_DRV_GOP_DST_IP1)) && bInterlace)
435*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart) >> 1;
436*53ee8cc1Swenshuai.xi             else if((Gop1Dst == E_DRV_GOP_DST_VE) || (Gop1Dst == E_DRV_GOP_DST_OP1))
437*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart) >> 1;
438*53ee8cc1Swenshuai.xi             else
439*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (sGetInfo.u16DispVPixelEnd + pinfo->u16DispVPixelStart) >> 1;        // pix
440*53ee8cc1Swenshuai.xi         }
441*53ee8cc1Swenshuai.xi         else
442*53ee8cc1Swenshuai.xi         {
443*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
444*53ee8cc1Swenshuai.xi 
445*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
446*53ee8cc1Swenshuai.xi             if( ((Gop1Dst == E_DRV_GOP_DST_IP0) || (Gop1Dst == E_DRV_GOP_DST_IP1)) && bInterlace)
447*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
448*53ee8cc1Swenshuai.xi             else if((Gop1Dst == E_DRV_GOP_DST_VE) || (Gop1Dst == E_DRV_GOP_DST_OP1))
449*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
450*53ee8cc1Swenshuai.xi             else if (((Gop1Dst == E_DRV_GOP_DST_OP0) || (Gop1Dst == E_DRV_GOP_DST_FRC) || (Gop1Dst == E_DRV_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,1))
451*53ee8cc1Swenshuai.xi             {
452*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
453*53ee8cc1Swenshuai.xi             }
454*53ee8cc1Swenshuai.xi             else
455*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = sGetInfo.u16DispVPixelEnd;            // pix
456*53ee8cc1Swenshuai.xi         }
457*53ee8cc1Swenshuai.xi     }
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_HMirror_HPos, u8win))
460*53ee8cc1Swenshuai.xi     {
461*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHStr;
462*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelEnd = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHEnd;
463*53ee8cc1Swenshuai.xi 
464*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
465*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (pinfo->u16DispHPixelEnd + pinfo->u16DispHPixelStart) >> 1;   // pix
466*53ee8cc1Swenshuai.xi     }
467*53ee8cc1Swenshuai.xi     else
468*53ee8cc1Swenshuai.xi     {
469*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelStart = sGetInfo.u16DispHPixelStart;  // pix
470*53ee8cc1Swenshuai.xi 
471*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
472*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (sGetInfo.u16DispHPixelEnd + pinfo->u16DispHPixelStart) >> 1;     // pix
473*53ee8cc1Swenshuai.xi         else
474*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = sGetInfo.u16DispHPixelEnd;    // pix
475*53ee8cc1Swenshuai.xi     }
476*53ee8cc1Swenshuai.xi 
477*53ee8cc1Swenshuai.xi     pinfo->u16RBlkHRblkSize = sGetInfo.u16RBlkHRblkSize;
478*53ee8cc1Swenshuai.xi     pinfo->u32DRAMRBlkStart = sGetInfo.u64DRAMRBlkStart;
479*53ee8cc1Swenshuai.xi 
480*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr, u8win) ||
481*53ee8cc1Swenshuai.xi         HAS_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, u8win))
482*53ee8cc1Swenshuai.xi     {
483*53ee8cc1Swenshuai.xi         pinfo->u32DRAMRBlkStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u64NonMirrorFBAdr;
484*53ee8cc1Swenshuai.xi     }
485*53ee8cc1Swenshuai.xi }
486*53ee8cc1Swenshuai.xi 
_GOP_GetGop23WinInfo(void * pInstance,MS_U8 u8win,GOP_GwinInfo * pinfo)487*53ee8cc1Swenshuai.xi static void _GOP_GetGop23WinInfo(void* pInstance,MS_U8 u8win, GOP_GwinInfo* pinfo)
488*53ee8cc1Swenshuai.xi {
489*53ee8cc1Swenshuai.xi     DRV_GOP_GWIN_INFO sGetInfo;
490*53ee8cc1Swenshuai.xi     DRV_GOPDstType Gop23Dst =E_DRV_GOP_DST_INVALID;
491*53ee8cc1Swenshuai.xi 
492*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
493*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
494*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
495*53ee8cc1Swenshuai.xi #endif
496*53ee8cc1Swenshuai.xi 
497*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
498*53ee8cc1Swenshuai.xi     {
499*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
500*53ee8cc1Swenshuai.xi         return;
501*53ee8cc1Swenshuai.xi     }
502*53ee8cc1Swenshuai.xi 
503*53ee8cc1Swenshuai.xi 
504*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8win), &Gop23Dst);
505*53ee8cc1Swenshuai.xi     if (Gop23Dst ==E_DRV_GOP_DST_INVALID)
506*53ee8cc1Swenshuai.xi     {
507*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n Get GOP destination fail!\n"));
508*53ee8cc1Swenshuai.xi         return;
509*53ee8cc1Swenshuai.xi     }
510*53ee8cc1Swenshuai.xi 
511*53ee8cc1Swenshuai.xi     memset(&sGetInfo, 0, sizeof(DRV_GOP_GWIN_INFO));
512*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetGwinInfo(g_pGOPCtxLocal, u8win, &sGetInfo);
513*53ee8cc1Swenshuai.xi     pinfo->u16RBlkHPixSize = sGetInfo.u16RBlkHPixSize;
514*53ee8cc1Swenshuai.xi     pinfo->u16RBlkVPixSize = sGetInfo.u16RBlkVPixSize;
515*53ee8cc1Swenshuai.xi     pinfo->clrType = (EN_GOP_COLOR_TYPE)sGetInfo.clrType;
516*53ee8cc1Swenshuai.xi 
517*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_VMirror_VPos, u8win))
518*53ee8cc1Swenshuai.xi     {
519*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVStr;
520*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelEnd = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVEnd;
521*53ee8cc1Swenshuai.xi 
522*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
523*53ee8cc1Swenshuai.xi             pinfo->u16DispVPixelEnd = (pinfo->u16DispVPixelEnd + pinfo->u16DispVPixelStart) >> 1;       // pix
524*53ee8cc1Swenshuai.xi     }
525*53ee8cc1Swenshuai.xi     else
526*53ee8cc1Swenshuai.xi     {
527*53ee8cc1Swenshuai.xi         pinfo->u16DispVPixelStart = sGetInfo.u16DispVPixelStart;            // pix
528*53ee8cc1Swenshuai.xi 
529*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
530*53ee8cc1Swenshuai.xi         {
531*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
532*53ee8cc1Swenshuai.xi 
533*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
534*53ee8cc1Swenshuai.xi             if( ((Gop23Dst == E_DRV_GOP_DST_IP0) || (Gop23Dst == E_DRV_GOP_DST_IP1)) && bInterlace)
535*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart) >> 1;
536*53ee8cc1Swenshuai.xi             else if((Gop23Dst == E_DRV_GOP_DST_VE) || (Gop23Dst == E_DRV_GOP_DST_OP1))
537*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart) >> 1;
538*53ee8cc1Swenshuai.xi             else
539*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (sGetInfo.u16DispVPixelEnd + pinfo->u16DispVPixelStart) >> 1;        // pix
540*53ee8cc1Swenshuai.xi         }
541*53ee8cc1Swenshuai.xi         else
542*53ee8cc1Swenshuai.xi         {
543*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
544*53ee8cc1Swenshuai.xi 
545*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
546*53ee8cc1Swenshuai.xi             if( ((Gop23Dst == E_DRV_GOP_DST_IP0) || (Gop23Dst == E_DRV_GOP_DST_IP1)) && bInterlace)
547*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
548*53ee8cc1Swenshuai.xi             else if((Gop23Dst == E_DRV_GOP_DST_VE) || (Gop23Dst == E_DRV_GOP_DST_OP1))
549*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
550*53ee8cc1Swenshuai.xi             else if (((Gop23Dst == E_DRV_GOP_DST_OP0) || (Gop23Dst == E_DRV_GOP_DST_FRC) || (Gop23Dst == E_DRV_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal, MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8win)))
551*53ee8cc1Swenshuai.xi             {
552*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = ((sGetInfo.u16DispVPixelEnd - pinfo->u16DispVPixelStart) << 1) + pinfo->u16DispVPixelStart;
553*53ee8cc1Swenshuai.xi             }
554*53ee8cc1Swenshuai.xi             else
555*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = sGetInfo.u16DispVPixelEnd;            // pix
556*53ee8cc1Swenshuai.xi         }
557*53ee8cc1Swenshuai.xi     }
558*53ee8cc1Swenshuai.xi 
559*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_HMirror_HPos, u8win))
560*53ee8cc1Swenshuai.xi     {
561*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHStr;
562*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelEnd = g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHEnd;
563*53ee8cc1Swenshuai.xi 
564*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
565*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (pinfo->u16DispHPixelEnd + pinfo->u16DispHPixelStart) >> 1;   // pix
566*53ee8cc1Swenshuai.xi     }
567*53ee8cc1Swenshuai.xi     else
568*53ee8cc1Swenshuai.xi     {
569*53ee8cc1Swenshuai.xi         pinfo->u16DispHPixelStart = sGetInfo.u16DispHPixelStart;  // pix
570*53ee8cc1Swenshuai.xi 
571*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
572*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (sGetInfo.u16DispHPixelEnd + pinfo->u16DispHPixelStart) >> 1;     // pix
573*53ee8cc1Swenshuai.xi         else
574*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = sGetInfo.u16DispHPixelEnd;    // pix
575*53ee8cc1Swenshuai.xi     }
576*53ee8cc1Swenshuai.xi 
577*53ee8cc1Swenshuai.xi     pinfo->u16RBlkHRblkSize = sGetInfo.u16RBlkHRblkSize;
578*53ee8cc1Swenshuai.xi     pinfo->u32DRAMRBlkStart = sGetInfo.u64DRAMRBlkStart;
579*53ee8cc1Swenshuai.xi 
580*53ee8cc1Swenshuai.xi     if (HAS_BIT(g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr, u8win) ||
581*53ee8cc1Swenshuai.xi         HAS_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, u8win))
582*53ee8cc1Swenshuai.xi     {
583*53ee8cc1Swenshuai.xi         pinfo->u32DRAMRBlkStart = g_pGOPCtxLocal->sMirrorInfo[u8win].u64NonMirrorFBAdr;
584*53ee8cc1Swenshuai.xi     }
585*53ee8cc1Swenshuai.xi }
586*53ee8cc1Swenshuai.xi 
587*53ee8cc1Swenshuai.xi 
588*53ee8cc1Swenshuai.xi 
589*53ee8cc1Swenshuai.xi 
_GOP_SelGwinId2(void * pInstance,MS_U32 u32GOP,MS_U32 u8GwinIdx)590*53ee8cc1Swenshuai.xi MS_U8 _GOP_SelGwinId2(void* pInstance,MS_U32 u32GOP, MS_U32 u8GwinIdx)
591*53ee8cc1Swenshuai.xi {
592*53ee8cc1Swenshuai.xi     MS_U8 tmp;
593*53ee8cc1Swenshuai.xi 
594*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
595*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
596*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
597*53ee8cc1Swenshuai.xi #endif
598*53ee8cc1Swenshuai.xi 
599*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u32GOP))
600*53ee8cc1Swenshuai.xi     {
601*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %td  is out of range\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32GOP);
602*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
603*53ee8cc1Swenshuai.xi     }
604*53ee8cc1Swenshuai.xi     tmp = MDrv_GOP_SelGwinIdByGOP(g_pGOPCtxLocal, u32GOP, u8GwinIdx);
605*53ee8cc1Swenshuai.xi 
606*53ee8cc1Swenshuai.xi     return tmp;
607*53ee8cc1Swenshuai.xi 
608*53ee8cc1Swenshuai.xi }
609*53ee8cc1Swenshuai.xi 
_GOP_MAP_MUX_Enum(void * pInstance,EN_Gop_MuxSel GOPMux,Gop_MuxSel * pGOPMux)610*53ee8cc1Swenshuai.xi static E_GOP_API_Result _GOP_MAP_MUX_Enum(void* pInstance,EN_Gop_MuxSel GOPMux, Gop_MuxSel *pGOPMux)
611*53ee8cc1Swenshuai.xi {
612*53ee8cc1Swenshuai.xi     E_GOP_API_Result ret = GOP_API_FAIL;
613*53ee8cc1Swenshuai.xi 
614*53ee8cc1Swenshuai.xi     switch (GOPMux)
615*53ee8cc1Swenshuai.xi     {
616*53ee8cc1Swenshuai.xi         case EN_GOP_MUX0:
617*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_MUX0;
618*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
619*53ee8cc1Swenshuai.xi             break;
620*53ee8cc1Swenshuai.xi         case EN_GOP_MUX1:
621*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_MUX1;
622*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
623*53ee8cc1Swenshuai.xi             break;
624*53ee8cc1Swenshuai.xi         case EN_GOP_MUX2:
625*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_MUX2;
626*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
627*53ee8cc1Swenshuai.xi             break;
628*53ee8cc1Swenshuai.xi         case EN_GOP_MUX3:
629*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_MUX3;
630*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
631*53ee8cc1Swenshuai.xi             break;
632*53ee8cc1Swenshuai.xi         case EN_GOP_MUX4:
633*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_MUX4;
634*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
635*53ee8cc1Swenshuai.xi             break;
636*53ee8cc1Swenshuai.xi         case EN_GOP_IP0_MUX:
637*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_IP0_MUX;
638*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
639*53ee8cc1Swenshuai.xi             break;
640*53ee8cc1Swenshuai.xi         case EN_GOP_IP1_MUX:
641*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_IP1_MUX;
642*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
643*53ee8cc1Swenshuai.xi             break;
644*53ee8cc1Swenshuai.xi         case EN_GOP_VOP0_MUX:
645*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_VOP0_MUX;
646*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
647*53ee8cc1Swenshuai.xi             break;
648*53ee8cc1Swenshuai.xi         case EN_GOP_VOP1_MUX:
649*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_VOP1_MUX;
650*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
651*53ee8cc1Swenshuai.xi             break;
652*53ee8cc1Swenshuai.xi         case EN_GOP_FRC_MUX0:
653*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_FRC_MUX0;
654*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
655*53ee8cc1Swenshuai.xi             break;
656*53ee8cc1Swenshuai.xi         case EN_GOP_FRC_MUX1:
657*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_FRC_MUX1;
658*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
659*53ee8cc1Swenshuai.xi             break;
660*53ee8cc1Swenshuai.xi         case EN_GOP_FRC_MUX2:
661*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_FRC_MUX2;
662*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
663*53ee8cc1Swenshuai.xi             break;
664*53ee8cc1Swenshuai.xi         case EN_GOP_FRC_MUX3:
665*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_FRC_MUX3;
666*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
667*53ee8cc1Swenshuai.xi             break;
668*53ee8cc1Swenshuai.xi         case EN_GOP_BYPASS_MUX0:
669*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_BYPASS_MUX0;
670*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
671*53ee8cc1Swenshuai.xi             break;
672*53ee8cc1Swenshuai.xi         case EN_GOP_IP0_SUB_MUX:
673*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_IP0_SUB_MUX;
674*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
675*53ee8cc1Swenshuai.xi             break;
676*53ee8cc1Swenshuai.xi         case EN_GOP_VOP0_SUB_MUX:
677*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_VOP0_SUB_MUX;
678*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
679*53ee8cc1Swenshuai.xi             break;
680*53ee8cc1Swenshuai.xi         case EN_GOP_OP1_MUX:
681*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_OP1_MUX;
682*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
683*53ee8cc1Swenshuai.xi             break;
684*53ee8cc1Swenshuai.xi         case EN_GOP_DIP_MUX:
685*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_DIP_MUX;
686*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
687*53ee8cc1Swenshuai.xi             break;
688*53ee8cc1Swenshuai.xi         case EN_GOP_GS_MUX:
689*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_GS_MUX;
690*53ee8cc1Swenshuai.xi             ret = GOP_API_SUCCESS;
691*53ee8cc1Swenshuai.xi             break;
692*53ee8cc1Swenshuai.xi         default:
693*53ee8cc1Swenshuai.xi             *pGOPMux = E_GOP_MUX_INVAILD;
694*53ee8cc1Swenshuai.xi             GOP_M_ERR("\n MAP GOP Mux error!! \n");
695*53ee8cc1Swenshuai.xi             ret = GOP_API_FAIL;
696*53ee8cc1Swenshuai.xi             break;
697*53ee8cc1Swenshuai.xi     }
698*53ee8cc1Swenshuai.xi     return ret;
699*53ee8cc1Swenshuai.xi }
_GOP_Map_APIDst2DRV_Enum(void * pInstance,EN_GOP_DST_TYPE GopDst,DRV_GOPDstType * pGopDst)700*53ee8cc1Swenshuai.xi static MS_U32 _GOP_Map_APIDst2DRV_Enum(void* pInstance,EN_GOP_DST_TYPE GopDst, DRV_GOPDstType *pGopDst)
701*53ee8cc1Swenshuai.xi {
702*53ee8cc1Swenshuai.xi     MS_U32 ret = GOP_API_FAIL;
703*53ee8cc1Swenshuai.xi 
704*53ee8cc1Swenshuai.xi     switch (GopDst)
705*53ee8cc1Swenshuai.xi     {
706*53ee8cc1Swenshuai.xi         case E_GOP_DST_IP0:
707*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_IP0;
708*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
709*53ee8cc1Swenshuai.xi             break;
710*53ee8cc1Swenshuai.xi         case E_GOP_DST_MIXER2VE:
711*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_MIXER2VE;
712*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
713*53ee8cc1Swenshuai.xi             break;
714*53ee8cc1Swenshuai.xi         case E_GOP_DST_OP0:
715*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_OP0;
716*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
717*53ee8cc1Swenshuai.xi             break;
718*53ee8cc1Swenshuai.xi         case E_GOP_DST_VOP:
719*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_VOP;
720*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
721*53ee8cc1Swenshuai.xi             break;
722*53ee8cc1Swenshuai.xi         case E_GOP_DST_IP1:
723*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_IP1;
724*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
725*53ee8cc1Swenshuai.xi             break;
726*53ee8cc1Swenshuai.xi         case E_GOP_DST_IP_MAIN:
727*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_IP0; //For compatible temporaily
728*53ee8cc1Swenshuai.xi             GOP_M_ERR("\n %s, E_GOP_DST_IP_MAIN is going to be removed, please choose E_GOP_DST_IP0!! \n", __FUNCTION__);
729*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
730*53ee8cc1Swenshuai.xi             break;
731*53ee8cc1Swenshuai.xi         case E_GOP_DST_IP_SUB:            //For compatible temporaily
732*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_IP0_SUB;
733*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
734*53ee8cc1Swenshuai.xi             break;
735*53ee8cc1Swenshuai.xi         case E_GOP_DST_MIXER2OP:
736*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_MIXER2OP;
737*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
738*53ee8cc1Swenshuai.xi             break;
739*53ee8cc1Swenshuai.xi         case E_GOP_DST_VOP_SUB:
740*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_VOP_SUB;
741*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
742*53ee8cc1Swenshuai.xi             break;
743*53ee8cc1Swenshuai.xi         case E_GOP_DST_FRC:
744*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_FRC;
745*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
746*53ee8cc1Swenshuai.xi             break;
747*53ee8cc1Swenshuai.xi         case E_GOP_DST_VE:
748*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_VE;
749*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
750*53ee8cc1Swenshuai.xi             break;
751*53ee8cc1Swenshuai.xi         case E_GOP_DST_BYPASS:
752*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_BYPASS;
753*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
754*53ee8cc1Swenshuai.xi             break;
755*53ee8cc1Swenshuai.xi         case E_GOP_DST_OP1:
756*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_OP1;
757*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
758*53ee8cc1Swenshuai.xi             break;
759*53ee8cc1Swenshuai.xi         case E_GOP_DST_MIXER2OP1:
760*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_MIXER2OP1;
761*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
762*53ee8cc1Swenshuai.xi             break;
763*53ee8cc1Swenshuai.xi         case E_GOP_DST_DIP:
764*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_DIP;
765*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
766*53ee8cc1Swenshuai.xi             break;
767*53ee8cc1Swenshuai.xi         case E_GOP_DST_GOPScaling:
768*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_GOPScaling;
769*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
770*53ee8cc1Swenshuai.xi             break;
771*53ee8cc1Swenshuai.xi         case E_GOP_DST_OP_DUAL_RATE:
772*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_OP_DUAL_RATE;
773*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
774*53ee8cc1Swenshuai.xi             break;
775*53ee8cc1Swenshuai.xi         default:
776*53ee8cc1Swenshuai.xi             *pGopDst = E_DRV_GOP_DST_INVALID;
777*53ee8cc1Swenshuai.xi             GOP_M_ERR("\n MAP GOP Dst plane error!! \n");
778*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_FAIL;
779*53ee8cc1Swenshuai.xi             break;
780*53ee8cc1Swenshuai.xi     }
781*53ee8cc1Swenshuai.xi         return ret;
782*53ee8cc1Swenshuai.xi }
783*53ee8cc1Swenshuai.xi 
_GOP_Map_DRVDst2API_Enum_(void * pInstance,EN_GOP_DST_TYPE * pGopDst,DRV_GOPDstType GopDst)784*53ee8cc1Swenshuai.xi static MS_U32 _GOP_Map_DRVDst2API_Enum_(void* pInstance,EN_GOP_DST_TYPE *pGopDst, DRV_GOPDstType GopDst)
785*53ee8cc1Swenshuai.xi {
786*53ee8cc1Swenshuai.xi     MS_U32 ret = 0;
787*53ee8cc1Swenshuai.xi 
788*53ee8cc1Swenshuai.xi     switch (GopDst)
789*53ee8cc1Swenshuai.xi     {
790*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP0:
791*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_IP0;
792*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
793*53ee8cc1Swenshuai.xi             break;
794*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2VE:
795*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_MIXER2VE;
796*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
797*53ee8cc1Swenshuai.xi             break;
798*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP0:
799*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_OP0;
800*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
801*53ee8cc1Swenshuai.xi             break;
802*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VOP:
803*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_VOP;
804*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
805*53ee8cc1Swenshuai.xi             break;
806*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP1:
807*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_IP1;
808*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
809*53ee8cc1Swenshuai.xi             break;
810*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP0_SUB:            //For compatible temporaily
811*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_IP_SUB;
812*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
813*53ee8cc1Swenshuai.xi             break;
814*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2OP:
815*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_MIXER2OP;
816*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
817*53ee8cc1Swenshuai.xi             break;
818*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VOP_SUB:
819*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_VOP_SUB;
820*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
821*53ee8cc1Swenshuai.xi             break;
822*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_FRC:
823*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_FRC;
824*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
825*53ee8cc1Swenshuai.xi             break;
826*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VE:
827*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_VE;
828*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
829*53ee8cc1Swenshuai.xi             break;
830*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_BYPASS:
831*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_BYPASS;
832*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
833*53ee8cc1Swenshuai.xi             break;
834*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP1:
835*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_OP1;
836*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
837*53ee8cc1Swenshuai.xi             break;
838*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2OP1:
839*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_MIXER2OP1;
840*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
841*53ee8cc1Swenshuai.xi             break;
842*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_DIP:
843*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_DIP;
844*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
845*53ee8cc1Swenshuai.xi             break;
846*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_GOPScaling:
847*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_GOPScaling;
848*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
849*53ee8cc1Swenshuai.xi             break;
850*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP_DUAL_RATE :
851*53ee8cc1Swenshuai.xi             *pGopDst = E_GOP_DST_OP_DUAL_RATE;
852*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_SUCCESS;
853*53ee8cc1Swenshuai.xi             break;
854*53ee8cc1Swenshuai.xi         default:
855*53ee8cc1Swenshuai.xi             *pGopDst = (EN_GOP_DST_TYPE)0xff;
856*53ee8cc1Swenshuai.xi             GOP_M_ERR("\n MAP GOP Dst plane error!! \n");
857*53ee8cc1Swenshuai.xi             ret = (MS_U32)GOP_API_FAIL;
858*53ee8cc1Swenshuai.xi             break;
859*53ee8cc1Swenshuai.xi     }
860*53ee8cc1Swenshuai.xi         return ret;
861*53ee8cc1Swenshuai.xi }
862*53ee8cc1Swenshuai.xi 
_GOP_CalcPitch(void * pInstance,MS_U8 fbFmt,MS_U16 width)863*53ee8cc1Swenshuai.xi static MS_U32 _GOP_CalcPitch(void* pInstance,MS_U8 fbFmt, MS_U16 width)
864*53ee8cc1Swenshuai.xi {
865*53ee8cc1Swenshuai.xi     MS_U16 pitch=0;
866*53ee8cc1Swenshuai.xi 
867*53ee8cc1Swenshuai.xi     switch ( fbFmt )
868*53ee8cc1Swenshuai.xi     {
869*53ee8cc1Swenshuai.xi     case E_MS_FMT_I1 :
870*53ee8cc1Swenshuai.xi         pitch = (width) >> 3;
871*53ee8cc1Swenshuai.xi         break;
872*53ee8cc1Swenshuai.xi     case E_MS_FMT_I2 :
873*53ee8cc1Swenshuai.xi         pitch = (width<<1) >> 3;
874*53ee8cc1Swenshuai.xi         break;
875*53ee8cc1Swenshuai.xi     case E_MS_FMT_I4 :
876*53ee8cc1Swenshuai.xi         pitch = (width<<2) >> 3;
877*53ee8cc1Swenshuai.xi         break;
878*53ee8cc1Swenshuai.xi     case E_MS_FMT_I8 :
879*53ee8cc1Swenshuai.xi         pitch = width;
880*53ee8cc1Swenshuai.xi         break;
881*53ee8cc1Swenshuai.xi     case E_MS_FMT_RGB565 :
882*53ee8cc1Swenshuai.xi     case E_MS_FMT_BGR565 :
883*53ee8cc1Swenshuai.xi     case E_MS_FMT_ARGB1555 :
884*53ee8cc1Swenshuai.xi     case E_MS_FMT_ABGR1555 :
885*53ee8cc1Swenshuai.xi     case E_MS_FMT_BGRA5551 :
886*53ee8cc1Swenshuai.xi     case E_MS_FMT_RGBA5551 :
887*53ee8cc1Swenshuai.xi     case E_MS_FMT_ARGB4444 :
888*53ee8cc1Swenshuai.xi     case E_MS_FMT_RGBA4444 :
889*53ee8cc1Swenshuai.xi     case E_MS_FMT_ABGR4444 :
890*53ee8cc1Swenshuai.xi     case E_MS_FMT_BGRA4444 :
891*53ee8cc1Swenshuai.xi     case E_MS_FMT_1ABFgBg12355:
892*53ee8cc1Swenshuai.xi     case E_MS_FMT_FaBaFgBg2266:
893*53ee8cc1Swenshuai.xi     case E_MS_FMT_YUV422:
894*53ee8cc1Swenshuai.xi     case E_MS_FMT_ARGB1555_DST :
895*53ee8cc1Swenshuai.xi         pitch = width << 1;
896*53ee8cc1Swenshuai.xi         break;
897*53ee8cc1Swenshuai.xi     case E_MS_FMT_AYUV8888 :
898*53ee8cc1Swenshuai.xi     case E_MS_FMT_ARGB8888 :
899*53ee8cc1Swenshuai.xi     case E_MS_FMT_RGBA8888 :
900*53ee8cc1Swenshuai.xi     case E_MS_FMT_BGRA8888:
901*53ee8cc1Swenshuai.xi     case E_MS_FMT_ABGR8888 :
902*53ee8cc1Swenshuai.xi         pitch = width << 2;
903*53ee8cc1Swenshuai.xi         break;
904*53ee8cc1Swenshuai.xi     default :
905*53ee8cc1Swenshuai.xi         //print err
906*53ee8cc1Swenshuai.xi         pitch = 0;
907*53ee8cc1Swenshuai.xi         break;
908*53ee8cc1Swenshuai.xi     }
909*53ee8cc1Swenshuai.xi     return pitch;
910*53ee8cc1Swenshuai.xi }
911*53ee8cc1Swenshuai.xi 
_GOP_GetBPP(void * pInstance,EN_GOP_COLOR_TYPE fbFmt)912*53ee8cc1Swenshuai.xi static MS_U16 _GOP_GetBPP(void* pInstance,EN_GOP_COLOR_TYPE fbFmt)
913*53ee8cc1Swenshuai.xi {
914*53ee8cc1Swenshuai.xi     MS_U16 bpp=0;
915*53ee8cc1Swenshuai.xi 
916*53ee8cc1Swenshuai.xi     switch ( fbFmt )
917*53ee8cc1Swenshuai.xi     {
918*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_RGB555_BLINK :
919*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_RGB565 :
920*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_BGR565 :
921*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_ARGB1555:
922*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_ABGR1555:
923*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_ARGB4444 :
924*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_RGBA4444 :
925*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_ABGR4444 :
926*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_BGRA4444 :
927*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_RGB555YUV422:
928*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_YUV422:
929*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_2266:
930*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_RGBA5551:
931*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_BGRA5551:
932*53ee8cc1Swenshuai.xi         bpp = 16;
933*53ee8cc1Swenshuai.xi         break;
934*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_AYUV8888 :
935*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_ARGB8888 :
936*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_ABGR8888 :
937*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_RGBA8888 :
938*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_BGRA8888 :
939*53ee8cc1Swenshuai.xi         bpp = 32;
940*53ee8cc1Swenshuai.xi         break;
941*53ee8cc1Swenshuai.xi 
942*53ee8cc1Swenshuai.xi     case E_GOP_COLOR_I8 :
943*53ee8cc1Swenshuai.xi         bpp = 8;
944*53ee8cc1Swenshuai.xi         break;
945*53ee8cc1Swenshuai.xi     default :
946*53ee8cc1Swenshuai.xi         //print err
947*53ee8cc1Swenshuai.xi         //__ASSERT(0);
948*53ee8cc1Swenshuai.xi         bpp = 0xFFFF;
949*53ee8cc1Swenshuai.xi         break;
950*53ee8cc1Swenshuai.xi     }
951*53ee8cc1Swenshuai.xi     return bpp;
952*53ee8cc1Swenshuai.xi 
953*53ee8cc1Swenshuai.xi }
954*53ee8cc1Swenshuai.xi 
_GOP_GWIN_IsGwinCreated(void * pInstance,MS_U8 gId)955*53ee8cc1Swenshuai.xi static MS_U8 _GOP_GWIN_IsGwinCreated(void* pInstance,MS_U8 gId)
956*53ee8cc1Swenshuai.xi {
957*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
958*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
959*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
960*53ee8cc1Swenshuai.xi #endif
961*53ee8cc1Swenshuai.xi 
962*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gId))
963*53ee8cc1Swenshuai.xi     {
964*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,gId);
965*53ee8cc1Swenshuai.xi         return FALSE;
966*53ee8cc1Swenshuai.xi     }
967*53ee8cc1Swenshuai.xi 
968*53ee8cc1Swenshuai.xi     if((gId< g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum)
969*53ee8cc1Swenshuai.xi         && (GWIN_ID_INVALID ==g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId))
970*53ee8cc1Swenshuai.xi     {
971*53ee8cc1Swenshuai.xi         return FALSE;
972*53ee8cc1Swenshuai.xi     }
973*53ee8cc1Swenshuai.xi 
974*53ee8cc1Swenshuai.xi     GOP_M_INFO("IsGwinCreated Debug: gId=%d\n", gId);
975*53ee8cc1Swenshuai.xi     return TRUE;
976*53ee8cc1Swenshuai.xi }
977*53ee8cc1Swenshuai.xi 
978*53ee8cc1Swenshuai.xi 
bCursorSupport(void * pInstance,MS_U8 u8GOP)979*53ee8cc1Swenshuai.xi static MS_BOOL  bCursorSupport(void* pInstance,MS_U8 u8GOP)
980*53ee8cc1Swenshuai.xi {
981*53ee8cc1Swenshuai.xi #if CURSOR_SUPPORT
982*53ee8cc1Swenshuai.xi     //if cursor GOP, dont need to do adjust
983*53ee8cc1Swenshuai.xi     if(u8GOP == 3)
984*53ee8cc1Swenshuai.xi         return TRUE;
985*53ee8cc1Swenshuai.xi     else
986*53ee8cc1Swenshuai.xi         return FALSE;
987*53ee8cc1Swenshuai.xi #else
988*53ee8cc1Swenshuai.xi     return FALSE;
989*53ee8cc1Swenshuai.xi #endif
990*53ee8cc1Swenshuai.xi }
991*53ee8cc1Swenshuai.xi 
992*53ee8cc1Swenshuai.xi // Alignment stretch window value
_GOP_GWIN_Align_StretchWin(void * pInstance,MS_U8 u8GOP,EN_GOP_DST_TYPE eDstType,MS_U16 * pu16x,MS_U16 * pu16y,MS_U16 * pu16Width,MS_U16 * pu16height,MS_U16 BPP)993*53ee8cc1Swenshuai.xi static void _GOP_GWIN_Align_StretchWin(void* pInstance, MS_U8 u8GOP, EN_GOP_DST_TYPE eDstType, MS_U16 *pu16x, MS_U16 *pu16y, MS_U16 *pu16Width, MS_U16 *pu16height, MS_U16 BPP)
994*53ee8cc1Swenshuai.xi {
995*53ee8cc1Swenshuai.xi     MS_U16 u16align_offset;
996*53ee8cc1Swenshuai.xi 	MS_U16 u16GOP_Unit;
997*53ee8cc1Swenshuai.xi 
998*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
999*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1000*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1001*53ee8cc1Swenshuai.xi #endif
1002*53ee8cc1Swenshuai.xi 
1003*53ee8cc1Swenshuai.xi 	u16GOP_Unit = MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8GOP);
1004*53ee8cc1Swenshuai.xi 
1005*53ee8cc1Swenshuai.xi     if((eDstType == E_GOP_DST_IP0) || (eDstType == E_GOP_DST_IP1))
1006*53ee8cc1Swenshuai.xi     {
1007*53ee8cc1Swenshuai.xi         MS_BOOL bInterlace = FALSE;
1008*53ee8cc1Swenshuai.xi 
1009*53ee8cc1Swenshuai.xi         MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1010*53ee8cc1Swenshuai.xi         if( bInterlace )
1011*53ee8cc1Swenshuai.xi         {
1012*53ee8cc1Swenshuai.xi             *pu16height /=2;
1013*53ee8cc1Swenshuai.xi             *pu16y = *pu16y/2;
1014*53ee8cc1Swenshuai.xi         }
1015*53ee8cc1Swenshuai.xi     }
1016*53ee8cc1Swenshuai.xi     else if(eDstType == E_GOP_DST_VE)
1017*53ee8cc1Swenshuai.xi     {
1018*53ee8cc1Swenshuai.xi         *pu16height /=2;
1019*53ee8cc1Swenshuai.xi         *pu16y = *pu16y/2 + g_pGOPCtxLocal->pGopChipProperty->GOP_VE_V_Offset;
1020*53ee8cc1Swenshuai.xi     }
1021*53ee8cc1Swenshuai.xi     else if(eDstType == E_GOP_DST_OP1)
1022*53ee8cc1Swenshuai.xi     {
1023*53ee8cc1Swenshuai.xi         *pu16height /=2;
1024*53ee8cc1Swenshuai.xi         *pu16y = *pu16y/2;
1025*53ee8cc1Swenshuai.xi     }
1026*53ee8cc1Swenshuai.xi     else if (((eDstType == E_GOP_DST_OP0) || (eDstType == E_GOP_DST_FRC) || (eDstType == E_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,u8GOP))
1027*53ee8cc1Swenshuai.xi     {
1028*53ee8cc1Swenshuai.xi         *pu16height /=2;
1029*53ee8cc1Swenshuai.xi         *pu16y = *pu16y/2;
1030*53ee8cc1Swenshuai.xi     }
1031*53ee8cc1Swenshuai.xi 
1032*53ee8cc1Swenshuai.xi 
1033*53ee8cc1Swenshuai.xi 	if(u16GOP_Unit ==1)
1034*53ee8cc1Swenshuai.xi 	{
1035*53ee8cc1Swenshuai.xi 		*pu16Width =((*pu16Width + 1)>> 1) << 1; //do 2 pixel align
1036*53ee8cc1Swenshuai.xi     }
1037*53ee8cc1Swenshuai.xi 	else
1038*53ee8cc1Swenshuai.xi 	{
1039*53ee8cc1Swenshuai.xi 		u16align_offset = (u16GOP_Unit * 8 /BPP -1);
1040*53ee8cc1Swenshuai.xi     	*pu16Width = (*pu16Width + u16align_offset)&(~u16align_offset) ; //do 8-byte align
1041*53ee8cc1Swenshuai.xi 	}
1042*53ee8cc1Swenshuai.xi }
1043*53ee8cc1Swenshuai.xi 
1044*53ee8cc1Swenshuai.xi //Adjust stretch window for GOP 3D
_GOP_GWIN_Adjust_3DStretchWin(void * pInstance,MS_U8 u8Gop,MS_U16 * pu16x,MS_U16 * pu16y,MS_U16 * pu16Width,MS_U16 * pu16Height)1045*53ee8cc1Swenshuai.xi static void _GOP_GWIN_Adjust_3DStretchWin(void* pInstance,MS_U8 u8Gop, MS_U16 *pu16x, MS_U16 *pu16y, MS_U16 *pu16Width, MS_U16 *pu16Height)
1046*53ee8cc1Swenshuai.xi {
1047*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1048*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1049*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1050*53ee8cc1Swenshuai.xi #endif
1051*53ee8cc1Swenshuai.xi 
1052*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGopChipProperty->enGOP3DType == E_DRV_3D_DUP_HALF)
1053*53ee8cc1Swenshuai.xi     {
1054*53ee8cc1Swenshuai.xi         if((g_pGOPCtxLocal->pGOPCtxShared->GOP_StereoMode[u8Gop] == E_DRV_GOP_3D_LINE_ALTERNATIVE) ||
1055*53ee8cc1Swenshuai.xi            (g_pGOPCtxLocal->pGOPCtxShared->GOP_StereoMode[u8Gop] == E_DRV_GOP_3D_TOP_BOTTOM)
1056*53ee8cc1Swenshuai.xi           )
1057*53ee8cc1Swenshuai.xi         {
1058*53ee8cc1Swenshuai.xi             *pu16Height = *pu16Height <<1;
1059*53ee8cc1Swenshuai.xi             //Line by line, do not need middle
1060*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGOPCtxShared->GOP_StereoMode[u8Gop] == E_DRV_GOP_3D_TOP_BOTTOM)
1061*53ee8cc1Swenshuai.xi             {
1062*53ee8cc1Swenshuai.xi                 *pu16Height +=g_pGOPCtxLocal->u16GOPGWinMiddle[u8Gop]; //Stretch win includes middle
1063*53ee8cc1Swenshuai.xi             }
1064*53ee8cc1Swenshuai.xi         }
1065*53ee8cc1Swenshuai.xi         else if(g_pGOPCtxLocal->pGOPCtxShared->GOP_StereoMode[u8Gop] == E_DRV_GOP_3D_LINE_FRAMEPACKING)
1066*53ee8cc1Swenshuai.xi         {
1067*53ee8cc1Swenshuai.xi              //Frame packing, no middle, always full screen
1068*53ee8cc1Swenshuai.xi              //Adjust Gap only
1069*53ee8cc1Swenshuai.xi              *pu16Height = (*pu16Height << 1) + g_pGOPCtxLocal->GOP_FramePacking_Gap;
1070*53ee8cc1Swenshuai.xi         }
1071*53ee8cc1Swenshuai.xi         else if(g_pGOPCtxLocal->pGOPCtxShared->GOP_StereoMode[u8Gop] == E_DRV_GOP_3D_SIDE_BY_SYDE)
1072*53ee8cc1Swenshuai.xi         {
1073*53ee8cc1Swenshuai.xi             *pu16Width = *pu16Width <<1;
1074*53ee8cc1Swenshuai.xi             *pu16Width +=g_pGOPCtxLocal->u16GOPGWinMiddle[u8Gop]; //Stretch win includes middle
1075*53ee8cc1Swenshuai.xi         }
1076*53ee8cc1Swenshuai.xi     }
1077*53ee8cc1Swenshuai.xi }
1078*53ee8cc1Swenshuai.xi 
_GOP_GWIN_SetHVMirrorWinPos(void * pInstance,MS_U8 u8GwinID,HMirror_Opt opt,GOP_GwinInfo * pGWINInfo)1079*53ee8cc1Swenshuai.xi static void _GOP_GWIN_SetHVMirrorWinPos(void* pInstance,MS_U8 u8GwinID, HMirror_Opt opt, GOP_GwinInfo* pGWINInfo)
1080*53ee8cc1Swenshuai.xi {
1081*53ee8cc1Swenshuai.xi     MS_U16 u16GWINWidth=0, u16GWINHeight=0;
1082*53ee8cc1Swenshuai.xi     MS_S16 s16MirrorHStr=-1, s16MirrorVStr=-1;
1083*53ee8cc1Swenshuai.xi     MS_U8 u8Gop=INVALID_GOP_NUM;
1084*53ee8cc1Swenshuai.xi 
1085*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1086*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1087*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1088*53ee8cc1Swenshuai.xi #endif
1089*53ee8cc1Swenshuai.xi 
1090*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8GwinID))
1091*53ee8cc1Swenshuai.xi     {
1092*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8GwinID);
1093*53ee8cc1Swenshuai.xi         return;
1094*53ee8cc1Swenshuai.xi     }
1095*53ee8cc1Swenshuai.xi     u8Gop = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8GwinID);
1096*53ee8cc1Swenshuai.xi     u16GWINWidth = pGWINInfo->u16DispHPixelEnd - pGWINInfo->u16DispHPixelStart;
1097*53ee8cc1Swenshuai.xi     u16GWINHeight = pGWINInfo->u16DispVPixelEnd - pGWINInfo->u16DispVPixelStart;
1098*53ee8cc1Swenshuai.xi 
1099*53ee8cc1Swenshuai.xi     switch (opt)
1100*53ee8cc1Swenshuai.xi     {
1101*53ee8cc1Swenshuai.xi         case E_Set_HPos:
1102*53ee8cc1Swenshuai.xi         {
1103*53ee8cc1Swenshuai.xi             pGWINInfo->u16DispHPixelEnd = g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchWidth[u8Gop] - pGWINInfo->u16DispHPixelStart;
1104*53ee8cc1Swenshuai.xi             s16MirrorHStr = pGWINInfo->u16DispHPixelEnd - u16GWINWidth;
1105*53ee8cc1Swenshuai.xi             if (s16MirrorHStr<0)
1106*53ee8cc1Swenshuai.xi             {
1107*53ee8cc1Swenshuai.xi                 pGWINInfo->u16DispHPixelStart = 0;
1108*53ee8cc1Swenshuai.xi                 pGWINInfo->u16DispHPixelEnd = u16GWINWidth;
1109*53ee8cc1Swenshuai.xi             }
1110*53ee8cc1Swenshuai.xi             else
1111*53ee8cc1Swenshuai.xi             {
1112*53ee8cc1Swenshuai.xi                 pGWINInfo->u16DispHPixelStart = s16MirrorHStr;
1113*53ee8cc1Swenshuai.xi             }
1114*53ee8cc1Swenshuai.xi             SET_BIT(g_pGOPCtxLocal->u16GOP_HMirror_HPos, u8GwinID);
1115*53ee8cc1Swenshuai.xi             break;
1116*53ee8cc1Swenshuai.xi         }
1117*53ee8cc1Swenshuai.xi         case E_Set_VPos:
1118*53ee8cc1Swenshuai.xi         {
1119*53ee8cc1Swenshuai.xi             pGWINInfo->u16DispVPixelEnd = g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchHeight[u8Gop] - pGWINInfo->u16DispVPixelStart;
1120*53ee8cc1Swenshuai.xi             s16MirrorVStr = pGWINInfo->u16DispVPixelEnd - u16GWINHeight;
1121*53ee8cc1Swenshuai.xi             if (s16MirrorVStr<0)
1122*53ee8cc1Swenshuai.xi             {
1123*53ee8cc1Swenshuai.xi                 pGWINInfo->u16DispVPixelStart = 0;
1124*53ee8cc1Swenshuai.xi                 pGWINInfo->u16DispVPixelEnd = u16GWINHeight;
1125*53ee8cc1Swenshuai.xi             }
1126*53ee8cc1Swenshuai.xi             else
1127*53ee8cc1Swenshuai.xi             {
1128*53ee8cc1Swenshuai.xi                 pGWINInfo->u16DispVPixelStart = s16MirrorVStr;
1129*53ee8cc1Swenshuai.xi             }
1130*53ee8cc1Swenshuai.xi             SET_BIT(g_pGOPCtxLocal->u16GOP_VMirror_VPos, u8GwinID);
1131*53ee8cc1Swenshuai.xi             break;
1132*53ee8cc1Swenshuai.xi         }
1133*53ee8cc1Swenshuai.xi         case E_Set_X:
1134*53ee8cc1Swenshuai.xi         {
1135*53ee8cc1Swenshuai.xi             if(u8Gop == GOPTYPE.GOP0)
1136*53ee8cc1Swenshuai.xi             {
1137*53ee8cc1Swenshuai.xi             #if ENABLE_GOP0_RBLK_MIRROR
1138*53ee8cc1Swenshuai.xi                 MS_U16 bpp=MDrv_GOP_GetBPP(g_pGOPCtxLocal, (DRV_GOPColorType)pGWINInfo->clrType);
1139*53ee8cc1Swenshuai.xi                 MS_U16 u16HPixelSize;
1140*53ee8cc1Swenshuai.xi                 if((bpp != 0) && (bpp != 0xFFFF))
1141*53ee8cc1Swenshuai.xi                 {
1142*53ee8cc1Swenshuai.xi                     u16HPixelSize = pGWINInfo->u16RBlkHRblkSize / (bpp>>3);
1143*53ee8cc1Swenshuai.xi                 }
1144*53ee8cc1Swenshuai.xi                 else
1145*53ee8cc1Swenshuai.xi                 {
1146*53ee8cc1Swenshuai.xi                     u16HPixelSize = pGWINInfo->u16RBlkHPixSize;
1147*53ee8cc1Swenshuai.xi                 }
1148*53ee8cc1Swenshuai.xi                 if((u16HPixelSize != 0))
1149*53ee8cc1Swenshuai.xi                 {
1150*53ee8cc1Swenshuai.xi                     pGWINInfo->u16WinX = u16HPixelSize - ((pGWINInfo->u16WinX + pGWINInfo->u16DispHPixelEnd- pGWINInfo->u16DispHPixelStart) % u16HPixelSize);
1151*53ee8cc1Swenshuai.xi                     pGWINInfo->u16WinX %= u16HPixelSize;
1152*53ee8cc1Swenshuai.xi                 }
1153*53ee8cc1Swenshuai.xi                 else
1154*53ee8cc1Swenshuai.xi             #endif //ENABLE_GOP0_RBLK_MIRROR
1155*53ee8cc1Swenshuai.xi                 {
1156*53ee8cc1Swenshuai.xi                     pGWINInfo->u16WinX = 0 ;
1157*53ee8cc1Swenshuai.xi                 }
1158*53ee8cc1Swenshuai.xi             }
1159*53ee8cc1Swenshuai.xi             break;
1160*53ee8cc1Swenshuai.xi         }
1161*53ee8cc1Swenshuai.xi         case E_Set_Y:
1162*53ee8cc1Swenshuai.xi         {
1163*53ee8cc1Swenshuai.xi             if(u8Gop == GOPTYPE.GOP0)
1164*53ee8cc1Swenshuai.xi             {
1165*53ee8cc1Swenshuai.xi             #if ENABLE_GOP0_RBLK_MIRROR
1166*53ee8cc1Swenshuai.xi                 if(pGWINInfo->u16RBlkVPixSize != 0)
1167*53ee8cc1Swenshuai.xi                 {
1168*53ee8cc1Swenshuai.xi                     pGWINInfo->u16WinY = (pGWINInfo->u16WinY + (pGWINInfo->u16DispVPixelEnd-pGWINInfo->u16DispVPixelStart-1)) % pGWINInfo->u16RBlkVPixSize;
1169*53ee8cc1Swenshuai.xi                 }
1170*53ee8cc1Swenshuai.xi                 else
1171*53ee8cc1Swenshuai.xi             #endif//ENABLE_GOP0_RBLK_MIRROR
1172*53ee8cc1Swenshuai.xi                 {
1173*53ee8cc1Swenshuai.xi                     pGWINInfo->u16WinY = (pGWINInfo->u16DispVPixelEnd-pGWINInfo->u16DispVPixelStart-1);
1174*53ee8cc1Swenshuai.xi                 }
1175*53ee8cc1Swenshuai.xi             }
1176*53ee8cc1Swenshuai.xi             break;
1177*53ee8cc1Swenshuai.xi         }
1178*53ee8cc1Swenshuai.xi         default:
1179*53ee8cc1Swenshuai.xi         {
1180*53ee8cc1Swenshuai.xi             //ASSERT(0);
1181*53ee8cc1Swenshuai.xi             break;
1182*53ee8cc1Swenshuai.xi         }
1183*53ee8cc1Swenshuai.xi     }
1184*53ee8cc1Swenshuai.xi }
1185*53ee8cc1Swenshuai.xi 
1186*53ee8cc1Swenshuai.xi 
_GOP_GWIN_IsGwinExistInClient(void * pInstance,MS_U8 gId)1187*53ee8cc1Swenshuai.xi static MS_U8 _GOP_GWIN_IsGwinExistInClient(void* pInstance,MS_U8 gId)
1188*53ee8cc1Swenshuai.xi {
1189*53ee8cc1Swenshuai.xi     MS_BOOL result0, result1, result2, result3, result4;
1190*53ee8cc1Swenshuai.xi     MS_U32 MaxGwinSupport;
1191*53ee8cc1Swenshuai.xi 
1192*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
1193*53ee8cc1Swenshuai.xi 
1194*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1195*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1196*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1197*53ee8cc1Swenshuai.xi #endif
1198*53ee8cc1Swenshuai.xi 
1199*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gId))
1200*53ee8cc1Swenshuai.xi     {
1201*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,gId);
1202*53ee8cc1Swenshuai.xi         return FALSE;
1203*53ee8cc1Swenshuai.xi     }
1204*53ee8cc1Swenshuai.xi 
1205*53ee8cc1Swenshuai.xi     MaxGwinSupport = g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum;
1206*53ee8cc1Swenshuai.xi 
1207*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId);
1208*53ee8cc1Swenshuai.xi 
1209*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
1210*53ee8cc1Swenshuai.xi     {
1211*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : gwinMap[%d].u32CurFBId=%td\n",__FUNCTION__,__LINE__,gId,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId);
1212*53ee8cc1Swenshuai.xi         return FALSE;
1213*53ee8cc1Swenshuai.xi     }
1214*53ee8cc1Swenshuai.xi 
1215*53ee8cc1Swenshuai.xi     result0 = (MaxGwinSupport<=gId);
1216*53ee8cc1Swenshuai.xi     result1 = (FALSE == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].bIsShared);
1217*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
1218*53ee8cc1Swenshuai.xi     MS_U32 pid = (GETPIDTYPE)getpid();
1219*53ee8cc1Swenshuai.xi     result2 = (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32GOPClientId != pid);
1220*53ee8cc1Swenshuai.xi #else
1221*53ee8cc1Swenshuai.xi     result2 = (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32GOPClientId != g_pGOPCtxLocal->u32GOPClientId);
1222*53ee8cc1Swenshuai.xi #endif
1223*53ee8cc1Swenshuai.xi     result3 = (DRV_MAX_GWIN_FB_SUPPORT <= g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId);
1224*53ee8cc1Swenshuai.xi     result4 = (0 == pwinFB->in_use);
1225*53ee8cc1Swenshuai.xi 
1226*53ee8cc1Swenshuai.xi     if ( result0 || (result1 && (result2 || result3 || result4) ) )
1227*53ee8cc1Swenshuai.xi     {
1228*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
1229*53ee8cc1Swenshuai.xi 		GOP_M_INFO("result0 = %d,result1 = %d,result2 = %d,result3 = %d,result4 = %d\n",result0,result1,result2,result3,result4);
1230*53ee8cc1Swenshuai.xi         GOP_M_INFO("[%s][%d]GWIN %d  is not exist\n",__FUNCTION__,__LINE__,gId);
1231*53ee8cc1Swenshuai.xi #else
1232*53ee8cc1Swenshuai.xi         GOP_M_INFO("IsGwinExistInClient Debug: gId =%d, \n" , gId);
1233*53ee8cc1Swenshuai.xi 		GOP_M_INFO("gwinMap[gId].u32GOPClientId: gId =%d, \n" , (ptrdiff_t)(g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32GOPClientId) );
1234*53ee8cc1Swenshuai.xi 		GOP_M_INFO("_pGOPCtxLocal->u32GOPClientId =%d, \n" , (ptrdiff_t)(g_pGOPCtxLocal->u32GOPClientId) );
1235*53ee8cc1Swenshuai.xi 		GOP_M_INFO("gwinMap[gId].u32CurFBId =%d, \n" , (ptrdiff_t)(g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId));
1236*53ee8cc1Swenshuai.xi 		GOP_M_INFO("gwinMap[gId].u32CurFBId].in_use =%d, \n" , pwinFB->in_use);
1237*53ee8cc1Swenshuai.xi #endif
1238*53ee8cc1Swenshuai.xi         return FALSE;
1239*53ee8cc1Swenshuai.xi     }
1240*53ee8cc1Swenshuai.xi     return TRUE;
1241*53ee8cc1Swenshuai.xi 
1242*53ee8cc1Swenshuai.xi }
1243*53ee8cc1Swenshuai.xi 
1244*53ee8cc1Swenshuai.xi 
1245*53ee8cc1Swenshuai.xi 
_GOP_GWIN_IsEnableMirror(void * pInstance,DRV_GOPDstType eGopDst,MS_BOOL * pbHMirror,MS_BOOL * pbVMirror)1246*53ee8cc1Swenshuai.xi static void _GOP_GWIN_IsEnableMirror(void* pInstance,DRV_GOPDstType eGopDst, MS_BOOL *pbHMirror, MS_BOOL *pbVMirror)
1247*53ee8cc1Swenshuai.xi {
1248*53ee8cc1Swenshuai.xi 
1249*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1250*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1251*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1252*53ee8cc1Swenshuai.xi #endif
1253*53ee8cc1Swenshuai.xi 
1254*53ee8cc1Swenshuai.xi     if((pbHMirror == NULL) || (pbVMirror == NULL))
1255*53ee8cc1Swenshuai.xi     {
1256*53ee8cc1Swenshuai.xi         return;
1257*53ee8cc1Swenshuai.xi     }
1258*53ee8cc1Swenshuai.xi 
1259*53ee8cc1Swenshuai.xi     if(  (eGopDst == E_DRV_GOP_DST_OP0)
1260*53ee8cc1Swenshuai.xi        ||(eGopDst == E_DRV_GOP_DST_OP_DUAL_RATE)
1261*53ee8cc1Swenshuai.xi        ||(eGopDst == E_DRV_GOP_DST_BYPASS)
1262*53ee8cc1Swenshuai.xi        ||(eGopDst == E_DRV_GOP_DST_FRC)
1263*53ee8cc1Swenshuai.xi        ||(  ((eGopDst == E_DRV_GOP_DST_IP0) || (eGopDst == E_DRV_GOP_DST_IP0_SUB))
1264*53ee8cc1Swenshuai.xi           &&(E_GOP_VIDEOTIMING_MIRROR_BYMVOP == Mdrv_GOP_GetVideoTimingMirrorType(g_pGOPCtxLocal, TRUE)))
1265*53ee8cc1Swenshuai.xi       )
1266*53ee8cc1Swenshuai.xi     {
1267*53ee8cc1Swenshuai.xi         *pbHMirror = g_pGOPCtxLocal->pGOPCtxShared->bHMirror;
1268*53ee8cc1Swenshuai.xi         *pbVMirror = g_pGOPCtxLocal->pGOPCtxShared->bVMirror;
1269*53ee8cc1Swenshuai.xi     }
1270*53ee8cc1Swenshuai.xi     else
1271*53ee8cc1Swenshuai.xi     {
1272*53ee8cc1Swenshuai.xi         #if (FPGA_TEST)  //FPGA use VOP path to verify mirror.
1273*53ee8cc1Swenshuai.xi             *pbHMirror = g_pGOPCtxLocal->pGOPCtxShared->bHMirror;
1274*53ee8cc1Swenshuai.xi             *pbVMirror = g_pGOPCtxLocal->pGOPCtxShared->bVMirror;
1275*53ee8cc1Swenshuai.xi         #else
1276*53ee8cc1Swenshuai.xi             *pbHMirror = FALSE;
1277*53ee8cc1Swenshuai.xi             *pbVMirror = FALSE;
1278*53ee8cc1Swenshuai.xi         #endif
1279*53ee8cc1Swenshuai.xi     }
1280*53ee8cc1Swenshuai.xi }
1281*53ee8cc1Swenshuai.xi 
_GetGOPEnum(void * pInstance)1282*53ee8cc1Swenshuai.xi static MS_BOOL _GetGOPEnum(void* pInstance)
1283*53ee8cc1Swenshuai.xi {
1284*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1285*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1286*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1287*53ee8cc1Swenshuai.xi #endif
1288*53ee8cc1Swenshuai.xi 
1289*53ee8cc1Swenshuai.xi     memset(&GOPTYPE, 0xff, sizeof(GOP_TYPE_DEF));
1290*53ee8cc1Swenshuai.xi     return MDrv_GOP_GetGOPEnum(g_pGOPCtxLocal, &GOPTYPE);
1291*53ee8cc1Swenshuai.xi }
1292*53ee8cc1Swenshuai.xi 
1293*53ee8cc1Swenshuai.xi 
_GOP_Init_Ctx(void * pInstance,MS_BOOL * pbFirstDrvInstant)1294*53ee8cc1Swenshuai.xi static MS_BOOL _GOP_Init_Ctx(void* pInstance,MS_BOOL *pbFirstDrvInstant)
1295*53ee8cc1Swenshuai.xi {
1296*53ee8cc1Swenshuai.xi     MS_BOOL bNeedInitShared =FALSE;
1297*53ee8cc1Swenshuai.xi     MS_U16 u16LoopTime = 0x0;
1298*53ee8cc1Swenshuai.xi 
1299*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1300*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1301*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1302*53ee8cc1Swenshuai.xi #endif
1303*53ee8cc1Swenshuai.xi 
1304*53ee8cc1Swenshuai.xi     _GetGOPEnum(pInstance);
1305*53ee8cc1Swenshuai.xi 
1306*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal)
1307*53ee8cc1Swenshuai.xi     {
1308*53ee8cc1Swenshuai.xi         if(bFirstInit)
1309*53ee8cc1Swenshuai.xi         {
1310*53ee8cc1Swenshuai.xi             *pbFirstDrvInstant = TRUE;
1311*53ee8cc1Swenshuai.xi         }
1312*53ee8cc1Swenshuai.xi         else
1313*53ee8cc1Swenshuai.xi         {
1314*53ee8cc1Swenshuai.xi             *pbFirstDrvInstant = FALSE;
1315*53ee8cc1Swenshuai.xi         }
1316*53ee8cc1Swenshuai.xi 
1317*53ee8cc1Swenshuai.xi         return TRUE;
1318*53ee8cc1Swenshuai.xi     }
1319*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal = Drv_GOP_Init_Context(pInstance,&bNeedInitShared);
1320*53ee8cc1Swenshuai.xi     if(NULL == g_pGOPCtxLocal)
1321*53ee8cc1Swenshuai.xi     {
1322*53ee8cc1Swenshuai.xi         GOP_M_ERR("Error : g_pGOPCtxLocal = NULL\n");
1323*53ee8cc1Swenshuai.xi         return FALSE;
1324*53ee8cc1Swenshuai.xi     }
1325*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->bInitShared = bNeedInitShared;
1326*53ee8cc1Swenshuai.xi 
1327*53ee8cc1Swenshuai.xi     if(pbFirstDrvInstant)
1328*53ee8cc1Swenshuai.xi         *pbFirstDrvInstant = bNeedInitShared;
1329*53ee8cc1Swenshuai.xi 
1330*53ee8cc1Swenshuai.xi 
1331*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
1332*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->u32GOPClientId = (GETPIDTYPE)getpid();
1333*53ee8cc1Swenshuai.xi #else
1334*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->u32GOPClientId = ++g_pGOPCtxLocal->pGOPCtxShared->u32ClientIdAllocator;
1335*53ee8cc1Swenshuai.xi     if(0 == g_pGOPCtxLocal->u32GOPClientId)
1336*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->u32GOPClientId = ++g_pGOPCtxLocal->pGOPCtxShared->u32ClientIdAllocator;
1337*53ee8cc1Swenshuai.xi #endif
1338*53ee8cc1Swenshuai.xi 
1339*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->sMirrorInfo = NULL;
1340*53ee8cc1Swenshuai.xi     u16LoopTime = 0;
1341*53ee8cc1Swenshuai.xi     while (u16LoopTime<0xFF)
1342*53ee8cc1Swenshuai.xi     {
1343*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
1344*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->sMirrorInfo ==NULL)
1345*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->sMirrorInfo = kmalloc(g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum * sizeof(GOP_GwinMirror_Info), GFP_KERNEL);
1346*53ee8cc1Swenshuai.xi #else
1347*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->sMirrorInfo ==NULL)
1348*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->sMirrorInfo = malloc(g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum * sizeof(GOP_GwinMirror_Info));
1349*53ee8cc1Swenshuai.xi #endif
1350*53ee8cc1Swenshuai.xi 
1351*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->sMirrorInfo!=NULL)
1352*53ee8cc1Swenshuai.xi         {
1353*53ee8cc1Swenshuai.xi             break;
1354*53ee8cc1Swenshuai.xi         }
1355*53ee8cc1Swenshuai.xi         u16LoopTime++;
1356*53ee8cc1Swenshuai.xi 
1357*53ee8cc1Swenshuai.xi     }
1358*53ee8cc1Swenshuai.xi 
1359*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->sMirrorInfo==NULL)
1360*53ee8cc1Swenshuai.xi     {
1361*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nallocate memory for gwin mirror info fail!!!"));
1362*53ee8cc1Swenshuai.xi     }
1363*53ee8cc1Swenshuai.xi     else
1364*53ee8cc1Swenshuai.xi     {
1365*53ee8cc1Swenshuai.xi         memset(g_pGOPCtxLocal->sMirrorInfo, 0, g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum * sizeof(GOP_GwinMirror_Info));
1366*53ee8cc1Swenshuai.xi     }
1367*53ee8cc1Swenshuai.xi 
1368*53ee8cc1Swenshuai.xi     memset(&g_pGOPCtxLocal->sGOPConfig, 0, sizeof(GOP_Config));
1369*53ee8cc1Swenshuai.xi 
1370*53ee8cc1Swenshuai.xi     memset(g_pGOPCtxLocal->MS_MuxGop, 0, MAX_GOP_MUX_SUPPORT*sizeof(MS_U8));
1371*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->IsChgMux= FALSE;
1372*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->IsClkClosed= FALSE;
1373*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->u8ChgIpMuxGop = 0xFF;
1374*53ee8cc1Swenshuai.xi #if GOP_LOCK_SUPPORT
1375*53ee8cc1Swenshuai.xi     char GOP_MUTEX[] = "GOP_Mutex";
1376*53ee8cc1Swenshuai.xi 
1377*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPMutexCnt = 0;
1378*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPMutex = MsOS_CreateMutex(E_MSOS_FIFO, (char *)GOP_MUTEX, MSOS_PROCESS_SHARED);
1379*53ee8cc1Swenshuai.xi     if (0 > g_pGOPCtxLocal->s32GOPMutex)
1380*53ee8cc1Swenshuai.xi     {
1381*53ee8cc1Swenshuai.xi         GOP_M_ERR("%screate gop mutex fail\n", __FUNCTION__);
1382*53ee8cc1Swenshuai.xi         return FALSE;
1383*53ee8cc1Swenshuai.xi     }
1384*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPLock = -1;
1385*53ee8cc1Swenshuai.xi #endif
1386*53ee8cc1Swenshuai.xi 
1387*53ee8cc1Swenshuai.xi #if GOP_XC_LOCK_SUPPORT
1388*53ee8cc1Swenshuai.xi     char XC_MUTEX[] = "_XC_Mutex";
1389*53ee8cc1Swenshuai.xi 
1390*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPXC_MutexCnt = 0;
1391*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPXC_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, (char *)XC_MUTEX, MSOS_PROCESS_SHARED);
1392*53ee8cc1Swenshuai.xi     if (0 > g_pGOPCtxLocal->s32GOPXC_Mutex)
1393*53ee8cc1Swenshuai.xi     {
1394*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%06d] create XC mutex fail _GOPXC_Mutex=0x%x\n", __FUNCTION__, __LINE__, g_pGOPCtxLocal->s32GOPXC_Mutex);
1395*53ee8cc1Swenshuai.xi     }
1396*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPXC_Lock = -1;
1397*53ee8cc1Swenshuai.xi #endif
1398*53ee8cc1Swenshuai.xi     return TRUE;
1399*53ee8cc1Swenshuai.xi }
1400*53ee8cc1Swenshuai.xi 
1401*53ee8cc1Swenshuai.xi 
1402*53ee8cc1Swenshuai.xi 
1403*53ee8cc1Swenshuai.xi 
1404*53ee8cc1Swenshuai.xi 
_GOP_TestPattern(void * pInstance,DRV_GOP_TSTPATTERN * TstPattern)1405*53ee8cc1Swenshuai.xi static void _GOP_TestPattern(void* pInstance,DRV_GOP_TSTPATTERN *TstPattern)
1406*53ee8cc1Swenshuai.xi {
1407*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1408*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1409*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1410*53ee8cc1Swenshuai.xi #endif
1411*53ee8cc1Swenshuai.xi 
1412*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetHVDuplicate(g_pGOPCtxLocal, TstPattern->u8TSTClr_Hdup, TstPattern->u8TSTClr_Vdup);
1413*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetStartClr(g_pGOPCtxLocal,TstPattern->u8R_stc, TstPattern->u8G_stc, TstPattern->u8B_stc);
1414*53ee8cc1Swenshuai.xi 
1415*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetHInitColor(g_pGOPCtxLocal, TstPattern->u8HR_inc, TstPattern->u8HG_inc, TstPattern->u8HB_inc);
1416*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetHIncremental_Signz(g_pGOPCtxLocal,TstPattern->u8HR_inc_signz, TstPattern->u8HG_inc_signz, TstPattern->u8HB_inc_signz);
1417*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetHStep(g_pGOPCtxLocal, TstPattern->u8HR_step, TstPattern->u8HG_step, TstPattern->u8HB_step);
1418*53ee8cc1Swenshuai.xi 
1419*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetVInitColor(g_pGOPCtxLocal, TstPattern->u8VR_inc, TstPattern->u8VG_inc, TstPattern->u8VB_inc);
1420*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetVIncremental_Signz(g_pGOPCtxLocal, TstPattern->u8VR_inc_signz, TstPattern->u8VG_inc_signz, TstPattern->u8VB_inc_signz);
1421*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern_SetVStep(g_pGOPCtxLocal, TstPattern->u8VR_step, TstPattern->u8VG_step, TstPattern->u8VB_step);
1422*53ee8cc1Swenshuai.xi 
1423*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPattern(g_pGOPCtxLocal, TstPattern->bTSTClr_En, TstPattern->u8TSTClr_Alpha);
1424*53ee8cc1Swenshuai.xi 
1425*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal, 0x0);  //only gop0 has test pattern
1426*53ee8cc1Swenshuai.xi }
1427*53ee8cc1Swenshuai.xi 
1428*53ee8cc1Swenshuai.xi 
1429*53ee8cc1Swenshuai.xi 
1430*53ee8cc1Swenshuai.xi 
1431*53ee8cc1Swenshuai.xi 
1432*53ee8cc1Swenshuai.xi 
_GOP_GWIN_SetHVMirrorDRAMAddr(void * pInstance,MS_U8 u8win,MS_BOOL bHMirror,MS_BOOL bVMirror,GOP_GwinInfo * pinfo)1433*53ee8cc1Swenshuai.xi static void _GOP_GWIN_SetHVMirrorDRAMAddr(void* pInstance,MS_U8 u8win, MS_BOOL bHMirror, MS_BOOL bVMirror, GOP_GwinInfo* pinfo)
1434*53ee8cc1Swenshuai.xi {
1435*53ee8cc1Swenshuai.xi     MS_PHY u64AddrTemp=0;
1436*53ee8cc1Swenshuai.xi     MS_U8 u8Gop = 0;
1437*53ee8cc1Swenshuai.xi     APIGOP_ASSERT(pinfo, GOP_M_FATAL("\npinfo is Null\n"));
1438*53ee8cc1Swenshuai.xi 
1439*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1440*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1441*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1442*53ee8cc1Swenshuai.xi #endif
1443*53ee8cc1Swenshuai.xi 
1444*53ee8cc1Swenshuai.xi     u8Gop = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8win);
1445*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
1446*53ee8cc1Swenshuai.xi     {
1447*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
1448*53ee8cc1Swenshuai.xi         return;
1449*53ee8cc1Swenshuai.xi     }
1450*53ee8cc1Swenshuai.xi 
1451*53ee8cc1Swenshuai.xi     if(u8Gop != GOPTYPE.GOP0)
1452*53ee8cc1Swenshuai.xi     {
1453*53ee8cc1Swenshuai.xi             if(bHMirror)
1454*53ee8cc1Swenshuai.xi             {
1455*53ee8cc1Swenshuai.xi                 if(!g_pGOPCtxLocal->pGopChipProperty->bAutoAdjustMirrorHSize)
1456*53ee8cc1Swenshuai.xi                 {
1457*53ee8cc1Swenshuai.xi                     //if Vmirror is not enable, shift HRblkSize. Otherwise, Dram start will be re-calculated at v-mirror.
1458*53ee8cc1Swenshuai.xi                     if(!bVMirror)
1459*53ee8cc1Swenshuai.xi                     {
1460*53ee8cc1Swenshuai.xi                         pinfo->u32DRAMRBlkStart = pinfo->u32DRAMRBlkStart + (MS_U32)pinfo->u16RBlkHRblkSize;
1461*53ee8cc1Swenshuai.xi                     }
1462*53ee8cc1Swenshuai.xi 
1463*53ee8cc1Swenshuai.xi                     u64AddrTemp = pinfo->u32DRAMRBlkStart + (MS_U32)pinfo->u16RBlkHRblkSize;
1464*53ee8cc1Swenshuai.xi 
1465*53ee8cc1Swenshuai.xi                     if (u64AddrTemp >= MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8Gop) )
1466*53ee8cc1Swenshuai.xi                     {
1467*53ee8cc1Swenshuai.xi                         if(MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8Gop) != 1)
1468*53ee8cc1Swenshuai.xi                         {
1469*53ee8cc1Swenshuai.xi                             pinfo->u32DRAMRBlkStart = u64AddrTemp - MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8Gop);//Back to last MIU word of the line
1470*53ee8cc1Swenshuai.xi                         }
1471*53ee8cc1Swenshuai.xi                         else
1472*53ee8cc1Swenshuai.xi                         {
1473*53ee8cc1Swenshuai.xi                             pinfo->u32DRAMRBlkStart = u64AddrTemp;
1474*53ee8cc1Swenshuai.xi                         }
1475*53ee8cc1Swenshuai.xi                     }
1476*53ee8cc1Swenshuai.xi                     else
1477*53ee8cc1Swenshuai.xi                     {
1478*53ee8cc1Swenshuai.xi                         pinfo->u32DRAMRBlkStart = u64AddrTemp;
1479*53ee8cc1Swenshuai.xi                     }
1480*53ee8cc1Swenshuai.xi 
1481*53ee8cc1Swenshuai.xi                     if(pinfo->u16RBlkHRblkSize > (pinfo->u16DispHPixelEnd*_GOP_GetBPP(pInstance,pinfo->clrType)/8)) //Pitch and width not equal
1482*53ee8cc1Swenshuai.xi                     {
1483*53ee8cc1Swenshuai.xi                         pinfo->u32DRAMRBlkStart -=(pinfo->u16RBlkHRblkSize - (pinfo->u16DispHPixelEnd*_GOP_GetBPP(pInstance,pinfo->clrType)/8));
1484*53ee8cc1Swenshuai.xi                     }
1485*53ee8cc1Swenshuai.xi                 }
1486*53ee8cc1Swenshuai.xi                 else
1487*53ee8cc1Swenshuai.xi                 {
1488*53ee8cc1Swenshuai.xi                     if(pinfo->u16RBlkHRblkSize > ((pinfo->u16DispHPixelEnd - pinfo->u16DispHPixelStart)*_GOP_GetBPP(pInstance,pinfo->clrType)/8)) //Pitch and width not equal
1489*53ee8cc1Swenshuai.xi                     {
1490*53ee8cc1Swenshuai.xi                         pinfo->u32DRAMRBlkStart -= (pinfo->u16RBlkHRblkSize - ((pinfo->u16DispHPixelEnd - pinfo->u16DispHPixelStart)*_GOP_GetBPP(pInstance,pinfo->clrType)/8));
1491*53ee8cc1Swenshuai.xi                     }
1492*53ee8cc1Swenshuai.xi                 }
1493*53ee8cc1Swenshuai.xi                 SET_BIT(g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr, u8win);
1494*53ee8cc1Swenshuai.xi             }
1495*53ee8cc1Swenshuai.xi             if(bVMirror)
1496*53ee8cc1Swenshuai.xi             {
1497*53ee8cc1Swenshuai.xi                 //reg_dram_rblk_str += reg_rblk_hsize * (reg_gwin_vend - reg_gwin_vstr)
1498*53ee8cc1Swenshuai.xi                 if(!g_pGOPCtxLocal->pGOPCtxShared->b32TileMode[u8Gop])  //if tile mode, we should not change dram address
1499*53ee8cc1Swenshuai.xi                 {
1500*53ee8cc1Swenshuai.xi                     //Warning message
1501*53ee8cc1Swenshuai.xi                     if( pinfo->u16RBlkVPixSize != (pinfo->u16DispVPixelEnd-pinfo->u16DispVPixelStart))
1502*53ee8cc1Swenshuai.xi                     {
1503*53ee8cc1Swenshuai.xi                         MS_DEBUG_MSG(GOP_M_WARN("[%s][%d]Please to Check GwinInfo: u16RBlkVPixSize:0x%x not match (u16DispVPixelEnd=0x%x- u16DispVPixelStart=0x%x)\n",
1504*53ee8cc1Swenshuai.xi                             __FUNCTION__,__LINE__,pinfo->u16RBlkVPixSize, pinfo->u16DispVPixelEnd, pinfo->u16DispVPixelStart));
1505*53ee8cc1Swenshuai.xi                     }
1506*53ee8cc1Swenshuai.xi 
1507*53ee8cc1Swenshuai.xi                     if(pinfo->u16RBlkVPixSize != 0)
1508*53ee8cc1Swenshuai.xi                     {
1509*53ee8cc1Swenshuai.xi                         pinfo->u32DRAMRBlkStart += (pinfo->u16RBlkHRblkSize*(pinfo->u16RBlkVPixSize-1));
1510*53ee8cc1Swenshuai.xi                     }
1511*53ee8cc1Swenshuai.xi                     else
1512*53ee8cc1Swenshuai.xi                     {
1513*53ee8cc1Swenshuai.xi                         pinfo->u32DRAMRBlkStart += (pinfo->u16RBlkHRblkSize*(pinfo->u16DispVPixelEnd-pinfo->u16DispVPixelStart-1));
1514*53ee8cc1Swenshuai.xi                     }
1515*53ee8cc1Swenshuai.xi                     SET_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, u8win);
1516*53ee8cc1Swenshuai.xi                 }
1517*53ee8cc1Swenshuai.xi             }
1518*53ee8cc1Swenshuai.xi     }
1519*53ee8cc1Swenshuai.xi }
1520*53ee8cc1Swenshuai.xi 
_GOP_GWIN_SetTLBHVMirrorDRAMAddr(void * pInstance,MS_U8 u8win,MS_BOOL bHMirror,MS_BOOL bVMirror,GOP_GwinInfo * pinfo)1521*53ee8cc1Swenshuai.xi static void _GOP_GWIN_SetTLBHVMirrorDRAMAddr(void* pInstance,MS_U8 u8win, MS_BOOL bHMirror, MS_BOOL bVMirror, GOP_GwinInfo* pinfo)
1522*53ee8cc1Swenshuai.xi {
1523*53ee8cc1Swenshuai.xi     MS_PHY u64AddrTemp=0;
1524*53ee8cc1Swenshuai.xi     MS_U8 u8Gop = 0;
1525*53ee8cc1Swenshuai.xi     APIGOP_ASSERT(pinfo, GOP_M_FATAL("\npinfo is Null\n"));
1526*53ee8cc1Swenshuai.xi 
1527*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1528*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1529*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1530*53ee8cc1Swenshuai.xi #endif
1531*53ee8cc1Swenshuai.xi     u8Gop = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8win);
1532*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
1533*53ee8cc1Swenshuai.xi     {
1534*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
1535*53ee8cc1Swenshuai.xi         return;
1536*53ee8cc1Swenshuai.xi     }
1537*53ee8cc1Swenshuai.xi 
1538*53ee8cc1Swenshuai.xi     if(bHMirror)
1539*53ee8cc1Swenshuai.xi     {
1540*53ee8cc1Swenshuai.xi         //if Vmirror is not enable, shift HRblkSize. Otherwise, Dram start will be re-calculated at v-mirror.
1541*53ee8cc1Swenshuai.xi         if(!bVMirror)
1542*53ee8cc1Swenshuai.xi         {
1543*53ee8cc1Swenshuai.xi             pinfo->u32DRAMRBlkStart = pinfo->u32DRAMRBlkStart + (MS_U32)pinfo->u16RBlkHRblkSize;
1544*53ee8cc1Swenshuai.xi         }
1545*53ee8cc1Swenshuai.xi 
1546*53ee8cc1Swenshuai.xi         u64AddrTemp = pinfo->u32DRAMRBlkStart + (MS_U32)pinfo->u16RBlkHRblkSize;
1547*53ee8cc1Swenshuai.xi 
1548*53ee8cc1Swenshuai.xi         if (u64AddrTemp >= MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8Gop) )
1549*53ee8cc1Swenshuai.xi         {
1550*53ee8cc1Swenshuai.xi             if(MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8Gop) != 1)
1551*53ee8cc1Swenshuai.xi             {
1552*53ee8cc1Swenshuai.xi                 pinfo->u32DRAMRBlkStart = u64AddrTemp - MDrv_GOP_GetWordUnit(g_pGOPCtxLocal, u8Gop);//Back to last MIU word of the line
1553*53ee8cc1Swenshuai.xi             }
1554*53ee8cc1Swenshuai.xi             else
1555*53ee8cc1Swenshuai.xi             {
1556*53ee8cc1Swenshuai.xi                 pinfo->u32DRAMRBlkStart = u64AddrTemp;
1557*53ee8cc1Swenshuai.xi             }
1558*53ee8cc1Swenshuai.xi         }
1559*53ee8cc1Swenshuai.xi         else
1560*53ee8cc1Swenshuai.xi         {
1561*53ee8cc1Swenshuai.xi             pinfo->u32DRAMRBlkStart = u64AddrTemp;
1562*53ee8cc1Swenshuai.xi         }
1563*53ee8cc1Swenshuai.xi 
1564*53ee8cc1Swenshuai.xi         if(pinfo->u16RBlkHRblkSize > (pinfo->u16DispHPixelEnd*_GOP_GetBPP(pInstance,pinfo->clrType)/8)) //Pitch and width not equal
1565*53ee8cc1Swenshuai.xi         {
1566*53ee8cc1Swenshuai.xi             pinfo->u32DRAMRBlkStart -=(pinfo->u16RBlkHRblkSize - (pinfo->u16DispHPixelEnd*_GOP_GetBPP(pInstance,pinfo->clrType)/8));
1567*53ee8cc1Swenshuai.xi         }
1568*53ee8cc1Swenshuai.xi 
1569*53ee8cc1Swenshuai.xi 
1570*53ee8cc1Swenshuai.xi         SET_BIT(g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr, u8win);
1571*53ee8cc1Swenshuai.xi     }
1572*53ee8cc1Swenshuai.xi 
1573*53ee8cc1Swenshuai.xi     if(bVMirror)
1574*53ee8cc1Swenshuai.xi     {
1575*53ee8cc1Swenshuai.xi         //Warning message
1576*53ee8cc1Swenshuai.xi         if( pinfo->u16RBlkVPixSize != (pinfo->u16DispVPixelEnd-pinfo->u16DispVPixelStart))
1577*53ee8cc1Swenshuai.xi         {
1578*53ee8cc1Swenshuai.xi             MS_DEBUG_MSG(GOP_M_WARN("[%s][%d]Please to Check GwinInfo: u16RBlkVPixSize:0x%x not match (u16DispVPixelEnd=0x%x- u16DispVPixelStart=0x%x)\n",
1579*53ee8cc1Swenshuai.xi                 __FUNCTION__,__LINE__,pinfo->u16RBlkVPixSize, pinfo->u16DispVPixelEnd, pinfo->u16DispVPixelStart));
1580*53ee8cc1Swenshuai.xi         }
1581*53ee8cc1Swenshuai.xi         if(pinfo->u16RBlkVPixSize != 0)
1582*53ee8cc1Swenshuai.xi         {
1583*53ee8cc1Swenshuai.xi             pinfo->u32DRAMRBlkStart += (pinfo->u16RBlkHRblkSize*(pinfo->u16RBlkVPixSize-1));
1584*53ee8cc1Swenshuai.xi         }
1585*53ee8cc1Swenshuai.xi         else
1586*53ee8cc1Swenshuai.xi         {
1587*53ee8cc1Swenshuai.xi             pinfo->u32DRAMRBlkStart += (pinfo->u16RBlkHRblkSize*(pinfo->u16DispVPixelEnd-pinfo->u16DispVPixelStart-1));
1588*53ee8cc1Swenshuai.xi         }
1589*53ee8cc1Swenshuai.xi         SET_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, u8win);
1590*53ee8cc1Swenshuai.xi     }
1591*53ee8cc1Swenshuai.xi }
1592*53ee8cc1Swenshuai.xi 
GOP_GetWinInfo(void * pInstance,MS_U32 u32win,GOP_GwinInfo * pinfo)1593*53ee8cc1Swenshuai.xi MS_BOOL GOP_GetWinInfo(void* pInstance,MS_U32 u32win, GOP_GwinInfo* pinfo)
1594*53ee8cc1Swenshuai.xi {
1595*53ee8cc1Swenshuai.xi     MS_U8 u8GOP;
1596*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1597*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1598*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1599*53ee8cc1Swenshuai.xi #endif
1600*53ee8cc1Swenshuai.xi 
1601*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance, u32win))
1602*53ee8cc1Swenshuai.xi     {
1603*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32win);
1604*53ee8cc1Swenshuai.xi         return FALSE;
1605*53ee8cc1Swenshuai.xi     }
1606*53ee8cc1Swenshuai.xi     memset(pinfo, 0, sizeof(GOP_GwinInfo));
1607*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u32win);
1608*53ee8cc1Swenshuai.xi 
1609*53ee8cc1Swenshuai.xi     if(u8GOP == GOPTYPE.GOP0)
1610*53ee8cc1Swenshuai.xi     {
1611*53ee8cc1Swenshuai.xi         _GOP_GetGop0WinInfo(pInstance,u32win,  pinfo);
1612*53ee8cc1Swenshuai.xi     }
1613*53ee8cc1Swenshuai.xi     else if (u8GOP == GOPTYPE.GOP1)
1614*53ee8cc1Swenshuai.xi     {
1615*53ee8cc1Swenshuai.xi         _GOP_GetGop1WinInfo(pInstance,u32win,  pinfo);
1616*53ee8cc1Swenshuai.xi     }
1617*53ee8cc1Swenshuai.xi     else
1618*53ee8cc1Swenshuai.xi     {
1619*53ee8cc1Swenshuai.xi         _GOP_GetGop23WinInfo(pInstance,u32win, pinfo);
1620*53ee8cc1Swenshuai.xi     }
1621*53ee8cc1Swenshuai.xi 
1622*53ee8cc1Swenshuai.xi     return TRUE;
1623*53ee8cc1Swenshuai.xi }
1624*53ee8cc1Swenshuai.xi 
_SetGop0WinInfo(void * pInstance,MS_U8 u8win,GOP_GwinInfo * pinfo)1625*53ee8cc1Swenshuai.xi static void _SetGop0WinInfo(void* pInstance,MS_U8 u8win, GOP_GwinInfo* pinfo)
1626*53ee8cc1Swenshuai.xi {
1627*53ee8cc1Swenshuai.xi     DRV_GOPDstType Gop0Dst =E_DRV_GOP_DST_INVALID;
1628*53ee8cc1Swenshuai.xi     GOP_OupputColor gopOut;
1629*53ee8cc1Swenshuai.xi     MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
1630*53ee8cc1Swenshuai.xi     MS_BOOL bRIUHMirror = FALSE, bRIUVMirror = FALSE;
1631*53ee8cc1Swenshuai.xi     MS_PHY TLBMainAddr=0;
1632*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1633*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1634*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1635*53ee8cc1Swenshuai.xi #endif
1636*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, E_GOP0, &Gop0Dst);
1637*53ee8cc1Swenshuai.xi 
1638*53ee8cc1Swenshuai.xi     if (Gop0Dst ==E_DRV_GOP_DST_INVALID)
1639*53ee8cc1Swenshuai.xi     {
1640*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n Get GOP destination fail!\n"));
1641*53ee8cc1Swenshuai.xi         return;
1642*53ee8cc1Swenshuai.xi     }
1643*53ee8cc1Swenshuai.xi 
1644*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[E_GOP0])
1645*53ee8cc1Swenshuai.xi     {
1646*53ee8cc1Swenshuai.xi         if(u8win != 0)
1647*53ee8cc1Swenshuai.xi         {
1648*53ee8cc1Swenshuai.xi             GOP_M_DBUG("\n[%s] not support TLB mode, gwin id:%d ", __FUNCTION__, u8win);
1649*53ee8cc1Swenshuai.xi         }
1650*53ee8cc1Swenshuai.xi     }
1651*53ee8cc1Swenshuai.xi 
1652*53ee8cc1Swenshuai.xi     _GOP_GWIN_IsEnableMirror(pInstance,Gop0Dst, &bHMirror, &bVMirror);
1653*53ee8cc1Swenshuai.xi 
1654*53ee8cc1Swenshuai.xi     if(( Gop0Dst == E_DRV_GOP_DST_OP0) ||( Gop0Dst == E_DRV_GOP_DST_FRC) || ( Gop0Dst == E_DRV_GOP_DST_BYPASS) || ( Gop0Dst == E_DRV_GOP_DST_OP_DUAL_RATE))//GOP destination is OP
1655*53ee8cc1Swenshuai.xi     {
1656*53ee8cc1Swenshuai.xi 
1657*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP0])
1658*53ee8cc1Swenshuai.xi         {
1659*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_RGB;
1660*53ee8cc1Swenshuai.xi         }
1661*53ee8cc1Swenshuai.xi         else
1662*53ee8cc1Swenshuai.xi         {
1663*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP0];
1664*53ee8cc1Swenshuai.xi         }
1665*53ee8cc1Swenshuai.xi 
1666*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP0, gopOut);
1667*53ee8cc1Swenshuai.xi 
1668*53ee8cc1Swenshuai.xi         if ((g_pGOPCtxLocal->pGopChipProperty->bOpInterlace == TRUE) && ( Gop0Dst == E_DRV_GOP_DST_OP0))
1669*53ee8cc1Swenshuai.xi         {
1670*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, FALSE);
1671*53ee8cc1Swenshuai.xi         }
1672*53ee8cc1Swenshuai.xi         else
1673*53ee8cc1Swenshuai.xi         {
1674*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, TRUE);
1675*53ee8cc1Swenshuai.xi         }
1676*53ee8cc1Swenshuai.xi 
1677*53ee8cc1Swenshuai.xi     }
1678*53ee8cc1Swenshuai.xi     else  if( Gop0Dst == E_DRV_GOP_DST_IP0 || Gop0Dst == E_DRV_GOP_DST_IP0_SUB || Gop0Dst == E_DRV_GOP_DST_IP1 || Gop0Dst == E_DRV_GOP_DST_VOP || Gop0Dst == E_DRV_GOP_DST_VOP_SUB)//GOP destination is IP
1679*53ee8cc1Swenshuai.xi     {
1680*53ee8cc1Swenshuai.xi         MS_BOOL bInterlace = FALSE;
1681*53ee8cc1Swenshuai.xi 
1682*53ee8cc1Swenshuai.xi         MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1683*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP0])
1684*53ee8cc1Swenshuai.xi         {
1685*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_YUV;
1686*53ee8cc1Swenshuai.xi         }
1687*53ee8cc1Swenshuai.xi         else
1688*53ee8cc1Swenshuai.xi         {
1689*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP0];
1690*53ee8cc1Swenshuai.xi         }
1691*53ee8cc1Swenshuai.xi 
1692*53ee8cc1Swenshuai.xi         if( bInterlace ) //interlace mode
1693*53ee8cc1Swenshuai.xi         {
1694*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP0, gopOut);
1695*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, FALSE);
1696*53ee8cc1Swenshuai.xi         }
1697*53ee8cc1Swenshuai.xi         else    //Progressive mode
1698*53ee8cc1Swenshuai.xi         {
1699*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP0, gopOut);
1700*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, TRUE);
1701*53ee8cc1Swenshuai.xi         }
1702*53ee8cc1Swenshuai.xi     }
1703*53ee8cc1Swenshuai.xi     else    // GOP destination is VE,MVOP
1704*53ee8cc1Swenshuai.xi     {
1705*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP0])
1706*53ee8cc1Swenshuai.xi         {
1707*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_YUV;
1708*53ee8cc1Swenshuai.xi         }
1709*53ee8cc1Swenshuai.xi         else
1710*53ee8cc1Swenshuai.xi         {
1711*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP0];
1712*53ee8cc1Swenshuai.xi         }
1713*53ee8cc1Swenshuai.xi 
1714*53ee8cc1Swenshuai.xi     #if (FPGA_TEST)
1715*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, TRUE);  //progressive output in FPGA environement.
1716*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP0, DRV_GOPOUT_RGB);
1717*53ee8cc1Swenshuai.xi     #else
1718*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP0, gopOut);
1719*53ee8cc1Swenshuai.xi         if(( Gop0Dst == E_DRV_GOP_DST_MIXER2VE) || ( Gop0Dst == E_DRV_GOP_DST_MIXER2OP) || ( Gop0Dst == E_DRV_GOP_DST_DIP))
1720*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, TRUE);
1721*53ee8cc1Swenshuai.xi         else
1722*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP0, FALSE);
1723*53ee8cc1Swenshuai.xi     #endif
1724*53ee8cc1Swenshuai.xi     }
1725*53ee8cc1Swenshuai.xi 
1726*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->pGOPCtxShared->bHMirror || g_pGOPCtxLocal->pGOPCtxShared->bVMirror)
1727*53ee8cc1Swenshuai.xi     {
1728*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u64NonMirrorFBAdr = pinfo->u32DRAMRBlkStart;
1729*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[E_GOP0])
1730*53ee8cc1Swenshuai.xi         {
1731*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,u8win, bHMirror, bVMirror, pinfo);
1732*53ee8cc1Swenshuai.xi         }
1733*53ee8cc1Swenshuai.xi     }
1734*53ee8cc1Swenshuai.xi     MDrv_GOP_IsGOPMirrorEnable(g_pGOPCtxLocal ,E_GOP0, &bRIUHMirror , &bRIUVMirror);
1735*53ee8cc1Swenshuai.xi 
1736*53ee8cc1Swenshuai.xi     if(bHMirror)
1737*53ee8cc1Swenshuai.xi     {
1738*53ee8cc1Swenshuai.xi         /*save gwin postion before h mirror setting*/
1739*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHStr = pinfo->u16DispHPixelStart;
1740*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHEnd = pinfo->u16DispHPixelEnd;
1741*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorGOP0WinX = pinfo->u16WinX;
1742*53ee8cc1Swenshuai.xi 
1743*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, E_GOP0, TRUE);
1744*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_HPos, pinfo);
1745*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_X, pinfo);
1746*53ee8cc1Swenshuai.xi     }
1747*53ee8cc1Swenshuai.xi     else
1748*53ee8cc1Swenshuai.xi     {
1749*53ee8cc1Swenshuai.xi         //System is mirror, but bHMirror=FALSE, so need GOP mirror off
1750*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->pGOPCtxShared->bHMirror || (bRIUHMirror==TRUE) )
1751*53ee8cc1Swenshuai.xi         {
1752*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, E_GOP0, FALSE);
1753*53ee8cc1Swenshuai.xi         }
1754*53ee8cc1Swenshuai.xi     }
1755*53ee8cc1Swenshuai.xi     if (!(g_pGOPCtxLocal->pGOPCtxShared->bHMirror && ((Gop0Dst == E_DRV_GOP_DST_OP0)||( Gop0Dst == E_DRV_GOP_DST_FRC) ||(Gop0Dst == E_DRV_GOP_DST_BYPASS))))
1756*53ee8cc1Swenshuai.xi     {
1757*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_H_Dup)
1758*53ee8cc1Swenshuai.xi             pinfo->u16DispHPixelEnd = (pinfo->u16DispHPixelEnd<< 1) - pinfo->u16DispHPixelStart;
1759*53ee8cc1Swenshuai.xi     }
1760*53ee8cc1Swenshuai.xi 
1761*53ee8cc1Swenshuai.xi     if(bVMirror)
1762*53ee8cc1Swenshuai.xi     {
1763*53ee8cc1Swenshuai.xi        /*save gwin postion before V mirror setting*/
1764*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVStr = pinfo->u16DispVPixelStart;
1765*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVEnd = pinfo->u16DispVPixelEnd;
1766*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorGOP0WinY = pinfo->u16WinY;
1767*53ee8cc1Swenshuai.xi 
1768*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, E_GOP0, TRUE);
1769*53ee8cc1Swenshuai.xi         //SET_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, u8win);
1770*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_VPos, pinfo);
1771*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_Y, pinfo);
1772*53ee8cc1Swenshuai.xi     }
1773*53ee8cc1Swenshuai.xi     else
1774*53ee8cc1Swenshuai.xi     {
1775*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bVMirror || (bRIUVMirror==TRUE) )//System is mirror, but bHMirror=FALSE, so need GOP mirror off
1776*53ee8cc1Swenshuai.xi         {
1777*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, E_GOP0, FALSE);
1778*53ee8cc1Swenshuai.xi         }
1779*53ee8cc1Swenshuai.xi     }
1780*53ee8cc1Swenshuai.xi 
1781*53ee8cc1Swenshuai.xi     //if (!(g_pGOPCtxLocal->pGOPCtxShared->bVMirror))
1782*53ee8cc1Swenshuai.xi     {
1783*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
1784*53ee8cc1Swenshuai.xi         {
1785*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
1786*53ee8cc1Swenshuai.xi 
1787*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1788*53ee8cc1Swenshuai.xi             if( ((Gop0Dst == E_DRV_GOP_DST_IP0) || (Gop0Dst == E_DRV_GOP_DST_IP1) || (Gop0Dst == E_DRV_GOP_DST_IP0_SUB) || (Gop0Dst == E_DRV_GOP_DST_VOP) || (Gop0Dst == E_DRV_GOP_DST_VOP_SUB)) && bInterlace )
1789*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (((pinfo->u16DispVPixelEnd<<1) - pinfo->u16DispVPixelStart) / 2);
1790*53ee8cc1Swenshuai.xi             else if((Gop0Dst == E_DRV_GOP_DST_VE) || (Gop0Dst == E_DRV_GOP_DST_OP1))
1791*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (((pinfo->u16DispVPixelEnd<<1) - pinfo->u16DispVPixelStart) / 2);
1792*53ee8cc1Swenshuai.xi             else
1793*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (pinfo->u16DispVPixelEnd << 1) - pinfo->u16DispVPixelStart;
1794*53ee8cc1Swenshuai.xi         }
1795*53ee8cc1Swenshuai.xi         else
1796*53ee8cc1Swenshuai.xi         {
1797*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
1798*53ee8cc1Swenshuai.xi 
1799*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1800*53ee8cc1Swenshuai.xi             if( ((Gop0Dst == E_DRV_GOP_DST_IP0) || (Gop0Dst == E_DRV_GOP_DST_IP1) || (Gop0Dst == E_DRV_GOP_DST_IP0_SUB) || (Gop0Dst == E_DRV_GOP_DST_VOP) || (Gop0Dst == E_DRV_GOP_DST_VOP_SUB)) && bInterlace )
1801*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (pinfo->u16DispVPixelEnd - pinfo->u16DispVPixelStart) / 2;
1802*53ee8cc1Swenshuai.xi             else if((Gop0Dst == E_DRV_GOP_DST_VE) || (Gop0Dst == E_DRV_GOP_DST_OP1))
1803*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (pinfo->u16DispVPixelEnd - pinfo->u16DispVPixelStart) / 2;
1804*53ee8cc1Swenshuai.xi             else if (((Gop0Dst == E_DRV_GOP_DST_OP0) || (Gop0Dst == E_DRV_GOP_DST_FRC) || (Gop0Dst == E_DRV_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,0))
1805*53ee8cc1Swenshuai.xi             {
1806*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelStart = pinfo->u16DispVPixelStart/2;
1807*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelEnd/2;;
1808*53ee8cc1Swenshuai.xi             }
1809*53ee8cc1Swenshuai.xi         }
1810*53ee8cc1Swenshuai.xi     }
1811*53ee8cc1Swenshuai.xi 
1812*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetWinFmt(g_pGOPCtxLocal, u8win, (DRV_GOPColorType)pinfo->clrType);
1813*53ee8cc1Swenshuai.xi     //MDrv_GOP_GWIN_UpdateRegOnce(g_pGOPCtxLocal, FALSE);
1814*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[E_GOP0])
1815*53ee8cc1Swenshuai.xi     {
1816*53ee8cc1Swenshuai.xi         TLBMainAddr = (pinfo->u32DRAMRBlkStart/PAGE_SIZE)*TLB_PER_ENTRY_SIZE + g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[E_GOP0];
1817*53ee8cc1Swenshuai.xi         MDrv_GOP_SetTLBAddr(g_pGOPCtxLocal,E_GOP0,TLBMainAddr,g_pGOPCtxLocal->pGOPCtxShared->bHMirror,g_pGOPCtxLocal->pGOPCtxShared->bVMirror,(DRV_GOP_GWIN_INFO*)pinfo);
1818*53ee8cc1Swenshuai.xi         pinfo->u32DRAMRBlkStart= g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[E_GOP0] % (PAGE_SIZE*PER_MIU_TLB_ENTRY_COUNT);
1819*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetGwinInfo(g_pGOPCtxLocal, u8win, (DRV_GOP_GWIN_INFO*)pinfo);
1820*53ee8cc1Swenshuai.xi     }
1821*53ee8cc1Swenshuai.xi     else
1822*53ee8cc1Swenshuai.xi     {
1823*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetGwinInfo(g_pGOPCtxLocal, u8win, (DRV_GOP_GWIN_INFO*)pinfo);
1824*53ee8cc1Swenshuai.xi     }
1825*53ee8cc1Swenshuai.xi     GOP_M_INFO("GWIN_SetWin(%d): [adr(B), RBsz, offset] = [%td, %d, %d]\n", \
1826*53ee8cc1Swenshuai.xi                 u8win,\
1827*53ee8cc1Swenshuai.xi                 (ptrdiff_t)pinfo->u32DRAMRBlkStart,\
1828*53ee8cc1Swenshuai.xi                 pinfo->u16RBlkHPixSize * pinfo->u16RBlkVPixSize / (64/_GOP_GetBPP(pInstance,pinfo->clrType)),\
1829*53ee8cc1Swenshuai.xi                 (pinfo->u16WinY * pinfo->u16RBlkHPixSize + pinfo->u16WinX)/(64/_GOP_GetBPP(pInstance,pinfo->clrType)) );
1830*53ee8cc1Swenshuai.xi     GOP_M_INFO("\t[Vst, Vend, Hst, Hend, GwinHsz] = [%d, %d, %d, %d, %d]\n",\
1831*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelStart, \
1832*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd, \
1833*53ee8cc1Swenshuai.xi                 pinfo->u16DispHPixelStart/(64/_GOP_GetBPP(pInstance,pinfo->clrType)), \
1834*53ee8cc1Swenshuai.xi                 pinfo->u16DispHPixelEnd/(64/_GOP_GetBPP(pInstance,pinfo->clrType)),\
1835*53ee8cc1Swenshuai.xi                 pinfo->u16RBlkHPixSize/(64/_GOP_GetBPP(pInstance,pinfo->clrType)) );
1836*53ee8cc1Swenshuai.xi }
1837*53ee8cc1Swenshuai.xi 
_SetGop1WinInfo(void * pInstance,MS_U8 u8win,GOP_GwinInfo * pinfo)1838*53ee8cc1Swenshuai.xi static void _SetGop1WinInfo(void* pInstance,MS_U8 u8win, GOP_GwinInfo* pinfo)
1839*53ee8cc1Swenshuai.xi {
1840*53ee8cc1Swenshuai.xi     DRV_GOPDstType Gop1Dst =E_DRV_GOP_DST_INVALID;
1841*53ee8cc1Swenshuai.xi     GOP_OupputColor gopOut;
1842*53ee8cc1Swenshuai.xi     MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
1843*53ee8cc1Swenshuai.xi     MS_BOOL bRIUHMirror = FALSE, bRIUVMirror = FALSE;
1844*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
1845*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
1846*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
1847*53ee8cc1Swenshuai.xi #endif
1848*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, E_GOP1, &Gop1Dst);
1849*53ee8cc1Swenshuai.xi     if (Gop1Dst ==E_DRV_GOP_DST_INVALID)
1850*53ee8cc1Swenshuai.xi     {
1851*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n Get GOP destination fail!\n"));
1852*53ee8cc1Swenshuai.xi         return;
1853*53ee8cc1Swenshuai.xi     }
1854*53ee8cc1Swenshuai.xi     _GOP_GWIN_IsEnableMirror(pInstance,Gop1Dst, &bHMirror, &bVMirror);
1855*53ee8cc1Swenshuai.xi     if(( Gop1Dst == E_DRV_GOP_DST_OP0 )||( Gop1Dst == E_DRV_GOP_DST_FRC) || ( Gop1Dst == E_DRV_GOP_DST_BYPASS) || (Gop1Dst == E_DRV_GOP_DST_OP_DUAL_RATE)) //GOP destination is OP
1856*53ee8cc1Swenshuai.xi     {
1857*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP1])
1858*53ee8cc1Swenshuai.xi         {
1859*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_RGB;
1860*53ee8cc1Swenshuai.xi         }
1861*53ee8cc1Swenshuai.xi         else
1862*53ee8cc1Swenshuai.xi         {
1863*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP1];
1864*53ee8cc1Swenshuai.xi         }
1865*53ee8cc1Swenshuai.xi 
1866*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP1, gopOut);
1867*53ee8cc1Swenshuai.xi 
1868*53ee8cc1Swenshuai.xi         if ((g_pGOPCtxLocal->pGopChipProperty->bOpInterlace == TRUE) && ( Gop1Dst == E_DRV_GOP_DST_OP0))
1869*53ee8cc1Swenshuai.xi         {
1870*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, FALSE);
1871*53ee8cc1Swenshuai.xi         }
1872*53ee8cc1Swenshuai.xi         else
1873*53ee8cc1Swenshuai.xi         {
1874*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, TRUE);
1875*53ee8cc1Swenshuai.xi         }
1876*53ee8cc1Swenshuai.xi     }
1877*53ee8cc1Swenshuai.xi     else if(Gop1Dst == E_DRV_GOP_DST_IP0 || Gop1Dst == E_DRV_GOP_DST_IP0_SUB || Gop1Dst == E_DRV_GOP_DST_IP1 || Gop1Dst == E_DRV_GOP_DST_VOP || Gop1Dst == E_DRV_GOP_DST_VOP_SUB)// GOP destination is IP
1878*53ee8cc1Swenshuai.xi     {
1879*53ee8cc1Swenshuai.xi         MS_BOOL bInterlace = FALSE;
1880*53ee8cc1Swenshuai.xi 
1881*53ee8cc1Swenshuai.xi         MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1882*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP1])
1883*53ee8cc1Swenshuai.xi         {
1884*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_YUV;
1885*53ee8cc1Swenshuai.xi         }
1886*53ee8cc1Swenshuai.xi         else
1887*53ee8cc1Swenshuai.xi         {
1888*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP1];
1889*53ee8cc1Swenshuai.xi         }
1890*53ee8cc1Swenshuai.xi 
1891*53ee8cc1Swenshuai.xi         if( bInterlace ) //interlace mode
1892*53ee8cc1Swenshuai.xi         {
1893*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP1, gopOut);
1894*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, FALSE);
1895*53ee8cc1Swenshuai.xi         }
1896*53ee8cc1Swenshuai.xi         else    //Progressive mode
1897*53ee8cc1Swenshuai.xi         {
1898*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP1, gopOut);
1899*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, TRUE);
1900*53ee8cc1Swenshuai.xi         }
1901*53ee8cc1Swenshuai.xi     }
1902*53ee8cc1Swenshuai.xi     else    // GOP destination is VE,MVOP
1903*53ee8cc1Swenshuai.xi     {
1904*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[E_GOP1])
1905*53ee8cc1Swenshuai.xi         {
1906*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_YUV;
1907*53ee8cc1Swenshuai.xi         }
1908*53ee8cc1Swenshuai.xi         else
1909*53ee8cc1Swenshuai.xi         {
1910*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[1];
1911*53ee8cc1Swenshuai.xi         }
1912*53ee8cc1Swenshuai.xi 
1913*53ee8cc1Swenshuai.xi         #if(FPGA_TEST)
1914*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, TRUE);  //progressive output in FPGA environement.
1915*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP1, DRV_GOPOUT_RGB);
1916*53ee8cc1Swenshuai.xi         #else
1917*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,E_GOP1, DRV_GOPOUT_YUV);
1918*53ee8cc1Swenshuai.xi             if(( Gop1Dst == E_DRV_GOP_DST_MIXER2VE) || ( Gop1Dst == E_DRV_GOP_DST_MIXER2OP) || ( Gop1Dst == E_DRV_GOP_DST_DIP))
1919*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, TRUE);
1920*53ee8cc1Swenshuai.xi             else
1921*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, E_GOP1, FALSE);
1922*53ee8cc1Swenshuai.xi         #endif
1923*53ee8cc1Swenshuai.xi 
1924*53ee8cc1Swenshuai.xi     }
1925*53ee8cc1Swenshuai.xi 
1926*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->pGOPCtxShared->bHMirror || g_pGOPCtxLocal->pGOPCtxShared->bVMirror)
1927*53ee8cc1Swenshuai.xi     {
1928*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u64NonMirrorFBAdr = pinfo->u32DRAMRBlkStart;
1929*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,u8win, bHMirror, bVMirror, pinfo);
1930*53ee8cc1Swenshuai.xi     }
1931*53ee8cc1Swenshuai.xi 
1932*53ee8cc1Swenshuai.xi     MDrv_GOP_IsGOPMirrorEnable(g_pGOPCtxLocal ,E_GOP1, &bRIUHMirror , &bRIUVMirror);
1933*53ee8cc1Swenshuai.xi 
1934*53ee8cc1Swenshuai.xi     if(bHMirror)
1935*53ee8cc1Swenshuai.xi     {
1936*53ee8cc1Swenshuai.xi         /*save gwin postion before h mirror setting*/
1937*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHStr = pinfo->u16DispHPixelStart;
1938*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHEnd = pinfo->u16DispHPixelEnd;
1939*53ee8cc1Swenshuai.xi 
1940*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, E_GOP1, TRUE);
1941*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_HPos, pinfo);
1942*53ee8cc1Swenshuai.xi     }
1943*53ee8cc1Swenshuai.xi     else
1944*53ee8cc1Swenshuai.xi     {
1945*53ee8cc1Swenshuai.xi         if((g_pGOPCtxLocal->pGOPCtxShared->bHMirror || (bRIUHMirror==TRUE)) )//System is mirror, but bHMirror=FALSE, so need GOP mirror off
1946*53ee8cc1Swenshuai.xi         {
1947*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, E_GOP1, FALSE);
1948*53ee8cc1Swenshuai.xi         }
1949*53ee8cc1Swenshuai.xi     }
1950*53ee8cc1Swenshuai.xi 
1951*53ee8cc1Swenshuai.xi     if(bVMirror)
1952*53ee8cc1Swenshuai.xi     {
1953*53ee8cc1Swenshuai.xi         /*save gwin postion before V mirror setting*/
1954*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVStr = pinfo->u16DispVPixelStart;
1955*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVEnd = pinfo->u16DispVPixelEnd;
1956*53ee8cc1Swenshuai.xi 
1957*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, E_GOP1, TRUE);
1958*53ee8cc1Swenshuai.xi         _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_VPos, pinfo);
1959*53ee8cc1Swenshuai.xi     }
1960*53ee8cc1Swenshuai.xi     else
1961*53ee8cc1Swenshuai.xi     {
1962*53ee8cc1Swenshuai.xi         if((g_pGOPCtxLocal->pGOPCtxShared->bVMirror || (bRIUVMirror==TRUE)))//System is mirror, but bHMirror=FALSE, so need GOP mirror off
1963*53ee8cc1Swenshuai.xi         {
1964*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, E_GOP1, FALSE);
1965*53ee8cc1Swenshuai.xi         }
1966*53ee8cc1Swenshuai.xi     }
1967*53ee8cc1Swenshuai.xi 
1968*53ee8cc1Swenshuai.xi     //if (!g_pGOPCtxLocal->pGOPCtxShared->bVMirror)
1969*53ee8cc1Swenshuai.xi     {
1970*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
1971*53ee8cc1Swenshuai.xi         {
1972*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
1973*53ee8cc1Swenshuai.xi 
1974*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1975*53ee8cc1Swenshuai.xi             if( ((Gop1Dst == E_DRV_GOP_DST_IP0) || (Gop1Dst == E_DRV_GOP_DST_IP1) || (Gop1Dst == E_DRV_GOP_DST_IP0_SUB) || (Gop1Dst == E_DRV_GOP_DST_VOP) || (Gop1Dst == E_DRV_GOP_DST_VOP_SUB)) && bInterlace )
1976*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (((pinfo->u16DispVPixelEnd<<1) - pinfo->u16DispVPixelStart) / 2);
1977*53ee8cc1Swenshuai.xi             else if((Gop1Dst == E_DRV_GOP_DST_VE) || (Gop1Dst == E_DRV_GOP_DST_OP1))
1978*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (((pinfo->u16DispVPixelEnd<<1) - pinfo->u16DispVPixelStart) / 2);
1979*53ee8cc1Swenshuai.xi             else
1980*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (pinfo->u16DispVPixelEnd << 1) - pinfo->u16DispVPixelStart;
1981*53ee8cc1Swenshuai.xi         }
1982*53ee8cc1Swenshuai.xi         else
1983*53ee8cc1Swenshuai.xi         {
1984*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
1985*53ee8cc1Swenshuai.xi 
1986*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
1987*53ee8cc1Swenshuai.xi             if( ((Gop1Dst == E_DRV_GOP_DST_IP0) || (Gop1Dst == E_DRV_GOP_DST_IP1) || (Gop1Dst == E_DRV_GOP_DST_IP0_SUB) || (Gop1Dst == E_DRV_GOP_DST_VOP) || (Gop1Dst == E_DRV_GOP_DST_VOP_SUB)) && bInterlace )
1988*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (pinfo->u16DispVPixelEnd - pinfo->u16DispVPixelStart) / 2;
1989*53ee8cc1Swenshuai.xi             else if((Gop1Dst == E_DRV_GOP_DST_VE) || (Gop1Dst == E_DRV_GOP_DST_OP1))
1990*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (pinfo->u16DispVPixelEnd - pinfo->u16DispVPixelStart) / 2;
1991*53ee8cc1Swenshuai.xi             else if (((Gop1Dst == E_DRV_GOP_DST_OP0) || (Gop1Dst == E_DRV_GOP_DST_FRC) || (Gop1Dst == E_DRV_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,1))
1992*53ee8cc1Swenshuai.xi             {
1993*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelStart = pinfo->u16DispVPixelStart/2;
1994*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelEnd/2;
1995*53ee8cc1Swenshuai.xi             }
1996*53ee8cc1Swenshuai.xi         }
1997*53ee8cc1Swenshuai.xi     }
1998*53ee8cc1Swenshuai.xi 
1999*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetWinFmt(g_pGOPCtxLocal, u8win, (DRV_GOPColorType)pinfo->clrType);
2000*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetGwinInfo(g_pGOPCtxLocal, u8win, (DRV_GOP_GWIN_INFO*)pinfo);
2001*53ee8cc1Swenshuai.xi }
2002*53ee8cc1Swenshuai.xi 
_SetGop23WinInfo(void * pInstance,MS_U8 u8win,GOP_GwinInfo * pinfo)2003*53ee8cc1Swenshuai.xi static void _SetGop23WinInfo(void* pInstance,MS_U8 u8win, GOP_GwinInfo* pinfo)
2004*53ee8cc1Swenshuai.xi {
2005*53ee8cc1Swenshuai.xi     DRV_GOPDstType Gop23Dst =E_DRV_GOP_DST_INVALID;
2006*53ee8cc1Swenshuai.xi     GOP_OupputColor gopOut;
2007*53ee8cc1Swenshuai.xi     MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
2008*53ee8cc1Swenshuai.xi     MS_BOOL bRIUHMirror = FALSE, bRIUVMirror = FALSE;
2009*53ee8cc1Swenshuai.xi     MS_PHY TLBMainAddr=0;
2010*53ee8cc1Swenshuai.xi     MS_U8 u8GOP=0;
2011*53ee8cc1Swenshuai.xi     MS_U8 u8GWinBase=0;
2012*53ee8cc1Swenshuai.xi     MS_U8 i;
2013*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2014*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2015*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2016*53ee8cc1Swenshuai.xi #endif
2017*53ee8cc1Swenshuai.xi     if( !MDrv_GOP_HasGop1GPalette(g_pGOPCtxLocal) && (pinfo->clrType==E_GOP_COLOR_I8 || pinfo->clrType==E_GOP_COLOR_2266\
2018*53ee8cc1Swenshuai.xi                 ||pinfo->clrType==E_GOP_COLOR_RGB555_BLINK))
2019*53ee8cc1Swenshuai.xi     {
2020*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n[%s] not support gwin id:%d index mode", __FUNCTION__, u8win);
2021*53ee8cc1Swenshuai.xi         return;
2022*53ee8cc1Swenshuai.xi     }
2023*53ee8cc1Swenshuai.xi 
2024*53ee8cc1Swenshuai.xi     u8GOP=MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8win);
2025*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOP, &Gop23Dst);
2026*53ee8cc1Swenshuai.xi     if (Gop23Dst ==E_DRV_GOP_DST_INVALID)
2027*53ee8cc1Swenshuai.xi     {
2028*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n Get GOP destination fail!\n"));
2029*53ee8cc1Swenshuai.xi         return;
2030*53ee8cc1Swenshuai.xi     }
2031*53ee8cc1Swenshuai.xi 
2032*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP])
2033*53ee8cc1Swenshuai.xi     {
2034*53ee8cc1Swenshuai.xi         u8GWinBase=0;
2035*53ee8cc1Swenshuai.xi         for(i=0;i<u8GOP;i++)
2036*53ee8cc1Swenshuai.xi         {
2037*53ee8cc1Swenshuai.xi             u8GWinBase += MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, i);
2038*53ee8cc1Swenshuai.xi         }
2039*53ee8cc1Swenshuai.xi         if(u8win != u8GWinBase)
2040*53ee8cc1Swenshuai.xi         {
2041*53ee8cc1Swenshuai.xi             GOP_M_DBUG("\n[%s] not support TLB mode, gwin id:%d ", __FUNCTION__, u8win);
2042*53ee8cc1Swenshuai.xi         }
2043*53ee8cc1Swenshuai.xi     }
2044*53ee8cc1Swenshuai.xi     _GOP_GWIN_IsEnableMirror(pInstance,Gop23Dst, &bHMirror, &bVMirror);
2045*53ee8cc1Swenshuai.xi     if(( Gop23Dst == E_DRV_GOP_DST_OP0)||( Gop23Dst == E_DRV_GOP_DST_FRC)|| ( Gop23Dst == E_DRV_GOP_DST_BYPASS) || ( Gop23Dst == E_DRV_GOP_DST_OP_DUAL_RATE)) //GOP destination is OP
2046*53ee8cc1Swenshuai.xi     {
2047*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP])
2048*53ee8cc1Swenshuai.xi         {
2049*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_RGB;
2050*53ee8cc1Swenshuai.xi         }
2051*53ee8cc1Swenshuai.xi         else
2052*53ee8cc1Swenshuai.xi         {
2053*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP];
2054*53ee8cc1Swenshuai.xi         }
2055*53ee8cc1Swenshuai.xi 
2056*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, gopOut);
2057*53ee8cc1Swenshuai.xi 
2058*53ee8cc1Swenshuai.xi         if ((g_pGOPCtxLocal->pGopChipProperty->bOpInterlace == TRUE) && ( Gop23Dst == E_DRV_GOP_DST_OP0))
2059*53ee8cc1Swenshuai.xi         {
2060*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
2061*53ee8cc1Swenshuai.xi         }
2062*53ee8cc1Swenshuai.xi         else
2063*53ee8cc1Swenshuai.xi         {
2064*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
2065*53ee8cc1Swenshuai.xi         }
2066*53ee8cc1Swenshuai.xi     }
2067*53ee8cc1Swenshuai.xi     else  if (Gop23Dst == E_DRV_GOP_DST_IP0 || Gop23Dst==E_DRV_GOP_DST_IP0_SUB || Gop23Dst == E_DRV_GOP_DST_IP1 || Gop23Dst == E_DRV_GOP_DST_VOP || Gop23Dst == E_DRV_GOP_DST_VOP_SUB)  // GOP destination is IP
2068*53ee8cc1Swenshuai.xi     {
2069*53ee8cc1Swenshuai.xi         MS_BOOL bInterlace = FALSE;
2070*53ee8cc1Swenshuai.xi 
2071*53ee8cc1Swenshuai.xi         MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
2072*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP])
2073*53ee8cc1Swenshuai.xi         {
2074*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_YUV;
2075*53ee8cc1Swenshuai.xi         }
2076*53ee8cc1Swenshuai.xi         else
2077*53ee8cc1Swenshuai.xi         {
2078*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP];
2079*53ee8cc1Swenshuai.xi         }
2080*53ee8cc1Swenshuai.xi 
2081*53ee8cc1Swenshuai.xi         if(bInterlace) //interlace mode
2082*53ee8cc1Swenshuai.xi         {
2083*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, gopOut);
2084*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
2085*53ee8cc1Swenshuai.xi         }
2086*53ee8cc1Swenshuai.xi         else    //Progressive mode
2087*53ee8cc1Swenshuai.xi         {
2088*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, gopOut);
2089*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
2090*53ee8cc1Swenshuai.xi         }
2091*53ee8cc1Swenshuai.xi     }
2092*53ee8cc1Swenshuai.xi     else    // GOP destination is VE,MVOP
2093*53ee8cc1Swenshuai.xi     {
2094*53ee8cc1Swenshuai.xi         if((-1)==g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP])
2095*53ee8cc1Swenshuai.xi         {
2096*53ee8cc1Swenshuai.xi             gopOut = DRV_GOPOUT_YUV;
2097*53ee8cc1Swenshuai.xi         }
2098*53ee8cc1Swenshuai.xi         else
2099*53ee8cc1Swenshuai.xi         {
2100*53ee8cc1Swenshuai.xi             gopOut = (GOP_OupputColor)g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP];
2101*53ee8cc1Swenshuai.xi         }
2102*53ee8cc1Swenshuai.xi 
2103*53ee8cc1Swenshuai.xi         #if(FPGA_TEST)
2104*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);  //progressive output in FPGA environement.
2105*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, DRV_GOPOUT_RGB);
2106*53ee8cc1Swenshuai.xi         #else
2107*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, DRV_GOPOUT_YUV);
2108*53ee8cc1Swenshuai.xi             if(( Gop23Dst == E_DRV_GOP_DST_MIXER2VE) || ( Gop23Dst == E_DRV_GOP_DST_MIXER2OP) || ( Gop23Dst == E_DRV_GOP_DST_DIP))
2109*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
2110*53ee8cc1Swenshuai.xi             else
2111*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
2112*53ee8cc1Swenshuai.xi         #endif
2113*53ee8cc1Swenshuai.xi 
2114*53ee8cc1Swenshuai.xi     }
2115*53ee8cc1Swenshuai.xi 
2116*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->pGOPCtxShared->bHMirror || g_pGOPCtxLocal->pGOPCtxShared->bVMirror)
2117*53ee8cc1Swenshuai.xi     {
2118*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u64NonMirrorFBAdr = pinfo->u32DRAMRBlkStart;
2119*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP])
2120*53ee8cc1Swenshuai.xi         {
2121*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,u8win, bHMirror, bVMirror, pinfo);
2122*53ee8cc1Swenshuai.xi         }
2123*53ee8cc1Swenshuai.xi         else
2124*53ee8cc1Swenshuai.xi         {
2125*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,u8win, bHMirror, bVMirror, pinfo);
2126*53ee8cc1Swenshuai.xi         }
2127*53ee8cc1Swenshuai.xi     }
2128*53ee8cc1Swenshuai.xi 
2129*53ee8cc1Swenshuai.xi     MDrv_GOP_IsGOPMirrorEnable(g_pGOPCtxLocal ,u8GOP, &bRIUHMirror , &bRIUVMirror);
2130*53ee8cc1Swenshuai.xi 
2131*53ee8cc1Swenshuai.xi     if(bHMirror)
2132*53ee8cc1Swenshuai.xi     {
2133*53ee8cc1Swenshuai.xi         /*save gwin postion before h mirror setting*/
2134*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHStr = pinfo->u16DispHPixelStart;
2135*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorHEnd = pinfo->u16DispHPixelEnd;
2136*53ee8cc1Swenshuai.xi 
2137*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, u8GOP, TRUE);
2138*53ee8cc1Swenshuai.xi 
2139*53ee8cc1Swenshuai.xi         if(!bCursorSupport(pInstance,u8GOP))
2140*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_HPos, pinfo);
2141*53ee8cc1Swenshuai.xi     }
2142*53ee8cc1Swenshuai.xi     else
2143*53ee8cc1Swenshuai.xi     {
2144*53ee8cc1Swenshuai.xi         if((g_pGOPCtxLocal->pGOPCtxShared->bHMirror || (bRIUHMirror==TRUE)))//System is mirror, but bHMirror=FALSE, so need GOP mirror off
2145*53ee8cc1Swenshuai.xi         {
2146*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, u8GOP, FALSE);
2147*53ee8cc1Swenshuai.xi         }
2148*53ee8cc1Swenshuai.xi     }
2149*53ee8cc1Swenshuai.xi 
2150*53ee8cc1Swenshuai.xi     if(bVMirror)
2151*53ee8cc1Swenshuai.xi     {
2152*53ee8cc1Swenshuai.xi         /*save gwin postion before V mirror setting*/
2153*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVStr = pinfo->u16DispVPixelStart;
2154*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo[u8win].u16NonMirrorVEnd = pinfo->u16DispVPixelEnd;
2155*53ee8cc1Swenshuai.xi 
2156*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, u8GOP, TRUE);
2157*53ee8cc1Swenshuai.xi 
2158*53ee8cc1Swenshuai.xi         if(!bCursorSupport(pInstance,u8GOP))
2159*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetHVMirrorWinPos(pInstance,u8win, E_Set_VPos, pinfo);
2160*53ee8cc1Swenshuai.xi     }
2161*53ee8cc1Swenshuai.xi     else
2162*53ee8cc1Swenshuai.xi     {
2163*53ee8cc1Swenshuai.xi         if((g_pGOPCtxLocal->pGOPCtxShared->bVMirror || (bRIUVMirror==TRUE)))//System is mirror, but bHMirror=FALSE, so need GOP mirror off
2164*53ee8cc1Swenshuai.xi         {
2165*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, u8GOP, FALSE);
2166*53ee8cc1Swenshuai.xi         }
2167*53ee8cc1Swenshuai.xi     }
2168*53ee8cc1Swenshuai.xi 
2169*53ee8cc1Swenshuai.xi     //if (!g_pGOPCtxLocal->pGOPCtxShared->bVMirror)
2170*53ee8cc1Swenshuai.xi     {
2171*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->Gwin_V_Dup)
2172*53ee8cc1Swenshuai.xi         {
2173*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
2174*53ee8cc1Swenshuai.xi 
2175*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
2176*53ee8cc1Swenshuai.xi             if( ((Gop23Dst == E_DRV_GOP_DST_IP0) || (Gop23Dst == E_DRV_GOP_DST_IP1) || (Gop23Dst == E_DRV_GOP_DST_IP0_SUB) || (Gop23Dst == E_DRV_GOP_DST_VOP) || (Gop23Dst == E_DRV_GOP_DST_VOP_SUB)) && bInterlace )
2177*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (((pinfo->u16DispVPixelEnd<<1) - pinfo->u16DispVPixelStart) / 2);
2178*53ee8cc1Swenshuai.xi             else if((Gop23Dst == E_DRV_GOP_DST_VE) || (Gop23Dst == E_DRV_GOP_DST_OP1))
2179*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (((pinfo->u16DispVPixelEnd<<1) - pinfo->u16DispVPixelStart) / 2);
2180*53ee8cc1Swenshuai.xi             else
2181*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = (pinfo->u16DispVPixelEnd << 1) - pinfo->u16DispVPixelStart;
2182*53ee8cc1Swenshuai.xi         }
2183*53ee8cc1Swenshuai.xi         else
2184*53ee8cc1Swenshuai.xi         {
2185*53ee8cc1Swenshuai.xi             MS_BOOL bInterlace = FALSE;
2186*53ee8cc1Swenshuai.xi 
2187*53ee8cc1Swenshuai.xi             MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
2188*53ee8cc1Swenshuai.xi             if( ((Gop23Dst == E_DRV_GOP_DST_IP0) || (Gop23Dst == E_DRV_GOP_DST_IP1) || (Gop23Dst == E_DRV_GOP_DST_IP0_SUB) || (Gop23Dst == E_DRV_GOP_DST_VOP) || (Gop23Dst == E_DRV_GOP_DST_VOP_SUB)) && bInterlace )
2189*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (pinfo->u16DispVPixelEnd - pinfo->u16DispVPixelStart) / 2;
2190*53ee8cc1Swenshuai.xi             else if((Gop23Dst == E_DRV_GOP_DST_VE) || (Gop23Dst == E_DRV_GOP_DST_OP1))
2191*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelStart + (pinfo->u16DispVPixelEnd - pinfo->u16DispVPixelStart) / 2;
2192*53ee8cc1Swenshuai.xi             else if (((Gop23Dst == E_DRV_GOP_DST_OP0) || (Gop23Dst == E_DRV_GOP_DST_FRC) || (Gop23Dst == E_DRV_GOP_DST_BYPASS)) && !MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,u8GOP))
2193*53ee8cc1Swenshuai.xi             {
2194*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelStart = pinfo->u16DispVPixelStart/2;
2195*53ee8cc1Swenshuai.xi                 pinfo->u16DispVPixelEnd = pinfo->u16DispVPixelEnd/2;
2196*53ee8cc1Swenshuai.xi             }
2197*53ee8cc1Swenshuai.xi         }
2198*53ee8cc1Swenshuai.xi     }
2199*53ee8cc1Swenshuai.xi 
2200*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP])
2201*53ee8cc1Swenshuai.xi     {
2202*53ee8cc1Swenshuai.xi         TLBMainAddr = (pinfo->u32DRAMRBlkStart/PAGE_SIZE)*TLB_PER_ENTRY_SIZE + g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[u8GOP];
2203*53ee8cc1Swenshuai.xi         MDrv_GOP_SetTLBAddr(g_pGOPCtxLocal,u8GOP,TLBMainAddr,g_pGOPCtxLocal->pGOPCtxShared->bHMirror,g_pGOPCtxLocal->pGOPCtxShared->bVMirror,(DRV_GOP_GWIN_INFO*)pinfo);
2204*53ee8cc1Swenshuai.xi         pinfo->u32DRAMRBlkStart= g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[u8GOP] % (PAGE_SIZE*PER_MIU_TLB_ENTRY_COUNT);
2205*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetGwinInfo(g_pGOPCtxLocal, u8win, (DRV_GOP_GWIN_INFO*)pinfo);
2206*53ee8cc1Swenshuai.xi     }
2207*53ee8cc1Swenshuai.xi     else
2208*53ee8cc1Swenshuai.xi     {
2209*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetGwinInfo(g_pGOPCtxLocal, u8win, (DRV_GOP_GWIN_INFO*)pinfo);
2210*53ee8cc1Swenshuai.xi     }
2211*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetWinFmt(g_pGOPCtxLocal, u8win, (DRV_GOPColorType)pinfo->clrType);
2212*53ee8cc1Swenshuai.xi }
2213*53ee8cc1Swenshuai.xi 
_GOP_ArrangePoolMem(void * pInstance,GOP_FB_POOL * pFBPool)2214*53ee8cc1Swenshuai.xi static void _GOP_ArrangePoolMem(void* pInstance,GOP_FB_POOL *pFBPool)
2215*53ee8cc1Swenshuai.xi {
2216*53ee8cc1Swenshuai.xi     MS_PHY lastAddr, curStartAdr;
2217*53ee8cc1Swenshuai.xi     MS_U64 size2move, moveSize, gapSize, count;
2218*53ee8cc1Swenshuai.xi     GOP_GwinInfo gWin;
2219*53ee8cc1Swenshuai.xi     MS_PHY *src_PA,*dst_PA;
2220*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
2221*53ee8cc1Swenshuai.xi     MS_U8 u8GOP;
2222*53ee8cc1Swenshuai.xi     MS_U8 u8WinID;
2223*53ee8cc1Swenshuai.xi 
2224*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2225*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2226*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2227*53ee8cc1Swenshuai.xi #endif
2228*53ee8cc1Swenshuai.xi 
2229*53ee8cc1Swenshuai.xi     MS_U32 u32NextFBId = pFBPool->u32FirstFBIdInPool;
2230*53ee8cc1Swenshuai.xi 
2231*53ee8cc1Swenshuai.xi     memset(&gWin, 0,  sizeof(GOP_GwinInfo));
2232*53ee8cc1Swenshuai.xi 
2233*53ee8cc1Swenshuai.xi     if(0 == pFBPool->u32GWinFB_Pool_MemLen)
2234*53ee8cc1Swenshuai.xi         return;
2235*53ee8cc1Swenshuai.xi     GOP_M_INFO("Arrange GOP pool %d\n", pFBPool->poolId);
2236*53ee8cc1Swenshuai.xi     lastAddr = pFBPool->GWinFB_Pool_BaseAddr;
2237*53ee8cc1Swenshuai.xi 
2238*53ee8cc1Swenshuai.xi 
2239*53ee8cc1Swenshuai.xi     if(fpEventNotify != NULL)
2240*53ee8cc1Swenshuai.xi         fpEventNotify(E_GOP_EVENT_BUF_ARRANGE_BEGIN, NULL);
2241*53ee8cc1Swenshuai.xi     else
2242*53ee8cc1Swenshuai.xi     {
2243*53ee8cc1Swenshuai.xi         //APIGOP_ASSERT(TRUE, printf("\nfpEvenNotifyBegin is Null"));
2244*53ee8cc1Swenshuai.xi         GOP_M_INFO("%s: fpEvenNotifyBegin is not hooked. Bypass switch...\n", __FUNCTION__);
2245*53ee8cc1Swenshuai.xi     }
2246*53ee8cc1Swenshuai.xi 
2247*53ee8cc1Swenshuai.xi     while(INVALID_POOL_NEXT_FBID != u32NextFBId)
2248*53ee8cc1Swenshuai.xi     {
2249*53ee8cc1Swenshuai.xi         pwinFB = _GetWinFB(pInstance,u32NextFBId);
2250*53ee8cc1Swenshuai.xi 
2251*53ee8cc1Swenshuai.xi         if(pwinFB == NULL)
2252*53ee8cc1Swenshuai.xi         {
2253*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32NextFBId);
2254*53ee8cc1Swenshuai.xi             return;
2255*53ee8cc1Swenshuai.xi         }
2256*53ee8cc1Swenshuai.xi 
2257*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(DRV_MAX_GWIN_FB_SUPPORT>u32NextFBId, GOP_M_FATAL("\nInvalid next fbid %td", (ptrdiff_t)u32NextFBId));
2258*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(pwinFB->in_use && pwinFB->poolId==pFBPool->poolId
2259*53ee8cc1Swenshuai.xi                                 , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  fbid %td", (ptrdiff_t)u32NextFBId));
2260*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(pwinFB->addr >=  lastAddr
2261*53ee8cc1Swenshuai.xi                                 , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  fbid %td", (ptrdiff_t)u32NextFBId));
2262*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(pwinFB->addr>= pFBPool->GWinFB_Pool_BaseAddr &&
2263*53ee8cc1Swenshuai.xi                       (pwinFB->addr+pwinFB->size)<= (pFBPool->GWinFB_Pool_BaseAddr+pFBPool->u32GWinFB_Pool_MemLen)
2264*53ee8cc1Swenshuai.xi                                 , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  fbid %td", (ptrdiff_t)u32NextFBId));
2265*53ee8cc1Swenshuai.xi 
2266*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(IS_GWIN_SDRAM_ALIGN(pwinFB->addr)
2267*53ee8cc1Swenshuai.xi                       , GOP_M_FATAL("\nInvalid alignment for addr 0x%tx", (ptrdiff_t)pwinFB->addr));
2268*53ee8cc1Swenshuai.xi         if(pwinFB->addr == lastAddr)
2269*53ee8cc1Swenshuai.xi         {
2270*53ee8cc1Swenshuai.xi             lastAddr += GWIN_SDRAM_PG_ALIGN(pwinFB->size);
2271*53ee8cc1Swenshuai.xi             u32NextFBId = pwinFB->nextFBIdInPool;
2272*53ee8cc1Swenshuai.xi             continue;
2273*53ee8cc1Swenshuai.xi         }
2274*53ee8cc1Swenshuai.xi 
2275*53ee8cc1Swenshuai.xi         curStartAdr = pwinFB->addr;
2276*53ee8cc1Swenshuai.xi         gapSize = curStartAdr - lastAddr;
2277*53ee8cc1Swenshuai.xi         moveSize = count = 0;
2278*53ee8cc1Swenshuai.xi         size2move = pwinFB->size;
2279*53ee8cc1Swenshuai.xi 
2280*53ee8cc1Swenshuai.xi         while (moveSize < size2move)
2281*53ee8cc1Swenshuai.xi         {
2282*53ee8cc1Swenshuai.xi             count = (moveSize + gapSize > size2move) ? (size2move - moveSize) : gapSize;
2283*53ee8cc1Swenshuai.xi             src_PA = (MS_PHY *)MS_PA2KSEG1(curStartAdr + moveSize);
2284*53ee8cc1Swenshuai.xi             dst_PA = (MS_PHY *)MS_PA2KSEG1(lastAddr + moveSize);
2285*53ee8cc1Swenshuai.xi             memcpy(dst_PA,src_PA, count);
2286*53ee8cc1Swenshuai.xi             moveSize += count;
2287*53ee8cc1Swenshuai.xi         }
2288*53ee8cc1Swenshuai.xi 
2289*53ee8cc1Swenshuai.xi         pwinFB->addr = lastAddr;
2290*53ee8cc1Swenshuai.xi 
2291*53ee8cc1Swenshuai.xi         for (u8WinID = 0; (MS_U8)u8WinID < (MS_U8)g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum; u8WinID++)
2292*53ee8cc1Swenshuai.xi         {
2293*53ee8cc1Swenshuai.xi             if ((g_pGOPCtxLocal->pGOPCtxShared->gwinMap[(MS_U8)u8WinID].u32CurFBId ==u32NextFBId)
2294*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
2295*53ee8cc1Swenshuai.xi              && (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[(MS_U8)u8WinID].u32GOPClientId == (GETPIDTYPE)getpid())
2296*53ee8cc1Swenshuai.xi #else
2297*53ee8cc1Swenshuai.xi              && (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[(MS_U8)u8WinID].u32GOPClientId ==g_pGOPCtxLocal->u32GOPClientId)
2298*53ee8cc1Swenshuai.xi #endif
2299*53ee8cc1Swenshuai.xi             )
2300*53ee8cc1Swenshuai.xi             {
2301*53ee8cc1Swenshuai.xi                 if(GOP_GetWinInfo(pInstance,(MS_U8)u8WinID, &gWin))
2302*53ee8cc1Swenshuai.xi                 {
2303*53ee8cc1Swenshuai.xi                     gWin.u32DRAMRBlkStart = lastAddr;
2304*53ee8cc1Swenshuai.xi                     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8WinID);
2305*53ee8cc1Swenshuai.xi 
2306*53ee8cc1Swenshuai.xi                     if(u8GOP == GOPTYPE.GOP0)
2307*53ee8cc1Swenshuai.xi                     {
2308*53ee8cc1Swenshuai.xi                         _SetGop0WinInfo(pInstance,(MS_U8)u8WinID, &gWin);
2309*53ee8cc1Swenshuai.xi                     }
2310*53ee8cc1Swenshuai.xi                     else if(u8GOP == GOPTYPE.GOP1)
2311*53ee8cc1Swenshuai.xi                     {
2312*53ee8cc1Swenshuai.xi                         _SetGop1WinInfo(pInstance,(MS_U8)u8WinID, &gWin);
2313*53ee8cc1Swenshuai.xi                     }
2314*53ee8cc1Swenshuai.xi                     else
2315*53ee8cc1Swenshuai.xi                     {
2316*53ee8cc1Swenshuai.xi                         _SetGop23WinInfo(pInstance,(MS_U8)u8WinID, &gWin);
2317*53ee8cc1Swenshuai.xi                     }
2318*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
2319*53ee8cc1Swenshuai.xi                 }
2320*53ee8cc1Swenshuai.xi                 else
2321*53ee8cc1Swenshuai.xi                 {
2322*53ee8cc1Swenshuai.xi                     APIGOP_ASSERT(FALSE, GOP_M_FATAL("!!!Alert!!! Serious error in arrange pool memory\n"));
2323*53ee8cc1Swenshuai.xi                 }
2324*53ee8cc1Swenshuai.xi             }
2325*53ee8cc1Swenshuai.xi         }
2326*53ee8cc1Swenshuai.xi 
2327*53ee8cc1Swenshuai.xi     lastAddr = GWIN_SDRAM_PG_ALIGN(pwinFB->addr + pwinFB->size);
2328*53ee8cc1Swenshuai.xi     u32NextFBId = pwinFB->nextFBIdInPool;
2329*53ee8cc1Swenshuai.xi 
2330*53ee8cc1Swenshuai.xi     }
2331*53ee8cc1Swenshuai.xi 
2332*53ee8cc1Swenshuai.xi     if(fpEventNotify != NULL)
2333*53ee8cc1Swenshuai.xi         fpEventNotify(E_GOP_EVENT_BUF_ARRANGE_END, NULL);
2334*53ee8cc1Swenshuai.xi     else
2335*53ee8cc1Swenshuai.xi     {
2336*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(TRUE, GOP_M_FATAL("\nfpEvenNotifyEnd is Null"));
2337*53ee8cc1Swenshuai.xi         GOP_M_INFO("%s: fpEvenNotifyEnd is not hooked. Bypass switch...\n", __FUNCTION__);
2338*53ee8cc1Swenshuai.xi     }
2339*53ee8cc1Swenshuai.xi }
2340*53ee8cc1Swenshuai.xi 
_GOP_FreePoolMem(void * pInstance,GOP_FB_POOL * pFBPool,MS_U32 u32fbId)2341*53ee8cc1Swenshuai.xi static void _GOP_FreePoolMem(void* pInstance,GOP_FB_POOL *pFBPool, MS_U32 u32fbId)
2342*53ee8cc1Swenshuai.xi {
2343*53ee8cc1Swenshuai.xi     MS_U32 u32CurFBId, u32PreFBId;
2344*53ee8cc1Swenshuai.xi     MS_PHY lastAddr;
2345*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
2346*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pPrewinFB;
2347*53ee8cc1Swenshuai.xi 
2348*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
2349*53ee8cc1Swenshuai.xi     {
2350*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
2351*53ee8cc1Swenshuai.xi         return;
2352*53ee8cc1Swenshuai.xi     }
2353*53ee8cc1Swenshuai.xi 
2354*53ee8cc1Swenshuai.xi     u32CurFBId = pFBPool->u32FirstFBIdInPool;
2355*53ee8cc1Swenshuai.xi     u32PreFBId = INVALID_POOL_NEXT_FBID;
2356*53ee8cc1Swenshuai.xi     lastAddr = pFBPool->GWinFB_Pool_BaseAddr;
2357*53ee8cc1Swenshuai.xi 
2358*53ee8cc1Swenshuai.xi     while(INVALID_POOL_NEXT_FBID != u32CurFBId)
2359*53ee8cc1Swenshuai.xi     {
2360*53ee8cc1Swenshuai.xi         pwinFB = _GetWinFB(pInstance,u32CurFBId);
2361*53ee8cc1Swenshuai.xi 
2362*53ee8cc1Swenshuai.xi         if(pwinFB == NULL)
2363*53ee8cc1Swenshuai.xi         {
2364*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32CurFBId);
2365*53ee8cc1Swenshuai.xi             return;
2366*53ee8cc1Swenshuai.xi         }
2367*53ee8cc1Swenshuai.xi 
2368*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(DRV_MAX_GWIN_FB_SUPPORT>u32CurFBId, GOP_M_FATAL("\nInvalid next fbid %td", (ptrdiff_t)u32CurFBId));
2369*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(pwinFB->in_use && pwinFB->poolId==pFBPool->poolId
2370*53ee8cc1Swenshuai.xi                                 , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  fbid %td", (ptrdiff_t)u32CurFBId));
2371*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(pwinFB->addr >=  lastAddr
2372*53ee8cc1Swenshuai.xi                                 , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  fbid %td", (ptrdiff_t)u32CurFBId));
2373*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(pwinFB->addr>= pFBPool->GWinFB_Pool_BaseAddr &&
2374*53ee8cc1Swenshuai.xi                           (pwinFB->addr+pwinFB->size)<= (pFBPool->GWinFB_Pool_BaseAddr+pFBPool->u32GWinFB_Pool_MemLen)
2375*53ee8cc1Swenshuai.xi                                 , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  fbid %td", (ptrdiff_t)u32CurFBId));
2376*53ee8cc1Swenshuai.xi         if(u32CurFBId == u32fbId)
2377*53ee8cc1Swenshuai.xi             break;
2378*53ee8cc1Swenshuai.xi             lastAddr = pwinFB->addr+pwinFB->size;
2379*53ee8cc1Swenshuai.xi         u32PreFBId = u32CurFBId;
2380*53ee8cc1Swenshuai.xi             u32CurFBId = pwinFB->nextFBIdInPool;
2381*53ee8cc1Swenshuai.xi     }
2382*53ee8cc1Swenshuai.xi     APIGOP_ASSERT(INVALID_POOL_NEXT_FBID!=u32CurFBId, GOP_M_FATAL("\n Inconsistent pool list for %td", (ptrdiff_t)u32CurFBId));
2383*53ee8cc1Swenshuai.xi 
2384*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32CurFBId);
2385*53ee8cc1Swenshuai.xi 
2386*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
2387*53ee8cc1Swenshuai.xi     {
2388*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32CurFBId);
2389*53ee8cc1Swenshuai.xi         return;
2390*53ee8cc1Swenshuai.xi     }
2391*53ee8cc1Swenshuai.xi 
2392*53ee8cc1Swenshuai.xi     if(INVALID_POOL_NEXT_FBID == u32PreFBId)
2393*53ee8cc1Swenshuai.xi             pFBPool->u32FirstFBIdInPool =  pwinFB->nextFBIdInPool;
2394*53ee8cc1Swenshuai.xi     else
2395*53ee8cc1Swenshuai.xi     {
2396*53ee8cc1Swenshuai.xi         pPrewinFB = _GetWinFB(pInstance,u32PreFBId);
2397*53ee8cc1Swenshuai.xi 
2398*53ee8cc1Swenshuai.xi         if(pPrewinFB == NULL)
2399*53ee8cc1Swenshuai.xi         {
2400*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32PreFBId);
2401*53ee8cc1Swenshuai.xi             return;
2402*53ee8cc1Swenshuai.xi         }
2403*53ee8cc1Swenshuai.xi 
2404*53ee8cc1Swenshuai.xi         pPrewinFB->nextFBIdInPool = pwinFB->nextFBIdInPool;
2405*53ee8cc1Swenshuai.xi     }
2406*53ee8cc1Swenshuai.xi     pwinFB->nextFBIdInPool = INVALID_POOL_NEXT_FBID;
2407*53ee8cc1Swenshuai.xi 
2408*53ee8cc1Swenshuai.xi }
2409*53ee8cc1Swenshuai.xi 
_GOP_GWIN_CreatePoolFB(void * pInstance,MS_U32 u32fbId,MS_U16 dispX,MS_U16 dispY,MS_U16 width,MS_U16 height,MS_U16 fbFmt,EN_GOP_FRAMEBUFFER_STRING FBString)2410*53ee8cc1Swenshuai.xi static MS_U8 _GOP_GWIN_CreatePoolFB(void* pInstance,MS_U32 u32fbId, MS_U16 dispX, MS_U16 dispY, MS_U16 width, MS_U16 height,  MS_U16 fbFmt, EN_GOP_FRAMEBUFFER_STRING FBString)
2411*53ee8cc1Swenshuai.xi {
2412*53ee8cc1Swenshuai.xi     GOP_FB_POOL *pFBPool;
2413*53ee8cc1Swenshuai.xi     MS_U32 u32CurFBId, u32PreFBId;
2414*53ee8cc1Swenshuai.xi     MS_PHY lastAddr;
2415*53ee8cc1Swenshuai.xi     MS_U32 size;
2416*53ee8cc1Swenshuai.xi     MS_BOOL bPoolArranged = FALSE;
2417*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
2418*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pCurwinFB;
2419*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pPrewinFB;
2420*53ee8cc1Swenshuai.xi 
2421*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2422*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2423*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2424*53ee8cc1Swenshuai.xi #endif
2425*53ee8cc1Swenshuai.xi 
2426*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
2427*53ee8cc1Swenshuai.xi     {
2428*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
2429*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
2430*53ee8cc1Swenshuai.xi     }
2431*53ee8cc1Swenshuai.xi 
2432*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
2433*53ee8cc1Swenshuai.xi 
2434*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
2435*53ee8cc1Swenshuai.xi     {
2436*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
2437*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
2438*53ee8cc1Swenshuai.xi     }
2439*53ee8cc1Swenshuai.xi 
2440*53ee8cc1Swenshuai.xi     if(pwinFB->in_use)
2441*53ee8cc1Swenshuai.xi     {
2442*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_ALREADY_ALLOCATED);
2443*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is already exist\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
2444*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
2445*53ee8cc1Swenshuai.xi 
2446*53ee8cc1Swenshuai.xi     }
2447*53ee8cc1Swenshuai.xi 
2448*53ee8cc1Swenshuai.xi     switch(g_pGOPCtxLocal->pGOPCtxShared->fb_currentPoolId)
2449*53ee8cc1Swenshuai.xi     {
2450*53ee8cc1Swenshuai.xi        case GOP_WINFB_POOL1:
2451*53ee8cc1Swenshuai.xi             pFBPool = &g_pGOPCtxLocal->pGOPCtxShared->fbPool1;
2452*53ee8cc1Swenshuai.xi             break;
2453*53ee8cc1Swenshuai.xi        case GOP_WINFB_POOL2:
2454*53ee8cc1Swenshuai.xi             pFBPool = &g_pGOPCtxLocal->pGOPCtxShared->fbPool2;
2455*53ee8cc1Swenshuai.xi             break;
2456*53ee8cc1Swenshuai.xi        default:
2457*53ee8cc1Swenshuai.xi                msWarning(ERR_FB_OUT_OF_MEMORY);
2458*53ee8cc1Swenshuai.xi                return GWIN_NO_AVAILABLE;
2459*53ee8cc1Swenshuai.xi     }
2460*53ee8cc1Swenshuai.xi 
2461*53ee8cc1Swenshuai.xi TRY_AGAIN:
2462*53ee8cc1Swenshuai.xi 
2463*53ee8cc1Swenshuai.xi     u32CurFBId = pFBPool->u32FirstFBIdInPool;
2464*53ee8cc1Swenshuai.xi     u32PreFBId = INVALID_POOL_NEXT_FBID;
2465*53ee8cc1Swenshuai.xi     lastAddr = pFBPool->GWinFB_Pool_BaseAddr;
2466*53ee8cc1Swenshuai.xi 
2467*53ee8cc1Swenshuai.xi     while(INVALID_POOL_NEXT_FBID != u32CurFBId)
2468*53ee8cc1Swenshuai.xi     {
2469*53ee8cc1Swenshuai.xi         pCurwinFB = _GetWinFB(pInstance,u32CurFBId);
2470*53ee8cc1Swenshuai.xi 
2471*53ee8cc1Swenshuai.xi         if(pCurwinFB == NULL)
2472*53ee8cc1Swenshuai.xi         {
2473*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32CurFBId);
2474*53ee8cc1Swenshuai.xi             return GWIN_NO_AVAILABLE;
2475*53ee8cc1Swenshuai.xi         }
2476*53ee8cc1Swenshuai.xi 
2477*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(DRV_MAX_GWIN_FB_SUPPORT>u32CurFBId, GOP_M_FATAL("\nInvalid next u32fbId %td", (ptrdiff_t)u32CurFBId));
2478*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(pCurwinFB->in_use && pCurwinFB->poolId==pFBPool->poolId
2479*53ee8cc1Swenshuai.xi                       , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  u32fbId %td", (ptrdiff_t)u32CurFBId));
2480*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(pCurwinFB->addr >=  lastAddr
2481*53ee8cc1Swenshuai.xi                       , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  u32fbId %td", (ptrdiff_t)u32CurFBId));
2482*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(pCurwinFB->addr>= pFBPool->GWinFB_Pool_BaseAddr &&
2483*53ee8cc1Swenshuai.xi                       (pCurwinFB->addr+pCurwinFB->size)<= (pFBPool->GWinFB_Pool_BaseAddr+pFBPool->u32GWinFB_Pool_MemLen)
2484*53ee8cc1Swenshuai.xi                       , GOP_M_FATAL("\nSerious error, inconsistant Pool list at  u32fbId %td", (ptrdiff_t)u32CurFBId));
2485*53ee8cc1Swenshuai.xi         lastAddr = GWIN_SDRAM_PG_ALIGN(pCurwinFB->addr+pCurwinFB->size);
2486*53ee8cc1Swenshuai.xi         u32PreFBId = u32CurFBId;
2487*53ee8cc1Swenshuai.xi         u32CurFBId = pCurwinFB->nextFBIdInPool;
2488*53ee8cc1Swenshuai.xi 
2489*53ee8cc1Swenshuai.xi     }
2490*53ee8cc1Swenshuai.xi 
2491*53ee8cc1Swenshuai.xi     size =  _GOP_CalcPitch(pInstance,fbFmt, width)*height;
2492*53ee8cc1Swenshuai.xi 
2493*53ee8cc1Swenshuai.xi     if((pFBPool->u32GWinFB_Pool_MemLen-(lastAddr-pFBPool->GWinFB_Pool_BaseAddr)) < size)
2494*53ee8cc1Swenshuai.xi     {
2495*53ee8cc1Swenshuai.xi            if(bPoolArranged)
2496*53ee8cc1Swenshuai.xi            {
2497*53ee8cc1Swenshuai.xi               msWarning(ERR_FB_OUT_OF_MEMORY);
2498*53ee8cc1Swenshuai.xi               return GWIN_NO_AVAILABLE;
2499*53ee8cc1Swenshuai.xi             }
2500*53ee8cc1Swenshuai.xi            _GOP_ArrangePoolMem(pInstance,pFBPool);
2501*53ee8cc1Swenshuai.xi            bPoolArranged = TRUE;
2502*53ee8cc1Swenshuai.xi            goto TRY_AGAIN;
2503*53ee8cc1Swenshuai.xi     }
2504*53ee8cc1Swenshuai.xi 
2505*53ee8cc1Swenshuai.xi     pwinFB->enable = FALSE;
2506*53ee8cc1Swenshuai.xi     pwinFB->in_use = 1;
2507*53ee8cc1Swenshuai.xi     pwinFB->obtain = 1;
2508*53ee8cc1Swenshuai.xi     //g_pGOPCtxLocal->winFB[u32fbId].gWinId = gId;  // set by calling functions
2509*53ee8cc1Swenshuai.xi     pwinFB->x0 = dispX;
2510*53ee8cc1Swenshuai.xi     pwinFB->y0 = dispY;
2511*53ee8cc1Swenshuai.xi     pwinFB->width = width;
2512*53ee8cc1Swenshuai.xi     pwinFB->height= height;
2513*53ee8cc1Swenshuai.xi     pwinFB->x1 = pwinFB->x0 + pwinFB->width;
2514*53ee8cc1Swenshuai.xi     pwinFB->y1 = pwinFB->y0 + pwinFB->height;
2515*53ee8cc1Swenshuai.xi //    g_pGOPCtxLocal->winFB[u32fbId].pitch = width & 0xFFFC;//width; //(width & 0xFFF8);  // pitch must be 4-pix alignment
2516*53ee8cc1Swenshuai.xi     pwinFB->addr  = lastAddr;
2517*53ee8cc1Swenshuai.xi     pwinFB->size  = size;
2518*53ee8cc1Swenshuai.xi 
2519*53ee8cc1Swenshuai.xi     pwinFB->s_x = dispX;
2520*53ee8cc1Swenshuai.xi     pwinFB->s_y = dispY;
2521*53ee8cc1Swenshuai.xi     pwinFB->dispWidth   = width ;
2522*53ee8cc1Swenshuai.xi     pwinFB->dispHeight  = height;
2523*53ee8cc1Swenshuai.xi     pwinFB->poolId = pFBPool->poolId;
2524*53ee8cc1Swenshuai.xi     pwinFB->pitch = _GOP_CalcPitch(pInstance,fbFmt, width);
2525*53ee8cc1Swenshuai.xi 
2526*53ee8cc1Swenshuai.xi 
2527*53ee8cc1Swenshuai.xi     pCurwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GWIN_OSD_DEFAULT].u32CurFBId);
2528*53ee8cc1Swenshuai.xi 
2529*53ee8cc1Swenshuai.xi     if(pCurwinFB == NULL)
2530*53ee8cc1Swenshuai.xi     {
2531*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GWIN_OSD_DEFAULT].u32CurFBId);
2532*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
2533*53ee8cc1Swenshuai.xi     }
2534*53ee8cc1Swenshuai.xi 
2535*53ee8cc1Swenshuai.xi     // FB format
2536*53ee8cc1Swenshuai.xi     pwinFB->fbFmt  = (fbFmt != FB_FMT_AS_DEFAULT) ? fbFmt : pCurwinFB->fbFmt;
2537*53ee8cc1Swenshuai.xi 
2538*53ee8cc1Swenshuai.xi 
2539*53ee8cc1Swenshuai.xi     pwinFB->string = FBString;
2540*53ee8cc1Swenshuai.xi     pwinFB->u32GOPClientId = (GETPIDTYPE)getpid();
2541*53ee8cc1Swenshuai.xi     pwinFB->nextFBIdInPool = INVALID_POOL_NEXT_FBID;
2542*53ee8cc1Swenshuai.xi     if(INVALID_POOL_NEXT_FBID == u32PreFBId)
2543*53ee8cc1Swenshuai.xi         pFBPool->u32FirstFBIdInPool = u32fbId;
2544*53ee8cc1Swenshuai.xi     else
2545*53ee8cc1Swenshuai.xi     {
2546*53ee8cc1Swenshuai.xi         pPrewinFB = _GetWinFB(pInstance,u32PreFBId);
2547*53ee8cc1Swenshuai.xi 
2548*53ee8cc1Swenshuai.xi         if(pPrewinFB == NULL)
2549*53ee8cc1Swenshuai.xi         {
2550*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32PreFBId);
2551*53ee8cc1Swenshuai.xi             return GWIN_NO_AVAILABLE;
2552*53ee8cc1Swenshuai.xi         }
2553*53ee8cc1Swenshuai.xi 
2554*53ee8cc1Swenshuai.xi         pPrewinFB->nextFBIdInPool = u32fbId;
2555*53ee8cc1Swenshuai.xi     }
2556*53ee8cc1Swenshuai.xi      return GWIN_OK;
2557*53ee8cc1Swenshuai.xi }
2558*53ee8cc1Swenshuai.xi 
_GOP_GetPDByDst(void * pInstance,MS_U8 u8GOP_num,DRV_GOPDstType GopDst,MS_U16 * u16StrwinStr)2559*53ee8cc1Swenshuai.xi static void _GOP_GetPDByDst(void* pInstance,MS_U8 u8GOP_num, DRV_GOPDstType GopDst,MS_U16 *u16StrwinStr)
2560*53ee8cc1Swenshuai.xi {
2561*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2562*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2563*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2564*53ee8cc1Swenshuai.xi #endif
2565*53ee8cc1Swenshuai.xi     MS_BOOL bHDREnable=FALSE;
2566*53ee8cc1Swenshuai.xi 
2567*53ee8cc1Swenshuai.xi     switch(GopDst)
2568*53ee8cc1Swenshuai.xi     {
2569*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP0:
2570*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bIgnoreIPHPD)
2571*53ee8cc1Swenshuai.xi                 *u16StrwinStr = 0;
2572*53ee8cc1Swenshuai.xi             else
2573*53ee8cc1Swenshuai.xi             {
2574*53ee8cc1Swenshuai.xi                 MS_U32 u32Hstart = 0;
2575*53ee8cc1Swenshuai.xi 
2576*53ee8cc1Swenshuai.xi                 MDrv_GOP_GetIPCaptureHStart(g_pGOPCtxLocal,&u32Hstart,E_DRV_GOP_MAIN_WINDOW);
2577*53ee8cc1Swenshuai.xi                 *u16StrwinStr = u32Hstart + g_pGOPCtxLocal->pGopChipProperty->GOP_IP_PD;
2578*53ee8cc1Swenshuai.xi             }
2579*53ee8cc1Swenshuai.xi             break;
2580*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP1:
2581*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bIgnoreIP1HPD)
2582*53ee8cc1Swenshuai.xi                 *u16StrwinStr = 0;
2583*53ee8cc1Swenshuai.xi             break;
2584*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP1:
2585*53ee8cc1Swenshuai.xi             *u16StrwinStr = g_pGOPCtxLocal->pGopChipProperty->GOP_OP1_PD;
2586*53ee8cc1Swenshuai.xi             break;
2587*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP0:
2588*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_GOPScaling:
2589*53ee8cc1Swenshuai.xi             MDrv_GOP_IsHDREnabled(g_pGOPCtxLocal, &bHDREnable);
2590*53ee8cc1Swenshuai.xi             if(bHDREnable==FALSE)
2591*53ee8cc1Swenshuai.xi             {
2592*53ee8cc1Swenshuai.xi                 *u16StrwinStr = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOP_num] + g_pGOPCtxLocal->pGopChipProperty->GOP_PD;
2593*53ee8cc1Swenshuai.xi             }
2594*53ee8cc1Swenshuai.xi             else
2595*53ee8cc1Swenshuai.xi             {
2596*53ee8cc1Swenshuai.xi                 *u16StrwinStr = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOP_num] + g_pGOPCtxLocal->pGopChipProperty->GOP_HDR_OP_PD;
2597*53ee8cc1Swenshuai.xi             }
2598*53ee8cc1Swenshuai.xi             break;
2599*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_FRC:
2600*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_DIP:
2601*53ee8cc1Swenshuai.xi             *u16StrwinStr =0;
2602*53ee8cc1Swenshuai.xi             break;
2603*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_BYPASS:
2604*53ee8cc1Swenshuai.xi             *u16StrwinStr =g_pGOPCtxLocal->pGopChipProperty->GOP_Mux_FRC_offset;
2605*53ee8cc1Swenshuai.xi             break;
2606*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VOP:
2607*53ee8cc1Swenshuai.xi             *u16StrwinStr = g_pGOPCtxLocal->pGopChipProperty->GOP_MVOP_PD;
2608*53ee8cc1Swenshuai.xi             break;
2609*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2VE:
2610*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2OP:
2611*53ee8cc1Swenshuai.xi             *u16StrwinStr = g_pGOPCtxLocal->pGopChipProperty->GOP_MIXER_PD;
2612*53ee8cc1Swenshuai.xi             break;
2613*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VE:
2614*53ee8cc1Swenshuai.xi             *u16StrwinStr = g_pGOPCtxLocal->pGopChipProperty->GOP_VE_PD;
2615*53ee8cc1Swenshuai.xi             break;
2616*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP_DUAL_RATE:
2617*53ee8cc1Swenshuai.xi             *u16StrwinStr = g_pGOPCtxLocal->pGopChipProperty->GOP_DUAL_OP_PD;
2618*53ee8cc1Swenshuai.xi             break;
2619*53ee8cc1Swenshuai.xi         default:
2620*53ee8cc1Swenshuai.xi             *u16StrwinStr = g_pGOPCtxLocal->pGopChipProperty->GOP_PD;
2621*53ee8cc1Swenshuai.xi             break;
2622*53ee8cc1Swenshuai.xi    }
2623*53ee8cc1Swenshuai.xi 
2624*53ee8cc1Swenshuai.xi }
2625*53ee8cc1Swenshuai.xi 
_GOP_AdjustHSPD(void * pInstance,MS_U8 u8GOP_num,MS_U16 u16StrwinStr,DRV_GOPDstType GopDst)2626*53ee8cc1Swenshuai.xi static void _GOP_AdjustHSPD(void* pInstance,MS_U8 u8GOP_num, MS_U16 u16StrwinStr, DRV_GOPDstType GopDst)
2627*53ee8cc1Swenshuai.xi {
2628*53ee8cc1Swenshuai.xi     MS_U8 u8Offset;
2629*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2630*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2631*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2632*53ee8cc1Swenshuai.xi #endif
2633*53ee8cc1Swenshuai.xi 
2634*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP_num))
2635*53ee8cc1Swenshuai.xi     {
2636*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP_num);
2637*53ee8cc1Swenshuai.xi         return;
2638*53ee8cc1Swenshuai.xi     }
2639*53ee8cc1Swenshuai.xi 
2640*53ee8cc1Swenshuai.xi     switch(GopDst)
2641*53ee8cc1Swenshuai.xi     {
2642*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_IP0:
2643*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_DIP:
2644*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_IP1:
2645*53ee8cc1Swenshuai.xi         u8Offset = 0;
2646*53ee8cc1Swenshuai.xi         break;
2647*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_MIXER2VE:
2648*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_MIXER2OP:
2649*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_VE:
2650*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_FRC:
2651*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGopChipProperty->bIgnoreVEHPD)
2652*53ee8cc1Swenshuai.xi                 u8Offset = 0;
2653*53ee8cc1Swenshuai.xi             else
2654*53ee8cc1Swenshuai.xi                 u8Offset = MDrv_GOP_GetHPipeOfst(g_pGOPCtxLocal,u8GOP_num, GopDst);
2655*53ee8cc1Swenshuai.xi         break;
2656*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_OP0:
2657*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_VOP:
2658*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_BYPASS:
2659*53ee8cc1Swenshuai.xi     case E_DRV_GOP_DST_OP_DUAL_RATE:
2660*53ee8cc1Swenshuai.xi     default:
2661*53ee8cc1Swenshuai.xi         u8Offset = MDrv_GOP_GetHPipeOfst(g_pGOPCtxLocal,u8GOP_num, GopDst);
2662*53ee8cc1Swenshuai.xi         break;
2663*53ee8cc1Swenshuai.xi     }
2664*53ee8cc1Swenshuai.xi 
2665*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetHSPipe(g_pGOPCtxLocal, u8GOP_num, u8Offset+u16StrwinStr);
2666*53ee8cc1Swenshuai.xi }
2667*53ee8cc1Swenshuai.xi 
_GOP_InitHSPDByGOP(void * pInstance,MS_U8 u8GOP_num)2668*53ee8cc1Swenshuai.xi static void _GOP_InitHSPDByGOP(void* pInstance,MS_U8 u8GOP_num)
2669*53ee8cc1Swenshuai.xi {
2670*53ee8cc1Swenshuai.xi     MS_U16 u16StrwinStr=0;
2671*53ee8cc1Swenshuai.xi     DRV_GOPDstType GopDst = E_DRV_GOP_DST_OP0;
2672*53ee8cc1Swenshuai.xi 
2673*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2674*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2675*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2676*53ee8cc1Swenshuai.xi #endif
2677*53ee8cc1Swenshuai.xi 
2678*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP_num))
2679*53ee8cc1Swenshuai.xi     {
2680*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP_num);
2681*53ee8cc1Swenshuai.xi         return;
2682*53ee8cc1Swenshuai.xi     }
2683*53ee8cc1Swenshuai.xi 
2684*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOP_num, &GopDst);
2685*53ee8cc1Swenshuai.xi     _GOP_GetPDByDst(pInstance,u8GOP_num, GopDst,&u16StrwinStr);
2686*53ee8cc1Swenshuai.xi     _GOP_AdjustHSPD(pInstance,u8GOP_num, u16StrwinStr, GopDst);
2687*53ee8cc1Swenshuai.xi }
2688*53ee8cc1Swenshuai.xi 
2689*53ee8cc1Swenshuai.xi 
2690*53ee8cc1Swenshuai.xi 
_IsGopInMux0(void * pInstance,MS_U8 u8GopNum)2691*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInMux0(void* pInstance,MS_U8 u8GopNum)
2692*53ee8cc1Swenshuai.xi {
2693*53ee8cc1Swenshuai.xi     MS_U8 GetGopNum=0;
2694*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2695*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2696*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2697*53ee8cc1Swenshuai.xi #endif
2698*53ee8cc1Swenshuai.xi 
2699*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, E_GOP_MUX0);
2700*53ee8cc1Swenshuai.xi 
2701*53ee8cc1Swenshuai.xi     if (u8GopNum == GetGopNum)
2702*53ee8cc1Swenshuai.xi     {
2703*53ee8cc1Swenshuai.xi         return TRUE;
2704*53ee8cc1Swenshuai.xi     }
2705*53ee8cc1Swenshuai.xi     else
2706*53ee8cc1Swenshuai.xi     {
2707*53ee8cc1Swenshuai.xi         return FALSE;
2708*53ee8cc1Swenshuai.xi     }
2709*53ee8cc1Swenshuai.xi }
_IsGopInMux1(void * pInstance,MS_U8 u8GopNum)2710*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInMux1(void* pInstance,MS_U8 u8GopNum)
2711*53ee8cc1Swenshuai.xi {
2712*53ee8cc1Swenshuai.xi     MS_U8 GetGopNum=0;
2713*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2714*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2715*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2716*53ee8cc1Swenshuai.xi #endif
2717*53ee8cc1Swenshuai.xi 
2718*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, E_GOP_MUX1);
2719*53ee8cc1Swenshuai.xi     if (u8GopNum==GetGopNum)
2720*53ee8cc1Swenshuai.xi     {
2721*53ee8cc1Swenshuai.xi         return TRUE;
2722*53ee8cc1Swenshuai.xi     }
2723*53ee8cc1Swenshuai.xi     return FALSE;
2724*53ee8cc1Swenshuai.xi }
_IsGopInMux2(void * pInstance,MS_U8 u8GopNum)2725*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInMux2(void* pInstance,MS_U8 u8GopNum)
2726*53ee8cc1Swenshuai.xi {
2727*53ee8cc1Swenshuai.xi     MS_U8 GetGopNum=0;
2728*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2729*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2730*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2731*53ee8cc1Swenshuai.xi #endif
2732*53ee8cc1Swenshuai.xi 
2733*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, E_GOP_MUX2);
2734*53ee8cc1Swenshuai.xi 
2735*53ee8cc1Swenshuai.xi     if (u8GopNum == GetGopNum)
2736*53ee8cc1Swenshuai.xi     {
2737*53ee8cc1Swenshuai.xi         return TRUE;
2738*53ee8cc1Swenshuai.xi     }
2739*53ee8cc1Swenshuai.xi     return FALSE;
2740*53ee8cc1Swenshuai.xi }
_IsGopInMux3(void * pInstance,MS_U8 u8GopNum)2741*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInMux3(void* pInstance,MS_U8 u8GopNum)
2742*53ee8cc1Swenshuai.xi {
2743*53ee8cc1Swenshuai.xi     MS_U8 GetGopNum=0;
2744*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2745*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2746*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2747*53ee8cc1Swenshuai.xi #endif
2748*53ee8cc1Swenshuai.xi 
2749*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, E_GOP_MUX3);
2750*53ee8cc1Swenshuai.xi     if (u8GopNum==GetGopNum)
2751*53ee8cc1Swenshuai.xi     {
2752*53ee8cc1Swenshuai.xi         return TRUE;
2753*53ee8cc1Swenshuai.xi     }
2754*53ee8cc1Swenshuai.xi     return FALSE;
2755*53ee8cc1Swenshuai.xi }
2756*53ee8cc1Swenshuai.xi 
_IsGopInMux0To2(void * pInstance,MS_U8 u8GopNum)2757*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInMux0To2(void* pInstance,MS_U8 u8GopNum)
2758*53ee8cc1Swenshuai.xi {
2759*53ee8cc1Swenshuai.xi     if (_IsGopInMux0(pInstance,u8GopNum) || _IsGopInMux1(pInstance,u8GopNum) || _IsGopInMux2(pInstance,u8GopNum))
2760*53ee8cc1Swenshuai.xi     {
2761*53ee8cc1Swenshuai.xi         return TRUE;
2762*53ee8cc1Swenshuai.xi     }
2763*53ee8cc1Swenshuai.xi     return FALSE;
2764*53ee8cc1Swenshuai.xi }
2765*53ee8cc1Swenshuai.xi 
_IsGopInMux0To3(void * pInstance,MS_U8 u8GopNum)2766*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInMux0To3(void* pInstance,MS_U8 u8GopNum)
2767*53ee8cc1Swenshuai.xi {
2768*53ee8cc1Swenshuai.xi     if (_IsGopInMux0(pInstance,u8GopNum) || _IsGopInMux1(pInstance,u8GopNum) || _IsGopInMux2(pInstance,u8GopNum) || _IsGopInMux3(pInstance,u8GopNum))
2769*53ee8cc1Swenshuai.xi     {
2770*53ee8cc1Swenshuai.xi         return TRUE;
2771*53ee8cc1Swenshuai.xi     }
2772*53ee8cc1Swenshuai.xi     return FALSE;
2773*53ee8cc1Swenshuai.xi }
2774*53ee8cc1Swenshuai.xi 
_GetNonUseOPMux(void * pInstance)2775*53ee8cc1Swenshuai.xi static Gop_MuxSel _GetNonUseOPMux(void* pInstance)
2776*53ee8cc1Swenshuai.xi {
2777*53ee8cc1Swenshuai.xi     MS_S8 i;
2778*53ee8cc1Swenshuai.xi     MS_U8 GetGopNum = 0;
2779*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2780*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2781*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2782*53ee8cc1Swenshuai.xi #endif
2783*53ee8cc1Swenshuai.xi     for (i=MAX_GOP_MUX_OPNum-1; i>=0; i--)
2784*53ee8cc1Swenshuai.xi     {
2785*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, (Gop_MuxSel)i);
2786*53ee8cc1Swenshuai.xi         if (GetGopNum == 0x7)
2787*53ee8cc1Swenshuai.xi             return (Gop_MuxSel)i;
2788*53ee8cc1Swenshuai.xi     }
2789*53ee8cc1Swenshuai.xi     return MAX_GOP_MUX_SUPPORT;
2790*53ee8cc1Swenshuai.xi }
2791*53ee8cc1Swenshuai.xi 
_GetNonUseDualOPMux(void * pInstance)2792*53ee8cc1Swenshuai.xi static Gop_MuxSel _GetNonUseDualOPMux(void* pInstance)
2793*53ee8cc1Swenshuai.xi {
2794*53ee8cc1Swenshuai.xi     MS_S8 i;
2795*53ee8cc1Swenshuai.xi     MS_U8 GetGopNum = 0;
2796*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2797*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2798*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2799*53ee8cc1Swenshuai.xi #endif
2800*53ee8cc1Swenshuai.xi     for (i=E_GOP_DUALRATE_OP_MUX0; i<=E_GOP_DUALRATE_OP_MUX2; i++)
2801*53ee8cc1Swenshuai.xi     {
2802*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, (Gop_MuxSel)i);
2803*53ee8cc1Swenshuai.xi         if (GetGopNum == MAX_GOP_DualMUX_Num)
2804*53ee8cc1Swenshuai.xi             return (Gop_MuxSel)i;
2805*53ee8cc1Swenshuai.xi     }
2806*53ee8cc1Swenshuai.xi     return MAX_GOP_MUX_SUPPORT;
2807*53ee8cc1Swenshuai.xi }
2808*53ee8cc1Swenshuai.xi 
_GOP_Get_StretchWin(void * pInstance,MS_U8 gop,MS_U16 * x,MS_U16 * y,MS_U16 * w,MS_U16 * h)2809*53ee8cc1Swenshuai.xi static void _GOP_Get_StretchWin(void* pInstance,MS_U8 gop,MS_U16 *x,MS_U16 *y,MS_U16 *w,MS_U16 *h)
2810*53ee8cc1Swenshuai.xi {
2811*53ee8cc1Swenshuai.xi     DRV_GOPDstType eDstType = E_DRV_GOP_DST_INVALID;
2812*53ee8cc1Swenshuai.xi 
2813*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2814*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2815*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2816*53ee8cc1Swenshuai.xi #endif
2817*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Get_StretchWin(g_pGOPCtxLocal, gop, x, y, w, h);
2818*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal,gop, &eDstType);
2819*53ee8cc1Swenshuai.xi 
2820*53ee8cc1Swenshuai.xi     if((eDstType == E_DRV_GOP_DST_IP0) || (eDstType == E_DRV_GOP_DST_IP1))
2821*53ee8cc1Swenshuai.xi     {
2822*53ee8cc1Swenshuai.xi         MS_BOOL bInterlace = FALSE;
2823*53ee8cc1Swenshuai.xi 
2824*53ee8cc1Swenshuai.xi         MDrv_GOP_GetIPInterlace(g_pGOPCtxLocal,&bInterlace,E_DRV_GOP_MAIN_WINDOW);
2825*53ee8cc1Swenshuai.xi         if( bInterlace )
2826*53ee8cc1Swenshuai.xi         {
2827*53ee8cc1Swenshuai.xi             (*h) *=2;
2828*53ee8cc1Swenshuai.xi             (*y) = (*y)*2;
2829*53ee8cc1Swenshuai.xi         }
2830*53ee8cc1Swenshuai.xi     }
2831*53ee8cc1Swenshuai.xi     else if(eDstType == E_DRV_GOP_DST_VE)
2832*53ee8cc1Swenshuai.xi     {
2833*53ee8cc1Swenshuai.xi         (*h) *=2;
2834*53ee8cc1Swenshuai.xi         (*y) = ((*y)*2) - g_pGOPCtxLocal->pGopChipProperty->GOP_VE_V_Offset;
2835*53ee8cc1Swenshuai.xi     }
2836*53ee8cc1Swenshuai.xi     else if(eDstType == E_DRV_GOP_DST_OP1)
2837*53ee8cc1Swenshuai.xi     {
2838*53ee8cc1Swenshuai.xi         (*h) *=2;
2839*53ee8cc1Swenshuai.xi         (*y) = ((*y)*2);
2840*53ee8cc1Swenshuai.xi     }
2841*53ee8cc1Swenshuai.xi     if((eDstType == E_DRV_GOP_DST_OP0) || (eDstType == E_DRV_GOP_DST_FRC) || (eDstType == E_DRV_GOP_DST_BYPASS))
2842*53ee8cc1Swenshuai.xi     {
2843*53ee8cc1Swenshuai.xi         if (!MDrv_GOP_GWIN_IsProgressive(g_pGOPCtxLocal,gop))
2844*53ee8cc1Swenshuai.xi         {
2845*53ee8cc1Swenshuai.xi             (*h) *=2;
2846*53ee8cc1Swenshuai.xi             (*y) = (*y)*2;
2847*53ee8cc1Swenshuai.xi         }
2848*53ee8cc1Swenshuai.xi     }
2849*53ee8cc1Swenshuai.xi }
2850*53ee8cc1Swenshuai.xi 
_GOP_SetOCCapability(void * pInstance,MS_U8 u8GOP,DRV_GOPDstType GopDst)2851*53ee8cc1Swenshuai.xi static void _GOP_SetOCCapability(void* pInstance,MS_U8 u8GOP, DRV_GOPDstType GopDst)
2852*53ee8cc1Swenshuai.xi {
2853*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2854*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2855*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2856*53ee8cc1Swenshuai.xi #endif
2857*53ee8cc1Swenshuai.xi 
2858*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
2859*53ee8cc1Swenshuai.xi     {
2860*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
2861*53ee8cc1Swenshuai.xi         return;
2862*53ee8cc1Swenshuai.xi     }
2863*53ee8cc1Swenshuai.xi 
2864*53ee8cc1Swenshuai.xi     switch(GopDst)
2865*53ee8cc1Swenshuai.xi     {
2866*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP0:
2867*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, FALSE);
2868*53ee8cc1Swenshuai.xi             MDrv_GOP_OC_SetOCEn(g_pGOPCtxLocal, u8GOP, FALSE);
2869*53ee8cc1Swenshuai.xi             break;
2870*53ee8cc1Swenshuai.xi 
2871*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VOP:
2872*53ee8cc1Swenshuai.xi             MDrv_GOP_OC_SetOCEn(g_pGOPCtxLocal, u8GOP, FALSE);
2873*53ee8cc1Swenshuai.xi             break;
2874*53ee8cc1Swenshuai.xi 
2875*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP0:
2876*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_BYPASS:
2877*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_GOPScaling:
2878*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP_DUAL_RATE:
2879*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, TRUE);
2880*53ee8cc1Swenshuai.xi             MDrv_GOP_OC_SetOCEn(g_pGOPCtxLocal, u8GOP, FALSE);
2881*53ee8cc1Swenshuai.xi             break;
2882*53ee8cc1Swenshuai.xi 
2883*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_FRC:
2884*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, TRUE);
2885*53ee8cc1Swenshuai.xi             MDrv_GOP_OC_SetOCEn(g_pGOPCtxLocal, u8GOP, TRUE);
2886*53ee8cc1Swenshuai.xi             break;
2887*53ee8cc1Swenshuai.xi 
2888*53ee8cc1Swenshuai.xi         default:
2889*53ee8cc1Swenshuai.xi             break;
2890*53ee8cc1Swenshuai.xi       }
2891*53ee8cc1Swenshuai.xi 
2892*53ee8cc1Swenshuai.xi }
2893*53ee8cc1Swenshuai.xi 
2894*53ee8cc1Swenshuai.xi #if (DUMP_INFO)
2895*53ee8cc1Swenshuai.xi static void _GOP_GWIN_UpdateAllInfo(void* pInstance,)
2896*53ee8cc1Swenshuai.xi {
2897*53ee8cc1Swenshuai.xi     MS_U8 u8Index = 0,u16Index = 0;
2898*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
2899*53ee8cc1Swenshuai.xi 
2900*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2901*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2902*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2903*53ee8cc1Swenshuai.xi #endif
2904*53ee8cc1Swenshuai.xi     GOP_M_INFO("GwinNo.         CurFBId         IsShared        SharedCnt       ClientId\n");
2905*53ee8cc1Swenshuai.xi     GOP_M_INFO("========================================================================\n");
2906*53ee8cc1Swenshuai.xi     for (u8Index=0; u8Index<(MS_U8)g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum; u8Index++)
2907*53ee8cc1Swenshuai.xi     {
2908*53ee8cc1Swenshuai.xi         GOP_M_INFO("%02d\t\t%04ld\t\t%02d\t\t%04d\t\t%04ld\n",u8Index,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8Index].u32CurFBId,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8Index].bIsShared ,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8Index].u16SharedCnt,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8Index].u32GOPClientId);
2909*53ee8cc1Swenshuai.xi     }
2910*53ee8cc1Swenshuai.xi     GOP_M_INFO("========================================================================\n");
2911*53ee8cc1Swenshuai.xi     GOP_M_INFO("FbNo.   in_use  addr            size            widthxheight    pitch   fmt  ClientId\n");
2912*53ee8cc1Swenshuai.xi     GOP_M_INFO("===========================================================================\n");
2913*53ee8cc1Swenshuai.xi     for (u16Index=0; u16Index<DRV_MAX_GWIN_FB_SUPPORT; u16Index++)
2914*53ee8cc1Swenshuai.xi     {
2915*53ee8cc1Swenshuai.xi         pwinFB = _GetWinFB(pInstance,u16Index);
2916*53ee8cc1Swenshuai.xi         if(pwinFB)
2917*53ee8cc1Swenshuai.xi         {
2918*53ee8cc1Swenshuai.xi             GOP_M_INFO("[%02d]\t%02d\t%08lx\t%08lx\t%04d x %04d\t%04d\t%02d\t%04ld\n",u16Index,pwinFB->in_use,pwinFB->addr,pwinFB->size,pwinFB->width,pwinFB->height,pwinFB->pitch,pwinFB->fbFmt,pwinFB->u32GOPClientId);
2919*53ee8cc1Swenshuai.xi         }
2920*53ee8cc1Swenshuai.xi     }
2921*53ee8cc1Swenshuai.xi     GOP_M_INFO("===========================================================================\n");
2922*53ee8cc1Swenshuai.xi }
2923*53ee8cc1Swenshuai.xi #endif
2924*53ee8cc1Swenshuai.xi 
GOP_FB_Destroy(void * pInstance,MS_U32 u32fbId)2925*53ee8cc1Swenshuai.xi static MS_U32 GOP_FB_Destroy(void* pInstance,MS_U32 u32fbId)
2926*53ee8cc1Swenshuai.xi {
2927*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
2928*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2929*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2930*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2931*53ee8cc1Swenshuai.xi #endif
2932*53ee8cc1Swenshuai.xi 
2933*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
2934*53ee8cc1Swenshuai.xi 
2935*53ee8cc1Swenshuai.xi 
2936*53ee8cc1Swenshuai.xi     switch(pwinFB->poolId)
2937*53ee8cc1Swenshuai.xi     {
2938*53ee8cc1Swenshuai.xi         case GOP_WINFB_POOL1:
2939*53ee8cc1Swenshuai.xi           _GOP_FreePoolMem(pInstance,&g_pGOPCtxLocal->pGOPCtxShared->fbPool1, u32fbId);
2940*53ee8cc1Swenshuai.xi             break;
2941*53ee8cc1Swenshuai.xi         case GOP_WINFB_POOL2:
2942*53ee8cc1Swenshuai.xi           _GOP_FreePoolMem(pInstance,&g_pGOPCtxLocal->pGOPCtxShared->fbPool1, u32fbId);
2943*53ee8cc1Swenshuai.xi             break;
2944*53ee8cc1Swenshuai.xi         default:
2945*53ee8cc1Swenshuai.xi             break;
2946*53ee8cc1Swenshuai.xi     }
2947*53ee8cc1Swenshuai.xi 
2948*53ee8cc1Swenshuai.xi     pwinFB->poolId = GOP_WINFB_POOL_NULL;
2949*53ee8cc1Swenshuai.xi     pwinFB->enable = FALSE;
2950*53ee8cc1Swenshuai.xi     pwinFB->in_use = 0;
2951*53ee8cc1Swenshuai.xi     pwinFB->obtain = 0;
2952*53ee8cc1Swenshuai.xi     pwinFB->x0 = 0;
2953*53ee8cc1Swenshuai.xi     pwinFB->y0 = 0;
2954*53ee8cc1Swenshuai.xi     pwinFB->x1 = 0;
2955*53ee8cc1Swenshuai.xi     pwinFB->y1 = 0;
2956*53ee8cc1Swenshuai.xi 
2957*53ee8cc1Swenshuai.xi     pwinFB->gWinId = GWIN_ID_INVALID;
2958*53ee8cc1Swenshuai.xi     pwinFB->width = 0;
2959*53ee8cc1Swenshuai.xi     pwinFB->height= 0;
2960*53ee8cc1Swenshuai.xi     pwinFB->pitch = 0;
2961*53ee8cc1Swenshuai.xi     pwinFB->fbFmt =0;
2962*53ee8cc1Swenshuai.xi     pwinFB->addr  = 0;
2963*53ee8cc1Swenshuai.xi     pwinFB->size  = 0;
2964*53ee8cc1Swenshuai.xi     pwinFB->dispHeight = 0;
2965*53ee8cc1Swenshuai.xi     pwinFB->dispWidth  = 0;
2966*53ee8cc1Swenshuai.xi     pwinFB->s_x = 0;
2967*53ee8cc1Swenshuai.xi     pwinFB->s_y = 0;
2968*53ee8cc1Swenshuai.xi     pwinFB->string = E_GOP_FB_NULL;
2969*53ee8cc1Swenshuai.xi     pwinFB->u32GOPClientId = INVALID_CLIENT_PID;
2970*53ee8cc1Swenshuai.xi 
2971*53ee8cc1Swenshuai.xi     return GWIN_OK;
2972*53ee8cc1Swenshuai.xi }
2973*53ee8cc1Swenshuai.xi 
GOP_SetWinInfo(void * pInstance,MS_U32 u32Gwin,GOP_GwinInfo * pinfo)2974*53ee8cc1Swenshuai.xi static MS_U32 GOP_SetWinInfo(void* pInstance,MS_U32 u32Gwin, GOP_GwinInfo* pinfo)
2975*53ee8cc1Swenshuai.xi {
2976*53ee8cc1Swenshuai.xi     MS_U8 u8GOP;
2977*53ee8cc1Swenshuai.xi 
2978*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
2979*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
2980*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
2981*53ee8cc1Swenshuai.xi #endif
2982*53ee8cc1Swenshuai.xi 
2983*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u32Gwin))
2984*53ee8cc1Swenshuai.xi     {
2985*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n[%s] not support gwin id:%td in this chip version", __FUNCTION__, (ptrdiff_t)u32Gwin);
2986*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
2987*53ee8cc1Swenshuai.xi     }
2988*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u32Gwin);
2989*53ee8cc1Swenshuai.xi 
2990*53ee8cc1Swenshuai.xi 
2991*53ee8cc1Swenshuai.xi     switch(u8GOP)
2992*53ee8cc1Swenshuai.xi     {
2993*53ee8cc1Swenshuai.xi         case E_GOP0:
2994*53ee8cc1Swenshuai.xi             _SetGop0WinInfo(pInstance,u32Gwin, pinfo);
2995*53ee8cc1Swenshuai.xi             break;
2996*53ee8cc1Swenshuai.xi         case E_GOP1:
2997*53ee8cc1Swenshuai.xi             _SetGop1WinInfo(pInstance,u32Gwin, pinfo);
2998*53ee8cc1Swenshuai.xi             break;
2999*53ee8cc1Swenshuai.xi         case E_GOP2:
3000*53ee8cc1Swenshuai.xi         case E_GOP3:
3001*53ee8cc1Swenshuai.xi         case E_GOP4:
3002*53ee8cc1Swenshuai.xi         case E_GOP5:
3003*53ee8cc1Swenshuai.xi             _SetGop23WinInfo(pInstance,u32Gwin, pinfo);
3004*53ee8cc1Swenshuai.xi             break;
3005*53ee8cc1Swenshuai.xi         default:
3006*53ee8cc1Swenshuai.xi             break;
3007*53ee8cc1Swenshuai.xi     }
3008*53ee8cc1Swenshuai.xi 
3009*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
3010*53ee8cc1Swenshuai.xi 
3011*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3012*53ee8cc1Swenshuai.xi }
3013*53ee8cc1Swenshuai.xi 
GOP_Win_Destroy(void * pInstance,MS_U32 gId)3014*53ee8cc1Swenshuai.xi static MS_U32 GOP_Win_Destroy(void* pInstance,MS_U32 gId)
3015*53ee8cc1Swenshuai.xi {
3016*53ee8cc1Swenshuai.xi     MS_U32 u32fbId;
3017*53ee8cc1Swenshuai.xi     GOP_GwinInfo gWin;
3018*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
3019*53ee8cc1Swenshuai.xi     MS_U8 u8GOP,u8MIU;
3020*53ee8cc1Swenshuai.xi 
3021*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3022*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3023*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3024*53ee8cc1Swenshuai.xi #endif
3025*53ee8cc1Swenshuai.xi 
3026*53ee8cc1Swenshuai.xi     GOP_M_INFO("\33[0;36m   %s:%d   gId = %td \33[m \n",__FUNCTION__,__LINE__,(ptrdiff_t)gId);
3027*53ee8cc1Swenshuai.xi 
3028*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gId))
3029*53ee8cc1Swenshuai.xi     {
3030*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gId);
3031*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
3032*53ee8cc1Swenshuai.xi     }
3033*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,gId))
3034*53ee8cc1Swenshuai.xi     {
3035*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is not exist\n",__FUNCTION__,__LINE__,(ptrdiff_t)gId);
3036*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
3037*53ee8cc1Swenshuai.xi     }
3038*53ee8cc1Swenshuai.xi 
3039*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, gId, FALSE);
3040*53ee8cc1Swenshuai.xi     u32fbId = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId;
3041*53ee8cc1Swenshuai.xi 
3042*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
3043*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
3044*53ee8cc1Swenshuai.xi     {
3045*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
3046*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
3047*53ee8cc1Swenshuai.xi     }
3048*53ee8cc1Swenshuai.xi 
3049*53ee8cc1Swenshuai.xi     if ((GOP_WINFB_POOL_NULL!=pwinFB->poolId) && (GOP_FB_Destroy(pInstance,u32fbId) != GWIN_OK))
3050*53ee8cc1Swenshuai.xi     {
3051*53ee8cc1Swenshuai.xi         MS_DEBUG_MSG( GOP_M_ERR( "[%s][%d], failed to delete FB %td\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId ) );
3052*53ee8cc1Swenshuai.xi 
3053*53ee8cc1Swenshuai.xi     }
3054*53ee8cc1Swenshuai.xi 
3055*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId= GWIN_ID_INVALID;
3056*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32GOPClientId = 0;
3057*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].bIsShared = FALSE;
3058*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u16SharedCnt = 0;
3059*53ee8cc1Swenshuai.xi 
3060*53ee8cc1Swenshuai.xi     memset(&gWin, 0, sizeof(GOP_GwinInfo));
3061*53ee8cc1Swenshuai.xi     gWin.clrType = E_GOP_COLOR_ARGB8888;
3062*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,(gId));
3063*53ee8cc1Swenshuai.xi     u8MIU = MDrv_GOP_Get_MIU_Sel(g_pGOPCtxLocal,u8GOP);
3064*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP] != TRUE)
3065*53ee8cc1Swenshuai.xi     {
3066*53ee8cc1Swenshuai.xi         _miu_offset_to_phy(u8MIU,gWin.u32DRAMRBlkStart,gWin.u32DRAMRBlkStart);
3067*53ee8cc1Swenshuai.xi     }
3068*53ee8cc1Swenshuai.xi     GOP_SetWinInfo(pInstance,gId,&gWin);
3069*53ee8cc1Swenshuai.xi 
3070*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, gId);
3071*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr, gId);
3072*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_HMirror_HPos, gId);
3073*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_VMirror_VPos, gId);
3074*53ee8cc1Swenshuai.xi 
3075*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_ClearFlipQueue(g_pGOPCtxLocal,gId);
3076*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3077*53ee8cc1Swenshuai.xi }
3078*53ee8cc1Swenshuai.xi 
3079*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
GOP_AtExit(void * pInstance)3080*53ee8cc1Swenshuai.xi static void GOP_AtExit(void* pInstance)
3081*53ee8cc1Swenshuai.xi {
3082*53ee8cc1Swenshuai.xi     MS_U32 u32TempID=0, u32GWinFBID=DRV_MAX_GWIN_FB_SUPPORT;
3083*53ee8cc1Swenshuai.xi     MS_U32 u32CurPID = (GETPIDTYPE)getpid();
3084*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet = GOP_API_FAIL;
3085*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
3086*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3087*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3088*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3089*53ee8cc1Swenshuai.xi #endif
3090*53ee8cc1Swenshuai.xi 
3091*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal ==NULL)
3092*53ee8cc1Swenshuai.xi     {
3093*53ee8cc1Swenshuai.xi         return;
3094*53ee8cc1Swenshuai.xi     }
3095*53ee8cc1Swenshuai.xi 
3096*53ee8cc1Swenshuai.xi #if GOP_LOCK_SUPPORT
3097*53ee8cc1Swenshuai.xi     GOP_M_INFO("---%s %d: PID[%tu], TID[%td] exited, MutexCnt=%d\n", __FUNCTION__, __LINE__, (ptrdiff_t)u32CurPID, (ptrdiff_t)MsOS_GetOSThreadID(), g_pGOPCtxLocal->s32GOPMutexCnt);
3098*53ee8cc1Swenshuai.xi #else
3099*53ee8cc1Swenshuai.xi     GOP_M_INFO("---%s %d: PID[%tu], TID[%td] exited\n", __FUNCTION__, __LINE__, (ptrdiff_t)u32CurPID, (ptrdiff_t)MsOS_GetOSThreadID());
3100*53ee8cc1Swenshuai.xi #endif
3101*53ee8cc1Swenshuai.xi     for(u32TempID=0; u32TempID < g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum; u32TempID++)
3102*53ee8cc1Swenshuai.xi     {
3103*53ee8cc1Swenshuai.xi         //Check and release APP's GWIN resource
3104*53ee8cc1Swenshuai.xi         if(((FALSE == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32TempID].bIsShared)
3105*53ee8cc1Swenshuai.xi              && (DRV_MAX_GWIN_FB_SUPPORT>g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32TempID].u32CurFBId)
3106*53ee8cc1Swenshuai.xi              && (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32TempID].u32GOPClientId==u32CurPID))
3107*53ee8cc1Swenshuai.xi              || ((TRUE == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32TempID].bIsShared)
3108*53ee8cc1Swenshuai.xi                   && (0x0 == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32TempID].u16SharedCnt)))
3109*53ee8cc1Swenshuai.xi 
3110*53ee8cc1Swenshuai.xi         {
3111*53ee8cc1Swenshuai.xi             u32GWinFBID = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32TempID].u32CurFBId;
3112*53ee8cc1Swenshuai.xi             enRet = (E_GOP_API_Result)GOP_Win_Destroy(pInstance,u32TempID);
3113*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n---%s %d: Try DestroyWIN[%tu], return[%u]\n", __FUNCTION__, __LINE__, (ptrdiff_t)u32TempID, (MS_U8)enRet);
3114*53ee8cc1Swenshuai.xi             enRet = (E_GOP_API_Result)GOP_FB_Destroy(pInstance,u32GWinFBID);
3115*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n---%s %d: Try DestroyWIN's FB[%tu], return[%u]\n", __FUNCTION__, __LINE__, (ptrdiff_t)u32GWinFBID, (MS_U8)enRet);
3116*53ee8cc1Swenshuai.xi         }
3117*53ee8cc1Swenshuai.xi     }
3118*53ee8cc1Swenshuai.xi 
3119*53ee8cc1Swenshuai.xi 
3120*53ee8cc1Swenshuai.xi     for(u32TempID=0; u32TempID < DRV_MAX_GWIN_FB_SUPPORT; u32TempID++)
3121*53ee8cc1Swenshuai.xi     {
3122*53ee8cc1Swenshuai.xi         pwinFB = _GetWinFB(pInstance,u32TempID);
3123*53ee8cc1Swenshuai.xi         // Check and release APP1's un-maped FB resource
3124*53ee8cc1Swenshuai.xi         // Note: If this APP1's FB is currently mapped to GWIN, means this FB is used by APP2
3125*53ee8cc1Swenshuai.xi         if(  (pwinFB->u32GOPClientId == u32CurPID)
3126*53ee8cc1Swenshuai.xi            &&(pwinFB->gWinId == GWIN_ID_INVALID))
3127*53ee8cc1Swenshuai.xi         {
3128*53ee8cc1Swenshuai.xi             enRet = (E_GOP_API_Result)GOP_Win_Destroy(pInstance,u32TempID);
3129*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n---%s %d: Try DestroyFB[%tu], return[%u]\n", __FUNCTION__, __LINE__,(ptrdiff_t)u32TempID, (MS_U8)enRet);
3130*53ee8cc1Swenshuai.xi         }
3131*53ee8cc1Swenshuai.xi     }
3132*53ee8cc1Swenshuai.xi 
3133*53ee8cc1Swenshuai.xi #if GOP_LOCK_SUPPORT
3134*53ee8cc1Swenshuai.xi 
3135*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->s32GOPMutexCnt > 0)
3136*53ee8cc1Swenshuai.xi     {
3137*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->s32GOPMutexCnt = 0;
3138*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(g_pGOPCtxLocal->s32GOPMutex);
3139*53ee8cc1Swenshuai.xi     }
3140*53ee8cc1Swenshuai.xi #endif
3141*53ee8cc1Swenshuai.xi 
3142*53ee8cc1Swenshuai.xi #if GOP_XC_LOCK_SUPPORT
3143*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->s32GOPXC_MutexCnt > 0)
3144*53ee8cc1Swenshuai.xi     {
3145*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->s32GOPXC_MutexCnt = 0;
3146*53ee8cc1Swenshuai.xi         MsOS_ReleaseMutex(g_pGOPCtxLocal->s32GOPXC_Mutex);
3147*53ee8cc1Swenshuai.xi     }
3148*53ee8cc1Swenshuai.xi #endif
3149*53ee8cc1Swenshuai.xi }
3150*53ee8cc1Swenshuai.xi #endif
3151*53ee8cc1Swenshuai.xi 
GOP_PreInit_Ctx(void * pInstance,MS_BOOL * pbFirstDrvInstant)3152*53ee8cc1Swenshuai.xi static MS_BOOL GOP_PreInit_Ctx(void* pInstance,MS_BOOL *pbFirstDrvInstant)
3153*53ee8cc1Swenshuai.xi {
3154*53ee8cc1Swenshuai.xi    MS_BOOL bNeedInitShared =FALSE;
3155*53ee8cc1Swenshuai.xi    MS_U16 u16LoopTime = 0x0;
3156*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3157*53ee8cc1Swenshuai.xi    GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3158*53ee8cc1Swenshuai.xi    UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3159*53ee8cc1Swenshuai.xi #endif
3160*53ee8cc1Swenshuai.xi 
3161*53ee8cc1Swenshuai.xi    _GetGOPEnum(pInstance);
3162*53ee8cc1Swenshuai.xi 
3163*53ee8cc1Swenshuai.xi    if(g_pGOPCtxLocal)
3164*53ee8cc1Swenshuai.xi    {
3165*53ee8cc1Swenshuai.xi         if(bFirstInit)
3166*53ee8cc1Swenshuai.xi         {
3167*53ee8cc1Swenshuai.xi             *pbFirstDrvInstant = TRUE;
3168*53ee8cc1Swenshuai.xi         }
3169*53ee8cc1Swenshuai.xi         else
3170*53ee8cc1Swenshuai.xi         {
3171*53ee8cc1Swenshuai.xi             *pbFirstDrvInstant = FALSE;
3172*53ee8cc1Swenshuai.xi         }
3173*53ee8cc1Swenshuai.xi 
3174*53ee8cc1Swenshuai.xi         return TRUE;
3175*53ee8cc1Swenshuai.xi    }
3176*53ee8cc1Swenshuai.xi    g_pGOPCtxLocal = Drv_GOP_Init_Context(pInstance,&bNeedInitShared);
3177*53ee8cc1Swenshuai.xi    if(NULL == g_pGOPCtxLocal)
3178*53ee8cc1Swenshuai.xi          return FALSE;
3179*53ee8cc1Swenshuai.xi    if(pbFirstDrvInstant)
3180*53ee8cc1Swenshuai.xi        *pbFirstDrvInstant = bNeedInitShared;
3181*53ee8cc1Swenshuai.xi 
3182*53ee8cc1Swenshuai.xi    g_pGOPCtxLocal->pGOPCtxShared->bDummyInit = bNeedInitShared;
3183*53ee8cc1Swenshuai.xi 
3184*53ee8cc1Swenshuai.xi #if 0
3185*53ee8cc1Swenshuai.xi    if(bNeedInitShared)
3186*53ee8cc1Swenshuai.xi    {
3187*53ee8cc1Swenshuai.xi         MS_U32 gId;
3188*53ee8cc1Swenshuai.xi 
3189*53ee8cc1Swenshuai.xi         u16LoopTime = 0;
3190*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->gwinMap = NULL;
3191*53ee8cc1Swenshuai.xi         while (u16LoopTime<0xFF)
3192*53ee8cc1Swenshuai.xi         {
3193*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->gwinMap = malloc(MDrv_GOP_GetTotalGwinNum(g_pGOPCtxLocal)*sizeof(GWIN_MAP));
3194*53ee8cc1Swenshuai.xi             if (g_pGOPCtxLocal->pGOPCtxShared->gwinMap!=NULL)
3195*53ee8cc1Swenshuai.xi             {
3196*53ee8cc1Swenshuai.xi                 break;
3197*53ee8cc1Swenshuai.xi             }
3198*53ee8cc1Swenshuai.xi             u16LoopTime++;
3199*53ee8cc1Swenshuai.xi         }
3200*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->pGOPCtxShared->gwinMap!=NULL)
3201*53ee8cc1Swenshuai.xi         {
3202*53ee8cc1Swenshuai.xi             for( gId=0; gId<MApi_GOP_GWIN_GetTotalGwinNum(); gId++)
3203*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId= GWIN_ID_INVALID;
3204*53ee8cc1Swenshuai.xi         }
3205*53ee8cc1Swenshuai.xi         else
3206*53ee8cc1Swenshuai.xi         {
3207*53ee8cc1Swenshuai.xi             printf("\n[%s]allocate memory for gwinMap info fail!!!!!!!", __FUNCTION__);
3208*53ee8cc1Swenshuai.xi         }
3209*53ee8cc1Swenshuai.xi 
3210*53ee8cc1Swenshuai.xi         u16LoopTime = 0;
3211*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType = NULL;
3212*53ee8cc1Swenshuai.xi         while (u16LoopTime<0xFF)
3213*53ee8cc1Swenshuai.xi         {
3214*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType = malloc(MApi_GOP_GWIN_GetMaxGOPNum()*sizeof(MS_S32));
3215*53ee8cc1Swenshuai.xi             if (g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType!=NULL)
3216*53ee8cc1Swenshuai.xi             {
3217*53ee8cc1Swenshuai.xi                 break;
3218*53ee8cc1Swenshuai.xi             }
3219*53ee8cc1Swenshuai.xi             u16LoopTime++;
3220*53ee8cc1Swenshuai.xi         }
3221*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType!=NULL)
3222*53ee8cc1Swenshuai.xi         {
3223*53ee8cc1Swenshuai.xi             for( gId=0; gId<MApi_GOP_GWIN_GetMaxGOPNum(); gId++)
3224*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[gId] = -1;
3225*53ee8cc1Swenshuai.xi         }
3226*53ee8cc1Swenshuai.xi         else
3227*53ee8cc1Swenshuai.xi         {
3228*53ee8cc1Swenshuai.xi             printf("\n[%s]allocate memory for s32OutputColorType info fail!!!!!!!", __FUNCTION__);
3229*53ee8cc1Swenshuai.xi         }
3230*53ee8cc1Swenshuai.xi    }
3231*53ee8cc1Swenshuai.xi #endif
3232*53ee8cc1Swenshuai.xi 
3233*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
3234*53ee8cc1Swenshuai.xi    g_pGOPCtxLocal->u32GOPClientId = (GETPIDTYPE)getpid();
3235*53ee8cc1Swenshuai.xi #else
3236*53ee8cc1Swenshuai.xi    g_pGOPCtxLocal->u32GOPClientId = ++g_pGOPCtxLocal->pGOPCtxShared->u32ClientIdAllocator;
3237*53ee8cc1Swenshuai.xi    if(0 == g_pGOPCtxLocal->u32GOPClientId)
3238*53ee8cc1Swenshuai.xi        g_pGOPCtxLocal->u32GOPClientId = ++g_pGOPCtxLocal->pGOPCtxShared->u32ClientIdAllocator;
3239*53ee8cc1Swenshuai.xi #endif
3240*53ee8cc1Swenshuai.xi 
3241*53ee8cc1Swenshuai.xi    g_pGOPCtxLocal->sMirrorInfo = NULL;
3242*53ee8cc1Swenshuai.xi    u16LoopTime = 0;
3243*53ee8cc1Swenshuai.xi    while (u16LoopTime<0xFF)
3244*53ee8cc1Swenshuai.xi    {
3245*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
3246*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->sMirrorInfo ==NULL)
3247*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo = kmalloc(g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum * sizeof(GOP_GwinMirror_Info), GFP_KERNEL);
3248*53ee8cc1Swenshuai.xi #else
3249*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->sMirrorInfo ==NULL)
3250*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sMirrorInfo = malloc(g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum * sizeof(GOP_GwinMirror_Info));
3251*53ee8cc1Swenshuai.xi #endif
3252*53ee8cc1Swenshuai.xi 
3253*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->sMirrorInfo!=NULL)
3254*53ee8cc1Swenshuai.xi         {
3255*53ee8cc1Swenshuai.xi             break;
3256*53ee8cc1Swenshuai.xi         }
3257*53ee8cc1Swenshuai.xi         u16LoopTime++;
3258*53ee8cc1Swenshuai.xi 
3259*53ee8cc1Swenshuai.xi    }
3260*53ee8cc1Swenshuai.xi 
3261*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->sMirrorInfo==NULL)
3262*53ee8cc1Swenshuai.xi     {
3263*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n [%s][%d]allocate memory for gwin mirror info fail!!!",__FUNCTION__,__LINE__));
3264*53ee8cc1Swenshuai.xi     }
3265*53ee8cc1Swenshuai.xi     else
3266*53ee8cc1Swenshuai.xi     {
3267*53ee8cc1Swenshuai.xi         memset(g_pGOPCtxLocal->sMirrorInfo, 0, g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum * sizeof(GOP_GwinMirror_Info));
3268*53ee8cc1Swenshuai.xi     }
3269*53ee8cc1Swenshuai.xi 
3270*53ee8cc1Swenshuai.xi     memset(&g_pGOPCtxLocal->sGOPConfig, 0, sizeof(GOP_Config));
3271*53ee8cc1Swenshuai.xi 
3272*53ee8cc1Swenshuai.xi     memset(g_pGOPCtxLocal->MS_MuxGop, 0, MAX_GOP_MUX_SUPPORT*sizeof(MS_U8));
3273*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->IsChgMux= FALSE;
3274*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->IsClkClosed= FALSE;
3275*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->u8ChgIpMuxGop = 0xFF;
3276*53ee8cc1Swenshuai.xi #if GOP_LOCK_SUPPORT
3277*53ee8cc1Swenshuai.xi     char GOP_MUTEX[] = "GOP_Mutex";
3278*53ee8cc1Swenshuai.xi 
3279*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPMutexCnt = 0;
3280*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPMutex = MsOS_CreateMutex(E_MSOS_FIFO, (char *)GOP_MUTEX, MSOS_PROCESS_SHARED);
3281*53ee8cc1Swenshuai.xi     if (0 > g_pGOPCtxLocal->s32GOPMutex)
3282*53ee8cc1Swenshuai.xi     {
3283*53ee8cc1Swenshuai.xi             GOP_M_ERR("%s %d create gop mutex fail\n", __FUNCTION__,__LINE__);
3284*53ee8cc1Swenshuai.xi             return FALSE;
3285*53ee8cc1Swenshuai.xi     }
3286*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPLock = -1;
3287*53ee8cc1Swenshuai.xi #endif
3288*53ee8cc1Swenshuai.xi 
3289*53ee8cc1Swenshuai.xi #if GOP_XC_LOCK_SUPPORT
3290*53ee8cc1Swenshuai.xi     char XC_MUTEX[] = "_XC_Mutex";
3291*53ee8cc1Swenshuai.xi 
3292*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPXC_MutexCnt = 0;
3293*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPXC_Mutex = MsOS_CreateMutex(E_MSOS_FIFO, (char *)XC_MUTEX, MSOS_PROCESS_SHARED);
3294*53ee8cc1Swenshuai.xi     if (0 > g_pGOPCtxLocal->s32GOPXC_Mutex)
3295*53ee8cc1Swenshuai.xi     {
3296*53ee8cc1Swenshuai.xi         GOP_M_INFO("[%s][%06d] create XC mutex fail _GOPXC_Mutex=0x%lx\n", __FUNCTION__, __LINE__, g_pGOPCtxLocal->s32GOPXC_Mutex);
3297*53ee8cc1Swenshuai.xi     }
3298*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->s32GOPXC_Lock = -1;
3299*53ee8cc1Swenshuai.xi #endif
3300*53ee8cc1Swenshuai.xi 
3301*53ee8cc1Swenshuai.xi    return TRUE;
3302*53ee8cc1Swenshuai.xi }
3303*53ee8cc1Swenshuai.xi 
3304*53ee8cc1Swenshuai.xi 
GOP_MapFB2Win(void * pInstance,MS_U32 u32fbId,MS_U32 GwinId)3305*53ee8cc1Swenshuai.xi MS_U32 GOP_MapFB2Win(void* pInstance,MS_U32 u32fbId, MS_U32 GwinId)
3306*53ee8cc1Swenshuai.xi {
3307*53ee8cc1Swenshuai.xi     GOP_GwinInfo  gWin;
3308*53ee8cc1Swenshuai.xi     MS_U32 u32Temp;
3309*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
3310*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB2;
3311*53ee8cc1Swenshuai.xi 
3312*53ee8cc1Swenshuai.xi     MS_BOOL         bAFBC_Enable=FALSE;
3313*53ee8cc1Swenshuai.xi     MS_U8           u8GOP=0;
3314*53ee8cc1Swenshuai.xi     DRV_GOP_AFBC_Info  sAFBCWinProperty;
3315*53ee8cc1Swenshuai.xi     EN_DRV_GOP_AFBC_CNTL eAFBC_cmd=E_DRV_GOP_AFBC_MAX;
3316*53ee8cc1Swenshuai.xi     memset(&sAFBCWinProperty, 0, sizeof(DRV_GOP_AFBC_Info));
3317*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3318*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3319*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3320*53ee8cc1Swenshuai.xi #endif
3321*53ee8cc1Swenshuai.xi 
3322*53ee8cc1Swenshuai.xi     if (u32fbId >= DRV_MAX_GWIN_FB_SUPPORT)
3323*53ee8cc1Swenshuai.xi     {
3324*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_OUT_OF_RANGE);
3325*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]: fbId max already reached! FBId: %td, winId: %td\n",__FUNCTION__, __LINE__, (ptrdiff_t)u32fbId, (ptrdiff_t)GwinId);
3326*53ee8cc1Swenshuai.xi         return (GOP_API_FAIL);
3327*53ee8cc1Swenshuai.xi     }
3328*53ee8cc1Swenshuai.xi 
3329*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,GwinId))
3330*53ee8cc1Swenshuai.xi     {
3331*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n[%s][%d] not support gwin id:%td in this chip version",__FUNCTION__, __LINE__, (ptrdiff_t)GwinId);
3332*53ee8cc1Swenshuai.xi         return (GOP_API_FAIL);
3333*53ee8cc1Swenshuai.xi     }
3334*53ee8cc1Swenshuai.xi     memset(&gWin, 0, sizeof(GOP_GwinInfo));
3335*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
3336*53ee8cc1Swenshuai.xi 
3337*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
3338*53ee8cc1Swenshuai.xi     {
3339*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
3340*53ee8cc1Swenshuai.xi         return (GOP_API_FAIL);
3341*53ee8cc1Swenshuai.xi     }
3342*53ee8cc1Swenshuai.xi     //Add support to Map a Non-Created Gwin with a dedicated FB:
3343*53ee8cc1Swenshuai.xi     if(!_GOP_GWIN_IsGwinCreated(pInstance,GwinId))
3344*53ee8cc1Swenshuai.xi     {
3345*53ee8cc1Swenshuai.xi         //Create GWin for The client:
3346*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GwinId].u32CurFBId = u32fbId;
3347*53ee8cc1Swenshuai.xi 
3348*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
3349*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GwinId].u32GOPClientId= (GETPIDTYPE)getpid();
3350*53ee8cc1Swenshuai.xi #else
3351*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GwinId].u32GOPClientId= g_pGOPCtxLocal->u32GOPClientId;
3352*53ee8cc1Swenshuai.xi #endif
3353*53ee8cc1Swenshuai.xi 
3354*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, GwinId, FALSE);
3355*53ee8cc1Swenshuai.xi 
3356*53ee8cc1Swenshuai.xi         pwinFB->enable = TRUE;
3357*53ee8cc1Swenshuai.xi     }
3358*53ee8cc1Swenshuai.xi     u32Temp = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GwinId].u32CurFBId;
3359*53ee8cc1Swenshuai.xi     if (DRV_MAX_GWIN_FB_SUPPORT > u32Temp)
3360*53ee8cc1Swenshuai.xi     {
3361*53ee8cc1Swenshuai.xi         pwinFB2 = _GetWinFB(pInstance,u32Temp);
3362*53ee8cc1Swenshuai.xi 
3363*53ee8cc1Swenshuai.xi         if(pwinFB2 == NULL)
3364*53ee8cc1Swenshuai.xi         {
3365*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32Temp);
3366*53ee8cc1Swenshuai.xi             return (GOP_API_FAIL);
3367*53ee8cc1Swenshuai.xi         }
3368*53ee8cc1Swenshuai.xi 
3369*53ee8cc1Swenshuai.xi         msWarning(ERR_GWIN_ID_ALREADY_MAPPED);
3370*53ee8cc1Swenshuai.xi         GOP_M_INFO("Warning: [%s][%d]: u8gwinId already assigned to fbId2(%td), fbId(%td)\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32Temp, (ptrdiff_t)u32fbId);
3371*53ee8cc1Swenshuai.xi         pwinFB2->gWinId = GWIN_ID_INVALID;
3372*53ee8cc1Swenshuai.xi     }
3373*53ee8cc1Swenshuai.xi 
3374*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GwinId].u32CurFBId= u32fbId;
3375*53ee8cc1Swenshuai.xi 
3376*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,GwinId ))
3377*53ee8cc1Swenshuai.xi     {
3378*53ee8cc1Swenshuai.xi         msWarning(ERR_GWIN_ID_OUT_OF_RANGE);
3379*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]: winId=%td is not in existence\n",__FUNCTION__,__LINE__,(ptrdiff_t)GwinId);
3380*53ee8cc1Swenshuai.xi         return (GOP_API_FAIL);
3381*53ee8cc1Swenshuai.xi     }
3382*53ee8cc1Swenshuai.xi 
3383*53ee8cc1Swenshuai.xi     pwinFB->gWinId = GwinId;
3384*53ee8cc1Swenshuai.xi 
3385*53ee8cc1Swenshuai.xi     gWin.u16DispHPixelStart = pwinFB->x0;
3386*53ee8cc1Swenshuai.xi     gWin.u16DispVPixelStart = pwinFB->y0;
3387*53ee8cc1Swenshuai.xi     gWin.u16RBlkHPixSize = pwinFB->width;
3388*53ee8cc1Swenshuai.xi     gWin.u16RBlkVPixSize = pwinFB->height;
3389*53ee8cc1Swenshuai.xi     u32Temp = _GOP_CalcPitch(pInstance,pwinFB->fbFmt, pwinFB->width);
3390*53ee8cc1Swenshuai.xi     if(pwinFB->pitch < u32Temp)
3391*53ee8cc1Swenshuai.xi     {
3392*53ee8cc1Swenshuai.xi         gWin.u16RBlkHRblkSize = (MS_U16)u32Temp;//FB's pitch is invalid
3393*53ee8cc1Swenshuai.xi     }
3394*53ee8cc1Swenshuai.xi     else
3395*53ee8cc1Swenshuai.xi     {
3396*53ee8cc1Swenshuai.xi         gWin.u16RBlkHRblkSize = pwinFB->pitch;//FB's pitch is ok
3397*53ee8cc1Swenshuai.xi     }
3398*53ee8cc1Swenshuai.xi     gWin.u16DispHPixelEnd = pwinFB->x1;
3399*53ee8cc1Swenshuai.xi     gWin.u16DispVPixelEnd = pwinFB->y1;
3400*53ee8cc1Swenshuai.xi     gWin.u32DRAMRBlkStart = pwinFB->addr;
3401*53ee8cc1Swenshuai.xi     gWin.u16WinX = gWin.u16WinY = 0;
3402*53ee8cc1Swenshuai.xi     gWin.clrType = (EN_GOP_COLOR_TYPE)pwinFB->fbFmt;
3403*53ee8cc1Swenshuai.xi 
3404*53ee8cc1Swenshuai.xi     GOP_SetWinInfo(pInstance,GwinId,&gWin);
3405*53ee8cc1Swenshuai.xi 
3406*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,GwinId);
3407*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGopChipProperty->bAFBC_Support[u8GOP]==TRUE)
3408*53ee8cc1Swenshuai.xi     {
3409*53ee8cc1Swenshuai.xi         _GOP_MAP_FBID_AFBCCmd(pInstance,u32fbId,&eAFBC_cmd,&bAFBC_Enable);
3410*53ee8cc1Swenshuai.xi 
3411*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16HPixelStart = gWin.u16DispHPixelStart;
3412*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16HPixelEnd = gWin.u16DispHPixelEnd;
3413*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16Pitch = gWin.u16RBlkHRblkSize;
3414*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16VPixelStart = gWin.u16DispVPixelStart;
3415*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16VPixelEnd= gWin.u16DispVPixelEnd;
3416*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u64DRAMAddr = gWin.u32DRAMRBlkStart;
3417*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u8Fmt = (MS_U8)eAFBC_cmd;
3418*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_AFBCSetWindow(g_pGOPCtxLocal, u8GOP, &sAFBCWinProperty, TRUE);
3419*53ee8cc1Swenshuai.xi 
3420*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_AFBCMode(g_pGOPCtxLocal, u8GOP, bAFBC_Enable,eAFBC_cmd);
3421*53ee8cc1Swenshuai.xi     }
3422*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3423*53ee8cc1Swenshuai.xi }
3424*53ee8cc1Swenshuai.xi 
3425*53ee8cc1Swenshuai.xi 
GOP_Set_Hscale(void * pInstance,MS_U8 u8GOP,MS_BOOL bEnable,MS_U16 src,MS_U16 dst)3426*53ee8cc1Swenshuai.xi MS_U32 GOP_Set_Hscale(void* pInstance,MS_U8 u8GOP,MS_BOOL bEnable, MS_U16 src, MS_U16 dst)
3427*53ee8cc1Swenshuai.xi {
3428*53ee8cc1Swenshuai.xi 
3429*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3430*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3431*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3432*53ee8cc1Swenshuai.xi #endif
3433*53ee8cc1Swenshuai.xi 
3434*53ee8cc1Swenshuai.xi     if(!g_pGOPCtxLocal->pGopChipProperty->bPixelModeSupport)
3435*53ee8cc1Swenshuai.xi     {
3436*53ee8cc1Swenshuai.xi         if (src > dst)
3437*53ee8cc1Swenshuai.xi         {
3438*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GOP can not scaling down\n",__FUNCTION__,__LINE__);
3439*53ee8cc1Swenshuai.xi             return GOP_API_FAIL;
3440*53ee8cc1Swenshuai.xi         }
3441*53ee8cc1Swenshuai.xi     }
3442*53ee8cc1Swenshuai.xi 
3443*53ee8cc1Swenshuai.xi     if (bEnable)
3444*53ee8cc1Swenshuai.xi     {
3445*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16HScaleDst[u8GOP] = dst;
3446*53ee8cc1Swenshuai.xi     }
3447*53ee8cc1Swenshuai.xi     else
3448*53ee8cc1Swenshuai.xi     {
3449*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16HScaleDst[u8GOP] = 0;
3450*53ee8cc1Swenshuai.xi     }
3451*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Set_HSCALE(g_pGOPCtxLocal,u8GOP, bEnable, src, dst);
3452*53ee8cc1Swenshuai.xi     MDrv_GOP_Set3DOSD_Middle(g_pGOPCtxLocal, u8GOP);
3453*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
3454*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3455*53ee8cc1Swenshuai.xi }
3456*53ee8cc1Swenshuai.xi 
GOP_Get_Hscale(void * pInstance,MS_U32 u32GopId)3457*53ee8cc1Swenshuai.xi MS_U16 GOP_Get_Hscale(void* pInstance,MS_U32 u32GopId)
3458*53ee8cc1Swenshuai.xi {
3459*53ee8cc1Swenshuai.xi     MS_U16 HScaleRatio = SCALING_MULITPLIER;
3460*53ee8cc1Swenshuai.xi     MS_U16 VScaleRatio = SCALING_MULITPLIER;
3461*53ee8cc1Swenshuai.xi 
3462*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3463*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3464*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3465*53ee8cc1Swenshuai.xi #endif
3466*53ee8cc1Swenshuai.xi 
3467*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Get_HVScaleRatio(g_pGOPCtxLocal, (MS_U8)u32GopId, &HScaleRatio, &VScaleRatio);
3468*53ee8cc1Swenshuai.xi     return HScaleRatio;
3469*53ee8cc1Swenshuai.xi }
3470*53ee8cc1Swenshuai.xi 
GOP_Get_Vscale(void * pInstance,MS_U32 u32GopId)3471*53ee8cc1Swenshuai.xi MS_U16 GOP_Get_Vscale(void* pInstance,MS_U32 u32GopId)
3472*53ee8cc1Swenshuai.xi {
3473*53ee8cc1Swenshuai.xi     MS_U16 HScaleRatio = SCALING_MULITPLIER;
3474*53ee8cc1Swenshuai.xi     MS_U16 VScaleRatio = SCALING_MULITPLIER;
3475*53ee8cc1Swenshuai.xi 
3476*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3477*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3478*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3479*53ee8cc1Swenshuai.xi #endif
3480*53ee8cc1Swenshuai.xi 
3481*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Get_HVScaleRatio(g_pGOPCtxLocal, (MS_U8)u32GopId, &HScaleRatio, &VScaleRatio);
3482*53ee8cc1Swenshuai.xi     return VScaleRatio;
3483*53ee8cc1Swenshuai.xi }
3484*53ee8cc1Swenshuai.xi 
GOP_Set_Vscale(void * pInstance,MS_U8 u8GOP,MS_BOOL bEnable,MS_U16 src,MS_U16 dst)3485*53ee8cc1Swenshuai.xi MS_U32 GOP_Set_Vscale(void* pInstance,MS_U8 u8GOP,MS_BOOL bEnable, MS_U16 src, MS_U16 dst)
3486*53ee8cc1Swenshuai.xi {
3487*53ee8cc1Swenshuai.xi 
3488*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3489*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3490*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3491*53ee8cc1Swenshuai.xi #endif
3492*53ee8cc1Swenshuai.xi 
3493*53ee8cc1Swenshuai.xi 	if(!g_pGOPCtxLocal->pGopChipProperty->bPixelModeSupport)
3494*53ee8cc1Swenshuai.xi     {
3495*53ee8cc1Swenshuai.xi         if (src > dst)
3496*53ee8cc1Swenshuai.xi         {
3497*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GOP can not scaling down\n",__FUNCTION__,__LINE__);
3498*53ee8cc1Swenshuai.xi             return GOP_API_FAIL;
3499*53ee8cc1Swenshuai.xi         }
3500*53ee8cc1Swenshuai.xi     }
3501*53ee8cc1Swenshuai.xi 
3502*53ee8cc1Swenshuai.xi     if (bEnable)
3503*53ee8cc1Swenshuai.xi     {
3504*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16VScaleDst[u8GOP] = dst;
3505*53ee8cc1Swenshuai.xi     }
3506*53ee8cc1Swenshuai.xi     else
3507*53ee8cc1Swenshuai.xi     {
3508*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16VScaleDst[u8GOP] = 0;
3509*53ee8cc1Swenshuai.xi     }
3510*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Set_VSCALE(g_pGOPCtxLocal, u8GOP,bEnable, src, dst);
3511*53ee8cc1Swenshuai.xi     MDrv_GOP_Set3DOSD_Middle(g_pGOPCtxLocal, u8GOP);
3512*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
3513*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3514*53ee8cc1Swenshuai.xi 
3515*53ee8cc1Swenshuai.xi }
3516*53ee8cc1Swenshuai.xi 
GOP_SetStretchWin(void * pInstance,MS_U8 u8GOP_num,EN_GOP_DST_TYPE eDstType,MS_U16 x,MS_U16 y,MS_U16 width,MS_U16 height)3517*53ee8cc1Swenshuai.xi MS_U32 GOP_SetStretchWin(void* pInstance,MS_U8 u8GOP_num, EN_GOP_DST_TYPE eDstType,MS_U16 x, MS_U16 y, MS_U16 width, MS_U16 height)
3518*53ee8cc1Swenshuai.xi {
3519*53ee8cc1Swenshuai.xi     MS_U16 u16OrgWidth, u16Temp;
3520*53ee8cc1Swenshuai.xi 
3521*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3522*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3523*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3524*53ee8cc1Swenshuai.xi #endif
3525*53ee8cc1Swenshuai.xi 
3526*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP_num))
3527*53ee8cc1Swenshuai.xi     {
3528*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP_num);
3529*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
3530*53ee8cc1Swenshuai.xi     }
3531*53ee8cc1Swenshuai.xi 
3532*53ee8cc1Swenshuai.xi     //Get real original hw Stretch win width
3533*53ee8cc1Swenshuai.xi     _GOP_Get_StretchWin(pInstance,u8GOP_num, &u16Temp, &u16Temp, &u16OrgWidth, &u16Temp);
3534*53ee8cc1Swenshuai.xi     _GOP_GWIN_Align_StretchWin(pInstance, u8GOP_num, eDstType, &x, &y, &width, &height, 16);
3535*53ee8cc1Swenshuai.xi     //Store API use stretch window
3536*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchWidth[u8GOP_num] = width;
3537*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchHeight[u8GOP_num]= height;
3538*53ee8cc1Swenshuai.xi 
3539*53ee8cc1Swenshuai.xi     _GOP_GWIN_Adjust_3DStretchWin(pInstance,u8GOP_num, &x, &y, &width, &height);
3540*53ee8cc1Swenshuai.xi     if (u16OrgWidth <= width)//Set a large one, set htt first
3541*53ee8cc1Swenshuai.xi     {
3542*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetHTotal(g_pGOPCtxLocal,u8GOP_num ,width);
3543*53ee8cc1Swenshuai.xi     }
3544*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetStretchWin(g_pGOPCtxLocal, u8GOP_num, x, y, width, height);
3545*53ee8cc1Swenshuai.xi     _GOP_InitHSPDByGOP(pInstance,u8GOP_num);
3546*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP_num);
3547*53ee8cc1Swenshuai.xi 
3548*53ee8cc1Swenshuai.xi     if (u16OrgWidth > width)//Set a small one, set htt after Gwin regsiter updated
3549*53ee8cc1Swenshuai.xi     {
3550*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetHTotal(g_pGOPCtxLocal,u8GOP_num ,width);
3551*53ee8cc1Swenshuai.xi     }
3552*53ee8cc1Swenshuai.xi 
3553*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3554*53ee8cc1Swenshuai.xi }
3555*53ee8cc1Swenshuai.xi 
GOP_SetStretchWinPosition(void * pInstance,MS_U8 u8GOPNum,MS_U16 u16DispX,MS_U16 u16DispY)3556*53ee8cc1Swenshuai.xi MS_U32 GOP_SetStretchWinPosition(void* pInstance,MS_U8 u8GOPNum, MS_U16 u16DispX, MS_U16 u16DispY)
3557*53ee8cc1Swenshuai.xi {
3558*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3559*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3560*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3561*53ee8cc1Swenshuai.xi #endif
3562*53ee8cc1Swenshuai.xi 
3563*53ee8cc1Swenshuai.xi     MS_U16 u16SrcWidth;
3564*53ee8cc1Swenshuai.xi     MS_U16 u16SrcHeight;
3565*53ee8cc1Swenshuai.xi     MS_U16 u16StrenthWidth = g_pGOPCtxLocal->pGOPCtxShared->u16HScaleDst[u8GOPNum];
3566*53ee8cc1Swenshuai.xi     MS_U16 u16StrenthHeight = g_pGOPCtxLocal->pGOPCtxShared->u16VScaleDst[u8GOPNum];
3567*53ee8cc1Swenshuai.xi     MS_U16 u16PnlWidth = g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8GOPNum];
3568*53ee8cc1Swenshuai.xi     MS_U16 u16PnlHeight = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8GOPNum];
3569*53ee8cc1Swenshuai.xi     MS_U16 u16HStart = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOPNum];
3570*53ee8cc1Swenshuai.xi     EN_GOP_DST_TYPE GopDst = MAX_GOP_DST_SUPPORT;
3571*53ee8cc1Swenshuai.xi     DRV_GOPDstType enDst = E_DRV_GOP_DST_INVALID;
3572*53ee8cc1Swenshuai.xi     MS_U16 u16Tmp = 0;
3573*53ee8cc1Swenshuai.xi 
3574*53ee8cc1Swenshuai.xi     (MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOPNum, &enDst));
3575*53ee8cc1Swenshuai.xi     //Fix me : tmp only for OP
3576*53ee8cc1Swenshuai.xi     if(enDst != E_DRV_GOP_DST_OP0)
3577*53ee8cc1Swenshuai.xi     {
3578*53ee8cc1Swenshuai.xi         return GOP_API_SUCCESS;
3579*53ee8cc1Swenshuai.xi     }
3580*53ee8cc1Swenshuai.xi 
3581*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Get_StretchWin(g_pGOPCtxLocal, u8GOPNum, &u16Tmp, &u16Tmp, &u16SrcWidth, &u16SrcHeight);
3582*53ee8cc1Swenshuai.xi 
3583*53ee8cc1Swenshuai.xi     if ((0 == u16StrenthWidth) || (0 == u16StrenthHeight))
3584*53ee8cc1Swenshuai.xi     {
3585*53ee8cc1Swenshuai.xi         MS_U16 u16HRatio = SCALING_MULITPLIER;
3586*53ee8cc1Swenshuai.xi         MS_U16 u16VRatio = SCALING_MULITPLIER;
3587*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_Get_HVScaleRatio(g_pGOPCtxLocal, u8GOPNum, &u16HRatio, &u16VRatio);
3588*53ee8cc1Swenshuai.xi         //get u16StrenthWidth or u16StrenthHeight from current ratio
3589*53ee8cc1Swenshuai.xi 
3590*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->pGOPCtxShared->bHMirror && (0 != u16DispX))
3591*53ee8cc1Swenshuai.xi         {
3592*53ee8cc1Swenshuai.xi             // if x!=0 bHMirror = 1, up alignment the u16StrenthWidth, to make sure there is space lefted in the left of mirror panel
3593*53ee8cc1Swenshuai.xi             u16StrenthWidth = (MS_U16)(((u16SrcWidth * SCALING_MULITPLIER) + u16HRatio) / u16HRatio);
3594*53ee8cc1Swenshuai.xi         }
3595*53ee8cc1Swenshuai.xi         else //None mirror or mirror+x=0
3596*53ee8cc1Swenshuai.xi         {
3597*53ee8cc1Swenshuai.xi             // if x=0 bHMirror = 1, down alignment the u16StrenthWidth, to make sure there is no space lefted in the left of mirror panel
3598*53ee8cc1Swenshuai.xi             u16StrenthWidth = (MS_U16)((u16SrcWidth * SCALING_MULITPLIER) / u16HRatio);
3599*53ee8cc1Swenshuai.xi         }
3600*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->pGOPCtxShared->bVMirror && (0 != u16DispY))
3601*53ee8cc1Swenshuai.xi         {
3602*53ee8cc1Swenshuai.xi             // if y!=0 bVMirror = 1, up alignment the u16StrenthHeight, to make sure there is space lefted in the top of mirror panel
3603*53ee8cc1Swenshuai.xi             u16StrenthHeight = (MS_U16)(((u16SrcHeight * SCALING_MULITPLIER) + u16VRatio) / u16VRatio);
3604*53ee8cc1Swenshuai.xi         }
3605*53ee8cc1Swenshuai.xi         else
3606*53ee8cc1Swenshuai.xi         {
3607*53ee8cc1Swenshuai.xi             // if y=0 bVMirror = 1, down alignment the u16StrenthHeight, to make sure there is no space lefted in the top of mirror panel
3608*53ee8cc1Swenshuai.xi             u16StrenthHeight = (MS_U16)((u16SrcHeight * SCALING_MULITPLIER) / u16VRatio);
3609*53ee8cc1Swenshuai.xi         }
3610*53ee8cc1Swenshuai.xi     }
3611*53ee8cc1Swenshuai.xi 
3612*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGopChipProperty->enGOP3DType == E_DRV_3D_DUP_FULL)
3613*53ee8cc1Swenshuai.xi     {
3614*53ee8cc1Swenshuai.xi         switch (g_pGOPCtxLocal->pGOPCtxShared->GOP_StereoMode[u8GOPNum])
3615*53ee8cc1Swenshuai.xi         {
3616*53ee8cc1Swenshuai.xi             case E_DRV_GOP_3D_LINE_ALTERNATIVE:
3617*53ee8cc1Swenshuai.xi             case E_DRV_GOP_3D_TOP_BOTTOM:
3618*53ee8cc1Swenshuai.xi                 u16StrenthHeight = u16StrenthHeight <<1;
3619*53ee8cc1Swenshuai.xi                 break;
3620*53ee8cc1Swenshuai.xi             case E_DRV_GOP_3D_LINE_FRAMEPACKING:
3621*53ee8cc1Swenshuai.xi                 u16StrenthHeight = u16StrenthHeight <<1;
3622*53ee8cc1Swenshuai.xi                 u16StrenthHeight += g_pGOPCtxLocal->u16GOPGWinMiddle[u8GOPNum];
3623*53ee8cc1Swenshuai.xi                 break;
3624*53ee8cc1Swenshuai.xi             case E_DRV_GOP_3D_SIDE_BY_SYDE:
3625*53ee8cc1Swenshuai.xi                 u16StrenthWidth = u16StrenthWidth <<1;
3626*53ee8cc1Swenshuai.xi                 break;
3627*53ee8cc1Swenshuai.xi             default:
3628*53ee8cc1Swenshuai.xi                 break;
3629*53ee8cc1Swenshuai.xi         }
3630*53ee8cc1Swenshuai.xi     }
3631*53ee8cc1Swenshuai.xi     //error protect: width < panel width
3632*53ee8cc1Swenshuai.xi     if (u16PnlWidth < u16StrenthWidth)
3633*53ee8cc1Swenshuai.xi     {
3634*53ee8cc1Swenshuai.xi         u16DispX = 0;
3635*53ee8cc1Swenshuai.xi         u16StrenthWidth = u16PnlWidth;
3636*53ee8cc1Swenshuai.xi     }
3637*53ee8cc1Swenshuai.xi     else
3638*53ee8cc1Swenshuai.xi     {
3639*53ee8cc1Swenshuai.xi          //error protect: x+width < panel width +Hstart
3640*53ee8cc1Swenshuai.xi         if (u16PnlWidth + u16HStart < u16DispX + u16StrenthWidth)
3641*53ee8cc1Swenshuai.xi         {
3642*53ee8cc1Swenshuai.xi             // allow strench win out of panel limited by HTT with OP dst
3643*53ee8cc1Swenshuai.xi             u16DispX = 0;
3644*53ee8cc1Swenshuai.xi         }
3645*53ee8cc1Swenshuai.xi     }
3646*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->pGOPCtxShared->bHMirror)
3647*53ee8cc1Swenshuai.xi     {
3648*53ee8cc1Swenshuai.xi         MS_U16 u16RightEnd = u16DispX + u16StrenthWidth;
3649*53ee8cc1Swenshuai.xi         // adjust x axis for mirror
3650*53ee8cc1Swenshuai.xi         if (u16PnlWidth > u16RightEnd)
3651*53ee8cc1Swenshuai.xi         {
3652*53ee8cc1Swenshuai.xi             u16DispX = u16PnlWidth - u16RightEnd;
3653*53ee8cc1Swenshuai.xi         }
3654*53ee8cc1Swenshuai.xi         else
3655*53ee8cc1Swenshuai.xi         {
3656*53ee8cc1Swenshuai.xi             u16DispX = 0;
3657*53ee8cc1Swenshuai.xi         }
3658*53ee8cc1Swenshuai.xi     }
3659*53ee8cc1Swenshuai.xi 
3660*53ee8cc1Swenshuai.xi     //error protect: height < panel height
3661*53ee8cc1Swenshuai.xi     if (u16PnlHeight < u16StrenthHeight)
3662*53ee8cc1Swenshuai.xi     {
3663*53ee8cc1Swenshuai.xi         u16DispY = 0;
3664*53ee8cc1Swenshuai.xi         u16StrenthHeight = u16PnlHeight;
3665*53ee8cc1Swenshuai.xi     }
3666*53ee8cc1Swenshuai.xi     //error protect: y+height < panel height
3667*53ee8cc1Swenshuai.xi     else if (u16PnlHeight < u16DispY + u16StrenthHeight)
3668*53ee8cc1Swenshuai.xi     {
3669*53ee8cc1Swenshuai.xi         u16DispY = 0;
3670*53ee8cc1Swenshuai.xi     }
3671*53ee8cc1Swenshuai.xi     if (g_pGOPCtxLocal->pGOPCtxShared->bVMirror)
3672*53ee8cc1Swenshuai.xi     {
3673*53ee8cc1Swenshuai.xi         // adjust y axis for mirror
3674*53ee8cc1Swenshuai.xi         u16DispY = u16PnlHeight - u16DispY - u16StrenthHeight;
3675*53ee8cc1Swenshuai.xi     }
3676*53ee8cc1Swenshuai.xi 
3677*53ee8cc1Swenshuai.xi     _GOP_Map_DRVDst2API_Enum_(pInstance,&GopDst, enDst);
3678*53ee8cc1Swenshuai.xi     _GOP_GWIN_Align_StretchWin(pInstance, u8GOPNum, GopDst, &u16DispX, &u16DispY, &u16Tmp, &u16Tmp, 16);
3679*53ee8cc1Swenshuai.xi 
3680*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetStretchWinPosition(g_pGOPCtxLocal, u8GOPNum, u16DispX, u16DispY);
3681*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOPNum);
3682*53ee8cc1Swenshuai.xi 
3683*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
3684*53ee8cc1Swenshuai.xi }
3685*53ee8cc1Swenshuai.xi 
GOP_MultiSwitchByAddr(void * pInstance,PGOP_GWIN_FLIP_MULTI_WIN_INFO pMultiflip)3686*53ee8cc1Swenshuai.xi MS_BOOL GOP_MultiSwitchByAddr(void* pInstance,PGOP_GWIN_FLIP_MULTI_WIN_INFO pMultiflip)
3687*53ee8cc1Swenshuai.xi {
3688*53ee8cc1Swenshuai.xi     MS_U8  u8GwinGOP,i = 0;
3689*53ee8cc1Swenshuai.xi     MS_U32 u32GwinIdx = 0;
3690*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
3691*53ee8cc1Swenshuai.xi     MS_GFLIP_MULTIINFO Multiinfo;
3692*53ee8cc1Swenshuai.xi     MS_TLB_GFLIP_MULTIINFO TLBMultiinfo;
3693*53ee8cc1Swenshuai.xi     MS_U8 u8MiuSel=0xFF;
3694*53ee8cc1Swenshuai.xi     MS_U8 u8GWinBase=0;
3695*53ee8cc1Swenshuai.xi     MS_BOOL bTLBenable=FALSE;
3696*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3697*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3698*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3699*53ee8cc1Swenshuai.xi #endif
3700*53ee8cc1Swenshuai.xi 
3701*53ee8cc1Swenshuai.xi     Multiinfo.u8GopInfoCnt = pMultiflip->u8InfoCnt;
3702*53ee8cc1Swenshuai.xi     for(i = 0;i < (pMultiflip->u8InfoCnt);i++)
3703*53ee8cc1Swenshuai.xi     {
3704*53ee8cc1Swenshuai.xi         if (!_GOP_IsGwinIdValid(pInstance,pMultiflip->FlipInfo[i].GwinId))
3705*53ee8cc1Swenshuai.xi         {
3706*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)pMultiflip->FlipInfo[i].GwinId);
3707*53ee8cc1Swenshuai.xi             return FALSE;
3708*53ee8cc1Swenshuai.xi         }
3709*53ee8cc1Swenshuai.xi 
3710*53ee8cc1Swenshuai.xi         u8GwinGOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,pMultiflip->FlipInfo[i].GwinId);
3711*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGOP])
3712*53ee8cc1Swenshuai.xi         {
3713*53ee8cc1Swenshuai.xi             u8GWinBase=0;
3714*53ee8cc1Swenshuai.xi             for(i=0;i<u8GwinGOP;i++)
3715*53ee8cc1Swenshuai.xi             {
3716*53ee8cc1Swenshuai.xi                 u8GWinBase += MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, i);
3717*53ee8cc1Swenshuai.xi             }
3718*53ee8cc1Swenshuai.xi             if(pMultiflip->FlipInfo[i].GwinId != u8GWinBase)
3719*53ee8cc1Swenshuai.xi             {
3720*53ee8cc1Swenshuai.xi                 GOP_M_INFO("\n[%s] not support TLB mode, gwin id:0x%tx ", __FUNCTION__, (ptrdiff_t)pMultiflip->FlipInfo[i].GwinId);
3721*53ee8cc1Swenshuai.xi             }
3722*53ee8cc1Swenshuai.xi         }
3723*53ee8cc1Swenshuai.xi         switch(u8GwinGOP)
3724*53ee8cc1Swenshuai.xi         {
3725*53ee8cc1Swenshuai.xi             case E_GOP0:
3726*53ee8cc1Swenshuai.xi                 u32GwinIdx=pMultiflip->FlipInfo[i].GwinId;
3727*53ee8cc1Swenshuai.xi                 break;
3728*53ee8cc1Swenshuai.xi             case E_GOP1:
3729*53ee8cc1Swenshuai.xi                 u32GwinIdx=pMultiflip->FlipInfo[i].GwinId-MAX_GOP0_GWIN;
3730*53ee8cc1Swenshuai.xi                 break;
3731*53ee8cc1Swenshuai.xi             case E_GOP2:
3732*53ee8cc1Swenshuai.xi                 u32GwinIdx=pMultiflip->FlipInfo[i].GwinId-GOP2_Gwin0Id;
3733*53ee8cc1Swenshuai.xi                 break;
3734*53ee8cc1Swenshuai.xi             case E_GOP3:
3735*53ee8cc1Swenshuai.xi                 u32GwinIdx=pMultiflip->FlipInfo[i].GwinId-GOP3_Gwin0Id;
3736*53ee8cc1Swenshuai.xi                 break;
3737*53ee8cc1Swenshuai.xi             case E_GOP4:
3738*53ee8cc1Swenshuai.xi                 u32GwinIdx=pMultiflip->FlipInfo[i].GwinId-GOP4_Gwin0Id;
3739*53ee8cc1Swenshuai.xi                 break;
3740*53ee8cc1Swenshuai.xi             case E_GOP5:
3741*53ee8cc1Swenshuai.xi                 u32GwinIdx=pMultiflip->FlipInfo[i].GwinId-GOP5_Gwin0Id;
3742*53ee8cc1Swenshuai.xi                 break;
3743*53ee8cc1Swenshuai.xi             default:
3744*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GwinGOP);
3745*53ee8cc1Swenshuai.xi                 break;
3746*53ee8cc1Swenshuai.xi         }
3747*53ee8cc1Swenshuai.xi 
3748*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u32GopIdx = (MS_U32)u8GwinGOP;
3749*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u32GwinIdx = u32GwinIdx;
3750*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u64MainAddr = pMultiflip->FlipInfo[i].FlipAddr;
3751*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u64SubAddr = pMultiflip->FlipInfo[i].SubFlipAddr;
3752*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u32TagId = pMultiflip->FlipInfo[i].WaitTagID;
3753*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u32QEntry = *(pMultiflip->FlipInfo[i].pQueueCnt);
3754*53ee8cc1Swenshuai.xi         Multiinfo.astGopInfo[i].u32Result = TRUE;
3755*53ee8cc1Swenshuai.xi 
3756*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bGOP3DLRSwitch[u8GwinGOP])
3757*53ee8cc1Swenshuai.xi         {
3758*53ee8cc1Swenshuai.xi             //Do L/R switch
3759*53ee8cc1Swenshuai.xi             MS_PHY u64Temp = Multiinfo.astGopInfo[i].u64MainAddr;
3760*53ee8cc1Swenshuai.xi             Multiinfo.astGopInfo[i].u64MainAddr = Multiinfo.astGopInfo[i].u64SubAddr;
3761*53ee8cc1Swenshuai.xi             Multiinfo.astGopInfo[i].u64SubAddr  = u64Temp;
3762*53ee8cc1Swenshuai.xi         }
3763*53ee8cc1Swenshuai.xi 
3764*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGOP])
3765*53ee8cc1Swenshuai.xi         {
3766*53ee8cc1Swenshuai.xi             MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
3767*53ee8cc1Swenshuai.xi             DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
3768*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GwinGOP, &GopDst);
3769*53ee8cc1Swenshuai.xi             _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
3770*53ee8cc1Swenshuai.xi             if(bHMirror || bVMirror)
3771*53ee8cc1Swenshuai.xi             {
3772*53ee8cc1Swenshuai.xi                 GOP_GwinInfo stGwinInfo;
3773*53ee8cc1Swenshuai.xi                 GOP_GetWinInfo(pInstance,pMultiflip->FlipInfo[i].GwinId, &stGwinInfo);
3774*53ee8cc1Swenshuai.xi                 stGwinInfo.u32DRAMRBlkStart = Multiinfo.astGopInfo[i].u64MainAddr;
3775*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->sMirrorInfo[u32GwinIdx].u64NonMirrorFBAdr = stGwinInfo.u32DRAMRBlkStart;
3776*53ee8cc1Swenshuai.xi                 _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,pMultiflip->FlipInfo[i].GwinId, bHMirror, bVMirror, &stGwinInfo);
3777*53ee8cc1Swenshuai.xi                 Multiinfo.astGopInfo[i].u64MainAddr = stGwinInfo.u32DRAMRBlkStart;
3778*53ee8cc1Swenshuai.xi 
3779*53ee8cc1Swenshuai.xi                 stGwinInfo.u32DRAMRBlkStart = Multiinfo.astGopInfo[i].u64SubAddr;
3780*53ee8cc1Swenshuai.xi                 _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,pMultiflip->FlipInfo[i].GwinId, bHMirror, bVMirror, &stGwinInfo);
3781*53ee8cc1Swenshuai.xi                 Multiinfo.astGopInfo[i].u64SubAddr = stGwinInfo.u32DRAMRBlkStart;
3782*53ee8cc1Swenshuai.xi             }
3783*53ee8cc1Swenshuai.xi         }
3784*53ee8cc1Swenshuai.xi         else
3785*53ee8cc1Swenshuai.xi         {
3786*53ee8cc1Swenshuai.xi             if(u8GwinGOP > GOPTYPE.GOP0)
3787*53ee8cc1Swenshuai.xi             {
3788*53ee8cc1Swenshuai.xi                 MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
3789*53ee8cc1Swenshuai.xi                 DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
3790*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GwinGOP, &GopDst);
3791*53ee8cc1Swenshuai.xi                 _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
3792*53ee8cc1Swenshuai.xi                 if(bHMirror || bVMirror)
3793*53ee8cc1Swenshuai.xi                 {
3794*53ee8cc1Swenshuai.xi                     GOP_GwinInfo stGwinInfo;
3795*53ee8cc1Swenshuai.xi                     GOP_GetWinInfo(pInstance,pMultiflip->FlipInfo[i].GwinId, &stGwinInfo);
3796*53ee8cc1Swenshuai.xi                     stGwinInfo.u32DRAMRBlkStart = Multiinfo.astGopInfo[i].u64MainAddr;
3797*53ee8cc1Swenshuai.xi                     g_pGOPCtxLocal->sMirrorInfo[u32GwinIdx].u64NonMirrorFBAdr = stGwinInfo.u32DRAMRBlkStart;
3798*53ee8cc1Swenshuai.xi                     _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,pMultiflip->FlipInfo[i].GwinId, bHMirror, bVMirror, &stGwinInfo);
3799*53ee8cc1Swenshuai.xi                     Multiinfo.astGopInfo[i].u64MainAddr = stGwinInfo.u32DRAMRBlkStart;
3800*53ee8cc1Swenshuai.xi 
3801*53ee8cc1Swenshuai.xi                     stGwinInfo.u32DRAMRBlkStart = Multiinfo.astGopInfo[i].u64SubAddr;
3802*53ee8cc1Swenshuai.xi                     _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,pMultiflip->FlipInfo[i].GwinId, bHMirror, bVMirror, &stGwinInfo);
3803*53ee8cc1Swenshuai.xi                     Multiinfo.astGopInfo[i].u64SubAddr = stGwinInfo.u32DRAMRBlkStart;
3804*53ee8cc1Swenshuai.xi 
3805*53ee8cc1Swenshuai.xi                 }
3806*53ee8cc1Swenshuai.xi             }
3807*53ee8cc1Swenshuai.xi         }
3808*53ee8cc1Swenshuai.xi         //GOP HW just read the relative offset of each MIU
3809*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(u8MiuSel, Multiinfo.astGopInfo[i].u64MainAddr, Multiinfo.astGopInfo[i].u64MainAddr);
3810*53ee8cc1Swenshuai.xi 
3811*53ee8cc1Swenshuai.xi         //GOP HW just read the relative offset of each MIU
3812*53ee8cc1Swenshuai.xi         _phy_to_miu_offset(u8MiuSel, Multiinfo.astGopInfo[i].u64SubAddr, Multiinfo.astGopInfo[i].u64SubAddr);
3813*53ee8cc1Swenshuai.xi 
3814*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u32GopIdx = Multiinfo.astGopInfo[i].u32GopIdx;
3815*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u32GwinIdx = Multiinfo.astGopInfo[i].u32GwinIdx;
3816*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u64MainAddr = Multiinfo.astGopInfo[i].u64MainAddr;
3817*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u32TagId = Multiinfo.astGopInfo[i].u32TagId;
3818*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u32QEntry = Multiinfo.astGopInfo[i].u32QEntry;
3819*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u32Result = Multiinfo.astGopInfo[i].u32Result;
3820*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u64SubAddr = Multiinfo.astGopInfo[i].u64SubAddr;
3821*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].bTLBEnable = g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGOP];
3822*53ee8cc1Swenshuai.xi         TLBMultiinfo.astTLBGopInfo[i].u64TLBAddr = g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[u8GwinGOP];
3823*53ee8cc1Swenshuai.xi 
3824*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGOP])
3825*53ee8cc1Swenshuai.xi         {
3826*53ee8cc1Swenshuai.xi             bTLBenable=TRUE;
3827*53ee8cc1Swenshuai.xi         }
3828*53ee8cc1Swenshuai.xi     }
3829*53ee8cc1Swenshuai.xi     TLBMultiinfo.u8GopInfoCnt=Multiinfo.u8GopInfoCnt;
3830*53ee8cc1Swenshuai.xi 
3831*53ee8cc1Swenshuai.xi     if(bTLBenable == TRUE)
3832*53ee8cc1Swenshuai.xi     {
3833*53ee8cc1Swenshuai.xi         if(MDrv_GFLIP_SetTLBMultiFlipInfo(g_pGOPCtxLocal,&TLBMultiinfo))
3834*53ee8cc1Swenshuai.xi         {
3835*53ee8cc1Swenshuai.xi             for(i = 0;i < (pMultiflip->u8InfoCnt);i++)
3836*53ee8cc1Swenshuai.xi             {
3837*53ee8cc1Swenshuai.xi                 if(g_pGOPCtxLocal->pGOPCtxShared->gwinMap[pMultiflip->FlipInfo[i].GwinId].u32CurFBId<DRV_MAX_GWIN_FB_SUPPORT)
3838*53ee8cc1Swenshuai.xi                 {
3839*53ee8cc1Swenshuai.xi                     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[pMultiflip->FlipInfo[i].GwinId].u32CurFBId);
3840*53ee8cc1Swenshuai.xi                     pwinFB->gWinId = GWIN_ID_INVALID;
3841*53ee8cc1Swenshuai.xi                 }
3842*53ee8cc1Swenshuai.xi                 *(pMultiflip->FlipInfo[i].pQueueCnt) = Multiinfo.astGopInfo[i].u32QEntry;
3843*53ee8cc1Swenshuai.xi             }
3844*53ee8cc1Swenshuai.xi             return TRUE;
3845*53ee8cc1Swenshuai.xi         }
3846*53ee8cc1Swenshuai.xi     }
3847*53ee8cc1Swenshuai.xi     else
3848*53ee8cc1Swenshuai.xi     {
3849*53ee8cc1Swenshuai.xi         if(MDrv_GFLIP_SetMultiFlipInfo(g_pGOPCtxLocal,&Multiinfo))
3850*53ee8cc1Swenshuai.xi         {
3851*53ee8cc1Swenshuai.xi             for(i = 0;i < (pMultiflip->u8InfoCnt);i++)
3852*53ee8cc1Swenshuai.xi             {
3853*53ee8cc1Swenshuai.xi                 if(g_pGOPCtxLocal->pGOPCtxShared->gwinMap[pMultiflip->FlipInfo[i].GwinId].u32CurFBId<DRV_MAX_GWIN_FB_SUPPORT)
3854*53ee8cc1Swenshuai.xi                 {
3855*53ee8cc1Swenshuai.xi                     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[pMultiflip->FlipInfo[i].GwinId].u32CurFBId);
3856*53ee8cc1Swenshuai.xi                     pwinFB->gWinId = GWIN_ID_INVALID;
3857*53ee8cc1Swenshuai.xi                 }
3858*53ee8cc1Swenshuai.xi                 *(pMultiflip->FlipInfo[i].pQueueCnt) = Multiinfo.astGopInfo[i].u32QEntry;
3859*53ee8cc1Swenshuai.xi             }
3860*53ee8cc1Swenshuai.xi             return TRUE;
3861*53ee8cc1Swenshuai.xi         }
3862*53ee8cc1Swenshuai.xi     }
3863*53ee8cc1Swenshuai.xi     return FALSE;
3864*53ee8cc1Swenshuai.xi }
3865*53ee8cc1Swenshuai.xi 
GOP_SwitchByAddr(void * pInstance,MS_U32 gWinId,MS_PHY u64MainFlipAddr,MS_PHY u64SubFlipAddr,MS_U16 u32WaitTagID,MS_U32 * pU32QueueCnt,MS_BOOL b3DEn)3866*53ee8cc1Swenshuai.xi MS_BOOL GOP_SwitchByAddr(void* pInstance,MS_U32 gWinId, MS_PHY u64MainFlipAddr, MS_PHY u64SubFlipAddr, MS_U16 u32WaitTagID, MS_U32 *pU32QueueCnt, MS_BOOL b3DEn)
3867*53ee8cc1Swenshuai.xi {
3868*53ee8cc1Swenshuai.xi     MS_U8  u8GwinGOP;
3869*53ee8cc1Swenshuai.xi     MS_U32 u32QueueCnt=0;
3870*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
3871*53ee8cc1Swenshuai.xi     MS_U8 u8GWinBase=0;
3872*53ee8cc1Swenshuai.xi     MS_U8 i;
3873*53ee8cc1Swenshuai.xi 
3874*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3875*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3876*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3877*53ee8cc1Swenshuai.xi #endif
3878*53ee8cc1Swenshuai.xi 
3879*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gWinId))
3880*53ee8cc1Swenshuai.xi     {
3881*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gWinId);
3882*53ee8cc1Swenshuai.xi         return FALSE;
3883*53ee8cc1Swenshuai.xi     }
3884*53ee8cc1Swenshuai.xi 
3885*53ee8cc1Swenshuai.xi     u8GwinGOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,gWinId);
3886*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGOP])
3887*53ee8cc1Swenshuai.xi     {
3888*53ee8cc1Swenshuai.xi         u8GWinBase=0;
3889*53ee8cc1Swenshuai.xi         for(i=0;i<u8GwinGOP;i++)
3890*53ee8cc1Swenshuai.xi         {
3891*53ee8cc1Swenshuai.xi             u8GWinBase += MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, i);
3892*53ee8cc1Swenshuai.xi         }
3893*53ee8cc1Swenshuai.xi         if(gWinId != u8GWinBase)
3894*53ee8cc1Swenshuai.xi         {
3895*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n[%s] not support TLB mode, gwin id:0x%tx ", __FUNCTION__, (ptrdiff_t)gWinId);
3896*53ee8cc1Swenshuai.xi         }
3897*53ee8cc1Swenshuai.xi     }
3898*53ee8cc1Swenshuai.xi 
3899*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bGOP3DLRSwitch[u8GwinGOP])
3900*53ee8cc1Swenshuai.xi     {
3901*53ee8cc1Swenshuai.xi         //Do L/R switch
3902*53ee8cc1Swenshuai.xi         MS_PHY u64Temp = u64MainFlipAddr;
3903*53ee8cc1Swenshuai.xi         u64MainFlipAddr = u64SubFlipAddr;
3904*53ee8cc1Swenshuai.xi         u64SubFlipAddr  = u64Temp;
3905*53ee8cc1Swenshuai.xi     }
3906*53ee8cc1Swenshuai.xi 
3907*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGOP])
3908*53ee8cc1Swenshuai.xi     {
3909*53ee8cc1Swenshuai.xi         MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
3910*53ee8cc1Swenshuai.xi         DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
3911*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GwinGOP, &GopDst);
3912*53ee8cc1Swenshuai.xi         _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
3913*53ee8cc1Swenshuai.xi         if(bHMirror || bVMirror)
3914*53ee8cc1Swenshuai.xi         {
3915*53ee8cc1Swenshuai.xi             GOP_GwinInfo stGwinInfo;
3916*53ee8cc1Swenshuai.xi             GOP_GetWinInfo(pInstance,gWinId, &stGwinInfo);
3917*53ee8cc1Swenshuai.xi             stGwinInfo.u32DRAMRBlkStart = u64MainFlipAddr;
3918*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->sMirrorInfo[gWinId].u64NonMirrorFBAdr = u64MainFlipAddr;
3919*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,gWinId, bHMirror, bVMirror, &stGwinInfo);
3920*53ee8cc1Swenshuai.xi             u64MainFlipAddr = stGwinInfo.u32DRAMRBlkStart;
3921*53ee8cc1Swenshuai.xi 
3922*53ee8cc1Swenshuai.xi             stGwinInfo.u32DRAMRBlkStart = u64SubFlipAddr;
3923*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,gWinId, bHMirror, bVMirror, &stGwinInfo);
3924*53ee8cc1Swenshuai.xi             u64SubFlipAddr = stGwinInfo.u32DRAMRBlkStart;
3925*53ee8cc1Swenshuai.xi         }
3926*53ee8cc1Swenshuai.xi     }
3927*53ee8cc1Swenshuai.xi     else
3928*53ee8cc1Swenshuai.xi     {
3929*53ee8cc1Swenshuai.xi         if(u8GwinGOP > GOPTYPE.GOP0)
3930*53ee8cc1Swenshuai.xi         {
3931*53ee8cc1Swenshuai.xi             MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
3932*53ee8cc1Swenshuai.xi             DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
3933*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GwinGOP, &GopDst);
3934*53ee8cc1Swenshuai.xi             _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
3935*53ee8cc1Swenshuai.xi             if(bHMirror || bVMirror)
3936*53ee8cc1Swenshuai.xi             {
3937*53ee8cc1Swenshuai.xi                 GOP_GwinInfo stGwinInfo;
3938*53ee8cc1Swenshuai.xi                 GOP_GetWinInfo(pInstance,gWinId, &stGwinInfo);
3939*53ee8cc1Swenshuai.xi                 stGwinInfo.u32DRAMRBlkStart = u64MainFlipAddr;
3940*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->sMirrorInfo[gWinId].u64NonMirrorFBAdr = u64MainFlipAddr;
3941*53ee8cc1Swenshuai.xi                 _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,gWinId, bHMirror, bVMirror, &stGwinInfo);
3942*53ee8cc1Swenshuai.xi                 u64MainFlipAddr = stGwinInfo.u32DRAMRBlkStart;
3943*53ee8cc1Swenshuai.xi 
3944*53ee8cc1Swenshuai.xi                 stGwinInfo.u32DRAMRBlkStart = u64SubFlipAddr;
3945*53ee8cc1Swenshuai.xi                 _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,gWinId, bHMirror, bVMirror, &stGwinInfo);
3946*53ee8cc1Swenshuai.xi                 u64SubFlipAddr = stGwinInfo.u32DRAMRBlkStart;
3947*53ee8cc1Swenshuai.xi 
3948*53ee8cc1Swenshuai.xi             }
3949*53ee8cc1Swenshuai.xi         }
3950*53ee8cc1Swenshuai.xi     }
3951*53ee8cc1Swenshuai.xi     u32QueueCnt = *pU32QueueCnt;
3952*53ee8cc1Swenshuai.xi 
3953*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gWinId].u32CurFBId);
3954*53ee8cc1Swenshuai.xi 
3955*53ee8cc1Swenshuai.xi     if(b3DEn == 0)
3956*53ee8cc1Swenshuai.xi     {
3957*53ee8cc1Swenshuai.xi         u64SubFlipAddr = 0;
3958*53ee8cc1Swenshuai.xi     }
3959*53ee8cc1Swenshuai.xi 
3960*53ee8cc1Swenshuai.xi     if(MDrv_GOP_SwitchGWIN2Addr(g_pGOPCtxLocal, gWinId, u64MainFlipAddr, u64SubFlipAddr, u32WaitTagID, &u32QueueCnt))
3961*53ee8cc1Swenshuai.xi     {
3962*53ee8cc1Swenshuai.xi          if( g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gWinId].u32CurFBId<DRV_MAX_GWIN_FB_SUPPORT)
3963*53ee8cc1Swenshuai.xi                pwinFB->gWinId = GWIN_ID_INVALID;
3964*53ee8cc1Swenshuai.xi 
3965*53ee8cc1Swenshuai.xi         *pU32QueueCnt = (MS_U16)u32QueueCnt;
3966*53ee8cc1Swenshuai.xi         return TRUE;
3967*53ee8cc1Swenshuai.xi     }
3968*53ee8cc1Swenshuai.xi 
3969*53ee8cc1Swenshuai.xi     return FALSE;
3970*53ee8cc1Swenshuai.xi }
3971*53ee8cc1Swenshuai.xi 
GOP_SwitchByFBID(void * pInstance,MS_U32 gWinId,MS_U32 u32fbId,MS_U32 u32WaitTagID,MS_U32 * pU32QueueCnt)3972*53ee8cc1Swenshuai.xi MS_BOOL GOP_SwitchByFBID(void* pInstance,MS_U32 gWinId, MS_U32 u32fbId, MS_U32 u32WaitTagID, MS_U32* pU32QueueCnt)
3973*53ee8cc1Swenshuai.xi {
3974*53ee8cc1Swenshuai.xi     MS_U8 u8GwinGop;
3975*53ee8cc1Swenshuai.xi     MS_PHY u64FlipAddr;
3976*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
3977*53ee8cc1Swenshuai.xi     MS_U8 u8GWinBase=0;
3978*53ee8cc1Swenshuai.xi     MS_U8 i;
3979*53ee8cc1Swenshuai.xi 
3980*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
3981*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
3982*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
3983*53ee8cc1Swenshuai.xi #endif
3984*53ee8cc1Swenshuai.xi 
3985*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
3986*53ee8cc1Swenshuai.xi     {
3987*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
3988*53ee8cc1Swenshuai.xi         return FALSE;
3989*53ee8cc1Swenshuai.xi     }
3990*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gWinId))
3991*53ee8cc1Swenshuai.xi     {
3992*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gWinId);
3993*53ee8cc1Swenshuai.xi         return FALSE;
3994*53ee8cc1Swenshuai.xi     }
3995*53ee8cc1Swenshuai.xi     if(!_GOP_GWIN_IsGwinExistInClient(pInstance,gWinId))
3996*53ee8cc1Swenshuai.xi     {
3997*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_OUT_OF_RANGE);
3998*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is not exist\n",__FUNCTION__,__LINE__,(ptrdiff_t)gWinId);
3999*53ee8cc1Swenshuai.xi         return FALSE;
4000*53ee8cc1Swenshuai.xi     }
4001*53ee8cc1Swenshuai.xi 
4002*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
4003*53ee8cc1Swenshuai.xi 
4004*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
4005*53ee8cc1Swenshuai.xi     {
4006*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
4007*53ee8cc1Swenshuai.xi         return FALSE;
4008*53ee8cc1Swenshuai.xi     }
4009*53ee8cc1Swenshuai.xi 
4010*53ee8cc1Swenshuai.xi     if(pwinFB->in_use == 0)
4011*53ee8cc1Swenshuai.xi     {
4012*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_NOT_ALLOCATED);
4013*53ee8cc1Swenshuai.xi         GOP_M_ERR("%s: fbId=%td is not in existence\n",__FUNCTION__,(ptrdiff_t)u32fbId);
4014*53ee8cc1Swenshuai.xi         return FALSE;
4015*53ee8cc1Swenshuai.xi     }
4016*53ee8cc1Swenshuai.xi 
4017*53ee8cc1Swenshuai.xi     u8GwinGop = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,gWinId);
4018*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGop])
4019*53ee8cc1Swenshuai.xi     {
4020*53ee8cc1Swenshuai.xi         u8GWinBase=0;
4021*53ee8cc1Swenshuai.xi         for(i=0;i<u8GwinGop;i++)
4022*53ee8cc1Swenshuai.xi         {
4023*53ee8cc1Swenshuai.xi             u8GWinBase += MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, i);
4024*53ee8cc1Swenshuai.xi         }
4025*53ee8cc1Swenshuai.xi         if(gWinId != u8GWinBase)
4026*53ee8cc1Swenshuai.xi         {
4027*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n[%s] not support TLB mode, gwin id:0x%tx ", __FUNCTION__, (ptrdiff_t)gWinId);
4028*53ee8cc1Swenshuai.xi         }
4029*53ee8cc1Swenshuai.xi     }
4030*53ee8cc1Swenshuai.xi     u64FlipAddr = pwinFB->addr;
4031*53ee8cc1Swenshuai.xi 
4032*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GwinGop])
4033*53ee8cc1Swenshuai.xi     {
4034*53ee8cc1Swenshuai.xi         MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
4035*53ee8cc1Swenshuai.xi         DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
4036*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GwinGop, &GopDst);
4037*53ee8cc1Swenshuai.xi         _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
4038*53ee8cc1Swenshuai.xi         if(bHMirror || bVMirror)
4039*53ee8cc1Swenshuai.xi         {
4040*53ee8cc1Swenshuai.xi             GOP_GwinInfo stGwinInfo;
4041*53ee8cc1Swenshuai.xi             GOP_GetWinInfo(pInstance,gWinId, &stGwinInfo);
4042*53ee8cc1Swenshuai.xi             stGwinInfo.u32DRAMRBlkStart = u64FlipAddr;
4043*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->sMirrorInfo[gWinId].u64NonMirrorFBAdr = u64FlipAddr;
4044*53ee8cc1Swenshuai.xi             _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,gWinId, bHMirror, bVMirror, &stGwinInfo);
4045*53ee8cc1Swenshuai.xi             u64FlipAddr = stGwinInfo.u32DRAMRBlkStart;
4046*53ee8cc1Swenshuai.xi         }
4047*53ee8cc1Swenshuai.xi     }
4048*53ee8cc1Swenshuai.xi     else
4049*53ee8cc1Swenshuai.xi     {
4050*53ee8cc1Swenshuai.xi         if(u8GwinGop > GOPTYPE.GOP0)
4051*53ee8cc1Swenshuai.xi         {
4052*53ee8cc1Swenshuai.xi             MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
4053*53ee8cc1Swenshuai.xi             DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
4054*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GwinGop, &GopDst);
4055*53ee8cc1Swenshuai.xi             _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
4056*53ee8cc1Swenshuai.xi             if(bHMirror || bVMirror)
4057*53ee8cc1Swenshuai.xi             {
4058*53ee8cc1Swenshuai.xi                 GOP_GwinInfo stGwinInfo;
4059*53ee8cc1Swenshuai.xi                 GOP_GetWinInfo(pInstance,gWinId, &stGwinInfo);
4060*53ee8cc1Swenshuai.xi                 stGwinInfo.u32DRAMRBlkStart = u64FlipAddr;
4061*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->sMirrorInfo[gWinId].u64NonMirrorFBAdr = u64FlipAddr;
4062*53ee8cc1Swenshuai.xi                 _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,gWinId, bHMirror, bVMirror, &stGwinInfo);
4063*53ee8cc1Swenshuai.xi                 u64FlipAddr = stGwinInfo.u32DRAMRBlkStart;
4064*53ee8cc1Swenshuai.xi             }
4065*53ee8cc1Swenshuai.xi         }
4066*53ee8cc1Swenshuai.xi     }
4067*53ee8cc1Swenshuai.xi     if(MDrv_GOP_SwitchGWIN2Addr(g_pGOPCtxLocal, gWinId, u64FlipAddr, (MS_U32)0, u32WaitTagID, pU32QueueCnt))
4068*53ee8cc1Swenshuai.xi     {
4069*53ee8cc1Swenshuai.xi         GOP_WinFB_INFO* pCurwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gWinId].u32CurFBId);
4070*53ee8cc1Swenshuai.xi 
4071*53ee8cc1Swenshuai.xi         if(pCurwinFB == NULL)
4072*53ee8cc1Swenshuai.xi         {
4073*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gWinId].u32CurFBId);
4074*53ee8cc1Swenshuai.xi             return FALSE;
4075*53ee8cc1Swenshuai.xi         }
4076*53ee8cc1Swenshuai.xi 
4077*53ee8cc1Swenshuai.xi          if( g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gWinId].u32CurFBId<DRV_MAX_GWIN_FB_SUPPORT)
4078*53ee8cc1Swenshuai.xi             pCurwinFB->gWinId = GWIN_ID_INVALID;
4079*53ee8cc1Swenshuai.xi 
4080*53ee8cc1Swenshuai.xi           g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gWinId].u32CurFBId = u32fbId;
4081*53ee8cc1Swenshuai.xi         return TRUE;
4082*53ee8cc1Swenshuai.xi     }
4083*53ee8cc1Swenshuai.xi 
4084*53ee8cc1Swenshuai.xi     return FALSE;
4085*53ee8cc1Swenshuai.xi }
4086*53ee8cc1Swenshuai.xi 
4087*53ee8cc1Swenshuai.xi 
GOP_MIUSel(void * pInstance,MS_U8 u8GOP,EN_GOP_SEL_TYPE MiuSel)4088*53ee8cc1Swenshuai.xi MS_U32 GOP_MIUSel(void* pInstance,MS_U8 u8GOP, EN_GOP_SEL_TYPE MiuSel )
4089*53ee8cc1Swenshuai.xi {
4090*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4091*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4092*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4093*53ee8cc1Swenshuai.xi #endif
4094*53ee8cc1Swenshuai.xi 
4095*53ee8cc1Swenshuai.xi     MDrv_GOP_MIU_Sel(g_pGOPCtxLocal,u8GOP,(E_DRV_GOP_SEL_TYPE)MiuSel);
4096*53ee8cc1Swenshuai.xi 
4097*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4098*53ee8cc1Swenshuai.xi }
4099*53ee8cc1Swenshuai.xi 
GOP_GetMIUSel(void * pInstance,MS_U8 u8GOP)4100*53ee8cc1Swenshuai.xi MS_U8 GOP_GetMIUSel(void* pInstance,MS_U8 u8GOP)
4101*53ee8cc1Swenshuai.xi {
4102*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4103*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4104*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4105*53ee8cc1Swenshuai.xi #endif
4106*53ee8cc1Swenshuai.xi 
4107*53ee8cc1Swenshuai.xi     return MDrv_GOP_Get_MIU_Sel(g_pGOPCtxLocal,u8GOP);
4108*53ee8cc1Swenshuai.xi 
4109*53ee8cc1Swenshuai.xi }
4110*53ee8cc1Swenshuai.xi 
GOP_SetAlphaInverse(void * pInstance,MS_U32 gop,MS_BOOL bEn)4111*53ee8cc1Swenshuai.xi MS_U32 GOP_SetAlphaInverse(void* pInstance,MS_U32 gop, MS_BOOL bEn)
4112*53ee8cc1Swenshuai.xi {
4113*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4114*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4115*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4116*53ee8cc1Swenshuai.xi #endif
4117*53ee8cc1Swenshuai.xi 
4118*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, gop, bEn);
4119*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4120*53ee8cc1Swenshuai.xi }
GOP_GetAlphaInverse(void * pInstance,MS_U32 gop)4121*53ee8cc1Swenshuai.xi MS_BOOL GOP_GetAlphaInverse(void* pInstance,MS_U32 gop)
4122*53ee8cc1Swenshuai.xi {
4123*53ee8cc1Swenshuai.xi     MS_BOOL bEn;
4124*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4125*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4126*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4127*53ee8cc1Swenshuai.xi #endif
4128*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetAlphaInverse(g_pGOPCtxLocal,gop, &bEn);
4129*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4130*53ee8cc1Swenshuai.xi }
4131*53ee8cc1Swenshuai.xi 
GOP_SetContrast(void * pInstance,MS_U8 u8GOP,MS_U16 u16YContrast,MS_U16 u16UContrast,MS_U16 u16VContrast)4132*53ee8cc1Swenshuai.xi MS_U32 GOP_SetContrast(void* pInstance,MS_U8 u8GOP, MS_U16 u16YContrast, MS_U16 u16UContrast, MS_U16 u16VContrast )
4133*53ee8cc1Swenshuai.xi {
4134*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet = GOP_API_FAIL;
4135*53ee8cc1Swenshuai.xi 
4136*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4137*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4138*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4139*53ee8cc1Swenshuai.xi #endif
4140*53ee8cc1Swenshuai.xi 
4141*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_SetGOPContrast( g_pGOPCtxLocal, u8GOP, u16YContrast, u16UContrast, u16VContrast );
4142*53ee8cc1Swenshuai.xi 
4143*53ee8cc1Swenshuai.xi     return enRet;
4144*53ee8cc1Swenshuai.xi }
4145*53ee8cc1Swenshuai.xi 
GOP_GetContrast(void * pInstance,MS_U8 u8GOP,MS_U32 * YContrast,MS_U32 * UContrast,MS_U32 * VContrast)4146*53ee8cc1Swenshuai.xi MS_U32 GOP_GetContrast(void* pInstance,MS_U8 u8GOP, MS_U32* YContrast, MS_U32* UContrast, MS_U32* VContrast )
4147*53ee8cc1Swenshuai.xi {
4148*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet= GOP_API_FAIL;
4149*53ee8cc1Swenshuai.xi 
4150*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4151*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4152*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4153*53ee8cc1Swenshuai.xi #endif
4154*53ee8cc1Swenshuai.xi 
4155*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_GetGOPContrast( g_pGOPCtxLocal, u8GOP, YContrast, UContrast, VContrast );
4156*53ee8cc1Swenshuai.xi     return enRet;
4157*53ee8cc1Swenshuai.xi }
4158*53ee8cc1Swenshuai.xi 
4159*53ee8cc1Swenshuai.xi 
4160*53ee8cc1Swenshuai.xi 
GOP_SetBrightness(void * pInstance,MS_U8 u8GOP,MS_U16 u16BriVal,MS_BOOL bMSB)4161*53ee8cc1Swenshuai.xi MS_U32 GOP_SetBrightness(void* pInstance,MS_U8 u8GOP,MS_U16 u16BriVal,MS_BOOL bMSB)
4162*53ee8cc1Swenshuai.xi {
4163*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet=GOP_API_FAIL;
4164*53ee8cc1Swenshuai.xi 
4165*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4166*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4167*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4168*53ee8cc1Swenshuai.xi #endif
4169*53ee8cc1Swenshuai.xi 
4170*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_SetGOPBrightness(g_pGOPCtxLocal, u8GOP, u16BriVal,bMSB);
4171*53ee8cc1Swenshuai.xi 
4172*53ee8cc1Swenshuai.xi     return enRet;
4173*53ee8cc1Swenshuai.xi }
4174*53ee8cc1Swenshuai.xi 
GOP_GetBrightness(void * pInstance,MS_U8 u8GOP,MS_U16 * u16BriVal,MS_BOOL * bMSB)4175*53ee8cc1Swenshuai.xi MS_U32 GOP_GetBrightness(void* pInstance,MS_U8 u8GOP,MS_U16* u16BriVal,MS_BOOL* bMSB)
4176*53ee8cc1Swenshuai.xi {
4177*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet=GOP_API_FAIL;
4178*53ee8cc1Swenshuai.xi 
4179*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4180*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4181*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4182*53ee8cc1Swenshuai.xi #endif
4183*53ee8cc1Swenshuai.xi 
4184*53ee8cc1Swenshuai.xi     enRet =(E_GOP_API_Result)MDrv_GOP_GetGOPBrightness(g_pGOPCtxLocal,u8GOP,u16BriVal,bMSB);
4185*53ee8cc1Swenshuai.xi 
4186*53ee8cc1Swenshuai.xi     return enRet;
4187*53ee8cc1Swenshuai.xi }
4188*53ee8cc1Swenshuai.xi 
4189*53ee8cc1Swenshuai.xi 
GOP_SetOutputColor(void * pInstance,MS_U8 u8GOP,EN_GOP_OUTPUT_COLOR type)4190*53ee8cc1Swenshuai.xi MS_U32 GOP_SetOutputColor(void* pInstance,MS_U8 u8GOP, EN_GOP_OUTPUT_COLOR type)
4191*53ee8cc1Swenshuai.xi {
4192*53ee8cc1Swenshuai.xi 
4193*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4194*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4195*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4196*53ee8cc1Swenshuai.xi #endif
4197*53ee8cc1Swenshuai.xi 
4198*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->s32OutputColorType[u8GOP] = (MS_S32)type;
4199*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, (GOP_OupputColor)type);
4200*53ee8cc1Swenshuai.xi 
4201*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4202*53ee8cc1Swenshuai.xi }
4203*53ee8cc1Swenshuai.xi 
GOP_SetUVSwap(void * pInstance,MS_U8 u8GOP,MS_BOOL bEn)4204*53ee8cc1Swenshuai.xi MS_U32 GOP_SetUVSwap(void* pInstance,MS_U8 u8GOP, MS_BOOL bEn)
4205*53ee8cc1Swenshuai.xi {
4206*53ee8cc1Swenshuai.xi 
4207*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4208*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4209*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4210*53ee8cc1Swenshuai.xi #endif
4211*53ee8cc1Swenshuai.xi 
4212*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4213*53ee8cc1Swenshuai.xi     {
4214*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4215*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4216*53ee8cc1Swenshuai.xi     }
4217*53ee8cc1Swenshuai.xi 
4218*53ee8cc1Swenshuai.xi     MDrv_GOP_SetUVSwap(g_pGOPCtxLocal, u8GOP, bEn);
4219*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
4220*53ee8cc1Swenshuai.xi 
4221*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4222*53ee8cc1Swenshuai.xi 
4223*53ee8cc1Swenshuai.xi }
4224*53ee8cc1Swenshuai.xi 
4225*53ee8cc1Swenshuai.xi 
GOP_SetYCSwap(void * pInstance,MS_U8 u8GOP,MS_BOOL bEn)4226*53ee8cc1Swenshuai.xi MS_U32 GOP_SetYCSwap(void* pInstance,MS_U8 u8GOP, MS_BOOL bEn)
4227*53ee8cc1Swenshuai.xi {
4228*53ee8cc1Swenshuai.xi 
4229*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4230*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4231*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4232*53ee8cc1Swenshuai.xi #endif
4233*53ee8cc1Swenshuai.xi 
4234*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4235*53ee8cc1Swenshuai.xi     {
4236*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4237*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4238*53ee8cc1Swenshuai.xi     }
4239*53ee8cc1Swenshuai.xi 
4240*53ee8cc1Swenshuai.xi 
4241*53ee8cc1Swenshuai.xi     MDrv_GOP_SetYCSwap(g_pGOPCtxLocal, u8GOP, bEn);
4242*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
4243*53ee8cc1Swenshuai.xi 
4244*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4245*53ee8cc1Swenshuai.xi 
4246*53ee8cc1Swenshuai.xi }
4247*53ee8cc1Swenshuai.xi 
GOP_SetProgressive(void * pInstance,MS_U8 gop,MS_BOOL bEn)4248*53ee8cc1Swenshuai.xi MS_U32 GOP_SetProgressive(void* pInstance,MS_U8 gop,MS_BOOL bEn)
4249*53ee8cc1Swenshuai.xi {
4250*53ee8cc1Swenshuai.xi     MS_U8 u8WinIdx = 0x0;
4251*53ee8cc1Swenshuai.xi     MS_U8 u8GopIdx = 0x0;
4252*53ee8cc1Swenshuai.xi     MS_U8 u8StartWin = 0x0;
4253*53ee8cc1Swenshuai.xi     MS_U8 u8EndWin = 0x0;
4254*53ee8cc1Swenshuai.xi     MS_U8 i = 0x0;
4255*53ee8cc1Swenshuai.xi     MS_U8 u8GOPGwinMaxCount = 0x0;
4256*53ee8cc1Swenshuai.xi     MS_U16 u16StretchX = 0x0;
4257*53ee8cc1Swenshuai.xi     MS_U16 u16StretchY = 0x0;
4258*53ee8cc1Swenshuai.xi     MS_U16 u16StretchW = 0x0;
4259*53ee8cc1Swenshuai.xi     MS_U16 u16StretchH = 0x0;
4260*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
4261*53ee8cc1Swenshuai.xi     DRV_GOPDstType enDst = E_DRV_GOP_DST_INVALID;
4262*53ee8cc1Swenshuai.xi     EN_GOP_DST_TYPE GopDst = E_GOP_DST_OP0;
4263*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4264*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4265*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4266*53ee8cc1Swenshuai.xi #endif
4267*53ee8cc1Swenshuai.xi 
4268*53ee8cc1Swenshuai.xi     for (i=0; i < MAX_GOP_SUPPORT; i++)
4269*53ee8cc1Swenshuai.xi     {
4270*53ee8cc1Swenshuai.xi         if(u8GOPGwinMaxCount<MDrv_GOP_GetGwinNum(pInstance, i))
4271*53ee8cc1Swenshuai.xi             u8GOPGwinMaxCount=MDrv_GOP_GetGwinNum(pInstance, i);
4272*53ee8cc1Swenshuai.xi     }
4273*53ee8cc1Swenshuai.xi     GOP_GwinInfo winInfo[u8GOPGwinMaxCount];
4274*53ee8cc1Swenshuai.xi     MS_BOOL bGwinFBInit[u8GOPGwinMaxCount];
4275*53ee8cc1Swenshuai.xi     memset(winInfo,0,sizeof(GOP_GwinInfo)*u8GOPGwinMaxCount);
4276*53ee8cc1Swenshuai.xi     memset(bGwinFBInit,0,sizeof(MS_BOOL)*u8GOPGwinMaxCount);
4277*53ee8cc1Swenshuai.xi 
4278*53ee8cc1Swenshuai.xi     for (u8GopIdx = 0; u8GopIdx < gop; u8GopIdx++)
4279*53ee8cc1Swenshuai.xi     {
4280*53ee8cc1Swenshuai.xi         u8StartWin += MDrv_GOP_GetGwinNum(pInstance, u8GopIdx);
4281*53ee8cc1Swenshuai.xi     }
4282*53ee8cc1Swenshuai.xi     u8EndWin = u8StartWin + MDrv_GOP_GetGwinNum(pInstance, gop);
4283*53ee8cc1Swenshuai.xi 
4284*53ee8cc1Swenshuai.xi     if((u8EndWin-u8StartWin)>u8GOPGwinMaxCount)
4285*53ee8cc1Swenshuai.xi     {
4286*53ee8cc1Swenshuai.xi         printf("[%s][%d]GWINCount %d  is out of range\n",__FUNCTION__,__LINE__,u8EndWin-u8StartWin);
4287*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4288*53ee8cc1Swenshuai.xi     }
4289*53ee8cc1Swenshuai.xi 
4290*53ee8cc1Swenshuai.xi     for (i=0,u8WinIdx=u8StartWin; u8WinIdx<u8EndWin; u8WinIdx++,i++)
4291*53ee8cc1Swenshuai.xi     {
4292*53ee8cc1Swenshuai.xi         if (!_GOP_IsFbIdValid(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8WinIdx].u32CurFBId))
4293*53ee8cc1Swenshuai.xi         {
4294*53ee8cc1Swenshuai.xi             continue;
4295*53ee8cc1Swenshuai.xi         }
4296*53ee8cc1Swenshuai.xi         pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u8WinIdx].u32CurFBId);
4297*53ee8cc1Swenshuai.xi         if(pwinFB == NULL)
4298*53ee8cc1Swenshuai.xi             bGwinFBInit[i]=FALSE;
4299*53ee8cc1Swenshuai.xi         else
4300*53ee8cc1Swenshuai.xi             bGwinFBInit[i]=TRUE;
4301*53ee8cc1Swenshuai.xi     }
4302*53ee8cc1Swenshuai.xi 
4303*53ee8cc1Swenshuai.xi     for (i=0,u8WinIdx=u8StartWin; u8WinIdx<u8EndWin; u8WinIdx++,i++)
4304*53ee8cc1Swenshuai.xi     {
4305*53ee8cc1Swenshuai.xi         if(bGwinFBInit[i])
4306*53ee8cc1Swenshuai.xi             GOP_GetWinInfo(pInstance, u8WinIdx, &winInfo[i]);
4307*53ee8cc1Swenshuai.xi     }
4308*53ee8cc1Swenshuai.xi     _GOP_Get_StretchWin(pInstance, gop, &u16StretchX, &u16StretchY, &u16StretchW, &u16StretchH);
4309*53ee8cc1Swenshuai.xi 
4310*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, gop, bEn);
4311*53ee8cc1Swenshuai.xi 
4312*53ee8cc1Swenshuai.xi     for (i=0,u8WinIdx=u8StartWin; u8WinIdx<u8EndWin; u8WinIdx++,i++)
4313*53ee8cc1Swenshuai.xi     {
4314*53ee8cc1Swenshuai.xi         if(bGwinFBInit[i])
4315*53ee8cc1Swenshuai.xi             GOP_SetWinInfo(pInstance, u8WinIdx, &winInfo[i]);
4316*53ee8cc1Swenshuai.xi     }
4317*53ee8cc1Swenshuai.xi 
4318*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, gop, &enDst);
4319*53ee8cc1Swenshuai.xi     _GOP_Map_DRVDst2API_Enum_(pInstance,&GopDst, enDst);
4320*53ee8cc1Swenshuai.xi     GOP_SetStretchWin(pInstance, gop, GopDst, u16StretchX, u16StretchY, u16StretchW, u16StretchH);
4321*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,gop);
4322*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4323*53ee8cc1Swenshuai.xi }
4324*53ee8cc1Swenshuai.xi 
GOP_SetHStart(void * pInstance,MS_U8 u8GOP,MS_U16 u16PanelHStr)4325*53ee8cc1Swenshuai.xi MS_U32 GOP_SetHStart(void* pInstance,MS_U8 u8GOP,MS_U16 u16PanelHStr)
4326*53ee8cc1Swenshuai.xi {
4327*53ee8cc1Swenshuai.xi 
4328*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4329*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4330*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4331*53ee8cc1Swenshuai.xi #endif
4332*53ee8cc1Swenshuai.xi 
4333*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4334*53ee8cc1Swenshuai.xi     {
4335*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4336*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4337*53ee8cc1Swenshuai.xi     }
4338*53ee8cc1Swenshuai.xi 
4339*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOP] = u16PanelHStr;
4340*53ee8cc1Swenshuai.xi     _GOP_InitHSPDByGOP(pInstance,u8GOP);
4341*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal, u8GOP);
4342*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4343*53ee8cc1Swenshuai.xi 
4344*53ee8cc1Swenshuai.xi }
4345*53ee8cc1Swenshuai.xi 
GOP_SetPanelTiming(void * pInstance,MS_U8 u8GOP,PST_GOP_TIMING_INFO pstInfo)4346*53ee8cc1Swenshuai.xi MS_U32 GOP_SetPanelTiming(void* pInstance,MS_U8 u8GOP,PST_GOP_TIMING_INFO pstInfo)
4347*53ee8cc1Swenshuai.xi {
4348*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4349*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4350*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4351*53ee8cc1Swenshuai.xi #endif
4352*53ee8cc1Swenshuai.xi 
4353*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4354*53ee8cc1Swenshuai.xi     {
4355*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4356*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4357*53ee8cc1Swenshuai.xi     }
4358*53ee8cc1Swenshuai.xi 
4359*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOP] = pstInfo->u16DEHStart;
4360*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8GOP] = pstInfo->u16DEHSize;
4361*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8GOP] = pstInfo->u16DEVSize;
4362*53ee8cc1Swenshuai.xi     _GOP_InitHSPDByGOP(pInstance,u8GOP);
4363*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4364*53ee8cc1Swenshuai.xi }
4365*53ee8cc1Swenshuai.xi 
GOP_GetPanelTiming(void * pInstance,MS_U8 u8GOP,PST_GOP_TIMING_INFO pstInfo)4366*53ee8cc1Swenshuai.xi MS_U32 GOP_GetPanelTiming(void* pInstance,MS_U8 u8GOP,PST_GOP_TIMING_INFO pstInfo)
4367*53ee8cc1Swenshuai.xi {
4368*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4369*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4370*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4371*53ee8cc1Swenshuai.xi #endif
4372*53ee8cc1Swenshuai.xi 
4373*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4374*53ee8cc1Swenshuai.xi     {
4375*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4376*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4377*53ee8cc1Swenshuai.xi     }
4378*53ee8cc1Swenshuai.xi 
4379*53ee8cc1Swenshuai.xi     pstInfo->u16DEHStart = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOP];
4380*53ee8cc1Swenshuai.xi     pstInfo->u16DEHSize = g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8GOP];
4381*53ee8cc1Swenshuai.xi     pstInfo->u16DEVSize = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8GOP];
4382*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4383*53ee8cc1Swenshuai.xi }
4384*53ee8cc1Swenshuai.xi 
GOP_CreateBuffer(void * pInstance,PGOP_BUFFER_INFO pBuff,MS_U32 fbid)4385*53ee8cc1Swenshuai.xi MS_U32 GOP_CreateBuffer(void* pInstance,PGOP_BUFFER_INFO  pBuff,MS_U32 fbid)
4386*53ee8cc1Swenshuai.xi {
4387*53ee8cc1Swenshuai.xi     _GOP_GWIN_CreatePoolFB(pInstance,fbid,pBuff->disp_rect.x,pBuff->disp_rect.y,pBuff->disp_rect.w,pBuff->disp_rect.h,pBuff->fbFmt,pBuff->FBString);
4388*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4389*53ee8cc1Swenshuai.xi }
GOP_CreateBufferByAddr(void * pInstance,PGOP_BUFFER_INFO pBuff,MS_U32 u32fbId)4390*53ee8cc1Swenshuai.xi MS_U32 GOP_CreateBufferByAddr(void* pInstance,PGOP_BUFFER_INFO  pBuff,MS_U32 u32fbId)
4391*53ee8cc1Swenshuai.xi {
4392*53ee8cc1Swenshuai.xi     MS_U32 size;
4393*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
4394*53ee8cc1Swenshuai.xi     MS_U32 width;
4395*53ee8cc1Swenshuai.xi     MS_U32 height;
4396*53ee8cc1Swenshuai.xi     MS_U32 pitch;
4397*53ee8cc1Swenshuai.xi     MS_U32 fbFmt;
4398*53ee8cc1Swenshuai.xi     MS_U32 u32FbAddr;
4399*53ee8cc1Swenshuai.xi     MS_U32 dispX,dispY;
4400*53ee8cc1Swenshuai.xi     EN_GOP_FRAMEBUFFER_STRING FBString;
4401*53ee8cc1Swenshuai.xi 
4402*53ee8cc1Swenshuai.xi 
4403*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
4404*53ee8cc1Swenshuai.xi     {
4405*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
4406*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
4407*53ee8cc1Swenshuai.xi     }
4408*53ee8cc1Swenshuai.xi 
4409*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
4410*53ee8cc1Swenshuai.xi 
4411*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
4412*53ee8cc1Swenshuai.xi     {
4413*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
4414*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
4415*53ee8cc1Swenshuai.xi     }
4416*53ee8cc1Swenshuai.xi 
4417*53ee8cc1Swenshuai.xi     if(pwinFB->in_use)
4418*53ee8cc1Swenshuai.xi     {
4419*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_ALREADY_ALLOCATED);
4420*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td is already allocated\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
4421*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
4422*53ee8cc1Swenshuai.xi 
4423*53ee8cc1Swenshuai.xi     }
4424*53ee8cc1Swenshuai.xi 
4425*53ee8cc1Swenshuai.xi     GOP_M_INFO("[%s][%d]: new gwinFBId = %td \n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId);
4426*53ee8cc1Swenshuai.xi 
4427*53ee8cc1Swenshuai.xi 
4428*53ee8cc1Swenshuai.xi     width     = pBuff->width;
4429*53ee8cc1Swenshuai.xi     height    = pBuff->height;
4430*53ee8cc1Swenshuai.xi     pitch     = pBuff->pitch;
4431*53ee8cc1Swenshuai.xi     fbFmt     = pBuff->fbFmt;
4432*53ee8cc1Swenshuai.xi     dispX     = pBuff->disp_rect.x;
4433*53ee8cc1Swenshuai.xi     dispY     = pBuff->disp_rect.y;
4434*53ee8cc1Swenshuai.xi     u32FbAddr = pBuff->addr;
4435*53ee8cc1Swenshuai.xi     FBString  = pBuff->FBString;
4436*53ee8cc1Swenshuai.xi 
4437*53ee8cc1Swenshuai.xi     size =  _GOP_CalcPitch(pInstance,fbFmt, width) *height;
4438*53ee8cc1Swenshuai.xi 
4439*53ee8cc1Swenshuai.xi     pwinFB->enable = FALSE;
4440*53ee8cc1Swenshuai.xi     pwinFB->in_use = 1;
4441*53ee8cc1Swenshuai.xi     pwinFB->obtain = 1;
4442*53ee8cc1Swenshuai.xi     pwinFB->x0 = dispX;
4443*53ee8cc1Swenshuai.xi     pwinFB->y0 = dispY;
4444*53ee8cc1Swenshuai.xi     pwinFB->width = width;
4445*53ee8cc1Swenshuai.xi     pwinFB->height= height;
4446*53ee8cc1Swenshuai.xi     pwinFB->x1 = pwinFB->x0 + width;
4447*53ee8cc1Swenshuai.xi     pwinFB->y1 = pwinFB->y0 +height;
4448*53ee8cc1Swenshuai.xi     pwinFB->addr  = u32FbAddr; //addr;
4449*53ee8cc1Swenshuai.xi     pwinFB->size  = size;
4450*53ee8cc1Swenshuai.xi     pwinFB->FBString  = (EN_DRV_FRAMEBUFFER_STRING)FBString;
4451*53ee8cc1Swenshuai.xi 
4452*53ee8cc1Swenshuai.xi     // FB format
4453*53ee8cc1Swenshuai.xi     pwinFB->fbFmt  = (fbFmt != FB_FMT_AS_DEFAULT) ? fbFmt : E_MS_FMT_ARGB1555;//g_pGOPCtxLocal->winFB[g_pGOPCtxLocal->pGOPCtxShared->gwinMap[GWIN_OSD_DEFAULT]].fbFmt;
4454*53ee8cc1Swenshuai.xi     if(pitch ==0)
4455*53ee8cc1Swenshuai.xi     {
4456*53ee8cc1Swenshuai.xi         pwinFB->pitch = _GOP_CalcPitch(pInstance,fbFmt, width);
4457*53ee8cc1Swenshuai.xi     }
4458*53ee8cc1Swenshuai.xi     else
4459*53ee8cc1Swenshuai.xi     {
4460*53ee8cc1Swenshuai.xi         pwinFB->pitch = pitch;
4461*53ee8cc1Swenshuai.xi     }
4462*53ee8cc1Swenshuai.xi     // update ptrs
4463*53ee8cc1Swenshuai.xi     pwinFB->poolId = GOP_WINFB_POOL_NULL;
4464*53ee8cc1Swenshuai.xi     pwinFB->nextFBIdInPool = INVALID_POOL_NEXT_FBID;
4465*53ee8cc1Swenshuai.xi     pwinFB->string = E_GOP_FB_NULL;
4466*53ee8cc1Swenshuai.xi     pwinFB->u32GOPClientId = (GETPIDTYPE)getpid();
4467*53ee8cc1Swenshuai.xi     GOP_M_INFO("\33[0;36m   %s:%d   FBId = %td \33[m \n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId);
4468*53ee8cc1Swenshuai.xi 
4469*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4470*53ee8cc1Swenshuai.xi }
4471*53ee8cc1Swenshuai.xi 
4472*53ee8cc1Swenshuai.xi 
GOP_Win_Destroy_Abnormal(void * pInstance,MS_U32 gId)4473*53ee8cc1Swenshuai.xi MS_U32 GOP_Win_Destroy_Abnormal(void* pInstance,MS_U32 gId)
4474*53ee8cc1Swenshuai.xi {
4475*53ee8cc1Swenshuai.xi     MS_U32 u32fbId;
4476*53ee8cc1Swenshuai.xi     GOP_GwinInfo gWin;
4477*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
4478*53ee8cc1Swenshuai.xi     MS_U8 u8GOP,u8MIU;
4479*53ee8cc1Swenshuai.xi 
4480*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4481*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4482*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4483*53ee8cc1Swenshuai.xi #endif
4484*53ee8cc1Swenshuai.xi 
4485*53ee8cc1Swenshuai.xi     GOP_M_INFO("\33[0;36m   %s:%d   gId = %td \33[m \n",__FUNCTION__,__LINE__,(ptrdiff_t)gId);
4486*53ee8cc1Swenshuai.xi 
4487*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gId))
4488*53ee8cc1Swenshuai.xi     {
4489*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gId);
4490*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4491*53ee8cc1Swenshuai.xi     }
4492*53ee8cc1Swenshuai.xi 
4493*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, gId, FALSE);
4494*53ee8cc1Swenshuai.xi     u32fbId = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId;
4495*53ee8cc1Swenshuai.xi 
4496*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
4497*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
4498*53ee8cc1Swenshuai.xi     {
4499*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
4500*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4501*53ee8cc1Swenshuai.xi     }
4502*53ee8cc1Swenshuai.xi 
4503*53ee8cc1Swenshuai.xi     if ((GOP_WINFB_POOL_NULL!=pwinFB->poolId) && (GOP_FB_Destroy(pInstance,u32fbId) != GWIN_OK))
4504*53ee8cc1Swenshuai.xi     {
4505*53ee8cc1Swenshuai.xi         MS_DEBUG_MSG( GOP_M_INFO( "[%s][%d], failed to delete FB %td\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId ) );
4506*53ee8cc1Swenshuai.xi 
4507*53ee8cc1Swenshuai.xi     }
4508*53ee8cc1Swenshuai.xi 
4509*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32CurFBId= GWIN_ID_INVALID;
4510*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u32GOPClientId = 0;
4511*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].bIsShared = FALSE;
4512*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gId].u16SharedCnt = 0;
4513*53ee8cc1Swenshuai.xi 
4514*53ee8cc1Swenshuai.xi     memset(&gWin, 0, sizeof(GOP_GwinInfo));
4515*53ee8cc1Swenshuai.xi     gWin.clrType = E_GOP_COLOR_ARGB8888;
4516*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,(gId));
4517*53ee8cc1Swenshuai.xi     u8MIU = MDrv_GOP_Get_MIU_Sel(g_pGOPCtxLocal,u8GOP);
4518*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP] != TRUE)
4519*53ee8cc1Swenshuai.xi     {
4520*53ee8cc1Swenshuai.xi         _miu_offset_to_phy(u8MIU,gWin.u32DRAMRBlkStart,gWin.u32DRAMRBlkStart);
4521*53ee8cc1Swenshuai.xi     }
4522*53ee8cc1Swenshuai.xi     GOP_SetWinInfo(pInstance,gId,&gWin);
4523*53ee8cc1Swenshuai.xi 
4524*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr, gId);
4525*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr, gId);
4526*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_HMirror_HPos, gId);
4527*53ee8cc1Swenshuai.xi     RESET_BIT(g_pGOPCtxLocal->u16GOP_VMirror_VPos, gId);
4528*53ee8cc1Swenshuai.xi 
4529*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_ClearFlipQueue(g_pGOPCtxLocal,gId);
4530*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4531*53ee8cc1Swenshuai.xi 
4532*53ee8cc1Swenshuai.xi }
4533*53ee8cc1Swenshuai.xi 
4534*53ee8cc1Swenshuai.xi 
GOP_ResetGOP(void * pInstance,MS_U8 u8GOP)4535*53ee8cc1Swenshuai.xi void GOP_ResetGOP(void* pInstance,MS_U8 u8GOP)
4536*53ee8cc1Swenshuai.xi {
4537*53ee8cc1Swenshuai.xi     MS_U32 i = 0,j = 0;
4538*53ee8cc1Swenshuai.xi     MS_U8 u8GwinId;
4539*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
4540*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet = GOP_API_FAIL;
4541*53ee8cc1Swenshuai.xi 
4542*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4543*53ee8cc1Swenshuai.xi         GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4544*53ee8cc1Swenshuai.xi         UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4545*53ee8cc1Swenshuai.xi #endif
4546*53ee8cc1Swenshuai.xi 
4547*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal ==NULL)
4548*53ee8cc1Swenshuai.xi     {
4549*53ee8cc1Swenshuai.xi         MS_BOOL bFirstInstance;
4550*53ee8cc1Swenshuai.xi         GOP_PreInit_Ctx(pInstance, &bFirstInstance);
4551*53ee8cc1Swenshuai.xi         if (MDrv_GOP_SetIOMapBase(g_pGOPCtxLocal) != TRUE)
4552*53ee8cc1Swenshuai.xi         {
4553*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nget IO base fail"));
4554*53ee8cc1Swenshuai.xi             return ;
4555*53ee8cc1Swenshuai.xi         }
4556*53ee8cc1Swenshuai.xi     }
4557*53ee8cc1Swenshuai.xi 
4558*53ee8cc1Swenshuai.xi     u8GwinId = _GOP_SelGwinId2(pInstance,u8GOP, 0);
4559*53ee8cc1Swenshuai.xi     for(i = u8GwinId; i < u8GwinId + MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,u8GOP); i++)
4560*53ee8cc1Swenshuai.xi     {
4561*53ee8cc1Swenshuai.xi         //Check and release APP's GWIN resource
4562*53ee8cc1Swenshuai.xi         if(((FALSE == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].bIsShared)
4563*53ee8cc1Swenshuai.xi              && (DRV_MAX_GWIN_FB_SUPPORT>g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].u32CurFBId))
4564*53ee8cc1Swenshuai.xi              || ((TRUE == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].bIsShared)
4565*53ee8cc1Swenshuai.xi                   && (0x0 == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].u16SharedCnt)))
4566*53ee8cc1Swenshuai.xi 
4567*53ee8cc1Swenshuai.xi         {
4568*53ee8cc1Swenshuai.xi             for(j=0; j < DRV_MAX_GWIN_FB_SUPPORT; j++)
4569*53ee8cc1Swenshuai.xi             {
4570*53ee8cc1Swenshuai.xi                 pwinFB = _GetWinFB(pInstance,j);
4571*53ee8cc1Swenshuai.xi                 if(pwinFB != NULL)
4572*53ee8cc1Swenshuai.xi                 {
4573*53ee8cc1Swenshuai.xi                     if ((pwinFB->u32GOPClientId == g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].u32GOPClientId)
4574*53ee8cc1Swenshuai.xi                  && (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].u32CurFBId != j))
4575*53ee8cc1Swenshuai.xi                     {
4576*53ee8cc1Swenshuai.xi                         enRet = (E_GOP_API_Result)GOP_FB_Destroy(pInstance,j);
4577*53ee8cc1Swenshuai.xi                         GOP_M_INFO("\n---%s %d: Try DestroyWIN's FB[%tu], return[%u]\n", __FUNCTION__, __LINE__, (ptrdiff_t)j, (MS_U8)enRet);
4578*53ee8cc1Swenshuai.xi                     }
4579*53ee8cc1Swenshuai.xi                 }
4580*53ee8cc1Swenshuai.xi             }
4581*53ee8cc1Swenshuai.xi             if (g_pGOPCtxLocal->pGOPCtxShared->gwinMap[i].u32GOPClientId != 0)
4582*53ee8cc1Swenshuai.xi             {
4583*53ee8cc1Swenshuai.xi                 enRet = (E_GOP_API_Result)GOP_Win_Destroy_Abnormal(pInstance,i);
4584*53ee8cc1Swenshuai.xi                 GOP_M_INFO("\n---%s %d: Try DestroyWIN[%tu], return[%u]\n", __FUNCTION__, __LINE__,(ptrdiff_t) i, (MS_U8)enRet);
4585*53ee8cc1Swenshuai.xi             }
4586*53ee8cc1Swenshuai.xi         }
4587*53ee8cc1Swenshuai.xi     }
4588*53ee8cc1Swenshuai.xi }
4589*53ee8cc1Swenshuai.xi 
GOP_GWIN_InitByGOP(void * pInstance,MS_BOOL bFirstIntance,MS_U8 u8GOP)4590*53ee8cc1Swenshuai.xi static void GOP_GWIN_InitByGOP(void* pInstance,MS_BOOL bFirstIntance, MS_U8 u8GOP)
4591*53ee8cc1Swenshuai.xi {
4592*53ee8cc1Swenshuai.xi     MS_U8 i;
4593*53ee8cc1Swenshuai.xi     MS_U8 bytePerPix = 2;
4594*53ee8cc1Swenshuai.xi     MS_U16 width=0, height=0, pitch=0, fbFmt=0;
4595*53ee8cc1Swenshuai.xi     MS_U32 addr=0;
4596*53ee8cc1Swenshuai.xi     MS_U32 u32index;
4597*53ee8cc1Swenshuai.xi     GOP_GwinInfo gWin;
4598*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
4599*53ee8cc1Swenshuai.xi     MS_U32 MaxGwinSupport;
4600*53ee8cc1Swenshuai.xi     MS_U8 u8MIU;
4601*53ee8cc1Swenshuai.xi 
4602*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4603*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4604*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4605*53ee8cc1Swenshuai.xi #endif
4606*53ee8cc1Swenshuai.xi 
4607*53ee8cc1Swenshuai.xi     //GE_BufInfo buffinfo;
4608*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4609*53ee8cc1Swenshuai.xi     {
4610*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4611*53ee8cc1Swenshuai.xi         return;
4612*53ee8cc1Swenshuai.xi     }
4613*53ee8cc1Swenshuai.xi     GOP_M_INFO("MDrv_GOP_GWIN_Init\n");
4614*53ee8cc1Swenshuai.xi     memset(&gWin, 0, sizeof(GOP_GwinInfo));
4615*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGOPCtxShared->bInitShared)
4616*53ee8cc1Swenshuai.xi     {
4617*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->bInitShared = FALSE;
4618*53ee8cc1Swenshuai.xi         //First init of whole GOP Driver
4619*53ee8cc1Swenshuai.xi         for (u32index = 0; u32index <DRV_MAX_GWIN_FB_SUPPORT; u32index++)
4620*53ee8cc1Swenshuai.xi         {
4621*53ee8cc1Swenshuai.xi             pwinFB = _GetWinFB(pInstance,u32index);
4622*53ee8cc1Swenshuai.xi 
4623*53ee8cc1Swenshuai.xi             if(pwinFB == NULL)
4624*53ee8cc1Swenshuai.xi             {
4625*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32index);
4626*53ee8cc1Swenshuai.xi                 return;
4627*53ee8cc1Swenshuai.xi             }
4628*53ee8cc1Swenshuai.xi 
4629*53ee8cc1Swenshuai.xi             pwinFB->enable = FALSE;
4630*53ee8cc1Swenshuai.xi             pwinFB->in_use = 0;
4631*53ee8cc1Swenshuai.xi             pwinFB->obtain = 0;
4632*53ee8cc1Swenshuai.xi             pwinFB->gWinId = GWIN_ID_INVALID; // orig GWIN_OSD_DEFAULT;
4633*53ee8cc1Swenshuai.xi             pwinFB->x0 = gWin.u16DispHPixelStart = 0;
4634*53ee8cc1Swenshuai.xi             pwinFB->y0 = gWin.u16DispVPixelStart = 0;
4635*53ee8cc1Swenshuai.xi             pwinFB->width = gWin.u16RBlkHPixSize = 0;
4636*53ee8cc1Swenshuai.xi             pwinFB->height= gWin.u16RBlkVPixSize = 0;
4637*53ee8cc1Swenshuai.xi             pwinFB->x1 = gWin.u16DispHPixelEnd = 0;
4638*53ee8cc1Swenshuai.xi             pwinFB->y1 = gWin.u16DispVPixelEnd = 0;
4639*53ee8cc1Swenshuai.xi             pwinFB->pitch  = 0;
4640*53ee8cc1Swenshuai.xi             pwinFB->addr  = gWin.u32DRAMRBlkStart = 0;
4641*53ee8cc1Swenshuai.xi             pwinFB->size   = 0;
4642*53ee8cc1Swenshuai.xi             gWin.u16WinX = gWin.u16WinY = 0;
4643*53ee8cc1Swenshuai.xi             // FB format
4644*53ee8cc1Swenshuai.xi             pwinFB->fbFmt  = FB_FMT_AS_DEFAULT;
4645*53ee8cc1Swenshuai.xi             // update ptrs
4646*53ee8cc1Swenshuai.xi             pwinFB->poolId = GOP_WINFB_POOL_NULL;
4647*53ee8cc1Swenshuai.xi             pwinFB->nextFBIdInPool = INVALID_POOL_NEXT_FBID;
4648*53ee8cc1Swenshuai.xi             pwinFB->string = E_GOP_FB_NULL;
4649*53ee8cc1Swenshuai.xi             pwinFB->u32GOPClientId = INVALID_CLIENT_PID;
4650*53ee8cc1Swenshuai.xi         }
4651*53ee8cc1Swenshuai.xi     }
4652*53ee8cc1Swenshuai.xi     if(FALSE ==g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[u8GOP])
4653*53ee8cc1Swenshuai.xi     {
4654*53ee8cc1Swenshuai.xi         memset(&gWin, 0, sizeof(GOP_GwinInfo));
4655*53ee8cc1Swenshuai.xi         MS_BOOL bGwinEnable = FALSE;
4656*53ee8cc1Swenshuai.xi         for (i = 0; i<MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,u8GOP); i++)
4657*53ee8cc1Swenshuai.xi         {
4658*53ee8cc1Swenshuai.xi             u8MIU = MDrv_GOP_Get_MIU_Sel(g_pGOPCtxLocal,u8GOP);
4659*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP] != TRUE)
4660*53ee8cc1Swenshuai.xi             {
4661*53ee8cc1Swenshuai.xi                 _miu_offset_to_phy(u8MIU,gWin.u32DRAMRBlkStart,gWin.u32DRAMRBlkStart);
4662*53ee8cc1Swenshuai.xi             }
4663*53ee8cc1Swenshuai.xi             u32index = _GOP_SelGwinId2(pInstance,u8GOP, i);
4664*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->gwinMap[u32index].u32CurFBId= GWIN_ID_INVALID;
4665*53ee8cc1Swenshuai.xi             gWin.clrType = (EN_GOP_COLOR_TYPE)E_GOP_COLOR_ARGB1555;
4666*53ee8cc1Swenshuai.xi             //Disable all Gwin when GOP first init
4667*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_GWIN))
4668*53ee8cc1Swenshuai.xi             {
4669*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_IsGWINEnabled(g_pGOPCtxLocal, u32index, &bGwinEnable);
4670*53ee8cc1Swenshuai.xi                 if (bGwinEnable == TRUE)
4671*53ee8cc1Swenshuai.xi                 {
4672*53ee8cc1Swenshuai.xi                     //GWIN must be turn off in Vsync to avoid garbage
4673*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_ForceWrite_Update(g_pGOPCtxLocal, u8GOP, FALSE);
4674*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, u32index, FALSE);
4675*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_ForceWrite_Update(g_pGOPCtxLocal, u8GOP, TRUE);
4676*53ee8cc1Swenshuai.xi                 }
4677*53ee8cc1Swenshuai.xi                 GOP_SetWinInfo(pInstance,u32index, &gWin);
4678*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetBlending(g_pGOPCtxLocal, u32index, FALSE, 0x0);
4679*53ee8cc1Swenshuai.xi             }
4680*53ee8cc1Swenshuai.xi         }
4681*53ee8cc1Swenshuai.xi     }
4682*53ee8cc1Swenshuai.xi     /*
4683*53ee8cc1Swenshuai.xi     width = MDrv_Read2Byte(GE_REG_STBB_S_W+GE_REG_BASE)+1;
4684*53ee8cc1Swenshuai.xi     height = MDrv_Read2Byte(GE_REG_STBB_S_H+GE_REG_BASE)+1;
4685*53ee8cc1Swenshuai.xi     pitch = MDrv_Read2Byte(GE_REG_DB_PIT+GE_REG_BASE);
4686*53ee8cc1Swenshuai.xi     fbFmt = MDrv_Read2Byte(GE_REG_B_FM+GE_REG_BASE);
4687*53ee8cc1Swenshuai.xi     addr = MDrv_Read4Byte(GE_REG_DB_BASE0+GE_REG_BASE);
4688*53ee8cc1Swenshuai.xi     MDrv_GE_GetFrameBufferInfo(&width, &height, &pitch, &fbFmt, &addr);
4689*53ee8cc1Swenshuai.xi     */
4690*53ee8cc1Swenshuai.xi     //MDrv_GE_GetBufferInfo(&buffinfo);
4691*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,DRV_MAX_GWIN_FB_SUPPORT);
4692*53ee8cc1Swenshuai.xi     MaxGwinSupport = g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum;
4693*53ee8cc1Swenshuai.xi 
4694*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
4695*53ee8cc1Swenshuai.xi     {
4696*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%ld\n",__FUNCTION__,__LINE__,DRV_MAX_GWIN_FB_SUPPORT);
4697*53ee8cc1Swenshuai.xi         return;
4698*53ee8cc1Swenshuai.xi     }
4699*53ee8cc1Swenshuai.xi 
4700*53ee8cc1Swenshuai.xi     pwinFB->enable = TRUE;
4701*53ee8cc1Swenshuai.xi     pwinFB->in_use = 1;
4702*53ee8cc1Swenshuai.xi     pwinFB->obtain = 1;
4703*53ee8cc1Swenshuai.xi     pwinFB->gWinId = MaxGwinSupport;
4704*53ee8cc1Swenshuai.xi     pwinFB->x0 = 0;
4705*53ee8cc1Swenshuai.xi     pwinFB->y0 = 0;
4706*53ee8cc1Swenshuai.xi     pwinFB->width = width;
4707*53ee8cc1Swenshuai.xi     pwinFB->height = height;
4708*53ee8cc1Swenshuai.xi     pwinFB->x1  = pwinFB->x0 + pwinFB->width;
4709*53ee8cc1Swenshuai.xi     pwinFB->y1  = pwinFB->y0 + pwinFB->height;
4710*53ee8cc1Swenshuai.xi     pwinFB->pitch = (pitch & 0xFFF8);  // pitch must be 4-pix alignment;
4711*53ee8cc1Swenshuai.xi     pwinFB->addr   = addr;
4712*53ee8cc1Swenshuai.xi     pwinFB->size  =  ((MS_U32)width) * ((MS_U32)height) * ((MS_U32)bytePerPix);
4713*53ee8cc1Swenshuai.xi     // FB format
4714*53ee8cc1Swenshuai.xi     pwinFB->fbFmt  = fbFmt;
4715*53ee8cc1Swenshuai.xi     // update ptrs
4716*53ee8cc1Swenshuai.xi     pwinFB->poolId = GOP_WINFB_POOL_NULL;
4717*53ee8cc1Swenshuai.xi     pwinFB->nextFBIdInPool = INVALID_POOL_NEXT_FBID;
4718*53ee8cc1Swenshuai.xi     pwinFB->string = E_GOP_FB_NULL;
4719*53ee8cc1Swenshuai.xi     pwinFB->u32GOPClientId = INVALID_CLIENT_PID;
4720*53ee8cc1Swenshuai.xi 
4721*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[MaxGwinSupport].u32CurFBId= DRV_MAX_GWIN_FB_SUPPORT;
4722*53ee8cc1Swenshuai.xi 
4723*53ee8cc1Swenshuai.xi }
4724*53ee8cc1Swenshuai.xi 
4725*53ee8cc1Swenshuai.xi 
GOP_GWIN_OutputLayerSwitch(void * pInstance,MS_U8 u8GOP)4726*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_OutputLayerSwitch(void* pInstance,MS_U8 u8GOP)
4727*53ee8cc1Swenshuai.xi {
4728*53ee8cc1Swenshuai.xi     E_GOP_API_Result GOPRet;
4729*53ee8cc1Swenshuai.xi 
4730*53ee8cc1Swenshuai.xi 
4731*53ee8cc1Swenshuai.xi //#ifndef MSOS_TYPE_LINUX
4732*53ee8cc1Swenshuai.xi     MS_U8 i;
4733*53ee8cc1Swenshuai.xi 
4734*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4735*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4736*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4737*53ee8cc1Swenshuai.xi #endif
4738*53ee8cc1Swenshuai.xi 
4739*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
4740*53ee8cc1Swenshuai.xi     {
4741*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
4742*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
4743*53ee8cc1Swenshuai.xi     }
4744*53ee8cc1Swenshuai.xi 
4745*53ee8cc1Swenshuai.xi     GOPRet = (E_GOP_API_Result)MDrv_GOP_SetGOPHighPri(g_pGOPCtxLocal, u8GOP);
4746*53ee8cc1Swenshuai.xi     for (i=0; i<_GOP_GetMaxGOPNum(pInstance); i++)
4747*53ee8cc1Swenshuai.xi     {
4748*53ee8cc1Swenshuai.xi         _GOP_InitHSPDByGOP(pInstance,i);
4749*53ee8cc1Swenshuai.xi     }
4750*53ee8cc1Swenshuai.xi 
4751*53ee8cc1Swenshuai.xi     return GOPRet;
4752*53ee8cc1Swenshuai.xi }
GOP_GetCurrentGOP(void * pInstance)4753*53ee8cc1Swenshuai.xi MS_U32 GOP_GetCurrentGOP(void* pInstance)
4754*53ee8cc1Swenshuai.xi {
4755*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4756*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4757*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4758*53ee8cc1Swenshuai.xi #endif
4759*53ee8cc1Swenshuai.xi 
4760*53ee8cc1Swenshuai.xi     return MDrv_GOP_Get(g_pGOPCtxLocal);
4761*53ee8cc1Swenshuai.xi }
4762*53ee8cc1Swenshuai.xi 
GOP_GetCurrentGWin(void * pInstance)4763*53ee8cc1Swenshuai.xi MS_U32 GOP_GetCurrentGWin(void* pInstance)
4764*53ee8cc1Swenshuai.xi {
4765*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4766*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4767*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4768*53ee8cc1Swenshuai.xi #endif
4769*53ee8cc1Swenshuai.xi 
4770*53ee8cc1Swenshuai.xi     return g_pGOPCtxLocal->current_winId;
4771*53ee8cc1Swenshuai.xi }
4772*53ee8cc1Swenshuai.xi 
GOP_GetCurrentFBID(void * pInstance)4773*53ee8cc1Swenshuai.xi MS_U32 GOP_GetCurrentFBID(void* pInstance)
4774*53ee8cc1Swenshuai.xi {
4775*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
4776*53ee8cc1Swenshuai.xi 
4777*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4778*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4779*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4780*53ee8cc1Swenshuai.xi #endif
4781*53ee8cc1Swenshuai.xi 
4782*53ee8cc1Swenshuai.xi     MS_U8 curWinId = GOP_GetCurrentGWin(pInstance);
4783*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,curWinId))
4784*53ee8cc1Swenshuai.xi     {
4785*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is not exist\n",__FUNCTION__,__LINE__,curWinId);
4786*53ee8cc1Swenshuai.xi         return GWIN_ID_INVALID;
4787*53ee8cc1Swenshuai.xi     }
4788*53ee8cc1Swenshuai.xi 
4789*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[curWinId].u32CurFBId);
4790*53ee8cc1Swenshuai.xi 
4791*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
4792*53ee8cc1Swenshuai.xi     {
4793*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[curWinId].u32CurFBId);
4794*53ee8cc1Swenshuai.xi         return GWIN_ID_INVALID;
4795*53ee8cc1Swenshuai.xi     }
4796*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[curWinId].u32CurFBId))
4797*53ee8cc1Swenshuai.xi     {
4798*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[curWinId].u32CurFBId);
4799*53ee8cc1Swenshuai.xi         return GWIN_ID_INVALID;
4800*53ee8cc1Swenshuai.xi     }
4801*53ee8cc1Swenshuai.xi 
4802*53ee8cc1Swenshuai.xi     if (0==pwinFB->in_use)
4803*53ee8cc1Swenshuai.xi     {
4804*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td is not allocated\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[curWinId].u32CurFBId);
4805*53ee8cc1Swenshuai.xi         return GWIN_ID_INVALID;
4806*53ee8cc1Swenshuai.xi 
4807*53ee8cc1Swenshuai.xi     }
4808*53ee8cc1Swenshuai.xi     return g_pGOPCtxLocal->pGOPCtxShared->gwinMap[curWinId].u32CurFBId;
4809*53ee8cc1Swenshuai.xi 
4810*53ee8cc1Swenshuai.xi }
4811*53ee8cc1Swenshuai.xi 
4812*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetHMirror(void * pInstance,MS_BOOL bEnable)4813*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetHMirror(void* pInstance,MS_BOOL bEnable)
4814*53ee8cc1Swenshuai.xi {
4815*53ee8cc1Swenshuai.xi     MS_U8 u8GwinID=0, u8GWinBase=0, u8GOPWinNum=0, u8GOPIdx=0;
4816*53ee8cc1Swenshuai.xi     MS_U16 u16GwinState = 0;
4817*53ee8cc1Swenshuai.xi     GOP_GwinInfo sGWININfo;
4818*53ee8cc1Swenshuai.xi     MS_BOOL bUpdateRegOnce = FALSE, bHMirror = FALSE, bVMirror = FALSE;
4819*53ee8cc1Swenshuai.xi 
4820*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4821*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4822*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4823*53ee8cc1Swenshuai.xi #endif
4824*53ee8cc1Swenshuai.xi 
4825*53ee8cc1Swenshuai.xi     bUpdateRegOnce = g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE];
4826*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->bHMirror = bEnable;
4827*53ee8cc1Swenshuai.xi 
4828*53ee8cc1Swenshuai.xi     for(u8GOPIdx=0; u8GOPIdx < MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal);u8GOPIdx++)
4829*53ee8cc1Swenshuai.xi     {
4830*53ee8cc1Swenshuai.xi         MDrv_GOP_IsGOPMirrorEnable(g_pGOPCtxLocal, u8GOPIdx, &bHMirror, &bVMirror);
4831*53ee8cc1Swenshuai.xi         if(bHMirror == bEnable)
4832*53ee8cc1Swenshuai.xi         {
4833*53ee8cc1Swenshuai.xi             continue; //Duplicate mirror setting, skip it
4834*53ee8cc1Swenshuai.xi         }
4835*53ee8cc1Swenshuai.xi 
4836*53ee8cc1Swenshuai.xi         u8GOPWinNum = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, u8GOPIdx);
4837*53ee8cc1Swenshuai.xi         if(u8GOPWinNum == 0xff)
4838*53ee8cc1Swenshuai.xi         {
4839*53ee8cc1Swenshuai.xi             continue; //NO Gwin, skip it
4840*53ee8cc1Swenshuai.xi         }
4841*53ee8cc1Swenshuai.xi 
4842*53ee8cc1Swenshuai.xi         u8GWinBase = _GOP_SelGwinId2(pInstance, u8GOPIdx, 0);
4843*53ee8cc1Swenshuai.xi         u16GwinState = 0; //Clear GWIN on/off state
4844*53ee8cc1Swenshuai.xi          //Turn off all on state GWIN
4845*53ee8cc1Swenshuai.xi         for (u8GwinID=u8GWinBase; u8GwinID<u8GWinBase+u8GOPWinNum; u8GwinID++)
4846*53ee8cc1Swenshuai.xi         {
4847*53ee8cc1Swenshuai.xi             if (!_GOP_IsGwinIdValid(pInstance,u8GwinID))
4848*53ee8cc1Swenshuai.xi             {
4849*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8GwinID);
4850*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
4851*53ee8cc1Swenshuai.xi             }
4852*53ee8cc1Swenshuai.xi 
4853*53ee8cc1Swenshuai.xi             if (g_pGOPCtxLocal->pGOPCtxShared->bGWINEnable[u8GwinID] != TRUE)
4854*53ee8cc1Swenshuai.xi             {
4855*53ee8cc1Swenshuai.xi                 continue;
4856*53ee8cc1Swenshuai.xi             }
4857*53ee8cc1Swenshuai.xi 
4858*53ee8cc1Swenshuai.xi             if(_GOP_GWIN_IsGwinExistInClient(pInstance,u8GwinID)== TRUE)
4859*53ee8cc1Swenshuai.xi             {
4860*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, u8GwinID, FALSE);
4861*53ee8cc1Swenshuai.xi                 u16GwinState |= (1<<u8GwinID);
4862*53ee8cc1Swenshuai.xi             }
4863*53ee8cc1Swenshuai.xi             else
4864*53ee8cc1Swenshuai.xi             {
4865*53ee8cc1Swenshuai.xi                 u16GwinState = 0xFFFF;
4866*53ee8cc1Swenshuai.xi                 break; //This GWIn does not exist in current client, skip gop mirror setting
4867*53ee8cc1Swenshuai.xi             }
4868*53ee8cc1Swenshuai.xi         }
4869*53ee8cc1Swenshuai.xi 
4870*53ee8cc1Swenshuai.xi         if(u16GwinState == 0xFFFF)
4871*53ee8cc1Swenshuai.xi         {
4872*53ee8cc1Swenshuai.xi             continue;//This GWIn does not exist in current client, skip gop mirror setting
4873*53ee8cc1Swenshuai.xi         }
4874*53ee8cc1Swenshuai.xi 
4875*53ee8cc1Swenshuai.xi         //Enable mirror
4876*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableHMirror(g_pGOPCtxLocal, u8GOPIdx, bEnable);
4877*53ee8cc1Swenshuai.xi         //Reset ON state GWIN info after mirror enable
4878*53ee8cc1Swenshuai.xi         if(u16GwinState !=0)
4879*53ee8cc1Swenshuai.xi         {
4880*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = TRUE; //Update GWIN info and GWIN enable one time
4881*53ee8cc1Swenshuai.xi             for (u8GwinID=u8GWinBase; u8GwinID<u8GWinBase+u8GOPWinNum; u8GwinID++)
4882*53ee8cc1Swenshuai.xi             {
4883*53ee8cc1Swenshuai.xi                 if(u16GwinState & (1<<u8GwinID))
4884*53ee8cc1Swenshuai.xi                 {
4885*53ee8cc1Swenshuai.xi                     if(GOP_GetWinInfo(pInstance,u8GwinID, &sGWININfo) == TRUE)
4886*53ee8cc1Swenshuai.xi                     {
4887*53ee8cc1Swenshuai.xi                         GOP_SetWinInfo(pInstance,u8GwinID, &sGWININfo);
4888*53ee8cc1Swenshuai.xi                     }
4889*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, u8GwinID, TRUE);
4890*53ee8cc1Swenshuai.xi                 }
4891*53ee8cc1Swenshuai.xi             }
4892*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = bUpdateRegOnce;
4893*53ee8cc1Swenshuai.xi         }
4894*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal, u8GOPIdx);
4895*53ee8cc1Swenshuai.xi     }
4896*53ee8cc1Swenshuai.xi 
4897*53ee8cc1Swenshuai.xi     if (bEnable == FALSE)
4898*53ee8cc1Swenshuai.xi     {
4899*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->u16GOP_HMirror_HPos = 0;
4900*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->u16GOP_HMirrorRBLK_Adr = 0;
4901*53ee8cc1Swenshuai.xi     }
4902*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4903*53ee8cc1Swenshuai.xi }
4904*53ee8cc1Swenshuai.xi 
4905*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetVMirror(void * pInstance,MS_BOOL bEnable)4906*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetVMirror(void* pInstance,MS_BOOL bEnable)
4907*53ee8cc1Swenshuai.xi {
4908*53ee8cc1Swenshuai.xi     MS_U8 u8GwinID=0, u8GWinBase=0, u8GOPWinNum=0, u8GOPIdx=0;
4909*53ee8cc1Swenshuai.xi     MS_U16 u16GwinState = 0;
4910*53ee8cc1Swenshuai.xi     GOP_GwinInfo sGWININfo;
4911*53ee8cc1Swenshuai.xi     MS_BOOL bUpdateRegOnce = FALSE, bHMirror = FALSE, bVMirror = FALSE;
4912*53ee8cc1Swenshuai.xi 
4913*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
4914*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
4915*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
4916*53ee8cc1Swenshuai.xi #endif
4917*53ee8cc1Swenshuai.xi 
4918*53ee8cc1Swenshuai.xi     bUpdateRegOnce = g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE];
4919*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->bVMirror = bEnable;
4920*53ee8cc1Swenshuai.xi 
4921*53ee8cc1Swenshuai.xi     for(u8GOPIdx=0; u8GOPIdx < MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal);u8GOPIdx++)
4922*53ee8cc1Swenshuai.xi     {
4923*53ee8cc1Swenshuai.xi         MDrv_GOP_IsGOPMirrorEnable(g_pGOPCtxLocal, u8GOPIdx, &bHMirror, &bVMirror);
4924*53ee8cc1Swenshuai.xi         if(bVMirror == bEnable)
4925*53ee8cc1Swenshuai.xi         {
4926*53ee8cc1Swenshuai.xi             continue; //Duplicate mirror setting, skip it
4927*53ee8cc1Swenshuai.xi         }
4928*53ee8cc1Swenshuai.xi 
4929*53ee8cc1Swenshuai.xi         u8GOPWinNum = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, u8GOPIdx);
4930*53ee8cc1Swenshuai.xi 		if(u8GOPWinNum == 0xff)
4931*53ee8cc1Swenshuai.xi         {
4932*53ee8cc1Swenshuai.xi             continue; //NO Gwin, skip it
4933*53ee8cc1Swenshuai.xi         }
4934*53ee8cc1Swenshuai.xi 
4935*53ee8cc1Swenshuai.xi         u8GWinBase = _GOP_SelGwinId2(pInstance, u8GOPIdx, 0);
4936*53ee8cc1Swenshuai.xi         u16GwinState = 0; //Clear GWIN on/off state
4937*53ee8cc1Swenshuai.xi          //Turn off all on state GWIN
4938*53ee8cc1Swenshuai.xi         for (u8GwinID=u8GWinBase; u8GwinID<u8GWinBase+u8GOPWinNum; u8GwinID++)
4939*53ee8cc1Swenshuai.xi         {
4940*53ee8cc1Swenshuai.xi             if (!_GOP_IsGwinIdValid(pInstance,u8GwinID))
4941*53ee8cc1Swenshuai.xi             {
4942*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8GwinID);
4943*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
4944*53ee8cc1Swenshuai.xi             }
4945*53ee8cc1Swenshuai.xi 
4946*53ee8cc1Swenshuai.xi             if (g_pGOPCtxLocal->pGOPCtxShared->bGWINEnable[u8GwinID] != TRUE)
4947*53ee8cc1Swenshuai.xi             {
4948*53ee8cc1Swenshuai.xi                 continue;
4949*53ee8cc1Swenshuai.xi             }
4950*53ee8cc1Swenshuai.xi 
4951*53ee8cc1Swenshuai.xi             if(_GOP_GWIN_IsGwinExistInClient(pInstance,u8GwinID)== TRUE)
4952*53ee8cc1Swenshuai.xi             {
4953*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, u8GwinID, FALSE);
4954*53ee8cc1Swenshuai.xi                 u16GwinState |= (1<<u8GwinID);
4955*53ee8cc1Swenshuai.xi             }
4956*53ee8cc1Swenshuai.xi             else
4957*53ee8cc1Swenshuai.xi             {
4958*53ee8cc1Swenshuai.xi                 u16GwinState = 0xFFFF;
4959*53ee8cc1Swenshuai.xi                 break; //This GWIn does not exist in current client, skip gop mirror setting
4960*53ee8cc1Swenshuai.xi             }
4961*53ee8cc1Swenshuai.xi         }
4962*53ee8cc1Swenshuai.xi 
4963*53ee8cc1Swenshuai.xi         if(u16GwinState == 0xFFFF)
4964*53ee8cc1Swenshuai.xi         {
4965*53ee8cc1Swenshuai.xi             continue; //There is GWIn does not exist in current client, skip gop mirror setting
4966*53ee8cc1Swenshuai.xi         }
4967*53ee8cc1Swenshuai.xi 
4968*53ee8cc1Swenshuai.xi         //Enable mirror
4969*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableVMirror(g_pGOPCtxLocal, u8GOPIdx, bEnable);
4970*53ee8cc1Swenshuai.xi         //Reset ON state GWIN info after mirror enable
4971*53ee8cc1Swenshuai.xi         if(u16GwinState !=0)
4972*53ee8cc1Swenshuai.xi         {
4973*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = TRUE; //Update GWIN info and GWIN enable one time
4974*53ee8cc1Swenshuai.xi             for (u8GwinID=u8GWinBase; u8GwinID<u8GWinBase+u8GOPWinNum; u8GwinID++)
4975*53ee8cc1Swenshuai.xi             {
4976*53ee8cc1Swenshuai.xi                 if(u16GwinState & (1<<u8GwinID))
4977*53ee8cc1Swenshuai.xi                 {
4978*53ee8cc1Swenshuai.xi                     if(GOP_GetWinInfo(pInstance,u8GwinID, &sGWININfo) == TRUE)
4979*53ee8cc1Swenshuai.xi                     {
4980*53ee8cc1Swenshuai.xi                         GOP_SetWinInfo(pInstance,u8GwinID, &sGWININfo);
4981*53ee8cc1Swenshuai.xi                     }
4982*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, u8GwinID, TRUE);
4983*53ee8cc1Swenshuai.xi                 }
4984*53ee8cc1Swenshuai.xi             }
4985*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = bUpdateRegOnce;
4986*53ee8cc1Swenshuai.xi         }
4987*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal, u8GOPIdx);
4988*53ee8cc1Swenshuai.xi     }
4989*53ee8cc1Swenshuai.xi 
4990*53ee8cc1Swenshuai.xi     if (bEnable == FALSE)
4991*53ee8cc1Swenshuai.xi     {
4992*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->u16GOP_VMirrorRBLK_Adr = 0;
4993*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->u16GOP_VMirror_VPos = 0;
4994*53ee8cc1Swenshuai.xi     }
4995*53ee8cc1Swenshuai.xi 
4996*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
4997*53ee8cc1Swenshuai.xi 
4998*53ee8cc1Swenshuai.xi }
4999*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetNewAlphaMode(void * pInstance,MS_U8 gwin,MS_BOOL bEn)5000*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetNewAlphaMode(void* pInstance,MS_U8 gwin, MS_BOOL bEn)
5001*53ee8cc1Swenshuai.xi {
5002*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5003*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5004*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5005*53ee8cc1Swenshuai.xi #endif
5006*53ee8cc1Swenshuai.xi 
5007*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gwin))
5008*53ee8cc1Swenshuai.xi     {
5009*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,gwin);
5010*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
5011*53ee8cc1Swenshuai.xi     }
5012*53ee8cc1Swenshuai.xi 
5013*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetNewAlphaMode(g_pGOPCtxLocal, gwin, bEn);
5014*53ee8cc1Swenshuai.xi 
5015*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5016*53ee8cc1Swenshuai.xi 
5017*53ee8cc1Swenshuai.xi }
5018*53ee8cc1Swenshuai.xi 
GOP_GWIN_IsEnable(void * pInstance,MS_U8 winId)5019*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_IsEnable(void* pInstance,MS_U8 winId)
5020*53ee8cc1Swenshuai.xi {
5021*53ee8cc1Swenshuai.xi     MS_BOOL IsEnable =FALSE;
5022*53ee8cc1Swenshuai.xi 
5023*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5024*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5025*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5026*53ee8cc1Swenshuai.xi #endif
5027*53ee8cc1Swenshuai.xi 
5028*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,winId))
5029*53ee8cc1Swenshuai.xi     {
5030*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,winId);
5031*53ee8cc1Swenshuai.xi         return FALSE;
5032*53ee8cc1Swenshuai.xi     }
5033*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_IsGWINEnabled(g_pGOPCtxLocal, winId, &IsEnable);
5034*53ee8cc1Swenshuai.xi     return IsEnable;
5035*53ee8cc1Swenshuai.xi }
5036*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetEnable(void * pInstance,MS_U8 winId,MS_BOOL bEnable)5037*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetEnable(void* pInstance,MS_U8 winId, MS_BOOL bEnable)
5038*53ee8cc1Swenshuai.xi {
5039*53ee8cc1Swenshuai.xi     MS_U16 regval2 =0,i;
5040*53ee8cc1Swenshuai.xi     MS_U32 u32fbId;
5041*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
5042*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5043*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5044*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5045*53ee8cc1Swenshuai.xi #endif
5046*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,winId))
5047*53ee8cc1Swenshuai.xi     {
5048*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,winId);
5049*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
5050*53ee8cc1Swenshuai.xi     }
5051*53ee8cc1Swenshuai.xi 
5052*53ee8cc1Swenshuai.xi     //printf("GWINID=%d,Enable=%d\n",(MS_U8)winId,(MS_U8)bEnable);
5053*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,winId))
5054*53ee8cc1Swenshuai.xi     {
5055*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is not exist\n",__FUNCTION__,__LINE__,winId);
5056*53ee8cc1Swenshuai.xi         //__ASSERT(0);
5057*53ee8cc1Swenshuai.xi     }
5058*53ee8cc1Swenshuai.xi 
5059*53ee8cc1Swenshuai.xi     //   printf(" u8win=%02bx, bEnable=%02bx\n",winId,bEnable);
5060*53ee8cc1Swenshuai.xi     u32fbId = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[winId].u32CurFBId;
5061*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
5062*53ee8cc1Swenshuai.xi 
5063*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
5064*53ee8cc1Swenshuai.xi     {
5065*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%d\n",__FUNCTION__,__LINE__,(unsigned int)u32fbId);
5066*53ee8cc1Swenshuai.xi         goto fail;
5067*53ee8cc1Swenshuai.xi     }
5068*53ee8cc1Swenshuai.xi 
5069*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
5070*53ee8cc1Swenshuai.xi     {
5071*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %d  is out of range\n",__FUNCTION__,__LINE__,(unsigned int)u32fbId);
5072*53ee8cc1Swenshuai.xi         goto fail;
5073*53ee8cc1Swenshuai.xi     }
5074*53ee8cc1Swenshuai.xi 
5075*53ee8cc1Swenshuai.xi     if (0 == pwinFB->in_use)
5076*53ee8cc1Swenshuai.xi     {
5077*53ee8cc1Swenshuai.xi         msWarning(ERR_GWIN_ID_NOT_ALLOCATED);
5078*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d not allocated\n",__FUNCTION__,__LINE__,winId);
5079*53ee8cc1Swenshuai.xi         goto fail;
5080*53ee8cc1Swenshuai.xi     }
5081*53ee8cc1Swenshuai.xi      pwinFB->enable = bEnable;
5082*53ee8cc1Swenshuai.xi 
5083*53ee8cc1Swenshuai.xi     //regval2 = MApi_GOP_GWIN_GetActiveGWIN();
5084*53ee8cc1Swenshuai.xi 
5085*53ee8cc1Swenshuai.xi     for(i = 0; i < g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum ; i++)
5086*53ee8cc1Swenshuai.xi     {
5087*53ee8cc1Swenshuai.xi         if(GOP_GWIN_IsEnable(pInstance,i) == TRUE)
5088*53ee8cc1Swenshuai.xi         {
5089*53ee8cc1Swenshuai.xi             regval2 |= 1<<i;
5090*53ee8cc1Swenshuai.xi         }
5091*53ee8cc1Swenshuai.xi     }
5092*53ee8cc1Swenshuai.xi 
5093*53ee8cc1Swenshuai.xi     if (bEnable == 0) // Turn off GOP
5094*53ee8cc1Swenshuai.xi     {
5095*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, winId, FALSE);
5096*53ee8cc1Swenshuai.xi         if ((regval2 & ~(1<<winId)) == 0)
5097*53ee8cc1Swenshuai.xi         {
5098*53ee8cc1Swenshuai.xi             if(fpXCReduceBWForOSD!=NULL)
5099*53ee8cc1Swenshuai.xi             {
5100*53ee8cc1Swenshuai.xi                 fpXCReduceBWForOSD(XC_MAIN_WINDOW, FALSE);
5101*53ee8cc1Swenshuai.xi             }
5102*53ee8cc1Swenshuai.xi         }
5103*53ee8cc1Swenshuai.xi     }
5104*53ee8cc1Swenshuai.xi     else //turn on GOP
5105*53ee8cc1Swenshuai.xi     {
5106*53ee8cc1Swenshuai.xi         //printf("gop on, interlace=%bx\n", IsSrcInterlace());
5107*53ee8cc1Swenshuai.xi         if(fpXCReduceBWForOSD!=NULL)
5108*53ee8cc1Swenshuai.xi         {
5109*53ee8cc1Swenshuai.xi             fpXCReduceBWForOSD(XC_MAIN_WINDOW, TRUE);
5110*53ee8cc1Swenshuai.xi         }
5111*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, winId, TRUE);
5112*53ee8cc1Swenshuai.xi     }
5113*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5114*53ee8cc1Swenshuai.xi 
5115*53ee8cc1Swenshuai.xi fail:
5116*53ee8cc1Swenshuai.xi     if (bEnable == 0) // Turn off GOP
5117*53ee8cc1Swenshuai.xi     {
5118*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, winId, FALSE);
5119*53ee8cc1Swenshuai.xi     }
5120*53ee8cc1Swenshuai.xi     return GOP_API_FAIL;
5121*53ee8cc1Swenshuai.xi }
5122*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetBlending(void * pInstance,MS_U8 u8win,MS_BOOL bEnable,MS_U8 u8coef)5123*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetBlending(void* pInstance,MS_U8 u8win, MS_BOOL bEnable, MS_U8 u8coef)
5124*53ee8cc1Swenshuai.xi {
5125*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5126*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5127*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5128*53ee8cc1Swenshuai.xi #endif
5129*53ee8cc1Swenshuai.xi 
5130*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
5131*53ee8cc1Swenshuai.xi     {
5132*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
5133*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
5134*53ee8cc1Swenshuai.xi     }
5135*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetBlending(g_pGOPCtxLocal, u8win,bEnable,u8coef);
5136*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5137*53ee8cc1Swenshuai.xi 
5138*53ee8cc1Swenshuai.xi }
5139*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetBlink(void * pInstance,MS_U8 winId,MS_BOOL bEnable,MS_U8 u8rate)5140*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetBlink(void* pInstance,MS_U8 winId,MS_BOOL bEnable, MS_U8 u8rate)
5141*53ee8cc1Swenshuai.xi {
5142*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5143*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5144*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5145*53ee8cc1Swenshuai.xi #endif
5146*53ee8cc1Swenshuai.xi 
5147*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetBlink(g_pGOPCtxLocal,winId, bEnable, u8rate);
5148*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5149*53ee8cc1Swenshuai.xi }
GOP_GWIN_Set_VStretchMode(void * pInstance,MS_U8 u8GOP,EN_GOP_STRETCH_VMODE VStrchMode)5150*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_Set_VStretchMode(void* pInstance,MS_U8 u8GOP,EN_GOP_STRETCH_VMODE VStrchMode)
5151*53ee8cc1Swenshuai.xi {
5152*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5153*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5154*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5155*53ee8cc1Swenshuai.xi #endif
5156*53ee8cc1Swenshuai.xi     switch(VStrchMode)
5157*53ee8cc1Swenshuai.xi     {
5158*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_LINEAR:
5159*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_LINEAR_GAIN0:
5160*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_LINEAR_GAIN1:
5161*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Set_VStretchMode(g_pGOPCtxLocal,u8GOP,E_DRV_GOP_VSTRCH_LINEAR);
5162*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Load_VStretchModeTable(g_pGOPCtxLocal,u8GOP,(DRV_GOPStrchVMode)VStrchMode);
5163*53ee8cc1Swenshuai.xi             break;
5164*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_DUPLICATE:
5165*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_NEAREST:
5166*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_LINEAR_GAIN2:
5167*53ee8cc1Swenshuai.xi         case E_GOP_VSTRCH_4TAP:
5168*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Set_VStretchMode(g_pGOPCtxLocal,u8GOP, (DRV_GOPStrchVMode)VStrchMode);
5169*53ee8cc1Swenshuai.xi             break;
5170*53ee8cc1Swenshuai.xi         default:
5171*53ee8cc1Swenshuai.xi             return(GOP_API_ENUM_NOT_SUPPORTED);
5172*53ee8cc1Swenshuai.xi             break;
5173*53ee8cc1Swenshuai.xi     }
5174*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5175*53ee8cc1Swenshuai.xi }
GOP_GWIN_Set_HStretchMode(void * pInstance,MS_U8 u8GOP,EN_GOP_STRETCH_HMODE HStrchMode)5176*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_Set_HStretchMode(void* pInstance,MS_U8 u8GOP,EN_GOP_STRETCH_HMODE HStrchMode)
5177*53ee8cc1Swenshuai.xi {
5178*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5179*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5180*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5181*53ee8cc1Swenshuai.xi #endif
5182*53ee8cc1Swenshuai.xi     switch(HStrchMode)
5183*53ee8cc1Swenshuai.xi     {
5184*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_DUPLICATE:
5185*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Set_HStretchMode(g_pGOPCtxLocal,u8GOP, (DRV_GOPStrchHMode)E_GOP_HSTRCH_DUPLICATE);
5186*53ee8cc1Swenshuai.xi             break;
5187*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE:
5188*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_LINEAR:
5189*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_NEAREST:
5190*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_GAIN0:
5191*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_GAIN1:
5192*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_GAIN2:
5193*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_GAIN3:
5194*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_GAIN4:
5195*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_6TAPE_GAIN5:
5196*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_2TAPE:
5197*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Set_HStretchMode(g_pGOPCtxLocal,u8GOP, (DRV_GOPStrchHMode)E_GOP_HSTRCH_6TAPE);
5198*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Load_HStretchModeTable(g_pGOPCtxLocal,u8GOP,(DRV_GOPStrchHMode)HStrchMode);
5199*53ee8cc1Swenshuai.xi             break;
5200*53ee8cc1Swenshuai.xi         case E_GOP_HSTRCH_4TAPE:
5201*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_Set_HStretchMode(g_pGOPCtxLocal,u8GOP, (DRV_GOPStrchHMode)E_GOP_HSTRCH_4TAPE);
5202*53ee8cc1Swenshuai.xi             break;
5203*53ee8cc1Swenshuai.xi         default:
5204*53ee8cc1Swenshuai.xi             return(GOP_API_ENUM_NOT_SUPPORTED);
5205*53ee8cc1Swenshuai.xi             break;
5206*53ee8cc1Swenshuai.xi     }
5207*53ee8cc1Swenshuai.xi 
5208*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5209*53ee8cc1Swenshuai.xi }
GOP_GWIN_Set_TranspColorStretchMode(void * pInstance,MS_U8 u8GOP,EN_GOP_STRCH_TRANSPCOLORMODE TColorStrchMode)5210*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_Set_TranspColorStretchMode(void* pInstance,MS_U8 u8GOP,EN_GOP_STRCH_TRANSPCOLORMODE  TColorStrchMode)
5211*53ee8cc1Swenshuai.xi {
5212*53ee8cc1Swenshuai.xi 	E_GOP_API_Result enRet=GOP_API_FAIL;
5213*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5214*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5215*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5216*53ee8cc1Swenshuai.xi #endif
5217*53ee8cc1Swenshuai.xi 	enRet = (E_GOP_API_Result)MDrv_GOP_GWIN_Set_TranspColorStretchMode(g_pGOPCtxLocal,u8GOP, (DRV_GOPSTRCH_TRANSPCOLORMODE)TColorStrchMode);
5218*53ee8cc1Swenshuai.xi     return enRet;
5219*53ee8cc1Swenshuai.xi }
5220*53ee8cc1Swenshuai.xi 
GOP_DWIN_GetDWinIntInfoTimeout(void * pInstance,GOP_DWinIntInfo * pDWinIntInfo,MS_U32 u32Timeout)5221*53ee8cc1Swenshuai.xi MS_U32 GOP_DWIN_GetDWinIntInfoTimeout(void* pInstance,GOP_DWinIntInfo *pDWinIntInfo,MS_U32 u32Timeout)
5222*53ee8cc1Swenshuai.xi {
5223*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet=GOP_API_FAIL;
5224*53ee8cc1Swenshuai.xi     DRV_GOP_DWinIntInfo gopDWinIntInfo;
5225*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5226*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5227*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5228*53ee8cc1Swenshuai.xi #endif
5229*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_DWIN_GetDWinIntInfo(g_pGOPCtxLocal, &gopDWinIntInfo,u32Timeout);
5230*53ee8cc1Swenshuai.xi     pDWinIntInfo->u8DWinIntInfo = gopDWinIntInfo.u8DWinIntInfo;
5231*53ee8cc1Swenshuai.xi     return enRet;
5232*53ee8cc1Swenshuai.xi }
5233*53ee8cc1Swenshuai.xi 
GOP_GWIN_EnableT3DMode(void * pInstance,MS_BOOL bEnable)5234*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_EnableT3DMode(void* pInstance,MS_BOOL bEnable)
5235*53ee8cc1Swenshuai.xi {
5236*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5237*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5238*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5239*53ee8cc1Swenshuai.xi #endif
5240*53ee8cc1Swenshuai.xi 
5241*53ee8cc1Swenshuai.xi #ifdef ENABLE_GOP_T3DPATCH
5242*53ee8cc1Swenshuai.xi     MS_U8 u8GOPNum = 0;
5243*53ee8cc1Swenshuai.xi     DRV_GOPDstType enGopDst = E_DRV_GOP_DST_INVALID;
5244*53ee8cc1Swenshuai.xi     MS_U16 u16StrwinStr;
5245*53ee8cc1Swenshuai.xi 
5246*53ee8cc1Swenshuai.xi     if (bEnable)
5247*53ee8cc1Swenshuai.xi     {
5248*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGopChipProperty->GOP_PD = GOP_PD_T3D;
5249*53ee8cc1Swenshuai.xi     }
5250*53ee8cc1Swenshuai.xi     else
5251*53ee8cc1Swenshuai.xi     {
5252*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGopChipProperty->GOP_PD = GOP_PD_NORMAL;
5253*53ee8cc1Swenshuai.xi     }
5254*53ee8cc1Swenshuai.xi 
5255*53ee8cc1Swenshuai.xi     for (u8GOPNum = 0; u8GOPNum < MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal); u8GOPNum++)
5256*53ee8cc1Swenshuai.xi     {
5257*53ee8cc1Swenshuai.xi         if (!(g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[u8GOPNum]))
5258*53ee8cc1Swenshuai.xi         {
5259*53ee8cc1Swenshuai.xi             continue;
5260*53ee8cc1Swenshuai.xi         }
5261*53ee8cc1Swenshuai.xi 
5262*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOPNum, &enGopDst);
5263*53ee8cc1Swenshuai.xi         if (E_DRV_GOP_DST_OP0 == enGopDst)
5264*53ee8cc1Swenshuai.xi         {
5265*53ee8cc1Swenshuai.xi             _GOP_GetPDByDst(pInstance,u8GOPNum, enGopDst, &u16StrwinStr);
5266*53ee8cc1Swenshuai.xi             _GOP_AdjustHSPD(pInstance,u8GOPNum, u16StrwinStr, enGopDst);
5267*53ee8cc1Swenshuai.xi         }
5268*53ee8cc1Swenshuai.xi     }
5269*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateRegWithSync(g_pGOPCtxLocal, u8GOPNum, TRUE);
5270*53ee8cc1Swenshuai.xi #endif
5271*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
5272*53ee8cc1Swenshuai.xi }
5273*53ee8cc1Swenshuai.xi 
GOP_PowerOn(void * pInstance)5274*53ee8cc1Swenshuai.xi MS_U32 GOP_PowerOn(void* pInstance)
5275*53ee8cc1Swenshuai.xi {
5276*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5277*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5278*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5279*53ee8cc1Swenshuai.xi #endif
5280*53ee8cc1Swenshuai.xi 
5281*53ee8cc1Swenshuai.xi 	  if (g_pGOPCtxLocal->IsClkClosed)
5282*53ee8cc1Swenshuai.xi     {
5283*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n%s, The GOP has been powered on!!!\n",__FUNCTION__);
5284*53ee8cc1Swenshuai.xi         MDrv_GOP_SetClock(g_pGOPCtxLocal,TRUE);
5285*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->IsClkClosed = FALSE;
5286*53ee8cc1Swenshuai.xi         return(GOP_API_SUCCESS);
5287*53ee8cc1Swenshuai.xi     }
5288*53ee8cc1Swenshuai.xi     else
5289*53ee8cc1Swenshuai.xi     {
5290*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n%s,Warning!!! No need to power on again!\n",__FUNCTION__);
5291*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5292*53ee8cc1Swenshuai.xi     }
5293*53ee8cc1Swenshuai.xi }
GOP_PowerOff(void * pInstance)5294*53ee8cc1Swenshuai.xi MS_U32 GOP_PowerOff(void* pInstance)
5295*53ee8cc1Swenshuai.xi {
5296*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5297*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5298*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5299*53ee8cc1Swenshuai.xi #endif
5300*53ee8cc1Swenshuai.xi 
5301*53ee8cc1Swenshuai.xi 	  if (!g_pGOPCtxLocal->IsClkClosed)
5302*53ee8cc1Swenshuai.xi     {
5303*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n%s,Warning!!! The GOP has been powered off, please turn on it if you want to use\n",__FUNCTION__);
5304*53ee8cc1Swenshuai.xi         MDrv_GOP_SetClock(g_pGOPCtxLocal,FALSE);
5305*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->IsClkClosed =TRUE;
5306*53ee8cc1Swenshuai.xi         return(GOP_API_SUCCESS);
5307*53ee8cc1Swenshuai.xi     }
5308*53ee8cc1Swenshuai.xi     else
5309*53ee8cc1Swenshuai.xi     {
5310*53ee8cc1Swenshuai.xi         GOP_M_ERR("\n%s,Warning!!! No need to power off again!\n",__FUNCTION__);
5311*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5312*53ee8cc1Swenshuai.xi     }
5313*53ee8cc1Swenshuai.xi }
5314*53ee8cc1Swenshuai.xi 
GOP_GetRTStatus(void * pInstance,GOP_ApiStatus * pGopApiSts)5315*53ee8cc1Swenshuai.xi MS_U32 GOP_GetRTStatus(void* pInstance,GOP_ApiStatus *pGopApiSts)
5316*53ee8cc1Swenshuai.xi {
5317*53ee8cc1Swenshuai.xi 	  MS_U8 i, j;
5318*53ee8cc1Swenshuai.xi 
5319*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5320*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5321*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5322*53ee8cc1Swenshuai.xi #endif
5323*53ee8cc1Swenshuai.xi 
5324*53ee8cc1Swenshuai.xi     for (i=0; i<MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal); i++)
5325*53ee8cc1Swenshuai.xi     {
5326*53ee8cc1Swenshuai.xi         pGopApiSts->eGOPNumDstType[i] = (EN_GOP_DST_TYPE)0xFF;
5327*53ee8cc1Swenshuai.xi         pGopApiSts->u16GopNumStrWinHSize[i] = pGopApiSts->u16GopNumStrWinVSize[i] = 0xFF;
5328*53ee8cc1Swenshuai.xi 
5329*53ee8cc1Swenshuai.xi         switch (i)
5330*53ee8cc1Swenshuai.xi         {
5331*53ee8cc1Swenshuai.xi             case 0: //gop0
5332*53ee8cc1Swenshuai.xi             {
5333*53ee8cc1Swenshuai.xi                 MS_U8 u8GWinNum = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,i);
5334*53ee8cc1Swenshuai.xi                 for (j=0; j < u8GWinNum; j++)
5335*53ee8cc1Swenshuai.xi                 {
5336*53ee8cc1Swenshuai.xi                     pGopApiSts->Gop0GwinIsEnable[j] = FALSE;
5337*53ee8cc1Swenshuai.xi                 }
5338*53ee8cc1Swenshuai.xi             }
5339*53ee8cc1Swenshuai.xi             break;
5340*53ee8cc1Swenshuai.xi             case 1: //gop1
5341*53ee8cc1Swenshuai.xi             {
5342*53ee8cc1Swenshuai.xi                 MS_U8 u8GWinNum = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,i);
5343*53ee8cc1Swenshuai.xi                 for (j=0; j < u8GWinNum; j++)
5344*53ee8cc1Swenshuai.xi                 {
5345*53ee8cc1Swenshuai.xi                     pGopApiSts->Gop1GwinIsEnable[j] = FALSE;
5346*53ee8cc1Swenshuai.xi                 }
5347*53ee8cc1Swenshuai.xi             }
5348*53ee8cc1Swenshuai.xi             break;
5349*53ee8cc1Swenshuai.xi             case 2: //gop2
5350*53ee8cc1Swenshuai.xi             {
5351*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop2GwinIsEnable = FALSE;
5352*53ee8cc1Swenshuai.xi             }
5353*53ee8cc1Swenshuai.xi             break;
5354*53ee8cc1Swenshuai.xi             case 3: //gop3
5355*53ee8cc1Swenshuai.xi             {
5356*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop3GwinIsEnable = FALSE;
5357*53ee8cc1Swenshuai.xi             }
5358*53ee8cc1Swenshuai.xi             break;
5359*53ee8cc1Swenshuai.xi             case 4: //gop4
5360*53ee8cc1Swenshuai.xi             {
5361*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop4GwinIsEnable = FALSE;
5362*53ee8cc1Swenshuai.xi             }
5363*53ee8cc1Swenshuai.xi             break;
5364*53ee8cc1Swenshuai.xi             case 5: //gop5
5365*53ee8cc1Swenshuai.xi             {
5366*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop5GwinIsEnable = FALSE;
5367*53ee8cc1Swenshuai.xi             }
5368*53ee8cc1Swenshuai.xi             break;
5369*53ee8cc1Swenshuai.xi             default:
5370*53ee8cc1Swenshuai.xi                 break;
5371*53ee8cc1Swenshuai.xi         }
5372*53ee8cc1Swenshuai.xi     }
5373*53ee8cc1Swenshuai.xi 
5374*53ee8cc1Swenshuai.xi     for (i=0; i<MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal); i++)
5375*53ee8cc1Swenshuai.xi     {
5376*53ee8cc1Swenshuai.xi         //need refine check using DRV_GOPDstType or EN_GOP_DST_TYPE
5377*53ee8cc1Swenshuai.xi         DRV_GOPDstType enGOPDst = E_DRV_GOP_DST_INVALID;
5378*53ee8cc1Swenshuai.xi         pGopApiSts->u16GopNumStrWinHSize[i] = g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchWidth[i];
5379*53ee8cc1Swenshuai.xi         pGopApiSts->u16GopNumStrWinVSize[i] = g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchHeight[i];
5380*53ee8cc1Swenshuai.xi         //need refine check using DRV_GOPDstType or EN_GOP_DST_TYPE
5381*53ee8cc1Swenshuai.xi         (MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, i, &enGOPDst));
5382*53ee8cc1Swenshuai.xi         (_GOP_Map_DRVDst2API_Enum_(pInstance,&(pGopApiSts->eGOPNumDstType[i]), enGOPDst));
5383*53ee8cc1Swenshuai.xi 
5384*53ee8cc1Swenshuai.xi         switch (i)
5385*53ee8cc1Swenshuai.xi         {
5386*53ee8cc1Swenshuai.xi             case 0: //gop0
5387*53ee8cc1Swenshuai.xi             {
5388*53ee8cc1Swenshuai.xi                 MS_U8 u8GWinNum = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,i);
5389*53ee8cc1Swenshuai.xi                 for (j=0; j < u8GWinNum; j++)
5390*53ee8cc1Swenshuai.xi                 {
5391*53ee8cc1Swenshuai.xi                     pGopApiSts->Gop0GwinIsEnable[j] = GOP_GWIN_IsEnable(pInstance,j);
5392*53ee8cc1Swenshuai.xi                 }
5393*53ee8cc1Swenshuai.xi             }
5394*53ee8cc1Swenshuai.xi             break;
5395*53ee8cc1Swenshuai.xi             case 1: //gop1
5396*53ee8cc1Swenshuai.xi             {
5397*53ee8cc1Swenshuai.xi                 MS_U8 u8GWinNum = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,i);
5398*53ee8cc1Swenshuai.xi                 for (j=0; j < u8GWinNum; j++)
5399*53ee8cc1Swenshuai.xi                 {
5400*53ee8cc1Swenshuai.xi                     pGopApiSts->Gop1GwinIsEnable[j] = GOP_GWIN_IsEnable(pInstance,_GOP_SelGwinId2(pInstance,GOPTYPE.GOP1, (MS_U32)j));
5401*53ee8cc1Swenshuai.xi                 }
5402*53ee8cc1Swenshuai.xi             }
5403*53ee8cc1Swenshuai.xi             break;
5404*53ee8cc1Swenshuai.xi             case 2: //gop2
5405*53ee8cc1Swenshuai.xi             {
5406*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop2GwinIsEnable = GOP_GWIN_IsEnable(pInstance,_GOP_SelGwinId2(pInstance,GOPTYPE.GOP2, 0));
5407*53ee8cc1Swenshuai.xi             }
5408*53ee8cc1Swenshuai.xi             break;
5409*53ee8cc1Swenshuai.xi             case 3: //gop3
5410*53ee8cc1Swenshuai.xi             {
5411*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop3GwinIsEnable = GOP_GWIN_IsEnable(pInstance,_GOP_SelGwinId2(pInstance,GOPTYPE.GOP3, 0));
5412*53ee8cc1Swenshuai.xi             }
5413*53ee8cc1Swenshuai.xi             break;
5414*53ee8cc1Swenshuai.xi             case 4: //gop4
5415*53ee8cc1Swenshuai.xi             {
5416*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop4GwinIsEnable = GOP_GWIN_IsEnable(pInstance,_GOP_SelGwinId2(pInstance,GOPTYPE.GOP4, 0));
5417*53ee8cc1Swenshuai.xi             }
5418*53ee8cc1Swenshuai.xi             break;
5419*53ee8cc1Swenshuai.xi             case 5: //gop5
5420*53ee8cc1Swenshuai.xi             {
5421*53ee8cc1Swenshuai.xi                 pGopApiSts->Gop5GwinIsEnable = GOP_GWIN_IsEnable(pInstance,_GOP_SelGwinId2(pInstance,GOPTYPE.GOP5, 0));
5422*53ee8cc1Swenshuai.xi             }
5423*53ee8cc1Swenshuai.xi             break;
5424*53ee8cc1Swenshuai.xi             default:
5425*53ee8cc1Swenshuai.xi                 break;
5426*53ee8cc1Swenshuai.xi         }
5427*53ee8cc1Swenshuai.xi     }
5428*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
5429*53ee8cc1Swenshuai.xi }
5430*53ee8cc1Swenshuai.xi 
GOP_GetInfo(void * pInstance,GOP_ApiInfo * pGopApiInfo)5431*53ee8cc1Swenshuai.xi MS_U32 GOP_GetInfo(void* pInstance,GOP_ApiInfo* pGopApiInfo)
5432*53ee8cc1Swenshuai.xi {
5433*53ee8cc1Swenshuai.xi 	  MS_U8 u8GwinNum=0, i;
5434*53ee8cc1Swenshuai.xi     EN_GOP_DST_TYPE GopDst;
5435*53ee8cc1Swenshuai.xi 
5436*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5437*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5438*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5439*53ee8cc1Swenshuai.xi #endif
5440*53ee8cc1Swenshuai.xi 
5441*53ee8cc1Swenshuai.xi     for (i=0; i<MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal); i++)
5442*53ee8cc1Swenshuai.xi     {
5443*53ee8cc1Swenshuai.xi         u8GwinNum += MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,i);
5444*53ee8cc1Swenshuai.xi     }
5445*53ee8cc1Swenshuai.xi 
5446*53ee8cc1Swenshuai.xi     for (i=0; i < MAX_GOP_DST_SUPPORT; i++)
5447*53ee8cc1Swenshuai.xi     {
5448*53ee8cc1Swenshuai.xi         //need refine check using DRV_GOPDstType or EN_GOP_DST_TYPE
5449*53ee8cc1Swenshuai.xi         if (MDrv_GOP_GWIN_SetDstPlane(g_pGOPCtxLocal, 0, (DRV_GOPDstType)i,TRUE)==GOP_SUCCESS)
5450*53ee8cc1Swenshuai.xi         {
5451*53ee8cc1Swenshuai.xi             _GOP_Map_DRVDst2API_Enum_(pInstance,&GopDst, (DRV_GOPDstType)i);
5452*53ee8cc1Swenshuai.xi             pGopApiInfo->SupportGOPDst[i] = GopDst;
5453*53ee8cc1Swenshuai.xi         }
5454*53ee8cc1Swenshuai.xi         else
5455*53ee8cc1Swenshuai.xi         {
5456*53ee8cc1Swenshuai.xi             pGopApiInfo->SupportGOPDst[i] = (EN_GOP_DST_TYPE)0xFF;
5457*53ee8cc1Swenshuai.xi         }
5458*53ee8cc1Swenshuai.xi     }
5459*53ee8cc1Swenshuai.xi 
5460*53ee8cc1Swenshuai.xi     pGopApiInfo->u8MaxGOPNum = MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal);
5461*53ee8cc1Swenshuai.xi     pGopApiInfo->u8MaxGwinNum = u8GwinNum;
5462*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
5463*53ee8cc1Swenshuai.xi }
GOP_GWIN_SetGWinShared(void * pInstance,MS_U8 winId,MS_BOOL bIsShared)5464*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetGWinShared(void* pInstance,MS_U8 winId, MS_BOOL bIsShared)
5465*53ee8cc1Swenshuai.xi {
5466*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5467*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5468*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5469*53ee8cc1Swenshuai.xi #endif
5470*53ee8cc1Swenshuai.xi 
5471*53ee8cc1Swenshuai.xi 	  if (!_GOP_IsGwinIdValid(pInstance,winId))
5472*53ee8cc1Swenshuai.xi     {
5473*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,winId);
5474*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5475*53ee8cc1Swenshuai.xi     }
5476*53ee8cc1Swenshuai.xi 
5477*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[winId].bIsShared = true;
5478*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5479*53ee8cc1Swenshuai.xi }
GOP_GWIN_SetGWinSharedCnt(void * pInstance,MS_U8 winId,MS_U16 u16SharedCnt)5480*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetGWinSharedCnt(void* pInstance,MS_U8 winId, MS_U16 u16SharedCnt)
5481*53ee8cc1Swenshuai.xi {
5482*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5483*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5484*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5485*53ee8cc1Swenshuai.xi #endif
5486*53ee8cc1Swenshuai.xi 
5487*53ee8cc1Swenshuai.xi 	  if (!_GOP_IsGwinIdValid(pInstance,winId))
5488*53ee8cc1Swenshuai.xi     {
5489*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,winId);
5490*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5491*53ee8cc1Swenshuai.xi     }
5492*53ee8cc1Swenshuai.xi 
5493*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->gwinMap[winId].u16SharedCnt = u16SharedCnt;
5494*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5495*53ee8cc1Swenshuai.xi }
5496*53ee8cc1Swenshuai.xi 
GOP_GWIN_Switch2Gwin(void * pInstance,MS_U8 winId,void * pSet)5497*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_Switch2Gwin(void* pInstance,MS_U8 winId, void* pSet)
5498*53ee8cc1Swenshuai.xi {
5499*53ee8cc1Swenshuai.xi 	MS_U32 u32fbId;
5500*53ee8cc1Swenshuai.xi     MS_U16 fbFmt;
5501*53ee8cc1Swenshuai.xi     MS_PHY u64GeDstAdr=0;
5502*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
5503*53ee8cc1Swenshuai.xi     DRV_GOP_CBFmtInfo* FmtInfo = (DRV_GOP_CBFmtInfo*)pSet;
5504*53ee8cc1Swenshuai.xi 
5505*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5506*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5507*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5508*53ee8cc1Swenshuai.xi #endif
5509*53ee8cc1Swenshuai.xi 
5510*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,winId))
5511*53ee8cc1Swenshuai.xi     {
5512*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,winId);
5513*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5514*53ee8cc1Swenshuai.xi     }
5515*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,winId))
5516*53ee8cc1Swenshuai.xi     {
5517*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is not exist\n",__FUNCTION__,__LINE__,winId);
5518*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5519*53ee8cc1Swenshuai.xi     }
5520*53ee8cc1Swenshuai.xi 
5521*53ee8cc1Swenshuai.xi     u32fbId = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[winId].u32CurFBId;
5522*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
5523*53ee8cc1Swenshuai.xi 
5524*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
5525*53ee8cc1Swenshuai.xi     {
5526*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId);
5527*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5528*53ee8cc1Swenshuai.xi     }
5529*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
5530*53ee8cc1Swenshuai.xi     {
5531*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId);
5532*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5533*53ee8cc1Swenshuai.xi     }
5534*53ee8cc1Swenshuai.xi 
5535*53ee8cc1Swenshuai.xi     if (0==pwinFB->in_use)
5536*53ee8cc1Swenshuai.xi     {
5537*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td is not allocated\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId);
5538*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5539*53ee8cc1Swenshuai.xi 
5540*53ee8cc1Swenshuai.xi     }
5541*53ee8cc1Swenshuai.xi 
5542*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->current_winId = winId;
5543*53ee8cc1Swenshuai.xi     u64GeDstAdr=pwinFB->addr;
5544*53ee8cc1Swenshuai.xi     MDrv_GOP_ConvertAPIAddr2HAL(g_pGOPCtxLocal, winId, &u64GeDstAdr);
5545*53ee8cc1Swenshuai.xi     fbFmt = pwinFB->fbFmt;
5546*53ee8cc1Swenshuai.xi     if ( (pwinFB->fbFmt & 0xFF) == E_MS_FMT_ARGB1555 )
5547*53ee8cc1Swenshuai.xi         fbFmt = E_MS_FMT_ARGB1555_DST | (E_MS_FMT_ARGB1555_DST << 8);
5548*53ee8cc1Swenshuai.xi 
5549*53ee8cc1Swenshuai.xi     if(fpSetFBFmt != NULL)
5550*53ee8cc1Swenshuai.xi     {
5551*53ee8cc1Swenshuai.xi         fpSetFBFmt(pwinFB->pitch, u64GeDstAdr,fbFmt);
5552*53ee8cc1Swenshuai.xi         FmtInfo->u64Addr = u64GeDstAdr;
5553*53ee8cc1Swenshuai.xi         FmtInfo->u16Pitch = pwinFB->pitch;
5554*53ee8cc1Swenshuai.xi         FmtInfo->u16Fmt = fbFmt;
5555*53ee8cc1Swenshuai.xi     }
5556*53ee8cc1Swenshuai.xi     else
5557*53ee8cc1Swenshuai.xi     {
5558*53ee8cc1Swenshuai.xi         MS_DEBUG_MSG(GOP_M_INFO("%s: SetFBFmt is not hooked. Bypass switch...\n", __FUNCTION__));
5559*53ee8cc1Swenshuai.xi     }
5560*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
5561*53ee8cc1Swenshuai.xi }
5562*53ee8cc1Swenshuai.xi 
GOP_GWIN_IsGwinExist(void * pInstance,MS_U8 gId)5563*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_IsGwinExist(void* pInstance,MS_U8 gId)
5564*53ee8cc1Swenshuai.xi {
5565*53ee8cc1Swenshuai.xi     MS_U32 ret;
5566*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gId))
5567*53ee8cc1Swenshuai.xi     {
5568*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,gId);
5569*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5570*53ee8cc1Swenshuai.xi     }
5571*53ee8cc1Swenshuai.xi     ret = _GOP_GWIN_IsGwinExistInClient(pInstance,gId);
5572*53ee8cc1Swenshuai.xi     return ret;
5573*53ee8cc1Swenshuai.xi }
GOP_GWIN_GetFreeWinID(void * pInstance)5574*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_GetFreeWinID(void* pInstance)
5575*53ee8cc1Swenshuai.xi {
5576*53ee8cc1Swenshuai.xi 	MS_U8 GWID = GWIN_ID_INVALID;
5577*53ee8cc1Swenshuai.xi     MS_U8 i=0,j=0;
5578*53ee8cc1Swenshuai.xi     MS_U16 k=0,l=0;
5579*53ee8cc1Swenshuai.xi 
5580*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5581*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5582*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5583*53ee8cc1Swenshuai.xi #endif
5584*53ee8cc1Swenshuai.xi 
5585*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,MDrv_GOP_Get(g_pGOPCtxLocal)))
5586*53ee8cc1Swenshuai.xi     {
5587*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,MDrv_GOP_Get(g_pGOPCtxLocal));
5588*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5589*53ee8cc1Swenshuai.xi     }
5590*53ee8cc1Swenshuai.xi 
5591*53ee8cc1Swenshuai.xi     if (MDrv_GOP_Get(g_pGOPCtxLocal)==1) //gop1
5592*53ee8cc1Swenshuai.xi     {
5593*53ee8cc1Swenshuai.xi         i = _GOP_SelGwinId2(pInstance,GOPTYPE.GOP1,0);
5594*53ee8cc1Swenshuai.xi         j = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,GOPTYPE.GOP1);
5595*53ee8cc1Swenshuai.xi     }
5596*53ee8cc1Swenshuai.xi     else if (MDrv_GOP_Get(g_pGOPCtxLocal)==0)
5597*53ee8cc1Swenshuai.xi     {
5598*53ee8cc1Swenshuai.xi         i = _GOP_SelGwinId2(pInstance,GOPTYPE.GOP0,0);
5599*53ee8cc1Swenshuai.xi         j = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,GOPTYPE.GOP0);
5600*53ee8cc1Swenshuai.xi     }
5601*53ee8cc1Swenshuai.xi     else if (MDrv_GOP_Get(g_pGOPCtxLocal)==2)
5602*53ee8cc1Swenshuai.xi     {
5603*53ee8cc1Swenshuai.xi         i = _GOP_SelGwinId2(pInstance,GOPTYPE.GOP2,0);
5604*53ee8cc1Swenshuai.xi         j = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,GOPTYPE.GOP2);
5605*53ee8cc1Swenshuai.xi     }
5606*53ee8cc1Swenshuai.xi     else if (MDrv_GOP_Get(g_pGOPCtxLocal)==3)
5607*53ee8cc1Swenshuai.xi     {
5608*53ee8cc1Swenshuai.xi         i = _GOP_SelGwinId2(pInstance,GOPTYPE.GOP3,0);
5609*53ee8cc1Swenshuai.xi         j = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,GOPTYPE.GOP3);
5610*53ee8cc1Swenshuai.xi     }
5611*53ee8cc1Swenshuai.xi     else if (MDrv_GOP_Get(g_pGOPCtxLocal)==4)
5612*53ee8cc1Swenshuai.xi     {
5613*53ee8cc1Swenshuai.xi         i = _GOP_SelGwinId2(pInstance,GOPTYPE.GOP4,0);
5614*53ee8cc1Swenshuai.xi         j = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,GOPTYPE.GOP4);
5615*53ee8cc1Swenshuai.xi     }
5616*53ee8cc1Swenshuai.xi     else if (MDrv_GOP_Get(g_pGOPCtxLocal)==5)
5617*53ee8cc1Swenshuai.xi     {
5618*53ee8cc1Swenshuai.xi         i = _GOP_SelGwinId2(pInstance,GOPTYPE.GOP5,0);
5619*53ee8cc1Swenshuai.xi         j = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,GOPTYPE.GOP5);
5620*53ee8cc1Swenshuai.xi     }
5621*53ee8cc1Swenshuai.xi     else
5622*53ee8cc1Swenshuai.xi     {
5623*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5624*53ee8cc1Swenshuai.xi     }
5625*53ee8cc1Swenshuai.xi 
5626*53ee8cc1Swenshuai.xi     if(!_GOP_IsGwinIdValid(pInstance,i))
5627*53ee8cc1Swenshuai.xi     {
5628*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,i);
5629*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5630*53ee8cc1Swenshuai.xi     }
5631*53ee8cc1Swenshuai.xi     k = i+j;
5632*53ee8cc1Swenshuai.xi     for(l=i; l < k; l++)
5633*53ee8cc1Swenshuai.xi     {
5634*53ee8cc1Swenshuai.xi         if(DRV_MAX_GWIN_FB_SUPPORT<=g_pGOPCtxLocal->pGOPCtxShared->gwinMap[l].u32CurFBId)
5635*53ee8cc1Swenshuai.xi         {
5636*53ee8cc1Swenshuai.xi             GWID = l;
5637*53ee8cc1Swenshuai.xi             break;
5638*53ee8cc1Swenshuai.xi         }
5639*53ee8cc1Swenshuai.xi     }
5640*53ee8cc1Swenshuai.xi     return(GWID);
5641*53ee8cc1Swenshuai.xi }
GOP_GWIN_GetFBfromGWIN(void * pInstance,MS_U8 gwinId)5642*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_GetFBfromGWIN(void* pInstance,MS_U8 gwinId)
5643*53ee8cc1Swenshuai.xi {
5644*53ee8cc1Swenshuai.xi 	  GOP_WinFB_INFO* pwinFB;
5645*53ee8cc1Swenshuai.xi 
5646*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5647*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5648*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5649*53ee8cc1Swenshuai.xi #endif
5650*53ee8cc1Swenshuai.xi 
5651*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gwinId))
5652*53ee8cc1Swenshuai.xi     {
5653*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,gwinId);
5654*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5655*53ee8cc1Swenshuai.xi     }
5656*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,gwinId))
5657*53ee8cc1Swenshuai.xi     {
5658*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is not exist\n",__FUNCTION__,__LINE__,gwinId);
5659*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5660*53ee8cc1Swenshuai.xi     }
5661*53ee8cc1Swenshuai.xi 
5662*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gwinId].u32CurFBId);
5663*53ee8cc1Swenshuai.xi 
5664*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
5665*53ee8cc1Swenshuai.xi     {
5666*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gwinId].u32CurFBId);
5667*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5668*53ee8cc1Swenshuai.xi     }
5669*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gwinId].u32CurFBId))
5670*53ee8cc1Swenshuai.xi     {
5671*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gwinId].u32CurFBId);
5672*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5673*53ee8cc1Swenshuai.xi     }
5674*53ee8cc1Swenshuai.xi     if (0 == pwinFB->in_use)
5675*53ee8cc1Swenshuai.xi     {
5676*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d not allocated\n",__FUNCTION__,__LINE__,gwinId);
5677*53ee8cc1Swenshuai.xi         return(GWIN_ID_INVALID);
5678*53ee8cc1Swenshuai.xi     }
5679*53ee8cc1Swenshuai.xi 
5680*53ee8cc1Swenshuai.xi     return(g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gwinId].u32CurFBId);
5681*53ee8cc1Swenshuai.xi }
5682*53ee8cc1Swenshuai.xi 
GOP_FB_Get(void * pInstance)5683*53ee8cc1Swenshuai.xi MS_U32 GOP_FB_Get(void* pInstance)
5684*53ee8cc1Swenshuai.xi {
5685*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5686*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5687*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5688*53ee8cc1Swenshuai.xi #endif
5689*53ee8cc1Swenshuai.xi 
5690*53ee8cc1Swenshuai.xi 	  if(GOP_WINFB_POOL2 == g_pGOPCtxLocal->pGOPCtxShared->fb_currentPoolId)
5691*53ee8cc1Swenshuai.xi     {
5692*53ee8cc1Swenshuai.xi         return 1;
5693*53ee8cc1Swenshuai.xi     }
5694*53ee8cc1Swenshuai.xi     else
5695*53ee8cc1Swenshuai.xi     {
5696*53ee8cc1Swenshuai.xi         return 0;
5697*53ee8cc1Swenshuai.xi     }
5698*53ee8cc1Swenshuai.xi /* //Change to if to fix parasoft error
5699*53ee8cc1Swenshuai.xi     switch(g_pGOPCtxLocal->pGOPCtxShared->fb_currentPoolId)
5700*53ee8cc1Swenshuai.xi     {
5701*53ee8cc1Swenshuai.xi         case GOP_WINFB_POOL2:
5702*53ee8cc1Swenshuai.xi             return 1;
5703*53ee8cc1Swenshuai.xi          default:
5704*53ee8cc1Swenshuai.xi             return 0;
5705*53ee8cc1Swenshuai.xi     }*/
5706*53ee8cc1Swenshuai.xi 		return GOP_API_SUCCESS;
5707*53ee8cc1Swenshuai.xi }
GOP_FB_SEL(void * pInstance,MS_U8 u8FB)5708*53ee8cc1Swenshuai.xi MS_U32 GOP_FB_SEL(void* pInstance,MS_U8 u8FB)
5709*53ee8cc1Swenshuai.xi {
5710*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5711*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5712*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5713*53ee8cc1Swenshuai.xi #endif
5714*53ee8cc1Swenshuai.xi 
5715*53ee8cc1Swenshuai.xi     switch(u8FB)
5716*53ee8cc1Swenshuai.xi     {
5717*53ee8cc1Swenshuai.xi         case 0: // gwinFB1
5718*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fb_currentPoolId = GOP_WINFB_POOL1;
5719*53ee8cc1Swenshuai.xi             break;
5720*53ee8cc1Swenshuai.xi         case 1: // gwinFB2
5721*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fb_currentPoolId = GOP_WINFB_POOL2;
5722*53ee8cc1Swenshuai.xi             break;
5723*53ee8cc1Swenshuai.xi         default:
5724*53ee8cc1Swenshuai.xi             break;
5725*53ee8cc1Swenshuai.xi     }
5726*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5727*53ee8cc1Swenshuai.xi }
GOP_GWIN_Is32FBExist(void * pInstance,MS_U32 u32fbId)5728*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_Is32FBExist(void* pInstance,MS_U32 u32fbId)
5729*53ee8cc1Swenshuai.xi {
5730*53ee8cc1Swenshuai.xi 	GOP_WinFB_INFO* pwinFB;
5731*53ee8cc1Swenshuai.xi 
5732*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
5733*53ee8cc1Swenshuai.xi     {
5734*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
5735*53ee8cc1Swenshuai.xi         return FALSE;
5736*53ee8cc1Swenshuai.xi     }
5737*53ee8cc1Swenshuai.xi 
5738*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
5739*53ee8cc1Swenshuai.xi 
5740*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
5741*53ee8cc1Swenshuai.xi     {
5742*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
5743*53ee8cc1Swenshuai.xi         return FALSE;
5744*53ee8cc1Swenshuai.xi     }
5745*53ee8cc1Swenshuai.xi 
5746*53ee8cc1Swenshuai.xi     return pwinFB->obtain;
5747*53ee8cc1Swenshuai.xi }
5748*53ee8cc1Swenshuai.xi 
GOP_GWIN_GetFreeFbID(void * pInstance)5749*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_GetFreeFbID(void* pInstance)
5750*53ee8cc1Swenshuai.xi {
5751*53ee8cc1Swenshuai.xi     MS_U32 i;
5752*53ee8cc1Swenshuai.xi     MS_U32 u32FBId = 0xFFFFFFFF;
5753*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
5754*53ee8cc1Swenshuai.xi     for(i=0; i<DRV_MAX_GWIN_FB_SUPPORT; i++)
5755*53ee8cc1Swenshuai.xi     {
5756*53ee8cc1Swenshuai.xi         if(!GOP_GWIN_Is32FBExist(pInstance,i))
5757*53ee8cc1Swenshuai.xi         {
5758*53ee8cc1Swenshuai.xi             u32FBId = i;
5759*53ee8cc1Swenshuai.xi             pwinFB = _GetWinFB(pInstance,u32FBId);
5760*53ee8cc1Swenshuai.xi             pwinFB->obtain = 1;
5761*53ee8cc1Swenshuai.xi             break;
5762*53ee8cc1Swenshuai.xi         }
5763*53ee8cc1Swenshuai.xi     }
5764*53ee8cc1Swenshuai.xi     return u32FBId;
5765*53ee8cc1Swenshuai.xi }
5766*53ee8cc1Swenshuai.xi 
GOP_Set3DOSDMode(void * pInstance,MS_U8 u8Gwin,MS_U16 u16MainFBId,MS_U16 u16SubFBId,EN_GOP_3D_MODETYPE en3DMode)5767*53ee8cc1Swenshuai.xi MS_U32 GOP_Set3DOSDMode(void* pInstance,MS_U8 u8Gwin, MS_U16 u16MainFBId, MS_U16 u16SubFBId,EN_GOP_3D_MODETYPE en3DMode)
5768*53ee8cc1Swenshuai.xi {
5769*53ee8cc1Swenshuai.xi 	MS_U8 u8GOP;
5770*53ee8cc1Swenshuai.xi     GOP_Result enRet = GOP_FAIL;
5771*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
5772*53ee8cc1Swenshuai.xi     MS_PHY TLBSubAddr=0;
5773*53ee8cc1Swenshuai.xi 
5774*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5775*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5776*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5777*53ee8cc1Swenshuai.xi #endif
5778*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u16SubFBId);
5779*53ee8cc1Swenshuai.xi 
5780*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,u8Gwin);
5781*53ee8cc1Swenshuai.xi 
5782*53ee8cc1Swenshuai.xi     switch(en3DMode)
5783*53ee8cc1Swenshuai.xi     {
5784*53ee8cc1Swenshuai.xi         case E_GOP_3D_DISABLE:
5785*53ee8cc1Swenshuai.xi         {
5786*53ee8cc1Swenshuai.xi             enRet = MDrv_GOP_Set3DOSD_Mode(g_pGOPCtxLocal, u8GOP, E_DRV_GOP_3D_DISABLE);
5787*53ee8cc1Swenshuai.xi             if(enRet != GOP_SUCCESS)
5788*53ee8cc1Swenshuai.xi             {
5789*53ee8cc1Swenshuai.xi                 return((E_GOP_API_Result)enRet);
5790*53ee8cc1Swenshuai.xi             }
5791*53ee8cc1Swenshuai.xi             break;
5792*53ee8cc1Swenshuai.xi         }
5793*53ee8cc1Swenshuai.xi         case E_GOP_3D_SWITH_BY_FRAME:
5794*53ee8cc1Swenshuai.xi         case E_GOP_3D_SIDE_BY_SYDE:
5795*53ee8cc1Swenshuai.xi         case E_GOP_3D_TOP_BOTTOM:
5796*53ee8cc1Swenshuai.xi         case E_GOP_3D_LINE_ALTERNATIVE:
5797*53ee8cc1Swenshuai.xi         case E_GOP_3D_FRAMEPACKING:
5798*53ee8cc1Swenshuai.xi         {
5799*53ee8cc1Swenshuai.xi 
5800*53ee8cc1Swenshuai.xi             if(pwinFB == NULL)
5801*53ee8cc1Swenshuai.xi             {
5802*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%d\n",__FUNCTION__,__LINE__,u16SubFBId);
5803*53ee8cc1Swenshuai.xi                 return(GWIN_NO_AVAILABLE);
5804*53ee8cc1Swenshuai.xi             }
5805*53ee8cc1Swenshuai.xi 
5806*53ee8cc1Swenshuai.xi             if(pwinFB->height == 1080)
5807*53ee8cc1Swenshuai.xi             {
5808*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->GOP_FramePacking_Gap = 45;
5809*53ee8cc1Swenshuai.xi             }
5810*53ee8cc1Swenshuai.xi             else if( pwinFB->height == 720)
5811*53ee8cc1Swenshuai.xi             {
5812*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->GOP_FramePacking_Gap = 30;
5813*53ee8cc1Swenshuai.xi             }
5814*53ee8cc1Swenshuai.xi             else
5815*53ee8cc1Swenshuai.xi             {
5816*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->GOP_FramePacking_Gap = 0;
5817*53ee8cc1Swenshuai.xi             }
5818*53ee8cc1Swenshuai.xi 
5819*53ee8cc1Swenshuai.xi             enRet = MDrv_GOP_Set3DOSD_Mode(g_pGOPCtxLocal, u8GOP, (EN_DRV_GOP_3D_MODE)en3DMode);
5820*53ee8cc1Swenshuai.xi             if(enRet != GOP_SUCCESS)
5821*53ee8cc1Swenshuai.xi             {
5822*53ee8cc1Swenshuai.xi                 return((E_GOP_API_Result)enRet);
5823*53ee8cc1Swenshuai.xi             }
5824*53ee8cc1Swenshuai.xi             break;
5825*53ee8cc1Swenshuai.xi         }
5826*53ee8cc1Swenshuai.xi         default:
5827*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s]not support 3D OSD case: %d\n",__FUNCTION__, en3DMode);
5828*53ee8cc1Swenshuai.xi             return(GOP_API_FAIL);
5829*53ee8cc1Swenshuai.xi     }
5830*53ee8cc1Swenshuai.xi 
5831*53ee8cc1Swenshuai.xi     if(GOP_MapFB2Win(pInstance,u16MainFBId,u8Gwin) != GOP_API_SUCCESS)
5832*53ee8cc1Swenshuai.xi     {
5833*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s] can't map Main fbid:%d to gwin:%d\n",__FUNCTION__,u16MainFBId,u8Gwin);
5834*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5835*53ee8cc1Swenshuai.xi     }
5836*53ee8cc1Swenshuai.xi 
5837*53ee8cc1Swenshuai.xi     if(en3DMode != E_GOP_3D_DISABLE)
5838*53ee8cc1Swenshuai.xi     {
5839*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP])
5840*53ee8cc1Swenshuai.xi         {
5841*53ee8cc1Swenshuai.xi             MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
5842*53ee8cc1Swenshuai.xi             DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
5843*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOP, &GopDst);
5844*53ee8cc1Swenshuai.xi             _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
5845*53ee8cc1Swenshuai.xi             if(bHMirror || bVMirror)
5846*53ee8cc1Swenshuai.xi             {
5847*53ee8cc1Swenshuai.xi                 GOP_GwinInfo stGwinInfo;
5848*53ee8cc1Swenshuai.xi                 GOP_GetWinInfo(pInstance,u8Gwin, &stGwinInfo);
5849*53ee8cc1Swenshuai.xi                 stGwinInfo.u32DRAMRBlkStart = pwinFB->addr;
5850*53ee8cc1Swenshuai.xi                 _GOP_GWIN_SetTLBHVMirrorDRAMAddr(pInstance,u8Gwin, bHMirror, bVMirror, &stGwinInfo);
5851*53ee8cc1Swenshuai.xi                 pwinFB->addr = stGwinInfo.u32DRAMRBlkStart;
5852*53ee8cc1Swenshuai.xi             }
5853*53ee8cc1Swenshuai.xi         }
5854*53ee8cc1Swenshuai.xi         else
5855*53ee8cc1Swenshuai.xi         {
5856*53ee8cc1Swenshuai.xi             if(u8GOP > GOPTYPE.GOP0)
5857*53ee8cc1Swenshuai.xi             {
5858*53ee8cc1Swenshuai.xi                 MS_BOOL bHMirror = FALSE, bVMirror = FALSE;
5859*53ee8cc1Swenshuai.xi                 DRV_GOPDstType GopDst =E_DRV_GOP_DST_INVALID;
5860*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOP, &GopDst);
5861*53ee8cc1Swenshuai.xi                 _GOP_GWIN_IsEnableMirror(pInstance,GopDst, &bHMirror, &bVMirror);
5862*53ee8cc1Swenshuai.xi                 if(bHMirror || bVMirror)
5863*53ee8cc1Swenshuai.xi                 {
5864*53ee8cc1Swenshuai.xi                     GOP_GwinInfo stGwinInfo;
5865*53ee8cc1Swenshuai.xi                     GOP_GetWinInfo(pInstance,u8Gwin, &stGwinInfo);
5866*53ee8cc1Swenshuai.xi                     stGwinInfo.u32DRAMRBlkStart = pwinFB->addr;
5867*53ee8cc1Swenshuai.xi                     _GOP_GWIN_SetHVMirrorDRAMAddr(pInstance,u8Gwin, bHMirror, bVMirror, &stGwinInfo);
5868*53ee8cc1Swenshuai.xi                     pwinFB->addr = stGwinInfo.u32DRAMRBlkStart;
5869*53ee8cc1Swenshuai.xi                 }
5870*53ee8cc1Swenshuai.xi             }
5871*53ee8cc1Swenshuai.xi         }
5872*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bTLB[u8GOP])
5873*53ee8cc1Swenshuai.xi         {
5874*53ee8cc1Swenshuai.xi             TLBSubAddr = (pwinFB->addr/PAGE_SIZE)*TLB_PER_ENTRY_SIZE + g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[u8GOP];
5875*53ee8cc1Swenshuai.xi             MDrv_GOP_SetTLBSubAddr(g_pGOPCtxLocal,u8GOP,TLBSubAddr);
5876*53ee8cc1Swenshuai.xi             MDrv_GOP_Set3DOSD_Sub(g_pGOPCtxLocal,u8Gwin, pwinFB->addr%(PAGE_SIZE*PER_MIU_TLB_ENTRY_COUNT));
5877*53ee8cc1Swenshuai.xi         }
5878*53ee8cc1Swenshuai.xi         else
5879*53ee8cc1Swenshuai.xi         {
5880*53ee8cc1Swenshuai.xi             MDrv_GOP_Set3DOSD_Sub(g_pGOPCtxLocal,u8Gwin, pwinFB->addr);
5881*53ee8cc1Swenshuai.xi         }
5882*53ee8cc1Swenshuai.xi     }
5883*53ee8cc1Swenshuai.xi     else
5884*53ee8cc1Swenshuai.xi     {
5885*53ee8cc1Swenshuai.xi         MDrv_GOP_Set3DOSD_Sub(g_pGOPCtxLocal,u8Gwin, 0x0);  //clear sub address
5886*53ee8cc1Swenshuai.xi     }
5887*53ee8cc1Swenshuai.xi     MDrv_GOP_Set3DOSD_Middle(g_pGOPCtxLocal, u8GOP);
5888*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
5889*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
5890*53ee8cc1Swenshuai.xi }
5891*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetGPUtileMode(void * pInstance,MS_U8 u8Gwin,EN_GOP_GPU_TILE_MODE tilemode)5892*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetGPUtileMode(void* pInstance,MS_U8 u8Gwin, EN_GOP_GPU_TILE_MODE tilemode)
5893*53ee8cc1Swenshuai.xi {
5894*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5895*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5896*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5897*53ee8cc1Swenshuai.xi #endif
5898*53ee8cc1Swenshuai.xi 
5899*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8Gwin))
5900*53ee8cc1Swenshuai.xi     {
5901*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8Gwin);
5902*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
5903*53ee8cc1Swenshuai.xi     }
5904*53ee8cc1Swenshuai.xi 
5905*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetGPUTileMode(g_pGOPCtxLocal, u8Gwin, tilemode);
5906*53ee8cc1Swenshuai.xi 
5907*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
5908*53ee8cc1Swenshuai.xi }
5909*53ee8cc1Swenshuai.xi 
GOP_SetGOPClk(void * pInstance,MS_U8 gopNum,EN_GOP_DST_TYPE eDstType)5910*53ee8cc1Swenshuai.xi MS_U32 GOP_SetGOPClk(void* pInstance,MS_U8 gopNum, EN_GOP_DST_TYPE eDstType)
5911*53ee8cc1Swenshuai.xi {
5912*53ee8cc1Swenshuai.xi     DRV_GOPDstType GopDst;
5913*53ee8cc1Swenshuai.xi 
5914*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5915*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5916*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5917*53ee8cc1Swenshuai.xi #endif
5918*53ee8cc1Swenshuai.xi 
5919*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,gopNum))
5920*53ee8cc1Swenshuai.xi     {
5921*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,gopNum);
5922*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5923*53ee8cc1Swenshuai.xi     }
5924*53ee8cc1Swenshuai.xi     (_GOP_Map_APIDst2DRV_Enum(pInstance,eDstType, &GopDst));
5925*53ee8cc1Swenshuai.xi     (MDrv_GOP_SetGOPClk(g_pGOPCtxLocal, gopNum, GopDst));
5926*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
5927*53ee8cc1Swenshuai.xi }
GOP_GWIN_SetBnkForceWrite(void * pInstance,MS_U8 u8GOP,MS_BOOL bEnable)5928*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetBnkForceWrite(void* pInstance,MS_U8 u8GOP, MS_BOOL bEnable)
5929*53ee8cc1Swenshuai.xi {
5930*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5931*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5932*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5933*53ee8cc1Swenshuai.xi #endif
5934*53ee8cc1Swenshuai.xi 
5935*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal == NULL)
5936*53ee8cc1Swenshuai.xi     {
5937*53ee8cc1Swenshuai.xi         bInitBkFWR[u8GOP] = bEnable;
5938*53ee8cc1Swenshuai.xi         return GOP_API_SUCCESS;
5939*53ee8cc1Swenshuai.xi     }
5940*53ee8cc1Swenshuai.xi     else
5941*53ee8cc1Swenshuai.xi     {
5942*53ee8cc1Swenshuai.xi         if(!g_pGOPCtxLocal->pGopChipProperty->bBnkForceWrite)
5943*53ee8cc1Swenshuai.xi         {
5944*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d] GOP not support bank force write function in this chip version \n",__FUNCTION__,__LINE__);
5945*53ee8cc1Swenshuai.xi             return(GOP_API_FAIL);
5946*53ee8cc1Swenshuai.xi         }
5947*53ee8cc1Swenshuai.xi         else
5948*53ee8cc1Swenshuai.xi         {
5949*53ee8cc1Swenshuai.xi             bInitBkFWR[u8GOP] = bEnable;
5950*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetBnkForceWrite(g_pGOPCtxLocal, u8GOP, bEnable);
5951*53ee8cc1Swenshuai.xi             return(GOP_API_SUCCESS);
5952*53ee8cc1Swenshuai.xi         }
5953*53ee8cc1Swenshuai.xi     }
5954*53ee8cc1Swenshuai.xi }
GOP_GWIN_SetForceWrite(void * pInstance,MS_BOOL bEnable)5955*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetForceWrite(void* pInstance,MS_BOOL bEnable)
5956*53ee8cc1Swenshuai.xi {
5957*53ee8cc1Swenshuai.xi     //It's used for supernova special used. (by Jupiter)
5958*53ee8cc1Swenshuai.xi     //There should no driver request before init.
5959*53ee8cc1Swenshuai.xi     //Supernova wants to easly control AP flow, it will set gop force write before gop init.
5960*53ee8cc1Swenshuai.xi     //Driver must recode the FRWR status and set it during gop init.
5961*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5962*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5963*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5964*53ee8cc1Swenshuai.xi #endif
5965*53ee8cc1Swenshuai.xi 
5966*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal == NULL)
5967*53ee8cc1Swenshuai.xi     {
5968*53ee8cc1Swenshuai.xi         bInitFWR = bEnable;
5969*53ee8cc1Swenshuai.xi         return GOP_API_SUCCESS;
5970*53ee8cc1Swenshuai.xi     }
5971*53ee8cc1Swenshuai.xi     else
5972*53ee8cc1Swenshuai.xi     {
5973*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->bInitFWR = bEnable;
5974*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetForceWrite(g_pGOPCtxLocal, bEnable);
5975*53ee8cc1Swenshuai.xi         return(GOP_API_SUCCESS);
5976*53ee8cc1Swenshuai.xi     }
5977*53ee8cc1Swenshuai.xi }
GOP_Set3D_LR_FrameExchange(void * pInstance,MS_U8 u8GOP)5978*53ee8cc1Swenshuai.xi MS_U32 GOP_Set3D_LR_FrameExchange(void* pInstance,MS_U8 u8GOP)
5979*53ee8cc1Swenshuai.xi {
5980*53ee8cc1Swenshuai.xi 	GOP_Result enRet = GOP_FAIL;
5981*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
5982*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
5983*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
5984*53ee8cc1Swenshuai.xi #endif
5985*53ee8cc1Swenshuai.xi 
5986*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
5987*53ee8cc1Swenshuai.xi     {
5988*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
5989*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
5990*53ee8cc1Swenshuai.xi     }
5991*53ee8cc1Swenshuai.xi 
5992*53ee8cc1Swenshuai.xi     enRet = MDrv_GOP_Set3D_LR_FrameExchange(g_pGOPCtxLocal, u8GOP);
5993*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
5994*53ee8cc1Swenshuai.xi     return enRet;
5995*53ee8cc1Swenshuai.xi }
GOP_Enable_VEOSD(void * pInstance,MS_U8 u8GOP,MS_BOOL bEn)5996*53ee8cc1Swenshuai.xi MS_U32 GOP_Enable_VEOSD(void* pInstance,MS_U8 u8GOP, MS_BOOL bEn)
5997*53ee8cc1Swenshuai.xi {
5998*53ee8cc1Swenshuai.xi     MS_U8 GOPNum = u8GOP;
5999*53ee8cc1Swenshuai.xi     MS_BOOL bret;
6000*53ee8cc1Swenshuai.xi     DRV_GOPDstType pGopDst = E_DRV_GOP_DST_INVALID;
6001*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6002*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6003*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6004*53ee8cc1Swenshuai.xi #endif
6005*53ee8cc1Swenshuai.xi 
6006*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, u8GOP, &pGopDst);
6007*53ee8cc1Swenshuai.xi 
6008*53ee8cc1Swenshuai.xi     if((pGopDst == E_DRV_GOP_DST_MIXER2VE) || (pGopDst == E_DRV_GOP_DST_MIXER2OP) || (pGopDst == E_DRV_GOP_DST_MIXER2OP1))
6009*53ee8cc1Swenshuai.xi     {
6010*53ee8cc1Swenshuai.xi         GOPNum = GOPTYPE.MIXER-1;
6011*53ee8cc1Swenshuai.xi     }
6012*53ee8cc1Swenshuai.xi     else if(pGopDst == E_DRV_GOP_DST_INVALID)
6013*53ee8cc1Swenshuai.xi     {
6014*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]Wrong GOP Destination!",__FUNCTION__,__LINE__);
6015*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
6016*53ee8cc1Swenshuai.xi     }
6017*53ee8cc1Swenshuai.xi 
6018*53ee8cc1Swenshuai.xi     bret = MDrv_GOP_Set_VE_MUX(g_pGOPCtxLocal, GOPNum, bEn);
6019*53ee8cc1Swenshuai.xi 
6020*53ee8cc1Swenshuai.xi     if(bret)
6021*53ee8cc1Swenshuai.xi     {
6022*53ee8cc1Swenshuai.xi         return GOP_API_SUCCESS;
6023*53ee8cc1Swenshuai.xi     }
6024*53ee8cc1Swenshuai.xi     else
6025*53ee8cc1Swenshuai.xi     {
6026*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
6027*53ee8cc1Swenshuai.xi     }
6028*53ee8cc1Swenshuai.xi }
6029*53ee8cc1Swenshuai.xi 
GOP_OutputLayerSwitch(void * pInstance,MS_U8 u8GOP)6030*53ee8cc1Swenshuai.xi MS_U32 GOP_OutputLayerSwitch(void* pInstance,MS_U8 u8GOP)
6031*53ee8cc1Swenshuai.xi {
6032*53ee8cc1Swenshuai.xi     MS_U8 i;
6033*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6034*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6035*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6036*53ee8cc1Swenshuai.xi #endif
6037*53ee8cc1Swenshuai.xi 
6038*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
6039*53ee8cc1Swenshuai.xi     {
6040*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
6041*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
6042*53ee8cc1Swenshuai.xi     }
6043*53ee8cc1Swenshuai.xi 
6044*53ee8cc1Swenshuai.xi     GOP_M_INFO("---%s %d: PID[%td], TID[%td] u8GOP=%u\n", __FUNCTION__, __LINE__, (ptrdiff_t)getpid(), (ptrdiff_t)MsOS_GetOSThreadID(), u8GOP);
6045*53ee8cc1Swenshuai.xi 
6046*53ee8cc1Swenshuai.xi     MDrv_GOP_SetGOPHighPri(g_pGOPCtxLocal, u8GOP);
6047*53ee8cc1Swenshuai.xi     for (i=0; i<MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal); i++)
6048*53ee8cc1Swenshuai.xi     {
6049*53ee8cc1Swenshuai.xi         _GOP_InitHSPDByGOP(pInstance,i);
6050*53ee8cc1Swenshuai.xi     }
6051*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
6052*53ee8cc1Swenshuai.xi }
GOP_GWIN_SwapOverlapWin(void * pInstance,MS_U8 u8GOP,MS_U8 u8win)6053*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SwapOverlapWin(void* pInstance,MS_U8 u8GOP, MS_U8 u8win)
6054*53ee8cc1Swenshuai.xi {
6055*53ee8cc1Swenshuai.xi 	MS_U8 i, *temp;
6056*53ee8cc1Swenshuai.xi     GOP_GwinPriority GopGwinPri;
6057*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6058*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6059*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6060*53ee8cc1Swenshuai.xi #endif
6061*53ee8cc1Swenshuai.xi 
6062*53ee8cc1Swenshuai.xi 
6063*53ee8cc1Swenshuai.xi     memset(&GopGwinPri, 0, sizeof(GOP_GwinPriority));
6064*53ee8cc1Swenshuai.xi 
6065*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8win))
6066*53ee8cc1Swenshuai.xi     {
6067*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %d  is out of range\n",__FUNCTION__,__LINE__,u8win);
6068*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
6069*53ee8cc1Swenshuai.xi     }
6070*53ee8cc1Swenshuai.xi     if (!_GOP_IsGopNumValid(pInstance,u8GOP))
6071*53ee8cc1Swenshuai.xi     {
6072*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
6073*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
6074*53ee8cc1Swenshuai.xi     }
6075*53ee8cc1Swenshuai.xi 
6076*53ee8cc1Swenshuai.xi     if (u8GOP==1)  //GOP1
6077*53ee8cc1Swenshuai.xi     {
6078*53ee8cc1Swenshuai.xi         if(4 == MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,1))
6079*53ee8cc1Swenshuai.xi         {
6080*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_GetGwinPriority(g_pGOPCtxLocal, 1, &GopGwinPri);
6081*53ee8cc1Swenshuai.xi             temp = (MS_U8*)&GopGwinPri.Gop0_GwinPri;
6082*53ee8cc1Swenshuai.xi 
6083*53ee8cc1Swenshuai.xi             for (i=0; i<MDrv_GOP_GetGwinNum(g_pGOPCtxLocal, 1); i++)
6084*53ee8cc1Swenshuai.xi             {
6085*53ee8cc1Swenshuai.xi                 if (temp[i] == (u8win-MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,0))) //find
6086*53ee8cc1Swenshuai.xi                 {
6087*53ee8cc1Swenshuai.xi                     temp[i] = temp[0];
6088*53ee8cc1Swenshuai.xi                     temp[0] = (u8win-MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,0));
6089*53ee8cc1Swenshuai.xi                     break;
6090*53ee8cc1Swenshuai.xi                 }
6091*53ee8cc1Swenshuai.xi             }
6092*53ee8cc1Swenshuai.xi 
6093*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetGwinPriority(g_pGOPCtxLocal, 1, &GopGwinPri);
6094*53ee8cc1Swenshuai.xi         }
6095*53ee8cc1Swenshuai.xi         else
6096*53ee8cc1Swenshuai.xi         {
6097*53ee8cc1Swenshuai.xi             GopGwinPri.Gop1_1stGwin = u8win-MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,0);
6098*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetGwinPriority(g_pGOPCtxLocal, 1, &GopGwinPri);
6099*53ee8cc1Swenshuai.xi         }
6100*53ee8cc1Swenshuai.xi     }
6101*53ee8cc1Swenshuai.xi     else    //GOP0
6102*53ee8cc1Swenshuai.xi     {
6103*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetGwinPriority(g_pGOPCtxLocal, 0, &GopGwinPri);
6104*53ee8cc1Swenshuai.xi         temp = (MS_U8*)&GopGwinPri.Gop0_GwinPri;
6105*53ee8cc1Swenshuai.xi 
6106*53ee8cc1Swenshuai.xi         for (i=0; i<MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,0); i++)
6107*53ee8cc1Swenshuai.xi         {
6108*53ee8cc1Swenshuai.xi             if (temp[i] == u8win) //find
6109*53ee8cc1Swenshuai.xi             {
6110*53ee8cc1Swenshuai.xi                 temp[i] = temp[0];
6111*53ee8cc1Swenshuai.xi                 temp[0] = u8win;
6112*53ee8cc1Swenshuai.xi                 break;
6113*53ee8cc1Swenshuai.xi             }
6114*53ee8cc1Swenshuai.xi         }
6115*53ee8cc1Swenshuai.xi 
6116*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetGwinPriority(g_pGOPCtxLocal, 0, &GopGwinPri);
6117*53ee8cc1Swenshuai.xi     }
6118*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
6119*53ee8cc1Swenshuai.xi }
GOP_SetGOPBWStrength(void * pInstance,EN_GOP_BW_STRENGTH eGOPBWStr,MS_U8 u8GOP)6120*53ee8cc1Swenshuai.xi MS_U32 GOP_SetGOPBWStrength(void* pInstance,EN_GOP_BW_STRENGTH eGOPBWStr, MS_U8 u8GOP)
6121*53ee8cc1Swenshuai.xi {
6122*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6123*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6124*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6125*53ee8cc1Swenshuai.xi #endif
6126*53ee8cc1Swenshuai.xi 
6127*53ee8cc1Swenshuai.xi 	if (u8GOP !=0xc && !_GOP_IsGwinIdValid(pInstance,u8GOP))
6128*53ee8cc1Swenshuai.xi     {
6129*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nInvaild gop num!!"));
6130*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
6131*53ee8cc1Swenshuai.xi     }
6132*53ee8cc1Swenshuai.xi 
6133*53ee8cc1Swenshuai.xi     if(eGOPBWStr == E_GOP_BW_STRONG)
6134*53ee8cc1Swenshuai.xi         MDrv_GOP_SetGOPBWStrength(g_pGOPCtxLocal, u8GOP,E_GOP_BURSTLEN_LONG);
6135*53ee8cc1Swenshuai.xi     else if(eGOPBWStr == E_GOP_BW_MIDDLE)
6136*53ee8cc1Swenshuai.xi         MDrv_GOP_SetGOPBWStrength(g_pGOPCtxLocal, u8GOP,E_GOP_BURSTLEN_MIDDLE);
6137*53ee8cc1Swenshuai.xi     else if(eGOPBWStr == E_GOP_BW_WEAK)
6138*53ee8cc1Swenshuai.xi         MDrv_GOP_SetGOPBWStrength(g_pGOPCtxLocal, u8GOP,E_GOP_BURSTLEN_SHORT);
6139*53ee8cc1Swenshuai.xi     else
6140*53ee8cc1Swenshuai.xi     {
6141*53ee8cc1Swenshuai.xi         return(GOP_API_INVALID_PARAMETERS);
6142*53ee8cc1Swenshuai.xi     }
6143*53ee8cc1Swenshuai.xi 
6144*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
6145*53ee8cc1Swenshuai.xi }
GOP_GetGOPBWStrength(void * pInstance,MS_U8 u8GOP,EN_GOP_BW_STRENGTH * curBW)6146*53ee8cc1Swenshuai.xi MS_U32 GOP_GetGOPBWStrength(void* pInstance,MS_U8 u8GOP, EN_GOP_BW_STRENGTH* curBW)
6147*53ee8cc1Swenshuai.xi {
6148*53ee8cc1Swenshuai.xi 	MS_U32 gopbw;
6149*53ee8cc1Swenshuai.xi     EN_GOP_BW_STRENGTH ret;
6150*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6151*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6152*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6153*53ee8cc1Swenshuai.xi #endif
6154*53ee8cc1Swenshuai.xi 
6155*53ee8cc1Swenshuai.xi 
6156*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,u8GOP))
6157*53ee8cc1Swenshuai.xi     {
6158*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nInvaild gop num!!"));
6159*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
6160*53ee8cc1Swenshuai.xi     }
6161*53ee8cc1Swenshuai.xi     gopbw = MDrv_GOP_GetGOPBWStrength(g_pGOPCtxLocal, u8GOP);
6162*53ee8cc1Swenshuai.xi 
6163*53ee8cc1Swenshuai.xi     if(gopbw == E_GOP_BURSTLEN_LONG )
6164*53ee8cc1Swenshuai.xi         ret = E_GOP_BW_STRONG;
6165*53ee8cc1Swenshuai.xi     else if(gopbw == E_GOP_BURSTLEN_MIDDLE )
6166*53ee8cc1Swenshuai.xi         ret = E_GOP_BW_MIDDLE;
6167*53ee8cc1Swenshuai.xi     else if(gopbw == E_GOP_BURSTLEN_SHORT )
6168*53ee8cc1Swenshuai.xi         ret = E_GOP_BW_WEAK;
6169*53ee8cc1Swenshuai.xi     else
6170*53ee8cc1Swenshuai.xi         ret = E_GOP_BW_UNKNOWN;
6171*53ee8cc1Swenshuai.xi 
6172*53ee8cc1Swenshuai.xi     if(curBW != NULL)
6173*53ee8cc1Swenshuai.xi         *curBW = ret;
6174*53ee8cc1Swenshuai.xi     else
6175*53ee8cc1Swenshuai.xi         return(GOP_API_INVALID_PARAMETERS);
6176*53ee8cc1Swenshuai.xi 
6177*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
6178*53ee8cc1Swenshuai.xi }
GOP_EnableLBCouple(void * pInstance,MS_U8 u8GOP,MS_BOOL bEnable)6179*53ee8cc1Swenshuai.xi MS_U32 GOP_EnableLBCouple(void* pInstance,MS_U8 u8GOP, MS_BOOL bEnable)
6180*53ee8cc1Swenshuai.xi {
6181*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6182*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6183*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6184*53ee8cc1Swenshuai.xi #endif
6185*53ee8cc1Swenshuai.xi 
6186*53ee8cc1Swenshuai.xi     MDrv_GOP_EnableLBCouple(g_pGOPCtxLocal, u8GOP, bEnable);
6187*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
6188*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
6189*53ee8cc1Swenshuai.xi }
6190*53ee8cc1Swenshuai.xi 
GOP_SetGOPYUV(void * pInstance,MS_U8 u8GOP)6191*53ee8cc1Swenshuai.xi MS_U32 GOP_SetGOPYUV(void* pInstance,MS_U8 u8GOP)
6192*53ee8cc1Swenshuai.xi {
6193*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6194*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6195*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6196*53ee8cc1Swenshuai.xi #endif
6197*53ee8cc1Swenshuai.xi 
6198*53ee8cc1Swenshuai.xi 	if(u8GOP !=0xC &&!_GOP_IsGwinIdValid(pInstance,u8GOP))
6199*53ee8cc1Swenshuai.xi     {
6200*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nInvaild gop num!!"));
6201*53ee8cc1Swenshuai.xi         return(GOP_API_FAIL);
6202*53ee8cc1Swenshuai.xi     }
6203*53ee8cc1Swenshuai.xi     MDrv_GOP_SetGOPYUV(g_pGOPCtxLocal, u8GOP);
6204*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
6205*53ee8cc1Swenshuai.xi }
6206*53ee8cc1Swenshuai.xi 
GOP_IsRegUpdated(void * pInstance,MS_U8 u8GopType)6207*53ee8cc1Swenshuai.xi MS_U32 GOP_IsRegUpdated(void* pInstance,MS_U8 u8GopType)
6208*53ee8cc1Swenshuai.xi {
6209*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6210*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6211*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6212*53ee8cc1Swenshuai.xi #endif
6213*53ee8cc1Swenshuai.xi 
6214*53ee8cc1Swenshuai.xi     if (MDrv_GOP_GetGOPACK(g_pGOPCtxLocal, u8GopType))
6215*53ee8cc1Swenshuai.xi     {
6216*53ee8cc1Swenshuai.xi         return(GOP_API_SUCCESS);
6217*53ee8cc1Swenshuai.xi     }
6218*53ee8cc1Swenshuai.xi     return(GOP_API_FAIL);
6219*53ee8cc1Swenshuai.xi }
6220*53ee8cc1Swenshuai.xi 
GOP_TestPatternAlpha_Enable(void * pInstance,MS_BOOL bTSTAlpha)6221*53ee8cc1Swenshuai.xi MS_U32 GOP_TestPatternAlpha_Enable(void* pInstance,MS_BOOL bTSTAlpha)
6222*53ee8cc1Swenshuai.xi {
6223*53ee8cc1Swenshuai.xi     DRV_GOP_TSTPATTERN drv_TstPattern;
6224*53ee8cc1Swenshuai.xi     memset(&drv_TstPattern, 0, sizeof(DRV_GOP_TSTPATTERN));
6225*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6226*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6227*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6228*53ee8cc1Swenshuai.xi #endif
6229*53ee8cc1Swenshuai.xi 
6230*53ee8cc1Swenshuai.xi     drv_TstPattern.bTSTClr_Alpha_En = bTSTAlpha;
6231*53ee8cc1Swenshuai.xi     MDrv_GOP_TestPatternAlpha_Enable(g_pGOPCtxLocal, drv_TstPattern.bTSTClr_Alpha_En);
6232*53ee8cc1Swenshuai.xi 		return GOP_API_SUCCESS;
6233*53ee8cc1Swenshuai.xi }
6234*53ee8cc1Swenshuai.xi 
GOP_OC_SetOCFBinfo(void * pInstance,MS_PHY u64Addr,EN_GOP_OC_SEL_TYPE BankMode,MS_U32 enBufSize)6235*53ee8cc1Swenshuai.xi MS_U32 GOP_OC_SetOCFBinfo(void* pInstance,MS_PHY u64Addr, EN_GOP_OC_SEL_TYPE BankMode, MS_U32 enBufSize)
6236*53ee8cc1Swenshuai.xi {
6237*53ee8cc1Swenshuai.xi     DRV_GOP_OC_INFO OCinfo;
6238*53ee8cc1Swenshuai.xi     MS_U16 PanelWidth,PanelHeight;
6239*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet = GOP_API_FAIL;
6240*53ee8cc1Swenshuai.xi     MS_U8 u8CurGOP = 0;
6241*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6242*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6243*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6244*53ee8cc1Swenshuai.xi #endif
6245*53ee8cc1Swenshuai.xi 
6246*53ee8cc1Swenshuai.xi     u8CurGOP = MDrv_GOP_Get(g_pGOPCtxLocal);
6247*53ee8cc1Swenshuai.xi     memset(&OCinfo, 0, sizeof(DRV_GOP_OC_INFO));
6248*53ee8cc1Swenshuai.xi 
6249*53ee8cc1Swenshuai.xi     PanelWidth  = g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP];
6250*53ee8cc1Swenshuai.xi     PanelHeight = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8CurGOP];
6251*53ee8cc1Swenshuai.xi 
6252*53ee8cc1Swenshuai.xi     OCinfo.u16GOP_OC_HSIZE = PanelWidth;
6253*53ee8cc1Swenshuai.xi     OCinfo.u16GOP_OC_VSIZE = PanelHeight;
6254*53ee8cc1Swenshuai.xi     OCinfo.u32GOP_OC_FETCH = ( ((PanelWidth >>1) + (PanelWidth /10)) << 2) * PanelHeight;                               // PanelWidth *0.6(Compression Ratio) *4(8888fmt)
6255*53ee8cc1Swenshuai.xi 
6256*53ee8cc1Swenshuai.xi     if(enBufSize < (OCinfo.u32GOP_OC_FETCH << BankMode))
6257*53ee8cc1Swenshuai.xi     {
6258*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s] ERROR, OC Buffer size not enough , input BufSize:0x%tx\n",__FUNCTION__,(ptrdiff_t)enBufSize);
6259*53ee8cc1Swenshuai.xi         return (GOP_API_FAIL);
6260*53ee8cc1Swenshuai.xi     }
6261*53ee8cc1Swenshuai.xi     else
6262*53ee8cc1Swenshuai.xi     {
6263*53ee8cc1Swenshuai.xi         switch(BankMode)
6264*53ee8cc1Swenshuai.xi         {
6265*53ee8cc1Swenshuai.xi             case E_GOP_OC_SEL_2BankMode:
6266*53ee8cc1Swenshuai.xi                 OCinfo.u8GOP_OC_BANK_MODE = 1;
6267*53ee8cc1Swenshuai.xi                 break;
6268*53ee8cc1Swenshuai.xi             case E_GOP_OC_SEL_4BankMode:
6269*53ee8cc1Swenshuai.xi                 OCinfo.u8GOP_OC_BANK_MODE = 0;
6270*53ee8cc1Swenshuai.xi                 break;
6271*53ee8cc1Swenshuai.xi             default:
6272*53ee8cc1Swenshuai.xi                 OCinfo.u8GOP_OC_BANK_MODE = 1;
6273*53ee8cc1Swenshuai.xi                 break;
6274*53ee8cc1Swenshuai.xi         }
6275*53ee8cc1Swenshuai.xi     }
6276*53ee8cc1Swenshuai.xi 
6277*53ee8cc1Swenshuai.xi     OCinfo.u64GOP_OC_DRAM_RBLK = u64Addr ;
6278*53ee8cc1Swenshuai.xi     OCinfo.u64GOP_OC_ADDRPROTECT_STR = u64Addr;
6279*53ee8cc1Swenshuai.xi     OCinfo.u64GOP_OC_ADDRPROTECT_END = u64Addr + enBufSize;
6280*53ee8cc1Swenshuai.xi 
6281*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_OC_SetOCInfo(g_pGOPCtxLocal,&OCinfo);
6282*53ee8cc1Swenshuai.xi 
6283*53ee8cc1Swenshuai.xi     return(enRet);
6284*53ee8cc1Swenshuai.xi }
6285*53ee8cc1Swenshuai.xi 
GOP_VE_SetOutputTiming(void * pInstance,GOP_VE_TIMINGTYPE mode)6286*53ee8cc1Swenshuai.xi MS_U32 GOP_VE_SetOutputTiming(void* pInstance,GOP_VE_TIMINGTYPE mode)
6287*53ee8cc1Swenshuai.xi {
6288*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6289*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6290*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6291*53ee8cc1Swenshuai.xi #endif
6292*53ee8cc1Swenshuai.xi 	E_GOP_API_Result enRet=GOP_API_FAIL;
6293*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_VE_SetOutputTiming(g_pGOPCtxLocal, mode);
6294*53ee8cc1Swenshuai.xi     return enRet;
6295*53ee8cc1Swenshuai.xi }
6296*53ee8cc1Swenshuai.xi 
GOP_MIXER_SetOutputTiming(void * pInstance,GOP_MIXER_TIMINGTYPE mode,GOP_MixerTiming * pMT)6297*53ee8cc1Swenshuai.xi MS_U32 GOP_MIXER_SetOutputTiming(void* pInstance,GOP_MIXER_TIMINGTYPE mode,  GOP_MixerTiming *pMT)
6298*53ee8cc1Swenshuai.xi {
6299*53ee8cc1Swenshuai.xi 	E_GOP_API_Result enRet=GOP_API_FAIL;
6300*53ee8cc1Swenshuai.xi     GOP_DRV_MixerTiming MT;
6301*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6302*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6303*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6304*53ee8cc1Swenshuai.xi #endif
6305*53ee8cc1Swenshuai.xi 
6306*53ee8cc1Swenshuai.xi     if(pMT != NULL)
6307*53ee8cc1Swenshuai.xi     {
6308*53ee8cc1Swenshuai.xi         MT.hstart = pMT->hstart;
6309*53ee8cc1Swenshuai.xi         MT.vstart = pMT->vstart;
6310*53ee8cc1Swenshuai.xi         MT.vend = pMT->vend;
6311*53ee8cc1Swenshuai.xi         MT.hend = pMT->hend;
6312*53ee8cc1Swenshuai.xi         MT.htotal = pMT->htotal;
6313*53ee8cc1Swenshuai.xi         MT.hsyncdelay = 0;
6314*53ee8cc1Swenshuai.xi     }
6315*53ee8cc1Swenshuai.xi 
6316*53ee8cc1Swenshuai.xi     if(pMT == NULL)
6317*53ee8cc1Swenshuai.xi     {
6318*53ee8cc1Swenshuai.xi         return(GOP_API_INVALID_PARAMETERS);
6319*53ee8cc1Swenshuai.xi     }
6320*53ee8cc1Swenshuai.xi 
6321*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_MIXER_SetOutputTiming(g_pGOPCtxLocal, mode, &MT);
6322*53ee8cc1Swenshuai.xi     return(enRet);
6323*53ee8cc1Swenshuai.xi }
GOP_MIXER_SetMIXER2OPOutputTiming(void * pInstance,GOP_Mixer2OPTiming * pMT)6324*53ee8cc1Swenshuai.xi MS_U32 GOP_MIXER_SetMIXER2OPOutputTiming(void* pInstance,GOP_Mixer2OPTiming *pMT)
6325*53ee8cc1Swenshuai.xi {
6326*53ee8cc1Swenshuai.xi 	E_GOP_API_Result enRet=GOP_API_FAIL;
6327*53ee8cc1Swenshuai.xi     GOP_DRV_MixerTiming MT;
6328*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6329*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6330*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6331*53ee8cc1Swenshuai.xi #endif
6332*53ee8cc1Swenshuai.xi 
6333*53ee8cc1Swenshuai.xi 
6334*53ee8cc1Swenshuai.xi     if(pMT != NULL)
6335*53ee8cc1Swenshuai.xi     {
6336*53ee8cc1Swenshuai.xi         MT.hstart = pMT->hstart;
6337*53ee8cc1Swenshuai.xi         MT.vstart = pMT->vstart;
6338*53ee8cc1Swenshuai.xi         MT.vend = pMT->vend;
6339*53ee8cc1Swenshuai.xi         MT.hend = pMT->hend;
6340*53ee8cc1Swenshuai.xi         MT.htotal = pMT->htotal;
6341*53ee8cc1Swenshuai.xi         MT.hsyncdelay = pMT->hsyncdelay;
6342*53ee8cc1Swenshuai.xi     }
6343*53ee8cc1Swenshuai.xi 
6344*53ee8cc1Swenshuai.xi     if(pMT == NULL)
6345*53ee8cc1Swenshuai.xi     {
6346*53ee8cc1Swenshuai.xi         return(GOP_API_INVALID_PARAMETERS);
6347*53ee8cc1Swenshuai.xi     }
6348*53ee8cc1Swenshuai.xi 
6349*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_MIXER_SetOutputTiming(g_pGOPCtxLocal, GOP_CUSTOM_OP , &MT);
6350*53ee8cc1Swenshuai.xi     return(enRet);
6351*53ee8cc1Swenshuai.xi }
GOP_MIXER_EnableVfilter(void * pInstance,MS_BOOL bEnable)6352*53ee8cc1Swenshuai.xi MS_U32 GOP_MIXER_EnableVfilter(void* pInstance,MS_BOOL bEnable)
6353*53ee8cc1Swenshuai.xi {
6354*53ee8cc1Swenshuai.xi 	E_GOP_API_Result enRet=GOP_API_FAIL;
6355*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6356*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6357*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6358*53ee8cc1Swenshuai.xi #endif
6359*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_MIXER_EnableVfilter(g_pGOPCtxLocal, bEnable);
6360*53ee8cc1Swenshuai.xi 
6361*53ee8cc1Swenshuai.xi     return(enRet);
6362*53ee8cc1Swenshuai.xi }
6363*53ee8cc1Swenshuai.xi 
GOP_MIXER_EnableOldBlendingMode(void * pInstance,MS_U8 u8GOP,MS_BOOL bEnable)6364*53ee8cc1Swenshuai.xi MS_U32 GOP_MIXER_EnableOldBlendingMode(void* pInstance, MS_U8 u8GOP, MS_BOOL bEnable)
6365*53ee8cc1Swenshuai.xi {
6366*53ee8cc1Swenshuai.xi 	E_GOP_API_Result enRet=GOP_API_FAIL;
6367*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6368*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6369*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6370*53ee8cc1Swenshuai.xi #endif
6371*53ee8cc1Swenshuai.xi     enRet = (E_GOP_API_Result)MDrv_GOP_MIXER_EnableOldBlendMode(g_pGOPCtxLocal, u8GOP, bEnable);
6372*53ee8cc1Swenshuai.xi 
6373*53ee8cc1Swenshuai.xi     return(enRet);
6374*53ee8cc1Swenshuai.xi }
6375*53ee8cc1Swenshuai.xi 
GOP_GWIN_SetRelativeWinPrio(void * pInstance,MS_U8 u8GOP,GOP_GwinPri * pGwinPri)6376*53ee8cc1Swenshuai.xi MS_U32 GOP_GWIN_SetRelativeWinPrio(void* pInstance,MS_U8 u8GOP, GOP_GwinPri *pGwinPri)
6377*53ee8cc1Swenshuai.xi {
6378*53ee8cc1Swenshuai.xi 	GOP_GwinPriority GopGwinPri;
6379*53ee8cc1Swenshuai.xi     MS_U8 u8Idx;
6380*53ee8cc1Swenshuai.xi     MS_U8 u8Idx2;
6381*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6382*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6383*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6384*53ee8cc1Swenshuai.xi #endif
6385*53ee8cc1Swenshuai.xi 
6386*53ee8cc1Swenshuai.xi     //Parameter check:
6387*53ee8cc1Swenshuai.xi     if(u8GOP>=MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal)|| (NULL == pGwinPri)
6388*53ee8cc1Swenshuai.xi         || (pGwinPri->u8GwinNum > 4) || (pGwinPri->u8GwinNum <= 0))
6389*53ee8cc1Swenshuai.xi     {
6390*53ee8cc1Swenshuai.xi         return(GOP_API_INVALID_PARAMETERS);
6391*53ee8cc1Swenshuai.xi     }
6392*53ee8cc1Swenshuai.xi 
6393*53ee8cc1Swenshuai.xi     u8Idx2 = (u8GOP==0) ? MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,0) : (MS_U8)g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum;
6394*53ee8cc1Swenshuai.xi     for(u8Idx=0; u8Idx<pGwinPri->u8GwinNum; u8Idx++)
6395*53ee8cc1Swenshuai.xi     {
6396*53ee8cc1Swenshuai.xi         if(pGwinPri->u8GwinPri[u8Idx]>=u8Idx2)
6397*53ee8cc1Swenshuai.xi         {
6398*53ee8cc1Swenshuai.xi             return(GOP_API_INVALID_PARAMETERS);
6399*53ee8cc1Swenshuai.xi         }
6400*53ee8cc1Swenshuai.xi     }
6401*53ee8cc1Swenshuai.xi 
6402*53ee8cc1Swenshuai.xi     //for GOP2,GOP3.no need to set the relative prio
6403*53ee8cc1Swenshuai.xi     if ((u8GOP==2) || (u8GOP==3))
6404*53ee8cc1Swenshuai.xi     {
6405*53ee8cc1Swenshuai.xi       return(GOP_API_SUCCESS);
6406*53ee8cc1Swenshuai.xi     }
6407*53ee8cc1Swenshuai.xi 
6408*53ee8cc1Swenshuai.xi     //Handle GOP1:
6409*53ee8cc1Swenshuai.xi     if(u8GOP==1)
6410*53ee8cc1Swenshuai.xi     {
6411*53ee8cc1Swenshuai.xi         u8Idx2 = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,0);
6412*53ee8cc1Swenshuai.xi         if(pGwinPri->u8GwinPri[0]<u8Idx2)
6413*53ee8cc1Swenshuai.xi         {
6414*53ee8cc1Swenshuai.xi             return(GOP_API_INVALID_PARAMETERS);
6415*53ee8cc1Swenshuai.xi         }
6416*53ee8cc1Swenshuai.xi         GopGwinPri.Gop1_1stGwin = pGwinPri->u8GwinPri[0] - u8Idx2;
6417*53ee8cc1Swenshuai.xi         //Adjust currently hw priority to app requested relative priority:
6418*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetGwinPriority(g_pGOPCtxLocal, 1, &GopGwinPri);
6419*53ee8cc1Swenshuai.xi         return(GOP_API_SUCCESS);
6420*53ee8cc1Swenshuai.xi     }
6421*53ee8cc1Swenshuai.xi 
6422*53ee8cc1Swenshuai.xi     //Handle GOP0:
6423*53ee8cc1Swenshuai.xi     //Get Currently HW Setting:
6424*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetGwinPriority(g_pGOPCtxLocal, u8GOP, &GopGwinPri);
6425*53ee8cc1Swenshuai.xi 
6426*53ee8cc1Swenshuai.xi 
6427*53ee8cc1Swenshuai.xi     u8Idx2 = 0x0;
6428*53ee8cc1Swenshuai.xi     for(u8Idx=0; u8Idx<pGwinPri->u8GwinNum; u8Idx++)
6429*53ee8cc1Swenshuai.xi     {
6430*53ee8cc1Swenshuai.xi         if(pGwinPri->u8GwinPri[u8Idx] == GopGwinPri.Gop0_GwinPri.u81stGwin)
6431*53ee8cc1Swenshuai.xi         {
6432*53ee8cc1Swenshuai.xi             if(u8Idx2 & 0x1)
6433*53ee8cc1Swenshuai.xi             {
6434*53ee8cc1Swenshuai.xi                 return(GOP_API_INVALID_PARAMETERS);
6435*53ee8cc1Swenshuai.xi             }
6436*53ee8cc1Swenshuai.xi 
6437*53ee8cc1Swenshuai.xi             u8Idx2 |= 0x1;
6438*53ee8cc1Swenshuai.xi         }
6439*53ee8cc1Swenshuai.xi         else if(pGwinPri->u8GwinPri[u8Idx] == GopGwinPri.Gop0_GwinPri.u82stGwin)
6440*53ee8cc1Swenshuai.xi         {
6441*53ee8cc1Swenshuai.xi             if(u8Idx2 & 0x2)
6442*53ee8cc1Swenshuai.xi             {
6443*53ee8cc1Swenshuai.xi                 return(GOP_API_INVALID_PARAMETERS);
6444*53ee8cc1Swenshuai.xi             }
6445*53ee8cc1Swenshuai.xi 
6446*53ee8cc1Swenshuai.xi             u8Idx2 |= 0x2;
6447*53ee8cc1Swenshuai.xi         }
6448*53ee8cc1Swenshuai.xi         else if(pGwinPri->u8GwinPri[u8Idx] == GopGwinPri.Gop0_GwinPri.u83stGwin)
6449*53ee8cc1Swenshuai.xi         {
6450*53ee8cc1Swenshuai.xi             if(u8Idx2 & 0x4)
6451*53ee8cc1Swenshuai.xi             {
6452*53ee8cc1Swenshuai.xi                 return(GOP_API_INVALID_PARAMETERS);
6453*53ee8cc1Swenshuai.xi             }
6454*53ee8cc1Swenshuai.xi 
6455*53ee8cc1Swenshuai.xi             u8Idx2 |= 0x4;
6456*53ee8cc1Swenshuai.xi         }
6457*53ee8cc1Swenshuai.xi         else if(pGwinPri->u8GwinPri[u8Idx] == GopGwinPri.Gop0_GwinPri.u84stGwin)
6458*53ee8cc1Swenshuai.xi         {
6459*53ee8cc1Swenshuai.xi             if(u8Idx2 & 0x8)
6460*53ee8cc1Swenshuai.xi             {
6461*53ee8cc1Swenshuai.xi                 return(GOP_API_INVALID_PARAMETERS);
6462*53ee8cc1Swenshuai.xi             }
6463*53ee8cc1Swenshuai.xi 
6464*53ee8cc1Swenshuai.xi             u8Idx2 |= 0x8;
6465*53ee8cc1Swenshuai.xi         }
6466*53ee8cc1Swenshuai.xi     }
6467*53ee8cc1Swenshuai.xi 
6468*53ee8cc1Swenshuai.xi     u8Idx=0;
6469*53ee8cc1Swenshuai.xi     if(u8Idx2 & 0x1)
6470*53ee8cc1Swenshuai.xi     {
6471*53ee8cc1Swenshuai.xi         GopGwinPri.Gop0_GwinPri.u81stGwin = pGwinPri->u8GwinPri[u8Idx];
6472*53ee8cc1Swenshuai.xi         u8Idx++;
6473*53ee8cc1Swenshuai.xi     }
6474*53ee8cc1Swenshuai.xi 
6475*53ee8cc1Swenshuai.xi     if(u8Idx2 & 0x2)
6476*53ee8cc1Swenshuai.xi     {
6477*53ee8cc1Swenshuai.xi         GopGwinPri.Gop0_GwinPri.u82stGwin = pGwinPri->u8GwinPri[u8Idx];
6478*53ee8cc1Swenshuai.xi         u8Idx++;
6479*53ee8cc1Swenshuai.xi     }
6480*53ee8cc1Swenshuai.xi 
6481*53ee8cc1Swenshuai.xi     if(u8Idx2 & 0x4)
6482*53ee8cc1Swenshuai.xi     {
6483*53ee8cc1Swenshuai.xi         GopGwinPri.Gop0_GwinPri.u83stGwin = pGwinPri->u8GwinPri[u8Idx];
6484*53ee8cc1Swenshuai.xi         u8Idx++;
6485*53ee8cc1Swenshuai.xi     }
6486*53ee8cc1Swenshuai.xi 
6487*53ee8cc1Swenshuai.xi     if(u8Idx2 & 0x8)
6488*53ee8cc1Swenshuai.xi     {
6489*53ee8cc1Swenshuai.xi         GopGwinPri.Gop0_GwinPri.u84stGwin = pGwinPri->u8GwinPri[u8Idx];
6490*53ee8cc1Swenshuai.xi         u8Idx++;
6491*53ee8cc1Swenshuai.xi     }
6492*53ee8cc1Swenshuai.xi 
6493*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetGwinPriority(g_pGOPCtxLocal, 0, &GopGwinPri);
6494*53ee8cc1Swenshuai.xi 
6495*53ee8cc1Swenshuai.xi     return(GOP_API_SUCCESS);
6496*53ee8cc1Swenshuai.xi }
6497*53ee8cc1Swenshuai.xi 
6498*53ee8cc1Swenshuai.xi 
6499*53ee8cc1Swenshuai.xi //==================================================================
Ioctl_GOP_DWIN_Init(void * pInstance)6500*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_DWIN_Init(void* pInstance)
6501*53ee8cc1Swenshuai.xi {
6502*53ee8cc1Swenshuai.xi     E_GOPD_FIFO_DEPTH gopdFifoDepth;
6503*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6504*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6505*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6506*53ee8cc1Swenshuai.xi #endif
6507*53ee8cc1Swenshuai.xi 
6508*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal ==NULL)
6509*53ee8cc1Swenshuai.xi     {
6510*53ee8cc1Swenshuai.xi         MS_BOOL bFirstInstance;
6511*53ee8cc1Swenshuai.xi         GOP_PreInit_Ctx(pInstance, &bFirstInstance);
6512*53ee8cc1Swenshuai.xi         if (MDrv_GOP_SetIOMapBase(g_pGOPCtxLocal) != TRUE)
6513*53ee8cc1Swenshuai.xi         {
6514*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nget IO base fail"));
6515*53ee8cc1Swenshuai.xi             return GOP_API_FAIL;
6516*53ee8cc1Swenshuai.xi         }
6517*53ee8cc1Swenshuai.xi     }
6518*53ee8cc1Swenshuai.xi 
6519*53ee8cc1Swenshuai.xi     //  MDrv_GOP_DWIN_SelectSourceFmt(GOPDWIN_DATA_FMT_YUV);
6520*53ee8cc1Swenshuai.xi     //MDrv_GOP_DWIN_SelectSource(GOPDWIN_DATA_SRC_SCALAR);
6521*53ee8cc1Swenshuai.xi     MDrv_GOP_DWIN_Set_CTRL0(g_pGOPCtxLocal, 0x0000, 0xFFFF); // Clear all
6522*53ee8cc1Swenshuai.xi     MDrv_GOP_DWIN_Set_CTRL0(g_pGOPCtxLocal, 0x0000, 0x0080); // Set continuous capture
6523*53ee8cc1Swenshuai.xi 
6524*53ee8cc1Swenshuai.xi 
6525*53ee8cc1Swenshuai.xi     // Set DMA burst access length
6526*53ee8cc1Swenshuai.xi     gopdFifoDepth = (E_GOPD_FIFO_DEPTH)MDrv_GOP_GetRegForm(g_pGOPCtxLocal, GOPTYPE.DWIN, 0xff);
6527*53ee8cc1Swenshuai.xi     switch(gopdFifoDepth)
6528*53ee8cc1Swenshuai.xi     {
6529*53ee8cc1Swenshuai.xi         case E_GOPD_FIFO_DEPTH_64:
6530*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPBWStrength(g_pGOPCtxLocal, 0xC, E_GOP_BURSTLEN_MIDDLE);
6531*53ee8cc1Swenshuai.xi             break;
6532*53ee8cc1Swenshuai.xi         case E_GOPD_FIFO_DEPTH_128:
6533*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPBWStrength(g_pGOPCtxLocal, 0xC, E_GOP_BURSTLEN_LONG);
6534*53ee8cc1Swenshuai.xi             break;
6535*53ee8cc1Swenshuai.xi         case E_GOPD_FIFO_DEPTH_256:
6536*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPBWStrength(g_pGOPCtxLocal, 0xC, E_GOP_BURSTLEN_LONG);
6537*53ee8cc1Swenshuai.xi             break;
6538*53ee8cc1Swenshuai.xi         default:
6539*53ee8cc1Swenshuai.xi             GOP_M_ERR("\n[%s][%d] Not supported GOPD FIFO depth: %d\n", __FUNCTION__,__LINE__, gopdFifoDepth); // bob.fu
6540*53ee8cc1Swenshuai.xi     }
6541*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
6542*53ee8cc1Swenshuai.xi }
6543*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Get_ScaleDst(void * pInstance,MS_U8 u8GOPNum,MS_U16 * pHScaleDst,MS_U16 * pVScaleDst)6544*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Get_ScaleDst(void* pInstance,MS_U8 u8GOPNum,MS_U16 *pHScaleDst,MS_U16 *pVScaleDst)
6545*53ee8cc1Swenshuai.xi {
6546*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6547*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6548*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6549*53ee8cc1Swenshuai.xi #endif
6550*53ee8cc1Swenshuai.xi 
6551*53ee8cc1Swenshuai.xi     *pHScaleDst = g_pGOPCtxLocal->pGOPCtxShared->u16HScaleDst[u8GOPNum];
6552*53ee8cc1Swenshuai.xi     *pVScaleDst = g_pGOPCtxLocal->pGOPCtxShared->u16VScaleDst[u8GOPNum];
6553*53ee8cc1Swenshuai.xi 		return GOP_API_SUCCESS;
6554*53ee8cc1Swenshuai.xi }
6555*53ee8cc1Swenshuai.xi 
6556*53ee8cc1Swenshuai.xi //==================================================================
6557*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////
6558*53ee8cc1Swenshuai.xi //  - GOP ioctl function.
6559*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////
6560*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Init(void * pInstance,MS_U8 u8GOP,GOP_InitInfo * pGopInit)6561*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Init(void* pInstance,MS_U8 u8GOP,GOP_InitInfo *pGopInit)
6562*53ee8cc1Swenshuai.xi {
6563*53ee8cc1Swenshuai.xi     MS_U16 u8Idx;
6564*53ee8cc1Swenshuai.xi     #if 0
6565*53ee8cc1Swenshuai.xi     DRV_GopPaletteEntry pPalArray[256];
6566*53ee8cc1Swenshuai.xi     #else
6567*53ee8cc1Swenshuai.xi         DRV_GopPaletteEntry *pPalArray = NULL;
6568*53ee8cc1Swenshuai.xi     #endif
6569*53ee8cc1Swenshuai.xi     MS_BOOL bFirstInstance = FALSE;
6570*53ee8cc1Swenshuai.xi     MS_BOOL resCtxInit;
6571*53ee8cc1Swenshuai.xi     DRV_GOPDstType GopDst;
6572*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6573*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6574*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6575*53ee8cc1Swenshuai.xi #endif
6576*53ee8cc1Swenshuai.xi 
6577*53ee8cc1Swenshuai.xi     //NULL pointer protect
6578*53ee8cc1Swenshuai.xi     if(NULL == pGopInit)
6579*53ee8cc1Swenshuai.xi     {
6580*53ee8cc1Swenshuai.xi         GOP_M_INFO("[%s][%d] input parameter is NULL\n",__FUNCTION__,__LINE__);
6581*53ee8cc1Swenshuai.xi         //GOP_LIB_VER GOPLib;
6582*53ee8cc1Swenshuai.xi         resCtxInit = _GOP_Init_Ctx(pInstance,&bFirstInstance);
6583*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(resCtxInit, GOP_M_FATAL("failed to init GOP context\n"));
6584*53ee8cc1Swenshuai.xi         if (bFirstInstance)
6585*53ee8cc1Swenshuai.xi         {
6586*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->bDummyInit = TRUE;
6587*53ee8cc1Swenshuai.xi         }
6588*53ee8cc1Swenshuai.xi 
6589*53ee8cc1Swenshuai.xi         if (MDrv_GOP_SetIOMapBase(g_pGOPCtxLocal) != TRUE)
6590*53ee8cc1Swenshuai.xi         {
6591*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nget IO base fail"));
6592*53ee8cc1Swenshuai.xi             return GOP_API_FAIL;
6593*53ee8cc1Swenshuai.xi         }
6594*53ee8cc1Swenshuai.xi     }
6595*53ee8cc1Swenshuai.xi     else
6596*53ee8cc1Swenshuai.xi     {
6597*53ee8cc1Swenshuai.xi     	//GOP_LIB_VER GOPLib;
6598*53ee8cc1Swenshuai.xi     	resCtxInit = _GOP_Init_Ctx(pInstance,&bFirstInstance);
6599*53ee8cc1Swenshuai.xi     	APIGOP_ASSERT(resCtxInit, GOP_M_FATAL("failed to init GOP context\n"));
6600*53ee8cc1Swenshuai.xi     	bFirstInit = FALSE;
6601*53ee8cc1Swenshuai.xi         if (g_pGOPCtxLocal->pGOPCtxShared->bDummyInit)
6602*53ee8cc1Swenshuai.xi         {
6603*53ee8cc1Swenshuai.xi             //other GOP init should work as the first instance flow
6604*53ee8cc1Swenshuai.xi             bFirstInstance = TRUE;
6605*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->bInitShared = TRUE;
6606*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->bDummyInit = FALSE;
6607*53ee8cc1Swenshuai.xi         }
6608*53ee8cc1Swenshuai.xi 
6609*53ee8cc1Swenshuai.xi         if (!_GOP_IsGopNumValid(pInstance,u8GOP))
6610*53ee8cc1Swenshuai.xi         {
6611*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
6612*53ee8cc1Swenshuai.xi             return GOP_API_FAIL;
6613*53ee8cc1Swenshuai.xi         }
6614*53ee8cc1Swenshuai.xi 
6615*53ee8cc1Swenshuai.xi         //init GOP global variable
6616*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bInitShared)
6617*53ee8cc1Swenshuai.xi         {
6618*53ee8cc1Swenshuai.xi 		    g_pGOPCtxLocal->Gwin_H_Dup = FALSE;
6619*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->Gwin_V_Dup = FALSE;
6620*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->current_winId = GOP0_Gwin0Id;
6621*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool1.GWinFB_Pool_BaseAddr = pGopInit->u32GOPRBAdr;
6622*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool1.u32GWinFB_Pool_MemLen = pGopInit->u32GOPRBLen;
6623*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool1.u32FirstFBIdInPool = INVALID_POOL_NEXT_FBID;
6624*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool1.poolId= GOP_WINFB_POOL1;
6625*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool2.GWinFB_Pool_BaseAddr = 0;
6626*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool2.u32GWinFB_Pool_MemLen = 0;
6627*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool2.u32FirstFBIdInPool = INVALID_POOL_NEXT_FBID;
6628*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fbPool2.poolId= GOP_WINFB_POOL2;
6629*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->fb_currentPoolId = GOP_WINFB_POOL1;
6630*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->phyGOPRegdmaAdr = pGopInit->u32GOPRegdmaAdr;
6631*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->u32GOPRegdmaLen = pGopInit->u32GOPRegdmaLen;
6632*53ee8cc1Swenshuai.xi         }
6633*53ee8cc1Swenshuai.xi 
6634*53ee8cc1Swenshuai.xi         if(pGopInit->bEnableVsyncIntFlip == TRUE)
6635*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->bEnableVsyncIntFlip = TRUE;
6636*53ee8cc1Swenshuai.xi 
6637*53ee8cc1Swenshuai.xi         if (MDrv_GOP_SetIOMapBase(g_pGOPCtxLocal) != TRUE)
6638*53ee8cc1Swenshuai.xi         {
6639*53ee8cc1Swenshuai.xi             APIGOP_ASSERT(FALSE, GOP_M_FATAL("\nget IO base fail"));
6640*53ee8cc1Swenshuai.xi             return GOP_API_FAIL;
6641*53ee8cc1Swenshuai.xi         }
6642*53ee8cc1Swenshuai.xi 
6643*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8GOP] = pGopInit->u16PanelWidth;
6644*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8GOP] = pGopInit->u16PanelHeight;
6645*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[u8GOP] = pGopInit->u16PanelHStr;
6646*53ee8cc1Swenshuai.xi 
6647*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_ForceWrite_Update(g_pGOPCtxLocal, u8GOP, TRUE);//if use double buffer write in GOP init state, GOP HW cannot wait V-Sync to update register
6648*53ee8cc1Swenshuai.xi 
6649*53ee8cc1Swenshuai.xi         if(g_pGOPCtxLocal->pGOPCtxShared->bInitShared)
6650*53ee8cc1Swenshuai.xi         {
6651*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_MUX))
6652*53ee8cc1Swenshuai.xi                 MDrv_GOP_InitMux(g_pGOPCtxLocal);
6653*53ee8cc1Swenshuai.xi         }
6654*53ee8cc1Swenshuai.xi         if(FALSE == g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[u8GOP])
6655*53ee8cc1Swenshuai.xi         {
6656*53ee8cc1Swenshuai.xi 
6657*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bPixelModeSupport)
6658*53ee8cc1Swenshuai.xi             {
6659*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->bPixelMode[u8GOP] = TRUE;
6660*53ee8cc1Swenshuai.xi             }
6661*53ee8cc1Swenshuai.xi             //Not initialized yet:
6662*53ee8cc1Swenshuai.xi             GOP_GWIN_InitByGOP(pInstance,bFirstInstance, u8GOP);
6663*53ee8cc1Swenshuai.xi 
6664*53ee8cc1Swenshuai.xi 	    if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_GWIN))
6665*53ee8cc1Swenshuai.xi         	    MDrv_GOP_Init(g_pGOPCtxLocal, u8GOP, pGopInit->u32GOPRegdmaAdr, pGopInit->u32GOPRegdmaLen, pGopInit->bEnableVsyncIntFlip);
6666*53ee8cc1Swenshuai.xi     #if (FPGA_TEST)
6667*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
6668*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetDstPlane(g_pGOPCtxLocal, u8GOP, E_DRV_GOP_DST_VOP,FALSE);
6669*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetStretchWin(u8GOP, E_GOP_DST_VOP,0, 0, g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth, g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight) ;
6670*53ee8cc1Swenshuai.xi 
6671*53ee8cc1Swenshuai.xi             (_GOP_Map_APIDst2DRV_Enum(pInstance,E_GOP_DST_VOP, &GopDst));
6672*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPClk(g_pGOPCtxLocal, u8GOP, E_GOP_DST_VOP);
6673*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP,DRV_GOPOUT_RGB);
6674*53ee8cc1Swenshuai.xi     #else
6675*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_SET_DST_OP))
6676*53ee8cc1Swenshuai.xi             {
6677*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
6678*53ee8cc1Swenshuai.xi 			    MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal,u8GOP,TRUE);
6679*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetDstPlane(g_pGOPCtxLocal, u8GOP, E_DRV_GOP_DST_OP0,FALSE);
6680*53ee8cc1Swenshuai.xi                 (_GOP_Map_APIDst2DRV_Enum(pInstance,E_GOP_DST_OP0, &GopDst));
6681*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetGOPClk(g_pGOPCtxLocal, u8GOP, GopDst);
6682*53ee8cc1Swenshuai.xi             }
6683*53ee8cc1Swenshuai.xi 
6684*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_STRETCHWIN))
6685*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetStretchWin(g_pGOPCtxLocal,u8GOP,0, 0, g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8GOP], g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8GOP]) ;
6686*53ee8cc1Swenshuai.xi     #endif
6687*53ee8cc1Swenshuai.xi             if (u8GOP==0)
6688*53ee8cc1Swenshuai.xi             {
6689*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP0);
6690*53ee8cc1Swenshuai.xi             }
6691*53ee8cc1Swenshuai.xi             else if (u8GOP==1)
6692*53ee8cc1Swenshuai.xi             {
6693*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP1);
6694*53ee8cc1Swenshuai.xi             }
6695*53ee8cc1Swenshuai.xi             else if (u8GOP==2)
6696*53ee8cc1Swenshuai.xi             {
6697*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP2);
6698*53ee8cc1Swenshuai.xi             }
6699*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_ENABLE_TRANSCLR))
6700*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableTransClr(g_pGOPCtxLocal,u8GOP, (GOP_TransClrFmt)0, FALSE);
6701*53ee8cc1Swenshuai.xi 
6702*53ee8cc1Swenshuai.xi             if(!g_pGOPCtxLocal->pGopChipProperty->bInitNotEnableGOPToSC)  //u4 mux init setting, enable GOP to SC in GOP init would cause problem
6703*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, TRUE);
6704*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_GWIN))
6705*53ee8cc1Swenshuai.xi             {
6706*53ee8cc1Swenshuai.xi                  g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[u8GOP] = TRUE;
6707*53ee8cc1Swenshuai.xi             }
6708*53ee8cc1Swenshuai.xi         }
6709*53ee8cc1Swenshuai.xi 
6710*53ee8cc1Swenshuai.xi         MDrv_GOP_PerClientInit(g_pGOPCtxLocal, u8GOP, pGopInit->u32GOPRegdmaAdr, pGopInit->u32GOPRegdmaLen, pGopInit->bEnableVsyncIntFlip);
6711*53ee8cc1Swenshuai.xi         _GOP_InitHSPDByGOP(pInstance,u8GOP); //Fix me, temporary solution for removing calling of "MApi_GOP_GWIN_OutputLayerSwitch"
6712*53ee8cc1Swenshuai.xi         if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_IGNORE_PALETTE))
6713*53ee8cc1Swenshuai.xi         {
6714*53ee8cc1Swenshuai.xi             pPalArray = malloc(sizeof(DRV_GopPaletteEntry)*256);
6715*53ee8cc1Swenshuai.xi             if(pPalArray != NULL)
6716*53ee8cc1Swenshuai.xi             {
6717*53ee8cc1Swenshuai.xi             for (u8Idx=0; u8Idx<256; u8Idx++)
6718*53ee8cc1Swenshuai.xi             {
6719*53ee8cc1Swenshuai.xi                 pPalArray[u8Idx].RGB.u8A = pPalArray[u8Idx].RGB.u8R = pPalArray[u8Idx].RGB.u8G = pPalArray[u8Idx].RGB.u8B = 0;
6720*53ee8cc1Swenshuai.xi             }
6721*53ee8cc1Swenshuai.xi 
6722*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetPaletteOpt(g_pGOPCtxLocal,u8GOP, pPalArray, 0, 255, E_DRV_GOP_PAL_ARGB8888);
6723*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_2GSetPaletteOpt(g_pGOPCtxLocal,u8GOP, pPalArray, 0, 255);
6724*53ee8cc1Swenshuai.xi             //MApi_GOP_GWIN_SetPalette();
6725*53ee8cc1Swenshuai.xi 
6726*53ee8cc1Swenshuai.xi                 if(pPalArray != NULL)
6727*53ee8cc1Swenshuai.xi                 {
6728*53ee8cc1Swenshuai.xi                     free(pPalArray);
6729*53ee8cc1Swenshuai.xi                     pPalArray = NULL;
6730*53ee8cc1Swenshuai.xi                 }
6731*53ee8cc1Swenshuai.xi             }
6732*53ee8cc1Swenshuai.xi             else
6733*53ee8cc1Swenshuai.xi             {
6734*53ee8cc1Swenshuai.xi                 APIGOP_ASSERT(FALSE, GOP_M_FATAL("[%s][%d]Error!! malloc fail, pPalArray[256]\n", __FUNCTION__, __LINE__));
6735*53ee8cc1Swenshuai.xi             }
6736*53ee8cc1Swenshuai.xi         }
6737*53ee8cc1Swenshuai.xi 
6738*53ee8cc1Swenshuai.xi         if(bFirstInstance)
6739*53ee8cc1Swenshuai.xi         {
6740*53ee8cc1Swenshuai.xi             MDrv_GOP_SetVOPNBL(g_pGOPCtxLocal,FALSE);
6741*53ee8cc1Swenshuai.xi         }
6742*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_ForceWrite_Update(g_pGOPCtxLocal, u8GOP, FALSE);
6743*53ee8cc1Swenshuai.xi     }
6744*53ee8cc1Swenshuai.xi 
6745*53ee8cc1Swenshuai.xi     //restore force write setting
6746*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetForceWrite(g_pGOPCtxLocal, g_pGOPCtxLocal->bInitFWR);
6747*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetBnkForceWrite(g_pGOPCtxLocal,u8GOP,bInitBkFWR[u8GOP]);
6748*53ee8cc1Swenshuai.xi // apiGOP_DBG("[OUT]\n");
6749*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
6750*53ee8cc1Swenshuai.xi }
6751*53ee8cc1Swenshuai.xi 
6752*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetCaps(void * pInstance,EN_GOP_CAPS eCapType,MS_U32 * pRet,MS_U32 ret_size)6753*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetCaps(void* pInstance,EN_GOP_CAPS eCapType, MS_U32* pRet, MS_U32 ret_size)
6754*53ee8cc1Swenshuai.xi {
6755*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6756*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6757*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6758*53ee8cc1Swenshuai.xi #endif
6759*53ee8cc1Swenshuai.xi 
6760*53ee8cc1Swenshuai.xi     if(eCapType != E_GOP_CAP_VERSION)
6761*53ee8cc1Swenshuai.xi         APIGOP_CHECK_INIT();
6762*53ee8cc1Swenshuai.xi 
6763*53ee8cc1Swenshuai.xi     E_GOP_API_Result enRet = GOP_API_SUCCESS;
6764*53ee8cc1Swenshuai.xi     switch(eCapType)
6765*53ee8cc1Swenshuai.xi     {
6766*53ee8cc1Swenshuai.xi         case E_GOP_CAP_WORD_UNIT:
6767*53ee8cc1Swenshuai.xi         {
6768*53ee8cc1Swenshuai.xi             *((MS_U16 *)pRet) = g_pGOPCtxLocal->pGopChipProperty->WordUnit;
6769*53ee8cc1Swenshuai.xi             break;
6770*53ee8cc1Swenshuai.xi         }
6771*53ee8cc1Swenshuai.xi         case E_GOP_CAP_GWIN_NUM:
6772*53ee8cc1Swenshuai.xi         {
6773*53ee8cc1Swenshuai.xi             *pRet = g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum;
6774*53ee8cc1Swenshuai.xi             break;
6775*53ee8cc1Swenshuai.xi          }
6776*53ee8cc1Swenshuai.xi         case E_GOP_CAP_VERSION:
6777*53ee8cc1Swenshuai.xi         {
6778*53ee8cc1Swenshuai.xi             char ver[] = MSIF_GOP_LIBVER;
6779*53ee8cc1Swenshuai.xi             char blnum[] = MSIF_GOP_BUILDNUM;
6780*53ee8cc1Swenshuai.xi             char cl[] = MSIF_GOP_CHANGELIST;
6781*53ee8cc1Swenshuai.xi             GOP_LIB_VER * pLibVer;
6782*53ee8cc1Swenshuai.xi 
6783*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
6784*53ee8cc1Swenshuai.xi             if(ret_size != sizeof(GOP_LIB_VER))
6785*53ee8cc1Swenshuai.xi             {
6786*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s] ERROR, invalid input structure size :%td on E_GOP_CAP_VERSION\n",__FUNCTION__,(ptrdiff_t)ret_size);
6787*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
6788*53ee8cc1Swenshuai.xi              }
6789*53ee8cc1Swenshuai.xi #endif
6790*53ee8cc1Swenshuai.xi                 pLibVer = (GOP_LIB_VER *)pRet;
6791*53ee8cc1Swenshuai.xi 
6792*53ee8cc1Swenshuai.xi                 pLibVer->GOP_LibVer = atoi(ver);
6793*53ee8cc1Swenshuai.xi                 pLibVer->GOP_BuildNum = atoi(blnum);
6794*53ee8cc1Swenshuai.xi                 pLibVer->GOP_ChangeList = atoi(cl);
6795*53ee8cc1Swenshuai.xi 
6796*53ee8cc1Swenshuai.xi                 break;
6797*53ee8cc1Swenshuai.xi             }
6798*53ee8cc1Swenshuai.xi         case E_GOP_CAP_CONSALPHA_VALIDBITS:
6799*53ee8cc1Swenshuai.xi             {
6800*53ee8cc1Swenshuai.xi                 *pRet = g_pGOPCtxLocal->pGopChipProperty->Default_ConsAlpha_bits;
6801*53ee8cc1Swenshuai.xi                 break;
6802*53ee8cc1Swenshuai.xi             }
6803*53ee8cc1Swenshuai.xi         case E_GOP_CAP_PALETTE:
6804*53ee8cc1Swenshuai.xi             {
6805*53ee8cc1Swenshuai.xi                 MS_U32 i;
6806*53ee8cc1Swenshuai.xi                 MS_U16 tmp;
6807*53ee8cc1Swenshuai.xi                 GOP_CAP_PAL_TYPE* pPal;
6808*53ee8cc1Swenshuai.xi 
6809*53ee8cc1Swenshuai.xi                 pPal = (GOP_CAP_PAL_TYPE *)pRet;
6810*53ee8cc1Swenshuai.xi                 memset(pPal,0,sizeof(GOP_CAP_PAL_TYPE));
6811*53ee8cc1Swenshuai.xi 
6812*53ee8cc1Swenshuai.xi                 for(i=0;i< _GOP_GetMaxGOPNum(pInstance);i++)
6813*53ee8cc1Swenshuai.xi                 {
6814*53ee8cc1Swenshuai.xi                     tmp = MDrv_GOP_GetRegForm(g_pGOPCtxLocal,i,0xff);
6815*53ee8cc1Swenshuai.xi                     if(tmp & E_GOP_CAP_PAL_SIZE_MASK)
6816*53ee8cc1Swenshuai.xi                     {
6817*53ee8cc1Swenshuai.xi                         pPal->GOP_NumOfTbl++;
6818*53ee8cc1Swenshuai.xi                         pPal->GOP_PalTbl[i] = tmp & E_GOP_CAP_PAL_SIZE_MASK ;
6819*53ee8cc1Swenshuai.xi                         pPal->GOP_PalTblIdx |= 1<<i;
6820*53ee8cc1Swenshuai.xi                     }
6821*53ee8cc1Swenshuai.xi                 }
6822*53ee8cc1Swenshuai.xi 
6823*53ee8cc1Swenshuai.xi                 break;
6824*53ee8cc1Swenshuai.xi             }
6825*53ee8cc1Swenshuai.xi         case E_GOP_CAP_DWIN:
6826*53ee8cc1Swenshuai.xi             {
6827*53ee8cc1Swenshuai.xi                 PGOP_DWIN_CAP pDwinCap;
6828*53ee8cc1Swenshuai.xi                 pDwinCap = (PGOP_DWIN_CAP)pRet;
6829*53ee8cc1Swenshuai.xi                 Mdrv_GOP_GetDWinCapability(g_pGOPCtxLocal, (PDRV_GOP_DWIN_CAP)pDwinCap);
6830*53ee8cc1Swenshuai.xi                 break;
6831*53ee8cc1Swenshuai.xi             }
6832*53ee8cc1Swenshuai.xi         case E_GOP_CAP_GOP_MUX:
6833*53ee8cc1Swenshuai.xi             {
6834*53ee8cc1Swenshuai.xi                 if(pRet != NULL)
6835*53ee8cc1Swenshuai.xi                 {
6836*53ee8cc1Swenshuai.xi                     PST_DRV_GOP_MUX_CAP_EX pstDrvMuxCapEx = (PST_DRV_GOP_MUX_CAP_EX)(void*)pRet;
6837*53ee8cc1Swenshuai.xi                     if(Mdrv_GOP_GetMuxPriority(g_pGOPCtxLocal, (PST_DRV_GOP_MUX_CAP_EX)pstDrvMuxCapEx))
6838*53ee8cc1Swenshuai.xi                     {
6839*53ee8cc1Swenshuai.xi                         pstDrvMuxCapEx->bNeedSetMUX1ToIP0 = g_pGOPCtxLocal->pGopChipProperty->bNeedSetMUX1ToIP0;
6840*53ee8cc1Swenshuai.xi                         pstDrvMuxCapEx->bNeedSetMUX3ToIP0 = g_pGOPCtxLocal->pGopChipProperty->bNeedSetMUX3ToIP0;
6841*53ee8cc1Swenshuai.xi                         pstDrvMuxCapEx->bNewMux = g_pGOPCtxLocal->pGopChipProperty->bNewMux;
6842*53ee8cc1Swenshuai.xi                     }
6843*53ee8cc1Swenshuai.xi                     else
6844*53ee8cc1Swenshuai.xi                     {
6845*53ee8cc1Swenshuai.xi                         enRet = GOP_API_FAIL;
6846*53ee8cc1Swenshuai.xi                     }
6847*53ee8cc1Swenshuai.xi                 }
6848*53ee8cc1Swenshuai.xi                 else
6849*53ee8cc1Swenshuai.xi                 {
6850*53ee8cc1Swenshuai.xi                     APIGOP_ASSERT(0, GOP_M_FATAL("Invalid input parameter: NULL pointer\n"));
6851*53ee8cc1Swenshuai.xi                 }
6852*53ee8cc1Swenshuai.xi 
6853*53ee8cc1Swenshuai.xi                 break;
6854*53ee8cc1Swenshuai.xi              }
6855*53ee8cc1Swenshuai.xi         case E_GOP_CAP_PIXELMODE_SUPPORT:
6856*53ee8cc1Swenshuai.xi             {
6857*53ee8cc1Swenshuai.xi                 *pRet = g_pGOPCtxLocal->pGopChipProperty->bPixelModeSupport;
6858*53ee8cc1Swenshuai.xi                 break;
6859*53ee8cc1Swenshuai.xi             }
6860*53ee8cc1Swenshuai.xi         case E_GOP_CAP_STRETCH:
6861*53ee8cc1Swenshuai.xi         {
6862*53ee8cc1Swenshuai.xi             if(pRet != NULL)
6863*53ee8cc1Swenshuai.xi             {
6864*53ee8cc1Swenshuai.xi                 MS_U8 i;
6865*53ee8cc1Swenshuai.xi                 PGOP_CAP_STRETCH_INFO pGOPStretchInfo= (PGOP_CAP_STRETCH_INFO)pRet;
6866*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
6867*53ee8cc1Swenshuai.xi                 if(ret_size != sizeof(GOP_CAP_STRETCH_INFO))
6868*53ee8cc1Swenshuai.xi                 {
6869*53ee8cc1Swenshuai.xi                     GOP_M_ERR("[%s] ERROR, invalid input structure size :%td on E_GOP_CAP_STRETCH\n",__FUNCTION__,(ptrdiff_t)ret_size);
6870*53ee8cc1Swenshuai.xi                     return GOP_API_FAIL;
6871*53ee8cc1Swenshuai.xi                 }
6872*53ee8cc1Swenshuai.xi #endif
6873*53ee8cc1Swenshuai.xi                 pGOPStretchInfo->GOP_VStretch_Support=0;
6874*53ee8cc1Swenshuai.xi                 for(i=0;i<MIN(sizeof(g_pGOPCtxLocal->pGopChipProperty->bGOPWithVscale),(sizeof(pGOPStretchInfo->GOP_VStretch_Support)*8));i++)
6875*53ee8cc1Swenshuai.xi                 {
6876*53ee8cc1Swenshuai.xi                     if(g_pGOPCtxLocal->pGopChipProperty->bGOPWithVscale[i])
6877*53ee8cc1Swenshuai.xi                     {
6878*53ee8cc1Swenshuai.xi                         pGOPStretchInfo->GOP_VStretch_Support |= BIT(i);
6879*53ee8cc1Swenshuai.xi                     }
6880*53ee8cc1Swenshuai.xi                     else
6881*53ee8cc1Swenshuai.xi                     {
6882*53ee8cc1Swenshuai.xi                         pGOPStretchInfo->GOP_VStretch_Support &= ~(BIT(i));
6883*53ee8cc1Swenshuai.xi                     }
6884*53ee8cc1Swenshuai.xi                 }
6885*53ee8cc1Swenshuai.xi             }
6886*53ee8cc1Swenshuai.xi             else
6887*53ee8cc1Swenshuai.xi             {
6888*53ee8cc1Swenshuai.xi                 APIGOP_ASSERT(0, GOP_M_FATAL("Invalid input parameter: NULL pointer\n"));
6889*53ee8cc1Swenshuai.xi             }
6890*53ee8cc1Swenshuai.xi             break;
6891*53ee8cc1Swenshuai.xi         }
6892*53ee8cc1Swenshuai.xi         case E_GOP_CAP_TLBMODE_SUPPORT:
6893*53ee8cc1Swenshuai.xi         {
6894*53ee8cc1Swenshuai.xi             if(pRet != NULL)
6895*53ee8cc1Swenshuai.xi             {
6896*53ee8cc1Swenshuai.xi                 MS_U8 i;
6897*53ee8cc1Swenshuai.xi                 PGOP_CAP_TLB_INFO pGOPTLBInfo= (PGOP_CAP_TLB_INFO)pRet;
6898*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
6899*53ee8cc1Swenshuai.xi                 if(ret_size != sizeof(GOP_CAP_TLB_INFO))
6900*53ee8cc1Swenshuai.xi                 {
6901*53ee8cc1Swenshuai.xi                     GOP_M_ERR("[%s] ERROR, invalid input structure size :%td on E_GOP_CAP_TLBMODE_SUPPORT\n",__FUNCTION__,(ptrdiff_t)ret_size);
6902*53ee8cc1Swenshuai.xi                     return GOP_API_FAIL;
6903*53ee8cc1Swenshuai.xi                 }
6904*53ee8cc1Swenshuai.xi #endif
6905*53ee8cc1Swenshuai.xi                 pGOPTLBInfo->GOP_TLB_Support=0;
6906*53ee8cc1Swenshuai.xi                 for(i=0; i < MAX_GOP_SUPPORT; i++)
6907*53ee8cc1Swenshuai.xi                 {
6908*53ee8cc1Swenshuai.xi                     if(g_pGOPCtxLocal->pGopChipProperty->bTLBSupport[i])
6909*53ee8cc1Swenshuai.xi                     {
6910*53ee8cc1Swenshuai.xi                         pGOPTLBInfo->GOP_TLB_Support |= BIT(i);
6911*53ee8cc1Swenshuai.xi                     }
6912*53ee8cc1Swenshuai.xi                     else
6913*53ee8cc1Swenshuai.xi                     {
6914*53ee8cc1Swenshuai.xi                         pGOPTLBInfo->GOP_TLB_Support &= ~(BIT(i));
6915*53ee8cc1Swenshuai.xi                     }
6916*53ee8cc1Swenshuai.xi                 }
6917*53ee8cc1Swenshuai.xi             }
6918*53ee8cc1Swenshuai.xi             else
6919*53ee8cc1Swenshuai.xi             {
6920*53ee8cc1Swenshuai.xi                 APIGOP_ASSERT(0, GOP_M_FATAL("Invalid input parameter: NULL pointer\n"));
6921*53ee8cc1Swenshuai.xi             }
6922*53ee8cc1Swenshuai.xi             break;
6923*53ee8cc1Swenshuai.xi         }
6924*53ee8cc1Swenshuai.xi         case E_GOP_CAP_AFBC_SUPPORT:
6925*53ee8cc1Swenshuai.xi         {
6926*53ee8cc1Swenshuai.xi             if(pRet != NULL)
6927*53ee8cc1Swenshuai.xi             {
6928*53ee8cc1Swenshuai.xi                 MS_U8 i;
6929*53ee8cc1Swenshuai.xi                 PGOP_CAP_AFBC_INFO pGOPAFBCInfo= (PGOP_CAP_AFBC_INFO)pRet;
6930*53ee8cc1Swenshuai.xi                 if(ret_size != sizeof(GOP_CAP_AFBC_INFO))
6931*53ee8cc1Swenshuai.xi                 {
6932*53ee8cc1Swenshuai.xi                     printf("[%s] ERROR, invalid input structure size :%td on E_GOP_CAP_AFBC_MODE_SUPPORT\n",__FUNCTION__,(ptrdiff_t)ret_size);
6933*53ee8cc1Swenshuai.xi                     return GOP_API_FAIL;
6934*53ee8cc1Swenshuai.xi                 }
6935*53ee8cc1Swenshuai.xi                 pGOPAFBCInfo->GOP_AFBC_Support=0;
6936*53ee8cc1Swenshuai.xi                 for(i=0; i < MAX_GOP_SUPPORT; i++)
6937*53ee8cc1Swenshuai.xi                 {
6938*53ee8cc1Swenshuai.xi                     if(g_pGOPCtxLocal->pGopChipProperty->bAFBC_Support[i])
6939*53ee8cc1Swenshuai.xi                     {
6940*53ee8cc1Swenshuai.xi                         pGOPAFBCInfo->GOP_AFBC_Support |= BIT(i);
6941*53ee8cc1Swenshuai.xi                     }
6942*53ee8cc1Swenshuai.xi                     else
6943*53ee8cc1Swenshuai.xi                     {
6944*53ee8cc1Swenshuai.xi                         pGOPAFBCInfo->GOP_AFBC_Support &= ~(BIT(i));
6945*53ee8cc1Swenshuai.xi                     }
6946*53ee8cc1Swenshuai.xi                 }
6947*53ee8cc1Swenshuai.xi             }
6948*53ee8cc1Swenshuai.xi             else
6949*53ee8cc1Swenshuai.xi             {
6950*53ee8cc1Swenshuai.xi                 APIGOP_ASSERT(0, printf("Invalid input parameter: NULL pointer\n"));
6951*53ee8cc1Swenshuai.xi             }
6952*53ee8cc1Swenshuai.xi             break;
6953*53ee8cc1Swenshuai.xi         }
6954*53ee8cc1Swenshuai.xi         case E_GOP_CAP_BNKFORCEWRITE:
6955*53ee8cc1Swenshuai.xi         {
6956*53ee8cc1Swenshuai.xi             *pRet = g_pGOPCtxLocal->pGopChipProperty->bBnkForceWrite;
6957*53ee8cc1Swenshuai.xi             break;
6958*53ee8cc1Swenshuai.xi         }
6959*53ee8cc1Swenshuai.xi         default:
6960*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s]not support GOP capability case: %d\n",__FUNCTION__, eCapType);
6961*53ee8cc1Swenshuai.xi             enRet = GOP_API_FAIL;
6962*53ee8cc1Swenshuai.xi     }
6963*53ee8cc1Swenshuai.xi 
6964*53ee8cc1Swenshuai.xi     return enRet;
6965*53ee8cc1Swenshuai.xi }
6966*53ee8cc1Swenshuai.xi 
6967*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetConfig(void * pInstance,EN_GOP_CONFIG_TYPE cfg_type,MS_U32 * pCfg,MS_U32 u32Size)6968*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetConfig(void* pInstance,EN_GOP_CONFIG_TYPE cfg_type,MS_U32* pCfg,MS_U32 u32Size)
6969*53ee8cc1Swenshuai.xi {
6970*53ee8cc1Swenshuai.xi     MS_BOOL bFirstInstance;
6971*53ee8cc1Swenshuai.xi     MS_BOOL resCtxInit;
6972*53ee8cc1Swenshuai.xi     EN_GOP_IGNOREINIT *pGOPIgnoreInit;
6973*53ee8cc1Swenshuai.xi     DRV_GOP_CONSALPHA_BITS *pGOPAlphaBits;
6974*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
6975*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
6976*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
6977*53ee8cc1Swenshuai.xi #endif
6978*53ee8cc1Swenshuai.xi 
6979*53ee8cc1Swenshuai.xi     switch(cfg_type)
6980*53ee8cc1Swenshuai.xi     {
6981*53ee8cc1Swenshuai.xi     case E_GOP_IGNOREINIT:
6982*53ee8cc1Swenshuai.xi         resCtxInit = GOP_PreInit_Ctx(pInstance,&bFirstInstance);
6983*53ee8cc1Swenshuai.xi         APIGOP_ASSERT(resCtxInit, GOP_M_FATAL("failed to init GOP context\n"));
6984*53ee8cc1Swenshuai.xi 
6985*53ee8cc1Swenshuai.xi         pGOPIgnoreInit = (EN_GOP_IGNOREINIT *)(pCfg);
6986*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit = (DRV_GOP_IGNOREINIT)(*pGOPIgnoreInit);
6987*53ee8cc1Swenshuai.xi         /*To control that do not affect the normal flow in MApi_GOP_Init and MApi_GOP_InitByGOP*/
6988*53ee8cc1Swenshuai.xi         if(E_GOP_IGNORE_DISABLE != *pGOPIgnoreInit)
6989*53ee8cc1Swenshuai.xi         {
6990*53ee8cc1Swenshuai.xi             bFirstInit = TRUE;
6991*53ee8cc1Swenshuai.xi         }
6992*53ee8cc1Swenshuai.xi         break;
6993*53ee8cc1Swenshuai.xi     case E_GOP_CONSALPHA_BITS:
6994*53ee8cc1Swenshuai.xi 
6995*53ee8cc1Swenshuai.xi 
6996*53ee8cc1Swenshuai.xi         pGOPAlphaBits = (DRV_GOP_CONSALPHA_BITS *)(pCfg);
6997*53ee8cc1Swenshuai.xi         *(g_pGOPCtxLocal->pGopConsAlphaBits) =  *pGOPAlphaBits;
6998*53ee8cc1Swenshuai.xi         break;
6999*53ee8cc1Swenshuai.xi     default:
7000*53ee8cc1Swenshuai.xi 
7001*53ee8cc1Swenshuai.xi         break;
7002*53ee8cc1Swenshuai.xi     }
7003*53ee8cc1Swenshuai.xi 
7004*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
7005*53ee8cc1Swenshuai.xi 
7006*53ee8cc1Swenshuai.xi 
7007*53ee8cc1Swenshuai.xi 
7008*53ee8cc1Swenshuai.xi 
7009*53ee8cc1Swenshuai.xi }
7010*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetConfig(void * pInstance,EN_GOP_CONFIG_TYPE cfg_type,MS_U32 * pCfg,MS_U32 u32Size)7011*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetConfig(void* pInstance,EN_GOP_CONFIG_TYPE cfg_type,MS_U32* pCfg,MS_U32 u32Size)
7012*53ee8cc1Swenshuai.xi {
7013*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
7014*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
7015*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
7016*53ee8cc1Swenshuai.xi #endif
7017*53ee8cc1Swenshuai.xi 
7018*53ee8cc1Swenshuai.xi     switch(cfg_type)
7019*53ee8cc1Swenshuai.xi     {
7020*53ee8cc1Swenshuai.xi     case E_GOP_IGNOREINIT:
7021*53ee8cc1Swenshuai.xi     {
7022*53ee8cc1Swenshuai.xi         EN_GOP_IGNOREINIT *penGOPIgnoreInit;
7023*53ee8cc1Swenshuai.xi         penGOPIgnoreInit = (EN_GOP_IGNOREINIT*)pCfg;
7024*53ee8cc1Swenshuai.xi         *penGOPIgnoreInit = (EN_GOP_IGNOREINIT)g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit;
7025*53ee8cc1Swenshuai.xi         break;
7026*53ee8cc1Swenshuai.xi     }
7027*53ee8cc1Swenshuai.xi     case E_GOP_CONSALPHA_BITS:
7028*53ee8cc1Swenshuai.xi     {
7029*53ee8cc1Swenshuai.xi         DRV_GOP_CONSALPHA_BITS *penGOPAlphaBits;
7030*53ee8cc1Swenshuai.xi         penGOPAlphaBits = (DRV_GOP_CONSALPHA_BITS *)pCfg;
7031*53ee8cc1Swenshuai.xi         penGOPAlphaBits = g_pGOPCtxLocal->pGopConsAlphaBits;
7032*53ee8cc1Swenshuai.xi         break;
7033*53ee8cc1Swenshuai.xi     }
7034*53ee8cc1Swenshuai.xi     default:
7035*53ee8cc1Swenshuai.xi 
7036*53ee8cc1Swenshuai.xi         break;
7037*53ee8cc1Swenshuai.xi     }
7038*53ee8cc1Swenshuai.xi 
7039*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
7040*53ee8cc1Swenshuai.xi }
7041*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetProperty(void * pInstance,EN_GOP_PROPERTY type,MS_U32 gop,MS_U32 * pSet,MS_U32 u32Size)7042*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetProperty(void* pInstance,EN_GOP_PROPERTY type,MS_U32 gop, MS_U32* pSet, MS_U32 u32Size)
7043*53ee8cc1Swenshuai.xi {
7044*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
7045*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
7046*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
7047*53ee8cc1Swenshuai.xi #endif
7048*53ee8cc1Swenshuai.xi 
7049*53ee8cc1Swenshuai.xi     switch(type)
7050*53ee8cc1Swenshuai.xi     {
7051*53ee8cc1Swenshuai.xi         case E_GOP_MIUSEL:
7052*53ee8cc1Swenshuai.xi         {
7053*53ee8cc1Swenshuai.xi             E_DRV_GOP_SEL_TYPE miusel;
7054*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_SEL_TYPE))
7055*53ee8cc1Swenshuai.xi             {
7056*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7057*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7058*53ee8cc1Swenshuai.xi             }
7059*53ee8cc1Swenshuai.xi 
7060*53ee8cc1Swenshuai.xi             miusel = (E_DRV_GOP_SEL_TYPE)*pSet;
7061*53ee8cc1Swenshuai.xi             GOP_MIUSel(pInstance,gop,(EN_GOP_SEL_TYPE)miusel);
7062*53ee8cc1Swenshuai.xi 
7063*53ee8cc1Swenshuai.xi             break;
7064*53ee8cc1Swenshuai.xi         }
7065*53ee8cc1Swenshuai.xi         case E_GOP_CONTRAST:
7066*53ee8cc1Swenshuai.xi         {
7067*53ee8cc1Swenshuai.xi             PGOP_CONTRAST pRGB = (PGOP_CONTRAST)pSet;
7068*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_CONTRAST))
7069*53ee8cc1Swenshuai.xi             {
7070*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7071*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7072*53ee8cc1Swenshuai.xi             }
7073*53ee8cc1Swenshuai.xi 
7074*53ee8cc1Swenshuai.xi             GOP_SetContrast(pInstance,gop,pRGB->y, pRGB->u, pRGB->v);
7075*53ee8cc1Swenshuai.xi 
7076*53ee8cc1Swenshuai.xi 
7077*53ee8cc1Swenshuai.xi             break;
7078*53ee8cc1Swenshuai.xi         }
7079*53ee8cc1Swenshuai.xi         case E_GOP_BRIGHTNESS:
7080*53ee8cc1Swenshuai.xi         {
7081*53ee8cc1Swenshuai.xi             PGOP_BRIGHTNESS pBri = (PGOP_BRIGHTNESS)pSet;
7082*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_BRIGHTNESS))
7083*53ee8cc1Swenshuai.xi             {
7084*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7085*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7086*53ee8cc1Swenshuai.xi             }
7087*53ee8cc1Swenshuai.xi 
7088*53ee8cc1Swenshuai.xi             GOP_SetBrightness(pInstance,gop,pBri->Brightness, pBri->bMSB);
7089*53ee8cc1Swenshuai.xi             break;
7090*53ee8cc1Swenshuai.xi         }
7091*53ee8cc1Swenshuai.xi         case E_GOP_OUTPUT_COLOR:
7092*53ee8cc1Swenshuai.xi         {
7093*53ee8cc1Swenshuai.xi             EN_GOP_OUTPUT_COLOR output;
7094*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_OUTPUT_COLOR))
7095*53ee8cc1Swenshuai.xi             {
7096*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7097*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7098*53ee8cc1Swenshuai.xi             }
7099*53ee8cc1Swenshuai.xi 
7100*53ee8cc1Swenshuai.xi             output = (EN_GOP_OUTPUT_COLOR)*pSet;
7101*53ee8cc1Swenshuai.xi             GOP_SetOutputColor(pInstance,gop,output);
7102*53ee8cc1Swenshuai.xi 
7103*53ee8cc1Swenshuai.xi             break;
7104*53ee8cc1Swenshuai.xi 
7105*53ee8cc1Swenshuai.xi         }
7106*53ee8cc1Swenshuai.xi         case E_GOP_UV_SWAP:
7107*53ee8cc1Swenshuai.xi         {
7108*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7109*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7110*53ee8cc1Swenshuai.xi             {
7111*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7112*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7113*53ee8cc1Swenshuai.xi             }
7114*53ee8cc1Swenshuai.xi 
7115*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7116*53ee8cc1Swenshuai.xi             GOP_SetUVSwap(pInstance,gop,bEn);
7117*53ee8cc1Swenshuai.xi 
7118*53ee8cc1Swenshuai.xi             break;
7119*53ee8cc1Swenshuai.xi         }
7120*53ee8cc1Swenshuai.xi         case E_GOP_YC_SWAP:
7121*53ee8cc1Swenshuai.xi         {
7122*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7123*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7124*53ee8cc1Swenshuai.xi             {
7125*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7126*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7127*53ee8cc1Swenshuai.xi             }
7128*53ee8cc1Swenshuai.xi 
7129*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7130*53ee8cc1Swenshuai.xi             GOP_SetYCSwap(pInstance,gop,bEn);
7131*53ee8cc1Swenshuai.xi 
7132*53ee8cc1Swenshuai.xi             break;
7133*53ee8cc1Swenshuai.xi         }
7134*53ee8cc1Swenshuai.xi         case E_GOP_HSTART:
7135*53ee8cc1Swenshuai.xi         {
7136*53ee8cc1Swenshuai.xi             MS_U16 u16PanelHStr;
7137*53ee8cc1Swenshuai.xi 
7138*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U16))
7139*53ee8cc1Swenshuai.xi             {
7140*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7141*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7142*53ee8cc1Swenshuai.xi             }
7143*53ee8cc1Swenshuai.xi 
7144*53ee8cc1Swenshuai.xi             u16PanelHStr = (MS_U16)*pSet;
7145*53ee8cc1Swenshuai.xi             GOP_SetHStart(pInstance,gop,u16PanelHStr);
7146*53ee8cc1Swenshuai.xi 
7147*53ee8cc1Swenshuai.xi             break;
7148*53ee8cc1Swenshuai.xi         }
7149*53ee8cc1Swenshuai.xi         case E_GOP_TRANSCOLOR:
7150*53ee8cc1Swenshuai.xi         {
7151*53ee8cc1Swenshuai.xi             PGOP_TRANSCOLOR ptrans_clr;
7152*53ee8cc1Swenshuai.xi             MS_U32 clr;
7153*53ee8cc1Swenshuai.xi             MS_U32 fullclr = 0;
7154*53ee8cc1Swenshuai.xi             EN_GOP_TRANSCLR_FMT fmt;
7155*53ee8cc1Swenshuai.xi 
7156*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_TRANSCOLOR))
7157*53ee8cc1Swenshuai.xi             {
7158*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7159*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7160*53ee8cc1Swenshuai.xi             }
7161*53ee8cc1Swenshuai.xi 
7162*53ee8cc1Swenshuai.xi             ptrans_clr = (PGOP_TRANSCOLOR)pSet;
7163*53ee8cc1Swenshuai.xi 
7164*53ee8cc1Swenshuai.xi             clr = ptrans_clr->color;
7165*53ee8cc1Swenshuai.xi             fmt = ptrans_clr->fmt;
7166*53ee8cc1Swenshuai.xi 
7167*53ee8cc1Swenshuai.xi          if(ptrans_clr->transclr_property == EN_TRANSCLR_SET_COLOR)
7168*53ee8cc1Swenshuai.xi         {
7169*53ee8cc1Swenshuai.xi             if(fmt == GOPTRANSCLR_FMT0)
7170*53ee8cc1Swenshuai.xi             {
7171*53ee8cc1Swenshuai.xi                 /***** !RGB555 *****/
7172*53ee8cc1Swenshuai.xi                 fullclr = ((clr>>10)&0x1f)<<3;      // R
7173*53ee8cc1Swenshuai.xi                 fullclr |= ((clr>>12)&0x7);
7174*53ee8cc1Swenshuai.xi                 fullclr = fullclr << 8;
7175*53ee8cc1Swenshuai.xi                 fullclr |= ((clr>>5)&0x1f)<<3;      // G
7176*53ee8cc1Swenshuai.xi                 fullclr |= ((clr>>7)&0x7);
7177*53ee8cc1Swenshuai.xi                 fullclr = fullclr << 8;
7178*53ee8cc1Swenshuai.xi                 fullclr |= (clr&0x1f)<<3;           // B
7179*53ee8cc1Swenshuai.xi                 fullclr |= ((clr>>2)&0x7);           // B
7180*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetTransClr_8888(g_pGOPCtxLocal,gop, fullclr, 0);
7181*53ee8cc1Swenshuai.xi             }
7182*53ee8cc1Swenshuai.xi             else if(fmt == GOPTRANSCLR_FMT1)
7183*53ee8cc1Swenshuai.xi             {
7184*53ee8cc1Swenshuai.xi                 /***** index mode *****/
7185*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_ReadPalette(g_pGOPCtxLocal,gop, clr, &fullclr);
7186*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetTransClr_8888(g_pGOPCtxLocal,gop, fullclr, 0);
7187*53ee8cc1Swenshuai.xi             }
7188*53ee8cc1Swenshuai.xi             else if(fmt == GOPTRANSCLR_FMT2)  //ARGB8888
7189*53ee8cc1Swenshuai.xi             {
7190*53ee8cc1Swenshuai.xi                 fullclr = ptrans_clr->color;
7191*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetTransClr_8888(g_pGOPCtxLocal,gop, fullclr, 0);
7192*53ee8cc1Swenshuai.xi             }else if(fmt == GOPTRANSCLR_FMT3)
7193*53ee8cc1Swenshuai.xi             {
7194*53ee8cc1Swenshuai.xi                 fullclr = (clr&0xff)<<16;  //V
7195*53ee8cc1Swenshuai.xi                 fullclr |= ((clr>>8)&0xff)<<8; //Y
7196*53ee8cc1Swenshuai.xi                 fullclr |= ((clr>>16)&0xff);    //U
7197*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetTransClr_YUV(g_pGOPCtxLocal, gop, fullclr, 0x0);
7198*53ee8cc1Swenshuai.xi             }
7199*53ee8cc1Swenshuai.xi 
7200*53ee8cc1Swenshuai.xi             //MDrv_GOP_GWIN_SetTransClr_8888(g_pGOPCtxLocal,gop, fullclr, 0);
7201*53ee8cc1Swenshuai.xi          }
7202*53ee8cc1Swenshuai.xi          else if(ptrans_clr->transclr_property == EN_TRANSCLR_ENABLE)
7203*53ee8cc1Swenshuai.xi          {
7204*53ee8cc1Swenshuai.xi             //MDrv_GOP_GWIN_EnableTransClr(g_pGOPCtxLocal,gop, (GOP_TransClrFmt)GOPTRANSCLR_FMT0,ptrans_clr->bEn);
7205*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableTransClr(g_pGOPCtxLocal,gop, (GOP_TransClrFmt)fmt,ptrans_clr->bEn);
7206*53ee8cc1Swenshuai.xi             if((fmt==GOPTRANSCLR_FMT0)&&((fmt != GOPTRANSCLR_FMT0)&&(fmt != GOPTRANSCLR_FMT2)))
7207*53ee8cc1Swenshuai.xi             {
7208*53ee8cc1Swenshuai.xi                 printf("%s,Fail: GOPTRANSCLR FMT0 not Match Format\n",__FUNCTION__);
7209*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7210*53ee8cc1Swenshuai.xi              }
7211*53ee8cc1Swenshuai.xi              else if((fmt==GOPTRANSCLR_FMT1)&&(fmt != GOPTRANSCLR_FMT1))
7212*53ee8cc1Swenshuai.xi              {
7213*53ee8cc1Swenshuai.xi                 printf("%s,Fail: GOPTRANSCLR FMT1 not Match Format\n",__FUNCTION__);
7214*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7215*53ee8cc1Swenshuai.xi              }
7216*53ee8cc1Swenshuai.xi          }
7217*53ee8cc1Swenshuai.xi             break;
7218*53ee8cc1Swenshuai.xi 
7219*53ee8cc1Swenshuai.xi         }
7220*53ee8cc1Swenshuai.xi         case E_GOP_PROGRESSIVE:
7221*53ee8cc1Swenshuai.xi         {
7222*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7223*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7224*53ee8cc1Swenshuai.xi             {
7225*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7226*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7227*53ee8cc1Swenshuai.xi             }
7228*53ee8cc1Swenshuai.xi 
7229*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7230*53ee8cc1Swenshuai.xi             GOP_SetProgressive(pInstance,gop,bEn);
7231*53ee8cc1Swenshuai.xi             break;
7232*53ee8cc1Swenshuai.xi         }
7233*53ee8cc1Swenshuai.xi         case E_GOP_ALPHAINVERSE:
7234*53ee8cc1Swenshuai.xi         {
7235*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7236*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7237*53ee8cc1Swenshuai.xi             {
7238*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7239*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7240*53ee8cc1Swenshuai.xi             }
7241*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7242*53ee8cc1Swenshuai.xi             GOP_SetAlphaInverse(pInstance,gop, bEn);
7243*53ee8cc1Swenshuai.xi             break;
7244*53ee8cc1Swenshuai.xi         }
7245*53ee8cc1Swenshuai.xi         case E_GOP_PREALPHAMODE:
7246*53ee8cc1Swenshuai.xi         {
7247*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7248*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7249*53ee8cc1Swenshuai.xi             {
7250*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7251*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7252*53ee8cc1Swenshuai.xi             }
7253*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7254*53ee8cc1Swenshuai.xi 
7255*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2Mode1(g_pGOPCtxLocal, gop, bEn);
7256*53ee8cc1Swenshuai.xi 
7257*53ee8cc1Swenshuai.xi             break;
7258*53ee8cc1Swenshuai.xi         }
7259*53ee8cc1Swenshuai.xi         case E_GOP_FIELD_INVERSE:
7260*53ee8cc1Swenshuai.xi         {
7261*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7262*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7263*53ee8cc1Swenshuai.xi             {
7264*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7265*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7266*53ee8cc1Swenshuai.xi             }
7267*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7268*53ee8cc1Swenshuai.xi 
7269*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetFieldInver(g_pGOPCtxLocal,gop ,bEn);
7270*53ee8cc1Swenshuai.xi 
7271*53ee8cc1Swenshuai.xi             break;
7272*53ee8cc1Swenshuai.xi         }
7273*53ee8cc1Swenshuai.xi         case E_GOP_OUTPUT_TIMING:
7274*53ee8cc1Swenshuai.xi         {
7275*53ee8cc1Swenshuai.xi             PST_GOP_TIMING_INFO pstInfo;
7276*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(ST_GOP_TIMING_INFO))
7277*53ee8cc1Swenshuai.xi             {
7278*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7279*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7280*53ee8cc1Swenshuai.xi             }
7281*53ee8cc1Swenshuai.xi             pstInfo = (PST_GOP_TIMING_INFO)pSet;
7282*53ee8cc1Swenshuai.xi             GOP_SetPanelTiming(pInstance,gop, pstInfo);
7283*53ee8cc1Swenshuai.xi             break;
7284*53ee8cc1Swenshuai.xi         }
7285*53ee8cc1Swenshuai.xi         case E_GOP_PIXELBASE_ENABLE:
7286*53ee8cc1Swenshuai.xi         {
7287*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7288*53ee8cc1Swenshuai.xi             {
7289*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7290*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7291*53ee8cc1Swenshuai.xi             }
7292*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->bPixelMode[gop]=(MS_BOOL)*pSet;
7293*53ee8cc1Swenshuai.xi             break;
7294*53ee8cc1Swenshuai.xi         }
7295*53ee8cc1Swenshuai.xi         case E_GOP_CLK:
7296*53ee8cc1Swenshuai.xi         {
7297*53ee8cc1Swenshuai.xi             EN_GOP_DST_TYPE eDstType;
7298*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_DST_TYPE))
7299*53ee8cc1Swenshuai.xi             {
7300*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7301*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7302*53ee8cc1Swenshuai.xi             }
7303*53ee8cc1Swenshuai.xi             eDstType = (EN_GOP_DST_TYPE)*pSet;
7304*53ee8cc1Swenshuai.xi             GOP_SetGOPClk(pInstance,gop,eDstType);
7305*53ee8cc1Swenshuai.xi             break;
7306*53ee8cc1Swenshuai.xi         }
7307*53ee8cc1Swenshuai.xi         case E_GOP_FORCE_WRITE:
7308*53ee8cc1Swenshuai.xi         {
7309*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7310*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7311*53ee8cc1Swenshuai.xi             {
7312*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7313*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7314*53ee8cc1Swenshuai.xi             }
7315*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7316*53ee8cc1Swenshuai.xi             GOP_GWIN_SetForceWrite(pInstance,bEn);
7317*53ee8cc1Swenshuai.xi             break;
7318*53ee8cc1Swenshuai.xi         }
7319*53ee8cc1Swenshuai.xi         case E_GOP_BANK_FORCE_WRITE:
7320*53ee8cc1Swenshuai.xi         {
7321*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7322*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7323*53ee8cc1Swenshuai.xi             {
7324*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7325*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7326*53ee8cc1Swenshuai.xi             }
7327*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7328*53ee8cc1Swenshuai.xi             GOP_GWIN_SetBnkForceWrite(pInstance,gop,bEn);
7329*53ee8cc1Swenshuai.xi             break;
7330*53ee8cc1Swenshuai.xi         }
7331*53ee8cc1Swenshuai.xi         case E_GOP_3D_LR_EXCHANGE:
7332*53ee8cc1Swenshuai.xi         {
7333*53ee8cc1Swenshuai.xi             GOP_Set3D_LR_FrameExchange(pInstance,gop);
7334*53ee8cc1Swenshuai.xi             break;
7335*53ee8cc1Swenshuai.xi         }
7336*53ee8cc1Swenshuai.xi         case E_GOP_VE_OSD:
7337*53ee8cc1Swenshuai.xi         {
7338*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7339*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7340*53ee8cc1Swenshuai.xi             {
7341*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7342*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7343*53ee8cc1Swenshuai.xi             }
7344*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7345*53ee8cc1Swenshuai.xi             GOP_Enable_VEOSD(pInstance,gop,bEn);
7346*53ee8cc1Swenshuai.xi             break;
7347*53ee8cc1Swenshuai.xi         }
7348*53ee8cc1Swenshuai.xi         case E_GOP_OUTPUT_LAYER_SWITCH:
7349*53ee8cc1Swenshuai.xi         {
7350*53ee8cc1Swenshuai.xi             GOP_OutputLayerSwitch(pInstance,gop);
7351*53ee8cc1Swenshuai.xi             break;
7352*53ee8cc1Swenshuai.xi         }
7353*53ee8cc1Swenshuai.xi         case E_GOP_SWAP_OVERLAP_WIN:
7354*53ee8cc1Swenshuai.xi         {
7355*53ee8cc1Swenshuai.xi             MS_U8 u8win;
7356*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
7357*53ee8cc1Swenshuai.xi             {
7358*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7359*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7360*53ee8cc1Swenshuai.xi             }
7361*53ee8cc1Swenshuai.xi             u8win = (MS_U8)*pSet;
7362*53ee8cc1Swenshuai.xi             GOP_GWIN_SwapOverlapWin(pInstance,gop,u8win);
7363*53ee8cc1Swenshuai.xi             break;
7364*53ee8cc1Swenshuai.xi         }
7365*53ee8cc1Swenshuai.xi         case E_GOP_BW_STRENGTH:
7366*53ee8cc1Swenshuai.xi         {
7367*53ee8cc1Swenshuai.xi             EN_GOP_BW_STRENGTH eGOPBWStr;
7368*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_BW_STRENGTH))
7369*53ee8cc1Swenshuai.xi             {
7370*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7371*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7372*53ee8cc1Swenshuai.xi             }
7373*53ee8cc1Swenshuai.xi             eGOPBWStr = (EN_GOP_BW_STRENGTH)*pSet;
7374*53ee8cc1Swenshuai.xi             GOP_SetGOPBWStrength(pInstance,eGOPBWStr,gop);
7375*53ee8cc1Swenshuai.xi             break;
7376*53ee8cc1Swenshuai.xi         }
7377*53ee8cc1Swenshuai.xi         case E_GOP_LB_COUPLE:
7378*53ee8cc1Swenshuai.xi         {
7379*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7380*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7381*53ee8cc1Swenshuai.xi             {
7382*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7383*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7384*53ee8cc1Swenshuai.xi             }
7385*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7386*53ee8cc1Swenshuai.xi             GOP_EnableLBCouple(pInstance,gop,bEn);
7387*53ee8cc1Swenshuai.xi             break;
7388*53ee8cc1Swenshuai.xi         }
7389*53ee8cc1Swenshuai.xi         case E_GOP_RELATIVE_WIN_PRIO:
7390*53ee8cc1Swenshuai.xi         {
7391*53ee8cc1Swenshuai.xi             GOP_GwinPri *pGwinPri = (GOP_GwinPri *)pSet;
7392*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_GwinPri))
7393*53ee8cc1Swenshuai.xi             {
7394*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7395*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7396*53ee8cc1Swenshuai.xi             }
7397*53ee8cc1Swenshuai.xi             GOP_GWIN_SetRelativeWinPrio(pInstance,gop,pGwinPri);
7398*53ee8cc1Swenshuai.xi             break;
7399*53ee8cc1Swenshuai.xi         }
7400*53ee8cc1Swenshuai.xi         case E_GOP_YUV:
7401*53ee8cc1Swenshuai.xi         {
7402*53ee8cc1Swenshuai.xi             GOP_SetGOPYUV(pInstance,gop);
7403*53ee8cc1Swenshuai.xi             break;
7404*53ee8cc1Swenshuai.xi         }
7405*53ee8cc1Swenshuai.xi         case E_GOP_REG_UPDATED:
7406*53ee8cc1Swenshuai.xi         {
7407*53ee8cc1Swenshuai.xi             break;
7408*53ee8cc1Swenshuai.xi         }
7409*53ee8cc1Swenshuai.xi         case E_GOP_RESOURCE:
7410*53ee8cc1Swenshuai.xi         {
7411*53ee8cc1Swenshuai.xi             GOP_ResetGOP(pInstance,gop);
7412*53ee8cc1Swenshuai.xi 			break;
7413*53ee8cc1Swenshuai.xi         }
7414*53ee8cc1Swenshuai.xi 
7415*53ee8cc1Swenshuai.xi         case E_GOP_MULTI_ALPHA_ENABLE:
7416*53ee8cc1Swenshuai.xi         {
7417*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7418*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7419*53ee8cc1Swenshuai.xi             {
7420*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7421*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7422*53ee8cc1Swenshuai.xi             }
7423*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7424*53ee8cc1Swenshuai.xi 
7425*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableMultiAlpha(g_pGOPCtxLocal, gop, bEn);
7426*53ee8cc1Swenshuai.xi             break;
7427*53ee8cc1Swenshuai.xi         }
7428*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_TLB_ENABLE:
7429*53ee8cc1Swenshuai.xi         {
7430*53ee8cc1Swenshuai.xi             PGOP_TLB_Enable pTLB_Enable = (PGOP_TLB_Enable)pSet;
7431*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
7432*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_TLB_Enable))
7433*53ee8cc1Swenshuai.xi             {
7434*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
7435*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7436*53ee8cc1Swenshuai.xi             }
7437*53ee8cc1Swenshuai.xi #endif
7438*53ee8cc1Swenshuai.xi             if(!g_pGOPCtxLocal->pGopChipProperty->bTLBSupport[pTLB_Enable->gop_idx])
7439*53ee8cc1Swenshuai.xi             {
7440*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GOP %d  Not Support TLB\n",__FUNCTION__,__LINE__,pTLB_Enable->gop_idx);
7441*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7442*53ee8cc1Swenshuai.xi             }
7443*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->bTLB[pTLB_Enable->gop_idx] = pTLB_Enable->bEn;
7444*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->pGOPCtxShared->u64TLBAddress[pTLB_Enable->gop_idx] = pTLB_Enable->u64TLBAddr;
7445*53ee8cc1Swenshuai.xi             //Enable TLB
7446*53ee8cc1Swenshuai.xi             MDrv_GOP_TLBEnable(g_pGOPCtxLocal,pTLB_Enable->gop_idx, pTLB_Enable->bEn);
7447*53ee8cc1Swenshuai.xi             break;
7448*53ee8cc1Swenshuai.xi         }
7449*53ee8cc1Swenshuai.xi         case E_GOP_AFBC_CORE_RESET:
7450*53ee8cc1Swenshuai.xi         {
7451*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7452*53ee8cc1Swenshuai.xi             {
7453*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7454*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7455*53ee8cc1Swenshuai.xi             }
7456*53ee8cc1Swenshuai.xi             MDrv_GOP_AFBC_Core_Reset(g_pGOPCtxLocal,gop);
7457*53ee8cc1Swenshuai.xi             break;
7458*53ee8cc1Swenshuai.xi         }
7459*53ee8cc1Swenshuai.xi         case E_GOP_AFBC_CORE_ENABLE:
7460*53ee8cc1Swenshuai.xi         {
7461*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
7462*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7463*53ee8cc1Swenshuai.xi             {
7464*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7465*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7466*53ee8cc1Swenshuai.xi             }
7467*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
7468*53ee8cc1Swenshuai.xi             MDrv_GOP_AFBC_Core_Enable(g_pGOPCtxLocal,gop,bEn);
7469*53ee8cc1Swenshuai.xi             break;
7470*53ee8cc1Swenshuai.xi         }
7471*53ee8cc1Swenshuai.xi         default:
7472*53ee8cc1Swenshuai.xi         {
7473*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s] invalid input case:%d\n",__FUNCTION__, type);
7474*53ee8cc1Swenshuai.xi         }
7475*53ee8cc1Swenshuai.xi 
7476*53ee8cc1Swenshuai.xi     }
7477*53ee8cc1Swenshuai.xi 
7478*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
7479*53ee8cc1Swenshuai.xi 
7480*53ee8cc1Swenshuai.xi }
7481*53ee8cc1Swenshuai.xi 
7482*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetProperty(void * pInstance,EN_GOP_PROPERTY type,MS_U32 gop,MS_U32 * pSet,MS_U32 u32Size)7483*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetProperty(void* pInstance,EN_GOP_PROPERTY type,MS_U32 gop, MS_U32* pSet, MS_U32 u32Size)
7484*53ee8cc1Swenshuai.xi {
7485*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
7486*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
7487*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
7488*53ee8cc1Swenshuai.xi #endif
7489*53ee8cc1Swenshuai.xi 
7490*53ee8cc1Swenshuai.xi     switch(type)
7491*53ee8cc1Swenshuai.xi     {
7492*53ee8cc1Swenshuai.xi         case E_GOP_MIUSEL:
7493*53ee8cc1Swenshuai.xi         {
7494*53ee8cc1Swenshuai.xi             E_DRV_GOP_SEL_TYPE *pMIUSel = (E_DRV_GOP_SEL_TYPE *)pSet;
7495*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(E_DRV_GOP_SEL_TYPE))
7496*53ee8cc1Swenshuai.xi             {
7497*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7498*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7499*53ee8cc1Swenshuai.xi             }
7500*53ee8cc1Swenshuai.xi 
7501*53ee8cc1Swenshuai.xi             *pMIUSel = (E_DRV_GOP_SEL_TYPE)GOP_GetMIUSel(pInstance,gop);
7502*53ee8cc1Swenshuai.xi 
7503*53ee8cc1Swenshuai.xi             break;
7504*53ee8cc1Swenshuai.xi         }
7505*53ee8cc1Swenshuai.xi         case E_GOP_CONTRAST:
7506*53ee8cc1Swenshuai.xi         {
7507*53ee8cc1Swenshuai.xi             PGOP_CONTRAST pRGB = (PGOP_CONTRAST)pSet;
7508*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_CONTRAST))
7509*53ee8cc1Swenshuai.xi             {
7510*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7511*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7512*53ee8cc1Swenshuai.xi             }
7513*53ee8cc1Swenshuai.xi 
7514*53ee8cc1Swenshuai.xi             GOP_GetContrast(pInstance,gop,&(pRGB->y), &(pRGB->u), &(pRGB->v));
7515*53ee8cc1Swenshuai.xi 
7516*53ee8cc1Swenshuai.xi             break;
7517*53ee8cc1Swenshuai.xi         }
7518*53ee8cc1Swenshuai.xi         case E_GOP_BRIGHTNESS:
7519*53ee8cc1Swenshuai.xi         {
7520*53ee8cc1Swenshuai.xi             PGOP_BRIGHTNESS pBri = (PGOP_BRIGHTNESS)pSet;
7521*53ee8cc1Swenshuai.xi             MS_U16* pu16Brightness = (MS_U16*)&(pBri->Brightness);
7522*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_BRIGHTNESS))
7523*53ee8cc1Swenshuai.xi             {
7524*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7525*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7526*53ee8cc1Swenshuai.xi             }
7527*53ee8cc1Swenshuai.xi 
7528*53ee8cc1Swenshuai.xi             GOP_GetBrightness(pInstance,gop, pu16Brightness, &(pBri->bMSB));
7529*53ee8cc1Swenshuai.xi             break;
7530*53ee8cc1Swenshuai.xi         }
7531*53ee8cc1Swenshuai.xi         case E_GOP_ALPHAINVERSE:
7532*53ee8cc1Swenshuai.xi         {
7533*53ee8cc1Swenshuai.xi             MS_BOOL *pbAlphaInverse = (MS_BOOL *)pSet;
7534*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7535*53ee8cc1Swenshuai.xi             {
7536*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7537*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7538*53ee8cc1Swenshuai.xi             }
7539*53ee8cc1Swenshuai.xi 
7540*53ee8cc1Swenshuai.xi             *pbAlphaInverse = GOP_GetAlphaInverse(pInstance,gop);
7541*53ee8cc1Swenshuai.xi 
7542*53ee8cc1Swenshuai.xi             break;
7543*53ee8cc1Swenshuai.xi         }
7544*53ee8cc1Swenshuai.xi         case E_GOP_HSCALE_RATIO:
7545*53ee8cc1Swenshuai.xi         {
7546*53ee8cc1Swenshuai.xi             MS_U16 *pHscale = (MS_U16 *)pSet;
7547*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U16))
7548*53ee8cc1Swenshuai.xi             {
7549*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7550*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7551*53ee8cc1Swenshuai.xi             }
7552*53ee8cc1Swenshuai.xi             *pHscale = GOP_Get_Hscale(pInstance,gop);
7553*53ee8cc1Swenshuai.xi             break;
7554*53ee8cc1Swenshuai.xi         }
7555*53ee8cc1Swenshuai.xi         case E_GOP_VSCALE_RATIO:
7556*53ee8cc1Swenshuai.xi         {
7557*53ee8cc1Swenshuai.xi             MS_U16 *pVscale = (MS_U16 *)pSet;
7558*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U16))
7559*53ee8cc1Swenshuai.xi             {
7560*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7561*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7562*53ee8cc1Swenshuai.xi             }
7563*53ee8cc1Swenshuai.xi             *pVscale = GOP_Get_Vscale(pInstance,gop);
7564*53ee8cc1Swenshuai.xi             break;
7565*53ee8cc1Swenshuai.xi         }
7566*53ee8cc1Swenshuai.xi         case E_GOP_HSTART:
7567*53ee8cc1Swenshuai.xi         {
7568*53ee8cc1Swenshuai.xi             MS_U16 *pu16HStart = (MS_U16 *)pSet;
7569*53ee8cc1Swenshuai.xi             if (u32Size != sizeof(MS_U16))
7570*53ee8cc1Swenshuai.xi             {
7571*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7572*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7573*53ee8cc1Swenshuai.xi             }
7574*53ee8cc1Swenshuai.xi             *pu16HStart = g_pGOPCtxLocal->pGOPCtxShared->u16PnlHStr[gop];
7575*53ee8cc1Swenshuai.xi             break;
7576*53ee8cc1Swenshuai.xi         }
7577*53ee8cc1Swenshuai.xi         case E_GOP_OUTPUT_TIMING:
7578*53ee8cc1Swenshuai.xi         {
7579*53ee8cc1Swenshuai.xi             PST_GOP_TIMING_INFO pstInfo;
7580*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(ST_GOP_TIMING_INFO))
7581*53ee8cc1Swenshuai.xi             {
7582*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7583*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7584*53ee8cc1Swenshuai.xi             }
7585*53ee8cc1Swenshuai.xi             pstInfo = (PST_GOP_TIMING_INFO)pSet;
7586*53ee8cc1Swenshuai.xi             GOP_GetPanelTiming(pInstance,gop, pstInfo);
7587*53ee8cc1Swenshuai.xi             break;
7588*53ee8cc1Swenshuai.xi         }
7589*53ee8cc1Swenshuai.xi         case E_GOP_PIXELBASE_ENABLE:
7590*53ee8cc1Swenshuai.xi         {
7591*53ee8cc1Swenshuai.xi             PGOP_SET_PROPERTY_PARAM pstInfo;
7592*53ee8cc1Swenshuai.xi             MS_BOOL *pbEn;
7593*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7594*53ee8cc1Swenshuai.xi             {
7595*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7596*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7597*53ee8cc1Swenshuai.xi             }
7598*53ee8cc1Swenshuai.xi             pstInfo = (PGOP_SET_PROPERTY_PARAM)(void*)pSet;
7599*53ee8cc1Swenshuai.xi             pbEn = (MS_BOOL*)(pstInfo->pSetting);
7600*53ee8cc1Swenshuai.xi             *pbEn = g_pGOPCtxLocal->pGOPCtxShared->bPixelMode[pstInfo->gop_idx];
7601*53ee8cc1Swenshuai.xi             break;
7602*53ee8cc1Swenshuai.xi         }
7603*53ee8cc1Swenshuai.xi         case E_GOP_MULTI_ALPHA_ENABLE:
7604*53ee8cc1Swenshuai.xi         {
7605*53ee8cc1Swenshuai.xi             PGOP_SET_PROPERTY_PARAM pstInfo;
7606*53ee8cc1Swenshuai.xi             MS_BOOL *pbEn;
7607*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7608*53ee8cc1Swenshuai.xi             {
7609*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7610*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7611*53ee8cc1Swenshuai.xi             }
7612*53ee8cc1Swenshuai.xi             pstInfo = (PGOP_SET_PROPERTY_PARAM)(void*)pSet;
7613*53ee8cc1Swenshuai.xi             pbEn = (MS_BOOL*)(pstInfo->pSetting);
7614*53ee8cc1Swenshuai.xi             *pbEn = MDrv_GOP_GWIN_IsMultiAlphaEnable(g_pGOPCtxLocal, pstInfo->gop_idx);
7615*53ee8cc1Swenshuai.xi             break;
7616*53ee8cc1Swenshuai.xi         }
7617*53ee8cc1Swenshuai.xi 
7618*53ee8cc1Swenshuai.xi         case E_GOP_PREALPHAMODE:
7619*53ee8cc1Swenshuai.xi         case E_GOP_FIELD_INVERSE:
7620*53ee8cc1Swenshuai.xi         case E_GOP_FORCE_WRITE:
7621*53ee8cc1Swenshuai.xi         case E_GOP_BANK_FORCE_WRITE:
7622*53ee8cc1Swenshuai.xi         case E_GOP_3D_LR_EXCHANGE:
7623*53ee8cc1Swenshuai.xi         case E_GOP_VE_OSD:
7624*53ee8cc1Swenshuai.xi         case E_GOP_OUTPUT_LAYER_SWITCH:
7625*53ee8cc1Swenshuai.xi         case E_GOP_SWAP_OVERLAP_WIN:
7626*53ee8cc1Swenshuai.xi         case E_GOP_LB_COUPLE:
7627*53ee8cc1Swenshuai.xi         case E_GOP_YUV:
7628*53ee8cc1Swenshuai.xi         case E_GOP_OUTPUT_COLOR:
7629*53ee8cc1Swenshuai.xi         case E_GOP_UV_SWAP:
7630*53ee8cc1Swenshuai.xi         case E_GOP_YC_SWAP:
7631*53ee8cc1Swenshuai.xi         case E_GOP_RELATIVE_WIN_PRIO:
7632*53ee8cc1Swenshuai.xi             break;
7633*53ee8cc1Swenshuai.xi         case E_GOP_BW_STRENGTH:
7634*53ee8cc1Swenshuai.xi         {
7635*53ee8cc1Swenshuai.xi             EN_GOP_BW_STRENGTH *peGOPBWStr = (EN_GOP_BW_STRENGTH *)pSet;;
7636*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_BW_STRENGTH))
7637*53ee8cc1Swenshuai.xi             {
7638*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7639*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7640*53ee8cc1Swenshuai.xi             }
7641*53ee8cc1Swenshuai.xi             GOP_GetGOPBWStrength(pInstance,gop,peGOPBWStr);
7642*53ee8cc1Swenshuai.xi             break;
7643*53ee8cc1Swenshuai.xi         }
7644*53ee8cc1Swenshuai.xi         case E_GOP_REG_UPDATED:
7645*53ee8cc1Swenshuai.xi         {
7646*53ee8cc1Swenshuai.xi             MS_BOOL *pUpdated = (MS_BOOL *)pSet;
7647*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
7648*53ee8cc1Swenshuai.xi             {
7649*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7650*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7651*53ee8cc1Swenshuai.xi             }
7652*53ee8cc1Swenshuai.xi             *pUpdated = GOP_IsRegUpdated(pInstance,gop);
7653*53ee8cc1Swenshuai.xi             break;
7654*53ee8cc1Swenshuai.xi         }
7655*53ee8cc1Swenshuai.xi         case E_GOP_MAXFBNUM:
7656*53ee8cc1Swenshuai.xi         {
7657*53ee8cc1Swenshuai.xi             MS_U32 *pMAXFBNum = (MS_U32 *)pSet;
7658*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
7659*53ee8cc1Swenshuai.xi             {
7660*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7661*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7662*53ee8cc1Swenshuai.xi             }
7663*53ee8cc1Swenshuai.xi             *pMAXFBNum = DRV_MAX_GWIN_FB_SUPPORT;
7664*53ee8cc1Swenshuai.xi             break;
7665*53ee8cc1Swenshuai.xi         }
7666*53ee8cc1Swenshuai.xi         case E_GOP_NUM_IS_INIT:
7667*53ee8cc1Swenshuai.xi         {
7668*53ee8cc1Swenshuai.xi             GOP_InitInfo *pGOPInitInfo = (GOP_InitInfo *)pSet;
7669*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_InitInfo))
7670*53ee8cc1Swenshuai.xi             {
7671*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] input structure size ERROR!! \n",__FUNCTION__,__LINE__);
7672*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
7673*53ee8cc1Swenshuai.xi             }
7674*53ee8cc1Swenshuai.xi             GOP_CTX_DRV_SHARED *pDrvGOPShared;
7675*53ee8cc1Swenshuai.xi             MS_BOOL bNeedInitShared = FALSE;
7676*53ee8cc1Swenshuai.xi             pDrvGOPShared = (GOP_CTX_DRV_SHARED*)MDrv_GOP_GetShareMemory(&bNeedInitShared);
7677*53ee8cc1Swenshuai.xi             if(pDrvGOPShared->apiCtxShared.bGopHasInitialized[gop])
7678*53ee8cc1Swenshuai.xi            {
7679*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u16PanelWidth = pDrvGOPShared->apiCtxShared.u16PnlWidth[gop];
7680*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u16PanelHeight = pDrvGOPShared->apiCtxShared.u16PnlHeight[gop];
7681*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u16PanelHStr = pDrvGOPShared->apiCtxShared.u16PnlHStr[gop];
7682*53ee8cc1Swenshuai.xi                 pGOPInitInfo->bEnableVsyncIntFlip = pDrvGOPShared->apiCtxShared.bEnableVsyncIntFlip;
7683*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u32GOPRBAdr = pDrvGOPShared->apiCtxShared.fbPool1.GWinFB_Pool_BaseAddr;
7684*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u32GOPRBLen = pDrvGOPShared->apiCtxShared.fbPool1.u32GWinFB_Pool_MemLen;
7685*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u32GOPRegdmaAdr = pDrvGOPShared->apiCtxShared.phyGOPRegdmaAdr;
7686*53ee8cc1Swenshuai.xi                 pGOPInitInfo->u32GOPRegdmaLen = pDrvGOPShared->apiCtxShared.u32GOPRegdmaLen;
7687*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u16PanelWidth=%d\n",pGOPInitInfo->u16PanelWidth);
7688*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u16PanelHeight=%d\n",pGOPInitInfo->u16PanelHeight);
7689*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u16PanelHStr=%d\n",pGOPInitInfo->u16PanelHStr);
7690*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->bEnableVsyncIntFlip=%d\n",pGOPInitInfo->bEnableVsyncIntFlip);
7691*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u32GOPRBAdr=0x%x\n",pGOPInitInfo->u32GOPRBAdr);
7692*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u32GOPRBLen=%d\n",pGOPInitInfo->u32GOPRBLen);
7693*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u32GOPRegdmaAdr=0x%x\n",pGOPInitInfo->u32GOPRegdmaAdr);
7694*53ee8cc1Swenshuai.xi                 //printf("pGOPInitInfo->u32GOPRegdmaLen=%d\n",pGOPInitInfo->u32GOPRegdmaLen);
7695*53ee8cc1Swenshuai.xi            }
7696*53ee8cc1Swenshuai.xi             else
7697*53ee8cc1Swenshuai.xi                  return GOP_API_FAIL;
7698*53ee8cc1Swenshuai.xi             break;
7699*53ee8cc1Swenshuai.xi         }
7700*53ee8cc1Swenshuai.xi         default:
7701*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s] This status(%d) can't be query\n",__FUNCTION__,type);
7702*53ee8cc1Swenshuai.xi             break;
7703*53ee8cc1Swenshuai.xi 
7704*53ee8cc1Swenshuai.xi     }
7705*53ee8cc1Swenshuai.xi 
7706*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
7707*53ee8cc1Swenshuai.xi 
7708*53ee8cc1Swenshuai.xi }
7709*53ee8cc1Swenshuai.xi 
_IsGopInOPMux(void * pInstance,MS_U8 u8GopNum)7710*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInOPMux(void* pInstance,MS_U8 u8GopNum)
7711*53ee8cc1Swenshuai.xi {
7712*53ee8cc1Swenshuai.xi     MS_U8 i, GetGopNum = 0;
7713*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
7714*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
7715*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
7716*53ee8cc1Swenshuai.xi #endif
7717*53ee8cc1Swenshuai.xi     for (i=0; i<MDrv_GetMaxMuxOPNum(); i++)
7718*53ee8cc1Swenshuai.xi     {
7719*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, (Gop_MuxSel)i);
7720*53ee8cc1Swenshuai.xi             if (u8GopNum==GetGopNum)
7721*53ee8cc1Swenshuai.xi             {
7722*53ee8cc1Swenshuai.xi             return TRUE;
7723*53ee8cc1Swenshuai.xi             }
7724*53ee8cc1Swenshuai.xi         }
7725*53ee8cc1Swenshuai.xi     return FALSE;
7726*53ee8cc1Swenshuai.xi }
7727*53ee8cc1Swenshuai.xi 
_IsGopInDualOPMux(void * pInstance,MS_U8 u8GopNum)7728*53ee8cc1Swenshuai.xi static MS_BOOL _IsGopInDualOPMux(void* pInstance, MS_U8 u8GopNum)
7729*53ee8cc1Swenshuai.xi {
7730*53ee8cc1Swenshuai.xi     MS_U8 i, GetGopNum = 0;
7731*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
7732*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
7733*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
7734*53ee8cc1Swenshuai.xi #endif
7735*53ee8cc1Swenshuai.xi     for (i=E_GOP_DUALRATE_OP_MUX0; i<=E_GOP_DUALRATE_OP_MUX2; i++)
7736*53ee8cc1Swenshuai.xi     {
7737*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &GetGopNum, (Gop_MuxSel)i);
7738*53ee8cc1Swenshuai.xi         if (u8GopNum==GetGopNum)
7739*53ee8cc1Swenshuai.xi         {
7740*53ee8cc1Swenshuai.xi             return TRUE;
7741*53ee8cc1Swenshuai.xi         }
7742*53ee8cc1Swenshuai.xi     }
7743*53ee8cc1Swenshuai.xi     return FALSE;
7744*53ee8cc1Swenshuai.xi }
7745*53ee8cc1Swenshuai.xi 
7746*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetDst(void * pInstance,MS_U8 u8GOP,EN_GOP_DST_TYPE dsttype)7747*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetDst(void* pInstance,MS_U8 u8GOP, EN_GOP_DST_TYPE dsttype)
7748*53ee8cc1Swenshuai.xi {
7749*53ee8cc1Swenshuai.xi    MS_U8 u8GetGOPNum =0, u8Mux0GopNum =0, i;
7750*53ee8cc1Swenshuai.xi    DRV_GOPDstType GopDst;
7751*53ee8cc1Swenshuai.xi    Gop_MuxSel OPMux = MAX_GOP_MUX_SUPPORT;
7752*53ee8cc1Swenshuai.xi 
7753*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
7754*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
7755*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
7756*53ee8cc1Swenshuai.xi #endif
7757*53ee8cc1Swenshuai.xi 
7758*53ee8cc1Swenshuai.xi     if ((!_GOP_IsGopNumValid(pInstance,u8GOP)))
7759*53ee8cc1Swenshuai.xi     {
7760*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GOP %d  is out of range\n",__FUNCTION__,__LINE__,u8GOP);
7761*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
7762*53ee8cc1Swenshuai.xi     }
7763*53ee8cc1Swenshuai.xi 
7764*53ee8cc1Swenshuai.xi     GOP_M_INFO("---%s %d: PID[%td], TID[%td] u8GOP=%u, DstType=0x%tx\n", __FUNCTION__, __LINE__, (ptrdiff_t)getpid(), (ptrdiff_t)MsOS_GetOSThreadID(), u8GOP, (ptrdiff_t)dsttype);
7765*53ee8cc1Swenshuai.xi 
7766*53ee8cc1Swenshuai.xi     /*Set GOP dst and check input dst type is vaild or not for different chip first */
7767*53ee8cc1Swenshuai.xi     (_GOP_Map_APIDst2DRV_Enum(pInstance,dsttype, &GopDst));
7768*53ee8cc1Swenshuai.xi     (MDrv_GOP_GWIN_SetDstPlane(g_pGOPCtxLocal, u8GOP, GopDst,FALSE));
7769*53ee8cc1Swenshuai.xi 
7770*53ee8cc1Swenshuai.xi    // Set GOP dst output blending to SC/Mixer
7771*53ee8cc1Swenshuai.xi     switch(GopDst)
7772*53ee8cc1Swenshuai.xi     {
7773*53ee8cc1Swenshuai.xi 
7774*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP0:
7775*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)  //t8, there are new mux for ip/mvop
7776*53ee8cc1Swenshuai.xi             {
7777*53ee8cc1Swenshuai.xi                 //printf("\n=============%s===============\n",__FUNCTION__);
7778*53ee8cc1Swenshuai.xi                 //printf("Set to New IP Mux GOP:%d\n",u8GOP);
7779*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_IP0_MUX);
7780*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
7781*53ee8cc1Swenshuai.xi             }
7782*53ee8cc1Swenshuai.xi             else         //In IP case, gop should open in OP mux0 ~ mux3
7783*53ee8cc1Swenshuai.xi             {
7784*53ee8cc1Swenshuai.xi 
7785*53ee8cc1Swenshuai.xi                 if (g_pGOPCtxLocal->pGopChipProperty->bNeedSetMUX1ToIP0)
7786*53ee8cc1Swenshuai.xi                 {
7787*53ee8cc1Swenshuai.xi                     if (!_IsGopInMux1(pInstance,u8GOP))
7788*53ee8cc1Swenshuai.xi                     {
7789*53ee8cc1Swenshuai.xi                         /*save current mux setting*/
7790*53ee8cc1Swenshuai.xi                         for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7791*53ee8cc1Swenshuai.xi                         {
7792*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
7793*53ee8cc1Swenshuai.xi                         }
7794*53ee8cc1Swenshuai.xi                         g_pGOPCtxLocal->IsChgMux= TRUE;
7795*53ee8cc1Swenshuai.xi                          /*force change input parameter u8GOP to mux1*/
7796*53ee8cc1Swenshuai.xi                         for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7797*53ee8cc1Swenshuai.xi                         {
7798*53ee8cc1Swenshuai.xi 
7799*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
7800*53ee8cc1Swenshuai.xi                             if (u8GOP == u8GetGOPNum)
7801*53ee8cc1Swenshuai.xi                             {
7802*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8Mux0GopNum, E_GOP_MUX1);
7803*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8Mux0GopNum, (Gop_MuxSel)i);
7804*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_MUX1);
7805*53ee8cc1Swenshuai.xi                                 g_pGOPCtxLocal->u8ChgIpMuxGop = u8Mux0GopNum;
7806*53ee8cc1Swenshuai.xi                                 if( u8Mux0GopNum < _GOP_GetMaxGOPNum(pInstance))
7807*53ee8cc1Swenshuai.xi                                     _GOP_InitHSPDByGOP(pInstance,u8Mux0GopNum);
7808*53ee8cc1Swenshuai.xi                                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
7809*53ee8cc1Swenshuai.xi                             }
7810*53ee8cc1Swenshuai.xi                         }
7811*53ee8cc1Swenshuai.xi 
7812*53ee8cc1Swenshuai.xi                     }
7813*53ee8cc1Swenshuai.xi                 }
7814*53ee8cc1Swenshuai.xi                 else if(g_pGOPCtxLocal->pGopChipProperty->bNeedSetMUX3ToIP0)
7815*53ee8cc1Swenshuai.xi                 {
7816*53ee8cc1Swenshuai.xi                     if (!_IsGopInMux3(pInstance,u8GOP))
7817*53ee8cc1Swenshuai.xi                     {
7818*53ee8cc1Swenshuai.xi                         /*save current mux setting*/
7819*53ee8cc1Swenshuai.xi                         for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7820*53ee8cc1Swenshuai.xi                         {
7821*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
7822*53ee8cc1Swenshuai.xi                         }
7823*53ee8cc1Swenshuai.xi                         g_pGOPCtxLocal->IsChgMux= TRUE;
7824*53ee8cc1Swenshuai.xi                          /*force change input parameter u8GOP to mux3*/
7825*53ee8cc1Swenshuai.xi                         for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7826*53ee8cc1Swenshuai.xi                         {
7827*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
7828*53ee8cc1Swenshuai.xi                             if (u8GOP == u8GetGOPNum)
7829*53ee8cc1Swenshuai.xi                             {
7830*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8Mux0GopNum, E_GOP_MUX3);
7831*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8Mux0GopNum, (Gop_MuxSel)i);
7832*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_MUX3);
7833*53ee8cc1Swenshuai.xi                                 if( u8Mux0GopNum < _GOP_GetMaxGOPNum(pInstance))
7834*53ee8cc1Swenshuai.xi                                     _GOP_InitHSPDByGOP(pInstance,u8Mux0GopNum);
7835*53ee8cc1Swenshuai.xi                                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
7836*53ee8cc1Swenshuai.xi                             }
7837*53ee8cc1Swenshuai.xi                         }
7838*53ee8cc1Swenshuai.xi                     }
7839*53ee8cc1Swenshuai.xi                 }
7840*53ee8cc1Swenshuai.xi                 else
7841*53ee8cc1Swenshuai.xi                 {
7842*53ee8cc1Swenshuai.xi                     if (!_IsGopInMux0(pInstance,u8GOP)) //jasmine:FIXME
7843*53ee8cc1Swenshuai.xi                     {
7844*53ee8cc1Swenshuai.xi                         /*save current mux setting*/
7845*53ee8cc1Swenshuai.xi                         for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7846*53ee8cc1Swenshuai.xi                         {
7847*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
7848*53ee8cc1Swenshuai.xi                         }
7849*53ee8cc1Swenshuai.xi                         g_pGOPCtxLocal->IsChgMux= TRUE;
7850*53ee8cc1Swenshuai.xi                          /*force change input parameter u8GOP to mux0*/
7851*53ee8cc1Swenshuai.xi                         for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7852*53ee8cc1Swenshuai.xi                         {
7853*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
7854*53ee8cc1Swenshuai.xi                             if (u8GOP == u8GetGOPNum)
7855*53ee8cc1Swenshuai.xi                             {
7856*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8Mux0GopNum, E_GOP_MUX0);
7857*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8Mux0GopNum, (Gop_MuxSel)i);
7858*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_MUX0);
7859*53ee8cc1Swenshuai.xi                                 if( u8Mux0GopNum < _GOP_GetMaxGOPNum(pInstance))
7860*53ee8cc1Swenshuai.xi                                     _GOP_InitHSPDByGOP(pInstance,u8Mux0GopNum);
7861*53ee8cc1Swenshuai.xi                                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
7862*53ee8cc1Swenshuai.xi                             }
7863*53ee8cc1Swenshuai.xi                         }
7864*53ee8cc1Swenshuai.xi                     }
7865*53ee8cc1Swenshuai.xi                 }
7866*53ee8cc1Swenshuai.xi             }
7867*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
7868*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
7869*53ee8cc1Swenshuai.xi             if (u8GOP==0)
7870*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_IP0_SEL_GOP0);
7871*53ee8cc1Swenshuai.xi             else if (u8GOP==1)
7872*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_IP0_SEL_GOP1);
7873*53ee8cc1Swenshuai.xi             else
7874*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_IP0_SEL_GOP2);
7875*53ee8cc1Swenshuai.xi             //MApi_GOP_GWIN_OutputColor(GOPOUT_YUV);
7876*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, TRUE);
7877*53ee8cc1Swenshuai.xi             break;
7878*53ee8cc1Swenshuai.xi 
7879*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2VE:
7880*53ee8cc1Swenshuai.xi             //jasmine:FIXME
7881*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bGOPMixerToVE)
7882*53ee8cc1Swenshuai.xi             {
7883*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
7884*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
7885*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP,DRV_GOPOUT_YUV);
7886*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, TRUE);
7887*53ee8cc1Swenshuai.xi 
7888*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetGOPClk(g_pGOPCtxLocal,u8GOP,E_DRV_GOP_DST_MIXER2VE);
7889*53ee8cc1Swenshuai.xi 
7890*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMixerDstPlane(g_pGOPCtxLocal,u8GOP,GopDst);
7891*53ee8cc1Swenshuai.xi 
7892*53ee8cc1Swenshuai.xi                 (MDrv_GOP_MIXER_SetGOPEnable2Mixer(g_pGOPCtxLocal, u8GOP, TRUE));
7893*53ee8cc1Swenshuai.xi                 (MDrv_GOP_Set_VE_MUX(g_pGOPCtxLocal, (GOPTYPE.MIXER-1),TRUE));
7894*53ee8cc1Swenshuai.xi             }
7895*53ee8cc1Swenshuai.xi             else
7896*53ee8cc1Swenshuai.xi             {
7897*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] Not Support GOPMixerToVE in this chip version.\n",__FUNCTION__,__LINE__);
7898*53ee8cc1Swenshuai.xi             }
7899*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
7900*53ee8cc1Swenshuai.xi             break;
7901*53ee8cc1Swenshuai.xi 
7902*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP0:
7903*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
7904*53ee8cc1Swenshuai.xi 
7905*53ee8cc1Swenshuai.xi             if((g_pGOPCtxLocal->pGopChipProperty->bNewMux) && (!_IsGopInOPMux(pInstance,u8GOP)))
7906*53ee8cc1Swenshuai.xi             {
7907*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
7908*53ee8cc1Swenshuai.xi                 OPMux = _GetNonUseOPMux(pInstance);
7909*53ee8cc1Swenshuai.xi                 if(OPMux != MAX_GOP_MUX_SUPPORT)
7910*53ee8cc1Swenshuai.xi                 {
7911*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, OPMux);
7912*53ee8cc1Swenshuai.xi                 }
7913*53ee8cc1Swenshuai.xi                 else
7914*53ee8cc1Swenshuai.xi                 {
7915*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_MUX2);
7916*53ee8cc1Swenshuai.xi                 }
7917*53ee8cc1Swenshuai.xi             }
7918*53ee8cc1Swenshuai.xi 
7919*53ee8cc1Swenshuai.xi             /*
7920*53ee8cc1Swenshuai.xi                       For U4, mux value may has mixer and at least one GOP is not in mux
7921*53ee8cc1Swenshuai.xi                       To check if the GOP number is in MUX0 to MUX3
7922*53ee8cc1Swenshuai.xi                       If not, find the mux value which is mixer, replace mixer by the GOP number
7923*53ee8cc1Swenshuai.xi             */
7924*53ee8cc1Swenshuai.xi             if(!_IsGopInMux0To3(pInstance,u8GOP))
7925*53ee8cc1Swenshuai.xi             {
7926*53ee8cc1Swenshuai.xi                 /*save current mux setting*/
7927*53ee8cc1Swenshuai.xi                 for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7928*53ee8cc1Swenshuai.xi                 {
7929*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
7930*53ee8cc1Swenshuai.xi                 }
7931*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->IsChgMux= TRUE;
7932*53ee8cc1Swenshuai.xi                 /*force set input parameter u8GOP to the mux which is mixer*/
7933*53ee8cc1Swenshuai.xi                 for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7934*53ee8cc1Swenshuai.xi                 {
7935*53ee8cc1Swenshuai.xi                    MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
7936*53ee8cc1Swenshuai.xi                    if ((GOPTYPE.MIXER-1) == u8GetGOPNum) //Find mixer(0x4)
7937*53ee8cc1Swenshuai.xi                    {
7938*53ee8cc1Swenshuai.xi                          MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, (Gop_MuxSel)i);
7939*53ee8cc1Swenshuai.xi                    }
7940*53ee8cc1Swenshuai.xi                 }
7941*53ee8cc1Swenshuai.xi             }
7942*53ee8cc1Swenshuai.xi 
7943*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNeedSetMUX3ToIP0) //For u4 and k1, mux3 only to IP (can not to OP)
7944*53ee8cc1Swenshuai.xi             {
7945*53ee8cc1Swenshuai.xi                 if (_IsGopInMux3(pInstance,u8GOP))
7946*53ee8cc1Swenshuai.xi                 {
7947*53ee8cc1Swenshuai.xi                     /*save current mux setting*/
7948*53ee8cc1Swenshuai.xi                     for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7949*53ee8cc1Swenshuai.xi                     {
7950*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
7951*53ee8cc1Swenshuai.xi                     }
7952*53ee8cc1Swenshuai.xi                     g_pGOPCtxLocal->IsChgMux= TRUE;
7953*53ee8cc1Swenshuai.xi 
7954*53ee8cc1Swenshuai.xi                     /*force change input parameter u8GOP exchange mux with GOP3*/
7955*53ee8cc1Swenshuai.xi                     for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7956*53ee8cc1Swenshuai.xi                     {
7957*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
7958*53ee8cc1Swenshuai.xi                         if (GOPTYPE.GOP3 == u8GetGOPNum)
7959*53ee8cc1Swenshuai.xi                         {
7960*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, (Gop_MuxSel)i);
7961*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, GOPTYPE.GOP3, E_GOP_MUX3);
7962*53ee8cc1Swenshuai.xi                         }
7963*53ee8cc1Swenshuai.xi                     }
7964*53ee8cc1Swenshuai.xi                 }
7965*53ee8cc1Swenshuai.xi             }
7966*53ee8cc1Swenshuai.xi             else if(g_pGOPCtxLocal->pGopChipProperty->bNeedSetMUX1ToIP0)
7967*53ee8cc1Swenshuai.xi             {
7968*53ee8cc1Swenshuai.xi                 if (_IsGopInMux1(pInstance,u8GOP)&&_IsGopInMux0To3(pInstance,g_pGOPCtxLocal->u8ChgIpMuxGop))
7969*53ee8cc1Swenshuai.xi                 {
7970*53ee8cc1Swenshuai.xi                     /*save current mux setting*/
7971*53ee8cc1Swenshuai.xi                     for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7972*53ee8cc1Swenshuai.xi                     {
7973*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
7974*53ee8cc1Swenshuai.xi                     }
7975*53ee8cc1Swenshuai.xi                     g_pGOPCtxLocal->IsChgMux= TRUE;
7976*53ee8cc1Swenshuai.xi 
7977*53ee8cc1Swenshuai.xi                     /*force change input parameter u8GOP exchange mux with GOP3*/
7978*53ee8cc1Swenshuai.xi                     for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
7979*53ee8cc1Swenshuai.xi                     {
7980*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
7981*53ee8cc1Swenshuai.xi                         if (g_pGOPCtxLocal->u8ChgIpMuxGop == u8GetGOPNum)
7982*53ee8cc1Swenshuai.xi                         {
7983*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, (Gop_MuxSel)i);
7984*53ee8cc1Swenshuai.xi                             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GetGOPNum, E_GOP_MUX1);
7985*53ee8cc1Swenshuai.xi                             g_pGOPCtxLocal->u8ChgIpMuxGop = 0xFF;
7986*53ee8cc1Swenshuai.xi                             if( u8GetGOPNum < _GOP_GetMaxGOPNum(pInstance))
7987*53ee8cc1Swenshuai.xi                                 _GOP_InitHSPDByGOP(pInstance,u8GetGOPNum);
7988*53ee8cc1Swenshuai.xi                         }
7989*53ee8cc1Swenshuai.xi                     }
7990*53ee8cc1Swenshuai.xi                 }
7991*53ee8cc1Swenshuai.xi             }
7992*53ee8cc1Swenshuai.xi 
7993*53ee8cc1Swenshuai.xi             if (u8GOP==0)
7994*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP0);
7995*53ee8cc1Swenshuai.xi             else if (u8GOP==1)
7996*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP1);
7997*53ee8cc1Swenshuai.xi             else
7998*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP2);
7999*53ee8cc1Swenshuai.xi 
8000*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, TRUE);
8001*53ee8cc1Swenshuai.xi 
8002*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8003*53ee8cc1Swenshuai.xi             if (g_pGOPCtxLocal->pGopChipProperty->bOpInterlace == TRUE)
8004*53ee8cc1Swenshuai.xi             {
8005*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
8006*53ee8cc1Swenshuai.xi             }
8007*53ee8cc1Swenshuai.xi             else
8008*53ee8cc1Swenshuai.xi             {
8009*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
8010*53ee8cc1Swenshuai.xi             }
8011*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8012*53ee8cc1Swenshuai.xi             break;
8013*53ee8cc1Swenshuai.xi 
8014*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP1:
8015*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8016*53ee8cc1Swenshuai.xi             {
8017*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8018*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_OP1_MUX);
8019*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
8020*53ee8cc1Swenshuai.xi             }
8021*53ee8cc1Swenshuai.xi 
8022*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_SC1OP_SEL);
8023*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
8024*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, TRUE);
8025*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetVSyncinverse(g_pGOPCtxLocal,u8GOP, FALSE);
8026*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8027*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8028*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8029*53ee8cc1Swenshuai.xi             break;
8030*53ee8cc1Swenshuai.xi 
8031*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VOP:
8032*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8033*53ee8cc1Swenshuai.xi             {
8034*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8035*53ee8cc1Swenshuai.xi                 GOP_M_INFO("\n=============%s===============\n",__FUNCTION__);
8036*53ee8cc1Swenshuai.xi                 GOP_M_INFO("Set to New MVOP Mux GOP:%d\n",u8GOP);
8037*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_VOP0_MUX);
8038*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
8039*53ee8cc1Swenshuai.xi             }
8040*53ee8cc1Swenshuai.xi             else if (!_IsGopInMux0(pInstance,u8GOP))
8041*53ee8cc1Swenshuai.xi             {
8042*53ee8cc1Swenshuai.xi                  g_pGOPCtxLocal->IsChgMux= TRUE;
8043*53ee8cc1Swenshuai.xi                 /*save current mux setting*/
8044*53ee8cc1Swenshuai.xi                 for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
8045*53ee8cc1Swenshuai.xi                 {
8046*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
8047*53ee8cc1Swenshuai.xi                 }
8048*53ee8cc1Swenshuai.xi 
8049*53ee8cc1Swenshuai.xi                 /*force change input parameter u8GOP to mux0*/
8050*53ee8cc1Swenshuai.xi                 for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
8051*53ee8cc1Swenshuai.xi                 {
8052*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
8053*53ee8cc1Swenshuai.xi                     if (u8GOP == u8GetGOPNum)
8054*53ee8cc1Swenshuai.xi                     {
8055*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8Mux0GopNum, E_GOP_MUX0);
8056*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8Mux0GopNum, (Gop_MuxSel)i);
8057*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_MUX0);
8058*53ee8cc1Swenshuai.xi                         if( u8Mux0GopNum < _GOP_GetMaxGOPNum(pInstance))
8059*53ee8cc1Swenshuai.xi                             _GOP_InitHSPDByGOP(pInstance,u8Mux0GopNum);
8060*53ee8cc1Swenshuai.xi                         _GOP_InitHSPDByGOP(pInstance,u8GOP);
8061*53ee8cc1Swenshuai.xi                     }
8062*53ee8cc1Swenshuai.xi                 }
8063*53ee8cc1Swenshuai.xi             }
8064*53ee8cc1Swenshuai.xi 
8065*53ee8cc1Swenshuai.xi #if (FPGA_TEST)
8066*53ee8cc1Swenshuai.xi             GOP_SetOutputColor(pInstance,u8GOP,GOPOUT_RGB);
8067*53ee8cc1Swenshuai.xi #else
8068*53ee8cc1Swenshuai.xi             GOP_SetOutputColor(pInstance,u8GOP,GOPOUT_YUV);
8069*53ee8cc1Swenshuai.xi #endif
8070*53ee8cc1Swenshuai.xi 
8071*53ee8cc1Swenshuai.xi             if (u8GOP==0)
8072*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP0);
8073*53ee8cc1Swenshuai.xi             else if (u8GOP==1)
8074*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP1);
8075*53ee8cc1Swenshuai.xi             else
8076*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP2);
8077*53ee8cc1Swenshuai.xi 
8078*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_MVOP_SEL);
8079*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8080*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
8081*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8082*53ee8cc1Swenshuai.xi             break;
8083*53ee8cc1Swenshuai.xi 
8084*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VOP_SUB:
8085*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8086*53ee8cc1Swenshuai.xi             {
8087*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_VOP0_SUB_MUX);
8088*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
8089*53ee8cc1Swenshuai.xi             }
8090*53ee8cc1Swenshuai.xi 
8091*53ee8cc1Swenshuai.xi #if (FPGA_TEST)
8092*53ee8cc1Swenshuai.xi             GOP_SetOutputColor(pInstance,u8GOP,GOPOUT_RGB);
8093*53ee8cc1Swenshuai.xi #else
8094*53ee8cc1Swenshuai.xi             GOP_SetOutputColor(pInstance,u8GOP,GOPOUT_YUV);
8095*53ee8cc1Swenshuai.xi #endif
8096*53ee8cc1Swenshuai.xi             if (u8GOP==0)
8097*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP0);
8098*53ee8cc1Swenshuai.xi             else if (u8GOP==1)
8099*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP1);
8100*53ee8cc1Swenshuai.xi             else
8101*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP2);
8102*53ee8cc1Swenshuai.xi 
8103*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_SUBMVOP_SEL);
8104*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8105*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8106*53ee8cc1Swenshuai.xi             break;
8107*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP1:
8108*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8109*53ee8cc1Swenshuai.xi             {
8110*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8111*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_IP1_MUX);
8112*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
8113*53ee8cc1Swenshuai.xi             }
8114*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8115*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, FALSE);
8116*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_IP1_SEL);
8117*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPClk(g_pGOPCtxLocal,u8GOP,E_DRV_GOP_DST_IP1);
8118*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, TRUE);
8119*53ee8cc1Swenshuai.xi             break;
8120*53ee8cc1Swenshuai.xi 
8121*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_IP0_SUB:
8122*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8123*53ee8cc1Swenshuai.xi             {
8124*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8125*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_IP0_SUB_MUX);
8126*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
8127*53ee8cc1Swenshuai.xi             }
8128*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8129*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, FALSE);
8130*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_SUBIP0_SEL);
8131*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, TRUE);
8132*53ee8cc1Swenshuai.xi             break;
8133*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_DIP:
8134*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8135*53ee8cc1Swenshuai.xi             {
8136*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8137*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_DIP_MUX);
8138*53ee8cc1Swenshuai.xi                 _GOP_InitHSPDByGOP(pInstance,u8GOP);
8139*53ee8cc1Swenshuai.xi             }
8140*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8141*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP, FALSE);
8142*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_DIP_SEL);
8143*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8144*53ee8cc1Swenshuai.xi             break;
8145*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2OP:
8146*53ee8cc1Swenshuai.xi 
8147*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal->pGopChipProperty->bNewMux)
8148*53ee8cc1Swenshuai.xi             {
8149*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8150*53ee8cc1Swenshuai.xi                 if(!_IsGopInMux0To2(pInstance,(GOPTYPE.MIXER-1)))
8151*53ee8cc1Swenshuai.xi                 {
8152*53ee8cc1Swenshuai.xi                     OPMux = _GetNonUseOPMux(pInstance);
8153*53ee8cc1Swenshuai.xi                     if(OPMux != MAX_GOP_MUX_SUPPORT)
8154*53ee8cc1Swenshuai.xi                     {
8155*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, (GOPTYPE.MIXER-1), OPMux);
8156*53ee8cc1Swenshuai.xi                     }
8157*53ee8cc1Swenshuai.xi                     else
8158*53ee8cc1Swenshuai.xi                     {
8159*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, (GOPTYPE.MIXER-1), E_GOP_MUX2);
8160*53ee8cc1Swenshuai.xi                     }
8161*53ee8cc1Swenshuai.xi                 }
8162*53ee8cc1Swenshuai.xi             }
8163*53ee8cc1Swenshuai.xi             else
8164*53ee8cc1Swenshuai.xi             {
8165*53ee8cc1Swenshuai.xi 
8166*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->IsChgMux= TRUE;
8167*53ee8cc1Swenshuai.xi                 /*save current mux setting*/
8168*53ee8cc1Swenshuai.xi                 for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
8169*53ee8cc1Swenshuai.xi                 {
8170*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &g_pGOPCtxLocal->MS_MuxGop[i], (Gop_MuxSel)i);
8171*53ee8cc1Swenshuai.xi                     //printf("\n %s, before E_GOP_DST_MIXER2VE--->MS_MuxGop[%d]=%d\n",__FUNCTION__,i,u8GetGOPNum);
8172*53ee8cc1Swenshuai.xi                 }
8173*53ee8cc1Swenshuai.xi                 /*Set current mux to mixer.*/
8174*53ee8cc1Swenshuai.xi                 for (i=0; i<MAX_GOP_MUX_SUPPORT; i++)
8175*53ee8cc1Swenshuai.xi                 {
8176*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8GetGOPNum, (Gop_MuxSel)i);
8177*53ee8cc1Swenshuai.xi                     if (u8GOP == u8GetGOPNum)
8178*53ee8cc1Swenshuai.xi                     {
8179*53ee8cc1Swenshuai.xi                         //Set current GOP mux to mixer
8180*53ee8cc1Swenshuai.xi                         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, (GOPTYPE.MIXER-1), (Gop_MuxSel)i);
8181*53ee8cc1Swenshuai.xi                         break;
8182*53ee8cc1Swenshuai.xi                     }
8183*53ee8cc1Swenshuai.xi                 }
8184*53ee8cc1Swenshuai.xi 
8185*53ee8cc1Swenshuai.xi             }
8186*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, (GOPTYPE.MIXER-1), TRUE); //To find the mux which is mixer, open SC blending
8187*53ee8cc1Swenshuai.xi             //MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8188*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, TRUE);
8189*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, DRV_GOPOUT_YUV);
8190*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP,TRUE);
8191*53ee8cc1Swenshuai.xi 
8192*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetMixerDstPlane(g_pGOPCtxLocal,u8GOP,GopDst);
8193*53ee8cc1Swenshuai.xi             //MDrv_GOP_GWIN_SetHSPipe(g_pGOPCtxLocal, u8GOP, 0);
8194*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8195*53ee8cc1Swenshuai.xi             (MDrv_GOP_MIXER_SetGOPEnable2Mixer(g_pGOPCtxLocal, u8GOP, TRUE));
8196*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8197*53ee8cc1Swenshuai.xi             break;
8198*53ee8cc1Swenshuai.xi 
8199*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_MIXER2OP1:
8200*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, (GOPTYPE.MIXER-1), E_GOP_OP1_MUX);
8201*53ee8cc1Swenshuai.xi             MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_SC1OP_SEL);
8202*53ee8cc1Swenshuai.xi             //MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, GOPTYPE.MIXER, TRUE); //To find the mux which is mixer, open SC blending
8203*53ee8cc1Swenshuai.xi             //MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8204*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
8205*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP, DRV_GOPOUT_YUV);
8206*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal, u8GOP,TRUE);
8207*53ee8cc1Swenshuai.xi 
8208*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetMixerDstPlane(g_pGOPCtxLocal,u8GOP,GopDst);
8209*53ee8cc1Swenshuai.xi             //MDrv_GOP_GWIN_SetHSPipe(g_pGOPCtxLocal, u8GOP, 0);
8210*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8211*53ee8cc1Swenshuai.xi             (MDrv_GOP_MIXER_SetGOPEnable2Mixer(g_pGOPCtxLocal, u8GOP, TRUE));
8212*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8213*53ee8cc1Swenshuai.xi             break;
8214*53ee8cc1Swenshuai.xi 
8215*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_FRC:
8216*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8217*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP); //require update registers at the end of this function after dwin capture in OP
8218*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
8219*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8220*53ee8cc1Swenshuai.xi             break;
8221*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_VE:
8222*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8223*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_EnableProgressive(g_pGOPCtxLocal, u8GOP, FALSE);
8224*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_OutputColor(g_pGOPCtxLocal,u8GOP,DRV_GOPOUT_YUV);
8225*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetAlphaInverse(g_pGOPCtxLocal,u8GOP,FALSE);
8226*53ee8cc1Swenshuai.xi 
8227*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPClk(g_pGOPCtxLocal,u8GOP,E_DRV_GOP_DST_VE);
8228*53ee8cc1Swenshuai.xi 
8229*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetVSyncinverse(g_pGOPCtxLocal,u8GOP, TRUE);
8230*53ee8cc1Swenshuai.xi             //MDrv_GOP_Mask_First_Hsync(g_pGOPCtxLocal,u8GOP, TRUE );
8231*53ee8cc1Swenshuai.xi             if(!(g_pGOPCtxLocal->sGOPConfig.eGopIgnoreInit & E_GOP_BOOTLOGO_IGNORE_VEOSDEN))
8232*53ee8cc1Swenshuai.xi             {
8233*53ee8cc1Swenshuai.xi                 (MDrv_GOP_Set_VE_MUX(g_pGOPCtxLocal, u8GOP, TRUE));
8234*53ee8cc1Swenshuai.xi             }
8235*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8236*53ee8cc1Swenshuai.xi             break;
8237*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_GOPScaling:
8238*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
8239*53ee8cc1Swenshuai.xi             if((g_pGOPCtxLocal->pGopChipProperty->bNewMux) && (!_IsGopInMux0To2(pInstance,u8GOP)))
8240*53ee8cc1Swenshuai.xi             {
8241*53ee8cc1Swenshuai.xi                 //_CleanGopMux(u8GOP);
8242*53ee8cc1Swenshuai.xi                 OPMux = _GetNonUseOPMux(pInstance);
8243*53ee8cc1Swenshuai.xi                 if(OPMux != MAX_GOP_MUX_SUPPORT)
8244*53ee8cc1Swenshuai.xi                 {
8245*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, OPMux);
8246*53ee8cc1Swenshuai.xi                 }
8247*53ee8cc1Swenshuai.xi                 else
8248*53ee8cc1Swenshuai.xi                 {
8249*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_MUX2);
8250*53ee8cc1Swenshuai.xi                 }
8251*53ee8cc1Swenshuai.xi             }
8252*53ee8cc1Swenshuai.xi 
8253*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_GS_MUX);
8254*53ee8cc1Swenshuai.xi 
8255*53ee8cc1Swenshuai.xi             if (u8GOP==0)
8256*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP0);
8257*53ee8cc1Swenshuai.xi             else if (u8GOP==1)
8258*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP1);
8259*53ee8cc1Swenshuai.xi             else
8260*53ee8cc1Swenshuai.xi                 MDrv_GOP_SetIPSel2SC(g_pGOPCtxLocal, MS_DRV_NIP_SEL_GOP2);
8261*53ee8cc1Swenshuai.xi 
8262*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, TRUE);
8263*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8264*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8265*53ee8cc1Swenshuai.xi             break;
8266*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_BYPASS:
8267*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
8268*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8269*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, E_GOP_BYPASS_MUX0);
8270*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8271*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8272*53ee8cc1Swenshuai.xi             break;
8273*53ee8cc1Swenshuai.xi 
8274*53ee8cc1Swenshuai.xi         case E_DRV_GOP_DST_OP_DUAL_RATE:
8275*53ee8cc1Swenshuai.xi             _GOP_SetOCCapability(pInstance,u8GOP, GopDst);
8276*53ee8cc1Swenshuai.xi             _GOP_InitHSPDByGOP(pInstance,u8GOP);
8277*53ee8cc1Swenshuai.xi             if((!_IsGopInDualOPMux(pInstance,u8GOP)))
8278*53ee8cc1Swenshuai.xi             {
8279*53ee8cc1Swenshuai.xi                 OPMux = _GetNonUseDualOPMux(pInstance);
8280*53ee8cc1Swenshuai.xi                 if(OPMux != MAX_GOP_MUX_SUPPORT)
8281*53ee8cc1Swenshuai.xi                 {
8282*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, u8GOP, OPMux);
8283*53ee8cc1Swenshuai.xi                 }
8284*53ee8cc1Swenshuai.xi             }
8285*53ee8cc1Swenshuai.xi             MDrv_GOP_SetGOPEnable2SC(g_pGOPCtxLocal, u8GOP, FALSE);
8286*53ee8cc1Swenshuai.xi             MDrv_GOP_SelfFirstHs(g_pGOPCtxLocal, u8GOP, FALSE);
8287*53ee8cc1Swenshuai.xi             break;
8288*53ee8cc1Swenshuai.xi 
8289*53ee8cc1Swenshuai.xi         default:
8290*53ee8cc1Swenshuai.xi             MS_ASSERT(0);
8291*53ee8cc1Swenshuai.xi             return GOP_API_ENUM_NOT_SUPPORTED;
8292*53ee8cc1Swenshuai.xi     }
8293*53ee8cc1Swenshuai.xi 
8294*53ee8cc1Swenshuai.xi     (MDrv_GOP_SetGOPClk(g_pGOPCtxLocal, u8GOP, GopDst));
8295*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal, u8GOP);
8296*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8297*53ee8cc1Swenshuai.xi }
8298*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetDst(void * pInstance,MS_U32 gop,MS_U32 * pDst)8299*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetDst(void* pInstance,MS_U32 gop, MS_U32* pDst)
8300*53ee8cc1Swenshuai.xi {
8301*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8302*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8303*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8304*53ee8cc1Swenshuai.xi #endif
8305*53ee8cc1Swenshuai.xi 
8306*53ee8cc1Swenshuai.xi     DRV_GOPDstType enDst = E_DRV_GOP_DST_INVALID;
8307*53ee8cc1Swenshuai.xi 
8308*53ee8cc1Swenshuai.xi     (MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, gop, &enDst));
8309*53ee8cc1Swenshuai.xi     _GOP_Map_DRVDst2API_Enum_(pInstance,(EN_GOP_DST_TYPE *)pDst, enDst);
8310*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8311*53ee8cc1Swenshuai.xi 
8312*53ee8cc1Swenshuai.xi }
8313*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetMux(void * pInstance,PGOP_SETMUX pGopMuxConfig,MS_U32 u32SizeOfMuxInfo)8314*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetMux(void* pInstance,PGOP_SETMUX pGopMuxConfig, MS_U32 u32SizeOfMuxInfo)
8315*53ee8cc1Swenshuai.xi {
8316*53ee8cc1Swenshuai.xi     MS_U8 i;
8317*53ee8cc1Swenshuai.xi     Gop_MuxSel EnGOPMux;
8318*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8319*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8320*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8321*53ee8cc1Swenshuai.xi #endif
8322*53ee8cc1Swenshuai.xi 
8323*53ee8cc1Swenshuai.xi     if(u32SizeOfMuxInfo != sizeof(GOP_SETMUX) || (pGopMuxConfig == NULL))
8324*53ee8cc1Swenshuai.xi     {
8325*53ee8cc1Swenshuai.xi         GOP_M_ERR("\nthe GOP_MuxConfig is NULL or struct mismatch in drivr\n");
8326*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
8327*53ee8cc1Swenshuai.xi     }
8328*53ee8cc1Swenshuai.xi     GOP_M_INFO("---%s %d: PID[%td], TID[%td] MuxCount=%tu\n", __FUNCTION__, __LINE__, (ptrdiff_t)getpid(), (ptrdiff_t)MsOS_GetOSThreadID(), (ptrdiff_t)pGopMuxConfig->MuxCount);
8329*53ee8cc1Swenshuai.xi 
8330*53ee8cc1Swenshuai.xi #if 0
8331*53ee8cc1Swenshuai.xi     for(i=0; i<pGopMuxConfig->u8MuxCounts; i++)
8332*53ee8cc1Swenshuai.xi     {
8333*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, pGopMuxConfig->GopMux[i].u8GopIndex, (Gop_MuxSel) pGopMuxConfig->GopMux[i].u8MuxIndex);
8334*53ee8cc1Swenshuai.xi     }
8335*53ee8cc1Swenshuai.xi 
8336*53ee8cc1Swenshuai.xi #endif
8337*53ee8cc1Swenshuai.xi 
8338*53ee8cc1Swenshuai.xi     for(i=0; i<pGopMuxConfig->MuxCount; i++)
8339*53ee8cc1Swenshuai.xi     {
8340*53ee8cc1Swenshuai.xi         _GOP_MAP_MUX_Enum(pInstance,(EN_Gop_MuxSel)pGopMuxConfig->mux[i], &EnGOPMux);
8341*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, pGopMuxConfig->gop[i], EnGOPMux);
8342*53ee8cc1Swenshuai.xi     }
8343*53ee8cc1Swenshuai.xi 
8344*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8345*53ee8cc1Swenshuai.xi 
8346*53ee8cc1Swenshuai.xi }
8347*53ee8cc1Swenshuai.xi 
8348*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetMirror(void * pInstance,MS_U32 gop,EN_GOP_MIRROR_TYPE mirror)8349*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetMirror(void* pInstance,MS_U32 gop, EN_GOP_MIRROR_TYPE mirror)
8350*53ee8cc1Swenshuai.xi {
8351*53ee8cc1Swenshuai.xi     // To do: to modify and control each gop mirror setting.
8352*53ee8cc1Swenshuai.xi     switch(mirror)
8353*53ee8cc1Swenshuai.xi     {
8354*53ee8cc1Swenshuai.xi         case E_GOP_MIRROR_NONE:
8355*53ee8cc1Swenshuai.xi         default:
8356*53ee8cc1Swenshuai.xi         {
8357*53ee8cc1Swenshuai.xi             GOP_GWIN_SetHMirror(pInstance,FALSE);
8358*53ee8cc1Swenshuai.xi             GOP_GWIN_SetVMirror(pInstance,FALSE);
8359*53ee8cc1Swenshuai.xi             break;
8360*53ee8cc1Swenshuai.xi         }
8361*53ee8cc1Swenshuai.xi         case E_GOP_MIRROR_H_ONLY:
8362*53ee8cc1Swenshuai.xi         {
8363*53ee8cc1Swenshuai.xi             GOP_GWIN_SetHMirror(pInstance,TRUE);
8364*53ee8cc1Swenshuai.xi             //GOP_GWIN_SetVMirror(pInstance,FALSE);
8365*53ee8cc1Swenshuai.xi             break;
8366*53ee8cc1Swenshuai.xi         }
8367*53ee8cc1Swenshuai.xi         case E_GOP_MIRROR_H_NONE:
8368*53ee8cc1Swenshuai.xi         {
8369*53ee8cc1Swenshuai.xi             GOP_GWIN_SetHMirror(pInstance,FALSE);
8370*53ee8cc1Swenshuai.xi             break;
8371*53ee8cc1Swenshuai.xi         }
8372*53ee8cc1Swenshuai.xi         case E_GOP_MIRROR_V_ONLY:
8373*53ee8cc1Swenshuai.xi         {
8374*53ee8cc1Swenshuai.xi             //GOP_GWIN_SetHMirror(pInstance,FALSE);
8375*53ee8cc1Swenshuai.xi             GOP_GWIN_SetVMirror(pInstance,TRUE);
8376*53ee8cc1Swenshuai.xi             break;
8377*53ee8cc1Swenshuai.xi         }
8378*53ee8cc1Swenshuai.xi         case E_GOP_MIRROR_V_NONE:
8379*53ee8cc1Swenshuai.xi         {
8380*53ee8cc1Swenshuai.xi             GOP_GWIN_SetVMirror(pInstance,FALSE);
8381*53ee8cc1Swenshuai.xi             break;
8382*53ee8cc1Swenshuai.xi         }
8383*53ee8cc1Swenshuai.xi         case E_GOP_MIRROR_HV:
8384*53ee8cc1Swenshuai.xi         {
8385*53ee8cc1Swenshuai.xi             GOP_GWIN_SetHMirror(pInstance,TRUE);
8386*53ee8cc1Swenshuai.xi             GOP_GWIN_SetVMirror(pInstance,TRUE);
8387*53ee8cc1Swenshuai.xi             break;
8388*53ee8cc1Swenshuai.xi         }
8389*53ee8cc1Swenshuai.xi 
8390*53ee8cc1Swenshuai.xi     }
8391*53ee8cc1Swenshuai.xi 
8392*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8393*53ee8cc1Swenshuai.xi }
8394*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetMirror(void * pInstance,MS_U32 gop,EN_GOP_MIRROR_TYPE * mirror)8395*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetMirror(void* pInstance,MS_U32 gop, EN_GOP_MIRROR_TYPE* mirror)
8396*53ee8cc1Swenshuai.xi {
8397*53ee8cc1Swenshuai.xi     MS_BOOL bHMirror;
8398*53ee8cc1Swenshuai.xi     MS_BOOL bVMirror;
8399*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8400*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8401*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8402*53ee8cc1Swenshuai.xi #endif
8403*53ee8cc1Swenshuai.xi     //need refine
8404*53ee8cc1Swenshuai.xi     bHMirror = g_pGOPCtxLocal->pGOPCtxShared->bHMirror;
8405*53ee8cc1Swenshuai.xi     bVMirror = g_pGOPCtxLocal->pGOPCtxShared->bVMirror;
8406*53ee8cc1Swenshuai.xi 
8407*53ee8cc1Swenshuai.xi     if((bHMirror == TRUE)&&(bVMirror == TRUE))
8408*53ee8cc1Swenshuai.xi     {
8409*53ee8cc1Swenshuai.xi         *mirror = E_GOP_MIRROR_HV;
8410*53ee8cc1Swenshuai.xi     }
8411*53ee8cc1Swenshuai.xi     else if((bHMirror == TRUE)&&(bVMirror == FALSE))
8412*53ee8cc1Swenshuai.xi     {
8413*53ee8cc1Swenshuai.xi         *mirror = E_GOP_MIRROR_H_ONLY;
8414*53ee8cc1Swenshuai.xi     }
8415*53ee8cc1Swenshuai.xi     else if((bHMirror == FALSE)&&(bVMirror == TRUE))
8416*53ee8cc1Swenshuai.xi     {
8417*53ee8cc1Swenshuai.xi         *mirror = E_GOP_MIRROR_V_ONLY;
8418*53ee8cc1Swenshuai.xi     }
8419*53ee8cc1Swenshuai.xi     else
8420*53ee8cc1Swenshuai.xi     {
8421*53ee8cc1Swenshuai.xi         *mirror = E_GOP_MIRROR_NONE;
8422*53ee8cc1Swenshuai.xi     }
8423*53ee8cc1Swenshuai.xi 
8424*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8425*53ee8cc1Swenshuai.xi }
8426*53ee8cc1Swenshuai.xi 
8427*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetStatus(void * pInstance,EN_GOP_STATUS type,MS_U32 * pStatus,MS_U32 u32Size)8428*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetStatus(void* pInstance,EN_GOP_STATUS type, MS_U32* pStatus, MS_U32 u32Size)
8429*53ee8cc1Swenshuai.xi {
8430*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8431*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8432*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8433*53ee8cc1Swenshuai.xi #endif
8434*53ee8cc1Swenshuai.xi 
8435*53ee8cc1Swenshuai.xi     if(pStatus == NULL)
8436*53ee8cc1Swenshuai.xi     {
8437*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d] ERROR - Input null pointer on type:%d\n",__FUNCTION__,__LINE__,type);
8438*53ee8cc1Swenshuai.xi         return GOP_API_INVALID_PARAMETERS;
8439*53ee8cc1Swenshuai.xi     }
8440*53ee8cc1Swenshuai.xi 
8441*53ee8cc1Swenshuai.xi     switch(type)
8442*53ee8cc1Swenshuai.xi     {
8443*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_INIT:
8444*53ee8cc1Swenshuai.xi         {
8445*53ee8cc1Swenshuai.xi             PGOP_INIT_STATUS ptr = (PGOP_INIT_STATUS)pStatus;
8446*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_INIT_STATUS))
8447*53ee8cc1Swenshuai.xi             {
8448*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8449*53ee8cc1Swenshuai.xi             }
8450*53ee8cc1Swenshuai.xi             ptr->bInit = g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[ptr->gop_idx];
8451*53ee8cc1Swenshuai.xi 
8452*53ee8cc1Swenshuai.xi             break;
8453*53ee8cc1Swenshuai.xi         }
8454*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_GOP_MAXNUM:
8455*53ee8cc1Swenshuai.xi         {
8456*53ee8cc1Swenshuai.xi             MS_U8 *pMaxGopNum = (MS_U8 *) pStatus;
8457*53ee8cc1Swenshuai.xi             *pMaxGopNum = MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal);
8458*53ee8cc1Swenshuai.xi             break;
8459*53ee8cc1Swenshuai.xi         }
8460*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_GWIN_MAXNUM:
8461*53ee8cc1Swenshuai.xi         {
8462*53ee8cc1Swenshuai.xi             PGOP_GWIN_NUM ptr = (PGOP_GWIN_NUM)pStatus;
8463*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_GWIN_NUM))
8464*53ee8cc1Swenshuai.xi             {
8465*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s] Error (%d)\n",__FUNCTION__,__LINE__);
8466*53ee8cc1Swenshuai.xi                 return (GOP_API_INVALID_PARAMETERS);
8467*53ee8cc1Swenshuai.xi             }
8468*53ee8cc1Swenshuai.xi             if(ptr->gop_idx > MDrv_GOP_GetMaxGOPNum(g_pGOPCtxLocal))
8469*53ee8cc1Swenshuai.xi             {
8470*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s] Error (%d)\n",__FUNCTION__,__LINE__);
8471*53ee8cc1Swenshuai.xi                 return (GOP_API_INVALID_PARAMETERS);
8472*53ee8cc1Swenshuai.xi             }
8473*53ee8cc1Swenshuai.xi 
8474*53ee8cc1Swenshuai.xi             ptr->gwin_num = MDrv_GOP_GetGwinNum(g_pGOPCtxLocal,ptr->gop_idx);
8475*53ee8cc1Swenshuai.xi             break;
8476*53ee8cc1Swenshuai.xi         }
8477*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_GWIN_TOTALNUM:
8478*53ee8cc1Swenshuai.xi         {
8479*53ee8cc1Swenshuai.xi             MS_U8 *pGwinNum = (MS_U8 *) pStatus;
8480*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
8481*53ee8cc1Swenshuai.xi             {
8482*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s] Error (%d)\n",__FUNCTION__,__LINE__);
8483*53ee8cc1Swenshuai.xi                 return (GOP_API_INVALID_PARAMETERS);
8484*53ee8cc1Swenshuai.xi             }
8485*53ee8cc1Swenshuai.xi             *pGwinNum = (MS_U8)g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum;
8486*53ee8cc1Swenshuai.xi             break;
8487*53ee8cc1Swenshuai.xi 
8488*53ee8cc1Swenshuai.xi         }
8489*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_VERSION:
8490*53ee8cc1Swenshuai.xi         {
8491*53ee8cc1Swenshuai.xi             break;
8492*53ee8cc1Swenshuai.xi         }
8493*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_MUX:
8494*53ee8cc1Swenshuai.xi         {
8495*53ee8cc1Swenshuai.xi 
8496*53ee8cc1Swenshuai.xi             break;
8497*53ee8cc1Swenshuai.xi         }
8498*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_CURRENT_GOP:
8499*53ee8cc1Swenshuai.xi         {
8500*53ee8cc1Swenshuai.xi             MS_U32* pCurrentGop = (MS_U32*)pStatus;
8501*53ee8cc1Swenshuai.xi             *pCurrentGop = GOP_GetCurrentGOP(pInstance);
8502*53ee8cc1Swenshuai.xi             break;
8503*53ee8cc1Swenshuai.xi         }
8504*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_CURRENT_GWIN:
8505*53ee8cc1Swenshuai.xi         {
8506*53ee8cc1Swenshuai.xi             MS_U32* pCurrentGwin = (MS_U32*)pStatus;
8507*53ee8cc1Swenshuai.xi             *pCurrentGwin = GOP_GetCurrentGWin(pInstance);
8508*53ee8cc1Swenshuai.xi             break;
8509*53ee8cc1Swenshuai.xi         }
8510*53ee8cc1Swenshuai.xi         case E_GOP_STATUS_CURRENT_FBID:
8511*53ee8cc1Swenshuai.xi         {
8512*53ee8cc1Swenshuai.xi             MS_U32* pCurrentFbid = (MS_U32*)pStatus;
8513*53ee8cc1Swenshuai.xi             *pCurrentFbid = GOP_GetCurrentFBID(pInstance);
8514*53ee8cc1Swenshuai.xi             break;
8515*53ee8cc1Swenshuai.xi         }
8516*53ee8cc1Swenshuai.xi         default:
8517*53ee8cc1Swenshuai.xi         {
8518*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s] invalid input case:%d\n",__FUNCTION__, type);
8519*53ee8cc1Swenshuai.xi         }
8520*53ee8cc1Swenshuai.xi 
8521*53ee8cc1Swenshuai.xi     }
8522*53ee8cc1Swenshuai.xi 
8523*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8524*53ee8cc1Swenshuai.xi 
8525*53ee8cc1Swenshuai.xi }
8526*53ee8cc1Swenshuai.xi 
8527*53ee8cc1Swenshuai.xi 
8528*53ee8cc1Swenshuai.xi 
8529*53ee8cc1Swenshuai.xi 
8530*53ee8cc1Swenshuai.xi //******************************************************************************
8531*53ee8cc1Swenshuai.xi /// API for Test Pattern Type Select
8532*53ee8cc1Swenshuai.xi /// @param eTstPatternType \b IN: Test Pattern Type
8533*53ee8cc1Swenshuai.xi /// @param MS_U32 u32ARGB  \b IN: ARGB Color
8534*53ee8cc1Swenshuai.xi /// @return GOP_API_SUCCESS - Success
8535*53ee8cc1Swenshuai.xi /// @return GOP_API_FAIL - Failure
8536*53ee8cc1Swenshuai.xi //******************************************************************************
Ioctl_GOP_TestPattern(void * pInstance,EN_GOP_TST_PATTERN eTstPatternType,MS_U32 u32ARGB)8537*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_TestPattern(void* pInstance,EN_GOP_TST_PATTERN eTstPatternType, MS_U32 u32ARGB)
8538*53ee8cc1Swenshuai.xi {
8539*53ee8cc1Swenshuai.xi     DRV_GOP_TSTPATTERN drv_TstPattern;
8540*53ee8cc1Swenshuai.xi     EN_GOP_TST_PATTERN eCurTPMode;
8541*53ee8cc1Swenshuai.xi     MS_U8 u8CurGOP = 0;
8542*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8543*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8544*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8545*53ee8cc1Swenshuai.xi #endif
8546*53ee8cc1Swenshuai.xi 
8547*53ee8cc1Swenshuai.xi 
8548*53ee8cc1Swenshuai.xi     u8CurGOP = MDrv_GOP_Get(g_pGOPCtxLocal);
8549*53ee8cc1Swenshuai.xi 
8550*53ee8cc1Swenshuai.xi     if( MDrv_GOP_TestPattern_IsVaild(g_pGOPCtxLocal) != GOP_SUCCESS)
8551*53ee8cc1Swenshuai.xi     {
8552*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
8553*53ee8cc1Swenshuai.xi     }
8554*53ee8cc1Swenshuai.xi 
8555*53ee8cc1Swenshuai.xi     //Back up
8556*53ee8cc1Swenshuai.xi     eCurTPMode = (EN_GOP_TST_PATTERN)g_pGOPCtxLocal->pGOPCtxShared->GOP_TestPatternMode;
8557*53ee8cc1Swenshuai.xi     if(eCurTPMode == E_GOP_TP_DISABLE)
8558*53ee8cc1Swenshuai.xi     {
8559*53ee8cc1Swenshuai.xi         GOP_M_INFO("[%s (%d)] cur:%d input mode:%d GOPBK Read\n",__FUNCTION__,__LINE__,eCurTPMode, eTstPatternType);
8560*53ee8cc1Swenshuai.xi         MDrv_GOP_BNK(g_pGOPCtxLocal, E_DRV_GOP_BNK_READ);
8561*53ee8cc1Swenshuai.xi     }
8562*53ee8cc1Swenshuai.xi 
8563*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->GOP_TestPatternMode = eTstPatternType;
8564*53ee8cc1Swenshuai.xi 
8565*53ee8cc1Swenshuai.xi     memset(&drv_TstPattern, 0, sizeof(DRV_GOP_TSTPATTERN));
8566*53ee8cc1Swenshuai.xi 
8567*53ee8cc1Swenshuai.xi     switch(eTstPatternType)
8568*53ee8cc1Swenshuai.xi     {
8569*53ee8cc1Swenshuai.xi         case E_GOP_TP_DISABLE:
8570*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En = 0;
8571*53ee8cc1Swenshuai.xi             GOP_M_INFO("[%s (%d)] cur:%d input mode:%d GOPBK write\n",__FUNCTION__,__LINE__,eCurTPMode, eTstPatternType);
8572*53ee8cc1Swenshuai.xi             MDrv_GOP_BNK(g_pGOPCtxLocal, E_DRV_GOP_BNK_WRITE);
8573*53ee8cc1Swenshuai.xi             return GOP_API_SUCCESS;
8574*53ee8cc1Swenshuai.xi             break;
8575*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY16:
8576*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En = 1;
8577*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc= 256/(16-1);
8578*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=1;
8579*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step= (g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP]  /16);
8580*53ee8cc1Swenshuai.xi             break;
8581*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY16_INVERSE:
8582*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8583*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = 0xFF;
8584*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = 0xFF;
8585*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = 0xFF;
8586*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(16-1);
8587*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=0;
8588*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /16);
8589*53ee8cc1Swenshuai.xi             break;
8590*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY32:
8591*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8592*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(32-1);
8593*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=1;
8594*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /32)-1;
8595*53ee8cc1Swenshuai.xi             break;
8596*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY32_INVERSE:
8597*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8598*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = 0xFF;
8599*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = 0xFF;
8600*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = 0xFF;
8601*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(32-1);
8602*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=0;
8603*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /32)-1;
8604*53ee8cc1Swenshuai.xi             break;
8605*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY64:
8606*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8607*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(64-1);
8608*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=1;
8609*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /64);
8610*53ee8cc1Swenshuai.xi             break;
8611*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY64_INVERSE:
8612*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8613*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = 0xFF;
8614*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = 0xFF;
8615*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = 0xFF;
8616*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(64-1);
8617*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=0;
8618*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /64);
8619*53ee8cc1Swenshuai.xi             break;
8620*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY256:
8621*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8622*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(256-1);
8623*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=1;
8624*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /256);
8625*53ee8cc1Swenshuai.xi             break;
8626*53ee8cc1Swenshuai.xi         case E_GOP_TP_GRAY256_INVERSE:
8627*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8628*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = 0xFF;
8629*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = 0xFF;
8630*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = 0xFF;
8631*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=256/(256-1);
8632*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=0;
8633*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=drv_TstPattern.u8HG_step=drv_TstPattern.u8HB_step=(g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /256);
8634*53ee8cc1Swenshuai.xi             break;
8635*53ee8cc1Swenshuai.xi         case E_GOP_TP_BLACK:
8636*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8637*53ee8cc1Swenshuai.xi             break;
8638*53ee8cc1Swenshuai.xi         case E_GOP_TP_WHITE:
8639*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8640*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = 0xFF;
8641*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = 0xFF;
8642*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = 0xFF;
8643*53ee8cc1Swenshuai.xi             break;
8644*53ee8cc1Swenshuai.xi         case E_GOP_TP_CLR:
8645*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8646*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = u32ARGB>>16;
8647*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = u32ARGB>>8;
8648*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = u32ARGB;
8649*53ee8cc1Swenshuai.xi             break;
8650*53ee8cc1Swenshuai.xi         case E_GOP_TP_BW_DOT:
8651*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8652*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=127;
8653*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VR_inc=drv_TstPattern.u8VG_inc=drv_TstPattern.u8VB_inc=127;
8654*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step=0x1;
8655*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HG_step=0x1;
8656*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HB_step=0x1;
8657*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VR_step=0x1;
8658*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VG_step=0x1;
8659*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VB_step=0x1;
8660*53ee8cc1Swenshuai.xi             break;
8661*53ee8cc1Swenshuai.xi         case E_GOP_TP_BW_CROSS:
8662*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8663*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=0xFF;
8664*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VR_inc=drv_TstPattern.u8VG_inc=drv_TstPattern.u8VB_inc=0xFF;
8665*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step = drv_TstPattern.u8HG_step = drv_TstPattern.u8HB_step = 128*g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /1920-1;
8666*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VR_step = drv_TstPattern.u8VG_step = drv_TstPattern.u8VB_step = 128*g_pGOPCtxLocal->pGOPCtxShared->u16PnlHeight[u8CurGOP] /1080-1;
8667*53ee8cc1Swenshuai.xi             break;
8668*53ee8cc1Swenshuai.xi         case E_GOP_TP_BW_LINE:
8669*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8670*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=127;
8671*53ee8cc1Swenshuai.xi             drv_TstPattern.u8VR_inc=drv_TstPattern.u8VG_inc=drv_TstPattern.u8VB_inc=0;
8672*53ee8cc1Swenshuai.xi             break;
8673*53ee8cc1Swenshuai.xi         case E_GOP_TP_CLR_BAR:
8674*53ee8cc1Swenshuai.xi             drv_TstPattern.u8R_stc = 0xFF;
8675*53ee8cc1Swenshuai.xi             drv_TstPattern.u8G_stc = 0xFF;
8676*53ee8cc1Swenshuai.xi             drv_TstPattern.u8B_stc = 0xFF;
8677*53ee8cc1Swenshuai.xi             break;
8678*53ee8cc1Swenshuai.xi         case E_GOP_TP_CLR_BAR_INVERSE:
8679*53ee8cc1Swenshuai.xi             drv_TstPattern.bTSTClr_En=1;
8680*53ee8cc1Swenshuai.xi             drv_TstPattern.u8TSTClr_Hdup=3;
8681*53ee8cc1Swenshuai.xi             drv_TstPattern.u8TSTClr_Vdup=0;
8682*53ee8cc1Swenshuai.xi 
8683*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc=drv_TstPattern.u8HG_inc=drv_TstPattern.u8HB_inc=255;
8684*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_inc_signz=drv_TstPattern.u8HG_inc_signz=drv_TstPattern.u8HB_inc_signz=1;
8685*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HB_step = 60*g_pGOPCtxLocal->pGOPCtxShared->u16PnlWidth[u8CurGOP] /1920;
8686*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HR_step = (drv_TstPattern.u8HB_step << 1) + 1;
8687*53ee8cc1Swenshuai.xi             drv_TstPattern.u8HG_step = (drv_TstPattern.u8HR_step << 1) + 1;
8688*53ee8cc1Swenshuai.xi             break;
8689*53ee8cc1Swenshuai.xi         default:
8690*53ee8cc1Swenshuai.xi             return GOP_API_ENUM_NOT_SUPPORTED;
8691*53ee8cc1Swenshuai.xi             break;
8692*53ee8cc1Swenshuai.xi     }
8693*53ee8cc1Swenshuai.xi 
8694*53ee8cc1Swenshuai.xi     drv_TstPattern.u8TSTClr_Alpha = u32ARGB>>24;
8695*53ee8cc1Swenshuai.xi 
8696*53ee8cc1Swenshuai.xi     _GOP_TestPattern(pInstance,&drv_TstPattern);
8697*53ee8cc1Swenshuai.xi 
8698*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8699*53ee8cc1Swenshuai.xi 
8700*53ee8cc1Swenshuai.xi }
8701*53ee8cc1Swenshuai.xi 
8702*53ee8cc1Swenshuai.xi 
8703*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Set_Stretch(void * pInstance,EN_GOP_STRETCH_TYPE enStretchType,MS_U32 gop,PGOP_STRETCH_INFO pStretchInfo)8704*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Set_Stretch(void* pInstance,EN_GOP_STRETCH_TYPE enStretchType,MS_U32 gop ,PGOP_STRETCH_INFO pStretchInfo)
8705*53ee8cc1Swenshuai.xi {
8706*53ee8cc1Swenshuai.xi     MS_BOOL bEn = FALSE;
8707*53ee8cc1Swenshuai.xi     DRV_GOPDstType enGopDst = E_DRV_GOP_DST_INVALID;
8708*53ee8cc1Swenshuai.xi     EN_GOP_DST_TYPE enApiGopDst = MAX_GOP_DST_SUPPORT;
8709*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8710*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8711*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8712*53ee8cc1Swenshuai.xi #endif
8713*53ee8cc1Swenshuai.xi 
8714*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal,gop, &enGopDst);
8715*53ee8cc1Swenshuai.xi 
8716*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_WIN)
8717*53ee8cc1Swenshuai.xi     {
8718*53ee8cc1Swenshuai.xi         _GOP_Map_DRVDst2API_Enum_(pInstance,&enApiGopDst, enGopDst);
8719*53ee8cc1Swenshuai.xi         GOP_SetStretchWin(pInstance, gop, enApiGopDst, pStretchInfo->SrcRect.x, pStretchInfo->SrcRect.y,pStretchInfo->SrcRect.w,pStretchInfo->SrcRect.h);
8720*53ee8cc1Swenshuai.xi     }
8721*53ee8cc1Swenshuai.xi 
8722*53ee8cc1Swenshuai.xi     if (enStretchType & E_GOP_STRETCH_WIN_POSITION)
8723*53ee8cc1Swenshuai.xi     {
8724*53ee8cc1Swenshuai.xi         GOP_SetStretchWinPosition(pInstance,gop, pStretchInfo->SrcRect.x, pStretchInfo->SrcRect.y);
8725*53ee8cc1Swenshuai.xi     }
8726*53ee8cc1Swenshuai.xi 
8727*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_HSCALE)
8728*53ee8cc1Swenshuai.xi     {
8729*53ee8cc1Swenshuai.xi         if(pStretchInfo->SrcRect.w != pStretchInfo->DstRect.w)
8730*53ee8cc1Swenshuai.xi         {
8731*53ee8cc1Swenshuai.xi             bEn = TRUE;
8732*53ee8cc1Swenshuai.xi         }
8733*53ee8cc1Swenshuai.xi         GOP_Set_Hscale(pInstance,gop,bEn,pStretchInfo->SrcRect.w,pStretchInfo->DstRect.w);
8734*53ee8cc1Swenshuai.xi     }
8735*53ee8cc1Swenshuai.xi 
8736*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_VSCALE)
8737*53ee8cc1Swenshuai.xi     {
8738*53ee8cc1Swenshuai.xi         if(pStretchInfo->SrcRect.h != pStretchInfo->DstRect.h)
8739*53ee8cc1Swenshuai.xi         {
8740*53ee8cc1Swenshuai.xi             bEn = TRUE;
8741*53ee8cc1Swenshuai.xi         }
8742*53ee8cc1Swenshuai.xi         GOP_Set_Vscale(pInstance,gop,bEn,pStretchInfo->SrcRect.h,pStretchInfo->DstRect.h);
8743*53ee8cc1Swenshuai.xi     }
8744*53ee8cc1Swenshuai.xi 
8745*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_HSTRETCH_MODE)
8746*53ee8cc1Swenshuai.xi     {
8747*53ee8cc1Swenshuai.xi         GOP_GWIN_Set_HStretchMode(pInstance,gop,pStretchInfo->enHMode);
8748*53ee8cc1Swenshuai.xi     }
8749*53ee8cc1Swenshuai.xi 
8750*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_VSTRETCH_MODE)
8751*53ee8cc1Swenshuai.xi     {
8752*53ee8cc1Swenshuai.xi         GOP_GWIN_Set_VStretchMode(pInstance,gop,pStretchInfo->enVMode);
8753*53ee8cc1Swenshuai.xi     }
8754*53ee8cc1Swenshuai.xi 
8755*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_TRANSPCOLOR_MODE)
8756*53ee8cc1Swenshuai.xi     {
8757*53ee8cc1Swenshuai.xi         GOP_GWIN_Set_TranspColorStretchMode(pInstance,gop,pStretchInfo->enTColorMode);
8758*53ee8cc1Swenshuai.xi     }
8759*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8760*53ee8cc1Swenshuai.xi }
8761*53ee8cc1Swenshuai.xi 
8762*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Get_Stretch(void * pInstance,EN_GOP_STRETCH_TYPE enStretchType,MS_U32 gop,PGOP_STRETCH_INFO pStretchInfo)8763*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Get_Stretch(void* pInstance,EN_GOP_STRETCH_TYPE enStretchType,MS_U32 gop ,PGOP_STRETCH_INFO pStretchInfo)
8764*53ee8cc1Swenshuai.xi {
8765*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8766*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8767*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8768*53ee8cc1Swenshuai.xi #endif
8769*53ee8cc1Swenshuai.xi 
8770*53ee8cc1Swenshuai.xi     if(enStretchType & E_GOP_STRETCH_WIN)
8771*53ee8cc1Swenshuai.xi     {
8772*53ee8cc1Swenshuai.xi         MS_U16 x,y,w,h;
8773*53ee8cc1Swenshuai.xi 
8774*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_Get_StretchWin(g_pGOPCtxLocal, gop, &x, &y, &w, &h);
8775*53ee8cc1Swenshuai.xi         pStretchInfo->SrcRect.x = (MS_U32)x;
8776*53ee8cc1Swenshuai.xi         pStretchInfo->SrcRect.y = (MS_U32)y;
8777*53ee8cc1Swenshuai.xi         pStretchInfo->SrcRect.w = (MS_U32)w;
8778*53ee8cc1Swenshuai.xi         pStretchInfo->SrcRect.h = (MS_U32)h;
8779*53ee8cc1Swenshuai.xi     }
8780*53ee8cc1Swenshuai.xi 
8781*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8782*53ee8cc1Swenshuai.xi }
8783*53ee8cc1Swenshuai.xi 
8784*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GWin_SetProperty(void * pInstance,EN_GOP_GWIN_PROPERTY type,MS_U32 gwin,MS_U32 * pSet,MS_U32 u32Size)8785*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GWin_SetProperty(void* pInstance,EN_GOP_GWIN_PROPERTY type,MS_U32 gwin, MS_U32* pSet, MS_U32 u32Size)
8786*53ee8cc1Swenshuai.xi {
8787*53ee8cc1Swenshuai.xi     switch(type)
8788*53ee8cc1Swenshuai.xi     {
8789*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_BLENDING:
8790*53ee8cc1Swenshuai.xi         {
8791*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
8792*53ee8cc1Swenshuai.xi             PGOP_GWIN_BLENDING pInfo = (PGOP_GWIN_BLENDING)pSet;
8793*53ee8cc1Swenshuai.xi 
8794*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_GWIN_BLENDING))
8795*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8796*53ee8cc1Swenshuai.xi 
8797*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
8798*53ee8cc1Swenshuai.xi 
8799*53ee8cc1Swenshuai.xi             GOP_GWIN_SetBlending(pInstance,gwin,pInfo->bEn, pInfo->Coef);
8800*53ee8cc1Swenshuai.xi 
8801*53ee8cc1Swenshuai.xi             break;
8802*53ee8cc1Swenshuai.xi         }
8803*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_NEWAPLHA:
8804*53ee8cc1Swenshuai.xi         {
8805*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
8806*53ee8cc1Swenshuai.xi 
8807*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
8808*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8809*53ee8cc1Swenshuai.xi 
8810*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
8811*53ee8cc1Swenshuai.xi 
8812*53ee8cc1Swenshuai.xi             GOP_GWIN_SetNewAlphaMode(pInstance,gwin,bEn);
8813*53ee8cc1Swenshuai.xi             break;
8814*53ee8cc1Swenshuai.xi         }
8815*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_ENABLE:
8816*53ee8cc1Swenshuai.xi         {
8817*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
8818*53ee8cc1Swenshuai.xi 
8819*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
8820*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8821*53ee8cc1Swenshuai.xi 
8822*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
8823*53ee8cc1Swenshuai.xi 
8824*53ee8cc1Swenshuai.xi             GOP_GWIN_SetEnable(pInstance,gwin,bEn);
8825*53ee8cc1Swenshuai.xi 
8826*53ee8cc1Swenshuai.xi             break;
8827*53ee8cc1Swenshuai.xi         }
8828*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_BLINK:
8829*53ee8cc1Swenshuai.xi         {
8830*53ee8cc1Swenshuai.xi             PGOP_GWIN_BLINK pRate = (PGOP_GWIN_BLINK)pSet;
8831*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_GWIN_BLINK))
8832*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8833*53ee8cc1Swenshuai.xi 
8834*53ee8cc1Swenshuai.xi             GOP_GWIN_SetBlink(pInstance,pRate->bEn,gwin, pRate->rate);
8835*53ee8cc1Swenshuai.xi             break;
8836*53ee8cc1Swenshuai.xi         }
8837*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_SHARE:
8838*53ee8cc1Swenshuai.xi         {
8839*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
8840*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
8841*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8842*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
8843*53ee8cc1Swenshuai.xi             GOP_GWIN_SetGWinShared(pInstance,gwin, bEn);
8844*53ee8cc1Swenshuai.xi             break;
8845*53ee8cc1Swenshuai.xi         }
8846*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_SHARE_CNT:
8847*53ee8cc1Swenshuai.xi         {
8848*53ee8cc1Swenshuai.xi             MS_U16 u16SharedCnt;
8849*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U16))
8850*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8851*53ee8cc1Swenshuai.xi             u16SharedCnt = (MS_U16)*pSet;
8852*53ee8cc1Swenshuai.xi             GOP_GWIN_SetGWinSharedCnt(pInstance,gwin, u16SharedCnt);
8853*53ee8cc1Swenshuai.xi             break;
8854*53ee8cc1Swenshuai.xi         }
8855*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_SWITCH_2_GWIN:
8856*53ee8cc1Swenshuai.xi         {
8857*53ee8cc1Swenshuai.xi             GOP_GWIN_Switch2Gwin(pInstance,gwin,(void*)pSet);
8858*53ee8cc1Swenshuai.xi             break;
8859*53ee8cc1Swenshuai.xi         }
8860*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_3D_MODE:
8861*53ee8cc1Swenshuai.xi         {
8862*53ee8cc1Swenshuai.xi             GOP_GWIN_3D_MODE *pst3DMode = (GOP_GWIN_3D_MODE *)pSet;
8863*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_GWIN_3D_MODE))
8864*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8865*53ee8cc1Swenshuai.xi             GOP_Set3DOSDMode(pInstance,gwin,(MS_U16)pst3DMode->u32MainFBId,(MS_U16)pst3DMode->u32SubFBId,pst3DMode->en3DMode);
8866*53ee8cc1Swenshuai.xi             break;
8867*53ee8cc1Swenshuai.xi         }
8868*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_EXIST:
8869*53ee8cc1Swenshuai.xi         {
8870*53ee8cc1Swenshuai.xi             break;
8871*53ee8cc1Swenshuai.xi         }
8872*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_FREE_ID:
8873*53ee8cc1Swenshuai.xi         {
8874*53ee8cc1Swenshuai.xi             break;
8875*53ee8cc1Swenshuai.xi         }
8876*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_GET_FB:
8877*53ee8cc1Swenshuai.xi         {
8878*53ee8cc1Swenshuai.xi             break;
8879*53ee8cc1Swenshuai.xi         }
8880*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_GET_GOP:
8881*53ee8cc1Swenshuai.xi         {
8882*53ee8cc1Swenshuai.xi             break;
8883*53ee8cc1Swenshuai.xi         }
8884*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_GPUTILE:
8885*53ee8cc1Swenshuai.xi         {
8886*53ee8cc1Swenshuai.xi             EN_GOP_GPU_TILE_MODE tilemode;
8887*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_GPU_TILE_MODE))
8888*53ee8cc1Swenshuai.xi             {
8889*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8890*53ee8cc1Swenshuai.xi             }
8891*53ee8cc1Swenshuai.xi             tilemode = (EN_GOP_GPU_TILE_MODE)*pSet;
8892*53ee8cc1Swenshuai.xi             GOP_GWIN_SetGPUtileMode(pInstance,gwin,tilemode);
8893*53ee8cc1Swenshuai.xi             break;
8894*53ee8cc1Swenshuai.xi         }
8895*53ee8cc1Swenshuai.xi     }
8896*53ee8cc1Swenshuai.xi 
8897*53ee8cc1Swenshuai.xi 
8898*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
8899*53ee8cc1Swenshuai.xi 
8900*53ee8cc1Swenshuai.xi }
8901*53ee8cc1Swenshuai.xi 
8902*53ee8cc1Swenshuai.xi 
8903*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GWin_GetProperty(void * pInstance,EN_GOP_GWIN_PROPERTY type,MS_U32 gwin,MS_U32 * pSet,MS_U32 u32Size)8904*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GWin_GetProperty(void* pInstance,EN_GOP_GWIN_PROPERTY type,MS_U32 gwin, MS_U32* pSet, MS_U32 u32Size)
8905*53ee8cc1Swenshuai.xi {
8906*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
8907*53ee8cc1Swenshuai.xi         GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
8908*53ee8cc1Swenshuai.xi         UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
8909*53ee8cc1Swenshuai.xi #endif
8910*53ee8cc1Swenshuai.xi     switch(type)
8911*53ee8cc1Swenshuai.xi     {
8912*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_BLENDING:
8913*53ee8cc1Swenshuai.xi         {
8914*53ee8cc1Swenshuai.xi             break;
8915*53ee8cc1Swenshuai.xi         }
8916*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_NEWAPLHA:
8917*53ee8cc1Swenshuai.xi         {
8918*53ee8cc1Swenshuai.xi             MS_BOOL bEn=FALSE;
8919*53ee8cc1Swenshuai.xi 
8920*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
8921*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8922*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_GetGwinNewAlphaModeEnable(g_pGOPCtxLocal, gwin, &bEn);
8923*53ee8cc1Swenshuai.xi             *pSet = bEn;
8924*53ee8cc1Swenshuai.xi 
8925*53ee8cc1Swenshuai.xi             break;
8926*53ee8cc1Swenshuai.xi         }
8927*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_ENABLE:
8928*53ee8cc1Swenshuai.xi         {
8929*53ee8cc1Swenshuai.xi             MS_BOOL *pbEn = (MS_BOOL*)pSet;
8930*53ee8cc1Swenshuai.xi 
8931*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
8932*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8933*53ee8cc1Swenshuai.xi 
8934*53ee8cc1Swenshuai.xi             *pbEn = GOP_GWIN_IsEnable(pInstance,gwin);
8935*53ee8cc1Swenshuai.xi 
8936*53ee8cc1Swenshuai.xi             break;
8937*53ee8cc1Swenshuai.xi         }
8938*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_BLINK:
8939*53ee8cc1Swenshuai.xi         {
8940*53ee8cc1Swenshuai.xi             break;
8941*53ee8cc1Swenshuai.xi         }
8942*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_SHARE:
8943*53ee8cc1Swenshuai.xi         {
8944*53ee8cc1Swenshuai.xi             break;
8945*53ee8cc1Swenshuai.xi         }
8946*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_SHARE_CNT:
8947*53ee8cc1Swenshuai.xi         {
8948*53ee8cc1Swenshuai.xi             break;
8949*53ee8cc1Swenshuai.xi         }
8950*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_SWITCH_2_GWIN:
8951*53ee8cc1Swenshuai.xi         {
8952*53ee8cc1Swenshuai.xi             break;
8953*53ee8cc1Swenshuai.xi         }
8954*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_3D_MODE:
8955*53ee8cc1Swenshuai.xi         {
8956*53ee8cc1Swenshuai.xi             break;
8957*53ee8cc1Swenshuai.xi         }
8958*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_EXIST:
8959*53ee8cc1Swenshuai.xi         {
8960*53ee8cc1Swenshuai.xi             MS_U8 *pExist = (MS_U8*)pSet;
8961*53ee8cc1Swenshuai.xi 
8962*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
8963*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8964*53ee8cc1Swenshuai.xi 
8965*53ee8cc1Swenshuai.xi             *pExist = (MS_U8)GOP_GWIN_IsGwinExist(pInstance,gwin);
8966*53ee8cc1Swenshuai.xi             break;
8967*53ee8cc1Swenshuai.xi         }
8968*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_FREE_ID:
8969*53ee8cc1Swenshuai.xi         {
8970*53ee8cc1Swenshuai.xi             MS_U8 *pFreeId = (MS_U8*)pSet;
8971*53ee8cc1Swenshuai.xi 
8972*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
8973*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8974*53ee8cc1Swenshuai.xi             *pFreeId = (MS_U8)GOP_GWIN_GetFreeWinID(pInstance);
8975*53ee8cc1Swenshuai.xi             break;
8976*53ee8cc1Swenshuai.xi         }
8977*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_GET_FB:
8978*53ee8cc1Swenshuai.xi         {
8979*53ee8cc1Swenshuai.xi             MS_U32 *pFbId = (MS_U32*)pSet;
8980*53ee8cc1Swenshuai.xi 
8981*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
8982*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8983*53ee8cc1Swenshuai.xi 
8984*53ee8cc1Swenshuai.xi             *pFbId = GOP_GWIN_GetFBfromGWIN(pInstance,gwin);
8985*53ee8cc1Swenshuai.xi             break;
8986*53ee8cc1Swenshuai.xi         }
8987*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_GET_GOP:
8988*53ee8cc1Swenshuai.xi         {
8989*53ee8cc1Swenshuai.xi             MS_U32 *pGOP = (MS_U32*)pSet;
8990*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
8991*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
8992*53ee8cc1Swenshuai.xi 
8993*53ee8cc1Swenshuai.xi             *pGOP = (MS_U32)MDrv_DumpGopByGwinId(g_pGOPCtxLocal,gwin);
8994*53ee8cc1Swenshuai.xi             break;
8995*53ee8cc1Swenshuai.xi         }
8996*53ee8cc1Swenshuai.xi         case E_GOP_GWIN_GPUTILE:
8997*53ee8cc1Swenshuai.xi         {
8998*53ee8cc1Swenshuai.xi             break;
8999*53ee8cc1Swenshuai.xi         }
9000*53ee8cc1Swenshuai.xi     }
9001*53ee8cc1Swenshuai.xi 
9002*53ee8cc1Swenshuai.xi 
9003*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9004*53ee8cc1Swenshuai.xi 
9005*53ee8cc1Swenshuai.xi }
9006*53ee8cc1Swenshuai.xi 
Ioctl_GOP_FB_SetProperty(void * pInstance,EN_GOP_FB_PROPERTY type,MS_U32 FBId,MS_U32 * pSet,MS_U32 u32Size)9007*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_FB_SetProperty(void* pInstance,EN_GOP_FB_PROPERTY type,MS_U32 FBId, MS_U32* pSet, MS_U32 u32Size)
9008*53ee8cc1Swenshuai.xi {
9009*53ee8cc1Swenshuai.xi     switch(type)
9010*53ee8cc1Swenshuai.xi     {
9011*53ee8cc1Swenshuai.xi         case E_GOP_FB_POOLID:
9012*53ee8cc1Swenshuai.xi         {
9013*53ee8cc1Swenshuai.xi             MS_U8 *pPool = (MS_U8*)pSet;
9014*53ee8cc1Swenshuai.xi 
9015*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
9016*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9017*53ee8cc1Swenshuai.xi 
9018*53ee8cc1Swenshuai.xi             GOP_FB_SEL(pInstance,*pPool);
9019*53ee8cc1Swenshuai.xi             break;
9020*53ee8cc1Swenshuai.xi         }
9021*53ee8cc1Swenshuai.xi         case E_GOP_FB_EXIST:
9022*53ee8cc1Swenshuai.xi         {
9023*53ee8cc1Swenshuai.xi             break;
9024*53ee8cc1Swenshuai.xi         }
9025*53ee8cc1Swenshuai.xi         case E_GOP_FB_OBTAIN:
9026*53ee8cc1Swenshuai.xi         {
9027*53ee8cc1Swenshuai.xi             break;
9028*53ee8cc1Swenshuai.xi         }
9029*53ee8cc1Swenshuai.xi     }
9030*53ee8cc1Swenshuai.xi 
9031*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9032*53ee8cc1Swenshuai.xi }
9033*53ee8cc1Swenshuai.xi 
Ioctl_GOP_FB_GetProperty(void * pInstance,EN_GOP_FB_PROPERTY type,MS_U32 FBId,MS_U32 * pSet,MS_U32 u32Size)9034*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_FB_GetProperty(void* pInstance,EN_GOP_FB_PROPERTY type,MS_U32 FBId, MS_U32* pSet, MS_U32 u32Size)
9035*53ee8cc1Swenshuai.xi {
9036*53ee8cc1Swenshuai.xi     switch(type)
9037*53ee8cc1Swenshuai.xi     {
9038*53ee8cc1Swenshuai.xi         case E_GOP_FB_POOLID:
9039*53ee8cc1Swenshuai.xi         {
9040*53ee8cc1Swenshuai.xi             MS_U8 *pPool = (MS_U8*)pSet;
9041*53ee8cc1Swenshuai.xi 
9042*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
9043*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9044*53ee8cc1Swenshuai.xi 
9045*53ee8cc1Swenshuai.xi             *pPool = (MS_U8)GOP_FB_Get(pInstance);
9046*53ee8cc1Swenshuai.xi             break;
9047*53ee8cc1Swenshuai.xi         }
9048*53ee8cc1Swenshuai.xi 
9049*53ee8cc1Swenshuai.xi         case E_GOP_FB_EXIST:
9050*53ee8cc1Swenshuai.xi         {
9051*53ee8cc1Swenshuai.xi             MS_U8 *pExist = (MS_U8*)pSet;
9052*53ee8cc1Swenshuai.xi 
9053*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
9054*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9055*53ee8cc1Swenshuai.xi             *pExist = (MS_U8)GOP_GWIN_Is32FBExist(pInstance,FBId);
9056*53ee8cc1Swenshuai.xi             break;
9057*53ee8cc1Swenshuai.xi         }
9058*53ee8cc1Swenshuai.xi         case E_GOP_FB_OBTAIN:
9059*53ee8cc1Swenshuai.xi         {
9060*53ee8cc1Swenshuai.xi             MS_U32 *pFreeFbID = (MS_U32*)pSet;
9061*53ee8cc1Swenshuai.xi 
9062*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
9063*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9064*53ee8cc1Swenshuai.xi             *pFreeFbID = (MS_U32)GOP_GWIN_GetFreeFbID(pInstance);
9065*53ee8cc1Swenshuai.xi             break;
9066*53ee8cc1Swenshuai.xi         }
9067*53ee8cc1Swenshuai.xi     }
9068*53ee8cc1Swenshuai.xi 
9069*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9070*53ee8cc1Swenshuai.xi }
9071*53ee8cc1Swenshuai.xi 
Ioctl_GOP_DWIN_SetProperty(void * pInstance,EN_GOP_DWIN_PROPERTY type,MS_U32 * pSet,MS_U32 u32Size)9072*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_DWIN_SetProperty(void* pInstance,EN_GOP_DWIN_PROPERTY type,MS_U32* pSet, MS_U32 u32Size)
9073*53ee8cc1Swenshuai.xi {
9074*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9075*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9076*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9077*53ee8cc1Swenshuai.xi #endif
9078*53ee8cc1Swenshuai.xi 
9079*53ee8cc1Swenshuai.xi     switch(type)
9080*53ee8cc1Swenshuai.xi     {
9081*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_R2Y:
9082*53ee8cc1Swenshuai.xi         {
9083*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
9084*53ee8cc1Swenshuai.xi 
9085*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
9086*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9087*53ee8cc1Swenshuai.xi 
9088*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
9089*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_EnableR2YCSC(g_pGOPCtxLocal, bEn);
9090*53ee8cc1Swenshuai.xi             break;
9091*53ee8cc1Swenshuai.xi         }
9092*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_UV_SWAP:
9093*53ee8cc1Swenshuai.xi         {
9094*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
9095*53ee8cc1Swenshuai.xi 
9096*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
9097*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9098*53ee8cc1Swenshuai.xi 
9099*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
9100*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SetUVSwap(g_pGOPCtxLocal, bEn);
9101*53ee8cc1Swenshuai.xi             break;
9102*53ee8cc1Swenshuai.xi         }
9103*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_UV_SAMPLE:
9104*53ee8cc1Swenshuai.xi         {
9105*53ee8cc1Swenshuai.xi             EN_GOP_DWIN_UVSAMPLE_Mode enMode;
9106*53ee8cc1Swenshuai.xi 
9107*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_DWIN_UVSAMPLE_Mode))
9108*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9109*53ee8cc1Swenshuai.xi 
9110*53ee8cc1Swenshuai.xi             enMode = (EN_GOP_DWIN_UVSAMPLE_Mode)*pSet;
9111*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SetUVSample(g_pGOPCtxLocal, (MS_U8)enMode);
9112*53ee8cc1Swenshuai.xi             break;
9113*53ee8cc1Swenshuai.xi         }
9114*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_SOURCE_SCAN_TYPE:
9115*53ee8cc1Swenshuai.xi         {
9116*53ee8cc1Swenshuai.xi             EN_GOP_DWIN_SCAN_MODE enMode;
9117*53ee8cc1Swenshuai.xi 
9118*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_DWIN_SCAN_MODE))
9119*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9120*53ee8cc1Swenshuai.xi 
9121*53ee8cc1Swenshuai.xi             enMode = (EN_GOP_DWIN_SCAN_MODE)*pSet;
9122*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SelectSourceScanType(g_pGOPCtxLocal,(EN_GOP_DWIN_SCAN_TYPE)enMode);
9123*53ee8cc1Swenshuai.xi             break;
9124*53ee8cc1Swenshuai.xi         }
9125*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_ALPHA_VALUE:
9126*53ee8cc1Swenshuai.xi         {
9127*53ee8cc1Swenshuai.xi             MS_U8 u8Value;
9128*53ee8cc1Swenshuai.xi 
9129*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
9130*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9131*53ee8cc1Swenshuai.xi 
9132*53ee8cc1Swenshuai.xi             u8Value = (MS_U8)*pSet;
9133*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SetAlphaValue(g_pGOPCtxLocal, u8Value);
9134*53ee8cc1Swenshuai.xi             break;
9135*53ee8cc1Swenshuai.xi         }
9136*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_ALPHA_SOURCE:
9137*53ee8cc1Swenshuai.xi         {
9138*53ee8cc1Swenshuai.xi             EN_GOP_DWIN_ALPHA_SRC enSource;
9139*53ee8cc1Swenshuai.xi 
9140*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(EN_GOP_DWIN_ALPHA_SRC))
9141*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9142*53ee8cc1Swenshuai.xi 
9143*53ee8cc1Swenshuai.xi             enSource = (EN_GOP_DWIN_ALPHA_SRC)*pSet;
9144*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SetAlphaSrc(g_pGOPCtxLocal, (MS_U8)enSource);
9145*53ee8cc1Swenshuai.xi             break;
9146*53ee8cc1Swenshuai.xi         }
9147*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_ALPHA_INVERSE:
9148*53ee8cc1Swenshuai.xi         {
9149*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
9150*53ee8cc1Swenshuai.xi 
9151*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
9152*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9153*53ee8cc1Swenshuai.xi 
9154*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
9155*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SetAlphaInverse(g_pGOPCtxLocal, bEn);
9156*53ee8cc1Swenshuai.xi             break;
9157*53ee8cc1Swenshuai.xi         }
9158*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_SKIP_FRAME:
9159*53ee8cc1Swenshuai.xi         {
9160*53ee8cc1Swenshuai.xi             MS_U32 u32Count;
9161*53ee8cc1Swenshuai.xi 
9162*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
9163*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9164*53ee8cc1Swenshuai.xi 
9165*53ee8cc1Swenshuai.xi             u32Count = (MS_U32)*pSet;
9166*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_SetSkipFrame(g_pGOPCtxLocal, u32Count);
9167*53ee8cc1Swenshuai.xi             break;
9168*53ee8cc1Swenshuai.xi         }
9169*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_PINPON:
9170*53ee8cc1Swenshuai.xi         {
9171*53ee8cc1Swenshuai.xi             PGOP_PINPON_INFO pPinpon = (PGOP_PINPON_INFO)pSet;
9172*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_PINPON_INFO))
9173*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9174*53ee8cc1Swenshuai.xi             MDrv_GOP_Set_BufferPINPON(g_pGOPCtxLocal,pPinpon->u64Addr0,pPinpon->u64Addr1);
9175*53ee8cc1Swenshuai.xi             break;
9176*53ee8cc1Swenshuai.xi         }
9177*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_INTERRUP_INFO:
9178*53ee8cc1Swenshuai.xi         {
9179*53ee8cc1Swenshuai.xi             break;
9180*53ee8cc1Swenshuai.xi         }
9181*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_CAPTURE_INFO:
9182*53ee8cc1Swenshuai.xi         {
9183*53ee8cc1Swenshuai.xi             break;
9184*53ee8cc1Swenshuai.xi         }
9185*53ee8cc1Swenshuai.xi     }
9186*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9187*53ee8cc1Swenshuai.xi }
Ioctl_GOP_DWIN_GetProperty(void * pInstance,EN_GOP_DWIN_PROPERTY type,MS_U32 * pSet,MS_U32 u32Size)9188*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_DWIN_GetProperty(void* pInstance,EN_GOP_DWIN_PROPERTY type,MS_U32* pSet, MS_U32 u32Size)
9189*53ee8cc1Swenshuai.xi {
9190*53ee8cc1Swenshuai.xi     switch(type)
9191*53ee8cc1Swenshuai.xi     {
9192*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_R2Y:
9193*53ee8cc1Swenshuai.xi         {
9194*53ee8cc1Swenshuai.xi             break;
9195*53ee8cc1Swenshuai.xi         }
9196*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_UV_SWAP:
9197*53ee8cc1Swenshuai.xi         {
9198*53ee8cc1Swenshuai.xi             break;
9199*53ee8cc1Swenshuai.xi         }
9200*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_UV_SAMPLE:
9201*53ee8cc1Swenshuai.xi         {
9202*53ee8cc1Swenshuai.xi             break;
9203*53ee8cc1Swenshuai.xi         }
9204*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_SOURCE_SCAN_TYPE:
9205*53ee8cc1Swenshuai.xi         {
9206*53ee8cc1Swenshuai.xi             break;
9207*53ee8cc1Swenshuai.xi         }
9208*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_ALPHA_VALUE:
9209*53ee8cc1Swenshuai.xi         {
9210*53ee8cc1Swenshuai.xi             break;
9211*53ee8cc1Swenshuai.xi         }
9212*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_ALPHA_SOURCE:
9213*53ee8cc1Swenshuai.xi         {
9214*53ee8cc1Swenshuai.xi             break;
9215*53ee8cc1Swenshuai.xi         }
9216*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_ALPHA_INVERSE:
9217*53ee8cc1Swenshuai.xi         {
9218*53ee8cc1Swenshuai.xi             break;
9219*53ee8cc1Swenshuai.xi         }
9220*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_SKIP_FRAME:
9221*53ee8cc1Swenshuai.xi         {
9222*53ee8cc1Swenshuai.xi             break;
9223*53ee8cc1Swenshuai.xi         }
9224*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_PINPON:
9225*53ee8cc1Swenshuai.xi         {
9226*53ee8cc1Swenshuai.xi             break;
9227*53ee8cc1Swenshuai.xi         }
9228*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_INTERRUP_INFO:
9229*53ee8cc1Swenshuai.xi         {
9230*53ee8cc1Swenshuai.xi             break;
9231*53ee8cc1Swenshuai.xi         }
9232*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_CAPTURE_INFO:
9233*53ee8cc1Swenshuai.xi         {
9234*53ee8cc1Swenshuai.xi             break;
9235*53ee8cc1Swenshuai.xi         }
9236*53ee8cc1Swenshuai.xi 
9237*53ee8cc1Swenshuai.xi     }
9238*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9239*53ee8cc1Swenshuai.xi }
9240*53ee8cc1Swenshuai.xi 
Ioctl_GOP_MIXER_SetProperty(void * pInstance,EN_GOP_MIXER_PROPERTY type,MS_U32 * pSet,MS_U32 u32Size)9241*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_MIXER_SetProperty(void* pInstance,EN_GOP_MIXER_PROPERTY type,MS_U32* pSet, MS_U32 u32Size)
9242*53ee8cc1Swenshuai.xi {
9243*53ee8cc1Swenshuai.xi     switch(type)
9244*53ee8cc1Swenshuai.xi     {
9245*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_OUTPUT_TIMING:
9246*53ee8cc1Swenshuai.xi         {
9247*53ee8cc1Swenshuai.xi             PGOP_MIXER_TIMING_INFO pMTInfo = (PGOP_MIXER_TIMING_INFO )pSet;
9248*53ee8cc1Swenshuai.xi 
9249*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_MIXER_TIMING_INFO))
9250*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9251*53ee8cc1Swenshuai.xi             GOP_MIXER_SetOutputTiming(pInstance,pMTInfo->mode,&(pMTInfo->pMT));
9252*53ee8cc1Swenshuai.xi             break;
9253*53ee8cc1Swenshuai.xi         }
9254*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_TO_OP_OUTPUT_TIMING:
9255*53ee8cc1Swenshuai.xi         {
9256*53ee8cc1Swenshuai.xi             GOP_Mixer2OPTiming *pMT = (GOP_Mixer2OPTiming *)pSet;
9257*53ee8cc1Swenshuai.xi 
9258*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_Mixer2OPTiming))
9259*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9260*53ee8cc1Swenshuai.xi             GOP_MIXER_SetMIXER2OPOutputTiming(pInstance,pMT);
9261*53ee8cc1Swenshuai.xi             break;
9262*53ee8cc1Swenshuai.xi         }
9263*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_V_FILTER:
9264*53ee8cc1Swenshuai.xi         {
9265*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
9266*53ee8cc1Swenshuai.xi 
9267*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
9268*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9269*53ee8cc1Swenshuai.xi 
9270*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
9271*53ee8cc1Swenshuai.xi             GOP_MIXER_EnableVfilter(pInstance,bEn);
9272*53ee8cc1Swenshuai.xi             break;
9273*53ee8cc1Swenshuai.xi         }
9274*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_OLD_BLENDING_MODE:
9275*53ee8cc1Swenshuai.xi         {
9276*53ee8cc1Swenshuai.xi             GOP_MixerOldBlendingMode* pMOBM;
9277*53ee8cc1Swenshuai.xi 
9278*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_MixerOldBlendingMode))
9279*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9280*53ee8cc1Swenshuai.xi 
9281*53ee8cc1Swenshuai.xi             pMOBM = (GOP_MixerOldBlendingMode*)pSet;
9282*53ee8cc1Swenshuai.xi             GOP_MIXER_EnableOldBlendingMode(pInstance, pMOBM->u8GOP, pMOBM->bEnable);
9283*53ee8cc1Swenshuai.xi             break;
9284*53ee8cc1Swenshuai.xi         }
9285*53ee8cc1Swenshuai.xi     }
9286*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9287*53ee8cc1Swenshuai.xi }
9288*53ee8cc1Swenshuai.xi 
Ioctl_GOP_MIXER_GetProperty(void * pInstance,EN_GOP_MIXER_PROPERTY type,MS_U32 * pSet,MS_U32 u32Size)9289*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_MIXER_GetProperty(void* pInstance,EN_GOP_MIXER_PROPERTY type,MS_U32* pSet, MS_U32 u32Size)
9290*53ee8cc1Swenshuai.xi {
9291*53ee8cc1Swenshuai.xi     switch(type)
9292*53ee8cc1Swenshuai.xi     {
9293*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_OUTPUT_TIMING:
9294*53ee8cc1Swenshuai.xi         {
9295*53ee8cc1Swenshuai.xi             break;
9296*53ee8cc1Swenshuai.xi         }
9297*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_TO_OP_OUTPUT_TIMING:
9298*53ee8cc1Swenshuai.xi         {
9299*53ee8cc1Swenshuai.xi             break;
9300*53ee8cc1Swenshuai.xi         }
9301*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_V_FILTER:
9302*53ee8cc1Swenshuai.xi         {
9303*53ee8cc1Swenshuai.xi             break;
9304*53ee8cc1Swenshuai.xi         }
9305*53ee8cc1Swenshuai.xi         case E_GOP_MIXER_OLD_BLENDING_MODE:
9306*53ee8cc1Swenshuai.xi         {
9307*53ee8cc1Swenshuai.xi             break;
9308*53ee8cc1Swenshuai.xi         }
9309*53ee8cc1Swenshuai.xi     }
9310*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9311*53ee8cc1Swenshuai.xi }
9312*53ee8cc1Swenshuai.xi 
Ioctl_GOP_VE_SetProperty(void * pInstance,EN_GOP_VE_PROPERTY type,MS_U32 * pSet,MS_U32 u32Size)9313*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_VE_SetProperty(void* pInstance,EN_GOP_VE_PROPERTY type,MS_U32* pSet, MS_U32 u32Size)
9314*53ee8cc1Swenshuai.xi {
9315*53ee8cc1Swenshuai.xi     switch(type)
9316*53ee8cc1Swenshuai.xi     {
9317*53ee8cc1Swenshuai.xi         case E_GOP_VE_OUTPUT_TIMING:
9318*53ee8cc1Swenshuai.xi         {
9319*53ee8cc1Swenshuai.xi             PGOP_VE_TIMING_INFO pVEInfo = (PGOP_VE_TIMING_INFO )pSet;
9320*53ee8cc1Swenshuai.xi 
9321*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_VE_TIMING_INFO))
9322*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9323*53ee8cc1Swenshuai.xi             GOP_VE_SetOutputTiming(pInstance, pVEInfo->mode);
9324*53ee8cc1Swenshuai.xi             break;
9325*53ee8cc1Swenshuai.xi         }
9326*53ee8cc1Swenshuai.xi     }
9327*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9328*53ee8cc1Swenshuai.xi }
9329*53ee8cc1Swenshuai.xi 
Ioctl_GOP_MapFB2Win(void * pInstance,MS_U32 fbid,MS_U32 gwin)9330*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_MapFB2Win(void* pInstance,MS_U32 fbid, MS_U32 gwin)
9331*53ee8cc1Swenshuai.xi {
9332*53ee8cc1Swenshuai.xi     E_GOP_API_Result eRet=GOP_API_FAIL;
9333*53ee8cc1Swenshuai.xi 
9334*53ee8cc1Swenshuai.xi     eRet = GOP_MapFB2Win(pInstance,fbid,gwin);
9335*53ee8cc1Swenshuai.xi     return eRet;
9336*53ee8cc1Swenshuai.xi }
9337*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Dwin_Capture(void * pInstance,PGOP_CAPTURE_INFO pinfo)9338*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Dwin_Capture(void* pInstance,PGOP_CAPTURE_INFO pinfo)
9339*53ee8cc1Swenshuai.xi {
9340*53ee8cc1Swenshuai.xi     DRV_GOP_DWIN_INFO  DwinInfo;
9341*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9342*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9343*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9344*53ee8cc1Swenshuai.xi #endif
9345*53ee8cc1Swenshuai.xi 
9346*53ee8cc1Swenshuai.xi     memset(&DwinInfo,0, sizeof(DRV_GOP_DWIN_INFO));
9347*53ee8cc1Swenshuai.xi 
9348*53ee8cc1Swenshuai.xi     DwinInfo.u16HPixelStart = pinfo->rect.x;
9349*53ee8cc1Swenshuai.xi     DwinInfo.u16HPixelEnd   = pinfo->rect.x + pinfo->rect.w;
9350*53ee8cc1Swenshuai.xi     DwinInfo.u16VPixelStart = pinfo->rect.y;
9351*53ee8cc1Swenshuai.xi     DwinInfo.u16VPixelEnd   = pinfo->rect.y + pinfo->rect.h;
9352*53ee8cc1Swenshuai.xi 
9353*53ee8cc1Swenshuai.xi     DwinInfo.u64TFDRAMAddr = pinfo->addr[0];
9354*53ee8cc1Swenshuai.xi     DwinInfo.u64BFDRAMAddr = pinfo->addr1[0];
9355*53ee8cc1Swenshuai.xi 
9356*53ee8cc1Swenshuai.xi     DwinInfo.u8fmt = pinfo->fmt;
9357*53ee8cc1Swenshuai.xi     //Fix me : pinfo->pitch is Number of pixels per horizontal line.
9358*53ee8cc1Swenshuai.xi     if (pinfo->pitch == pinfo->rect.w)
9359*53ee8cc1Swenshuai.xi     {
9360*53ee8cc1Swenshuai.xi         DwinInfo.u16DRAMJumpLen = 0; //Pitch and width are qual
9361*53ee8cc1Swenshuai.xi     }
9362*53ee8cc1Swenshuai.xi     else
9363*53ee8cc1Swenshuai.xi     {
9364*53ee8cc1Swenshuai.xi         if (GOP_DWIN_FMT_ARGB8888 == pinfo->fmt)
9365*53ee8cc1Swenshuai.xi         {
9366*53ee8cc1Swenshuai.xi             DwinInfo.u16DRAMJumpLen = (pinfo->pitch - pinfo->rect.w) * 4;  // 1 pixel occupy 4 bytes
9367*53ee8cc1Swenshuai.xi         }
9368*53ee8cc1Swenshuai.xi         else
9369*53ee8cc1Swenshuai.xi         {
9370*53ee8cc1Swenshuai.xi             DwinInfo.u16DRAMJumpLen = (pinfo->pitch - pinfo->rect.w) * 2;  // 1 pixel occupy 2 bytes
9371*53ee8cc1Swenshuai.xi         }
9372*53ee8cc1Swenshuai.xi     }
9373*53ee8cc1Swenshuai.xi 
9374*53ee8cc1Swenshuai.xi     MDrv_GOP_DWIN_SetDataFmt(g_pGOPCtxLocal,(DRV_GOP_DWIN_DATA_FMT)pinfo->fmt);
9375*53ee8cc1Swenshuai.xi     MDrv_GOP_DWIN_SetSourceSel(g_pGOPCtxLocal,(DRV_GOP_DWIN_SRC_SEL)pinfo->src);
9376*53ee8cc1Swenshuai.xi     MDrv_GOP_SetClkForCapture(g_pGOPCtxLocal, (DRV_GOP_DWIN_SRC_SEL)pinfo->src);
9377*53ee8cc1Swenshuai.xi 
9378*53ee8cc1Swenshuai.xi 
9379*53ee8cc1Swenshuai.xi     if (MDrv_GOP_GetMIULen(g_pGOPCtxLocal)< pinfo->addr[0])
9380*53ee8cc1Swenshuai.xi     {
9381*53ee8cc1Swenshuai.xi         //Check DWIN MIU Setting is correct
9382*53ee8cc1Swenshuai.xi         if (MDrv_GOP_GetDWINMIU(g_pGOPCtxLocal)!=1)
9383*53ee8cc1Swenshuai.xi         {
9384*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n %s %d DWIN fb addr > MIUO length\n", __FUNCTION__,__LINE__);
9385*53ee8cc1Swenshuai.xi             MDrv_GOP_SetDWINMIU(g_pGOPCtxLocal, 1);
9386*53ee8cc1Swenshuai.xi         }
9387*53ee8cc1Swenshuai.xi     }
9388*53ee8cc1Swenshuai.xi     else //dwin FB address < MIU0, FB should be in MIU 0
9389*53ee8cc1Swenshuai.xi     {
9390*53ee8cc1Swenshuai.xi         //Check DWIN MIU Setting is correct, Error handling
9391*53ee8cc1Swenshuai.xi         if (MDrv_GOP_GetDWINMIU(g_pGOPCtxLocal)==1)
9392*53ee8cc1Swenshuai.xi         {
9393*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n %s %d, DWIN MIU setting should be MIU 0\n",__FUNCTION__,__LINE__);
9394*53ee8cc1Swenshuai.xi             MDrv_GOP_SetDWINMIU(g_pGOPCtxLocal, 0);
9395*53ee8cc1Swenshuai.xi         }
9396*53ee8cc1Swenshuai.xi     }
9397*53ee8cc1Swenshuai.xi     if (MDrv_GOP_GetMIULen(g_pGOPCtxLocal)< pinfo->addr1[0])
9398*53ee8cc1Swenshuai.xi     {
9399*53ee8cc1Swenshuai.xi         //Check DWIN MIU Setting is correct
9400*53ee8cc1Swenshuai.xi         if (MDrv_GOP_GetDWINMIU(g_pGOPCtxLocal)!=1)
9401*53ee8cc1Swenshuai.xi         {
9402*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n %s %d DWIN fb addr > MIUO length\n",__FUNCTION__,__LINE__);
9403*53ee8cc1Swenshuai.xi             MDrv_GOP_SetDWINMIU(g_pGOPCtxLocal, 1);
9404*53ee8cc1Swenshuai.xi         }
9405*53ee8cc1Swenshuai.xi     }
9406*53ee8cc1Swenshuai.xi     else //dwin FB address < MIU0, FB should be in MIU 0
9407*53ee8cc1Swenshuai.xi     {
9408*53ee8cc1Swenshuai.xi         //Check DWIN MIU Setting is correct, Error handling
9409*53ee8cc1Swenshuai.xi         if (MDrv_GOP_GetDWINMIU(g_pGOPCtxLocal)==1)
9410*53ee8cc1Swenshuai.xi         {
9411*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n %s %d DWIN MIU setting should be MIU 0\n",__FUNCTION__,__LINE__);
9412*53ee8cc1Swenshuai.xi             MDrv_GOP_SetDWINMIU(g_pGOPCtxLocal, 0);
9413*53ee8cc1Swenshuai.xi         }
9414*53ee8cc1Swenshuai.xi     }
9415*53ee8cc1Swenshuai.xi 
9416*53ee8cc1Swenshuai.xi     if((DwinInfo.u64TFDRAMAddr-DwinInfo.u64BFDRAMAddr)!=0)
9417*53ee8cc1Swenshuai.xi     {
9418*53ee8cc1Swenshuai.xi         MDrv_GOP_DWIN_SetWinInfo(g_pGOPCtxLocal, &DwinInfo);
9419*53ee8cc1Swenshuai.xi     }
9420*53ee8cc1Swenshuai.xi     else
9421*53ee8cc1Swenshuai.xi     {
9422*53ee8cc1Swenshuai.xi         if(pinfo->bEn ==TRUE)
9423*53ee8cc1Swenshuai.xi         {
9424*53ee8cc1Swenshuai.xi             GOP_M_INFO("\n %s %d, DWIN fb addr is invalid\n",__FUNCTION__,__LINE__);
9425*53ee8cc1Swenshuai.xi         }
9426*53ee8cc1Swenshuai.xi     }
9427*53ee8cc1Swenshuai.xi     MDrv_GOP_DWIN_SelectSourceScanType(g_pGOPCtxLocal, (EN_GOP_DWIN_SCAN_TYPE)pinfo->bInterlace);
9428*53ee8cc1Swenshuai.xi 
9429*53ee8cc1Swenshuai.xi     if((pinfo->framecount == 1) && (pinfo->bEn == FALSE)){
9430*53ee8cc1Swenshuai.xi         if(pinfo->bWait == TRUE)
9431*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_CaptureOneFrame(g_pGOPCtxLocal);
9432*53ee8cc1Swenshuai.xi         else
9433*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_CaptureOneFrame2(g_pGOPCtxLocal);
9434*53ee8cc1Swenshuai.xi     }else
9435*53ee8cc1Swenshuai.xi         MDrv_GOP_DWIN_EnableCaptureStream(g_pGOPCtxLocal, pinfo->bEn);
9436*53ee8cc1Swenshuai.xi 
9437*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9438*53ee8cc1Swenshuai.xi }
9439*53ee8cc1Swenshuai.xi 
9440*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Dwin_Intr(void * pInstance,EN_GOP_DWIN_INTR intr_type,MS_U32 * pIntr,MS_U32 u32Size)9441*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Dwin_Intr(void* pInstance,EN_GOP_DWIN_INTR intr_type, MS_U32* pIntr ,MS_U32 u32Size)
9442*53ee8cc1Swenshuai.xi {
9443*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9444*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9445*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9446*53ee8cc1Swenshuai.xi #endif
9447*53ee8cc1Swenshuai.xi 
9448*53ee8cc1Swenshuai.xi     switch(intr_type)
9449*53ee8cc1Swenshuai.xi     {
9450*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_INTR_CONTROL:
9451*53ee8cc1Swenshuai.xi         {
9452*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
9453*53ee8cc1Swenshuai.xi             MS_U32 IntrMask;
9454*53ee8cc1Swenshuai.xi             PGOP_DWIN_INTR_CTRL pIntrCtrl = (PGOP_DWIN_INTR_CTRL)pIntr;
9455*53ee8cc1Swenshuai.xi 
9456*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_DWIN_INTR_CTRL))
9457*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9458*53ee8cc1Swenshuai.xi 
9459*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)pIntrCtrl->intrEn;
9460*53ee8cc1Swenshuai.xi             IntrMask = pIntrCtrl->mask;
9461*53ee8cc1Swenshuai.xi 
9462*53ee8cc1Swenshuai.xi             MDrv_GOP_DWIN_EnableIntr(g_pGOPCtxLocal, IntrMask, bEn);
9463*53ee8cc1Swenshuai.xi 
9464*53ee8cc1Swenshuai.xi             break;
9465*53ee8cc1Swenshuai.xi         }
9466*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_INTR_GETINFO:
9467*53ee8cc1Swenshuai.xi         {
9468*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U16))
9469*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9470*53ee8cc1Swenshuai.xi 
9471*53ee8cc1Swenshuai.xi             *pIntr =  MDrv_GOP_DWIN_GetIntrStatus(g_pGOPCtxLocal);
9472*53ee8cc1Swenshuai.xi 
9473*53ee8cc1Swenshuai.xi             break;
9474*53ee8cc1Swenshuai.xi         }
9475*53ee8cc1Swenshuai.xi         case E_GOP_DWIN_INTR_GETINFO_TIMEOUT:
9476*53ee8cc1Swenshuai.xi         {
9477*53ee8cc1Swenshuai.xi             PGOP_DWIN_INTR_TIME_OUT pIntrTimeout = (PGOP_DWIN_INTR_TIME_OUT)pIntr;
9478*53ee8cc1Swenshuai.xi 
9479*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_DWIN_INTR_TIME_OUT))
9480*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
9481*53ee8cc1Swenshuai.xi             GOP_DWIN_GetDWinIntInfoTimeout(pInstance,&pIntrTimeout->DWinIntInfo,pIntrTimeout->u32Timeout);
9482*53ee8cc1Swenshuai.xi             break;
9483*53ee8cc1Swenshuai.xi         }
9484*53ee8cc1Swenshuai.xi     }
9485*53ee8cc1Swenshuai.xi 
9486*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9487*53ee8cc1Swenshuai.xi 
9488*53ee8cc1Swenshuai.xi }
9489*53ee8cc1Swenshuai.xi 
9490*53ee8cc1Swenshuai.xi 
9491*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetWinInfo(void * pInstance,MS_U32 gwinId,PGOP_BUFFER_INFO pInfo)9492*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetWinInfo(void* pInstance,MS_U32 gwinId,PGOP_BUFFER_INFO pInfo)
9493*53ee8cc1Swenshuai.xi {
9494*53ee8cc1Swenshuai.xi     MS_U8 u8GOP;
9495*53ee8cc1Swenshuai.xi     GOP_GwinInfo  wininfo;
9496*53ee8cc1Swenshuai.xi     DRV_GOP_AFBC_Info  sAFBCWinProperty;
9497*53ee8cc1Swenshuai.xi     memset(&sAFBCWinProperty, 0, sizeof(DRV_GOP_AFBC_Info));
9498*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9499*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9500*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9501*53ee8cc1Swenshuai.xi #endif
9502*53ee8cc1Swenshuai.xi 
9503*53ee8cc1Swenshuai.xi     wininfo.clrType = (EN_GOP_COLOR_TYPE)pInfo->fbFmt;
9504*53ee8cc1Swenshuai.xi     wininfo.u16DispHPixelStart = pInfo->disp_rect.x;
9505*53ee8cc1Swenshuai.xi     wininfo.u16DispVPixelStart = pInfo->disp_rect.y;
9506*53ee8cc1Swenshuai.xi     wininfo.u16RBlkHPixSize = pInfo->width;
9507*53ee8cc1Swenshuai.xi     wininfo.u16RBlkVPixSize = pInfo->height;
9508*53ee8cc1Swenshuai.xi     wininfo.u32DRAMRBlkStart = pInfo->addr;
9509*53ee8cc1Swenshuai.xi     wininfo.u16RBlkHRblkSize = pInfo->pitch;
9510*53ee8cc1Swenshuai.xi     wininfo.u16DispHPixelEnd = pInfo->disp_rect.x + pInfo->disp_rect.w;
9511*53ee8cc1Swenshuai.xi     wininfo.u16DispVPixelEnd = pInfo->disp_rect.y + pInfo->disp_rect.h;
9512*53ee8cc1Swenshuai.xi     wininfo.u16WinX = 0;
9513*53ee8cc1Swenshuai.xi     wininfo.u16WinY = 0;
9514*53ee8cc1Swenshuai.xi 
9515*53ee8cc1Swenshuai.xi     if ((wininfo.u16DispHPixelEnd - wininfo.u16DispHPixelStart) > wininfo.u16RBlkHPixSize)
9516*53ee8cc1Swenshuai.xi     {
9517*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d] display H Area > Buffer, x=%td, w=%td, disp_w=%td\n",__FUNCTION__,__LINE__, (ptrdiff_t)pInfo->disp_rect.x, (ptrdiff_t)pInfo->disp_rect.w, (ptrdiff_t)pInfo->width);
9518*53ee8cc1Swenshuai.xi         wininfo.u16DispHPixelEnd = wininfo.u16DispHPixelStart + wininfo.u16RBlkHPixSize;
9519*53ee8cc1Swenshuai.xi     }
9520*53ee8cc1Swenshuai.xi     if ((wininfo.u16DispVPixelEnd - wininfo.u16DispVPixelStart) > wininfo.u16RBlkVPixSize)
9521*53ee8cc1Swenshuai.xi     {
9522*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d] display V Area > Buffer, y=%td, h=%td, disp_h=%td\n",__FUNCTION__,__LINE__, (ptrdiff_t)pInfo->disp_rect.y, (ptrdiff_t)pInfo->disp_rect.h, (ptrdiff_t)pInfo->height);
9523*53ee8cc1Swenshuai.xi         wininfo.u16DispVPixelEnd = wininfo.u16DispVPixelStart + wininfo.u16RBlkVPixSize;
9524*53ee8cc1Swenshuai.xi     }
9525*53ee8cc1Swenshuai.xi 
9526*53ee8cc1Swenshuai.xi     GOP_M_INFO("\33[0;36m   %s:%d   u8win = %td \33[m \n",__FUNCTION__,__LINE__, (ptrdiff_t)gwinId);
9527*53ee8cc1Swenshuai.xi 
9528*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gwinId))
9529*53ee8cc1Swenshuai.xi     {
9530*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gwinId);
9531*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9532*53ee8cc1Swenshuai.xi     }
9533*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,gwinId);
9534*53ee8cc1Swenshuai.xi 
9535*53ee8cc1Swenshuai.xi     if(u8GOP == GOPTYPE.GOP0)
9536*53ee8cc1Swenshuai.xi     {
9537*53ee8cc1Swenshuai.xi         _SetGop0WinInfo(pInstance,gwinId, &wininfo);
9538*53ee8cc1Swenshuai.xi     }
9539*53ee8cc1Swenshuai.xi     else if(u8GOP == GOPTYPE.GOP1)
9540*53ee8cc1Swenshuai.xi     {
9541*53ee8cc1Swenshuai.xi         _SetGop1WinInfo(pInstance,gwinId, &wininfo);
9542*53ee8cc1Swenshuai.xi     }
9543*53ee8cc1Swenshuai.xi     else
9544*53ee8cc1Swenshuai.xi     {
9545*53ee8cc1Swenshuai.xi         _SetGop23WinInfo(pInstance,gwinId, &wininfo);
9546*53ee8cc1Swenshuai.xi     }
9547*53ee8cc1Swenshuai.xi     if(g_pGOPCtxLocal->pGopChipProperty->bAFBC_Support[u8GOP]==TRUE)
9548*53ee8cc1Swenshuai.xi     {
9549*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16HPixelStart = wininfo.u16DispHPixelStart;
9550*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16HPixelEnd = wininfo.u16DispHPixelEnd;
9551*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16Pitch = wininfo.u16RBlkHRblkSize;
9552*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16VPixelStart = wininfo.u16DispVPixelStart;
9553*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u16VPixelEnd= wininfo.u16DispVPixelEnd;
9554*53ee8cc1Swenshuai.xi         sAFBCWinProperty.u64DRAMAddr = wininfo.u32DRAMRBlkStart;
9555*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_AFBCSetWindow(g_pGOPCtxLocal, u8GOP, &sAFBCWinProperty,FALSE);
9556*53ee8cc1Swenshuai.xi     }
9557*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_UpdateReg(g_pGOPCtxLocal,u8GOP);
9558*53ee8cc1Swenshuai.xi 
9559*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9560*53ee8cc1Swenshuai.xi }
9561*53ee8cc1Swenshuai.xi 
9562*53ee8cc1Swenshuai.xi 
9563*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetWinInfo(void * pInstance,MS_U32 gwinId,PGOP_BUFFER_INFO pInfo)9564*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetWinInfo(void* pInstance,MS_U32 gwinId,PGOP_BUFFER_INFO pInfo)
9565*53ee8cc1Swenshuai.xi {
9566*53ee8cc1Swenshuai.xi     GOP_GwinInfo wininfo;
9567*53ee8cc1Swenshuai.xi 
9568*53ee8cc1Swenshuai.xi 
9569*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gwinId))
9570*53ee8cc1Swenshuai.xi     {
9571*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gwinId);
9572*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9573*53ee8cc1Swenshuai.xi     }
9574*53ee8cc1Swenshuai.xi 
9575*53ee8cc1Swenshuai.xi     if (pInfo == NULL)
9576*53ee8cc1Swenshuai.xi     {
9577*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]pinfo is NULL\n",__FUNCTION__,__LINE__);
9578*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9579*53ee8cc1Swenshuai.xi     }
9580*53ee8cc1Swenshuai.xi 
9581*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,gwinId)) //To check the gwin is exist
9582*53ee8cc1Swenshuai.xi     {
9583*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is not exist\n",__FUNCTION__,__LINE__,(ptrdiff_t)gwinId);
9584*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9585*53ee8cc1Swenshuai.xi         //ASSERT(0);
9586*53ee8cc1Swenshuai.xi     }
9587*53ee8cc1Swenshuai.xi 
9588*53ee8cc1Swenshuai.xi     GOP_GetWinInfo(pInstance,gwinId, &wininfo);
9589*53ee8cc1Swenshuai.xi 
9590*53ee8cc1Swenshuai.xi     pInfo->addr            = wininfo.u32DRAMRBlkStart;
9591*53ee8cc1Swenshuai.xi     pInfo->disp_rect.x     = wininfo.u16DispHPixelStart;
9592*53ee8cc1Swenshuai.xi     pInfo->disp_rect.y     = wininfo.u16DispVPixelStart;
9593*53ee8cc1Swenshuai.xi     pInfo->disp_rect.w     = wininfo.u16DispHPixelEnd - wininfo.u16DispHPixelStart;
9594*53ee8cc1Swenshuai.xi     pInfo->disp_rect.h     = wininfo.u16DispVPixelEnd - wininfo.u16DispVPixelStart;
9595*53ee8cc1Swenshuai.xi     pInfo->width           = wininfo.u16RBlkHPixSize;
9596*53ee8cc1Swenshuai.xi     pInfo->height          = wininfo.u16RBlkVPixSize;
9597*53ee8cc1Swenshuai.xi     pInfo->pitch           = wininfo.u16RBlkHRblkSize;
9598*53ee8cc1Swenshuai.xi     pInfo->fbFmt           = (MS_U32)wininfo.clrType;
9599*53ee8cc1Swenshuai.xi 
9600*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9601*53ee8cc1Swenshuai.xi 
9602*53ee8cc1Swenshuai.xi }
9603*53ee8cc1Swenshuai.xi 
9604*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Win_Enable(void * pInstance,MS_U32 gwinId,MS_BOOL bEn)9605*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Win_Enable(void* pInstance,MS_U32 gwinId,MS_BOOL bEn)
9606*53ee8cc1Swenshuai.xi {
9607*53ee8cc1Swenshuai.xi     MS_U16 regval2;
9608*53ee8cc1Swenshuai.xi     MS_U32 u32fbId;
9609*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
9610*53ee8cc1Swenshuai.xi     MS_U8 gwinNum = 0;
9611*53ee8cc1Swenshuai.xi     MS_U8 i;
9612*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9613*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9614*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9615*53ee8cc1Swenshuai.xi #endif
9616*53ee8cc1Swenshuai.xi 
9617*53ee8cc1Swenshuai.xi 
9618*53ee8cc1Swenshuai.xi     if (!_GOP_IsGwinIdValid(pInstance,gwinId))
9619*53ee8cc1Swenshuai.xi     {
9620*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)gwinId);
9621*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9622*53ee8cc1Swenshuai.xi     }
9623*53ee8cc1Swenshuai.xi 
9624*53ee8cc1Swenshuai.xi     //printf("GWINID=%d,Enable=%d\n",(MS_U8)winId,(MS_U8)bEnable);
9625*53ee8cc1Swenshuai.xi     if (!_GOP_GWIN_IsGwinExistInClient(pInstance,gwinId))
9626*53ee8cc1Swenshuai.xi     {
9627*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td  is not exist\n",__FUNCTION__,__LINE__,(ptrdiff_t)gwinId);
9628*53ee8cc1Swenshuai.xi         //__ASSERT(0);
9629*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9630*53ee8cc1Swenshuai.xi     }
9631*53ee8cc1Swenshuai.xi 
9632*53ee8cc1Swenshuai.xi     //   printf(" u8win=%02bx, bEnable=%02bx\n",u8win,bEnable);
9633*53ee8cc1Swenshuai.xi     u32fbId = g_pGOPCtxLocal->pGOPCtxShared->gwinMap[gwinId].u32CurFBId;
9634*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
9635*53ee8cc1Swenshuai.xi 
9636*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
9637*53ee8cc1Swenshuai.xi     {
9638*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9639*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9640*53ee8cc1Swenshuai.xi     }
9641*53ee8cc1Swenshuai.xi 
9642*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
9643*53ee8cc1Swenshuai.xi     {
9644*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9645*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9646*53ee8cc1Swenshuai.xi     }
9647*53ee8cc1Swenshuai.xi 
9648*53ee8cc1Swenshuai.xi     if (0 == pwinFB->in_use)
9649*53ee8cc1Swenshuai.xi     {
9650*53ee8cc1Swenshuai.xi         msWarning(ERR_GWIN_ID_NOT_ALLOCATED);
9651*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GWIN %td not allocated\n",__FUNCTION__,__LINE__,(ptrdiff_t)gwinId);
9652*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9653*53ee8cc1Swenshuai.xi     }
9654*53ee8cc1Swenshuai.xi      pwinFB->enable = bEn;
9655*53ee8cc1Swenshuai.xi 
9656*53ee8cc1Swenshuai.xi     for(i = 0; i < (MS_U8)g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum ; i++)
9657*53ee8cc1Swenshuai.xi     {
9658*53ee8cc1Swenshuai.xi         if(GOP_GWIN_IsEnable(pInstance,i) == TRUE)
9659*53ee8cc1Swenshuai.xi         {
9660*53ee8cc1Swenshuai.xi             gwinNum |= 1<<i;
9661*53ee8cc1Swenshuai.xi         }
9662*53ee8cc1Swenshuai.xi     }
9663*53ee8cc1Swenshuai.xi 
9664*53ee8cc1Swenshuai.xi     regval2 = gwinNum;
9665*53ee8cc1Swenshuai.xi 
9666*53ee8cc1Swenshuai.xi     if (bEn == 0) // Turn off GOP
9667*53ee8cc1Swenshuai.xi     {
9668*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, gwinId, FALSE);
9669*53ee8cc1Swenshuai.xi         if ((regval2 & ~(1<<gwinId)) == 0)
9670*53ee8cc1Swenshuai.xi         {
9671*53ee8cc1Swenshuai.xi             if(fpXCReduceBWForOSD!=NULL)
9672*53ee8cc1Swenshuai.xi             {
9673*53ee8cc1Swenshuai.xi                 fpXCReduceBWForOSD(XC_MAIN_WINDOW, FALSE);
9674*53ee8cc1Swenshuai.xi             }
9675*53ee8cc1Swenshuai.xi         }
9676*53ee8cc1Swenshuai.xi     }
9677*53ee8cc1Swenshuai.xi     else //turn on GOP
9678*53ee8cc1Swenshuai.xi     {
9679*53ee8cc1Swenshuai.xi         //printf("gop on, interlace=%bx\n", IsSrcInterlace());
9680*53ee8cc1Swenshuai.xi         if(fpXCReduceBWForOSD!=NULL)
9681*53ee8cc1Swenshuai.xi         {
9682*53ee8cc1Swenshuai.xi             fpXCReduceBWForOSD(XC_MAIN_WINDOW, TRUE);
9683*53ee8cc1Swenshuai.xi         }
9684*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_EnableGwin(g_pGOPCtxLocal, gwinId, TRUE);
9685*53ee8cc1Swenshuai.xi     }
9686*53ee8cc1Swenshuai.xi 
9687*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9688*53ee8cc1Swenshuai.xi 
9689*53ee8cc1Swenshuai.xi }
9690*53ee8cc1Swenshuai.xi 
9691*53ee8cc1Swenshuai.xi 
9692*53ee8cc1Swenshuai.xi //******************************************************************************
9693*53ee8cc1Swenshuai.xi /// API for set GWIN resolution in one function
9694*53ee8cc1Swenshuai.xi /// @param u8GwinId \b IN: GWin ID
9695*53ee8cc1Swenshuai.xi /// @param u8FbId \b IN: Frame Buffer ID
9696*53ee8cc1Swenshuai.xi /// @param pGwinInfo \b IN: pointer to GOP_GwinInfo structure
9697*53ee8cc1Swenshuai.xi /// @param pStretchInfo \b IN: pointer to GOP_StretchInfo
9698*53ee8cc1Swenshuai.xi /// @param direction \b IN: to decide which direction to stretch
9699*53ee8cc1Swenshuai.xi /// @param u16DstWidth \b IN: set scaled width if H direction is specified
9700*53ee8cc1Swenshuai.xi /// @param u16DstHeight \b IN: set scaled height if V direction is specified
9701*53ee8cc1Swenshuai.xi /// @return GOP_API_SUCCESS - Success
9702*53ee8cc1Swenshuai.xi //******************************************************************************
Ioctl_GOP_SetDisplay(void * pInstance,PGOP_GWINDISPLAY_INFO pInfo)9703*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetDisplay(void* pInstance,PGOP_GWINDISPLAY_INFO pInfo)
9704*53ee8cc1Swenshuai.xi {
9705*53ee8cc1Swenshuai.xi     MS_U8 u8GOP;
9706*53ee8cc1Swenshuai.xi     MS_U32 GwinId = pInfo->gwin;
9707*53ee8cc1Swenshuai.xi     MS_U16 u16Tmp, u16OrigWidth = 0;
9708*53ee8cc1Swenshuai.xi     MS_U16 gwin_w, stretch_w;
9709*53ee8cc1Swenshuai.xi     MS_BOOL u16OrgUpdateRegOnce = FALSE;
9710*53ee8cc1Swenshuai.xi     GOP_StretchInfo* pStretchInfo;
9711*53ee8cc1Swenshuai.xi     GOP_GwinInfo* pGwinInfo = NULL;
9712*53ee8cc1Swenshuai.xi     MS_U32 u32FbId;
9713*53ee8cc1Swenshuai.xi     EN_GOP_STRETCH_DIRECTION  direction;
9714*53ee8cc1Swenshuai.xi     MS_U16 u16DstWidth, u16DstHeight;
9715*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9716*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9717*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9718*53ee8cc1Swenshuai.xi #endif
9719*53ee8cc1Swenshuai.xi 
9720*53ee8cc1Swenshuai.xi     u32FbId = pInfo->fbid;
9721*53ee8cc1Swenshuai.xi     direction = pInfo->dir;
9722*53ee8cc1Swenshuai.xi     u16DstWidth = pInfo->dst_size.w;
9723*53ee8cc1Swenshuai.xi     u16DstHeight = pInfo->dst_size.h;
9724*53ee8cc1Swenshuai.xi 
9725*53ee8cc1Swenshuai.xi     pGwinInfo = &(pInfo->gwin_info);
9726*53ee8cc1Swenshuai.xi     pStretchInfo = &(pInfo->stretch_info);
9727*53ee8cc1Swenshuai.xi 
9728*53ee8cc1Swenshuai.xi     u16OrgUpdateRegOnce = g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE];
9729*53ee8cc1Swenshuai.xi     //Save old update_reg_once state, and change to update_reg_once=TRUE internally
9730*53ee8cc1Swenshuai.xi     if(u16OrgUpdateRegOnce == FALSE)
9731*53ee8cc1Swenshuai.xi     {
9732*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = TRUE;
9733*53ee8cc1Swenshuai.xi     }
9734*53ee8cc1Swenshuai.xi     GOP_MapFB2Win(pInstance,u32FbId,GwinId);
9735*53ee8cc1Swenshuai.xi 
9736*53ee8cc1Swenshuai.xi     u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal,GwinId);
9737*53ee8cc1Swenshuai.xi     //MApi_GOP_GWIN_Set_STRETCHWIN(u8GOP, pStretchInfo->eDstType,pStretchInfo->x, pStretchInfo->y
9738*53ee8cc1Swenshuai.xi     //    , pStretchInfo->width, pStretchInfo->height);
9739*53ee8cc1Swenshuai.xi     _GOP_Get_StretchWin(pInstance,u8GOP, &u16Tmp, &u16Tmp, &u16OrigWidth, &u16Tmp);
9740*53ee8cc1Swenshuai.xi 
9741*53ee8cc1Swenshuai.xi     gwin_w = pGwinInfo->u16DispHPixelEnd - pGwinInfo->u16DispHPixelStart;
9742*53ee8cc1Swenshuai.xi 
9743*53ee8cc1Swenshuai.xi     if(gwin_w > pStretchInfo->width)
9744*53ee8cc1Swenshuai.xi         stretch_w = gwin_w;
9745*53ee8cc1Swenshuai.xi     else
9746*53ee8cc1Swenshuai.xi         stretch_w = pStretchInfo->width;
9747*53ee8cc1Swenshuai.xi 
9748*53ee8cc1Swenshuai.xi     _GOP_GWIN_Align_StretchWin(pInstance,u8GOP,pStretchInfo->eDstType , &pStretchInfo->x, &pStretchInfo->y, &stretch_w, &pStretchInfo->height, _GOP_GetBPP(pInstance,pGwinInfo->clrType));
9749*53ee8cc1Swenshuai.xi     //Store API use stretch window
9750*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchWidth[u8GOP] = stretch_w;
9751*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->pGOPCtxShared->u16APIStretchHeight[u8GOP]= pStretchInfo->height;
9752*53ee8cc1Swenshuai.xi 
9753*53ee8cc1Swenshuai.xi     _GOP_GWIN_Adjust_3DStretchWin(pInstance,u8GOP, &pStretchInfo->x, &pStretchInfo->y, &stretch_w, &pStretchInfo->height);
9754*53ee8cc1Swenshuai.xi     if (u16OrigWidth <= stretch_w)//Set a large one, set htt first
9755*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetHTotal(g_pGOPCtxLocal, u8GOP, stretch_w);
9756*53ee8cc1Swenshuai.xi 
9757*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_SetStretchWin(g_pGOPCtxLocal, u8GOP, pStretchInfo->x, pStretchInfo->y, stretch_w, pStretchInfo->height);
9758*53ee8cc1Swenshuai.xi 
9759*53ee8cc1Swenshuai.xi     if(u16DstWidth <= pStretchInfo->width)
9760*53ee8cc1Swenshuai.xi         GOP_Set_Hscale(pInstance,u8GOP,FALSE, pStretchInfo->width, u16DstWidth);
9761*53ee8cc1Swenshuai.xi     else if (direction & E_GOP_H_STRETCH)
9762*53ee8cc1Swenshuai.xi         GOP_Set_Hscale(pInstance,u8GOP,TRUE, pStretchInfo->width, u16DstWidth);
9763*53ee8cc1Swenshuai.xi 
9764*53ee8cc1Swenshuai.xi     if(u16DstHeight < pStretchInfo->height)
9765*53ee8cc1Swenshuai.xi         GOP_Set_Vscale(pInstance,u8GOP,FALSE, pStretchInfo->height, u16DstHeight);
9766*53ee8cc1Swenshuai.xi     else if (direction & E_GOP_V_STRETCH)
9767*53ee8cc1Swenshuai.xi         GOP_Set_Vscale(pInstance,u8GOP,TRUE, pStretchInfo->height, u16DstHeight);
9768*53ee8cc1Swenshuai.xi 
9769*53ee8cc1Swenshuai.xi     GOP_SetWinInfo(pInstance,GwinId,pGwinInfo);
9770*53ee8cc1Swenshuai.xi 
9771*53ee8cc1Swenshuai.xi     //Restore update_reg_once and trigger register writes in
9772*53ee8cc1Swenshuai.xi     if(u16OrgUpdateRegOnce == FALSE)
9773*53ee8cc1Swenshuai.xi     {
9774*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = u16OrgUpdateRegOnce;
9775*53ee8cc1Swenshuai.xi     }
9776*53ee8cc1Swenshuai.xi 
9777*53ee8cc1Swenshuai.xi     if (u16OrigWidth > stretch_w)//Set a small one, set htt after Gwin regsiter updated
9778*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetHTotal(g_pGOPCtxLocal, u8GOP, stretch_w);
9779*53ee8cc1Swenshuai.xi 
9780*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9781*53ee8cc1Swenshuai.xi }
9782*53ee8cc1Swenshuai.xi 
9783*53ee8cc1Swenshuai.xi 
9784*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Win_Destroy(void * pInstance,MS_U32 gId)9785*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Win_Destroy(void* pInstance,MS_U32 gId)
9786*53ee8cc1Swenshuai.xi {
9787*53ee8cc1Swenshuai.xi     E_GOP_API_Result eRet=GOP_API_FAIL;
9788*53ee8cc1Swenshuai.xi     eRet = GOP_Win_Destroy(pInstance,gId);
9789*53ee8cc1Swenshuai.xi     return eRet;
9790*53ee8cc1Swenshuai.xi }
9791*53ee8cc1Swenshuai.xi 
9792*53ee8cc1Swenshuai.xi 
Ioctl_GFlip_ClearFlipQueue(void * pInstance,MS_U32 gwin)9793*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GFlip_ClearFlipQueue(void* pInstance,MS_U32 gwin)
9794*53ee8cc1Swenshuai.xi {
9795*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9796*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9797*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9798*53ee8cc1Swenshuai.xi #endif
9799*53ee8cc1Swenshuai.xi     return (E_GOP_API_Result)MDrv_GOP_GWIN_ClearFlipQueue(g_pGOPCtxLocal,gwin);
9800*53ee8cc1Swenshuai.xi 
9801*53ee8cc1Swenshuai.xi }
9802*53ee8cc1Swenshuai.xi 
9803*53ee8cc1Swenshuai.xi 
9804*53ee8cc1Swenshuai.xi 
Ioctl_GFlip_SwitchGwin(void * pInstance,PGOP_GWIN_FLIP_WIN_INFO pflip)9805*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GFlip_SwitchGwin(void* pInstance,PGOP_GWIN_FLIP_WIN_INFO pflip)
9806*53ee8cc1Swenshuai.xi {
9807*53ee8cc1Swenshuai.xi 
9808*53ee8cc1Swenshuai.xi 
9809*53ee8cc1Swenshuai.xi     switch(pflip->enFlip)
9810*53ee8cc1Swenshuai.xi     {
9811*53ee8cc1Swenshuai.xi         case GOP_FLIP_BY_FBID:
9812*53ee8cc1Swenshuai.xi             GOP_SwitchByFBID(pInstance,pflip->GwinId, pflip->FbId, pflip->WaitTagID, pflip->pQueueCnt);
9813*53ee8cc1Swenshuai.xi             break;
9814*53ee8cc1Swenshuai.xi         case GOP_FLIP_BY_ADDR:
9815*53ee8cc1Swenshuai.xi             GOP_SwitchByAddr(pInstance,pflip->GwinId, pflip->FlipAddr, pflip->SubFlipAddr, pflip->WaitTagID, pflip->pQueueCnt, pflip->b3DEnable);
9816*53ee8cc1Swenshuai.xi             break;
9817*53ee8cc1Swenshuai.xi 
9818*53ee8cc1Swenshuai.xi     }
9819*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9820*53ee8cc1Swenshuai.xi 
9821*53ee8cc1Swenshuai.xi }
9822*53ee8cc1Swenshuai.xi 
Ioctl_GFlip_SwitchMultiGwin(void * pInstance,PGOP_GWIN_FLIP_MULTI_WIN_INFO pMultiflip)9823*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GFlip_SwitchMultiGwin(void* pInstance,PGOP_GWIN_FLIP_MULTI_WIN_INFO pMultiflip)
9824*53ee8cc1Swenshuai.xi {
9825*53ee8cc1Swenshuai.xi 
9826*53ee8cc1Swenshuai.xi 
9827*53ee8cc1Swenshuai.xi     GOP_MultiSwitchByAddr(pInstance,pMultiflip);
9828*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9829*53ee8cc1Swenshuai.xi 
9830*53ee8cc1Swenshuai.xi }
9831*53ee8cc1Swenshuai.xi 
9832*53ee8cc1Swenshuai.xi 
Ioctl_GOP_FBCreate(void * pInstance,EN_GOP_CREATEBUFFER_TYPE fbtype,PGOP_BUFFER_INFO pBuff,MS_U32 fbId)9833*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_FBCreate(void* pInstance,EN_GOP_CREATEBUFFER_TYPE fbtype,PGOP_BUFFER_INFO  pBuff,MS_U32 fbId)
9834*53ee8cc1Swenshuai.xi {
9835*53ee8cc1Swenshuai.xi 
9836*53ee8cc1Swenshuai.xi 
9837*53ee8cc1Swenshuai.xi     if(fbtype == GOP_CREATE_BUFFER)
9838*53ee8cc1Swenshuai.xi         GOP_CreateBuffer(pInstance,pBuff,fbId);
9839*53ee8cc1Swenshuai.xi     else if(fbtype == GOP_CREATE_BUFFER_BYADDR)
9840*53ee8cc1Swenshuai.xi         GOP_CreateBufferByAddr(pInstance,pBuff,fbId);
9841*53ee8cc1Swenshuai.xi 
9842*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9843*53ee8cc1Swenshuai.xi 
9844*53ee8cc1Swenshuai.xi }
9845*53ee8cc1Swenshuai.xi 
9846*53ee8cc1Swenshuai.xi 
Ioctl_GOP_FBDestroy(void * pInstance,MS_U32 * pId)9847*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_FBDestroy(void* pInstance,MS_U32* pId)
9848*53ee8cc1Swenshuai.xi {
9849*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
9850*53ee8cc1Swenshuai.xi     MS_U32 u32fbId;
9851*53ee8cc1Swenshuai.xi 
9852*53ee8cc1Swenshuai.xi     u32fbId = *pId;
9853*53ee8cc1Swenshuai.xi 
9854*53ee8cc1Swenshuai.xi     if (DRV_MAX_GWIN_FB_SUPPORT <= u32fbId)
9855*53ee8cc1Swenshuai.xi     {
9856*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_OUT_OF_RANGE);
9857*53ee8cc1Swenshuai.xi         MS_DEBUG_MSG( GOP_M_ERR( "%s(u32fbId:%d....), fbId out of bound\n",__FUNCTION__, (ptrdiff_t)u32fbId) );
9858*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
9859*53ee8cc1Swenshuai.xi 
9860*53ee8cc1Swenshuai.xi     }
9861*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
9862*53ee8cc1Swenshuai.xi 
9863*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
9864*53ee8cc1Swenshuai.xi     {
9865*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId);
9866*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
9867*53ee8cc1Swenshuai.xi     }
9868*53ee8cc1Swenshuai.xi 
9869*53ee8cc1Swenshuai.xi     if(0 == pwinFB->in_use)
9870*53ee8cc1Swenshuai.xi     {
9871*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_NOT_ALLOCATED);
9872*53ee8cc1Swenshuai.xi         MS_DEBUG_MSG( GOP_M_ERR("[%s][%d]: u32fbId=%d is not in existence\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32fbId));
9873*53ee8cc1Swenshuai.xi         return GWIN_NO_AVAILABLE;
9874*53ee8cc1Swenshuai.xi 
9875*53ee8cc1Swenshuai.xi     }
9876*53ee8cc1Swenshuai.xi 
9877*53ee8cc1Swenshuai.xi     GOP_FB_Destroy(pInstance,u32fbId);
9878*53ee8cc1Swenshuai.xi 
9879*53ee8cc1Swenshuai.xi     return GWIN_OK;
9880*53ee8cc1Swenshuai.xi 
9881*53ee8cc1Swenshuai.xi }
9882*53ee8cc1Swenshuai.xi 
Ioctl_GOP_GetFBInfo(void * pInstance,MS_U32 u32fbId,PGOP_BUFFER_INFO pBuff)9883*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_GetFBInfo(void* pInstance,MS_U32 u32fbId, PGOP_BUFFER_INFO pBuff)
9884*53ee8cc1Swenshuai.xi {
9885*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
9886*53ee8cc1Swenshuai.xi 
9887*53ee8cc1Swenshuai.xi 
9888*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
9889*53ee8cc1Swenshuai.xi     {
9890*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9891*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9892*53ee8cc1Swenshuai.xi     }
9893*53ee8cc1Swenshuai.xi 
9894*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
9895*53ee8cc1Swenshuai.xi 
9896*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
9897*53ee8cc1Swenshuai.xi     {
9898*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9899*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9900*53ee8cc1Swenshuai.xi     }
9901*53ee8cc1Swenshuai.xi 
9902*53ee8cc1Swenshuai.xi     if(pwinFB->in_use ==0)
9903*53ee8cc1Swenshuai.xi     {
9904*53ee8cc1Swenshuai.xi         msWarning(ERR_FB_ID_NOT_ALLOCATED);
9905*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]: u32fbId=%td is not in existence\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9906*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9907*53ee8cc1Swenshuai.xi     }
9908*53ee8cc1Swenshuai.xi 
9909*53ee8cc1Swenshuai.xi     pBuff->addr= pwinFB->addr;
9910*53ee8cc1Swenshuai.xi     pBuff->fbFmt = pwinFB->fbFmt;
9911*53ee8cc1Swenshuai.xi     pBuff->width = pwinFB->width;
9912*53ee8cc1Swenshuai.xi     pBuff->height = pwinFB->height;
9913*53ee8cc1Swenshuai.xi     pBuff->pitch = pwinFB->pitch;
9914*53ee8cc1Swenshuai.xi     pBuff->disp_rect.x = pwinFB->x0;
9915*53ee8cc1Swenshuai.xi     pBuff->disp_rect.w = pwinFB->x1 - pwinFB->x0;
9916*53ee8cc1Swenshuai.xi     pBuff->disp_rect.y = pwinFB->y0;
9917*53ee8cc1Swenshuai.xi     pBuff->disp_rect.h = pwinFB->y1 - pwinFB->y0;
9918*53ee8cc1Swenshuai.xi 
9919*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9920*53ee8cc1Swenshuai.xi 
9921*53ee8cc1Swenshuai.xi }
9922*53ee8cc1Swenshuai.xi 
Ioctl_GOP_SetFBInfo(void * pInstance,MS_U32 u32fbId,PGOP_BUFFER_INFO pBuff)9923*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_SetFBInfo(void* pInstance,MS_U32 u32fbId, PGOP_BUFFER_INFO pBuff)
9924*53ee8cc1Swenshuai.xi {
9925*53ee8cc1Swenshuai.xi     GOP_WinFB_INFO* pwinFB;
9926*53ee8cc1Swenshuai.xi 
9927*53ee8cc1Swenshuai.xi 
9928*53ee8cc1Swenshuai.xi     if (!_GOP_IsFbIdValid(pInstance,u32fbId))
9929*53ee8cc1Swenshuai.xi     {
9930*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9931*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9932*53ee8cc1Swenshuai.xi     }
9933*53ee8cc1Swenshuai.xi     pwinFB = _GetWinFB(pInstance,u32fbId);
9934*53ee8cc1Swenshuai.xi 
9935*53ee8cc1Swenshuai.xi     if(pwinFB == NULL)
9936*53ee8cc1Swenshuai.xi     {
9937*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32fbId);
9938*53ee8cc1Swenshuai.xi         return GOP_API_FAIL;
9939*53ee8cc1Swenshuai.xi     }
9940*53ee8cc1Swenshuai.xi 
9941*53ee8cc1Swenshuai.xi     pwinFB->enable      = 1   ;
9942*53ee8cc1Swenshuai.xi     pwinFB->gWinId      = 0xFF   ;
9943*53ee8cc1Swenshuai.xi     pwinFB->fbFmt       = pBuff->fbFmt    ;
9944*53ee8cc1Swenshuai.xi     pwinFB->width       = pBuff->width    ;
9945*53ee8cc1Swenshuai.xi     pwinFB->height      = pBuff->height   ;
9946*53ee8cc1Swenshuai.xi 
9947*53ee8cc1Swenshuai.xi     pwinFB->x0          = pBuff->disp_rect.x;
9948*53ee8cc1Swenshuai.xi     pwinFB->x1          = pBuff->disp_rect.x + pBuff->disp_rect.w;
9949*53ee8cc1Swenshuai.xi     pwinFB->y0          = pBuff->disp_rect.y       ;
9950*53ee8cc1Swenshuai.xi     pwinFB->y1          = pBuff->disp_rect.y + pBuff->disp_rect.h;
9951*53ee8cc1Swenshuai.xi     pwinFB->s_x         = 0;
9952*53ee8cc1Swenshuai.xi     pwinFB->s_y         = 0;
9953*53ee8cc1Swenshuai.xi     pwinFB->dispWidth   = pBuff->disp_rect.w ;
9954*53ee8cc1Swenshuai.xi     pwinFB->dispHeight  = pBuff->disp_rect.h;
9955*53ee8cc1Swenshuai.xi 
9956*53ee8cc1Swenshuai.xi     if(pwinFB->in_use &&  GOP_WINFB_POOL_NULL== pwinFB->poolId)
9957*53ee8cc1Swenshuai.xi     {
9958*53ee8cc1Swenshuai.xi         pwinFB->addr        = pBuff->addr     ;
9959*53ee8cc1Swenshuai.xi         pwinFB->size        = pBuff->pitch * pBuff->height;
9960*53ee8cc1Swenshuai.xi         pwinFB->pitch       = pBuff->pitch    ;
9961*53ee8cc1Swenshuai.xi      }
9962*53ee8cc1Swenshuai.xi 
9963*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9964*53ee8cc1Swenshuai.xi }
9965*53ee8cc1Swenshuai.xi 
9966*53ee8cc1Swenshuai.xi 
GOP_TriggerRegWriteIn(void * pInstance,MS_U32 gop,MS_BOOL bForceWriteIn,MS_BOOL bSync)9967*53ee8cc1Swenshuai.xi MS_U32 GOP_TriggerRegWriteIn(void* pInstance,MS_U32 gop, MS_BOOL bForceWriteIn, MS_BOOL bSync)
9968*53ee8cc1Swenshuai.xi {
9969*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9970*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9971*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9972*53ee8cc1Swenshuai.xi #endif
9973*53ee8cc1Swenshuai.xi 
9974*53ee8cc1Swenshuai.xi     MDrv_GOP_TriggerRegWriteIn(g_pGOPCtxLocal, gop, bForceWriteIn, bSync);
9975*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9976*53ee8cc1Swenshuai.xi 
9977*53ee8cc1Swenshuai.xi 
9978*53ee8cc1Swenshuai.xi }
GOP_UpdateOnce(void * pInstance,MS_U32 gop,MS_BOOL bUpdateOnce,MS_BOOL bSync)9979*53ee8cc1Swenshuai.xi MS_U32 GOP_UpdateOnce(void* pInstance,MS_U32 gop, MS_BOOL bUpdateOnce, MS_BOOL bSync)
9980*53ee8cc1Swenshuai.xi {
9981*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9982*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9983*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
9984*53ee8cc1Swenshuai.xi #endif
9985*53ee8cc1Swenshuai.xi 
9986*53ee8cc1Swenshuai.xi     g_pGOPCtxLocal->bUpdateRegOnce[GOP_PUBLIC_UPDATE] = bUpdateOnce;
9987*53ee8cc1Swenshuai.xi     if(bUpdateOnce == FALSE)
9988*53ee8cc1Swenshuai.xi     {
9989*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_UpdateRegWithSync(g_pGOPCtxLocal, gop, bSync);
9990*53ee8cc1Swenshuai.xi     }
9991*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
9992*53ee8cc1Swenshuai.xi 
9993*53ee8cc1Swenshuai.xi }
9994*53ee8cc1Swenshuai.xi 
GOP_UpdateCurrentOnce(void * pInstance,MS_U16 u16GopMask,MS_BOOL bUpdateOnce,MS_BOOL bSync)9995*53ee8cc1Swenshuai.xi MS_U32 GOP_UpdateCurrentOnce(void* pInstance, MS_U16 u16GopMask, MS_BOOL bUpdateOnce, MS_BOOL bSync)
9996*53ee8cc1Swenshuai.xi {
9997*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
9998*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
9999*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10000*53ee8cc1Swenshuai.xi #endif
10001*53ee8cc1Swenshuai.xi     MS_U16 u16GopIdx = 0;
10002*53ee8cc1Swenshuai.xi     for (u16GopIdx = 0; u16GopIdx < MAX_GOP_SUPPORT; u16GopIdx++)
10003*53ee8cc1Swenshuai.xi     {
10004*53ee8cc1Swenshuai.xi         if ((u16GopMask & (1<<u16GopIdx)) != 0)
10005*53ee8cc1Swenshuai.xi         {
10006*53ee8cc1Swenshuai.xi             g_pGOPCtxLocal->bUpdateRegOnce[u16GopIdx] = bUpdateOnce;
10007*53ee8cc1Swenshuai.xi         }
10008*53ee8cc1Swenshuai.xi     }
10009*53ee8cc1Swenshuai.xi     if(bUpdateOnce == FALSE)
10010*53ee8cc1Swenshuai.xi     {
10011*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_UpdateRegWithMaskSync(g_pGOPCtxLocal, u16GopMask, bSync);
10012*53ee8cc1Swenshuai.xi     }
10013*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10014*53ee8cc1Swenshuai.xi 
10015*53ee8cc1Swenshuai.xi }
10016*53ee8cc1Swenshuai.xi 
Ioctl_GOP_TriggerRegWriteIn(void * pInstance,MS_U32 gop,EN_GOP_UPDATE_TYPE update_type,MS_BOOL bEn,MS_BOOL bSync)10017*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_TriggerRegWriteIn(void* pInstance,MS_U32 gop, EN_GOP_UPDATE_TYPE update_type, MS_BOOL bEn, MS_BOOL bSync)
10018*53ee8cc1Swenshuai.xi {
10019*53ee8cc1Swenshuai.xi 
10020*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10021*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10022*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10023*53ee8cc1Swenshuai.xi #endif
10024*53ee8cc1Swenshuai.xi 
10025*53ee8cc1Swenshuai.xi     switch(update_type)
10026*53ee8cc1Swenshuai.xi     {
10027*53ee8cc1Swenshuai.xi         case E_GOP_UPDATE_FORCEWRITE:
10028*53ee8cc1Swenshuai.xi         {
10029*53ee8cc1Swenshuai.xi             GOP_TriggerRegWriteIn(pInstance,gop, bEn, bSync);
10030*53ee8cc1Swenshuai.xi             break;
10031*53ee8cc1Swenshuai.xi         }
10032*53ee8cc1Swenshuai.xi         case E_GOP_UPDATE_CURRENT_ONCE:
10033*53ee8cc1Swenshuai.xi         {
10034*53ee8cc1Swenshuai.xi             GOP_UpdateCurrentOnce(pInstance, gop, bEn, bSync);
10035*53ee8cc1Swenshuai.xi             break;
10036*53ee8cc1Swenshuai.xi         }
10037*53ee8cc1Swenshuai.xi         default:
10038*53ee8cc1Swenshuai.xi         case E_GOP_UPDATE_ONCE:
10039*53ee8cc1Swenshuai.xi         {
10040*53ee8cc1Swenshuai.xi             GOP_UpdateOnce(pInstance,gop, bEn, bSync);
10041*53ee8cc1Swenshuai.xi             break;
10042*53ee8cc1Swenshuai.xi         }
10043*53ee8cc1Swenshuai.xi 
10044*53ee8cc1Swenshuai.xi     }
10045*53ee8cc1Swenshuai.xi 
10046*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10047*53ee8cc1Swenshuai.xi 
10048*53ee8cc1Swenshuai.xi }
10049*53ee8cc1Swenshuai.xi 
10050*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Select(void * pInstance,EN_GOP_SELECT_TYPE sel,MS_U32 id,MS_U32 * pSet)10051*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Select(void* pInstance,EN_GOP_SELECT_TYPE sel, MS_U32 id, MS_U32* pSet)
10052*53ee8cc1Swenshuai.xi {
10053*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10054*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10055*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10056*53ee8cc1Swenshuai.xi #endif
10057*53ee8cc1Swenshuai.xi     DRV_GOP_CBFmtInfo* FmtInfo = (DRV_GOP_CBFmtInfo*)pSet;
10058*53ee8cc1Swenshuai.xi 
10059*53ee8cc1Swenshuai.xi     switch(sel)
10060*53ee8cc1Swenshuai.xi     {
10061*53ee8cc1Swenshuai.xi         case EN_GOP_SEL_GOP:
10062*53ee8cc1Swenshuai.xi         {
10063*53ee8cc1Swenshuai.xi             if (!_GOP_IsGopNumValid(pInstance,id))
10064*53ee8cc1Swenshuai.xi             {
10065*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GOP %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)id);
10066*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10067*53ee8cc1Swenshuai.xi             }
10068*53ee8cc1Swenshuai.xi             MDrv_GOP_Sel(g_pGOPCtxLocal, id);
10069*53ee8cc1Swenshuai.xi             break;
10070*53ee8cc1Swenshuai.xi         }
10071*53ee8cc1Swenshuai.xi         case EN_GOP_SEL_GWIN:
10072*53ee8cc1Swenshuai.xi             break;
10073*53ee8cc1Swenshuai.xi         case EN_GOP_SEL_FB:
10074*53ee8cc1Swenshuai.xi         {
10075*53ee8cc1Swenshuai.xi             MS_U16 fbFmt;
10076*53ee8cc1Swenshuai.xi             GOP_WinFB_INFO* pwinFB;
10077*53ee8cc1Swenshuai.xi 
10078*53ee8cc1Swenshuai.xi            // printf("[%s] We DO NOT suggest to use this function\n",__FUNCTION__);
10079*53ee8cc1Swenshuai.xi            // printf("[%s] Please use GFX MApi_GFX_SetDstBufferInfo() !!\n",__FUNCTION__);
10080*53ee8cc1Swenshuai.xi 
10081*53ee8cc1Swenshuai.xi             if (!_GOP_IsFbIdValid(pInstance,id))
10082*53ee8cc1Swenshuai.xi             {
10083*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]FbId %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)id);
10084*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10085*53ee8cc1Swenshuai.xi             }
10086*53ee8cc1Swenshuai.xi             pwinFB = _GetWinFB(pInstance,id);
10087*53ee8cc1Swenshuai.xi 
10088*53ee8cc1Swenshuai.xi             if(pwinFB == NULL)
10089*53ee8cc1Swenshuai.xi             {
10090*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]GetWinFB Fail : WrongFBID=%td\n",__FUNCTION__,__LINE__,(ptrdiff_t)id);
10091*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10092*53ee8cc1Swenshuai.xi             }
10093*53ee8cc1Swenshuai.xi 
10094*53ee8cc1Swenshuai.xi             if(0 == pwinFB->in_use)
10095*53ee8cc1Swenshuai.xi             {
10096*53ee8cc1Swenshuai.xi                 msWarning(ERR_FB_ID_NOT_ALLOCATED);
10097*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d]: u32fbId=%td is not in existence\n",__FUNCTION__,__LINE__,(ptrdiff_t)id);
10098*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10099*53ee8cc1Swenshuai.xi             }
10100*53ee8cc1Swenshuai.xi 
10101*53ee8cc1Swenshuai.xi             fbFmt = pwinFB->fbFmt;
10102*53ee8cc1Swenshuai.xi             if ( (pwinFB->fbFmt & 0xFF) == E_MS_FMT_ARGB1555 )
10103*53ee8cc1Swenshuai.xi                 fbFmt = E_MS_FMT_ARGB1555_DST | (E_MS_FMT_ARGB1555_DST << 8);
10104*53ee8cc1Swenshuai.xi 
10105*53ee8cc1Swenshuai.xi             if(fpSetFBFmt != NULL)
10106*53ee8cc1Swenshuai.xi             {
10107*53ee8cc1Swenshuai.xi                 fpSetFBFmt(pwinFB->pitch, pwinFB->addr,fbFmt);
10108*53ee8cc1Swenshuai.xi                 FmtInfo->u64Addr = pwinFB->addr;
10109*53ee8cc1Swenshuai.xi                 FmtInfo->u16Pitch = pwinFB->pitch;
10110*53ee8cc1Swenshuai.xi                 FmtInfo->u16Fmt = fbFmt;
10111*53ee8cc1Swenshuai.xi             }
10112*53ee8cc1Swenshuai.xi             else
10113*53ee8cc1Swenshuai.xi             {
10114*53ee8cc1Swenshuai.xi                 FmtInfo->u64Addr = pwinFB->addr;
10115*53ee8cc1Swenshuai.xi                 FmtInfo->u16Pitch = pwinFB->pitch;
10116*53ee8cc1Swenshuai.xi                 FmtInfo->u16Fmt = fbFmt;
10117*53ee8cc1Swenshuai.xi             }
10118*53ee8cc1Swenshuai.xi             break;
10119*53ee8cc1Swenshuai.xi         }
10120*53ee8cc1Swenshuai.xi     }
10121*53ee8cc1Swenshuai.xi 
10122*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10123*53ee8cc1Swenshuai.xi 
10124*53ee8cc1Swenshuai.xi }
10125*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Register_CB(void * pInstance,GOP_CB_TYPE cb_type,void * pCB,MS_U32 u32Size)10126*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Register_CB(void* pInstance,GOP_CB_TYPE cb_type, void* pCB, MS_U32 u32Size)
10127*53ee8cc1Swenshuai.xi {
10128*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
10129*53ee8cc1Swenshuai.xi 
10130*53ee8cc1Swenshuai.xi #else
10131*53ee8cc1Swenshuai.xi     switch(cb_type)
10132*53ee8cc1Swenshuai.xi     {
10133*53ee8cc1Swenshuai.xi         case GOP_CB_XC_INTERLACE:
10134*53ee8cc1Swenshuai.xi         {
10135*53ee8cc1Swenshuai.xi             _fpXCIsInterlace = pCB;
10136*53ee8cc1Swenshuai.xi             break;
10137*53ee8cc1Swenshuai.xi         }
10138*53ee8cc1Swenshuai.xi         case GOP_CB_XC_REDUCE_BW:
10139*53ee8cc1Swenshuai.xi         {
10140*53ee8cc1Swenshuai.xi             fpXCReduceBWForOSD = pCB;
10141*53ee8cc1Swenshuai.xi             break;
10142*53ee8cc1Swenshuai.xi         }
10143*53ee8cc1Swenshuai.xi         case GOP_CB_XC_PANEL_HSTART:
10144*53ee8cc1Swenshuai.xi         {
10145*53ee8cc1Swenshuai.xi             _fpXCGetCapHStart = pCB;
10146*53ee8cc1Swenshuai.xi             break;
10147*53ee8cc1Swenshuai.xi         }
10148*53ee8cc1Swenshuai.xi         case GOP_CB_GFX_FBFMT:
10149*53ee8cc1Swenshuai.xi         {
10150*53ee8cc1Swenshuai.xi             fpSetFBFmt = pCB;
10151*53ee8cc1Swenshuai.xi             break;
10152*53ee8cc1Swenshuai.xi         }
10153*53ee8cc1Swenshuai.xi         case GOP_CB_EVENT_NOTIFY:
10154*53ee8cc1Swenshuai.xi         {
10155*53ee8cc1Swenshuai.xi             fpEventNotify = pCB;
10156*53ee8cc1Swenshuai.xi             break;
10157*53ee8cc1Swenshuai.xi         }
10158*53ee8cc1Swenshuai.xi         case GOP_CB_DWIN_INFO:
10159*53ee8cc1Swenshuai.xi         {
10160*53ee8cc1Swenshuai.xi             fpXCSetDwinInfo = pCB;
10161*53ee8cc1Swenshuai.xi             break;
10162*53ee8cc1Swenshuai.xi         }
10163*53ee8cc1Swenshuai.xi         default:
10164*53ee8cc1Swenshuai.xi         {
10165*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d] invalid input call back function type\n",__FUNCTION__,__LINE__);
10166*53ee8cc1Swenshuai.xi             return GOP_API_INVALID_PARAMETERS;
10167*53ee8cc1Swenshuai.xi         }
10168*53ee8cc1Swenshuai.xi     }
10169*53ee8cc1Swenshuai.xi #endif
10170*53ee8cc1Swenshuai.xi     return (GOP_API_SUCCESS);
10171*53ee8cc1Swenshuai.xi }
10172*53ee8cc1Swenshuai.xi 
10173*53ee8cc1Swenshuai.xi 
10174*53ee8cc1Swenshuai.xi 
10175*53ee8cc1Swenshuai.xi 
10176*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Palette_EntrySet(void * pInstance,PGOP_PALETTE_ENTRY pClutEntry)10177*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Palette_EntrySet(void* pInstance,PGOP_PALETTE_ENTRY pClutEntry)
10178*53ee8cc1Swenshuai.xi {
10179*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10180*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10181*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10182*53ee8cc1Swenshuai.xi #endif
10183*53ee8cc1Swenshuai.xi 
10184*53ee8cc1Swenshuai.xi     if(pClutEntry->palSrc == E_GOP_4G_PALETTE)
10185*53ee8cc1Swenshuai.xi     {
10186*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetPaletteOpt(g_pGOPCtxLocal,pClutEntry->gop_idx, (DRV_GopPaletteEntry*)pClutEntry->pClut, pClutEntry->start, pClutEntry->end, E_DRV_GOP_PAL_ARGB8888);
10187*53ee8cc1Swenshuai.xi     }
10188*53ee8cc1Swenshuai.xi     else
10189*53ee8cc1Swenshuai.xi     {
10190*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_2GSetPaletteOpt(g_pGOPCtxLocal,pClutEntry->gop_idx, (DRV_GopPaletteEntry*)pClutEntry->pClut, pClutEntry->start, pClutEntry->end);
10191*53ee8cc1Swenshuai.xi     }
10192*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10193*53ee8cc1Swenshuai.xi 
10194*53ee8cc1Swenshuai.xi }
10195*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Palette_EntryGet(void * pInstance,PGOP_PALETTE_ENTRY pClutEntry)10196*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Palette_EntryGet(void* pInstance,PGOP_PALETTE_ENTRY pClutEntry)
10197*53ee8cc1Swenshuai.xi {
10198*53ee8cc1Swenshuai.xi     MS_U32 i =0;
10199*53ee8cc1Swenshuai.xi     MS_U32 PalVal=0;
10200*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10201*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10202*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10203*53ee8cc1Swenshuai.xi #endif
10204*53ee8cc1Swenshuai.xi 
10205*53ee8cc1Swenshuai.xi     if(pClutEntry->palSrc == E_GOP_4G_PALETTE)
10206*53ee8cc1Swenshuai.xi     {
10207*53ee8cc1Swenshuai.xi         for(i=pClutEntry->start; i< pClutEntry->end; i++)
10208*53ee8cc1Swenshuai.xi         {
10209*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_ReadPalette(g_pGOPCtxLocal,pClutEntry->gop_idx, i, &PalVal);
10210*53ee8cc1Swenshuai.xi             *pClutEntry->pClut = PalVal;
10211*53ee8cc1Swenshuai.xi         }
10212*53ee8cc1Swenshuai.xi     }
10213*53ee8cc1Swenshuai.xi     else
10214*53ee8cc1Swenshuai.xi     {
10215*53ee8cc1Swenshuai.xi         for(i=pClutEntry->start; i< pClutEntry->end; i++)
10216*53ee8cc1Swenshuai.xi         {
10217*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_2GReadPalette(g_pGOPCtxLocal,pClutEntry->gop_idx, i, &PalVal);
10218*53ee8cc1Swenshuai.xi         }
10219*53ee8cc1Swenshuai.xi     }
10220*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10221*53ee8cc1Swenshuai.xi 
10222*53ee8cc1Swenshuai.xi }
10223*53ee8cc1Swenshuai.xi 
10224*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Palette_Set_Config(void * pInstance,MS_U32 gop,DRV_GopPalReadType type,EN_GOP_PALETTE src)10225*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Palette_Set_Config(void* pInstance,MS_U32 gop, DRV_GopPalReadType type,EN_GOP_PALETTE src)
10226*53ee8cc1Swenshuai.xi {
10227*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10228*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10229*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10230*53ee8cc1Swenshuai.xi #endif
10231*53ee8cc1Swenshuai.xi 
10232*53ee8cc1Swenshuai.xi     if(src == E_GOP_4G_PALETTE)
10233*53ee8cc1Swenshuai.xi     {
10234*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_SetPaletteRead(g_pGOPCtxLocal,gop, type);
10235*53ee8cc1Swenshuai.xi     }
10236*53ee8cc1Swenshuai.xi     else
10237*53ee8cc1Swenshuai.xi     {
10238*53ee8cc1Swenshuai.xi         MDrv_GOP_GWIN_2GSetPaletteRead(g_pGOPCtxLocal,gop, type);
10239*53ee8cc1Swenshuai.xi     }
10240*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10241*53ee8cc1Swenshuai.xi }
10242*53ee8cc1Swenshuai.xi 
Ioctl_GOP_MISC(void * pInstance,EN_GOP_MISC_TYPE type,MS_U32 * pSet,MS_U32 u32Size)10243*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_MISC(void* pInstance,EN_GOP_MISC_TYPE type, MS_U32* pSet, MS_U32 u32Size)
10244*53ee8cc1Swenshuai.xi {
10245*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10246*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10247*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10248*53ee8cc1Swenshuai.xi #endif
10249*53ee8cc1Swenshuai.xi 
10250*53ee8cc1Swenshuai.xi     switch(type)
10251*53ee8cc1Swenshuai.xi     {
10252*53ee8cc1Swenshuai.xi         case E_GOP_MISC_ENABLE_T3D:
10253*53ee8cc1Swenshuai.xi         {
10254*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
10255*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
10256*53ee8cc1Swenshuai.xi             {
10257*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10258*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10259*53ee8cc1Swenshuai.xi             }
10260*53ee8cc1Swenshuai.xi 
10261*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
10262*53ee8cc1Swenshuai.xi             GOP_GWIN_EnableT3DMode(pInstance,bEn);
10263*53ee8cc1Swenshuai.xi             break;
10264*53ee8cc1Swenshuai.xi         }
10265*53ee8cc1Swenshuai.xi         case E_GOP_MISC_SET_CAPTURE_CLK:
10266*53ee8cc1Swenshuai.xi         {
10267*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
10268*53ee8cc1Swenshuai.xi             {
10269*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10270*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10271*53ee8cc1Swenshuai.xi             }
10272*53ee8cc1Swenshuai.xi             MDrv_GOP_SetClkForCapture(g_pGOPCtxLocal, GOP_DRV_DWIN_SRC_OP);
10273*53ee8cc1Swenshuai.xi             break;
10274*53ee8cc1Swenshuai.xi         }
10275*53ee8cc1Swenshuai.xi         case E_GOP_MISC_POWER_OFF:
10276*53ee8cc1Swenshuai.xi         {
10277*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
10278*53ee8cc1Swenshuai.xi             {
10279*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10280*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10281*53ee8cc1Swenshuai.xi             }
10282*53ee8cc1Swenshuai.xi             GOP_PowerOff(pInstance);
10283*53ee8cc1Swenshuai.xi             break;
10284*53ee8cc1Swenshuai.xi         }
10285*53ee8cc1Swenshuai.xi         case E_GOP_MISC_POWER_ON:
10286*53ee8cc1Swenshuai.xi         {
10287*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
10288*53ee8cc1Swenshuai.xi             {
10289*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10290*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10291*53ee8cc1Swenshuai.xi             }
10292*53ee8cc1Swenshuai.xi             GOP_PowerOn(pInstance);
10293*53ee8cc1Swenshuai.xi             break;
10294*53ee8cc1Swenshuai.xi         }
10295*53ee8cc1Swenshuai.xi         case E_GOP_MISC_GET_RT_STATUS:
10296*53ee8cc1Swenshuai.xi         {
10297*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_ApiStatus))
10298*53ee8cc1Swenshuai.xi             {
10299*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10300*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10301*53ee8cc1Swenshuai.xi             }
10302*53ee8cc1Swenshuai.xi             GOP_ApiStatus *pGopApiSts = (GOP_ApiStatus *)pSet;
10303*53ee8cc1Swenshuai.xi             GOP_GetRTStatus(pInstance,pGopApiSts);
10304*53ee8cc1Swenshuai.xi             break;
10305*53ee8cc1Swenshuai.xi         }
10306*53ee8cc1Swenshuai.xi         case E_GOP_MISC_GET_INFO:
10307*53ee8cc1Swenshuai.xi         {
10308*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_ApiInfo))
10309*53ee8cc1Swenshuai.xi             {
10310*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10311*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10312*53ee8cc1Swenshuai.xi             }
10313*53ee8cc1Swenshuai.xi             GOP_ApiInfo *pGopApiInfo = (GOP_ApiInfo *)pSet;
10314*53ee8cc1Swenshuai.xi             GOP_GetInfo(pInstance,pGopApiInfo);
10315*53ee8cc1Swenshuai.xi             break;
10316*53ee8cc1Swenshuai.xi         }
10317*53ee8cc1Swenshuai.xi         case E_GOP_MISC_AT_EXIT:
10318*53ee8cc1Swenshuai.xi         {
10319*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
10320*53ee8cc1Swenshuai.xi             {
10321*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10322*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10323*53ee8cc1Swenshuai.xi             }
10324*53ee8cc1Swenshuai.xi             Ioctl_GOP_AtExit(pInstance);
10325*53ee8cc1Swenshuai.xi             break;
10326*53ee8cc1Swenshuai.xi         }
10327*53ee8cc1Swenshuai.xi         case E_GOP_MISC_OC_FB_INFO:
10328*53ee8cc1Swenshuai.xi         {
10329*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_OC_FB_INFO))
10330*53ee8cc1Swenshuai.xi             {
10331*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10332*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10333*53ee8cc1Swenshuai.xi             }
10334*53ee8cc1Swenshuai.xi             PGOP_OC_FB_INFO pOCFbInfo = (PGOP_OC_FB_INFO)(void*)pSet;
10335*53ee8cc1Swenshuai.xi             GOP_OC_SetOCFBinfo(pInstance,pOCFbInfo->u64Addr,pOCFbInfo->BankMode,pOCFbInfo->enBufSize);
10336*53ee8cc1Swenshuai.xi             break;
10337*53ee8cc1Swenshuai.xi         }
10338*53ee8cc1Swenshuai.xi         case E_GOP_MISC_TESTPATTERN_ALPHA:
10339*53ee8cc1Swenshuai.xi         {
10340*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
10341*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_BOOL))
10342*53ee8cc1Swenshuai.xi             {
10343*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10344*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10345*53ee8cc1Swenshuai.xi             }
10346*53ee8cc1Swenshuai.xi 
10347*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*pSet;
10348*53ee8cc1Swenshuai.xi             GOP_TestPatternAlpha_Enable(pInstance,bEn);
10349*53ee8cc1Swenshuai.xi             break;
10350*53ee8cc1Swenshuai.xi         }
10351*53ee8cc1Swenshuai.xi         case E_GOP_MISC_DELETE_GWINSIZE:
10352*53ee8cc1Swenshuai.xi         {
10353*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_DeleteWinSize_PARAM))
10354*53ee8cc1Swenshuai.xi             {
10355*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10356*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10357*53ee8cc1Swenshuai.xi             }
10358*53ee8cc1Swenshuai.xi 
10359*53ee8cc1Swenshuai.xi             GOP_DeleteWinSize_PARAM* gop_VaildSize = (GOP_DeleteWinSize_PARAM*)pSet;
10360*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_DeleteWinHVSize(g_pGOPCtxLocal, gop_VaildSize->u32GOP_idx, gop_VaildSize->u32HSize, gop_VaildSize->u32VSize);
10361*53ee8cc1Swenshuai.xi             break;
10362*53ee8cc1Swenshuai.xi         }
10363*53ee8cc1Swenshuai.xi         case E_GOP_MISC_SET_DBG_LEVEL:
10364*53ee8cc1Swenshuai.xi         {
10365*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U32))
10366*53ee8cc1Swenshuai.xi             {
10367*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10368*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10369*53ee8cc1Swenshuai.xi             }
10370*53ee8cc1Swenshuai.xi             u32GOPDbgLevel_mapi= (MS_U32)*pSet;
10371*53ee8cc1Swenshuai.xi             MDrv_GOP_SetDbgLevel(*pSet);
10372*53ee8cc1Swenshuai.xi             break;
10373*53ee8cc1Swenshuai.xi         }
10374*53ee8cc1Swenshuai.xi     }
10375*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10376*53ee8cc1Swenshuai.xi }
10377*53ee8cc1Swenshuai.xi 
Ioctl_GOP_PowerState(void * pInstance,MS_U32 u32PowerState,void * pModule)10378*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_PowerState(void* pInstance,MS_U32 u32PowerState, void* pModule)
10379*53ee8cc1Swenshuai.xi {
10380*53ee8cc1Swenshuai.xi     static MS_U16 u16ActWin = 0;
10381*53ee8cc1Swenshuai.xi 
10382*53ee8cc1Swenshuai.xi     MS_U8 i=0;
10383*53ee8cc1Swenshuai.xi     MS_U32 u32Return = GOP_API_FAIL;
10384*53ee8cc1Swenshuai.xi     MS_U8 u8GwinIdx = INVALID_GWIN_ID;
10385*53ee8cc1Swenshuai.xi     MS_U16 u16WinNum = 0;
10386*53ee8cc1Swenshuai.xi 
10387*53ee8cc1Swenshuai.xi     GOP_CTX_DRV_SHARED* pDrvGOPShared=NULL;
10388*53ee8cc1Swenshuai.xi     MS_BOOL bNeedInitShared = FALSE;
10389*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10390*53ee8cc1Swenshuai.xi         GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10391*53ee8cc1Swenshuai.xi         UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10392*53ee8cc1Swenshuai.xi #endif
10393*53ee8cc1Swenshuai.xi 
10394*53ee8cc1Swenshuai.xi     GOP_M_INFO("[%s][%d] IoctlGOP STR PowerState=%tx\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32PowerState);
10395*53ee8cc1Swenshuai.xi 
10396*53ee8cc1Swenshuai.xi     pDrvGOPShared = (GOP_CTX_DRV_SHARED*)MDrv_GOP_GetShareMemory(&bNeedInitShared);
10397*53ee8cc1Swenshuai.xi 
10398*53ee8cc1Swenshuai.xi     if(pDrvGOPShared->apiCtxShared.bEnableVsyncIntFlip ==FALSE)//Usr RedLine:GFLIP  Suspend/Resume
10399*53ee8cc1Swenshuai.xi     {
10400*53ee8cc1Swenshuai.xi         switch(u32PowerState)
10401*53ee8cc1Swenshuai.xi         {
10402*53ee8cc1Swenshuai.xi             case E_POWER_SUSPEND:
10403*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] IoctlGOP STR Suspend Start!!!!!\n",__FUNCTION__,__LINE__);
10404*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_PowerState(pInstance, u32PowerState, pModule);
10405*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] IoctlGOP STR Suspend End!!!!!\n",__FUNCTION__,__LINE__);
10406*53ee8cc1Swenshuai.xi                 u32Return=GOP_API_SUCCESS;
10407*53ee8cc1Swenshuai.xi                 break;
10408*53ee8cc1Swenshuai.xi             case E_POWER_RESUME:
10409*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] IoctlGOP Resume Start!!!!!\n",__FUNCTION__,__LINE__);
10410*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_PowerState(pInstance, u32PowerState, pModule);
10411*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] IoctlGOP STR Resume End!!!!!\n",__FUNCTION__,__LINE__);
10412*53ee8cc1Swenshuai.xi                 u32Return=GOP_API_SUCCESS;
10413*53ee8cc1Swenshuai.xi                 break;
10414*53ee8cc1Swenshuai.xi             default:
10415*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] PowerState:%tx not Implement now!!!\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32PowerState);
10416*53ee8cc1Swenshuai.xi                 break;
10417*53ee8cc1Swenshuai.xi         }
10418*53ee8cc1Swenshuai.xi     }
10419*53ee8cc1Swenshuai.xi     else//Kernel RedLine:GFLIP  Suspend/Resume
10420*53ee8cc1Swenshuai.xi     {
10421*53ee8cc1Swenshuai.xi         u16WinNum = (MS_U8)g_pGOPCtxLocal->pGopChipProperty->TotalGwinNum;
10422*53ee8cc1Swenshuai.xi 
10423*53ee8cc1Swenshuai.xi         switch(u32PowerState)
10424*53ee8cc1Swenshuai.xi         {
10425*53ee8cc1Swenshuai.xi             case E_POWER_SUSPEND:
10426*53ee8cc1Swenshuai.xi             {
10427*53ee8cc1Swenshuai.xi                 for(i = 0; i < u16WinNum ; i++)
10428*53ee8cc1Swenshuai.xi                 {
10429*53ee8cc1Swenshuai.xi                     if(GOP_GWIN_IsEnable(pInstance,i) == TRUE)
10430*53ee8cc1Swenshuai.xi                     {
10431*53ee8cc1Swenshuai.xi                         u16ActWin |= 1<<i;
10432*53ee8cc1Swenshuai.xi                         GOP_GWIN_SetEnable(pInstance,i, FALSE);
10433*53ee8cc1Swenshuai.xi                     }
10434*53ee8cc1Swenshuai.xi                 }
10435*53ee8cc1Swenshuai.xi 
10436*53ee8cc1Swenshuai.xi             }
10437*53ee8cc1Swenshuai.xi                 break;
10438*53ee8cc1Swenshuai.xi             case E_POWER_RESUME:
10439*53ee8cc1Swenshuai.xi             {
10440*53ee8cc1Swenshuai.xi                 if (u16ActWin != INVALID_GWIN_ID)
10441*53ee8cc1Swenshuai.xi                 {
10442*53ee8cc1Swenshuai.xi                     for (u8GwinIdx = 0; u8GwinIdx < u16WinNum; u8GwinIdx++)
10443*53ee8cc1Swenshuai.xi                     {
10444*53ee8cc1Swenshuai.xi                         if (0 != (u16ActWin & (1<<u8GwinIdx)))
10445*53ee8cc1Swenshuai.xi                         {
10446*53ee8cc1Swenshuai.xi                             GOP_GWIN_SetEnable(pInstance,u8GwinIdx, TRUE);
10447*53ee8cc1Swenshuai.xi                             GOP_GWIN_SetForceWrite(pInstance,TRUE);
10448*53ee8cc1Swenshuai.xi     						GOP_GWIN_SetForceWrite(pInstance,FALSE);
10449*53ee8cc1Swenshuai.xi                         }
10450*53ee8cc1Swenshuai.xi                     }
10451*53ee8cc1Swenshuai.xi                 }
10452*53ee8cc1Swenshuai.xi                 else
10453*53ee8cc1Swenshuai.xi                 {
10454*53ee8cc1Swenshuai.xi                     GOP_M_INFO("[%s] Error!!! Need suspend first!!!\n",__FUNCTION__);
10455*53ee8cc1Swenshuai.xi                 }
10456*53ee8cc1Swenshuai.xi                 u16ActWin = 0;
10457*53ee8cc1Swenshuai.xi             }
10458*53ee8cc1Swenshuai.xi                 break;
10459*53ee8cc1Swenshuai.xi             default:
10460*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] PowerState:%tx not Implement now!!!\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32PowerState);
10461*53ee8cc1Swenshuai.xi                 break;
10462*53ee8cc1Swenshuai.xi         }
10463*53ee8cc1Swenshuai.xi         u32Return=GOP_API_SUCCESS;
10464*53ee8cc1Swenshuai.xi     }
10465*53ee8cc1Swenshuai.xi 
10466*53ee8cc1Swenshuai.xi     return u32Return;
10467*53ee8cc1Swenshuai.xi }
10468*53ee8cc1Swenshuai.xi 
Ioctl_GOP_PINPON(void * pInstance,EN_GOP_PINPON_PROPERTY en_pro,MS_U32 * pSet,MS_U32 u32Size)10469*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_PINPON(void* pInstance,EN_GOP_PINPON_PROPERTY en_pro, MS_U32* pSet, MS_U32 u32Size)
10470*53ee8cc1Swenshuai.xi {
10471*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10472*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10473*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10474*53ee8cc1Swenshuai.xi #endif
10475*53ee8cc1Swenshuai.xi     switch(en_pro)
10476*53ee8cc1Swenshuai.xi     {
10477*53ee8cc1Swenshuai.xi         case E_GOP_SET_PINPON:
10478*53ee8cc1Swenshuai.xi         {
10479*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_SET_PINPON_INFO))
10480*53ee8cc1Swenshuai.xi             {
10481*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10482*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10483*53ee8cc1Swenshuai.xi             }
10484*53ee8cc1Swenshuai.xi             PGOP_SET_PINPON_INFO pPINPONInfo = (PGOP_SET_PINPON_INFO)pSet;
10485*53ee8cc1Swenshuai.xi 
10486*53ee8cc1Swenshuai.xi             MS_U8 u8GOP;
10487*53ee8cc1Swenshuai.xi             MS_U8 u8FirstGwinByGOP;
10488*53ee8cc1Swenshuai.xi 
10489*53ee8cc1Swenshuai.xi             u8GOP = MDrv_DumpGopByGwinId(g_pGOPCtxLocal, pPINPONInfo->GwinId);
10490*53ee8cc1Swenshuai.xi             u8FirstGwinByGOP = MDrv_GOP_SelGwinIdByGOP(g_pGOPCtxLocal, u8GOP, 0);
10491*53ee8cc1Swenshuai.xi 
10492*53ee8cc1Swenshuai.xi             //check it is the first gwin on this GOP
10493*53ee8cc1Swenshuai.xi             if(pPINPONInfo->GwinId != u8FirstGwinByGOP)
10494*53ee8cc1Swenshuai.xi             {
10495*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] gwin:%d PINPON mode only support the first gwin on GOP:%d\n",__FUNCTION__,__LINE__,pPINPONInfo->GwinId,u8GOP);
10496*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10497*53ee8cc1Swenshuai.xi             }
10498*53ee8cc1Swenshuai.xi 
10499*53ee8cc1Swenshuai.xi             MDrv_GOP_Set_PINPON(g_pGOPCtxLocal, u8GOP, pPINPONInfo->bEnable, pPINPONInfo->mode);
10500*53ee8cc1Swenshuai.xi             break;
10501*53ee8cc1Swenshuai.xi         }
10502*53ee8cc1Swenshuai.xi     }
10503*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10504*53ee8cc1Swenshuai.xi }
10505*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Fade(void * pInstance,EN_GOP_FADE_SET_TYPE type,MS_U32 * pSet,MS_U32 u32Size)10506*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Fade(void* pInstance,EN_GOP_FADE_SET_TYPE type, MS_U32* pSet, MS_U32 u32Size)
10507*53ee8cc1Swenshuai.xi {
10508*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10509*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10510*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10511*53ee8cc1Swenshuai.xi #endif
10512*53ee8cc1Swenshuai.xi     E_GOP_API_Result ret = GOP_API_FAIL;
10513*53ee8cc1Swenshuai.xi     switch(type)
10514*53ee8cc1Swenshuai.xi     {
10515*53ee8cc1Swenshuai.xi         case E_GOP_FADE_CONFIG:
10516*53ee8cc1Swenshuai.xi         {
10517*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_FADE_INFO))
10518*53ee8cc1Swenshuai.xi             {
10519*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10520*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10521*53ee8cc1Swenshuai.xi             }
10522*53ee8cc1Swenshuai.xi             PGOP_FADE_INFO pFadeInfo = (PGOP_FADE_INFO)pSet;
10523*53ee8cc1Swenshuai.xi             if (!_GOP_IsGwinIdValid(pInstance,pFadeInfo->gwin_idx))
10524*53ee8cc1Swenshuai.xi             {
10525*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] GWIN %td  is out of range\n",__FUNCTION__,__LINE__,(ptrdiff_t)pFadeInfo->gwin_idx);
10526*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10527*53ee8cc1Swenshuai.xi             }
10528*53ee8cc1Swenshuai.xi             if ( (pFadeInfo->eGwinFadeType!=E_GOP_GWIN_FADE_TYPE_IN) && (pFadeInfo->eGwinFadeType!=E_GOP_GWIN_FADE_TYPE_OUT))
10529*53ee8cc1Swenshuai.xi             {
10530*53ee8cc1Swenshuai.xi                 APIGOP_ASSERT(FALSE, GOP_M_FATAL("\n[%s][%d] unknow gop fade type", __FUNCTION__,__LINE__));
10531*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10532*53ee8cc1Swenshuai.xi             }
10533*53ee8cc1Swenshuai.xi 
10534*53ee8cc1Swenshuai.xi             ret= (E_GOP_API_Result)MDrv_GOP_GWIN_SetFadeInOut(g_pGOPCtxLocal, pFadeInfo->gwin_idx, (DRV_GOP_FADE_TYPE)pFadeInfo->eGwinFadeType, pFadeInfo->bEnable, pFadeInfo->u8FadeRate);
10535*53ee8cc1Swenshuai.xi             break;
10536*53ee8cc1Swenshuai.xi         }
10537*53ee8cc1Swenshuai.xi     }
10538*53ee8cc1Swenshuai.xi     return ret;
10539*53ee8cc1Swenshuai.xi }
10540*53ee8cc1Swenshuai.xi 
10541*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Scroll(void * pInstance,EN_GOP_SCROLL_TYPE type,MS_U32 * pSet,MS_U32 u32Size)10542*53ee8cc1Swenshuai.xi MS_U32 Ioctl_GOP_Scroll(void* pInstance,EN_GOP_SCROLL_TYPE type, MS_U32* pSet, MS_U32 u32Size)
10543*53ee8cc1Swenshuai.xi {
10544*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10545*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10546*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10547*53ee8cc1Swenshuai.xi #endif
10548*53ee8cc1Swenshuai.xi 
10549*53ee8cc1Swenshuai.xi     switch(type)
10550*53ee8cc1Swenshuai.xi     {
10551*53ee8cc1Swenshuai.xi         case E_GOP_SCROLL_CONFIG:
10552*53ee8cc1Swenshuai.xi         {
10553*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(GOP_SCROLL_INFO))
10554*53ee8cc1Swenshuai.xi             {
10555*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10556*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10557*53ee8cc1Swenshuai.xi             }
10558*53ee8cc1Swenshuai.xi             PGOP_SCROLL_INFO pScrollInfo = (PGOP_SCROLL_INFO)pSet;
10559*53ee8cc1Swenshuai.xi             if (pScrollInfo->type == E_GOP_SCROLL_DOWN || pScrollInfo->type == E_GOP_SCROLL_UP)
10560*53ee8cc1Swenshuai.xi             {
10561*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetVScroll(g_pGOPCtxLocal, pScrollInfo->u8WinId,  (E_GOP_SCROLL_TYPE)pScrollInfo->type,  (MS_U32)pScrollInfo->u16Offset, pScrollInfo->bEnable);
10562*53ee8cc1Swenshuai.xi             }
10563*53ee8cc1Swenshuai.xi             else
10564*53ee8cc1Swenshuai.xi             {
10565*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetHScroll(g_pGOPCtxLocal,pScrollInfo->u8WinId,  (E_GOP_SCROLL_TYPE)pScrollInfo->type,  (MS_U32)pScrollInfo->u16Offset, pScrollInfo->bEnable);
10566*53ee8cc1Swenshuai.xi             }
10567*53ee8cc1Swenshuai.xi             break;
10568*53ee8cc1Swenshuai.xi         }
10569*53ee8cc1Swenshuai.xi         case E_GOP_SCROLL_RATE:
10570*53ee8cc1Swenshuai.xi         {
10571*53ee8cc1Swenshuai.xi             MS_U8 u8rate;
10572*53ee8cc1Swenshuai.xi             if(u32Size != sizeof(MS_U8))
10573*53ee8cc1Swenshuai.xi             {
10574*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s][%d] size ERROR!! \n",__FUNCTION__,__LINE__);
10575*53ee8cc1Swenshuai.xi                 return GOP_API_FAIL;
10576*53ee8cc1Swenshuai.xi             }
10577*53ee8cc1Swenshuai.xi 
10578*53ee8cc1Swenshuai.xi             u8rate = (MS_U8)*pSet;
10579*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_SetScrollRate(g_pGOPCtxLocal, u8rate);
10580*53ee8cc1Swenshuai.xi             break;
10581*53ee8cc1Swenshuai.xi         }
10582*53ee8cc1Swenshuai.xi     }
10583*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10584*53ee8cc1Swenshuai.xi }
10585*53ee8cc1Swenshuai.xi 
Ioctl_GOP_Interrupt(void * pInstance,MS_U8 u8Gop,MS_BOOL bEnable)10586*53ee8cc1Swenshuai.xi static int Ioctl_GOP_Interrupt(void* pInstance,MS_U8 u8Gop,MS_BOOL bEnable)
10587*53ee8cc1Swenshuai.xi {
10588*53ee8cc1Swenshuai.xi #ifdef INSTANT_PRIVATE
10589*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE* psGOPInstPri = NULL;
10590*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(pInstance, (void*)&psGOPInstPri);
10591*53ee8cc1Swenshuai.xi #endif
10592*53ee8cc1Swenshuai.xi 
10593*53ee8cc1Swenshuai.xi     MDrv_GOP_GWIN_Interrupt(g_pGOPCtxLocal,u8Gop,bEnable);
10594*53ee8cc1Swenshuai.xi     return GOP_API_SUCCESS;
10595*53ee8cc1Swenshuai.xi }
10596*53ee8cc1Swenshuai.xi 
Ioctl_GOP_AtExit(void * pInstance)10597*53ee8cc1Swenshuai.xi void Ioctl_GOP_AtExit(void* pInstance)
10598*53ee8cc1Swenshuai.xi {
10599*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10600*53ee8cc1Swenshuai.xi     GOP_AtExit(pInstance);
10601*53ee8cc1Swenshuai.xi #else
10602*53ee8cc1Swenshuai.xi     GOP_M_INFO("not enable MSOS_TYPE_LINUX\n");
10603*53ee8cc1Swenshuai.xi #endif
10604*53ee8cc1Swenshuai.xi }
10605*53ee8cc1Swenshuai.xi 
10606*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
GOPStr(MS_U32 u32PowerState,void * pModule)10607*53ee8cc1Swenshuai.xi MS_U32 GOPStr(MS_U32 u32PowerState, void* pModule)
10608*53ee8cc1Swenshuai.xi {
10609*53ee8cc1Swenshuai.xi     MS_U32 u32Return=UTOPIA_STATUS_FAIL;
10610*53ee8cc1Swenshuai.xi 
10611*53ee8cc1Swenshuai.xi #if(GFLIP_ENABLE==FALSE)
10612*53ee8cc1Swenshuai.xi     switch(u32PowerState)
10613*53ee8cc1Swenshuai.xi     {
10614*53ee8cc1Swenshuai.xi         case E_POWER_SUSPEND:
10615*53ee8cc1Swenshuai.xi             GOP_M_INFO("[%s][%d] Kernel STR Suspend Start!!!!!\n",__FUNCTION__,__LINE__);
10616*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_PowerState(NULL, u32PowerState, pModule);
10617*53ee8cc1Swenshuai.xi             GOP_M_INFO("[%s][%d] Kernel STR Suspend End!!!!!\n",__FUNCTION__,__LINE__);
10618*53ee8cc1Swenshuai.xi             u32Return=UTOPIA_STATUS_SUCCESS;
10619*53ee8cc1Swenshuai.xi             break;
10620*53ee8cc1Swenshuai.xi         case E_POWER_RESUME:
10621*53ee8cc1Swenshuai.xi             GOP_M_INFO("[%s][%d] Kernel STR Resume Start!!!!!\n",__FUNCTION__,__LINE__);
10622*53ee8cc1Swenshuai.xi             MDrv_GOP_GWIN_PowerState(NULL, u32PowerState, pModule);
10623*53ee8cc1Swenshuai.xi             GOP_M_INFO("[%s][%d] Kernel STR Resume End!!!!!\n",__FUNCTION__,__LINE__);
10624*53ee8cc1Swenshuai.xi             u32Return=UTOPIA_STATUS_SUCCESS;
10625*53ee8cc1Swenshuai.xi             break;
10626*53ee8cc1Swenshuai.xi         default:
10627*53ee8cc1Swenshuai.xi             GOP_M_ERR("[%s][%d] PowerState:%x not Implement now!!!\n",__FUNCTION__,__LINE__,u32PowerState);
10628*53ee8cc1Swenshuai.xi             break;
10629*53ee8cc1Swenshuai.xi     }
10630*53ee8cc1Swenshuai.xi #else
10631*53ee8cc1Swenshuai.xi //Kernel RedLine:GFLIP  Suspend/Resume
10632*53ee8cc1Swenshuai.xi     u32Return=UTOPIA_STATUS_SUCCESS;
10633*53ee8cc1Swenshuai.xi #endif
10634*53ee8cc1Swenshuai.xi     return u32Return;
10635*53ee8cc1Swenshuai.xi }
10636*53ee8cc1Swenshuai.xi #endif
10637*53ee8cc1Swenshuai.xi 
10638*53ee8cc1Swenshuai.xi #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
GOPMdbIoctl(MS_U32 u32Cmd,const void * const pArgs)10639*53ee8cc1Swenshuai.xi MS_U32 GOPMdbIoctl(MS_U32 u32Cmd, const void* const pArgs)
10640*53ee8cc1Swenshuai.xi {
10641*53ee8cc1Swenshuai.xi     MDBCMD_CMDLINE_PARAMETER *paraCmdLine;
10642*53ee8cc1Swenshuai.xi     MDBCMD_GETINFO_PARAMETER *paraGetInfo;
10643*53ee8cc1Swenshuai.xi     void* pInstance = NULL;
10644*53ee8cc1Swenshuai.xi     pInstance = UtopiaModuleGetLocalInstantList(MODULE_GOP, pInstance);
10645*53ee8cc1Swenshuai.xi 
10646*53ee8cc1Swenshuai.xi     switch(u32Cmd)
10647*53ee8cc1Swenshuai.xi     {
10648*53ee8cc1Swenshuai.xi         case MDBCMD_CMDLINE:
10649*53ee8cc1Swenshuai.xi             paraCmdLine = (MDBCMD_CMDLINE_PARAMETER *)pArgs;
10650*53ee8cc1Swenshuai.xi             //MdbPrint(paraCmdLine->u64ReqHdl,"LINE:%d, MDBCMD_CMDLINE\n", __LINE__);
10651*53ee8cc1Swenshuai.xi             //MdbPrint(paraCmdLine->u64ReqHdl,"u32CmdSize: %d\n", paraCmdLine->u32CmdSize);
10652*53ee8cc1Swenshuai.xi             //MdbPrint(paraCmdLine->u64ReqHdl,"pcCmdLine: %s\n", paraCmdLine->pcCmdLine);
10653*53ee8cc1Swenshuai.xi             MDrv_GOP_MDCMD_EchoCmd(pInstance, paraCmdLine->u64ReqHdl, paraCmdLine->pcCmdLine);
10654*53ee8cc1Swenshuai.xi             paraCmdLine->result = MDBRESULT_SUCCESS_FIN;
10655*53ee8cc1Swenshuai.xi             break;
10656*53ee8cc1Swenshuai.xi         case MDBCMD_GETINFO:
10657*53ee8cc1Swenshuai.xi             paraGetInfo = (MDBCMD_GETINFO_PARAMETER *)pArgs;
10658*53ee8cc1Swenshuai.xi             MDrv_GOP_MDCMD_GETINFO(pInstance, paraGetInfo->u64ReqHdl);
10659*53ee8cc1Swenshuai.xi             paraGetInfo->result = MDBRESULT_SUCCESS_FIN;
10660*53ee8cc1Swenshuai.xi             break;
10661*53ee8cc1Swenshuai.xi         default:
10662*53ee8cc1Swenshuai.xi             break;
10663*53ee8cc1Swenshuai.xi     }
10664*53ee8cc1Swenshuai.xi     return 0;
10665*53ee8cc1Swenshuai.xi }
10666*53ee8cc1Swenshuai.xi #endif
10667*53ee8cc1Swenshuai.xi 
10668*53ee8cc1Swenshuai.xi // this func will be call to init by utopia20 framework
GOPRegisterToUtopia(void)10669*53ee8cc1Swenshuai.xi void GOPRegisterToUtopia(void)
10670*53ee8cc1Swenshuai.xi {
10671*53ee8cc1Swenshuai.xi     // 1. deal with module
10672*53ee8cc1Swenshuai.xi     void* pUtopiaModule = NULL;
10673*53ee8cc1Swenshuai.xi 	UtopiaModuleCreate(MODULE_GOP, 8, &pUtopiaModule);
10674*53ee8cc1Swenshuai.xi     UtopiaModuleRegister(pUtopiaModule);
10675*53ee8cc1Swenshuai.xi     // register func for module, after register here, then ap call UtopiaOpen/UtopiaIoctl/UtopiaClose can call to these registered standard func
10676*53ee8cc1Swenshuai.xi     UtopiaModuleSetupFunctionPtr(pUtopiaModule, (FUtopiaOpen)GOPOpen, (FUtopiaClose)GOPClose, (FUtopiaIOctl)GOPIoctl);
10677*53ee8cc1Swenshuai.xi     #ifdef CONFIG_UTOPIA_PROC_DBG_SUPPORT
10678*53ee8cc1Swenshuai.xi     UtopiaModuleRegisterMdbNode("gop", (FUtopiaMdbIoctl)GOPMdbIoctl);
10679*53ee8cc1Swenshuai.xi     #endif
10680*53ee8cc1Swenshuai.xi     #if defined(MSOS_TYPE_LINUX_KERNEL)
10681*53ee8cc1Swenshuai.xi         UtopiaModuleSetupSTRFunctionPtr(pUtopiaModule, (FUtopiaSTR)GOPStr);
10682*53ee8cc1Swenshuai.xi         UtopiaModuleSetSTRPrivate(pUtopiaModule, sizeof(GFLIP_REGS_SAVE_AREA));
10683*53ee8cc1Swenshuai.xi     #endif
10684*53ee8cc1Swenshuai.xi 
10685*53ee8cc1Swenshuai.xi     // 2. deal with resource
10686*53ee8cc1Swenshuai.xi     void* psResource = NULL;
10687*53ee8cc1Swenshuai.xi     // start func to add res, call once will create 2 access in resource. Also can declare BDMA_POOL_ID_BDMA1 for another channel depend on driver owner.
10688*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceStart(pUtopiaModule, GOP_POOL_ID_GOP0);
10689*53ee8cc1Swenshuai.xi     // resource can alloc private for internal use, ex, BDMA_RESOURCE_PRIVATE
10690*53ee8cc1Swenshuai.xi     UtopiaResourceCreate("gop0", sizeof(GOP_RESOURCE_PRIVATE), &psResource);
10691*53ee8cc1Swenshuai.xi     // func to reg res
10692*53ee8cc1Swenshuai.xi     UtopiaResourceRegister(pUtopiaModule, psResource, GOP_POOL_ID_GOP0);
10693*53ee8cc1Swenshuai.xi 
10694*53ee8cc1Swenshuai.xi 	UtopiaModuleAddResourceEnd(pUtopiaModule, GOP_POOL_ID_GOP0);
10695*53ee8cc1Swenshuai.xi 
10696*53ee8cc1Swenshuai.xi 
10697*53ee8cc1Swenshuai.xi }
10698*53ee8cc1Swenshuai.xi 
GOPOpen(void ** ppInstance,const void * const pAttribute)10699*53ee8cc1Swenshuai.xi MS_U32 GOPOpen(void** ppInstance, const void* const pAttribute)
10700*53ee8cc1Swenshuai.xi {
10701*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE *pGopPri = NULL;
10702*53ee8cc1Swenshuai.xi 	GOP_M_INFO("\n[GOP INFO] gop open\n");
10703*53ee8cc1Swenshuai.xi     //UTOPIA_TRACE(MS_UTOPIA_DB_LEVEL_TRACE,printf("enter %s %d\n",__FUNCTION__,__LINE__));
10704*53ee8cc1Swenshuai.xi     // instance is allocated here, also can allocate private for internal use, ex, BDMA_INSTANT_PRIVATE
10705*53ee8cc1Swenshuai.xi     UtopiaInstanceCreate(sizeof(GOP_INSTANT_PRIVATE), ppInstance);
10706*53ee8cc1Swenshuai.xi     // setup func in private and assign the calling func in func ptr in instance private
10707*53ee8cc1Swenshuai.xi     UtopiaInstanceGetPrivate(*ppInstance, (void**)&pGopPri);
10708*53ee8cc1Swenshuai.xi 
10709*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
10710*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
10711*53ee8cc1Swenshuai.xi     extern MS_U32 MDrv_GFLIP_InitTimer(void);
10712*53ee8cc1Swenshuai.xi     if(_devGFLIPCnt==0)
10713*53ee8cc1Swenshuai.xi     {
10714*53ee8cc1Swenshuai.xi         MDrv_GFLIP_InitTimer();
10715*53ee8cc1Swenshuai.xi     }
10716*53ee8cc1Swenshuai.xi     _devGFLIPCnt++;
10717*53ee8cc1Swenshuai.xi #endif
10718*53ee8cc1Swenshuai.xi #endif
10719*53ee8cc1Swenshuai.xi 	return UTOPIA_STATUS_SUCCESS;
10720*53ee8cc1Swenshuai.xi }
10721*53ee8cc1Swenshuai.xi 
GOPIoctl(void * pInstance,MS_U32 u32Cmd,void * pArgs)10722*53ee8cc1Swenshuai.xi MS_U32 GOPIoctl(void* pInstance, MS_U32 u32Cmd, void* pArgs)
10723*53ee8cc1Swenshuai.xi {
10724*53ee8cc1Swenshuai.xi 	void*                       pModule         = NULL;
10725*53ee8cc1Swenshuai.xi 	UtopiaInstanceGetModule(pInstance, &pModule);
10726*53ee8cc1Swenshuai.xi     MS_U32                      u32Ret          = GOP_API_SUCCESS;
10727*53ee8cc1Swenshuai.xi     GOP_INSTANT_PRIVATE*        psGOPInstPri    = NULL;
10728*53ee8cc1Swenshuai.xi     MS_BOOL                     bLocked         = FALSE;
10729*53ee8cc1Swenshuai.xi 	UtopiaInstanceGetPrivate(pInstance, (void**)&psGOPInstPri);
10730*53ee8cc1Swenshuai.xi 
10731*53ee8cc1Swenshuai.xi     if(u32Cmd == MAPI_CMD_GOP_RESETPOOL)
10732*53ee8cc1Swenshuai.xi     {
10733*53ee8cc1Swenshuai.xi         GOP_CTX_DRV_SHARED* pDrvGOPShared=NULL;
10734*53ee8cc1Swenshuai.xi         MS_BOOL bNeedInitShared = FALSE;
10735*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10736*53ee8cc1Swenshuai.xi         pDrvGOPShared = (GOP_CTX_DRV_SHARED*)(void*)MDrv_GOP_GetShareMemory(&bNeedInitShared);
10737*53ee8cc1Swenshuai.xi         if(pDrvGOPShared == NULL)
10738*53ee8cc1Swenshuai.xi         {
10739*53ee8cc1Swenshuai.xi            GOP_M_ERR("[%s] [%d] Shm pointer is NULL!!!! \n",__FUNCTION__,__LINE__);
10740*53ee8cc1Swenshuai.xi            return UTOPIA_STATUS_FAIL;
10741*53ee8cc1Swenshuai.xi         }
10742*53ee8cc1Swenshuai.xi         if((pDrvGOPShared->apiCtxShared.GOPLockPid != 0))
10743*53ee8cc1Swenshuai.xi         {
10744*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX)
10745*53ee8cc1Swenshuai.xi             if (kill(pDrvGOPShared->apiCtxShared.GOPLockPid, 0) == ESRCH)
10746*53ee8cc1Swenshuai.xi #endif
10747*53ee8cc1Swenshuai.xi             {
10748*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] [%d] apiCtxShared.GOPLockPid 0x%tx not existance!!! \n",__FUNCTION__,__LINE__,  (ptrdiff_t)pDrvGOPShared->apiCtxShared.GOPLockPid);
10749*53ee8cc1Swenshuai.xi                 UtopiaModuleResetPool(pModule,GOP_POOL_ID_GOP0);
10750*53ee8cc1Swenshuai.xi             }
10751*53ee8cc1Swenshuai.xi         }
10752*53ee8cc1Swenshuai.xi #endif
10753*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_SUCCESS;
10754*53ee8cc1Swenshuai.xi     }
10755*53ee8cc1Swenshuai.xi 
10756*53ee8cc1Swenshuai.xi     if( (u32Cmd != MAPI_CMD_GOP_INTERRUPT) && (u32Cmd != MAPI_CMD_GOP_MUTEX) && (g_pGOPCtxLocal != NULL) && (g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid != MsOS_GetOSThreadID()) )
10757*53ee8cc1Swenshuai.xi     {
10758*53ee8cc1Swenshuai.xi         if(UtopiaResourceObtain(pModule, GOP_POOL_ID_GOP0, &(psGOPInstPri->pResource)) != 0)
10759*53ee8cc1Swenshuai.xi         {
10760*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s %d]UtopiaResourceObtainToInstant fail\n",__FUNCTION__,__LINE__);
10761*53ee8cc1Swenshuai.xi             return 0xFFFFFFFF;
10762*53ee8cc1Swenshuai.xi         }
10763*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10764*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = (GETPIDTYPE)getpid();
10765*53ee8cc1Swenshuai.xi #endif
10766*53ee8cc1Swenshuai.xi         bLocked=TRUE;
10767*53ee8cc1Swenshuai.xi     }
10768*53ee8cc1Swenshuai.xi     //printf("[%s] cmd:%lx\n",__FUNCTION__,u32Cmd);
10769*53ee8cc1Swenshuai.xi 
10770*53ee8cc1Swenshuai.xi     switch(u32Cmd)
10771*53ee8cc1Swenshuai.xi     {
10772*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_INIT:
10773*53ee8cc1Swenshuai.xi         {
10774*53ee8cc1Swenshuai.xi             PGOP_INIT_PARAM ptr = (PGOP_INIT_PARAM)pArgs;
10775*53ee8cc1Swenshuai.xi 
10776*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
10777*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_InitInfo))
10778*53ee8cc1Swenshuai.xi             {
10779*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] input structure size non match!! (input:%tx require:%tx\n",__FUNCTION__,__LINE__,(ptrdiff_t)ptr->u32Size, sizeof(GOP_INIT_PARAM));
10780*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
10781*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10782*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
10783*53ee8cc1Swenshuai.xi #endif
10784*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
10785*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
10786*53ee8cc1Swenshuai.xi             }
10787*53ee8cc1Swenshuai.xi #endif
10788*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Init(pInstance,ptr->gop_idx,(GOP_InitInfo*)(void*)ptr->pInfo);
10789*53ee8cc1Swenshuai.xi 
10790*53ee8cc1Swenshuai.xi             break;
10791*53ee8cc1Swenshuai.xi         }
10792*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_CHIPCAPS:
10793*53ee8cc1Swenshuai.xi         {
10794*53ee8cc1Swenshuai.xi             PGOP_GETCAPS_PARAM ptr = (PGOP_GETCAPS_PARAM)pArgs;
10795*53ee8cc1Swenshuai.xi 
10796*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetCaps(pInstance,(EN_GOP_CAPS)ptr->caps,ptr->pInfo,ptr->u32Size);
10797*53ee8cc1Swenshuai.xi 
10798*53ee8cc1Swenshuai.xi             break;
10799*53ee8cc1Swenshuai.xi         }
10800*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_CONFIG:
10801*53ee8cc1Swenshuai.xi         {
10802*53ee8cc1Swenshuai.xi             PGOP_SETCONFIG_PARAM ptr = (PGOP_SETCONFIG_PARAM)pArgs;
10803*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetConfig(pInstance,ptr->cfg_type, ptr->pCfg, ptr->u32Size);
10804*53ee8cc1Swenshuai.xi             break;
10805*53ee8cc1Swenshuai.xi 
10806*53ee8cc1Swenshuai.xi         }
10807*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_CONFIG:
10808*53ee8cc1Swenshuai.xi         {
10809*53ee8cc1Swenshuai.xi             PGOP_SETCONFIG_PARAM ptr = (PGOP_SETCONFIG_PARAM)pArgs;
10810*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetConfig(pInstance,ptr->cfg_type, ptr->pCfg, ptr->u32Size);
10811*53ee8cc1Swenshuai.xi             break;
10812*53ee8cc1Swenshuai.xi         }
10813*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_PROPERTY:
10814*53ee8cc1Swenshuai.xi         {
10815*53ee8cc1Swenshuai.xi             PGOP_SET_PROPERTY_PARAM ptr = (PGOP_SET_PROPERTY_PARAM)pArgs;
10816*53ee8cc1Swenshuai.xi 
10817*53ee8cc1Swenshuai.xi 
10818*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetProperty(pInstance,ptr->en_pro ,ptr->gop_idx, ptr->pSetting,ptr->u32Size);
10819*53ee8cc1Swenshuai.xi 
10820*53ee8cc1Swenshuai.xi             break;
10821*53ee8cc1Swenshuai.xi         }
10822*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_PROPERTY:
10823*53ee8cc1Swenshuai.xi         {
10824*53ee8cc1Swenshuai.xi             PGOP_SET_PROPERTY_PARAM ptr = (PGOP_SET_PROPERTY_PARAM)pArgs;
10825*53ee8cc1Swenshuai.xi 
10826*53ee8cc1Swenshuai.xi 
10827*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetProperty(pInstance,ptr->en_pro ,ptr->gop_idx, ptr->pSetting,ptr->u32Size);
10828*53ee8cc1Swenshuai.xi 
10829*53ee8cc1Swenshuai.xi             break;
10830*53ee8cc1Swenshuai.xi         }
10831*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_DST:
10832*53ee8cc1Swenshuai.xi         {
10833*53ee8cc1Swenshuai.xi             PGOP_SETDST_PARAM  ptr = (PGOP_SETDST_PARAM)pArgs;
10834*53ee8cc1Swenshuai.xi 
10835*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetDst(pInstance,ptr->gop_idx, ptr->en_dst);
10836*53ee8cc1Swenshuai.xi             break;
10837*53ee8cc1Swenshuai.xi         }
10838*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_DST:
10839*53ee8cc1Swenshuai.xi         {
10840*53ee8cc1Swenshuai.xi             PGOP_GETDST_PARAM  ptr = (PGOP_GETDST_PARAM)pArgs;
10841*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(EN_GOP_DST_TYPE))
10842*53ee8cc1Swenshuai.xi             {
10843*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] Cmd:%td input structure size non match!! (input:0x%tx require:0x%tx\n",__FUNCTION__,__LINE__,(ptrdiff_t)u32Cmd,(ptrdiff_t)ptr->u32Size, sizeof(EN_GOP_DST_TYPE));
10844*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
10845*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10846*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
10847*53ee8cc1Swenshuai.xi #endif
10848*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
10849*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
10850*53ee8cc1Swenshuai.xi             }
10851*53ee8cc1Swenshuai.xi 
10852*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetDst(pInstance,ptr->gop_idx, ptr->pDst);
10853*53ee8cc1Swenshuai.xi             break;
10854*53ee8cc1Swenshuai.xi         }
10855*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_MUX:
10856*53ee8cc1Swenshuai.xi         {
10857*53ee8cc1Swenshuai.xi             PGOP_SETMUX_PARAM  ptr = (PGOP_SETMUX_PARAM)pArgs;
10858*53ee8cc1Swenshuai.xi             //PGOP_MuxConfig  pMux = (PGOP_MuxConfig)ptr->pMuxInfo;
10859*53ee8cc1Swenshuai.xi             PGOP_SETMUX  pMux = (PGOP_SETMUX)ptr->pMuxInfo;
10860*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
10861*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_SETMUX))
10862*53ee8cc1Swenshuai.xi             {
10863*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
10864*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10865*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
10866*53ee8cc1Swenshuai.xi #endif
10867*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
10868*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
10869*53ee8cc1Swenshuai.xi             }
10870*53ee8cc1Swenshuai.xi #endif
10871*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetMux(pInstance,pMux, ptr->u32Size);
10872*53ee8cc1Swenshuai.xi             break;
10873*53ee8cc1Swenshuai.xi         }
10874*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_LAYER:
10875*53ee8cc1Swenshuai.xi         {
10876*53ee8cc1Swenshuai.xi             PGOP_SETLAYER_PARAM ptr = (PGOP_SETLAYER_PARAM)pArgs;
10877*53ee8cc1Swenshuai.xi             PGOP_SETLayer pLayer = (PGOP_SETLayer)ptr->pLayerInfo;
10878*53ee8cc1Swenshuai.xi             MS_U16 i = 0;
10879*53ee8cc1Swenshuai.xi             Gop_MuxSel enMux = E_GOP_MUX_INVAILD;
10880*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
10881*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_SETLayer))
10882*53ee8cc1Swenshuai.xi             {
10883*53ee8cc1Swenshuai.xi 	            g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
10884*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10885*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
10886*53ee8cc1Swenshuai.xi #endif
10887*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
10888*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
10889*53ee8cc1Swenshuai.xi             }
10890*53ee8cc1Swenshuai.xi #endif
10891*53ee8cc1Swenshuai.xi             if(g_pGOPCtxLocal == NULL)
10892*53ee8cc1Swenshuai.xi             {
10893*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_FAIL;
10894*53ee8cc1Swenshuai.xi             }
10895*53ee8cc1Swenshuai.xi             for (i = 0; i < pLayer->u32LayerCount; i++)
10896*53ee8cc1Swenshuai.xi             {
10897*53ee8cc1Swenshuai.xi                 MDrv_GOP_MapLayer2Mux(g_pGOPCtxLocal, pLayer->u32Layer[i], pLayer->u32Gop[i], (MS_U32 *)&enMux);
10898*53ee8cc1Swenshuai.xi                 MDrv_GOP_GWIN_SetMux(g_pGOPCtxLocal, pLayer->u32Gop[i], enMux);
10899*53ee8cc1Swenshuai.xi                 if (g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[pLayer->u32Gop[i]])
10900*53ee8cc1Swenshuai.xi                 {
10901*53ee8cc1Swenshuai.xi                     _GOP_InitHSPDByGOP(pInstance, pLayer->u32Gop[i]);
10902*53ee8cc1Swenshuai.xi                 }
10903*53ee8cc1Swenshuai.xi             }
10904*53ee8cc1Swenshuai.xi             break;
10905*53ee8cc1Swenshuai.xi         }
10906*53ee8cc1Swenshuai.xi 
10907*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_LAYER:
10908*53ee8cc1Swenshuai.xi         {
10909*53ee8cc1Swenshuai.xi             PGOP_SETLAYER_PARAM ptr = (PGOP_SETLAYER_PARAM)pArgs;
10910*53ee8cc1Swenshuai.xi             PGOP_SETLayer pLayer = (PGOP_SETLayer)ptr->pLayerInfo;
10911*53ee8cc1Swenshuai.xi             MS_U16 i = 0;
10912*53ee8cc1Swenshuai.xi             DRV_GOPDstType enDst[MAX_GOP_SUPPORT] = {E_DRV_GOP_DST_INVALID};
10913*53ee8cc1Swenshuai.xi             MS_BOOL bHasOP0 = FALSE;
10914*53ee8cc1Swenshuai.xi             MS_BOOL bHasDualOP0 = FALSE;
10915*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
10916*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_SETLayer))
10917*53ee8cc1Swenshuai.xi             {
10918*53ee8cc1Swenshuai.xi 	            g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
10919*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
10920*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
10921*53ee8cc1Swenshuai.xi #endif
10922*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
10923*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
10924*53ee8cc1Swenshuai.xi             }
10925*53ee8cc1Swenshuai.xi #endif
10926*53ee8cc1Swenshuai.xi             //get all gop dst
10927*53ee8cc1Swenshuai.xi             for (i = 0; i < MAX_GOP_SUPPORT; i++)
10928*53ee8cc1Swenshuai.xi             {
10929*53ee8cc1Swenshuai.xi                 enDst[i] = E_DRV_GOP_DST_INVALID;
10930*53ee8cc1Swenshuai.xi                 if (g_pGOPCtxLocal->pGOPCtxShared->bGopHasInitialized[i])
10931*53ee8cc1Swenshuai.xi                 {
10932*53ee8cc1Swenshuai.xi                     MDrv_GOP_GWIN_GetDstPlane(g_pGOPCtxLocal, i, &enDst[i]);
10933*53ee8cc1Swenshuai.xi                 }
10934*53ee8cc1Swenshuai.xi             }
10935*53ee8cc1Swenshuai.xi 
10936*53ee8cc1Swenshuai.xi             pLayer->u32LayerCount = 0;
10937*53ee8cc1Swenshuai.xi             // record all gop
10938*53ee8cc1Swenshuai.xi             for (i = 0; i < MAX_GOP_SUPPORT; i++)
10939*53ee8cc1Swenshuai.xi             {
10940*53ee8cc1Swenshuai.xi                 switch (enDst[i])
10941*53ee8cc1Swenshuai.xi                 {
10942*53ee8cc1Swenshuai.xi                     case E_DRV_GOP_DST_OP0:
10943*53ee8cc1Swenshuai.xi                     {
10944*53ee8cc1Swenshuai.xi                         if (!bHasOP0)
10945*53ee8cc1Swenshuai.xi                         {
10946*53ee8cc1Swenshuai.xi                             MS_U32 u32Layer = 0;
10947*53ee8cc1Swenshuai.xi                             // record all op gop
10948*53ee8cc1Swenshuai.xi                             for (u32Layer = 0; u32Layer < MAX_GOP_MUX_OPNum; u32Layer++)
10949*53ee8cc1Swenshuai.xi                             {
10950*53ee8cc1Swenshuai.xi                                 MS_U8 u8Gop = 0;
10951*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8Gop, g_pGOPCtxLocal->pGopChipProperty->GOP_MapLayer2Mux[u32Layer]);
10952*53ee8cc1Swenshuai.xi                                 if ((u8Gop < MAX_GOP_SUPPORT) && (enDst[u8Gop] == E_DRV_GOP_DST_OP0))
10953*53ee8cc1Swenshuai.xi                                 {
10954*53ee8cc1Swenshuai.xi                                     pLayer->u32Gop[pLayer->u32LayerCount] = u8Gop;
10955*53ee8cc1Swenshuai.xi                                     pLayer->u32Layer[pLayer->u32LayerCount] = u32Layer;
10956*53ee8cc1Swenshuai.xi                                     pLayer->u32LayerCount++;
10957*53ee8cc1Swenshuai.xi                                 }
10958*53ee8cc1Swenshuai.xi                             }
10959*53ee8cc1Swenshuai.xi                             bHasOP0 = TRUE;
10960*53ee8cc1Swenshuai.xi                         }
10961*53ee8cc1Swenshuai.xi                         break;
10962*53ee8cc1Swenshuai.xi                     }
10963*53ee8cc1Swenshuai.xi                     case E_DRV_GOP_DST_OP_DUAL_RATE:
10964*53ee8cc1Swenshuai.xi                         if (!bHasDualOP0)
10965*53ee8cc1Swenshuai.xi                         {
10966*53ee8cc1Swenshuai.xi                             MS_U32 u32Layer = 0;
10967*53ee8cc1Swenshuai.xi 
10968*53ee8cc1Swenshuai.xi                             for (u32Layer = 0; u32Layer < MAX_GOP_DualMUX_Num; u32Layer++)
10969*53ee8cc1Swenshuai.xi                             {
10970*53ee8cc1Swenshuai.xi                                 MS_U8 u8Gop = 0;
10971*53ee8cc1Swenshuai.xi                                 MDrv_GOP_GWIN_GetMux(g_pGOPCtxLocal, &u8Gop, g_pGOPCtxLocal->pGopChipProperty->GOP_MapLayer2DualOpMux[u32Layer]);
10972*53ee8cc1Swenshuai.xi                                 if ((u8Gop < MAX_GOP_SUPPORT) && (enDst[u8Gop] == E_DRV_GOP_DST_OP_DUAL_RATE))
10973*53ee8cc1Swenshuai.xi                                 {
10974*53ee8cc1Swenshuai.xi                                     pLayer->u32Gop[pLayer->u32LayerCount] = u8Gop;
10975*53ee8cc1Swenshuai.xi                                     pLayer->u32Layer[pLayer->u32LayerCount] = u32Layer;
10976*53ee8cc1Swenshuai.xi                                     pLayer->u32LayerCount++;
10977*53ee8cc1Swenshuai.xi                                 }
10978*53ee8cc1Swenshuai.xi                             }
10979*53ee8cc1Swenshuai.xi                             bHasDualOP0 = TRUE;
10980*53ee8cc1Swenshuai.xi                         }
10981*53ee8cc1Swenshuai.xi                         break;
10982*53ee8cc1Swenshuai.xi                     default:
10983*53ee8cc1Swenshuai.xi                         break;
10984*53ee8cc1Swenshuai.xi 
10985*53ee8cc1Swenshuai.xi                 }
10986*53ee8cc1Swenshuai.xi             }
10987*53ee8cc1Swenshuai.xi             break;
10988*53ee8cc1Swenshuai.xi         }
10989*53ee8cc1Swenshuai.xi 
10990*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_MIRROR:
10991*53ee8cc1Swenshuai.xi         {
10992*53ee8cc1Swenshuai.xi             PGOP_SETMIRROR_PARAM ptr = (PGOP_SETMIRROR_PARAM)pArgs;
10993*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetMirror(pInstance,ptr->gop_idx, ptr->dir);
10994*53ee8cc1Swenshuai.xi 
10995*53ee8cc1Swenshuai.xi             break;
10996*53ee8cc1Swenshuai.xi         }
10997*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_MIRROR:
10998*53ee8cc1Swenshuai.xi         {
10999*53ee8cc1Swenshuai.xi             PGOP_GETMIRROR_PARAM ptr = (PGOP_GETMIRROR_PARAM)pArgs;
11000*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetMirror(pInstance,ptr->gop_idx, ptr->pdir);
11001*53ee8cc1Swenshuai.xi 
11002*53ee8cc1Swenshuai.xi             break;
11003*53ee8cc1Swenshuai.xi         }
11004*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GET_STATUS:
11005*53ee8cc1Swenshuai.xi         {
11006*53ee8cc1Swenshuai.xi             PGOP_GET_STATUS_PARAM ptr = (PGOP_GET_STATUS_PARAM)pArgs;
11007*53ee8cc1Swenshuai.xi 
11008*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetStatus(pInstance,ptr->en_status, ptr->pStatus,ptr->u32Size);
11009*53ee8cc1Swenshuai.xi 
11010*53ee8cc1Swenshuai.xi             break;
11011*53ee8cc1Swenshuai.xi         }
11012*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_TESTPATTERN:
11013*53ee8cc1Swenshuai.xi         {
11014*53ee8cc1Swenshuai.xi             PGOP_TEST_PATTERN_PARAM ptr = (PGOP_TEST_PATTERN_PARAM)pArgs;
11015*53ee8cc1Swenshuai.xi 
11016*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_TestPattern(pInstance,ptr->TestPatternType,ptr->u32ARGB);
11017*53ee8cc1Swenshuai.xi             break;
11018*53ee8cc1Swenshuai.xi         }
11019*53ee8cc1Swenshuai.xi         //Stretch Win
11020*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_SET_STRETCH:
11021*53ee8cc1Swenshuai.xi         {
11022*53ee8cc1Swenshuai.xi             PGOP_STRETCH_SET_PARAM ptr = (PGOP_STRETCH_SET_PARAM)pArgs;
11023*53ee8cc1Swenshuai.xi             PGOP_STRETCH_INFO pInfo = (PGOP_STRETCH_INFO)ptr->pStretch;
11024*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_STRETCH_INFO))
11025*53ee8cc1Swenshuai.xi             {
11026*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11027*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
11028*53ee8cc1Swenshuai.xi             }
11029*53ee8cc1Swenshuai.xi 
11030*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Set_Stretch(pInstance,ptr->enStrtchType,ptr->gop_idx,pInfo);
11031*53ee8cc1Swenshuai.xi             break;
11032*53ee8cc1Swenshuai.xi         }
11033*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_GET_STRETCH:
11034*53ee8cc1Swenshuai.xi         {
11035*53ee8cc1Swenshuai.xi             PGOP_STRETCH_SET_PARAM ptr = (PGOP_STRETCH_SET_PARAM)pArgs;
11036*53ee8cc1Swenshuai.xi             PGOP_STRETCH_INFO pInfo = (PGOP_STRETCH_INFO)ptr->pStretch;
11037*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_STRETCH_INFO))
11038*53ee8cc1Swenshuai.xi             {
11039*53ee8cc1Swenshuai.xi                 GOP_M_ERR("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11040*53ee8cc1Swenshuai.xi                 return GOP_API_INVALID_PARAMETERS;
11041*53ee8cc1Swenshuai.xi             }
11042*53ee8cc1Swenshuai.xi 
11043*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Get_Stretch(pInstance,ptr->enStrtchType,ptr->gop_idx,pInfo);
11044*53ee8cc1Swenshuai.xi             break;
11045*53ee8cc1Swenshuai.xi         }
11046*53ee8cc1Swenshuai.xi 
11047*53ee8cc1Swenshuai.xi         //GWIN info
11048*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_SET_PROPERTY:
11049*53ee8cc1Swenshuai.xi         {
11050*53ee8cc1Swenshuai.xi             PGOP_GWIN_PROPERTY_PARAM ptr = (PGOP_GWIN_PROPERTY_PARAM)pArgs;
11051*53ee8cc1Swenshuai.xi 
11052*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GWin_SetProperty(pInstance,ptr->en_property, ptr->GwinId, ptr->pSet, ptr->u32Size);
11053*53ee8cc1Swenshuai.xi 
11054*53ee8cc1Swenshuai.xi             break;
11055*53ee8cc1Swenshuai.xi         }
11056*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_GET_PROPERTY:
11057*53ee8cc1Swenshuai.xi         {
11058*53ee8cc1Swenshuai.xi             PGOP_GWIN_PROPERTY_PARAM ptr = (PGOP_GWIN_PROPERTY_PARAM)pArgs;
11059*53ee8cc1Swenshuai.xi 
11060*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GWin_GetProperty(pInstance,ptr->en_property, ptr->GwinId, ptr->pSet, ptr->u32Size);
11061*53ee8cc1Swenshuai.xi 
11062*53ee8cc1Swenshuai.xi             break;
11063*53ee8cc1Swenshuai.xi         }
11064*53ee8cc1Swenshuai.xi 
11065*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_MAPFB2WIN:
11066*53ee8cc1Swenshuai.xi         {
11067*53ee8cc1Swenshuai.xi             PGOP_GWIN_MAPFBINFO_PARAM ptr = (PGOP_GWIN_MAPFBINFO_PARAM)pArgs;
11068*53ee8cc1Swenshuai.xi             //PGOP_BUFFER_INFO pInfo = (PGOP_BUFFER_INFO)ptr->pinfo;
11069*53ee8cc1Swenshuai.xi 
11070*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_MapFB2Win(pInstance,ptr->fbid,ptr->GwinId);
11071*53ee8cc1Swenshuai.xi 
11072*53ee8cc1Swenshuai.xi             break;
11073*53ee8cc1Swenshuai.xi         }
11074*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_SET_WININFO:
11075*53ee8cc1Swenshuai.xi         {
11076*53ee8cc1Swenshuai.xi             PGOP_GWIN_SETWININFO_PARAM ptr = (PGOP_GWIN_SETWININFO_PARAM)pArgs;
11077*53ee8cc1Swenshuai.xi             PGOP_BUFFER_INFO pInfo = (PGOP_BUFFER_INFO)ptr->pinfo;
11078*53ee8cc1Swenshuai.xi 
11079*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11080*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_BUFFER_INFO))
11081*53ee8cc1Swenshuai.xi             {
11082*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11083*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11084*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11085*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11086*53ee8cc1Swenshuai.xi #endif
11087*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11088*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11089*53ee8cc1Swenshuai.xi             }
11090*53ee8cc1Swenshuai.xi #endif
11091*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetWinInfo(pInstance,ptr->GwinId,pInfo);
11092*53ee8cc1Swenshuai.xi 
11093*53ee8cc1Swenshuai.xi             break;
11094*53ee8cc1Swenshuai.xi         }
11095*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_GET_WININFO:
11096*53ee8cc1Swenshuai.xi         {
11097*53ee8cc1Swenshuai.xi             PGOP_GWIN_SETWININFO_PARAM ptr = (PGOP_GWIN_SETWININFO_PARAM)pArgs;
11098*53ee8cc1Swenshuai.xi             PGOP_BUFFER_INFO pInfo = (PGOP_BUFFER_INFO)ptr->pinfo;
11099*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11100*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_BUFFER_INFO))
11101*53ee8cc1Swenshuai.xi             {
11102*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11103*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11104*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11105*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11106*53ee8cc1Swenshuai.xi #endif
11107*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11108*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11109*53ee8cc1Swenshuai.xi             }
11110*53ee8cc1Swenshuai.xi #endif
11111*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetWinInfo(pInstance,ptr->GwinId,pInfo);
11112*53ee8cc1Swenshuai.xi 
11113*53ee8cc1Swenshuai.xi             break;
11114*53ee8cc1Swenshuai.xi         }
11115*53ee8cc1Swenshuai.xi 
11116*53ee8cc1Swenshuai.xi #if 0
11117*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_ENABLE:
11118*53ee8cc1Swenshuai.xi         {
11119*53ee8cc1Swenshuai.xi             PGOP_GWIN_WIN_ENABLE_PARAM ptr = (PGOP_GWIN_WIN_ENABLE_PARAM)pArgs;
11120*53ee8cc1Swenshuai.xi             MS_BOOL bEn;
11121*53ee8cc1Swenshuai.xi 
11122*53ee8cc1Swenshuai.xi             bEn = (MS_BOOL)*(ptr->pEn);
11123*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Win_Enable(ptr->GwinId, bEn);
11124*53ee8cc1Swenshuai.xi 
11125*53ee8cc1Swenshuai.xi             break;
11126*53ee8cc1Swenshuai.xi         }
11127*53ee8cc1Swenshuai.xi #endif
11128*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_SETDISPLAY:
11129*53ee8cc1Swenshuai.xi         {
11130*53ee8cc1Swenshuai.xi             PGOP_GWIN_DISPLAY_PARAM ptr = (PGOP_GWIN_DISPLAY_PARAM)pArgs;
11131*53ee8cc1Swenshuai.xi             PGOP_GWINDISPLAY_INFO pInfo = (PGOP_GWINDISPLAY_INFO)ptr->pDisplayInfo;
11132*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11133*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_GWINDISPLAY_INFO))
11134*53ee8cc1Swenshuai.xi             {
11135*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11136*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11137*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11138*53ee8cc1Swenshuai.xi #endif
11139*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11140*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11141*53ee8cc1Swenshuai.xi             }
11142*53ee8cc1Swenshuai.xi #endif
11143*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetDisplay(pInstance,pInfo);
11144*53ee8cc1Swenshuai.xi             break;
11145*53ee8cc1Swenshuai.xi         }
11146*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_DESTROY:
11147*53ee8cc1Swenshuai.xi         {
11148*53ee8cc1Swenshuai.xi             PGOP_GWIN_DESTROY_PARAM ptr = (PGOP_GWIN_DESTROY_PARAM)pArgs;
11149*53ee8cc1Swenshuai.xi 
11150*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Win_Destroy(pInstance,ptr->GwinId);
11151*53ee8cc1Swenshuai.xi         }
11152*53ee8cc1Swenshuai.xi             break;
11153*53ee8cc1Swenshuai.xi         //GFLIP
11154*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GFLIP_CLEARQUEUE:
11155*53ee8cc1Swenshuai.xi         {
11156*53ee8cc1Swenshuai.xi             PGOP_GWIN_CLEARQUEUE_PARAM ptr = (PGOP_GWIN_CLEARQUEUE_PARAM)pArgs;
11157*53ee8cc1Swenshuai.xi             PGOP_GWIN_CLEARQUEUE_INFO pInfo = (PGOP_GWIN_CLEARQUEUE_INFO)ptr->pClearInfo;
11158*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11159*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_GWIN_CLEARQUEUE_INFO))
11160*53ee8cc1Swenshuai.xi             {
11161*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11162*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11163*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11164*53ee8cc1Swenshuai.xi #endif
11165*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11166*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11167*53ee8cc1Swenshuai.xi             }
11168*53ee8cc1Swenshuai.xi #endif
11169*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GFlip_ClearFlipQueue(pInstance,pInfo->GwinId);
11170*53ee8cc1Swenshuai.xi         }
11171*53ee8cc1Swenshuai.xi             break;
11172*53ee8cc1Swenshuai.xi 
11173*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GFLIP_SWITCHGWIN:
11174*53ee8cc1Swenshuai.xi         {
11175*53ee8cc1Swenshuai.xi             PGOP_GWIN_GFLIP_SWITCH_GWIN_PARAM ptr = (PGOP_GWIN_GFLIP_SWITCH_GWIN_PARAM)pArgs;
11176*53ee8cc1Swenshuai.xi             PGOP_GWIN_FLIP_WIN_INFO pFlip = (PGOP_GWIN_FLIP_WIN_INFO)ptr->pFlipInfo;
11177*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11178*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_GWIN_FLIP_WIN_INFO))
11179*53ee8cc1Swenshuai.xi             {
11180*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11181*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11182*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11183*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11184*53ee8cc1Swenshuai.xi #endif
11185*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11186*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11187*53ee8cc1Swenshuai.xi             }
11188*53ee8cc1Swenshuai.xi #endif
11189*53ee8cc1Swenshuai.xi             if(bLocked)
11190*53ee8cc1Swenshuai.xi             {
11191*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11192*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11193*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11194*53ee8cc1Swenshuai.xi #endif
11195*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11196*53ee8cc1Swenshuai.xi                 bLocked = FALSE;
11197*53ee8cc1Swenshuai.xi             }
11198*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GFlip_SwitchGwin(pInstance,pFlip);
11199*53ee8cc1Swenshuai.xi             break;
11200*53ee8cc1Swenshuai.xi         }
11201*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GFLIP_SWITCHMULTIGWIN:
11202*53ee8cc1Swenshuai.xi         {
11203*53ee8cc1Swenshuai.xi             PGOP_GWIN_GFLIP_SWITCH_MULTI_GWIN_PARAM ptr = (PGOP_GWIN_GFLIP_SWITCH_MULTI_GWIN_PARAM)pArgs;
11204*53ee8cc1Swenshuai.xi             PGOP_GWIN_FLIP_MULTI_WIN_INFO pMultiFlip = (PGOP_GWIN_FLIP_MULTI_WIN_INFO)ptr->pMultiFlipInfo;
11205*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11206*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_GWIN_FLIP_MULTI_WIN_INFO))
11207*53ee8cc1Swenshuai.xi             {
11208*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11209*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11210*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11211*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11212*53ee8cc1Swenshuai.xi #endif
11213*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11214*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11215*53ee8cc1Swenshuai.xi             }
11216*53ee8cc1Swenshuai.xi #endif
11217*53ee8cc1Swenshuai.xi             if(bLocked)
11218*53ee8cc1Swenshuai.xi             {
11219*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11220*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11221*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11222*53ee8cc1Swenshuai.xi #endif
11223*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11224*53ee8cc1Swenshuai.xi                 bLocked = FALSE;
11225*53ee8cc1Swenshuai.xi             }
11226*53ee8cc1Swenshuai.xi 
11227*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GFlip_SwitchMultiGwin(pInstance,pMultiFlip);
11228*53ee8cc1Swenshuai.xi             break;
11229*53ee8cc1Swenshuai.xi         }
11230*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GFLIP_RESTORE_VSYNC_LMT:
11231*53ee8cc1Swenshuai.xi         {
11232*53ee8cc1Swenshuai.xi             if(FALSE == MDrv_GOP_RestoreFromVsyncLimitation(g_pGOPCtxLocal))
11233*53ee8cc1Swenshuai.xi             {
11234*53ee8cc1Swenshuai.xi                 u32Ret = GOP_API_FAIL;
11235*53ee8cc1Swenshuai.xi             }
11236*53ee8cc1Swenshuai.xi             u32Ret = GOP_API_SUCCESS;
11237*53ee8cc1Swenshuai.xi 
11238*53ee8cc1Swenshuai.xi             break;
11239*53ee8cc1Swenshuai.xi         }
11240*53ee8cc1Swenshuai.xi         //FB Info
11241*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_FB_CREATE:
11242*53ee8cc1Swenshuai.xi         {
11243*53ee8cc1Swenshuai.xi             PGOP_CREATE_BUFFER_PARAM ptr = (PGOP_CREATE_BUFFER_PARAM)pArgs;
11244*53ee8cc1Swenshuai.xi             PGOP_BUFFER_INFO pBuff = (PGOP_BUFFER_INFO)ptr->pBufInfo;
11245*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11246*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_BUFFER_INFO))  //error handling for invalid ptr
11247*53ee8cc1Swenshuai.xi             {
11248*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11249*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11250*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11251*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11252*53ee8cc1Swenshuai.xi #endif
11253*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11254*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11255*53ee8cc1Swenshuai.xi             }
11256*53ee8cc1Swenshuai.xi #endif
11257*53ee8cc1Swenshuai.xi 
11258*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_FBCreate(pInstance,ptr->fb_type,pBuff,ptr->fbid);
11259*53ee8cc1Swenshuai.xi             break;
11260*53ee8cc1Swenshuai.xi         }
11261*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_FB_DESTROY:
11262*53ee8cc1Swenshuai.xi         {
11263*53ee8cc1Swenshuai.xi             PGOP_DELETE_BUFFER_PARAM ptr = (PGOP_DELETE_BUFFER_PARAM)pArgs;
11264*53ee8cc1Swenshuai.xi 
11265*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(MS_U32))  //error handling for invalid ptr
11266*53ee8cc1Swenshuai.xi             {
11267*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11268*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11269*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11270*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11271*53ee8cc1Swenshuai.xi #endif
11272*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11273*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11274*53ee8cc1Swenshuai.xi             }
11275*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_FBDestroy(pInstance,ptr->pBufId);
11276*53ee8cc1Swenshuai.xi 
11277*53ee8cc1Swenshuai.xi             break;
11278*53ee8cc1Swenshuai.xi         }
11279*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_FB_SETINFO:
11280*53ee8cc1Swenshuai.xi         {
11281*53ee8cc1Swenshuai.xi             PGOP_FB_INFO_PARAM ptr = (PGOP_FB_INFO_PARAM)pArgs;
11282*53ee8cc1Swenshuai.xi             PGOP_BUFFER_INFO pBuff  = (PGOP_BUFFER_INFO)ptr->pBufInfo;
11283*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11284*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_BUFFER_INFO))  //error handling for invalid ptr
11285*53ee8cc1Swenshuai.xi             {
11286*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s] (%d) Info structure Error!!\n",__FUNCTION__,__LINE__);
11287*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11288*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11289*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11290*53ee8cc1Swenshuai.xi #endif
11291*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11292*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11293*53ee8cc1Swenshuai.xi             }
11294*53ee8cc1Swenshuai.xi #endif
11295*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_SetFBInfo(pInstance,ptr->fbid,pBuff);
11296*53ee8cc1Swenshuai.xi 
11297*53ee8cc1Swenshuai.xi             break;
11298*53ee8cc1Swenshuai.xi         }
11299*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_FB_GETINFO:
11300*53ee8cc1Swenshuai.xi         {
11301*53ee8cc1Swenshuai.xi             PGOP_FB_INFO_PARAM ptr = (PGOP_FB_INFO_PARAM)pArgs;
11302*53ee8cc1Swenshuai.xi             PGOP_BUFFER_INFO pBuff  = (PGOP_BUFFER_INFO)ptr->pBufInfo;
11303*53ee8cc1Swenshuai.xi 
11304*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_GetFBInfo(pInstance,ptr->fbid,pBuff);
11305*53ee8cc1Swenshuai.xi             break;
11306*53ee8cc1Swenshuai.xi         }
11307*53ee8cc1Swenshuai.xi 
11308*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_FB_SET_PROPERTY:
11309*53ee8cc1Swenshuai.xi         {
11310*53ee8cc1Swenshuai.xi             PGOP_FB_PROPERTY_PARAM ptr = (PGOP_FB_PROPERTY_PARAM)pArgs;
11311*53ee8cc1Swenshuai.xi 
11312*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_FB_SetProperty(pInstance,ptr->en_property, ptr->FBId, ptr->pSet, ptr->u32Size);
11313*53ee8cc1Swenshuai.xi 
11314*53ee8cc1Swenshuai.xi             break;
11315*53ee8cc1Swenshuai.xi         }
11316*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_FB_GET_PROPERTY:
11317*53ee8cc1Swenshuai.xi         {
11318*53ee8cc1Swenshuai.xi             PGOP_FB_PROPERTY_PARAM ptr = (PGOP_FB_PROPERTY_PARAM)pArgs;
11319*53ee8cc1Swenshuai.xi 
11320*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_FB_GetProperty(pInstance,ptr->en_property, ptr->FBId, ptr->pSet, ptr->u32Size);
11321*53ee8cc1Swenshuai.xi 
11322*53ee8cc1Swenshuai.xi             break;
11323*53ee8cc1Swenshuai.xi         }
11324*53ee8cc1Swenshuai.xi 
11325*53ee8cc1Swenshuai.xi         //palette
11326*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_PALETTE_SET_CONFIG:
11327*53ee8cc1Swenshuai.xi         {
11328*53ee8cc1Swenshuai.xi             PGOP_PALETTE_CONFIG_PARAM ptr = (PGOP_PALETTE_CONFIG_PARAM)pArgs;
11329*53ee8cc1Swenshuai.xi             PGOP_PAL_OPT pPalSet = (PGOP_PAL_OPT)ptr->pPaletteInfo;
11330*53ee8cc1Swenshuai.xi 
11331*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_PAL_OPT))
11332*53ee8cc1Swenshuai.xi             {
11333*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11334*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11335*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11336*53ee8cc1Swenshuai.xi #endif
11337*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11338*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11339*53ee8cc1Swenshuai.xi             }
11340*53ee8cc1Swenshuai.xi 
11341*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Palette_Set_Config(pInstance,pPalSet->gop_idx, (DRV_GopPalReadType)pPalSet->paltype,pPalSet->palSrc);
11342*53ee8cc1Swenshuai.xi 
11343*53ee8cc1Swenshuai.xi         }
11344*53ee8cc1Swenshuai.xi             break;
11345*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_PALETTE_SET_ENTRY:
11346*53ee8cc1Swenshuai.xi         {
11347*53ee8cc1Swenshuai.xi             PGOP_PALETTE_SET_PARAM ptr = (PGOP_PALETTE_SET_PARAM)pArgs;
11348*53ee8cc1Swenshuai.xi             PGOP_PALETTE_ENTRY pPal = (PGOP_PALETTE_ENTRY)ptr->pClut;
11349*53ee8cc1Swenshuai.xi 
11350*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11351*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_PALETTE_ENTRY))
11352*53ee8cc1Swenshuai.xi             {
11353*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11354*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11355*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11356*53ee8cc1Swenshuai.xi #endif
11357*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11358*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11359*53ee8cc1Swenshuai.xi             }
11360*53ee8cc1Swenshuai.xi #endif
11361*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Palette_EntrySet(pInstance,pPal);
11362*53ee8cc1Swenshuai.xi         }
11363*53ee8cc1Swenshuai.xi             break;
11364*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_PALETTE_GET_ENTRY:
11365*53ee8cc1Swenshuai.xi         {
11366*53ee8cc1Swenshuai.xi             PGOP_PALETTE_SET_PARAM ptr = (PGOP_PALETTE_SET_PARAM)pArgs;
11367*53ee8cc1Swenshuai.xi             PGOP_PALETTE_ENTRY pPal = (PGOP_PALETTE_ENTRY)ptr->pClut;
11368*53ee8cc1Swenshuai.xi 
11369*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11370*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_PALETTE_ENTRY))
11371*53ee8cc1Swenshuai.xi             {
11372*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11373*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11374*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11375*53ee8cc1Swenshuai.xi #endif
11376*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11377*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11378*53ee8cc1Swenshuai.xi             }
11379*53ee8cc1Swenshuai.xi #endif
11380*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Palette_EntryGet(pInstance,pPal);
11381*53ee8cc1Swenshuai.xi             break;
11382*53ee8cc1Swenshuai.xi         }
11383*53ee8cc1Swenshuai.xi         //Fade
11384*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_GWIN_SET_FADE:
11385*53ee8cc1Swenshuai.xi         {
11386*53ee8cc1Swenshuai.xi             PGOP_SET_FADE_PARAM ptr = (PGOP_SET_FADE_PARAM)pArgs;
11387*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Fade(pInstance,ptr->en_type,ptr->pSetting,ptr->u32Size);
11388*53ee8cc1Swenshuai.xi             break;
11389*53ee8cc1Swenshuai.xi         }
11390*53ee8cc1Swenshuai.xi         //Scroll
11391*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_SCROLL:
11392*53ee8cc1Swenshuai.xi         {
11393*53ee8cc1Swenshuai.xi             PGOP_SCROLL_PARAM ptr = (PGOP_SCROLL_PARAM)pArgs;
11394*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Scroll(pInstance,ptr->scroll_type,ptr->pCfg,ptr->u32Size);
11395*53ee8cc1Swenshuai.xi             break;
11396*53ee8cc1Swenshuai.xi         }
11397*53ee8cc1Swenshuai.xi         //PINPON
11398*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SET_PINPON:
11399*53ee8cc1Swenshuai.xi         {
11400*53ee8cc1Swenshuai.xi             PGOP_SET_PINPON_PARAM ptr = (PGOP_SET_PINPON_PARAM)pArgs;
11401*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_PINPON(pInstance,ptr->en_pro,ptr->pSetting,ptr->u32Size);
11402*53ee8cc1Swenshuai.xi             break;
11403*53ee8cc1Swenshuai.xi         }
11404*53ee8cc1Swenshuai.xi         //DWIN
11405*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_DWIN_INIT:
11406*53ee8cc1Swenshuai.xi         {
11407*53ee8cc1Swenshuai.xi             Ioctl_GOP_DWIN_Init(pInstance);
11408*53ee8cc1Swenshuai.xi             break;
11409*53ee8cc1Swenshuai.xi         }
11410*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_DWIN_CAPTURE:
11411*53ee8cc1Swenshuai.xi         {
11412*53ee8cc1Swenshuai.xi             PGOP_DWIN_CAPTURE_PARAM pDwinCapture = (PGOP_DWIN_CAPTURE_PARAM)pArgs;
11413*53ee8cc1Swenshuai.xi             PGOP_CAPTURE_INFO pinfo = (PGOP_CAPTURE_INFO)pDwinCapture->pDwin;
11414*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11415*53ee8cc1Swenshuai.xi             if(pDwinCapture->u32Size != sizeof(GOP_CAPTURE_INFO))  //error handling for invalid ptr
11416*53ee8cc1Swenshuai.xi             {
11417*53ee8cc1Swenshuai.xi                 GOP_M_INFO("[%s][%d] Capture Info structure Error!!\n",__FUNCTION__,__LINE__);
11418*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11419*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11420*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11421*53ee8cc1Swenshuai.xi #endif
11422*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11423*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11424*53ee8cc1Swenshuai.xi             }
11425*53ee8cc1Swenshuai.xi #endif
11426*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Dwin_Capture(pInstance,pinfo);
11427*53ee8cc1Swenshuai.xi             break;
11428*53ee8cc1Swenshuai.xi         }
11429*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_DWIN_SET_PROPERTY:
11430*53ee8cc1Swenshuai.xi         {
11431*53ee8cc1Swenshuai.xi             PGOP_DWIN_PROPERTY_PARAM ptr = (PGOP_DWIN_PROPERTY_PARAM)pArgs;
11432*53ee8cc1Swenshuai.xi 
11433*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_DWIN_SetProperty(pInstance,ptr->en_dwin_property,ptr->pDwinProp,ptr->u32Size);
11434*53ee8cc1Swenshuai.xi             break;
11435*53ee8cc1Swenshuai.xi         }
11436*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_DWIN_GET_PROPERTY:
11437*53ee8cc1Swenshuai.xi         {
11438*53ee8cc1Swenshuai.xi             PGOP_DWIN_PROPERTY_PARAM ptr = (PGOP_DWIN_PROPERTY_PARAM)pArgs;
11439*53ee8cc1Swenshuai.xi 
11440*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_DWIN_GetProperty(pInstance,ptr->en_dwin_property,ptr->pDwinProp,ptr->u32Size);
11441*53ee8cc1Swenshuai.xi             break;
11442*53ee8cc1Swenshuai.xi         }
11443*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_DWIN_INTR:
11444*53ee8cc1Swenshuai.xi         {
11445*53ee8cc1Swenshuai.xi             PGOP_DWIN_INTR_STATUS_PARAM pDwinIntr = (PGOP_DWIN_INTR_STATUS_PARAM)pArgs;
11446*53ee8cc1Swenshuai.xi 
11447*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Dwin_Intr(pInstance,pDwinIntr->intr_type, pDwinIntr->pIntrInfo, pDwinIntr->u32Size);
11448*53ee8cc1Swenshuai.xi             break;
11449*53ee8cc1Swenshuai.xi         }
11450*53ee8cc1Swenshuai.xi 
11451*53ee8cc1Swenshuai.xi 
11452*53ee8cc1Swenshuai.xi         //MISC
11453*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_UPDATE:
11454*53ee8cc1Swenshuai.xi         {
11455*53ee8cc1Swenshuai.xi             PGOP_UPDATE_PARAM ptr = (PGOP_UPDATE_PARAM)pArgs;
11456*53ee8cc1Swenshuai.xi             PGOP_UPDATE_INFO pInfo = (PGOP_UPDATE_INFO)ptr->pUpdateInfo;
11457*53ee8cc1Swenshuai.xi 
11458*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_UPDATE_INFO))
11459*53ee8cc1Swenshuai.xi             {
11460*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11461*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11462*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11463*53ee8cc1Swenshuai.xi #endif
11464*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11465*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11466*53ee8cc1Swenshuai.xi             }
11467*53ee8cc1Swenshuai.xi 
11468*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_TriggerRegWriteIn(pInstance,pInfo->gop_idx,pInfo->update_type,pInfo->bEn,pInfo->bSync);
11469*53ee8cc1Swenshuai.xi             break;
11470*53ee8cc1Swenshuai.xi         }
11471*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_SELECTION:
11472*53ee8cc1Swenshuai.xi         {
11473*53ee8cc1Swenshuai.xi             PGOP_SELECTION_PROPERTY_PARAM ptr = (PGOP_SELECTION_PROPERTY_PARAM)pArgs;
11474*53ee8cc1Swenshuai.xi 
11475*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Select(pInstance,ptr->sel_type, ptr->id, ptr->pinfo);
11476*53ee8cc1Swenshuai.xi 
11477*53ee8cc1Swenshuai.xi             break;
11478*53ee8cc1Swenshuai.xi         }
11479*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_REGISTER_CB:
11480*53ee8cc1Swenshuai.xi         {
11481*53ee8cc1Swenshuai.xi             PGOP_REGISTER_CB_PARAM ptr = (PGOP_REGISTER_CB_PARAM)pArgs;
11482*53ee8cc1Swenshuai.xi 
11483*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Register_CB(pInstance,ptr->cb_type, ptr->pCB, ptr->u32Size);
11484*53ee8cc1Swenshuai.xi 
11485*53ee8cc1Swenshuai.xi             break;
11486*53ee8cc1Swenshuai.xi         }
11487*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_MUTEX:
11488*53ee8cc1Swenshuai.xi         {
11489*53ee8cc1Swenshuai.xi             GOP_MUTEX_PARAM *ptr = (GOP_MUTEX_PARAM*)pArgs;
11490*53ee8cc1Swenshuai.xi 
11491*53ee8cc1Swenshuai.xi #ifndef MSOS_TYPE_LINUX_KERNEL //Check size error when if(is_compat_task()==1)
11492*53ee8cc1Swenshuai.xi             if(ptr->u32Size != sizeof(GOP_MUTEX_PARAM))
11493*53ee8cc1Swenshuai.xi             {
11494*53ee8cc1Swenshuai.xi                 return UTOPIA_STATUS_PARAMETER_ERROR;
11495*53ee8cc1Swenshuai.xi             }
11496*53ee8cc1Swenshuai.xi #endif
11497*53ee8cc1Swenshuai.xi             if(ptr->en_mutex == E_GOP_LOCK)
11498*53ee8cc1Swenshuai.xi             {
11499*53ee8cc1Swenshuai.xi                 if(UtopiaResourceObtain(pModule, GOP_POOL_ID_GOP0, &(psGOPInstPri->pResource)) != 0)
11500*53ee8cc1Swenshuai.xi                 {
11501*53ee8cc1Swenshuai.xi                     GOP_M_ERR("[%s %d]UtopiaResourceObtainToInstant fail\n",__FUNCTION__,__LINE__);
11502*53ee8cc1Swenshuai.xi                     return 0xFFFFFFFF;
11503*53ee8cc1Swenshuai.xi                 }
11504*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = MsOS_GetOSThreadID();
11505*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11506*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = (GETPIDTYPE)getpid();
11507*53ee8cc1Swenshuai.xi #endif
11508*53ee8cc1Swenshuai.xi             }
11509*53ee8cc1Swenshuai.xi             else if(ptr->en_mutex == E_GOP_UNLOCK)
11510*53ee8cc1Swenshuai.xi             {
11511*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11512*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11513*53ee8cc1Swenshuai.xi                 g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11514*53ee8cc1Swenshuai.xi #endif
11515*53ee8cc1Swenshuai.xi                 UtopiaResourceRelease(psGOPInstPri->pResource);
11516*53ee8cc1Swenshuai.xi             }
11517*53ee8cc1Swenshuai.xi             break;
11518*53ee8cc1Swenshuai.xi         }
11519*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_MIXER_SET_PROPERTY:
11520*53ee8cc1Swenshuai.xi         {
11521*53ee8cc1Swenshuai.xi             PGOP_MIXER_PROPERTY_PARAM ptr = (PGOP_MIXER_PROPERTY_PARAM)pArgs;
11522*53ee8cc1Swenshuai.xi 
11523*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_MIXER_SetProperty(pInstance,ptr->en_mixer_property,ptr->pMixerProp,ptr->u32Size);
11524*53ee8cc1Swenshuai.xi             break;
11525*53ee8cc1Swenshuai.xi         }
11526*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_MIXER_GET_PROPERTY:
11527*53ee8cc1Swenshuai.xi         {
11528*53ee8cc1Swenshuai.xi             PGOP_MIXER_PROPERTY_PARAM ptr = (PGOP_MIXER_PROPERTY_PARAM)pArgs;
11529*53ee8cc1Swenshuai.xi 
11530*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_MIXER_GetProperty(pInstance,ptr->en_mixer_property,ptr->pMixerProp,ptr->u32Size);
11531*53ee8cc1Swenshuai.xi             break;
11532*53ee8cc1Swenshuai.xi         }
11533*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_VE_SET_PROPERTY:
11534*53ee8cc1Swenshuai.xi         {
11535*53ee8cc1Swenshuai.xi             PGOP_VE_PROPERTY_PARAM ptr = (PGOP_VE_PROPERTY_PARAM)pArgs;
11536*53ee8cc1Swenshuai.xi 
11537*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_VE_SetProperty(pInstance,ptr->en_ve_property,ptr->pVEProp,ptr->u32Size);
11538*53ee8cc1Swenshuai.xi             break;
11539*53ee8cc1Swenshuai.xi         }
11540*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_MISC:
11541*53ee8cc1Swenshuai.xi         {
11542*53ee8cc1Swenshuai.xi             PGOP_MISC_PARAM ptr = (PGOP_MISC_PARAM)pArgs;
11543*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_MISC(pInstance,ptr->misc_type,ptr->pMISC,ptr->u32Size);
11544*53ee8cc1Swenshuai.xi             break;
11545*53ee8cc1Swenshuai.xi         }
11546*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_POWERSTATE:
11547*53ee8cc1Swenshuai.xi         {
11548*53ee8cc1Swenshuai.xi             PGOP_POWERSTATE_PARAM ptr = (PGOP_POWERSTATE_PARAM)pArgs;
11549*53ee8cc1Swenshuai.xi             MS_U8* u8Val = ptr->pInfo;
11550*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_PowerState(pInstance, (MS_U32)*u8Val, pModule);
11551*53ee8cc1Swenshuai.xi             break;
11552*53ee8cc1Swenshuai.xi         }
11553*53ee8cc1Swenshuai.xi         case MAPI_CMD_GOP_INTERRUPT:
11554*53ee8cc1Swenshuai.xi         {
11555*53ee8cc1Swenshuai.xi             PGOP_INTERRUPT_PARAM ptr = (PGOP_INTERRUPT_PARAM)pArgs;
11556*53ee8cc1Swenshuai.xi             MS_BOOL *pbEnable =(MS_BOOL *)ptr->pSetting;
11557*53ee8cc1Swenshuai.xi             u32Ret = Ioctl_GOP_Interrupt(pInstance,ptr->gop_idx,*pbEnable);
11558*53ee8cc1Swenshuai.xi             break;
11559*53ee8cc1Swenshuai.xi         }
11560*53ee8cc1Swenshuai.xi         default:
11561*53ee8cc1Swenshuai.xi             break;
11562*53ee8cc1Swenshuai.xi     }
11563*53ee8cc1Swenshuai.xi 
11564*53ee8cc1Swenshuai.xi     if(bLocked)
11565*53ee8cc1Swenshuai.xi     {
11566*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->s32GOPLockTid = 0;
11567*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
11568*53ee8cc1Swenshuai.xi         g_pGOPCtxLocal->pGOPCtxShared->GOPLockPid = 0;
11569*53ee8cc1Swenshuai.xi #endif
11570*53ee8cc1Swenshuai.xi         UtopiaResourceRelease(psGOPInstPri->pResource);
11571*53ee8cc1Swenshuai.xi     }
11572*53ee8cc1Swenshuai.xi     if(u32Ret != GOP_API_SUCCESS)
11573*53ee8cc1Swenshuai.xi     {
11574*53ee8cc1Swenshuai.xi         GOP_M_ERR("[%s][%d] ERROR on cmd:0x%tx\n",__FUNCTION__,__LINE__, (ptrdiff_t)u32Cmd);
11575*53ee8cc1Swenshuai.xi         return UTOPIA_STATUS_FAIL;
11576*53ee8cc1Swenshuai.xi     }
11577*53ee8cc1Swenshuai.xi 
11578*53ee8cc1Swenshuai.xi     //printf("(%s) Done\n\n",__FUNCTION__);
11579*53ee8cc1Swenshuai.xi 
11580*53ee8cc1Swenshuai.xi 	return UTOPIA_STATUS_SUCCESS;
11581*53ee8cc1Swenshuai.xi }
11582*53ee8cc1Swenshuai.xi 
GOPClose(void * pInstance)11583*53ee8cc1Swenshuai.xi MS_U32 GOPClose(void* pInstance)
11584*53ee8cc1Swenshuai.xi {
11585*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
11586*53ee8cc1Swenshuai.xi         extern MS_U32 MDrv_GFLIP_Del_Timer(void);
11587*53ee8cc1Swenshuai.xi         if(_devGFLIPCnt==1)
11588*53ee8cc1Swenshuai.xi         {
11589*53ee8cc1Swenshuai.xi             MDrv_GFLIP_Del_Timer();
11590*53ee8cc1Swenshuai.xi         }
11591*53ee8cc1Swenshuai.xi #endif
11592*53ee8cc1Swenshuai.xi 
11593*53ee8cc1Swenshuai.xi     Ioctl_GOP_AtExit(pInstance);
11594*53ee8cc1Swenshuai.xi 	UtopiaInstanceDelete(pInstance);
11595*53ee8cc1Swenshuai.xi 
11596*53ee8cc1Swenshuai.xi 	return TRUE;
11597*53ee8cc1Swenshuai.xi }
11598*53ee8cc1Swenshuai.xi 
11599