1*53ee8cc1Swenshuai.xi //<MStar Software>
2*53ee8cc1Swenshuai.xi //******************************************************************************
3*53ee8cc1Swenshuai.xi // MStar Software
4*53ee8cc1Swenshuai.xi // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5*53ee8cc1Swenshuai.xi // All software, firmware and related documentation herein ("MStar Software") are
6*53ee8cc1Swenshuai.xi // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7*53ee8cc1Swenshuai.xi // law, including, but not limited to, copyright law and international treaties.
8*53ee8cc1Swenshuai.xi // Any use, modification, reproduction, retransmission, or republication of all
9*53ee8cc1Swenshuai.xi // or part of MStar Software is expressly prohibited, unless prior written
10*53ee8cc1Swenshuai.xi // permission has been granted by MStar.
11*53ee8cc1Swenshuai.xi //
12*53ee8cc1Swenshuai.xi // By accessing, browsing and/or using MStar Software, you acknowledge that you
13*53ee8cc1Swenshuai.xi // have read, understood, and agree, to be bound by below terms ("Terms") and to
14*53ee8cc1Swenshuai.xi // comply with all applicable laws and regulations:
15*53ee8cc1Swenshuai.xi //
16*53ee8cc1Swenshuai.xi // 1. MStar shall retain any and all right, ownership and interest to MStar
17*53ee8cc1Swenshuai.xi // Software and any modification/derivatives thereof.
18*53ee8cc1Swenshuai.xi // No right, ownership, or interest to MStar Software and any
19*53ee8cc1Swenshuai.xi // modification/derivatives thereof is transferred to you under Terms.
20*53ee8cc1Swenshuai.xi //
21*53ee8cc1Swenshuai.xi // 2. You understand that MStar Software might include, incorporate or be
22*53ee8cc1Swenshuai.xi // supplied together with third party`s software and the use of MStar
23*53ee8cc1Swenshuai.xi // Software may require additional licenses from third parties.
24*53ee8cc1Swenshuai.xi // Therefore, you hereby agree it is your sole responsibility to separately
25*53ee8cc1Swenshuai.xi // obtain any and all third party right and license necessary for your use of
26*53ee8cc1Swenshuai.xi // such third party`s software.
27*53ee8cc1Swenshuai.xi //
28*53ee8cc1Swenshuai.xi // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29*53ee8cc1Swenshuai.xi // MStar`s confidential information and you agree to keep MStar`s
30*53ee8cc1Swenshuai.xi // confidential information in strictest confidence and not disclose to any
31*53ee8cc1Swenshuai.xi // third party.
32*53ee8cc1Swenshuai.xi //
33*53ee8cc1Swenshuai.xi // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34*53ee8cc1Swenshuai.xi // kind. Any warranties are hereby expressly disclaimed by MStar, including
35*53ee8cc1Swenshuai.xi // without limitation, any warranties of merchantability, non-infringement of
36*53ee8cc1Swenshuai.xi // intellectual property rights, fitness for a particular purpose, error free
37*53ee8cc1Swenshuai.xi // and in conformity with any international standard. You agree to waive any
38*53ee8cc1Swenshuai.xi // claim against MStar for any loss, damage, cost or expense that you may
39*53ee8cc1Swenshuai.xi // incur related to your use of MStar Software.
40*53ee8cc1Swenshuai.xi // In no event shall MStar be liable for any direct, indirect, incidental or
41*53ee8cc1Swenshuai.xi // consequential damages, including without limitation, lost of profit or
42*53ee8cc1Swenshuai.xi // revenues, lost or damage of data, and unauthorized system use.
43*53ee8cc1Swenshuai.xi // You agree that this Section 4 shall still apply without being affected
44*53ee8cc1Swenshuai.xi // even if MStar Software has been modified by MStar in accordance with your
45*53ee8cc1Swenshuai.xi // request or instruction for your use, except otherwise agreed by both
46*53ee8cc1Swenshuai.xi // parties in writing.
47*53ee8cc1Swenshuai.xi //
48*53ee8cc1Swenshuai.xi // 5. If requested, MStar may from time to time provide technical supports or
49*53ee8cc1Swenshuai.xi // services in relation with MStar Software to you for your use of
50*53ee8cc1Swenshuai.xi // MStar Software in conjunction with your or your customer`s product
51*53ee8cc1Swenshuai.xi // ("Services").
52*53ee8cc1Swenshuai.xi // You understand and agree that, except otherwise agreed by both parties in
53*53ee8cc1Swenshuai.xi // writing, Services are provided on an "AS IS" basis and the warranty
54*53ee8cc1Swenshuai.xi // disclaimer set forth in Section 4 above shall apply.
55*53ee8cc1Swenshuai.xi //
56*53ee8cc1Swenshuai.xi // 6. Nothing contained herein shall be construed as by implication, estoppels
57*53ee8cc1Swenshuai.xi // or otherwise:
58*53ee8cc1Swenshuai.xi // (a) conferring any license or right to use MStar name, trademark, service
59*53ee8cc1Swenshuai.xi // mark, symbol or any other identification;
60*53ee8cc1Swenshuai.xi // (b) obligating MStar or any of its affiliates to furnish any person,
61*53ee8cc1Swenshuai.xi // including without limitation, you and your customers, any assistance
62*53ee8cc1Swenshuai.xi // of any kind whatsoever, or any information; or
63*53ee8cc1Swenshuai.xi // (c) conferring any license or right under any intellectual property right.
64*53ee8cc1Swenshuai.xi //
65*53ee8cc1Swenshuai.xi // 7. These terms shall be governed by and construed in accordance with the laws
66*53ee8cc1Swenshuai.xi // of Taiwan, R.O.C., excluding its conflict of law rules.
67*53ee8cc1Swenshuai.xi // Any and all dispute arising out hereof or related hereto shall be finally
68*53ee8cc1Swenshuai.xi // settled by arbitration referred to the Chinese Arbitration Association,
69*53ee8cc1Swenshuai.xi // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70*53ee8cc1Swenshuai.xi // Rules of the Association by three (3) arbitrators appointed in accordance
71*53ee8cc1Swenshuai.xi // with the said Rules.
72*53ee8cc1Swenshuai.xi // The place of arbitration shall be in Taipei, Taiwan and the language shall
73*53ee8cc1Swenshuai.xi // be English.
74*53ee8cc1Swenshuai.xi // The arbitration award shall be final and binding to both parties.
75*53ee8cc1Swenshuai.xi //
76*53ee8cc1Swenshuai.xi //******************************************************************************
77*53ee8cc1Swenshuai.xi //<MStar Software>
78*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
79*53ee8cc1Swenshuai.xi //
80*53ee8cc1Swenshuai.xi // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81*53ee8cc1Swenshuai.xi // All rights reserved.
82*53ee8cc1Swenshuai.xi //
83*53ee8cc1Swenshuai.xi // Unless otherwise stipulated in writing, any and all information contained
84*53ee8cc1Swenshuai.xi // herein regardless in any format shall remain the sole proprietary of
85*53ee8cc1Swenshuai.xi // MStar Semiconductor Inc. and be kept in strict confidence
86*53ee8cc1Swenshuai.xi // ("MStar Confidential Information") by the recipient.
87*53ee8cc1Swenshuai.xi // Any unauthorized act including without limitation unauthorized disclosure,
88*53ee8cc1Swenshuai.xi // copying, use, reproduction, sale, distribution, modification, disassembling,
89*53ee8cc1Swenshuai.xi // reverse engineering and compiling of the contents of MStar Confidential
90*53ee8cc1Swenshuai.xi // Information is unlawful and strictly prohibited. MStar hereby reserves the
91*53ee8cc1Swenshuai.xi // rights to any and all damages, losses, costs and expenses resulting therefrom.
92*53ee8cc1Swenshuai.xi //
93*53ee8cc1Swenshuai.xi ////////////////////////////////////////////////////////////////////////////////
94*53ee8cc1Swenshuai.xi
95*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
96*53ee8cc1Swenshuai.xi /// @file drvGFLIP.c
97*53ee8cc1Swenshuai.xi /// @brief MStar gflip Interface
98*53ee8cc1Swenshuai.xi /// @author MStar Semiconductor Inc.
99*53ee8cc1Swenshuai.xi /// @attention
100*53ee8cc1Swenshuai.xi /// <b><em></em></b>
101*53ee8cc1Swenshuai.xi ///////////////////////////////////////////////////////////////////////////////////////////////////
102*53ee8cc1Swenshuai.xi
103*53ee8cc1Swenshuai.xi #define _MDRV_GFLIP_C
104*53ee8cc1Swenshuai.xi
105*53ee8cc1Swenshuai.xi //=============================================================================
106*53ee8cc1Swenshuai.xi // Include Files
107*53ee8cc1Swenshuai.xi //=============================================================================
108*53ee8cc1Swenshuai.xi #include "MsCommon.h"
109*53ee8cc1Swenshuai.xi #include "regGOP.h"
110*53ee8cc1Swenshuai.xi #include "halGOP.h"
111*53ee8cc1Swenshuai.xi #include "drvGFLIP.h"
112*53ee8cc1Swenshuai.xi #include "halGFLIP.h"
113*53ee8cc1Swenshuai.xi #include "halCHIP.h"
114*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX)
115*53ee8cc1Swenshuai.xi #include <sys/ioctl.h>
116*53ee8cc1Swenshuai.xi #include <unistd.h>
117*53ee8cc1Swenshuai.xi #include <fcntl.h> // O_RDWR
118*53ee8cc1Swenshuai.xi #include "mdrv_gflip_io.h"
119*53ee8cc1Swenshuai.xi #include <string.h>
120*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX_KERNEL)
121*53ee8cc1Swenshuai.xi #include "mdrv_gflip_io.h"
122*53ee8cc1Swenshuai.xi #endif
123*53ee8cc1Swenshuai.xi #include "drvGOP_priv.h"
124*53ee8cc1Swenshuai.xi
125*53ee8cc1Swenshuai.xi //=============================================================================
126*53ee8cc1Swenshuai.xi // Compile options
127*53ee8cc1Swenshuai.xi //=============================================================================
128*53ee8cc1Swenshuai.xi
129*53ee8cc1Swenshuai.xi //=============================================================================
130*53ee8cc1Swenshuai.xi // Debug Macros
131*53ee8cc1Swenshuai.xi //=============================================================================
132*53ee8cc1Swenshuai.xi #define GFLIP_DEBUG
133*53ee8cc1Swenshuai.xi #ifdef GFLIP_DEBUG
134*53ee8cc1Swenshuai.xi #define GFLIP_PRINT(fmt, args...) printf("[GFlip (Driver)][%05d] " fmt, __LINE__, ## args)
135*53ee8cc1Swenshuai.xi #define GFLIP_ASSERT(_cnd, _fmt, _args...) \
136*53ee8cc1Swenshuai.xi if (!(_cnd)) { \
137*53ee8cc1Swenshuai.xi GFLIP_PRINT(_fmt, ##_args); \
138*53ee8cc1Swenshuai.xi }
139*53ee8cc1Swenshuai.xi #else
140*53ee8cc1Swenshuai.xi #define GFLIP_PRINT(_fmt, _args...)
141*53ee8cc1Swenshuai.xi #define GFLIP_ASSERT(_cnd, _fmt, _args...)
142*53ee8cc1Swenshuai.xi #endif
143*53ee8cc1Swenshuai.xi
144*53ee8cc1Swenshuai.xi //=============================================================================
145*53ee8cc1Swenshuai.xi // Macros
146*53ee8cc1Swenshuai.xi //=============================================================================
147*53ee8cc1Swenshuai.xi
148*53ee8cc1Swenshuai.xi //=============================================================================
149*53ee8cc1Swenshuai.xi // Global Variables
150*53ee8cc1Swenshuai.xi //=============================================================================
151*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
152*53ee8cc1Swenshuai.xi #else
153*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGFLIP_IntGOPDrvLocalCtx = NULL;
154*53ee8cc1Swenshuai.xi //=============================================================================
155*53ee8cc1Swenshuai.xi // Local Function Prototypes
156*53ee8cc1Swenshuai.xi //=============================================================================
157*53ee8cc1Swenshuai.xi static void _MDrv_GFLIP_ResetFlipInfoPtr(MS_GOP_CTX_LOCAL *pGOPCtx, MS_U32 u32GopIdx);
158*53ee8cc1Swenshuai.xi
159*53ee8cc1Swenshuai.xi //Irq Relaated(hw process):
160*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GFLIP_ClearIRQ(GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx);
161*53ee8cc1Swenshuai.xi static MS_BOOL _MDrv_GFLIP_ProcessIRQ(GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx);
162*53ee8cc1Swenshuai.xi //Interrupt call back function:
163*53ee8cc1Swenshuai.xi void _MDrv_GFLIP_IntHandler(InterruptNum eIntNum);
164*53ee8cc1Swenshuai.xi
165*53ee8cc1Swenshuai.xi //=============================================================================
166*53ee8cc1Swenshuai.xi // Local Function
167*53ee8cc1Swenshuai.xi //=============================================================================
168*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
169*53ee8cc1Swenshuai.xi /// Reset Flip Info Reader/Writer ptr.
170*53ee8cc1Swenshuai.xi /// @param u32GopIdx \b IN: the idx of ptr's owner(gop)
171*53ee8cc1Swenshuai.xi /// @return void
172*53ee8cc1Swenshuai.xi /// @attention
173*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em></em></b>
174*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_GFLIP_ResetFlipInfoPtr(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U32 u32GopIdx)175*53ee8cc1Swenshuai.xi void _MDrv_GFLIP_ResetFlipInfoPtr(MS_GOP_CTX_LOCAL *pGOPCtx, MS_U32 u32GopIdx)
176*53ee8cc1Swenshuai.xi {
177*53ee8cc1Swenshuai.xi MS_U16 u16Idx;
178*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
179*53ee8cc1Swenshuai.xi
180*53ee8cc1Swenshuai.xi for(u16Idx=0; u16Idx<MAX_GOP_GWIN; u16Idx++)
181*53ee8cc1Swenshuai.xi {
182*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u16Idx] = 0;
183*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u16Idx] = 0;
184*53ee8cc1Swenshuai.xi }
185*53ee8cc1Swenshuai.xi }
186*53ee8cc1Swenshuai.xi
187*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
188*53ee8cc1Swenshuai.xi /// Clear Irq
189*53ee8cc1Swenshuai.xi /// @param void
190*53ee8cc1Swenshuai.xi /// @return TRUE: success
191*53ee8cc1Swenshuai.xi /// @attention
192*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em></em></b>
193*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_GFLIP_ClearIRQ(GOP_CTX_DRV_LOCAL * pGOPDrvLocalCtx)194*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_GFLIP_ClearIRQ(GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx)
195*53ee8cc1Swenshuai.xi {
196*53ee8cc1Swenshuai.xi MS_U32 u32GopIdx;
197*53ee8cc1Swenshuai.xi
198*53ee8cc1Swenshuai.xi MHal_GFLIP_ClearDWINIRQ(&pGOPDrvLocalCtx->halCtxLocal, &pGOPDrvLocalCtx->gflipDWinIntInfo);
199*53ee8cc1Swenshuai.xi
200*53ee8cc1Swenshuai.xi for(u32GopIdx=0; u32GopIdx<MAX_GOP_SUPPORT; u32GopIdx++)
201*53ee8cc1Swenshuai.xi {
202*53ee8cc1Swenshuai.xi if(MHal_GFLIP_IsVSyncInt(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx) == FALSE)
203*53ee8cc1Swenshuai.xi {
204*53ee8cc1Swenshuai.xi continue;
205*53ee8cc1Swenshuai.xi }
206*53ee8cc1Swenshuai.xi
207*53ee8cc1Swenshuai.xi MHal_GFLIP_IntEnable(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx, FALSE);
208*53ee8cc1Swenshuai.xi
209*53ee8cc1Swenshuai.xi if(MHal_GFLIP_IsVSyncInt(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx) == TRUE)
210*53ee8cc1Swenshuai.xi { //Wow...The Vsync Issue Happened...
211*53ee8cc1Swenshuai.xi MHal_GFLIP_HandleVsyncLimitation(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx); //different chip maybe has different handle.
212*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->bGFlipInVsyncLimitation[u32GopIdx] = TRUE;
213*53ee8cc1Swenshuai.xi continue;
214*53ee8cc1Swenshuai.xi }
215*53ee8cc1Swenshuai.xi
216*53ee8cc1Swenshuai.xi MHal_GFLIP_IntEnable(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx, TRUE);
217*53ee8cc1Swenshuai.xi }
218*53ee8cc1Swenshuai.xi
219*53ee8cc1Swenshuai.xi return TRUE;
220*53ee8cc1Swenshuai.xi }
221*53ee8cc1Swenshuai.xi
222*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
223*53ee8cc1Swenshuai.xi /// Process Irq
224*53ee8cc1Swenshuai.xi /// @param void
225*53ee8cc1Swenshuai.xi /// @return TRUE: success kickoff flip to gop
226*53ee8cc1Swenshuai.xi /// @return FALSE: no flip kickoff to gop
227*53ee8cc1Swenshuai.xi /// @attention
228*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em>
229*53ee8cc1Swenshuai.xi /// step1: check src of vsync. interrupt
230*53ee8cc1Swenshuai.xi /// step2: check if any flip request in queue with this Gop
231*53ee8cc1Swenshuai.xi /// step3: check if TAG back
232*53ee8cc1Swenshuai.xi /// step4: set flip to GOP
233*53ee8cc1Swenshuai.xi /// step5: set ReadPtr to next, this entry consumed!
234*53ee8cc1Swenshuai.xi /// </em></b>
235*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_GFLIP_ProcessIRQ(GOP_CTX_DRV_LOCAL * pGOPDrvLocalCtx)236*53ee8cc1Swenshuai.xi MS_BOOL _MDrv_GFLIP_ProcessIRQ(GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx)
237*53ee8cc1Swenshuai.xi {
238*53ee8cc1Swenshuai.xi MS_U32 u32GopIdx, u32GwinIdx, u32Addr;
239*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel;
240*53ee8cc1Swenshuai.xi
241*53ee8cc1Swenshuai.xi for(u32GopIdx=GFLIP_GOP_IDX_4G; u32GopIdx<MAX_GOP_SUPPORT; u32GopIdx++)
242*53ee8cc1Swenshuai.xi {
243*53ee8cc1Swenshuai.xi //step 1: check src of vsync. interrupt
244*53ee8cc1Swenshuai.xi if(MHal_GFLIP_IsVSyncInt(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx) == FALSE)
245*53ee8cc1Swenshuai.xi {
246*53ee8cc1Swenshuai.xi continue;
247*53ee8cc1Swenshuai.xi }
248*53ee8cc1Swenshuai.xi
249*53ee8cc1Swenshuai.xi for(u32GwinIdx=0; u32GwinIdx<MAX_GOP_GWIN; u32GwinIdx++)
250*53ee8cc1Swenshuai.xi {
251*53ee8cc1Swenshuai.xi //step 2:check if any flip request in queue with this Gop:
252*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx] == pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx]) //no any flip request in queue
253*53ee8cc1Swenshuai.xi {
254*53ee8cc1Swenshuai.xi continue;
255*53ee8cc1Swenshuai.xi }
256*53ee8cc1Swenshuai.xi
257*53ee8cc1Swenshuai.xi //step 3: if get queue, check if TAG back.
258*53ee8cc1Swenshuai.xi if(MHal_GFLIP_IsTagIDBack(&pGOPDrvLocalCtx->halCtxLocal, pGOPDrvLocalCtx->GFlipInfo[u32GopIdx][u32GwinIdx][pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx]].u32TagId) == FALSE)
259*53ee8cc1Swenshuai.xi {
260*53ee8cc1Swenshuai.xi continue;
261*53ee8cc1Swenshuai.xi }
262*53ee8cc1Swenshuai.xi
263*53ee8cc1Swenshuai.xi //Has Flip Request, and Tag Returned! we need programming flip address:
264*53ee8cc1Swenshuai.xi //step 4: if Tag Back: set flip to GOP.
265*53ee8cc1Swenshuai.xi u32Addr = pGOPDrvLocalCtx->GFlipInfo[u32GopIdx][u32GwinIdx][pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx]].u64Addr;
266*53ee8cc1Swenshuai.xi //GOP HW just read the relative offset of each MIU
267*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u32Addr, u32Addr);
268*53ee8cc1Swenshuai.xi MHal_GFLIP_SetFlipToGop(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx, u32GwinIdx, u32Addr);
269*53ee8cc1Swenshuai.xi
270*53ee8cc1Swenshuai.xi //Step 5: set ReadPtr to next, this entry consumed!
271*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx] = (pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx]+1)%MAX_FLIP_ADDR_FIFO;
272*53ee8cc1Swenshuai.xi }
273*53ee8cc1Swenshuai.xi }
274*53ee8cc1Swenshuai.xi
275*53ee8cc1Swenshuai.xi return TRUE;
276*53ee8cc1Swenshuai.xi }
277*53ee8cc1Swenshuai.xi
278*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
279*53ee8cc1Swenshuai.xi /// Handle GFLIP Interrupt notification handler
280*53ee8cc1Swenshuai.xi /// @param irq \b IN: interrupt number
281*53ee8cc1Swenshuai.xi /// @param devid \b IN: device id
282*53ee8cc1Swenshuai.xi /// @return IRQ_HANDLED
283*53ee8cc1Swenshuai.xi /// @attention
284*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em></em></b>
285*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
_MDrv_GFLIP_IntHandler(InterruptNum eIntNum)286*53ee8cc1Swenshuai.xi void _MDrv_GFLIP_IntHandler(InterruptNum eIntNum)
287*53ee8cc1Swenshuai.xi {
288*53ee8cc1Swenshuai.xi //process gflip interrupt:
289*53ee8cc1Swenshuai.xi if(pGFLIP_IntGOPDrvLocalCtx)
290*53ee8cc1Swenshuai.xi {
291*53ee8cc1Swenshuai.xi _MDrv_GFLIP_ProcessIRQ(pGFLIP_IntGOPDrvLocalCtx);
292*53ee8cc1Swenshuai.xi
293*53ee8cc1Swenshuai.xi //clear interrupt
294*53ee8cc1Swenshuai.xi _MDrv_GFLIP_ClearIRQ(pGFLIP_IntGOPDrvLocalCtx);
295*53ee8cc1Swenshuai.xi }
296*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt(E_INT_IRQ_GOP); //Need check if needed.
297*53ee8cc1Swenshuai.xi }
298*53ee8cc1Swenshuai.xi
299*53ee8cc1Swenshuai.xi #endif
300*53ee8cc1Swenshuai.xi //////////////////////////////////////////////////////////////////////////////////////////////////////
301*53ee8cc1Swenshuai.xi
302*53ee8cc1Swenshuai.xi //=============================================================================
303*53ee8cc1Swenshuai.xi // GFLIP Driver Function
304*53ee8cc1Swenshuai.xi //=============================================================================
305*53ee8cc1Swenshuai.xi
306*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
307*53ee8cc1Swenshuai.xi /// GFlip Init(reset flip info ptr, interrupt enable, etc..)
308*53ee8cc1Swenshuai.xi /// @param u32GopIdx \b IN:the idx of gop which need be initialized.
309*53ee8cc1Swenshuai.xi /// @return TRUE: success
310*53ee8cc1Swenshuai.xi /// @attention
311*53ee8cc1Swenshuai.xi /// <b>[Mxlib] <em></em></b>
312*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_GFLIP_Init(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U32 u32GopIdx,MS_BOOL bEnableVsyncIntFlip)313*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_Init(MS_GOP_CTX_LOCAL *pGOPCtx, MS_U32 u32GopIdx, MS_BOOL bEnableVsyncIntFlip)
314*53ee8cc1Swenshuai.xi {
315*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
316*53ee8cc1Swenshuai.xi
317*53ee8cc1Swenshuai.xi if(u32GopIdx >= MAX_GOP_SUPPORT) //overflow
318*53ee8cc1Swenshuai.xi {
319*53ee8cc1Swenshuai.xi return FALSE;
320*53ee8cc1Swenshuai.xi }
321*53ee8cc1Swenshuai.xi
322*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx] = bEnableVsyncIntFlip;
323*53ee8cc1Swenshuai.xi
324*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx])
325*53ee8cc1Swenshuai.xi {
326*53ee8cc1Swenshuai.xi
327*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
328*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
329*53ee8cc1Swenshuai.xi extern MS_U32 _MDrv_GFLIPIO_Init(MS_U32 u32GopIdx);
330*53ee8cc1Swenshuai.xi if(_MDrv_GFLIPIO_Init(u32GopIdx))
331*53ee8cc1Swenshuai.xi {
332*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
333*53ee8cc1Swenshuai.xi return FALSE;
334*53ee8cc1Swenshuai.xi }
335*53ee8cc1Swenshuai.xi #endif
336*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
337*53ee8cc1Swenshuai.xi if(0> pGOPDrvLocalCtx->s32FdGFlip)
338*53ee8cc1Swenshuai.xi {
339*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->s32FdGFlip = open("/dev/gflip", O_RDWR);
340*53ee8cc1Swenshuai.xi if(0> pGOPDrvLocalCtx->s32FdGFlip)
341*53ee8cc1Swenshuai.xi {
342*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] open fail /dev/gflip\n", __FUNCTION__, __LINE__);
343*53ee8cc1Swenshuai.xi return FALSE;
344*53ee8cc1Swenshuai.xi }
345*53ee8cc1Swenshuai.xi }
346*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx->s32FdGFlip >= 0)
347*53ee8cc1Swenshuai.xi {
348*53ee8cc1Swenshuai.xi if(ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_INIT, &u32GopIdx))
349*53ee8cc1Swenshuai.xi {
350*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
351*53ee8cc1Swenshuai.xi close(pGOPDrvLocalCtx->s32FdGFlip);
352*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->s32FdGFlip = -1;
353*53ee8cc1Swenshuai.xi return FALSE;
354*53ee8cc1Swenshuai.xi }
355*53ee8cc1Swenshuai.xi }
356*53ee8cc1Swenshuai.xi #else
357*53ee8cc1Swenshuai.xi {
358*53ee8cc1Swenshuai.xi pGFLIP_IntGOPDrvLocalCtx = pGOPDrvLocalCtx;
359*53ee8cc1Swenshuai.xi
360*53ee8cc1Swenshuai.xi if((++pGOPDrvLocalCtx->u16GOPRefCnt[u32GopIdx]) > 1)
361*53ee8cc1Swenshuai.xi {
362*53ee8cc1Swenshuai.xi return TRUE;
363*53ee8cc1Swenshuai.xi }
364*53ee8cc1Swenshuai.xi
365*53ee8cc1Swenshuai.xi //Attch IRQ:
366*53ee8cc1Swenshuai.xi MsOS_AttachInterrupt(E_INT_IRQ_GOP, (InterruptCb)_MDrv_GFLIP_IntHandler);
367*53ee8cc1Swenshuai.xi MsOS_EnableInterrupt(E_INT_IRQ_GOP); //Need check if needed.
368*53ee8cc1Swenshuai.xi
369*53ee8cc1Swenshuai.xi //reset flip Info:
370*53ee8cc1Swenshuai.xi _MDrv_GFLIP_ResetFlipInfoPtr(pGOPCtx, u32GopIdx);
371*53ee8cc1Swenshuai.xi //enable gop hw interrupt:
372*53ee8cc1Swenshuai.xi MHal_GFLIP_IntEnable(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx,TRUE);
373*53ee8cc1Swenshuai.xi }
374*53ee8cc1Swenshuai.xi #endif
375*53ee8cc1Swenshuai.xi }
376*53ee8cc1Swenshuai.xi else
377*53ee8cc1Swenshuai.xi {
378*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
379*53ee8cc1Swenshuai.xi if(0> pGOPDrvLocalCtx->s32FdGFlip)
380*53ee8cc1Swenshuai.xi {
381*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->s32FdGFlip = open("/dev/gflip", O_RDWR);
382*53ee8cc1Swenshuai.xi if(0> pGOPDrvLocalCtx->s32FdGFlip)
383*53ee8cc1Swenshuai.xi {//In order to Get DWin Int Infor from Kernel, Open the GFlip Dev but not enable GFilp.
384*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] open fail /dev/gflip\n", __FUNCTION__, __LINE__);
385*53ee8cc1Swenshuai.xi return FALSE;
386*53ee8cc1Swenshuai.xi }
387*53ee8cc1Swenshuai.xi }
388*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX_KERNEL)
389*53ee8cc1Swenshuai.xi #else
390*53ee8cc1Swenshuai.xi pGFLIP_IntGOPDrvLocalCtx = pGOPDrvLocalCtx;
391*53ee8cc1Swenshuai.xi
392*53ee8cc1Swenshuai.xi if((++pGOPDrvLocalCtx->u16GOPRefCnt[u32GopIdx]) > 1)
393*53ee8cc1Swenshuai.xi {
394*53ee8cc1Swenshuai.xi return TRUE;
395*53ee8cc1Swenshuai.xi }
396*53ee8cc1Swenshuai.xi
397*53ee8cc1Swenshuai.xi _MDrv_GFLIP_ResetFlipInfoPtr(pGOPCtx, u32GopIdx);
398*53ee8cc1Swenshuai.xi #endif
399*53ee8cc1Swenshuai.xi MHal_GFLIP_IntEnable(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx, FALSE);
400*53ee8cc1Swenshuai.xi }
401*53ee8cc1Swenshuai.xi
402*53ee8cc1Swenshuai.xi return TRUE;
403*53ee8cc1Swenshuai.xi }
404*53ee8cc1Swenshuai.xi
405*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
406*53ee8cc1Swenshuai.xi /// GFlip DeInit(interrupt disable)
407*53ee8cc1Swenshuai.xi /// @param u32GopIdx \b IN:the idx of gop which need be de-initialized.
408*53ee8cc1Swenshuai.xi /// @return TRUE: success
409*53ee8cc1Swenshuai.xi /// @attention
410*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em></em></b>
411*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_GFLIP_DeInit(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U32 u32GopIdx)412*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_DeInit(MS_GOP_CTX_LOCAL *pGOPCtx, MS_U32 u32GopIdx)
413*53ee8cc1Swenshuai.xi {
414*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
415*53ee8cc1Swenshuai.xi
416*53ee8cc1Swenshuai.xi if(u32GopIdx >= MAX_GOP_SUPPORT) //overflow
417*53ee8cc1Swenshuai.xi {
418*53ee8cc1Swenshuai.xi return FALSE;
419*53ee8cc1Swenshuai.xi }
420*53ee8cc1Swenshuai.xi
421*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx])
422*53ee8cc1Swenshuai.xi {
423*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
424*53ee8cc1Swenshuai.xi {
425*53ee8cc1Swenshuai.xi close(pGOPDrvLocalCtx->s32FdGFlip);
426*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->s32FdGFlip = -1;
427*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx] = FALSE; //Application not shared
428*53ee8cc1Swenshuai.xi }
429*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX_KERNEL)
430*53ee8cc1Swenshuai.xi {
431*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx] = FALSE; //Application not shared
432*53ee8cc1Swenshuai.xi }
433*53ee8cc1Swenshuai.xi #else
434*53ee8cc1Swenshuai.xi {
435*53ee8cc1Swenshuai.xi if(0 == (--pGOPDrvLocalCtx->u16GOPRefCnt[u32GopIdx]))
436*53ee8cc1Swenshuai.xi {
437*53ee8cc1Swenshuai.xi MHal_GFLIP_IntEnable(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx, FALSE);
438*53ee8cc1Swenshuai.xi MsOS_DisableInterrupt(E_INT_IRQ_GOP);
439*53ee8cc1Swenshuai.xi MsOS_DetachInterrupt(E_INT_IRQ_GOP);
440*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx] = FALSE;
441*53ee8cc1Swenshuai.xi }
442*53ee8cc1Swenshuai.xi }
443*53ee8cc1Swenshuai.xi #endif
444*53ee8cc1Swenshuai.xi }
445*53ee8cc1Swenshuai.xi else
446*53ee8cc1Swenshuai.xi {
447*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
448*53ee8cc1Swenshuai.xi {
449*53ee8cc1Swenshuai.xi close(pGOPDrvLocalCtx->s32FdGFlip);
450*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->s32FdGFlip = -1;
451*53ee8cc1Swenshuai.xi }
452*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX_KERNEL)
453*53ee8cc1Swenshuai.xi #else
454*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->u16GOPRefCnt[u32GopIdx]--;
455*53ee8cc1Swenshuai.xi #endif
456*53ee8cc1Swenshuai.xi }
457*53ee8cc1Swenshuai.xi
458*53ee8cc1Swenshuai.xi return TRUE;
459*53ee8cc1Swenshuai.xi }
460*53ee8cc1Swenshuai.xi
461*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
462*53ee8cc1Swenshuai.xi /// Set Flip Info(flip request) to GFlip
463*53ee8cc1Swenshuai.xi /// @param u32GopIdx \b IN: the gop which flip kickoff to
464*53ee8cc1Swenshuai.xi /// @param u32GwinIdx \b IN: the gwin which flip kickoff to
465*53ee8cc1Swenshuai.xi /// @param u32Addr \b IN: the flip address which will be kickoff
466*53ee8cc1Swenshuai.xi /// @param u32TagId \b IN: the TagId need be waited before flip
467*53ee8cc1Swenshuai.xi /// @param u32QEntry \b IN: the queued flips, if current queued flips >= u32QEntry, won't set this flip request to gop
468*53ee8cc1Swenshuai.xi /// @param u32QEntry \b out: the current queued flips in GFLIP
469*53ee8cc1Swenshuai.xi /// @return TRUE: DDI call success
470*53ee8cc1Swenshuai.xi /// @attention
471*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em>Flip when vsync interrupt, and the DDI used for set flip info to GFlip. </em></b>
472*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_GFLIP_SetMultiFlipInfo(MS_GOP_CTX_LOCAL * pGOPCtx,MS_GFLIP_MULTIINFO * pMultiinfo)473*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_SetMultiFlipInfo(MS_GOP_CTX_LOCAL*pGOPCtx,MS_GFLIP_MULTIINFO* pMultiinfo)
474*53ee8cc1Swenshuai.xi {
475*53ee8cc1Swenshuai.xi MS_BOOL bRet = TRUE;
476*53ee8cc1Swenshuai.xi
477*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
478*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
479*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_SetMultiFlipInfo(MS_GFLIP_MULTIINFO * pMultiFlipInfo);
480*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_SetMultiFlipInfo(pMultiinfo))
481*53ee8cc1Swenshuai.xi {
482*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
483*53ee8cc1Swenshuai.xi return FALSE;
484*53ee8cc1Swenshuai.xi }
485*53ee8cc1Swenshuai.xi #endif
486*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
487*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
488*53ee8cc1Swenshuai.xi
489*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
490*53ee8cc1Swenshuai.xi {
491*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
492*53ee8cc1Swenshuai.xi return FALSE;
493*53ee8cc1Swenshuai.xi }
494*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SETMULTIFLIPINFO,pMultiinfo))
495*53ee8cc1Swenshuai.xi {
496*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] fail!!!!\n",__FUNCTION__,__LINE__);
497*53ee8cc1Swenshuai.xi bRet = FALSE;
498*53ee8cc1Swenshuai.xi }
499*53ee8cc1Swenshuai.xi #endif
500*53ee8cc1Swenshuai.xi return bRet;
501*53ee8cc1Swenshuai.xi }
502*53ee8cc1Swenshuai.xi
MDrv_GFLIP_SetTLBMultiFlipInfo(MS_GOP_CTX_LOCAL * pGOPCtx,MS_TLB_GFLIP_MULTIINFO * pTLBMultiinfo)503*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_SetTLBMultiFlipInfo(MS_GOP_CTX_LOCAL*pGOPCtx,MS_TLB_GFLIP_MULTIINFO* pTLBMultiinfo)
504*53ee8cc1Swenshuai.xi {
505*53ee8cc1Swenshuai.xi MS_BOOL bRet = TRUE;
506*53ee8cc1Swenshuai.xi
507*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
508*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
509*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_SetTLBMultiFlipInfo(MS_TLB_GFLIP_MULTIINFO * pTLBMultiFlipInfo);
510*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_SetTLBMultiFlipInfo(pTLBMultiinfo))
511*53ee8cc1Swenshuai.xi {
512*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
513*53ee8cc1Swenshuai.xi return FALSE;
514*53ee8cc1Swenshuai.xi }
515*53ee8cc1Swenshuai.xi #endif
516*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
517*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
518*53ee8cc1Swenshuai.xi
519*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
520*53ee8cc1Swenshuai.xi {
521*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
522*53ee8cc1Swenshuai.xi return FALSE;
523*53ee8cc1Swenshuai.xi }
524*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SETTLBMULTIFLIPINFO,pTLBMultiinfo))
525*53ee8cc1Swenshuai.xi {
526*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] fail!!!!\n",__FUNCTION__,__LINE__);
527*53ee8cc1Swenshuai.xi bRet = FALSE;
528*53ee8cc1Swenshuai.xi }
529*53ee8cc1Swenshuai.xi #endif
530*53ee8cc1Swenshuai.xi return bRet;
531*53ee8cc1Swenshuai.xi }
532*53ee8cc1Swenshuai.xi
MDrv_GFLIP_SetFlipInfo(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U32 u32GopIdx,MS_U32 u32GwinIdx,MS_PHY u64MainAddress,MS_PHY u64SubAddress,MS_U32 u32TagId,MS_U32 * u32QEntry)533*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_SetFlipInfo(MS_GOP_CTX_LOCAL*pGOPCtx, MS_U32 u32GopIdx, MS_U32 u32GwinIdx, MS_PHY u64MainAddress, MS_PHY u64SubAddress, MS_U32 u32TagId, MS_U32 * u32QEntry)
534*53ee8cc1Swenshuai.xi {
535*53ee8cc1Swenshuai.xi MS_U16 u16WordUnit=0;
536*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
537*53ee8cc1Swenshuai.xi MS_U8 u8MiuSel=0xFF;
538*53ee8cc1Swenshuai.xi UNUSED(u8MiuSel);
539*53ee8cc1Swenshuai.xi
540*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx->apiCtxLocal.pGOPCtxShared->bPixelMode[u32GopIdx] == TRUE)
541*53ee8cc1Swenshuai.xi {
542*53ee8cc1Swenshuai.xi u16WordUnit = 1;
543*53ee8cc1Swenshuai.xi }
544*53ee8cc1Swenshuai.xi else
545*53ee8cc1Swenshuai.xi {
546*53ee8cc1Swenshuai.xi u16WordUnit = GOP_WordUnit;
547*53ee8cc1Swenshuai.xi }
548*53ee8cc1Swenshuai.xi
549*53ee8cc1Swenshuai.xi //GOP HW just read the relative offset of each MIU
550*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u64MainAddress, u64MainAddress);
551*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx])
552*53ee8cc1Swenshuai.xi {
553*53ee8cc1Swenshuai.xi if((u32GopIdx >= MAX_GOP_SUPPORT) || (u32GwinIdx >= MAX_GOP_GWIN)) //overflow
554*53ee8cc1Swenshuai.xi {
555*53ee8cc1Swenshuai.xi return FALSE;
556*53ee8cc1Swenshuai.xi }
557*53ee8cc1Swenshuai.xi
558*53ee8cc1Swenshuai.xi #if defined(MSOS_TYPE_LINUX) || defined(MSOS_TYPE_LINUX_KERNEL)
559*53ee8cc1Swenshuai.xi {
560*53ee8cc1Swenshuai.xi MS_GFLIP_INFO stFlinInfo;
561*53ee8cc1Swenshuai.xi MS_BOOL bRet = TRUE;
562*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX
563*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
564*53ee8cc1Swenshuai.xi {
565*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
566*53ee8cc1Swenshuai.xi return FALSE;
567*53ee8cc1Swenshuai.xi }
568*53ee8cc1Swenshuai.xi #endif
569*53ee8cc1Swenshuai.xi
570*53ee8cc1Swenshuai.xi stFlinInfo.u32GopIdx = u32GopIdx;
571*53ee8cc1Swenshuai.xi stFlinInfo.u32GwinIdx = u32GwinIdx;
572*53ee8cc1Swenshuai.xi stFlinInfo.u64Addr= u64MainAddress;
573*53ee8cc1Swenshuai.xi stFlinInfo.u32TagId= u32TagId;
574*53ee8cc1Swenshuai.xi stFlinInfo.u32QEntry= *u32QEntry;
575*53ee8cc1Swenshuai.xi stFlinInfo.u32Result = TRUE;
576*53ee8cc1Swenshuai.xi if((pGOPCtx->pGOPCtxShared->GOP_StereoMode[u32GopIdx] != E_DRV_GOP_3D_DISABLE) &&
577*53ee8cc1Swenshuai.xi (u64SubAddress != 0))
578*53ee8cc1Swenshuai.xi {
579*53ee8cc1Swenshuai.xi MS_GFLIP_3DINFO st3DFlipInfo;
580*53ee8cc1Swenshuai.xi //GOP HW just read the relative offset of each MIU
581*53ee8cc1Swenshuai.xi _phy_to_miu_offset(u8MiuSel, u64SubAddress, u64SubAddress);
582*53ee8cc1Swenshuai.xi memcpy(&st3DFlipInfo, &stFlinInfo, sizeof(MS_GFLIP_INFO));
583*53ee8cc1Swenshuai.xi st3DFlipInfo.u64SubAddr = u64SubAddress;
584*53ee8cc1Swenshuai.xi
585*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
586*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
587*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_SetFlipInfo(MS_U32 u32GopIdx,MS_U32 u32GwinIdx,MS_PHY u32MainAddr,MS_PHY u32SubAddr,MS_U32 u32TagId,MS_U32 * u32QEntry,MS_U32 * u32Result);
588*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_SetFlipInfo(stFlinInfo.u32GopIdx, stFlinInfo.u32GwinIdx, stFlinInfo.u64Addr, st3DFlipInfo.u64SubAddr, stFlinInfo.u32TagId, &(stFlinInfo.u32QEntry), &(stFlinInfo.u32Result)))
589*53ee8cc1Swenshuai.xi {
590*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
591*53ee8cc1Swenshuai.xi return FALSE;
592*53ee8cc1Swenshuai.xi }
593*53ee8cc1Swenshuai.xi #endif
594*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
595*53ee8cc1Swenshuai.xi
596*53ee8cc1Swenshuai.xi if((pGOPCtx->pGOPCtxShared->bTLB[u32GopIdx]))
597*53ee8cc1Swenshuai.xi {
598*53ee8cc1Swenshuai.xi MS_TLB_GFLIP_3DINFO stTLB3DFlipInfo;
599*53ee8cc1Swenshuai.xi //GOP HW just read the relative offset of each MIU
600*53ee8cc1Swenshuai.xi memcpy(&stTLB3DFlipInfo, &st3DFlipInfo, sizeof(MS_GFLIP_INFO));
601*53ee8cc1Swenshuai.xi stTLB3DFlipInfo.bTLBEnable = pGOPCtx->pGOPCtxShared->bTLB[u32GopIdx];
602*53ee8cc1Swenshuai.xi stTLB3DFlipInfo.u64TLBAddr = pGOPCtx->pGOPCtxShared->u64TLBAddress[u32GopIdx];
603*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_TLBSET3DFLIPINFO, &stTLB3DFlipInfo))
604*53ee8cc1Swenshuai.xi {
605*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
606*53ee8cc1Swenshuai.xi bRet = FALSE;
607*53ee8cc1Swenshuai.xi }
608*53ee8cc1Swenshuai.xi }
609*53ee8cc1Swenshuai.xi else
610*53ee8cc1Swenshuai.xi {
611*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SET3DFLIPINFO, &st3DFlipInfo))
612*53ee8cc1Swenshuai.xi {
613*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
614*53ee8cc1Swenshuai.xi bRet = FALSE;
615*53ee8cc1Swenshuai.xi }
616*53ee8cc1Swenshuai.xi }
617*53ee8cc1Swenshuai.xi #endif
618*53ee8cc1Swenshuai.xi if(bRet)
619*53ee8cc1Swenshuai.xi {
620*53ee8cc1Swenshuai.xi memcpy(&stFlinInfo, &st3DFlipInfo, sizeof(MS_GFLIP_INFO));
621*53ee8cc1Swenshuai.xi }
622*53ee8cc1Swenshuai.xi else
623*53ee8cc1Swenshuai.xi {
624*53ee8cc1Swenshuai.xi return FALSE;
625*53ee8cc1Swenshuai.xi }
626*53ee8cc1Swenshuai.xi }
627*53ee8cc1Swenshuai.xi else
628*53ee8cc1Swenshuai.xi {
629*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
630*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
631*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_SetFlipInfo(MS_U32 u32GopIdx, MS_U32 u32GwinIdx, MS_PHY u32MainAddr, MS_PHY u32SubAddr, MS_U32 u32TagId, MS_U32 * u32QEntry, MS_U32 *u32Result);
632*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_SetFlipInfo(stFlinInfo.u32GopIdx, stFlinInfo.u32GwinIdx, stFlinInfo.u64Addr, 0, stFlinInfo.u32TagId, &stFlinInfo.u32QEntry, &stFlinInfo.u32Result))
633*53ee8cc1Swenshuai.xi {
634*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
635*53ee8cc1Swenshuai.xi return FALSE;
636*53ee8cc1Swenshuai.xi }
637*53ee8cc1Swenshuai.xi #endif
638*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
639*53ee8cc1Swenshuai.xi if((pGOPCtx->pGOPCtxShared->bTLB[u32GopIdx]))
640*53ee8cc1Swenshuai.xi {
641*53ee8cc1Swenshuai.xi MS_TLB_GFLIP_INFO stTLBFlinInfo;
642*53ee8cc1Swenshuai.xi //GOP HW just read the relative offset of each MIU
643*53ee8cc1Swenshuai.xi memcpy(&stTLBFlinInfo, &stFlinInfo, sizeof(MS_GFLIP_INFO));
644*53ee8cc1Swenshuai.xi stTLBFlinInfo.bTLBEnable = pGOPCtx->pGOPCtxShared->bTLB[u32GopIdx];
645*53ee8cc1Swenshuai.xi stTLBFlinInfo.u64TLBAddr = pGOPCtx->pGOPCtxShared->u64TLBAddress[u32GopIdx];
646*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_TLBSETFLIPINFO, &stTLBFlinInfo))
647*53ee8cc1Swenshuai.xi {
648*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
649*53ee8cc1Swenshuai.xi bRet = FALSE;
650*53ee8cc1Swenshuai.xi }
651*53ee8cc1Swenshuai.xi }
652*53ee8cc1Swenshuai.xi else
653*53ee8cc1Swenshuai.xi {
654*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SETFLIPINFO, &stFlinInfo))
655*53ee8cc1Swenshuai.xi {
656*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
657*53ee8cc1Swenshuai.xi bRet = FALSE;
658*53ee8cc1Swenshuai.xi }
659*53ee8cc1Swenshuai.xi }
660*53ee8cc1Swenshuai.xi #endif
661*53ee8cc1Swenshuai.xi }
662*53ee8cc1Swenshuai.xi if(bRet)
663*53ee8cc1Swenshuai.xi {
664*53ee8cc1Swenshuai.xi *u32QEntry = stFlinInfo.u32QEntry;
665*53ee8cc1Swenshuai.xi return stFlinInfo.u32Result;
666*53ee8cc1Swenshuai.xi }
667*53ee8cc1Swenshuai.xi else
668*53ee8cc1Swenshuai.xi {
669*53ee8cc1Swenshuai.xi return FALSE;
670*53ee8cc1Swenshuai.xi }
671*53ee8cc1Swenshuai.xi }
672*53ee8cc1Swenshuai.xi #else
673*53ee8cc1Swenshuai.xi {
674*53ee8cc1Swenshuai.xi MS_U32 u32NextWritePtr;
675*53ee8cc1Swenshuai.xi MS_U32 u32QCnt = 0;
676*53ee8cc1Swenshuai.xi
677*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bGFlipInVsyncLimitation[u32GopIdx])
678*53ee8cc1Swenshuai.xi { //in handling vsync limitation status, just print the error and return true to avoid block app:
679*53ee8cc1Swenshuai.xi GFLIP_PRINT("\n !!! [%s][%d]Error. No Signal for GOP Clock Source and GFlip Vsync Interrupt disabled!!!\n",__FUNCTION__,__LINE__);
680*53ee8cc1Swenshuai.xi return TRUE;
681*53ee8cc1Swenshuai.xi }
682*53ee8cc1Swenshuai.xi
683*53ee8cc1Swenshuai.xi u32NextWritePtr = (pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx]+1) % MAX_FLIP_ADDR_FIFO;
684*53ee8cc1Swenshuai.xi if(u32NextWritePtr !=pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx]) //can write
685*53ee8cc1Swenshuai.xi {
686*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] >= pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx])
687*53ee8cc1Swenshuai.xi {
688*53ee8cc1Swenshuai.xi u32QCnt = pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] -pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx];
689*53ee8cc1Swenshuai.xi }
690*53ee8cc1Swenshuai.xi else
691*53ee8cc1Swenshuai.xi {
692*53ee8cc1Swenshuai.xi u32QCnt = MAX_FLIP_ADDR_FIFO + pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] - pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx];
693*53ee8cc1Swenshuai.xi }
694*53ee8cc1Swenshuai.xi
695*53ee8cc1Swenshuai.xi if(u32QCnt >= *u32QEntry )
696*53ee8cc1Swenshuai.xi {
697*53ee8cc1Swenshuai.xi *u32QEntry = u32QCnt;
698*53ee8cc1Swenshuai.xi return FALSE;
699*53ee8cc1Swenshuai.xi }
700*53ee8cc1Swenshuai.xi
701*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->GFlipInfo[u32GopIdx][u32GwinIdx][pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx]].u64Addr = (u64MainAddress/u16WordUnit);
702*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->GFlipInfo[u32GopIdx][u32GwinIdx][pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx]].u32TagId= u32TagId;
703*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] = u32NextWritePtr;
704*53ee8cc1Swenshuai.xi
705*53ee8cc1Swenshuai.xi //Hold on when New QCnt can't match requested QCnt:
706*53ee8cc1Swenshuai.xi //Fix issue if we set Flip Info and back which leads to App write to on-show window.
707*53ee8cc1Swenshuai.xi while(TRUE)
708*53ee8cc1Swenshuai.xi {
709*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] >= pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx])
710*53ee8cc1Swenshuai.xi {
711*53ee8cc1Swenshuai.xi u32QCnt = pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] -pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx];
712*53ee8cc1Swenshuai.xi }
713*53ee8cc1Swenshuai.xi else
714*53ee8cc1Swenshuai.xi {
715*53ee8cc1Swenshuai.xi u32QCnt = MAX_FLIP_ADDR_FIFO + pGOPDrvLocalCtx->u32GFlipInfoWritePtr[u32GopIdx][u32GwinIdx] - pGOPDrvLocalCtx->u32GFlipInfoReadPtr[u32GopIdx][u32GwinIdx];
716*53ee8cc1Swenshuai.xi }
717*53ee8cc1Swenshuai.xi
718*53ee8cc1Swenshuai.xi if( u32QCnt < *u32QEntry )
719*53ee8cc1Swenshuai.xi {
720*53ee8cc1Swenshuai.xi break;
721*53ee8cc1Swenshuai.xi }
722*53ee8cc1Swenshuai.xi }
723*53ee8cc1Swenshuai.xi
724*53ee8cc1Swenshuai.xi //since do not do the sync. with mutex/spinlock, the return of avaiable queue number maybe not accurate.
725*53ee8cc1Swenshuai.xi *u32QEntry = (u32QCnt + 1);
726*53ee8cc1Swenshuai.xi
727*53ee8cc1Swenshuai.xi return TRUE;
728*53ee8cc1Swenshuai.xi }
729*53ee8cc1Swenshuai.xi else
730*53ee8cc1Swenshuai.xi {
731*53ee8cc1Swenshuai.xi *u32QEntry = MAX_FLIP_ADDR_FIFO-1;
732*53ee8cc1Swenshuai.xi return FALSE;
733*53ee8cc1Swenshuai.xi }
734*53ee8cc1Swenshuai.xi }
735*53ee8cc1Swenshuai.xi #endif
736*53ee8cc1Swenshuai.xi }
737*53ee8cc1Swenshuai.xi else
738*53ee8cc1Swenshuai.xi {
739*53ee8cc1Swenshuai.xi MS_PHY u64tmp;
740*53ee8cc1Swenshuai.xi MS_U32 u32BankOffSet=0;
741*53ee8cc1Swenshuai.xi _GetBnkOfstByGop(u32GopIdx, &u32BankOffSet);
742*53ee8cc1Swenshuai.xi
743*53ee8cc1Swenshuai.xi if((pGOPCtx->pGOPCtxShared->bTLB[u32GopIdx]))
744*53ee8cc1Swenshuai.xi {
745*53ee8cc1Swenshuai.xi if(pGOPCtx->pGOPCtxShared->u64TLBAddress[u32GopIdx])
746*53ee8cc1Swenshuai.xi {
747*53ee8cc1Swenshuai.xi u64tmp = pGOPCtx->pGOPCtxShared->u64TLBAddress[u32GopIdx] + (u64MainAddress/PAGE_SIZE)*TLB_PER_ENTRY_SIZE;
748*53ee8cc1Swenshuai.xi u64tmp /= ADDRESSING_8BYTE_UNIT;
749*53ee8cc1Swenshuai.xi HAL_GOP_Write16Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet+REG_TLB_BASE_ADDR_L, u64tmp&GOP_REG_WORD_MASK, GOP_REG_WORD_MASK);
750*53ee8cc1Swenshuai.xi HAL_GOP_Write16Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet+REG_TLB_BASE_ADDR_H, u64tmp>>16, GOP_REG_WORD_MASK);
751*53ee8cc1Swenshuai.xi u64tmp = u64MainAddress % (PAGE_SIZE*PER_MIU_TLB_ENTRY_COUNT);
752*53ee8cc1Swenshuai.xi u64tmp = u64tmp /u16WordUnit;
753*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_DRAM_RBLK_L(u32GwinIdx), u64tmp);
754*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_DRAM_RBLK_H(u32GwinIdx), 0);
755*53ee8cc1Swenshuai.xi }
756*53ee8cc1Swenshuai.xi
757*53ee8cc1Swenshuai.xi if((pGOPCtx->pGOPCtxShared->GOP_StereoMode[u32GopIdx] != E_DRV_GOP_3D_DISABLE)&&(pGOPCtx->pGOPCtxShared->u64TLBAddress[u32GopIdx]!= 0))
758*53ee8cc1Swenshuai.xi {
759*53ee8cc1Swenshuai.xi u64tmp = pGOPCtx->pGOPCtxShared->u64TLBAddress[u32GopIdx] + (u64SubAddress/PAGE_SIZE)*TLB_PER_ENTRY_SIZE;
760*53ee8cc1Swenshuai.xi u64tmp /= ADDRESSING_8BYTE_UNIT;
761*53ee8cc1Swenshuai.xi HAL_GOP_Write16Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet+REG_TLB_BASE_ADDR_RVIEW_L, u64tmp&GOP_REG_WORD_MASK, GOP_REG_WORD_MASK);
762*53ee8cc1Swenshuai.xi HAL_GOP_Write16Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet+REG_TLB_BASE_ADDR_RVIEW_H, u64tmp>>16, GOP_REG_WORD_MASK);
763*53ee8cc1Swenshuai.xi u64tmp = u64SubAddress % (PAGE_SIZE*PER_MIU_TLB_ENTRY_COUNT);
764*53ee8cc1Swenshuai.xi u64tmp = u64tmp /u16WordUnit;
765*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_3DOSD_SUB_RBLK_L(u32GwinIdx), u64tmp);
766*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_3DOSD_SUB_RBLK_H(u32GwinIdx), 0);
767*53ee8cc1Swenshuai.xi }
768*53ee8cc1Swenshuai.xi }
769*53ee8cc1Swenshuai.xi else
770*53ee8cc1Swenshuai.xi {
771*53ee8cc1Swenshuai.xi u64tmp = u64MainAddress /u16WordUnit;
772*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_DRAM_RBLK_L(u32GwinIdx), u64tmp);
773*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_DRAM_RBLK_H(u32GwinIdx), u64tmp>>16);
774*53ee8cc1Swenshuai.xi if((pGOPCtx->pGOPCtxShared->GOP_StereoMode[u32GopIdx] != E_DRV_GOP_3D_DISABLE) && (u64SubAddress != 0))
775*53ee8cc1Swenshuai.xi {
776*53ee8cc1Swenshuai.xi u64tmp = u64SubAddress /u16WordUnit;
777*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_3DOSD_SUB_RBLK_L(u32GwinIdx), u64tmp);
778*53ee8cc1Swenshuai.xi HAL_GOP_Write32Reg(&pGOPDrvLocalCtx->halCtxLocal, u32BankOffSet + GOP_4G_3DOSD_SUB_RBLK_H(u32GwinIdx), u64tmp>>16);
779*53ee8cc1Swenshuai.xi }
780*53ee8cc1Swenshuai.xi }
781*53ee8cc1Swenshuai.xi
782*53ee8cc1Swenshuai.xi MDrv_GOP_GWIN_UpdateReg(pGOPCtx,u32GopIdx);
783*53ee8cc1Swenshuai.xi
784*53ee8cc1Swenshuai.xi return TRUE;
785*53ee8cc1Swenshuai.xi }
786*53ee8cc1Swenshuai.xi }
787*53ee8cc1Swenshuai.xi
788*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
789*53ee8cc1Swenshuai.xi /// Set Gwin Info(3D request) to GFlip
790*53ee8cc1Swenshuai.xi /// @param u32GopIdx \b IN: the gop which flip kickoff to
791*53ee8cc1Swenshuai.xi /// @param u32GwinIdx \b IN: the gwin which flip kickoff to
792*53ee8cc1Swenshuai.xi /// @param u32Addr \b IN: the flip address which will be kickoff
793*53ee8cc1Swenshuai.xi /// @param u32TagId \b IN: the TagId need be waited before flip
794*53ee8cc1Swenshuai.xi /// @param u32QEntry \b IN: the queued flips, if current queued flips >= u32QEntry, won't set this flip request to gop
795*53ee8cc1Swenshuai.xi /// @param u32QEntry \b out: the current queued flips in GFLIP
796*53ee8cc1Swenshuai.xi /// @return TRUE: DDI call success
797*53ee8cc1Swenshuai.xi /// @attention
798*53ee8cc1Swenshuai.xi /// <b>[MxLib] <em>Flip when vsync interrupt, and the DDI used for set flip info to GFlip. </em></b>
799*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_GFLIP_SetGwinInfo(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U8 u8GopIdx,MS_U8 u8GwinIdx,DRV_GOP_GWIN_INFO * pinfo)800*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_SetGwinInfo(MS_GOP_CTX_LOCAL*pGOPCtx, MS_U8 u8GopIdx, MS_U8 u8GwinIdx,DRV_GOP_GWIN_INFO* pinfo)
801*53ee8cc1Swenshuai.xi {
802*53ee8cc1Swenshuai.xi MS_GWIN_INFO MsGwinInfo;
803*53ee8cc1Swenshuai.xi
804*53ee8cc1Swenshuai.xi MsGwinInfo.u8GopIdx = u8GopIdx;
805*53ee8cc1Swenshuai.xi MsGwinInfo.u8GwinIdx = u8GwinIdx;
806*53ee8cc1Swenshuai.xi MsGwinInfo.u64Addr = pinfo->u64DRAMRBlkStart;
807*53ee8cc1Swenshuai.xi MsGwinInfo.u16X = pinfo->u16DispHPixelStart;
808*53ee8cc1Swenshuai.xi MsGwinInfo.u16Y = pinfo->u16DispVPixelStart;
809*53ee8cc1Swenshuai.xi MsGwinInfo.u16W = pinfo->u16RBlkHPixSize;
810*53ee8cc1Swenshuai.xi MsGwinInfo.u16H = pinfo->u16RBlkVPixSize;
811*53ee8cc1Swenshuai.xi MsGwinInfo.clrType =(GFLIP_COLOR_TYPE)pinfo->clrType;
812*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
813*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
814*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_SetGwinInfo(MS_GWIN_INFO stGwinInfo);
815*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_SetGwinInfo(MsGwinInfo))
816*53ee8cc1Swenshuai.xi {
817*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
818*53ee8cc1Swenshuai.xi return FALSE;
819*53ee8cc1Swenshuai.xi }
820*53ee8cc1Swenshuai.xi #endif
821*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
822*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
823*53ee8cc1Swenshuai.xi
824*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
825*53ee8cc1Swenshuai.xi {
826*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
827*53ee8cc1Swenshuai.xi return FALSE;
828*53ee8cc1Swenshuai.xi }
829*53ee8cc1Swenshuai.xi if(ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SETGWININFO, &MsGwinInfo))
830*53ee8cc1Swenshuai.xi {
831*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
832*53ee8cc1Swenshuai.xi return FALSE;
833*53ee8cc1Swenshuai.xi }
834*53ee8cc1Swenshuai.xi
835*53ee8cc1Swenshuai.xi #endif
836*53ee8cc1Swenshuai.xi return TRUE;
837*53ee8cc1Swenshuai.xi
838*53ee8cc1Swenshuai.xi }
839*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
840*53ee8cc1Swenshuai.xi /// Restore HW Limitation -- Vsync Limitation.
841*53ee8cc1Swenshuai.xi /// @return TRUE: success
842*53ee8cc1Swenshuai.xi /// @attention
843*53ee8cc1Swenshuai.xi /// <b>[Mxlib] <em></em></b>
844*53ee8cc1Swenshuai.xi //-------------------------------------------------------------------------------------------------
MDrv_GFLIP_RestoreFromVsyncLimitation(MS_GOP_CTX_LOCAL * pGOPCtx)845*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_RestoreFromVsyncLimitation(MS_GOP_CTX_LOCAL *pGOPCtx)
846*53ee8cc1Swenshuai.xi {
847*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
848*53ee8cc1Swenshuai.xi MS_U32 u32GopIdx;
849*53ee8cc1Swenshuai.xi MS_BOOL bHasSignal = TRUE;
850*53ee8cc1Swenshuai.xi UNUSED(bHasSignal);
851*53ee8cc1Swenshuai.xi
852*53ee8cc1Swenshuai.xi for(u32GopIdx=0; u32GopIdx<MAX_GOP_SUPPORT; u32GopIdx++)
853*53ee8cc1Swenshuai.xi {
854*53ee8cc1Swenshuai.xi //Only GFlip has the issue.
855*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx])
856*53ee8cc1Swenshuai.xi {
857*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
858*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
859*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_RestoreFromVsyncLimitation(void);
860*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_RestoreFromVsyncLimitation())
861*53ee8cc1Swenshuai.xi {
862*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
863*53ee8cc1Swenshuai.xi return FALSE;
864*53ee8cc1Swenshuai.xi }
865*53ee8cc1Swenshuai.xi #endif
866*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
867*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
868*53ee8cc1Swenshuai.xi {
869*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
870*53ee8cc1Swenshuai.xi return FALSE;
871*53ee8cc1Swenshuai.xi }
872*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SETINPUTSIGSTATUS, &bHasSignal))
873*53ee8cc1Swenshuai.xi {
874*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
875*53ee8cc1Swenshuai.xi return FALSE;
876*53ee8cc1Swenshuai.xi }
877*53ee8cc1Swenshuai.xi
878*53ee8cc1Swenshuai.xi break; //Only one call into Kernel could restore All.
879*53ee8cc1Swenshuai.xi
880*53ee8cc1Swenshuai.xi #else //GFlip UMD Handling:
881*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bGFlipInVsyncLimitation[u32GopIdx])
882*53ee8cc1Swenshuai.xi {
883*53ee8cc1Swenshuai.xi MHal_GFLIP_RestoreFromVsyncLimitation(&pGOPDrvLocalCtx->halCtxLocal, u32GopIdx);
884*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->bGFlipInVsyncLimitation[u32GopIdx] = FALSE;
885*53ee8cc1Swenshuai.xi }
886*53ee8cc1Swenshuai.xi #endif
887*53ee8cc1Swenshuai.xi }
888*53ee8cc1Swenshuai.xi }
889*53ee8cc1Swenshuai.xi
890*53ee8cc1Swenshuai.xi return TRUE;
891*53ee8cc1Swenshuai.xi }
892*53ee8cc1Swenshuai.xi
893*53ee8cc1Swenshuai.xi /******************************************************************************/
894*53ee8cc1Swenshuai.xi /// Get DWin Interrupt Information
895*53ee8cc1Swenshuai.xi /// @param pGFlipDWinIntInfo \b OUT: dwin interrup flag
896*53ee8cc1Swenshuai.xi /******************************************************************************/
MDrv_GFLIP_GetDWinIntInfo(MS_GOP_CTX_LOCAL * pGOPCtx,GFLIP_DWININT_INFO * pGFlipDWinIntInfo,MS_U32 u32Timeout)897*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_GetDWinIntInfo(MS_GOP_CTX_LOCAL *pGOPCtx, GFLIP_DWININT_INFO *pGFlipDWinIntInfo,MS_U32 u32Timeout)
898*53ee8cc1Swenshuai.xi {
899*53ee8cc1Swenshuai.xi MS_GFLIP_DWININT_INFO2 stGFlipDWinIntInfo;
900*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
901*53ee8cc1Swenshuai.xi
902*53ee8cc1Swenshuai.xi stGFlipDWinIntInfo.bResetDWinIntInfo = TRUE;
903*53ee8cc1Swenshuai.xi stGFlipDWinIntInfo.u32Timeout = u32Timeout;
904*53ee8cc1Swenshuai.xi
905*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
906*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
907*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_GetDWinIntInfo(GFLIP_DWININT_INFO * pGFlipDWinIntInfo,MS_BOOL bResetDWinIntInfo,MS_U32 u32Timeout);
908*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_GetDWinIntInfo(pGFlipDWinIntInfo, stGFlipDWinIntInfo.bResetDWinIntInfo, stGFlipDWinIntInfo.u32Timeout))
909*53ee8cc1Swenshuai.xi {
910*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
911*53ee8cc1Swenshuai.xi return FALSE;
912*53ee8cc1Swenshuai.xi }
913*53ee8cc1Swenshuai.xi pGFlipDWinIntInfo->u8DWinIntInfo = stGFlipDWinIntInfo.gflipDWinIntInfo.u8DWinIntInfo;
914*53ee8cc1Swenshuai.xi #endif
915*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
916*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
917*53ee8cc1Swenshuai.xi {
918*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
919*53ee8cc1Swenshuai.xi return FALSE;
920*53ee8cc1Swenshuai.xi }
921*53ee8cc1Swenshuai.xi
922*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_GETDWININTINFO2, &stGFlipDWinIntInfo))
923*53ee8cc1Swenshuai.xi {
924*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
925*53ee8cc1Swenshuai.xi return FALSE;
926*53ee8cc1Swenshuai.xi }
927*53ee8cc1Swenshuai.xi
928*53ee8cc1Swenshuai.xi pGFlipDWinIntInfo->u8DWinIntInfo = stGFlipDWinIntInfo.gflipDWinIntInfo.u8DWinIntInfo;
929*53ee8cc1Swenshuai.xi #else //will Add GFlip Handle in UMD GFlip later.
930*53ee8cc1Swenshuai.xi pGFlipDWinIntInfo->u8DWinIntInfo = pGOPDrvLocalCtx->gflipDWinIntInfo.u8DWinIntInfo;
931*53ee8cc1Swenshuai.xi pGOPDrvLocalCtx->gflipDWinIntInfo.u8DWinIntInfo = 0x0;
932*53ee8cc1Swenshuai.xi #endif
933*53ee8cc1Swenshuai.xi return TRUE;
934*53ee8cc1Swenshuai.xi }
935*53ee8cc1Swenshuai.xi
936*53ee8cc1Swenshuai.xi /******************************************************************************/
937*53ee8cc1Swenshuai.xi /// Enable VE capture
938*53ee8cc1Swenshuai.xi /// @param pstVECapState \b OUT: VECAPTURESTATE flag
939*53ee8cc1Swenshuai.xi /******************************************************************************/
MDrv_GFLIP_EnaVECapture(MS_GOP_CTX_LOCAL * pGOPCtx,PMS_DRVGOP_VECAPTURESTATE pstVECapState)940*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_EnaVECapture(MS_GOP_CTX_LOCAL *pGOPCtx, PMS_DRVGOP_VECAPTURESTATE pstVECapState)
941*53ee8cc1Swenshuai.xi {
942*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
943*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx != NULL)
944*53ee8cc1Swenshuai.xi {
945*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
946*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
947*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_VE_CAPTURE_SUPPORT
948*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIPIO_EnableVECapture(MS_GFLIP_VECAPTURESTATE * pVECaptureState);
949*53ee8cc1Swenshuai.xi if(_MDrv_GFLIPIO_EnableVECapture((MS_GFLIP_VECAPTURESTATE*)pstVECapState))
950*53ee8cc1Swenshuai.xi {
951*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
952*53ee8cc1Swenshuai.xi return FALSE;
953*53ee8cc1Swenshuai.xi }
954*53ee8cc1Swenshuai.xi #endif
955*53ee8cc1Swenshuai.xi #endif
956*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
957*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
958*53ee8cc1Swenshuai.xi {
959*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
960*53ee8cc1Swenshuai.xi return FALSE;
961*53ee8cc1Swenshuai.xi }
962*53ee8cc1Swenshuai.xi
963*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_ENABLEVECAPTURE, (PMS_GFLIP_VECAPTURESTATE)pstVECapState))
964*53ee8cc1Swenshuai.xi {
965*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
966*53ee8cc1Swenshuai.xi return FALSE;
967*53ee8cc1Swenshuai.xi }
968*53ee8cc1Swenshuai.xi return pstVECapState->u8Result;
969*53ee8cc1Swenshuai.xi #endif
970*53ee8cc1Swenshuai.xi }
971*53ee8cc1Swenshuai.xi return TRUE; //Unsupport now
972*53ee8cc1Swenshuai.xi }
973*53ee8cc1Swenshuai.xi
974*53ee8cc1Swenshuai.xi /******************************************************************************/
975*53ee8cc1Swenshuai.xi /// Get VE capture state
976*53ee8cc1Swenshuai.xi /// @param pstVECapState \b OUT: VECAPTURESTATE flag
977*53ee8cc1Swenshuai.xi /******************************************************************************/
MDrv_GFLIP_GetVECaptureState(MS_GOP_CTX_LOCAL * pGOPCtx,PMS_DRVGOP_VECAPTURESTATE pstVECapState)978*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_GetVECaptureState(MS_GOP_CTX_LOCAL *pGOPCtx, PMS_DRVGOP_VECAPTURESTATE pstVECapState)
979*53ee8cc1Swenshuai.xi {
980*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
981*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx != NULL)
982*53ee8cc1Swenshuai.xi {
983*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
984*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
985*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_VE_CAPTURE_SUPPORT
986*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_GFLIP_GetVECapCurState(MS_BOOL * pbEna,MS_U8 * pu8FramCount);
987*53ee8cc1Swenshuai.xi if(MDrv_GFLIP_GetVECapCurState(&pstVECapState->bEnable, &pstVECapState->u8FrameCount))
988*53ee8cc1Swenshuai.xi {
989*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
990*53ee8cc1Swenshuai.xi return FALSE;
991*53ee8cc1Swenshuai.xi }
992*53ee8cc1Swenshuai.xi #endif
993*53ee8cc1Swenshuai.xi #endif
994*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
995*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
996*53ee8cc1Swenshuai.xi {
997*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
998*53ee8cc1Swenshuai.xi return FALSE;
999*53ee8cc1Swenshuai.xi }
1000*53ee8cc1Swenshuai.xi
1001*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_GETVECAPTURESTATE, (PMS_GFLIP_VECAPTURESTATE)pstVECapState))
1002*53ee8cc1Swenshuai.xi {
1003*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
1004*53ee8cc1Swenshuai.xi return FALSE;
1005*53ee8cc1Swenshuai.xi }
1006*53ee8cc1Swenshuai.xi //printf("GFLP=%u\n", pstVECapState->u8FrameCount);
1007*53ee8cc1Swenshuai.xi return pstVECapState->u8Result;
1008*53ee8cc1Swenshuai.xi #endif
1009*53ee8cc1Swenshuai.xi }
1010*53ee8cc1Swenshuai.xi return TRUE; //Unsupport now
1011*53ee8cc1Swenshuai.xi }
1012*53ee8cc1Swenshuai.xi
1013*53ee8cc1Swenshuai.xi /******************************************************************************/
1014*53ee8cc1Swenshuai.xi /// Get VE capture state
1015*53ee8cc1Swenshuai.xi /// @param pstVECapState \b OUT: VECAPTURESTATE flag
1016*53ee8cc1Swenshuai.xi /******************************************************************************/
MDrv_GFLIP_VECaptureWaitOnFrame(MS_GOP_CTX_LOCAL * pGOPCtx,PMS_DRVGOP_VECAPTURESTATE pstVECapState)1017*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_VECaptureWaitOnFrame(MS_GOP_CTX_LOCAL *pGOPCtx, PMS_DRVGOP_VECAPTURESTATE pstVECapState)
1018*53ee8cc1Swenshuai.xi {
1019*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
1020*53ee8cc1Swenshuai.xi if(pGOPDrvLocalCtx != NULL)
1021*53ee8cc1Swenshuai.xi {
1022*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
1023*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
1024*53ee8cc1Swenshuai.xi #ifdef CONFIG_MSTAR_VE_CAPTURE_SUPPORT
1025*53ee8cc1Swenshuai.xi extern MS_BOOL MDrv_GFLIP_VECapWaitOnFrame(MS_BOOL * pbEna,MS_U8 * pu8FramNum);
1026*53ee8cc1Swenshuai.xi pstVECapState->u8Result= MDrv_GFLIP_VECapWaitOnFrame(&pstVECapState->bEnable, &pstVECapState->u8FrameCount);
1027*53ee8cc1Swenshuai.xi return pstVECapState->u8Result;
1028*53ee8cc1Swenshuai.xi #endif
1029*53ee8cc1Swenshuai.xi #endif
1030*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
1031*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
1032*53ee8cc1Swenshuai.xi {
1033*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
1034*53ee8cc1Swenshuai.xi return FALSE;
1035*53ee8cc1Swenshuai.xi }
1036*53ee8cc1Swenshuai.xi
1037*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_VECAPTUREWAITONFRAME, (PMS_GFLIP_VECAPTURESTATE)pstVECapState))
1038*53ee8cc1Swenshuai.xi {
1039*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
1040*53ee8cc1Swenshuai.xi return FALSE;
1041*53ee8cc1Swenshuai.xi }
1042*53ee8cc1Swenshuai.xi //printf("GFLP=%u\n", pstVECapState->u8FrameCount);
1043*53ee8cc1Swenshuai.xi return pstVECapState->u8Result;
1044*53ee8cc1Swenshuai.xi #endif
1045*53ee8cc1Swenshuai.xi }
1046*53ee8cc1Swenshuai.xi return TRUE; //Unsupport now
1047*53ee8cc1Swenshuai.xi }
1048*53ee8cc1Swenshuai.xi
1049*53ee8cc1Swenshuai.xi
1050*53ee8cc1Swenshuai.xi /***********************************************************************/
1051*53ee8cc1Swenshuai.xi /// GFlip Clear Flip Queue(Clear the Flip queue)
1052*53ee8cc1Swenshuai.xi /// @param u32GopIdx \b IN:the idx of gop which Flip kick off to
1053*53ee8cc1Swenshuai.xi /// @param u32GwinIdx \b IN:the idx of gwin which Flip kick off to
1054*53ee8cc1Swenshuai.xi /// @return TRUE: success
1055*53ee8cc1Swenshuai.xi /// <b>[Mxlib] <em></em></b>
1056*53ee8cc1Swenshuai.xi /*******************************************************************88*/
MDrv_GFLIP_ClearFlipQueue(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U32 u32GopIdx,MS_U32 u32GwinIdx)1057*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_ClearFlipQueue(MS_GOP_CTX_LOCAL *pGOPCtx, MS_U32 u32GopIdx, MS_U32 u32GwinIdx)
1058*53ee8cc1Swenshuai.xi {
1059*53ee8cc1Swenshuai.xi MS_GFLIP_GOPGWINIDX stFlipQueueIdx;
1060*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
1061*53ee8cc1Swenshuai.xi
1062*53ee8cc1Swenshuai.xi if((u32GopIdx >= MAX_GOP_SUPPORT) || (u32GwinIdx >= MAX_GOP_GWIN)) //overflow
1063*53ee8cc1Swenshuai.xi {
1064*53ee8cc1Swenshuai.xi return FALSE;
1065*53ee8cc1Swenshuai.xi }
1066*53ee8cc1Swenshuai.xi
1067*53ee8cc1Swenshuai.xi if(TRUE == pGOPDrvLocalCtx->bEnableVsyncIntFlip[u32GopIdx])
1068*53ee8cc1Swenshuai.xi {
1069*53ee8cc1Swenshuai.xi
1070*53ee8cc1Swenshuai.xi stFlipQueueIdx.u32GopIdx = u32GopIdx;
1071*53ee8cc1Swenshuai.xi stFlipQueueIdx.u32GwinIdx = u32GwinIdx;
1072*53ee8cc1Swenshuai.xi stFlipQueueIdx.u32Result = TRUE;
1073*53ee8cc1Swenshuai.xi
1074*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
1075*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
1076*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_ClearFlipQueue(MS_U32 u32GopIdx,MS_U32 u32GwinIdx);
1077*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_ClearFlipQueue(u32GopIdx, u32GwinIdx))
1078*53ee8cc1Swenshuai.xi {
1079*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
1080*53ee8cc1Swenshuai.xi return FALSE;
1081*53ee8cc1Swenshuai.xi }
1082*53ee8cc1Swenshuai.xi return stFlipQueueIdx.u32Result;
1083*53ee8cc1Swenshuai.xi #endif
1084*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
1085*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
1086*53ee8cc1Swenshuai.xi {
1087*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
1088*53ee8cc1Swenshuai.xi return FALSE;
1089*53ee8cc1Swenshuai.xi }
1090*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_CLEARFLIPQUEUE, &stFlipQueueIdx))
1091*53ee8cc1Swenshuai.xi {
1092*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
1093*53ee8cc1Swenshuai.xi return FALSE;
1094*53ee8cc1Swenshuai.xi }
1095*53ee8cc1Swenshuai.xi return stFlipQueueIdx.u32Result;
1096*53ee8cc1Swenshuai.xi #else
1097*53ee8cc1Swenshuai.xi return FALSE;
1098*53ee8cc1Swenshuai.xi #endif
1099*53ee8cc1Swenshuai.xi }
1100*53ee8cc1Swenshuai.xi else
1101*53ee8cc1Swenshuai.xi {
1102*53ee8cc1Swenshuai.xi return FALSE;
1103*53ee8cc1Swenshuai.xi }
1104*53ee8cc1Swenshuai.xi }
1105*53ee8cc1Swenshuai.xi
1106*53ee8cc1Swenshuai.xi //******************************************************************************
1107*53ee8cc1Swenshuai.xi /// notify kernel about 3D gpio pin
1108*53ee8cc1Swenshuai.xi /// @param pGOPCtx \b IN: gop context
1109*53ee8cc1Swenshuai.xi /// @param u32GPIO3DPin \b IN: GPIO 3D pin
1110*53ee8cc1Swenshuai.xi /// @return TURE: Success FALSE: Fail
1111*53ee8cc1Swenshuai.xi //******************************************************************************
MDrv_GFLIP_SetGPIO3DPin(MS_GOP_CTX_LOCAL * pGOPCtx,MS_U32 u32GPIO3DPin)1112*53ee8cc1Swenshuai.xi MS_BOOL MDrv_GFLIP_SetGPIO3DPin(MS_GOP_CTX_LOCAL*pGOPCtx, MS_U32 u32GPIO3DPin)
1113*53ee8cc1Swenshuai.xi {
1114*53ee8cc1Swenshuai.xi MS_GFLIP_INFO stFlinInfo;
1115*53ee8cc1Swenshuai.xi
1116*53ee8cc1Swenshuai.xi stFlinInfo.u32GopIdx = 0;
1117*53ee8cc1Swenshuai.xi stFlinInfo.u32GwinIdx = 0;
1118*53ee8cc1Swenshuai.xi stFlinInfo.u64Addr= u32GPIO3DPin;
1119*53ee8cc1Swenshuai.xi stFlinInfo.u32TagId= 0;
1120*53ee8cc1Swenshuai.xi stFlinInfo.u32QEntry= 0;
1121*53ee8cc1Swenshuai.xi stFlinInfo.u32Result = TRUE;
1122*53ee8cc1Swenshuai.xi
1123*53ee8cc1Swenshuai.xi #ifdef MSOS_TYPE_LINUX_KERNEL
1124*53ee8cc1Swenshuai.xi #if GFLIP_ENABLE
1125*53ee8cc1Swenshuai.xi extern MS_BOOL _MDrv_GFLIP_SetGPIO3DPin(MS_PHY u32Addr,MS_U32 * u32Result);
1126*53ee8cc1Swenshuai.xi if(!_MDrv_GFLIP_SetGPIO3DPin(stFlinInfo.u64Addr, &stFlinInfo.u32Result))
1127*53ee8cc1Swenshuai.xi {
1128*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] failed!\n", __FUNCTION__, __LINE__);
1129*53ee8cc1Swenshuai.xi return FALSE;
1130*53ee8cc1Swenshuai.xi }
1131*53ee8cc1Swenshuai.xi #else
1132*53ee8cc1Swenshuai.xi return FALSE;
1133*53ee8cc1Swenshuai.xi #endif
1134*53ee8cc1Swenshuai.xi #elif defined(MSOS_TYPE_LINUX)
1135*53ee8cc1Swenshuai.xi GOP_CTX_DRV_LOCAL*pGOPDrvLocalCtx = (GOP_CTX_DRV_LOCAL*)pGOPCtx;
1136*53ee8cc1Swenshuai.xi
1137*53ee8cc1Swenshuai.xi if(0 > pGOPDrvLocalCtx->s32FdGFlip)
1138*53ee8cc1Swenshuai.xi {
1139*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d]GLIP device not openedl!!!!\n",__FUNCTION__,__LINE__);
1140*53ee8cc1Swenshuai.xi return FALSE;
1141*53ee8cc1Swenshuai.xi }
1142*53ee8cc1Swenshuai.xi if (ioctl(pGOPDrvLocalCtx->s32FdGFlip, MDRV_GFLIP_IOC_SETGPIO3DPIN, &stFlinInfo))
1143*53ee8cc1Swenshuai.xi {
1144*53ee8cc1Swenshuai.xi GFLIP_PRINT("[%s][%d] Fail!!!!\n",__FUNCTION__,__LINE__);
1145*53ee8cc1Swenshuai.xi return FALSE;
1146*53ee8cc1Swenshuai.xi }
1147*53ee8cc1Swenshuai.xi return TRUE;
1148*53ee8cc1Swenshuai.xi #else
1149*53ee8cc1Swenshuai.xi return FALSE;
1150*53ee8cc1Swenshuai.xi #endif
1151*53ee8cc1Swenshuai.xi return TRUE;
1152*53ee8cc1Swenshuai.xi }
1153*53ee8cc1Swenshuai.xi
1154