xref: /utopia/UTPA2-700.0.x/modules/xc/hal/maserati/xc/mhal_sc.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 //    Software and any modification/derivatives thereof.
18 //    No right, ownership, or interest to MStar Software and any
19 //    modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 //    supplied together with third party`s software and the use of MStar
23 //    Software may require additional licenses from third parties.
24 //    Therefore, you hereby agree it is your sole responsibility to separately
25 //    obtain any and all third party right and license necessary for your use of
26 //    such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 //    MStar`s confidential information and you agree to keep MStar`s
30 //    confidential information in strictest confidence and not disclose to any
31 //    third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 //    kind. Any warranties are hereby expressly disclaimed by MStar, including
35 //    without limitation, any warranties of merchantability, non-infringement of
36 //    intellectual property rights, fitness for a particular purpose, error free
37 //    and in conformity with any international standard.  You agree to waive any
38 //    claim against MStar for any loss, damage, cost or expense that you may
39 //    incur related to your use of MStar Software.
40 //    In no event shall MStar be liable for any direct, indirect, incidental or
41 //    consequential damages, including without limitation, lost of profit or
42 //    revenues, lost or damage of data, and unauthorized system use.
43 //    You agree that this Section 4 shall still apply without being affected
44 //    even if MStar Software has been modified by MStar in accordance with your
45 //    request or instruction for your use, except otherwise agreed by both
46 //    parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 //    services in relation with MStar Software to you for your use of
50 //    MStar Software in conjunction with your or your customer`s product
51 //    ("Services").
52 //    You understand and agree that, except otherwise agreed by both parties in
53 //    writing, Services are provided on an "AS IS" basis and the warranty
54 //    disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 //    or otherwise:
58 //    (a) conferring any license or right to use MStar name, trademark, service
59 //        mark, symbol or any other identification;
60 //    (b) obligating MStar or any of its affiliates to furnish any person,
61 //        including without limitation, you and your customers, any assistance
62 //        of any kind whatsoever, or any information; or
63 //    (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 //    of Taiwan, R.O.C., excluding its conflict of law rules.
67 //    Any and all dispute arising out hereof or related hereto shall be finally
68 //    settled by arbitration referred to the Chinese Arbitration Association,
69 //    Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 //    Rules of the Association by three (3) arbitrators appointed in accordance
71 //    with the said Rules.
72 //    The place of arbitration shall be in Taipei, Taiwan and the language shall
73 //    be English.
74 //    The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94 //==============================================================================
95 // [mhal_sc.c]
96 // Date: 20081203
97 // Descriptions: Add a new layer for HW setting
98 //==============================================================================
99 #define  MHAL_SC_C
100 
101 #ifdef MSOS_TYPE_LINUX_KERNEL
102 #include <linux/string.h>
103 #include <asm/div64.h>
104 #else
105 #include <string.h>
106 #define do_div(x,y) ((x)/=(y))
107 #endif
108 #include "UFO.h"
109 
110 // Common Definition
111 #include "MsCommon.h"
112 #include "MsIRQ.h"
113 #include "MsOS.h"
114 #include "mhal_xc_chip_config.h"
115 #include "utopia.h"
116 #include "utopia_dapi.h"
117 #include "xc_hwreg_utility2.h"
118 #include "xc_Analog_Reg.h"
119 #include "drvXC_IOPort.h"
120 #include "apiXC.h"
121 #include "drv_sc_display.h"
122 #include "drv_sc_isr.h"
123 #include "apiXC_Adc.h"
124 #include "apiXC_PCMonitor.h"
125 #include "apiXC_ModeParse.h"
126 #include "apiXC_Auto.h"
127 #include "drvXC_HDMI_if.h"
128 #include "mvideo_context.h"
129 #include "drv_sc_ip.h"
130 #include "mhal_dynamicscaling.h"
131 #include "mdrv_sc_dynamicscaling.h"
132 #include "drvXC_HDMI_Internal.h"
133 #include "drvMVOP.h"
134 #include "drvIPAUTH.h"
135 
136 #if (LD_ENABLE==1)
137 #include "mdrv_ld.h"
138 #include "mdrv_ldalgo.h"
139 #endif
140 #include "mdrv_sc_3d.h"
141 #include "drv_sc_menuload.h"
142 #include "drvXC_ADC_Internal.h"
143 #include "mhal_sc.h"
144 #if FRC_INSIDE
145 #include "mdrv_frc.h"
146 #include "mhal_frc.h"
147 #endif
148 #include "XC_private.h"
149 #include "mhal_menuload.h"
150 #include "halCHIP.h"
151 #include "drvSYS.h"
152 #include "drv_sc_scaling.h"
153 #include "drvSEAL.h"
154 #include "drvMIU.h"
155 
156 #ifndef DONT_USE_CMA
157 #if (XC_SUPPORT_CMA ==TRUE)
158 #ifdef MSOS_TYPE_LINUX_KERNEL
159 #include "drvCMAPool_v2.h"
160 #else
161 #include "drvCMAPool.h"
162 #endif
163 #include "msos/linux/mdrv_cma_pool_st.h"
164 #include "drvMIU.h"
165 #endif
166 #endif
167 #if ((defined (ANDROID) || defined(MSOS_TYPE_LINUX_KERNEL)) && defined(UFO_XC_DS_PQ))
168 #include "drvPQ_Define.h"
169 #endif
170 //#include <assert.h>
171 #ifdef ANDROID
172 #include <cutils/log.h>
173 #ifndef LOGE
174 #define printf(format, args...)          ALOGE(format, ##args);
175 #else
176 #define printf(format, args...)          LOGE(format, ##args);
177 #endif
178 #endif
179 
180 #define DBG_EN  0
181 #if DBG_EN
182 #define SC_DBG(x)   x
183 #define FPLL_DBG(x) x
184 #else
185 #define SC_DBG(x)
186 #define FPLL_DBG(x)
187 #endif
188 #define new_chakra
189 
190 #define MIU_SEL_USE_XC_INTERNAL   TRUE
191 
192 //==============================================================================
193 //==============================================================================
194 MS_VIRT _XC_RIU_BASE;
195 MS_VIRT _PM_RIU_BASE;
196 
197 MS_VIRT _DVI_ATOP_RIU_BASE;
198 MS_VIRT _DVI_DTOP_RIU_BASE;
199 MS_VIRT _HDCP_RIU_BASE;
200 MS_VIRT _DVI_EQ_RIU_BASE;
201 MS_VIRT _ADC_DTOPB_RIU_BASE;
202 
203 MS_VIRT _DDC_RIU_BASE;
204 MS_VIRT _PM_SLEEP_RIU_BASE;
205 
206 MS_U32 u32DTVPatchTimer;
207 MS_BOOL bPreFDMaskStatse;
208 MS_U16 u16FDMaskCount;
209 
210 #ifdef CONFIG_MSTAR_SRAMPD
211 MS_BOOL _bSRAMPowerDown;
212 #endif
213 
214 #ifndef DONT_USE_CMA
215 #if (XC_SUPPORT_CMA ==TRUE)
216 MS_U32 u32CMAPatchTimer_Main ;
217 MS_U32 u32DisableFRCTimer;
218 #endif
219 #endif
220 
221 #define WIDTH_4K2K      (3840)
222 #define HEIGHT_4K2K     (2160)
223 
224 
225 #define  TGEN_SC0_DLY                        11
226 #define  TGEN_SC0_USER_MODE_DLY              3
227 #define  VIP_SC0_V_DLY                       2
228 #define  VIP_SC0_H_DLY                       150
229 #define  VIP_SC0_USER_MODE_V_DLY             (SC_R2BYTEMSK(0, REG_SC_BK68_51_L, 0x1FFF))
230 #define  VIP_SC0_USER_MODE_H_DLY             ((SC_R2BYTEMSK(0, REG_SC_BK68_52_L, 0x3FFF))/2)
231 #define  SC1_PRE_RUN_DLY                     ((SC_R2BYTEMSK(0, REG_SC_BK10_0C_L, 0x3FFF)+1)/4)
232 #define  VIP_SC1_V_DLY                       0
233 #define  VIP_SC1_H_DLY                       61
234 
235 #ifdef UFO_XC_AUTO_DOWNLOAD
236 #define DEBUG_HDR 0
237 #define  AUTO_DOWNLOAD_HDR_TMO_SRAM_MAX_ADDR     512
238 #define  AUTO_DOWNLOAD_HDR_3DLUT_SRAM_MAX_ADDR     4944
239 
240 // HDR client of auto download has these following formats, include format0 and format1.
241 //
242 // Format0:
243 //127      125          116 115         112                             60        57                                   0
244 // | [x[2]] | [addr(10)] | 0 | [sel0(3)] |           [data1]             | sel1(3) |              [data0]              |
245 //                               sel0 = 1                            x(52) sel1 = 1              wd0(19),wd1(19),wd2(19)
246 //                               sel0 = 2     x(4),wd0(16),wd1(16),wd2(16) sel1 = 2         x(9),wd0(16),wd1(16),wd2(16)
247 //                               sel0 = 3                    x(40),wd0(12) sel1 = 3                        x(45),wd0(12)
248 //                               sel0 = 4   idx(4),wd0(16),wd1(16),wd2(16) sel1 = 4  x(5),idx(4),wd0(16),wd1(16),wd2(16)
249 // sel:   0: disable
250 //        1: De-gamma
251 //        2: Gamma
252 //        3: TMO
253 //        4: 3D-lut
254 
255 // Format1:
256 //127      125          116 115          112                             60        57                                   0
257 // | [x[2]] | [addr(10)] | 1 | [ctrl0(3)] |           [data1]             | sel1(3) |              [data0]              |
258 //                                                                    x(52) sel1 = 0
259 //                                           idx(4),wd0(16),wd1(16),wd2(16) sel1 = 4      x(10),degam(19),gam(16),tmo(16)
260 // ctrl:                 bit: 114  113 112
261 //                          |degam|gam|tmo|
262 // sel:   0: disable
263 //        4: 3D-lut
264 //
265 // HW designer recommand using format1.
266 // These following definitions write datas of tmo/gamma/de-gamma/3d-lut separately by format1,
267 // please refer to definition of WRITE_TMO_DATA_FORMAT_1, WRITE_GAMMA_DATA_FORMAT_1, WRITE_DEGAMMA_DATA_FORMAT_1 and WRITE_3DLUT_DATA_FORMAT_1.
268 #define WRITE_TMO_DATA_FORMAT_1(baseaddr, index, value) \
269     *(baseaddr) = (((*(baseaddr)) & 0xC0) | (((index) >> 4) & 0x3F));\
270     *(baseaddr + 1) = ((((index) << 4) & 0xF0) | ((*(baseaddr + 1)) & 0x0F) | 0x09);\
271     *(baseaddr + 14) = ((*(baseaddr + 14) & 0xF0) | (((value) >> 8) & 0x0F));\
272     *(baseaddr + 15) = ((value) & 0xFF);
273 
274 #define WRITE_GAMMA_DATA_FORMAT_1(baseaddr, index, value) \
275     *(baseaddr) = (((*(baseaddr)) & 0xC0) | (((index) >> 4) & 0x3F));\
276     *(baseaddr + 1) = ((((index) << 4) & 0xF0) | ((*(baseaddr + 1)) & 0x0F) | 0x0A);\
277     *(baseaddr + 14) = ((*(baseaddr + 14) & 0x0F) | (((value) << 4) & 0xF0));\
278     *(baseaddr + 13) = (((value) >> 4) & 0xFF);\
279     *(baseaddr + 12) = ((*(baseaddr + 12) & 0xF0) | (((value) >> 12) & 0x0F));
280 
281 #define WRITE_DEGAMMA_DATA_FORMAT_1(baseaddr, index, value) \
282     *(baseaddr) = (((*(baseaddr)) & 0xC0) | (((index) >> 4) & 0x3F));\
283     *(baseaddr + 1) = ((((index) << 4) & 0xF0) | ((*(baseaddr + 1)) & 0x0F) | 0x0C);\
284     *(baseaddr + 12) = ((*(baseaddr + 12) & 0x0F) | (((value) << 4) & 0xF0));\
285     *(baseaddr + 11) = (((value) >> 4) & 0xFF);\
286     *(baseaddr + 10) = ((*(baseaddr + 10) & 0x80) | (((value) >> 12) & 0x7F));
287 
288 #define WRITE_3DLUT_DATA_FORMAT_1(baseaddr, index, subindex, rval, gval, bval) \
289     *(baseaddr) = (((*(baseaddr)) & 0xC0) | (((index) >> 4) & 0x3F));\
290     *(baseaddr + 1) = ((((index) << 4) & 0xF0) | ((*(baseaddr + 1)) & 0x0F) | 0x08);\
291     *(baseaddr + 8) = ((*(baseaddr + 8) & 0xF1) | 0x08);\
292     *(baseaddr + 8) = ((*(baseaddr + 8) & 0x0F) | (((bval) << 4) & 0xF0));\
293     *(baseaddr + 7) = (((bval) >> 4) & 0xFF);\
294     *(baseaddr + 6) = ((*(baseaddr + 6) & 0xF0) | (((bval) >> 12) & 0x0F));\
295     *(baseaddr + 6) = ((*(baseaddr + 6) & 0x0F) | (((gval) << 4) & 0xF0));\
296     *(baseaddr + 5) = (((gval) >> 4) & 0xFF);\
297     *(baseaddr + 4) = ((*(baseaddr + 4) & 0xF0) | (((gval) >> 12) & 0x0F));\
298     *(baseaddr + 4) = ((*(baseaddr + 4) & 0x0F) | (((rval) << 4) & 0xF0));\
299     *(baseaddr + 3) = (((rval) >> 4) & 0xFF);\
300     *(baseaddr + 2) = ((*(baseaddr + 2) & 0xF0) | (((rval) >> 12) & 0x0F));\
301     *(baseaddr + 2) = ((*(baseaddr + 2) & 0x0F) | (((subindex) << 4) & 0xF0));
302 
303 // The following definition clear bits of format1's ctrl & sel.
304 #define CLEAR_HDR_DATA_FORMAT_1(baseaddr) \
305     *(baseaddr + 1) = ((*(baseaddr + 1)) & 0xF8);\
306     *(baseaddr + 8) = (*(baseaddr + 8) & 0xF1);
307 
308 static MS_U32 _au32_3dlut_entry_num[8] = {736, 656, 656, 576, 656, 576, 576, 512};
309 #endif
310 
311 // Put this function here because hwreg_utility2 only for hal.
Hal_SC_init_riu_base(MS_VIRT u32riu_base,MS_VIRT u32PMriu_base)312 void Hal_SC_init_riu_base(MS_VIRT u32riu_base, MS_VIRT u32PMriu_base)
313 {
314     _XC_RIU_BASE = u32PMriu_base;
315     _PM_RIU_BASE = u32PMriu_base;
316 
317 
318     _DVI_ATOP_RIU_BASE = u32PMriu_base;
319     _DVI_DTOP_RIU_BASE = u32PMriu_base;
320     _HDCP_RIU_BASE = u32PMriu_base;
321     _DVI_EQ_RIU_BASE = u32PMriu_base;
322     _ADC_DTOPB_RIU_BASE = u32PMriu_base;
323 
324     _DDC_RIU_BASE =u32PMriu_base;
325     _PM_SLEEP_RIU_BASE =u32PMriu_base;
326 
327 }
328 
329 //=========================================================//
330 // Function : Hal_SC_setfield
331 // Description:
332 //=========================================================//
Hal_SC_setfield(void * pInstance,MS_U16 reg_1D,MS_U16 reg_21,MS_U16 reg_23,SCALER_WIN eWindow)333 void Hal_SC_setfield(void *pInstance, MS_U16 reg_1D, MS_U16 reg_21, MS_U16 reg_23, SCALER_WIN eWindow )
334 {
335     //printf("reg_1D=%x, reg_21=%x, reg_23=%x\n", reg_1D, reg_21, reg_23);
336     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
337     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
338 
339     if( eWindow == MAIN_WINDOW )
340     {
341         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_1D_L, (reg_1D<<8), 0xEF00);
342         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_21_L, reg_21, 0x3FFF);
343         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_23_L, (reg_23<<8), HBMASK);
344     }
345     else
346     {
347         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_1D_L, (reg_1D<<8), 0xEF00);
348         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_21_L, reg_21, 0x3FFF);
349         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_23_L, (reg_23<<8), HBMASK);
350     }
351 //    printf("%x ",SC_R2BYTEMSK(REG_SC_BK01_1D_L, HBMASK));
352 //    printf("%x ",SC_R2BYTEMSK(REG_SC_BK01_21_L, 0x3FFF));
353 //    printf("%x ",SC_R2BYTEMSK(REG_SC_BK01_23_L, HBMASK));
354 
355 //    printf("%x ",SC_R4BYTE(REG_SC_BK01_21_L));
356 //    printf("%x ",SC_R4BYTE(REG_SC_BK01_23_L));
357 }
358 
359 //=========================================================//
360 // Function : Hal_SC_de_only_en
361 // Description: DE Only. HSYNC and VSYNC are ignored.
362 //#0: Disable.
363 //#1: Enable.
364 //=========================================================//
Hal_SC_de_only_en(void * pInstance,MS_BOOL benable,SCALER_WIN eWindow)365 void Hal_SC_de_only_en(void *pInstance, MS_BOOL benable, SCALER_WIN eWindow)
366 {
367     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
368     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
369     if(eWindow == MAIN_WINDOW)
370     {
371         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_03_L, (benable ? BIT(6):0), BIT(6));
372         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_2F_L, (benable ? BIT(4):0), BIT(4)); // SW patch for HDMI switch, Auto search HST jistter mask filter force off
373     }
374     else
375     {
376         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_03_L, (benable ? BIT(6):0), BIT(6));
377         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_2F_L, (benable ? BIT(4):0), BIT(4)); // SW patch for HDMI switch, Auto search HST jistter mask filter force off
378     }
379 }
380 
381 //=========================================================//
382 // Function : Hal_SC_de_direct_en
383 // Description: Digital Input Horizontal Sample Range
384 //#0: Use DE as sample range, only V position can be adjusted.
385 //#1: Use SPRHST and SPRHDC as sample range, both H and V position can be adjusted.
386 //=========================================================//
Hal_SC_de_direct_en(void * pInstance,MS_BOOL benable,SCALER_WIN eWindow)387 void Hal_SC_de_direct_en(void *pInstance, MS_BOOL benable, SCALER_WIN eWindow)
388 {
389     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
390     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
391     if(eWindow == MAIN_WINDOW)
392         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_03_L, (benable ? BIT(7):0), BIT(7));
393     else
394         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_03_L, (benable ? BIT(7):0), BIT(7));
395 
396 }
397 
Hal_SC_set_ficlk(void * pInstance,MS_BOOL bPreDown,SCALER_WIN eWindow)398 void Hal_SC_set_ficlk(void *pInstance, MS_BOOL bPreDown, SCALER_WIN eWindow)
399 {
400     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
401     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
402     if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
403     {
404         // manhattan is not needed it
405     }
406     else //E_XC_DEVICE1 == psXCInstPri->u32DeviceID
407     {
408         if (bPreDown)
409         {
410             W2BYTEMSK(REG_CKG_S2_FICLK2_F2, CKG_S2_FICLK2_F2_IDCLK2, CKG_S2_FICLK2_F2_MASK); // clk_edclk
411         }
412         else
413         {
414             W2BYTEMSK(REG_CKG_S2_FICLK2_F2, CKG_S2_FICLK2_F2_FCLK, CKG_S2_FICLK2_F2_MASK); // clk_fclk
415         }
416     }
417 }
418 
Hal_SC_set_shiftline(void * pInstance,MS_U8 u8Val,SCALER_WIN eWindow)419 void Hal_SC_set_shiftline(void *pInstance, MS_U8 u8Val, SCALER_WIN eWindow )
420 {
421     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
422     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
423     if( eWindow == MAIN_WINDOW )
424     {
425         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_2F_L, (u8Val & 0x07)<<8, (BIT(10)|BIT(9)|BIT(8)));
426     }
427     else
428     {
429         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_2F_L, (u8Val & 0x03)<<13, (BIT(14)|BIT(13)));
430     }
431 }
432 
Hal_SC_set_422_cbcr_swap(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)433 void Hal_SC_set_422_cbcr_swap(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
434 {
435     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
436     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
437     if(eWindow == MAIN_WINDOW)
438     {
439         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_0A_L, bEnable ? BIT(6) : 0, BIT(6));
440     }
441     else
442     {
443         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_0A_L, bEnable ? BIT(6) : 0, BIT(6));
444     }
445 }
446 
Hal_SC_set_pre_align_pixel(void * pInstance,MS_BOOL bEnable,MS_U16 pixels,SCALER_WIN eWindow)447 void Hal_SC_set_pre_align_pixel(void *pInstance, MS_BOOL bEnable, MS_U16 pixels, SCALER_WIN eWindow)
448 {
449     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
450     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
451     if (bEnable)
452     {
453         if ( eWindow == MAIN_WINDOW )
454         {
455             // Enable pre align pixel for mirror mode.
456             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_2A_L, BIT(15), BIT(15));
457 
458             // Number of pixels need to be inserted. (U3 has 15 pixels)
459             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_2A_L, pixels << 8 , 0x1F00);
460         }
461         else
462         {
463             // Enable pre align pixel for mirror mode.
464             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_2A_L, BIT(15), BIT(15));
465 
466             // Number of pixels need to be inserted. (U3 has 15 pixels)
467             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_2A_L, pixels << 8 , 0x1F00);
468         }
469 
470     }
471     else
472     {
473         if ( eWindow == MAIN_WINDOW )
474         {
475             // Disable pre align pixel for mirror mode.
476             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_2A_L, 0x00 , BIT(15));
477         }
478         else
479         {
480             // Disable pre align pixel for mirror mode.
481             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_2A_L, 0x00 , BIT(15));
482         }
483     }
484 }
485 
Hal_SC_get_pre_align_pixel(void * pInstance,SCALER_WIN eWindow)486 MS_BOOL Hal_SC_get_pre_align_pixel(void *pInstance, SCALER_WIN eWindow)
487 {
488     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
489     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
490     if ( eWindow == MAIN_WINDOW )
491     {
492         // Check pre align pixel.
493         return ( SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_2A_L, BIT(15))) ? TRUE:FALSE;
494     }
495     else
496     {
497         // Check pre align pixel.
498         return ( SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_2A_L, BIT(15))) ? TRUE:FALSE;
499     }
500 }
501 
Hal_XC_Set_FreeFRCMD(void * pInstance,MS_BOOL bEnable)502 void Hal_XC_Set_FreeFRCMD(void *pInstance, MS_BOOL bEnable)
503 {
504     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
505     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
506     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, bEnable? BIT(5) : 0, BIT(5));
507 }
508 
509 // Obsolete in M10/J2/A5
Hal_SC_set_linearmem_mode(MS_BOOL bEnable,SCALER_WIN eWindow)510 void Hal_SC_set_linearmem_mode(MS_BOOL bEnable, SCALER_WIN eWindow)
511 {
512 }
513 
514 // This function will return 8/10/12/14/16 field mode or 8 frame mode.
515 // Otherwise it return IMAGE_STORE_2_FRAMES
Hal_SC_GetFrameStoreMode(void * pInstance,SCALER_WIN eWindow)516 XC_FRAME_STORE_NUMBER Hal_SC_GetFrameStoreMode(void *pInstance, SCALER_WIN eWindow)
517 {
518     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
519     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
520     MS_U16 u16FrameCount = 0x00;
521     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
522     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
523     if (eWindow == MAIN_WINDOW)
524     {
525         u16FrameCount = 0x1F & SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L);
526     }
527     else
528     {
529         u16FrameCount = 0x1F & SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_59_L);
530     }
531 
532     switch( u16FrameCount) // Get field type.
533     {
534         default:
535             if (gSrcInfo[MAIN_WINDOW].bInterlace)
536             {
537                 return IMAGE_STORE_4_FIELDS;
538             }
539             else
540             {
541                 return IMAGE_STORE_2_FRAMES;
542             }
543         case 3:
544             return IMAGE_STORE_3_FRAMES;
545         case 4:
546             if (gSrcInfo[MAIN_WINDOW].bInterlace)
547             {
548                 return IMAGE_STORE_4_FIELDS;
549             }
550             else
551             {
552                 return IMAGE_STORE_4_FRAMES;
553             }
554         case 6:
555             if (gSrcInfo[MAIN_WINDOW].bInterlace)
556             {
557                 return IMAGE_STORE_6_FIELDS;
558             }
559             else
560             {
561                 return IMAGE_STORE_6_FRAMES;
562             }
563         case 8:
564             if (gSrcInfo[MAIN_WINDOW].bInterlace)
565             {
566                 return IMAGE_STORE_8_FIELDS;
567             }
568             else
569             {
570                 return IMAGE_STORE_8_FRAMES;
571             }
572         case 10:
573             return IMAGE_STORE_10_FIELDS;
574         case 12:
575             if (gSrcInfo[MAIN_WINDOW].bInterlace)
576             {
577                 return IMAGE_STORE_12_FIELDS;
578             }
579             else
580             {
581                 return IMAGE_STORE_12_FRAMES;
582             }
583         case 14:
584             return IMAGE_STORE_14_FIELDS;
585         case 16:
586             return IMAGE_STORE_16_FIELDS;
587 
588     }
589 
590     return IMAGE_STORE_UNDEFINE;
591 }
592 
Hal_SC_set_wr_bank_mapping(void * pInstance,MS_U8 u8val,SCALER_WIN eWindow)593 void Hal_SC_set_wr_bank_mapping(void *pInstance, MS_U8 u8val, SCALER_WIN eWindow)
594 {
595     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
596     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
597     SC_DBG(printf("Set WR bank mapping SC_BK12_07/47_L[15:13]= 0x%x\n", ((MS_U16)u8val)<<13));
598 
599     if( eWindow == MAIN_WINDOW )
600     {
601         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, ((MS_U16)u8val)<<13, BIT(15)|BIT(14)|BIT(13));
602     }
603     else
604     {
605         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, ((MS_U16)u8val)<<13, BIT(15)|BIT(14)|BIT(13));
606     }
607 }
608 
Hal_SC_set_frcm_wr_bank_mapping(void * pInstance,MS_U8 u8val,SCALER_WIN eWindow)609 void Hal_SC_set_frcm_wr_bank_mapping(void *pInstance, MS_U8 u8val, SCALER_WIN eWindow)
610 {
611     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
612     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
613     SC_DBG(printf("Set WR bank mapping SC_BK12_07/47_L[15:13]= 0x%x\n", ((MS_U16)u8val)<<13));
614 
615     if( eWindow == MAIN_WINDOW )
616     {
617         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_07_L, ((MS_U16)u8val)<<13, BIT(15)|BIT(14)|BIT(13));
618     }
619     else
620     {
621         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_47_L, ((MS_U16)u8val)<<13, BIT(15)|BIT(14)|BIT(13));
622     }
623 }
624 
Hal_SC_set_wr_bank_mapping_num(void * pInstance,MS_U8 u8Val,SCALER_WIN eWindow)625 void Hal_SC_set_wr_bank_mapping_num(void *pInstance, MS_U8 u8Val, SCALER_WIN eWindow)
626 {
627     Hal_SC_set_wr_bank_mapping(pInstance, u8Val, eWindow);
628 }
629 
Hal_SC_Get_WR_Bank_Mapping(void * pInstance,SCALER_WIN eWindow)630 MS_U8 Hal_SC_Get_WR_Bank_Mapping(void *pInstance, SCALER_WIN eWindow)
631 {
632     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
633     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
634     MS_U8 u8val = 0;
635 
636     if( eWindow == MAIN_WINDOW )
637     {
638         u8val = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(15)|BIT(14)|BIT(13)) >> 13;
639     }
640     else
641     {
642         u8val = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, BIT(15)|BIT(14)|BIT(13)) >> 13;
643     }
644     SC_DBG(printf("Get WR bank mapping SC_BK12_07/47_L[15:13]= 0x%x\n", ((MS_U16)u8val)<<13));
645     return u8val;
646 }
647 
Hal_SC_Get_WR_Bank_Mapping_Num(void * pInstance,SCALER_WIN eWindow)648 MS_U8 Hal_SC_Get_WR_Bank_Mapping_Num(void *pInstance, SCALER_WIN eWindow)
649 {
650     return Hal_SC_Get_WR_Bank_Mapping(pInstance, eWindow);
651 }
652 
Hal_SC_set_csc(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)653 void Hal_SC_set_csc(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow )
654 {
655     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
656     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
657     if( eWindow == MAIN_WINDOW )
658     {
659         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_40_L, (bEnable ? BIT(3):0), BIT(3));
660         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_01_L, (bEnable ? BIT(2):0), BIT(2));
661     }
662     else
663     {
664         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_40_L, (bEnable ? BIT(3):0), BIT(3));
665         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_01_L, (bEnable ? BIT(2):0), BIT(2));
666     }
667 }
668 
Hal_SC_get_ip2_csc(void * pInstance,SCALER_WIN eWindow)669 MS_BOOL Hal_SC_get_ip2_csc(void *pInstance, SCALER_WIN eWindow)
670 {
671     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
672     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
673     MS_BOOL bYUVInput;
674     if(eWindow == MAIN_WINDOW)
675     {
676         // If it has CSC, it shows it must be RGB input.
677         // Because in scaler, it must be YUV. So if input is RGB, then we need to do CSC
678         bYUVInput = ( SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_40_L, BIT(3) ))? FALSE:TRUE;
679     }
680     else
681     {
682         bYUVInput = ( SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_40_L, BIT(3) ))? FALSE:TRUE;
683     }
684     return bYUVInput;
685 }
686 
Hal_SC_set_delayline(void * pInstance,MS_U8 u8DelayLines,SCALER_WIN eWindow)687 void Hal_SC_set_delayline(void *pInstance, MS_U8 u8DelayLines, SCALER_WIN eWindow )
688 {
689     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
690     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
691     //skip bit7, which is other usage
692     MS_U16 u16DelayLines = ((MS_U16)u8DelayLines) & 0xFF;
693     if( eWindow == MAIN_WINDOW )
694     {
695         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_1C_L, (u16DelayLines<<4), (BIT(9)|BIT(8)|BIT(7)|BIT(6)|BIT(5)|BIT(4)));
696     }
697     else
698     {
699         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_1C_L, (u16DelayLines<<4), (BIT(9)|BIT(8)|BIT(7)|BIT(6)|BIT(5)|BIT(4)));
700     }
701 }
702 
Hal_SC_set_write_limit(void * pInstance,MS_PHY u32WritelimitAddrBase,SCALER_WIN eWindow)703 void Hal_SC_set_write_limit(void *pInstance, MS_PHY u32WritelimitAddrBase, SCALER_WIN eWindow)
704 {
705     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
706     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
707     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
708     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
709 
710     MS_PHY u32MinLimitAddress = 0;
711     MS_PHY u32MaxLimitAddress = 0;
712 
713 #ifndef DONT_USE_CMA
714 #if (XC_SUPPORT_CMA ==TRUE)
715 #if ((HW_DESIGN_4K2K_VER == 4)||(HW_DESIGN_4K2K_VER == 6))
716 #if (defined (ANDROID))
717     if(pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].isEnable == FALSE)
718     {
719         UNUSED(u32WritelimitAddrBase);
720         UNUSED(eWindow);
721         return;
722     }
723 #endif
724 #endif
725 #endif
726 #endif
727 
728 #if (HW_DESIGN_4K2K_VER == 4)
729     // in Monaco, the 4K data path need to setup the IPM write on the FRCM base, and the max/min limit region also need to change
730     if(gSrcInfo[eWindow].stCapWin.width > 3800)
731     {
732         u32MinLimitAddress = MHal_XC_GetFRCMBufAddress(pInstance, eWindow)/BYTE_PER_WORD ;
733         if((MHal_XC_GetFRCMBufAddress(pInstance, eWindow) + MHal_XC_GetFRCMBufSize(pInstance, eWindow))!=0)
734             u32MaxLimitAddress = (MHal_XC_GetFRCMBufAddress(pInstance, eWindow) + MHal_XC_GetFRCMBufSize(pInstance, eWindow))/BYTE_PER_WORD - 1;
735         else
736             u32MaxLimitAddress = u32MinLimitAddress;
737     }
738     //monaco mm DS VB size always be 4k2k , mvop timing is 4k2k , 2p mode
739     else if ((pXCResourcePrivate->sthal_SC.bDynamicScalingEnable || pXCResourcePrivate->stdrvXC_Dynamicscaling._bDSForceIndexEnable[eWindow] ) &&
740              (gSrcInfo[eWindow].Status2.u16VirtualBox_Width >= 0xF00) && (gSrcInfo[eWindow].Status2.u16VirtualBox_Height>= 0x870))
741     {
742         u32MinLimitAddress = MHal_XC_GetFRCMBufAddress(pInstance, eWindow)/BYTE_PER_WORD ;
743         if((MHal_XC_GetFRCMBufAddress(pInstance, eWindow) + MHal_XC_GetFRCMBufSize(pInstance, eWindow))!=0)
744             u32MaxLimitAddress = (MHal_XC_GetFRCMBufAddress(pInstance, eWindow) + MHal_XC_GetFRCMBufSize(pInstance, eWindow))/BYTE_PER_WORD - 1;
745         else
746             u32MaxLimitAddress = u32MinLimitAddress;
747     }
748     else
749 #endif
750     {
751         u32MinLimitAddress = MHal_XC_GetDNRBufAddress(pInstance, eWindow)/BYTE_PER_WORD ;
752         if((MHal_XC_GetDNRBufAddress(pInstance, eWindow) + MHal_XC_GetDNRBufSize(pInstance, eWindow))!=0)
753             u32MaxLimitAddress = (MHal_XC_GetDNRBufAddress(pInstance, eWindow) + MHal_XC_GetDNRBufSize(pInstance, eWindow))/BYTE_PER_WORD - 1;
754         else
755             u32MaxLimitAddress = u32MinLimitAddress;
756     }
757     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"eWindow=%x, MHal_XC_GetDNRBufAddress=%tx, MHal_XC_GetDNRBufSize=%tx\n", eWindow, (ptrdiff_t)(MHal_XC_GetDNRBufAddress(pInstance, eWindow)/BYTE_PER_WORD ),(ptrdiff_t) (MHal_XC_GetDNRBufSize(pInstance, eWindow))/BYTE_PER_WORD);
758     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"eWindow=%x, u32MinLimitAddress=%tx, u32MaxLimitAddress=%tx\n", eWindow, (ptrdiff_t)u32MinLimitAddress, (ptrdiff_t)u32MaxLimitAddress);
759 
760     if(eWindow == MAIN_WINDOW)
761     {
762         /// need to disable the r/w request, when change the write limit base
763         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(0)|BIT(1), BIT(0)|BIT(1));
764         if (IsHMirrorMode(eWindow) && IsEnableDualMode(eWindow))
765         {
766             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_38_L, ((u32WritelimitAddrBase&BIT(31))?BIT(4):0),BIT(4)); //F2 memory address limit enable
767             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_48_L, u32MinLimitAddress); //F2 memory min address
768             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_4A_L, u32MaxLimitAddress); //F2 memory max address
769         }
770         else
771         {
772             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_38_L, ((u32WritelimitAddrBase&BIT(31))?BIT(0):0),BIT(0)); //F2 memory address limit enable
773             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_40_L, u32MinLimitAddress); //F2 memory min address
774             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_42_L, u32MaxLimitAddress); //F2 memory max address
775         }
776         /// need to enable the r/w request
777         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0x00, BIT(0)|BIT(1));
778     }
779     else
780   {
781         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, BIT(0)|BIT(1), BIT(0)|BIT(1));
782         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_38_L, ((u32WritelimitAddrBase&BIT(31))?BIT(1):0),BIT(1)); //F1 memory address limit enable
783         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_44_L, u32MinLimitAddress); //F1 memory min address
784         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_46_L, u32MaxLimitAddress); //F1 memory max address
785         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, 0x00, BIT(0)|BIT(1));
786     }
787 }
788 
Hal_SC_set_frcm_write_limit(void * pInstance,MS_PHY u32WritelimitAddrBase,SCALER_WIN eWindow)789 void Hal_SC_set_frcm_write_limit(void *pInstance, MS_PHY u32WritelimitAddrBase, SCALER_WIN eWindow)
790 {
791     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
792     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
793     MS_PHY u32MinLimitAddress = MHal_XC_GetFRCMBufAddress(pInstance, eWindow)/BYTE_PER_WORD ;
794     MS_PHY u32MaxLimitAddress = 0;
795 
796     if((MHal_XC_GetFRCMBufAddress(pInstance, eWindow) + MHal_XC_GetFRCMBufSize(pInstance, eWindow))!=0)
797         u32MaxLimitAddress = (MHal_XC_GetFRCMBufAddress(pInstance, eWindow) + MHal_XC_GetFRCMBufSize(pInstance, eWindow))/BYTE_PER_WORD - 1;
798     else
799         u32MaxLimitAddress = u32MinLimitAddress;
800 
801     if(eWindow == MAIN_WINDOW)
802     {
803         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_50_L, ((u32WritelimitAddrBase&BIT(31))?BIT(4):0),BIT(4)); //F2 memory address limit enable
804         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_64_L, u32MinLimitAddress); //F2 memory min address
805         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_66_L, u32MaxLimitAddress); //F2 memory max address
806     }
807     else
808     {
809         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_50_L, ((u32WritelimitAddrBase&BIT(31))?BIT(5):0),BIT(5)); //F1 memory address limit enable
810         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_68_L, u32MinLimitAddress); //F1 memory min address
811         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_6A_L, u32MaxLimitAddress); //F1 memory max address
812     }
813 
814 }
815 
Hal_SC_set_dual_write_limit(void * pInstance,MS_PHY u32WritelimitAddrBase,SCALER_WIN eWindow)816 void Hal_SC_set_dual_write_limit(void *pInstance, MS_PHY u32WritelimitAddrBase, SCALER_WIN eWindow)
817 {
818 #ifdef UFO_XC_SUPPORT_DUAL_MIU
819     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
820     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
821     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
822     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
823 
824     MS_PHY u32MinLimitAddress = 0;
825     MS_PHY u32MaxLimitAddress = 0;
826 
827     u32MinLimitAddress = MHal_XC_GetDualDNRBufAddress(pInstance, eWindow)/BYTE_PER_WORD ;
828     if((MHal_XC_GetDualDNRBufAddress(pInstance, eWindow) + MHal_XC_GetDualDNRBufSize(pInstance, eWindow))!=0)
829         u32MaxLimitAddress = (MHal_XC_GetDualDNRBufAddress(pInstance, eWindow) + MHal_XC_GetDualDNRBufSize(pInstance, eWindow))/BYTE_PER_WORD - 1;
830     else
831         u32MaxLimitAddress = u32MinLimitAddress;
832 
833     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"eWindow=%x, MHal_XC_GetDNRBufAddress=%tx, MHal_XC_GetDNRBufSize=%tx\n", eWindow,(ptrdiff_t)(MHal_XC_GetDNRBufAddress(pInstance, eWindow)/BYTE_PER_WORD ),(ptrdiff_t)( (MHal_XC_GetDNRBufSize(pInstance, eWindow))/BYTE_PER_WORD));
834     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"eWindow=%x, u32MinLimitAddress=%tx, u32MaxLimitAddress=%tx\n", eWindow,(ptrdiff_t) u32MinLimitAddress,(ptrdiff_t) u32MaxLimitAddress);
835 
836     if(eWindow == MAIN_WINDOW)
837     {
838         /// need to disable the r/w request, when change the write limit base
839         /// For SCMI0/1 use the same IPM r/w request.
840         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(0)|BIT(1), BIT(0)|BIT(1));
841         if (IsHMirrorMode(eWindow) && IsEnableDualMode(eWindow))
842         {
843             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_38_L, ((u32WritelimitAddrBase&BIT(31))?BIT(0):0),BIT(0)); //F2 memory address limit enable
844             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_40_L, u32MinLimitAddress); //F2 memory min address
845             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_42_L, u32MaxLimitAddress); //F2 memory max address
846 
847         }
848         else
849         {
850             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_38_L, ((u32WritelimitAddrBase&BIT(31))?BIT(4):0),BIT(4)); //F2 memory address limit enable
851             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_48_L, u32MinLimitAddress); //F2 memory min address
852             SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_4A_L, u32MaxLimitAddress); //F2 memory max address
853         }
854         /// need to enable the r/w request
855         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0x00, BIT(0)|BIT(1));
856     }
857 #endif
858 }
859 
Hal_SC_set_opm_write_limit(void * pInstance,MS_BOOL bEnable,MS_BOOL bFlag,MS_PHY u32OPWlimitAddr,SCALER_WIN eWindow)860 void Hal_SC_set_opm_write_limit(void *pInstance, MS_BOOL bEnable, MS_BOOL bFlag, MS_PHY u32OPWlimitAddr, SCALER_WIN eWindow)
861 {
862 #if 0
863 
864     MS_U16 u16temp = 0x00;
865     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
866     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
867 
868     // Only support address of Main_Window
869     if (eWindow != MAIN_WINDOW )
870         return;
871 
872     // Bit 0 ~ 24
873     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_5E_L, u32OPWlimitAddr & 0xFFFF);
874     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_5F_L, (u32OPWlimitAddr >> 16) & 0x1FF);
875 
876     // OPW limit enable
877     if (bEnable)
878         u16temp = BIT(9);
879 
880     // OPW limit flag 0: maximum 1:minimum
881     if (bFlag)
882         u16temp |= BIT(10);
883 
884     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_5F_L,u16temp ,BIT(9) | BIT(10) );
885 #endif
886 }
887 
Hal_SC_is_extra_req_en(void * pInstance,MS_U16 * pu16MainHStart,MS_U16 * pu16MainHEnd,MS_U16 * pu16SubHStart,MS_U16 * pu16SubHEnd)888 MS_BOOL Hal_SC_is_extra_req_en(void *pInstance,
889                                MS_U16 *pu16MainHStart, MS_U16 *pu16MainHEnd,
890                                MS_U16 *pu16SubHStart,  MS_U16 *pu16SubHEnd)
891 {
892     MS_BOOL bEn = FALSE;
893     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
894     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
895 
896     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
897     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
898 
899     MS_U16 u16MainHStart, u16SubHStart;
900     MS_U16 u16MainHEnd, u16SubHEnd;
901     //FIX ME:need follow HW_DESIGN_4K2K_VER = 6 rule
902     u16MainHStart = pu16MainHStart == NULL ? SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L) : *pu16MainHStart;
903     u16MainHEnd   = pu16MainHEnd   == NULL ? SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L) : *pu16MainHEnd;
904     u16SubHStart  = pu16SubHStart  == NULL ? SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L) : *pu16SubHStart;
905     u16SubHEnd    = pu16SubHEnd    == NULL ? SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L) : *pu16SubHEnd;
906 
907     if( SC_R2BYTEMSK( psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(1))
908         &&(((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
909            ||(psXCInstPri->u32DeviceID == 1))
910       ) // Only Legacy mode use old rule for extra enable
911     {
912         if(u16MainHStart > u16SubHStart || u16MainHEnd < u16SubHEnd)
913         {
914             bEn = FALSE;
915         }
916         else
917         {
918             bEn = TRUE;
919         }
920     }
921     else
922     {
923         bEn = FALSE;
924     }
925 #if DBG_EN
926     SC_DBG(printf("Sub=%d, MainHs=%d, SubHs=%d, MainHe=%d, SubHe=%d :: Extra=%d\n",
927                   SC_R2BYTEMSK( psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(1)),
928                   u16MainHStart, u16SubHStart, u16MainHEnd, u16SubHEnd, bEn));
929 #endif
930     return bEn;
931 
932 }
933 #if 0 //Dual not support switch miu select dynamicly.
934 //#ifdef UFO_XC_SUPPORT_DUAL_MIU
935 #if (MIU_SEL_USE_XC_INTERNAL == FALSE)
936 // Miu opm1 opm2 need to be switched just under Dual Mirror case, so it should be Called in runtime.
937 // This API just for swap OPM when miu select control by miu arb.
938 static void _Hal_SC_adjust_dual_miu_setting(void *pInstance, MS_PHY u32FBAddress, MS_PHY u32DualFBAddress, MS_BOOL bMirrorWithDual, MS_U16 *pu16OPMLeftMiuSel, MS_U16 *pu16OPMRightMiuSel)
939 {
940     MS_U8 u8MIUSel = 0;
941     _phy_to_miu_offset(u8MIUSel, u32FBAddress, u32FBAddress);
942     if (u8MIUSel == 0)
943     {
944         //IPM0 OPM0 access miu0
945         *pu16OPMLeftMiuSel = 0x0;
946     }
947     else if(u8MIUSel == 1)
948     {
949         // OPM0 access miu 1
950         *pu16OPMLeftMiuSel = 0x1;
951     }
952     else if(u8MIUSel == 2)
953     {
954         // OPM0 access miu 1
955         *pu16OPMLeftMiuSel = 0x2;
956     }
957 
958     _phy_to_miu_offset(u8MIUSel, u32DualFBAddress, u32DualFBAddress);
959     if (u8MIUSel == 0)
960     {
961         //IPM0 OPM0 access miu0
962         *pu16OPMRightMiuSel = 0x0;
963     }
964     else if(u8MIUSel == 1)
965     {
966         // OPM0 access miu 1
967         *pu16OPMRightMiuSel = 0x1;
968     }
969     else if(u8MIUSel == 2)
970     {
971         // OPM0 access miu 1
972         *pu16OPMRightMiuSel = 0x2;
973     }
974 
975     if (bMirrorWithDual)
976     {
977         MS_U16 u16Tmp = *pu16OPMLeftMiuSel;
978         *pu16OPMLeftMiuSel = *pu16OPMRightMiuSel;
979         *pu16OPMRightMiuSel = u16Tmp;
980     }
981 
982 }
983 
984 #else
985 //the patch to reset the miu selection ,becuase HW always swaps the miu selection on dual or without dual.
986 static void _Hal_SC_adjust_swap_miu_setting(void *pInstance,MS_PHY u32FBAddress)
987 {
988     MS_U8 u8MIUSel = 0;
989     MS_U8 u8MIUSel_temp= 0;
990     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
991     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
992     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
993     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
994     u8MIUSel_temp = SC_R2BYTEMSK( psXCInstPri->u32DeviceID, REG_SC_BK51_05_L, BIT(4)) >> 3;
995     u8MIUSel_temp = u8MIUSel_temp | (SC_R2BYTEMSK( psXCInstPri->u32DeviceID, REG_SC_BK52_05_L, BIT(4)) >> 4);
996     _phy_to_miu_offset(u8MIUSel, u32FBAddress, u32FBAddress);
997     if(u8MIUSel_temp != u8MIUSel)
998     {
999         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_05_L, (u8MIUSel & BIT(0)) << 4 , 0x0010);
1000         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_05_L, ((u8MIUSel & BIT(1)) >> 1) << 4 , 0x0010);
1001     }
1002     else
1003     {
1004         printf("The miu has been set correctly function %s line %d parars \n",__FUNCTION__,__LINE__);
1005     }
1006 }
1007 static void _Hal_SC_adjust_swap_miu_setting_burst(void *pInstance,MS_PHY u32FBAddress)
1008 {
1009     MS_U8 u8MIUSel = 0;
1010     MS_U8 u8MIUSel_temp= 0;
1011     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1012     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1013     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1014     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1015     u8MIUSel_temp = SC_R2BYTEMSK( psXCInstPri->u32DeviceID, REG_SC_BK51_05_L, BIT(4)) >> 3;
1016     u8MIUSel_temp = u8MIUSel_temp | (SC_R2BYTEMSK( psXCInstPri->u32DeviceID, REG_SC_BK52_05_L, BIT(4)) >> 4);
1017     _phy_to_miu_offset(u8MIUSel, u32FBAddress, u32FBAddress);
1018     if(u8MIUSel_temp != u8MIUSel)
1019     {
1020         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_05_L, (u8MIUSel & BIT(0)) << 4 ,BIT(4));
1021         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK51_05_L, ((u8MIUSel & BIT(1)) >> 1) << 4 ,BIT(4));
1022     }
1023     else
1024     {
1025         printf("The miu has been set correctly function %s line %d parars \n",__FUNCTION__,__LINE__);
1026     }
1027     MDrv_XC_MLoad_Fire(pInstance, TRUE);
1028 }
1029 #endif
1030 #endif
1031 
Hal_SC_3D_CopyDispWinToSTGEN(void * pInstance,SCALER_WIN eWindow)1032 void Hal_SC_3D_CopyDispWinToSTGEN(void *pInstance, SCALER_WIN eWindow)
1033 {
1034     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1035     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1036     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1037     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1038 
1039     MS_U16 u16Start = 0, u16End = 0;
1040     // 3D case, copy bk10 disp to bk68
1041     // copy main disp Y
1042     if(eWindow == MAIN_WINDOW)
1043     {
1044         u16Start = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L);
1045         u16End = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L);
1046         // FRC 3D,SC transfer to TB,FRC transfer to LA,tb out 3D main display window height is 1/2 of LA
1047         if(MHal_FRC_IsEnableFRC3D(pInstance, MAIN_WINDOW) && (pXCResourcePrivate->stdrvXC_3D._bLAToTB) && IS_OUTPUT_4K2K_60HZ_PANEL())
1048         {
1049             if(!IsVMirrorMode(eWindow))
1050             {
1051                 u16End = (u16Start -pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart)/2 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + (u16End-u16Start +1)/2 -1;
1052                 u16Start = (u16Start -pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart)/2 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
1053             }
1054             else
1055             {
1056                 u16Start = (u16Start -pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart)/2 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + (u16End-u16Start +1)/2 -1;
1057                 u16End = u16Start + (u16End-u16Start +1)/2 -1;
1058             }
1059         }
1060         u16Start = u16Start + VSTART_OFFSET;
1061         u16End = u16End + VSTART_OFFSET;
1062 
1063         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0D_L, u16Start, 0x1FFF);
1064         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0E_L, u16End, 0x1FFF);
1065 
1066         // copy main disp X
1067         u16Start = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L);
1068         u16End = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L);
1069 
1070         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_05_L, u16Start, 0x3FFF);
1071         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_06_L, u16End, 0x3FFF);
1072     }
1073     else
1074     {
1075         // copy sub disp Y
1076         u16Start = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L);
1077         u16End = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L);
1078 
1079         u16Start = u16Start +  VSTART_OFFSET;
1080         u16End =  u16End + VSTART_OFFSET;
1081 
1082         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_12_L, u16Start, 0x1FFF);
1083         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_13_L, u16End, 0x1FFF);
1084 
1085         // copy sub disp X
1086         u16Start = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L);
1087         u16End = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L);
1088 
1089         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_10_L, u16Start, 0x3FFF);
1090         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_11_L, u16End, 0x3FFF);
1091     }
1092 }
1093 
_Hal_SC_fill_main_sw_db_burst(void * pInstance,P_SC_SWDB_INFO pDBreg)1094 static void _Hal_SC_fill_main_sw_db_burst(void *pInstance, P_SC_SWDB_INFO pDBreg)
1095 {
1096     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1097     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1098     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1099     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1100 
1101     if(Hal_SC_is_extra_req_en(pInstance, &pDBreg->u16H_DisStart, &pDBreg->u16H_DisEnd, NULL, NULL))
1102     {
1103         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, BIT(15), BIT(15));
1104     }
1105     else
1106     {
1107         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, 0, BIT(15));
1108     }
1109 
1110     //H pre-scaling
1111     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK02_04_L, (MS_U16)(pDBreg->u32H_PreScalingRatio>>00), 0xFFFF);
1112     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK02_05_L, (MS_U16)(pDBreg->u32H_PreScalingRatio>>16), 0xFFFF);
1113     //V pre-scaling
1114     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK02_08_L, (MS_U16)(pDBreg->u32V_PreScalingRatio>>00), 0xFFFF);
1115     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK02_09_L, (MS_U16)(pDBreg->u32V_PreScalingRatio>>16), 0xFFFF);
1116     //H post-scaling
1117     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_07_L, (MS_U16)(pDBreg->u32H_PostScalingRatio>>00), 0xFFFF);
1118     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_08_L, (MS_U16)(pDBreg->u32H_PostScalingRatio>>16), 0xFFFF);
1119     //V post-scaling
1120     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_09_L, (MS_U16)(pDBreg->u32V_PostScalingRatio>>00), 0xFFFF);
1121     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_0A_L, (MS_U16)(pDBreg->u32V_PostScalingRatio>>16), 0xFFFF);
1122 
1123     //SCMI: vertical limitation
1124     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_18_L, (MS_U16)(pDBreg->u16VWritelimit), 0xFFFF);
1125     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1A_L, (MS_U16)(pDBreg->u32DNRBase1>>00), 0xFFFF);
1126     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1B_L, (MS_U16)(pDBreg->u32DNRBase1>>16), 0xFFFF);
1127 
1128     //SCMI: IPM address 0
1129     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_08_L, (MS_U16)(pDBreg->u32DNRBase0>>00), 0xFFFF);
1130     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_09_L, (MS_U16)(pDBreg->u32DNRBase0>>16), 0xFFFF);
1131     //SCMI: DNR address 1
1132     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1A_L, (MS_U16)(pDBreg->u32DNRBase1>>00), 0xFFFF);
1133     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1B_L, (MS_U16)(pDBreg->u32DNRBase1>>16), 0xFFFF);
1134     //SCMI: DNR address 2
1135     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0C_L, (MS_U16)(pDBreg->u32DNRBase2>>00), 0xFFFF);
1136     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0D_L, (MS_U16)(pDBreg->u32DNRBase2>>16), 0xFFFF);
1137 
1138     //SCMI: DNR offset
1139     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0E_L, (MS_U16)(pDBreg->u16DNROffset>>00), 0xFFFF);
1140     //SCMI: DNR fetch
1141     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_0F_L, (MS_U16)(pDBreg->u16DNRFetch>>00), 0xFFFF);
1142 
1143     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1C_L, 0x0, 0xFFFF); //always disable IP H mirror line offset note:ds will enable this register at vdec firmware
1144 
1145     //SCMI: OPM address 0
1146     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_10_L, (MS_U16)(pDBreg->u32OPMBase0>>00), 0xFFFF);
1147     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_11_L, (MS_U16)(pDBreg->u32OPMBase0>>16), 0xFFFF);
1148     //SCMI: OPM address 1
1149     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_12_L, (MS_U16)(pDBreg->u32OPMBase1>>00), 0xFFFF);
1150     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_13_L, (MS_U16)(pDBreg->u32OPMBase1>>16), 0xFFFF);
1151     //SCMI: OPM address 2
1152     //    MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_14_L, (MS_U16)(pDBreg->u32OPMBase2>>00), 0xFFFF);
1153     //    MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_15_L, (MS_U16)(pDBreg->u32OPMBase2>>16), 0xFFFF);
1154     //SCMI: OPM offset
1155     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_16_L, (MS_U16)(pDBreg->u16OPMOffset>>00), 0xFFFF);
1156     //SCMI: OPM fetch
1157     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_17_L, (MS_U16)(pDBreg->u16OPMFetch>>00), 0xFFFF);
1158 
1159 #ifdef UFO_XC_SUPPORT_DUAL_MIU
1160     if (psXCInstPri->u32DeviceID == 0) // Dual miu just support sc0 main window for main window.
1161     {
1162         if (IsEnableDualMode(MAIN_WINDOW))
1163         {
1164 #if 0 // Dual do not support switch MIU setting Dynamic.
1165 #if (MIU_SEL_USE_XC_INTERNAL == FALSE)
1166             MS_U16 u16OPMLeftMiuSel = 0;
1167             MS_U16 u16OPMRightMiuSel = 0;
1168             if(IsHMirrorMode(MAIN_WINDOW))
1169             {
1170                 _Hal_SC_adjust_dual_miu_setting(pInstance, pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW],
1171                                                 pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW], TRUE, &u16OPMLeftMiuSel, &u16OPMRightMiuSel);
1172             }
1173             else
1174             {
1175                 _Hal_SC_adjust_dual_miu_setting(pInstance, pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW],
1176                                                 pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW], FALSE, &u16OPMLeftMiuSel, &u16OPMRightMiuSel);
1177             }
1178 
1179             // miu request0  IPM/OPM LSB
1180             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_10_L, ((u16OPMLeftMiuSel & BIT(0)) << 1)|(u16OPMLeftMiuSel & BIT(0)), BIT(1)| BIT(0));
1181             // miu request0  IPM/OPM MSB
1182             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_18_L, (u16OPMLeftMiuSel & BIT(1))|((u16OPMLeftMiuSel & BIT(1)) >> 1), BIT(1)| BIT(0));
1183             // miu request1  IPM/OPM
1184             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_19_L, (u16OPMRightMiuSel << 2)| u16OPMRightMiuSel , BIT(3)| BIT(2) | BIT(1)| BIT(0));
1185 #else
1186             _Hal_SC_adjust_swap_miu_setting_burst(pInstance,pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW]);
1187 #endif
1188 #endif
1189             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_08_L, (MS_U16)(pDBreg->u32DualDNRBase0 >> 0), 0xFFFF);  //F2_1 IPM base addr
1190             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_09_L, (MS_U16)(pDBreg->u32DualDNRBase0 >> 16), 0xFFFF);
1191             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_0E_L, (MS_U16)(pDBreg->u16DualDNROffset), 0x1FFF);  //F2_1 IPM offset
1192             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_0F_L, (MS_U16)(pDBreg->u16DualDNRFetch), 0x1FFF);  //F2_1 IPM fetch number
1193             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_10_L, (MS_U16)(pDBreg->u32DualOPMBase0 >> 0), 0xFFFF);  //F2_1 OPM base addr
1194             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_11_L, (MS_U16)(pDBreg->u32DualOPMBase0 >> 16), 0xFFFF);
1195             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_16_L, (MS_U16)(pDBreg->u16DualOPMOffset), 0x1FFF);  //F2_1 OPM offset
1196             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK52_17_L, (MS_U16)(pDBreg->u16DualOPMFetch), 0x1FFF);  //F2_1 OPM fetch number
1197             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK11_28_L, (MS_U16)(pDBreg->u16DualDNRFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16DNRFetch), 0x1FFF);  //F2 IPM total fetch
1198             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK11_29_L, (MS_U16)(BIT(15)|(pDBreg->u16DualOPMFetch + pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16OPMFetch)), 0x1FFF | BIT(15));  //F2 OPM total fetch
1199 
1200         }
1201         else
1202         {
1203             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK11_29_L, 0, BIT(15));
1204 #if 0 // Dual do not support switch MIU setting Dynamic.
1205 #if (MIU_SEL_USE_XC_INTERNAL == FALSE)
1206             MS_U16 u16OPMLeftMiuSel = 0;
1207             MS_U16 u16OPMRightMiuSel = 0;
1208             _Hal_SC_adjust_dual_miu_setting(pInstance, pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW],
1209                                             pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW], FALSE, &u16OPMLeftMiuSel, &u16OPMRightMiuSel);
1210             // miu request0  IPM/OPM LSB
1211             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_10_L, ((u16OPMLeftMiuSel & BIT(0)) << 1)|(u16OPMLeftMiuSel & BIT(0)), BIT(1)| BIT(0));
1212             // miu request0  IPM/OPM MSB
1213             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_18_L, (u16OPMLeftMiuSel & BIT(1))|((u16OPMLeftMiuSel & BIT(1)) >> 1), BIT(1)| BIT(0));
1214             // miu request1  IPM/OPM
1215             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_19_L, (u16OPMRightMiuSel << 2)| u16OPMRightMiuSel , BIT(3)| BIT(2) | BIT(1)| BIT(0));
1216 #endif
1217 #endif
1218         }
1219     }
1220 #endif
1221 
1222     //PIP
1223     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_15_L, (MS_U16)(pDBreg->u16VLen>>00), 0xFFFF); // Write V length
1224     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1D_L, (MS_U16)(pDBreg->u16LBOffset&0xFF), 0x00FF);
1225     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1C_L, (MS_U16)(pDBreg->u16DispOffset&0xFF), 0x00FF);
1226     // if LB Offset > externded pixels of bottom A session,
1227     // there would be garbage on the left side of sub video
1228     if (pDBreg->u16LBOffset > SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_14_L, 0x00FF))
1229     {
1230         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_14_L, (pDBreg->u16LBOffset&0xFF), 0x00FF);
1231     }
1232 
1233     //HDR input DE Window info
1234     if (gSrcInfo[MAIN_WINDOW].bR_FBL)
1235     {
1236         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK79_08_L, (MS_U16)(gSrcInfo[MAIN_WINDOW].stCropWin.width>>00), 0x1FFF);
1237         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK79_09_L, (MS_U16)(gSrcInfo[MAIN_WINDOW].stCropWin.height>>00), 0x0FFF);
1238     }
1239     else
1240     {
1241         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK79_08_L, (MS_U16)(pDBreg->u16H_CapSize>>00), 0x1FFF);
1242         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK79_09_L, (MS_U16)(pDBreg->u16V_CapSize>>00), 0x0FFF);
1243     }
1244 
1245 
1246     /// before enable ML bit mask feature, the capture size for 2P setting BK01_07[15] need to be considered
1247     if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, BIT(15)))
1248         pDBreg->u16H_CapSize |= 0x8000;
1249     else
1250         pDBreg->u16H_CapSize |= 0x0000;
1251 
1252     //capture window
1253     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK01_04_L, (MS_U16)(pDBreg->u16V_CapStart>>00), 0xFFFF);
1254     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK01_05_L, (MS_U16)(pDBreg->u16H_CapStart>>00), 0xFFFF);
1255     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK01_06_L, (MS_U16)(pDBreg->u16V_CapSize>>00), 0xFFFF);
1256     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK01_07_L, (MS_U16)(pDBreg->u16H_CapSize>>00), 0xFFFF);
1257 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
1258     if (psXCInstPri->u32DeviceID == 1)
1259     {
1260         MS_U16 u16HDEStart = SC_R2BYTE(0, REG_SC_BK10_04_L);
1261         //Display window
1262         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, u16HDEStart/2, VOP_DISPLAY_HSTART_MASK);//temp solution(+90)
1263         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (u16HDEStart/2+ pDBreg->u16H_DisEnd -pDBreg->u16H_DisStart), VOP_DISPLAY_HEND_MASK);
1264         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_04_L, u16HDEStart/2, VOP_DISPLAY_HSTART_MASK);//temp solution(+90)
1265         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_05_L, (u16HDEStart/2+ pDBreg->u16H_DisEnd -pDBreg->u16H_DisStart), VOP_DISPLAY_HEND_MASK);
1266 
1267         //  E_FRC_PIPE_DELAY_MODE ePipeDlyMode = E_FRC_PIPE_DELAY_MODE_AUTO;
1268         MS_U32 u32Sc1OneLineDly = (SC_R2BYTE(0, REG_SC_BK10_0C_L) + 1)/2;
1269         MS_U32 u32Sc1TGEN_Dly = 0;
1270         if (SC_R2BYTEMSK(0, REG_SC_BK68_50_L, BIT(3)) == 0)
1271         {
1272             MS_U32 u32STGEN_Dly = VIP_SC0_V_DLY*u32Sc1OneLineDly+VIP_SC0_H_DLY;
1273             MS_U32 u32Sc0TGEN_Dly = u32STGEN_Dly + TGEN_SC0_DLY;
1274             MS_U32 u32Sc1VIP_Dly = VIP_SC1_V_DLY*u32Sc1OneLineDly + VIP_SC1_H_DLY;
1275             if (u32Sc0TGEN_Dly > u32Sc1VIP_Dly + SC1_PRE_RUN_DLY)
1276             {
1277                 u32Sc1TGEN_Dly = u32Sc0TGEN_Dly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY;
1278                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pDBreg->u16V_DisStart), VOP_DISPLAY_VSTART_MASK);
1279                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pDBreg->u16V_DisEnd), VOP_DISPLAY_VEND_MASK);
1280             }
1281             else
1282             {
1283                 u32Sc1TGEN_Dly = u32Sc0TGEN_Dly + u32Sc1OneLineDly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY;
1284                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pDBreg->u16V_DisStart-1), VOP_DISPLAY_VSTART_MASK);
1285                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pDBreg->u16V_DisEnd-1), VOP_DISPLAY_VEND_MASK);
1286             }
1287         }
1288         else
1289         {
1290             MS_U32 u32STGEN_Dly = VIP_SC0_USER_MODE_V_DLY*u32Sc1OneLineDly+VIP_SC0_USER_MODE_H_DLY;
1291             MS_U32 u32Sc0TGEN_Dly = u32STGEN_Dly + TGEN_SC0_USER_MODE_DLY;
1292             MS_U32 u32HComp = (pDBreg->u16H_DisStart - u16HDEStart)/2;
1293             MS_U32 u32Sc1VIP_Dly = VIP_SC1_V_DLY*u32Sc1OneLineDly + VIP_SC1_H_DLY;
1294             u32Sc1TGEN_Dly = u32Sc0TGEN_Dly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY + u32HComp;
1295             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pDBreg->u16V_DisStart), VOP_DISPLAY_VSTART_MASK);
1296             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pDBreg->u16V_DisEnd), VOP_DISPLAY_VEND_MASK);
1297             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_06_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart, 0x1FFF);                                       // DE V start
1298             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1, 0x1FFF);  // DE V end
1299         }
1300         MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK68_61_L, (MS_U16)(u32Sc1TGEN_Dly%u32Sc1OneLineDly)*2, 0xFFFF);
1301         MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK68_62_L, (MS_U16)(u32Sc1TGEN_Dly/u32Sc1OneLineDly), 0xFFFF);
1302 
1303         if(!Hal_SC_3D_IsDualViewMode(pInstance,MAIN_WINDOW))
1304         {
1305             //Display window
1306             MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_07_L, (MS_U16)(pDBreg->u16H_DisStart>>00), VOP_DISPLAY_HSTART_MASK);
1307             MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_08_L, (MS_U16)(pDBreg->u16H_DisEnd>>00), VOP_DISPLAY_HEND_MASK);
1308             MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_09_L, (MS_U16)(pDBreg->u16V_DisStart), VOP_DISPLAY_VSTART_MASK);
1309             MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_0A_L, (MS_U16)(pDBreg->u16V_DisEnd), VOP_DISPLAY_VEND_MASK);
1310         }
1311 
1312     }
1313     else
1314     {
1315         MS_U16 u16Start = 0, u16End = 0;
1316         MS_U16 u16DispX = (pDBreg->u16H_DisStart +1) &~1; // Hstart need to be even
1317         if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled) &&
1318             MHal_FRC_IsFHDToFSC(pInstance,MAIN_WINDOW))
1319         {
1320             u16DispX = (pDBreg->u16H_DisStart/2 +1) &~1; // Hstart need to be even
1321 
1322             u16Start = pDBreg->u16V_DisStart/2;
1323             u16End = (pDBreg->u16V_DisStart/2 + (pDBreg->u16V_DisEnd - pDBreg->u16V_DisStart + 1)/2 - 1);
1324 
1325             u16Start += VSTART_OFFSET;
1326             u16End += VSTART_OFFSET;
1327 
1328             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_0D_L, u16Start, 0x1FFF);
1329             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_0E_L, u16End, 0x1FFF);
1330 
1331             u16Start = u16DispX;
1332             u16End = (u16DispX + (pDBreg->u16H_DisEnd - pDBreg->u16H_DisStart + 1)/2 - 1);
1333 
1334             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_05_L, u16Start, 0x3FFF);
1335             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_06_L, u16End, 0x3FFF);
1336         }
1337         else
1338         {
1339             u16Start = pDBreg->u16V_DisStart;
1340             u16End = (pDBreg->u16V_DisStart + (pDBreg->u16V_DisEnd - pDBreg->u16V_DisStart + 1) - 1);
1341 
1342             u16Start += VSTART_OFFSET;
1343             u16End += VSTART_OFFSET;
1344 
1345             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_0D_L, u16Start, 0x1FFF);
1346             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_0E_L, u16End, 0x1FFF);
1347 
1348             u16Start = u16DispX;
1349             u16End = u16DispX + ((pDBreg->u16H_DisEnd - pDBreg->u16H_DisStart + 1) - 1);
1350 
1351             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_05_L, u16Start, 0x3FFF);
1352             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_06_L, u16End, 0x3FFF);
1353         }
1354 
1355         //Display window
1356         if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled && (psXCInstPri->u32DeviceID != 1) &&
1357             (MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)))
1358         {
1359             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart), VOP_DISPLAY_HSTART_MASK);
1360             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart +pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width-1), VOP_DISPLAY_HEND_MASK);
1361             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart), VOP_DISPLAY_VSTART_MASK);
1362             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1), VOP_DISPLAY_VEND_MASK);
1363         }
1364         else
1365         {
1366             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, (MS_U16)(pDBreg->u16H_DisStart>>00), VOP_DISPLAY_HSTART_MASK);
1367             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (MS_U16)(pDBreg->u16H_DisEnd>>00), VOP_DISPLAY_HEND_MASK);
1368             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pDBreg->u16V_DisStart>>00), VOP_DISPLAY_VSTART_MASK);
1369             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pDBreg->u16V_DisEnd>>00), VOP_DISPLAY_VEND_MASK);
1370         }
1371     }
1372 #else
1373     //Display window
1374         if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled &&(psXCInstPri->u32DeviceID != 1) &&
1375             (MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)))
1376     {
1377         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart), VOP_DISPLAY_HSTART_MASK);
1378         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart +pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width-1), VOP_DISPLAY_HEND_MASK);
1379         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart), VOP_DISPLAY_VSTART_MASK);
1380         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1), VOP_DISPLAY_VEND_MASK);
1381     }
1382     else
1383     {
1384         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, (MS_U16)(pDBreg->u16H_DisStart>>00), VOP_DISPLAY_HSTART_MASK);
1385         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (MS_U16)(pDBreg->u16H_DisEnd>>00), VOP_DISPLAY_HEND_MASK);
1386         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pDBreg->u16V_DisStart>>00), VOP_DISPLAY_VSTART_MASK);
1387         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pDBreg->u16V_DisEnd>>00), VOP_DISPLAY_VEND_MASK);
1388     }
1389 #endif
1390     //  MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1C_L, 0x0, 0xFFFF); //always disable IP H mirror line offset note:ds will enable this register at vdec firmware
1391 
1392 #if SUPPORT_2_FRAME_MIRROR
1393 
1394     if( (gSrcInfo[MAIN_WINDOW].Status2.eFrameStoreNumber == IMAGE_STORE_2_FRAMES) && (!gSrcInfo[MAIN_WINDOW].bInterlace) && (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_02_L, BIT(15)) == 0))
1395     {
1396         // 2_frmae_mirror cannot work when UC on
1397 
1398         //SCMI: DNR address 1
1399         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1A_L, (MS_U16)(pDBreg->u32DNRBase1>>00), 0xFFFF);
1400         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_1B_L, (MS_U16)(pDBreg->u32DNRBase1>>16), 0xFFFF);
1401 
1402         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_30_L, 0x4000,0xFFFF);// enable two frame mirror
1403 
1404         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, 0x0001) == 0 )//compress mode
1405         {
1406             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK08_32_L, 0x20,0x00F0); // opm_ce_lcnt_inv
1407         }
1408     }
1409     else
1410     {
1411         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_02_L, BIT(15)) == BIT(15))
1412         {
1413             printf("@@ [%s,%5d] 2_frmae_mirror cannot work when UC on  \n",__func__,__LINE__);
1414         }
1415 
1416         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_30_L, 0x0000,0xFFFF);// disable two frame mirror
1417     }
1418 #endif
1419 
1420     MS_U16 u16reg = 0;
1421     if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
1422         ||(psXCInstPri->u32DeviceID == 1))
1423     {
1424         u16reg = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK08_32_L);
1425     }
1426     else
1427     {
1428         u16reg = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK33_32_L);
1429     }
1430 
1431 
1432     if(pDBreg->bOpmLcntInv_En)
1433     {
1434         u16reg |= BIT(5);
1435     }
1436     else
1437     {
1438         u16reg &= ~ BIT(5);
1439     }
1440 
1441 
1442     //monaco/muji 3D mode need control sub for some output format, or else the edge of object in the image may shake
1443 #if (HW_DESIGN_4K2K_VER == 4)
1444     E_XC_3D_OUTPUT_MODE e3DOutputFormat = MDrv_XC_Get_3D_Output_Mode(pInstance);
1445     if((e3DOutputFormat == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
1446        || (e3DOutputFormat == E_XC_3D_OUTPUT_TOP_BOTTOM) || (e3DOutputFormat == E_XC_3D_OUTPUT_TOP_BOTTOM_HW)
1447        || (e3DOutputFormat == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF) || (e3DOutputFormat == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW)
1448        || (e3DOutputFormat == E_XC_3D_OUTPUT_FRAME_PACKING))
1449     {
1450         //Hal_SC_set_opm_lcnt_inv(pInstance, bopm_lcnt_inv, SUB_WINDOW);
1451         if(pDBreg->bOpmLcntInv_En)
1452         {
1453             u16reg |= BIT(4);
1454         }
1455         else
1456         {
1457             u16reg &= ~ BIT(4);
1458         }
1459     }
1460 #endif
1461 
1462     if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
1463         ||(psXCInstPri->u32DeviceID == 1))
1464     {
1465         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK08_32_L, u16reg, 0xFFFF);
1466     }
1467     else
1468     {
1469         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK33_32_L, u16reg, 0xFFFF);
1470     }
1471 
1472     // by HW RD's request, for main video BW issue, adjust R/W line buffer length
1473     if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
1474     {
1475         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_20_L, 0x2020,0xFFFF);
1476         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_21_L, 0x2020,0xFFFF);
1477         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_22_L, 0x2222,0xFFFF);
1478     }
1479     else
1480     {
1481         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_20_L, 0x1818,0xFFFF);
1482         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_21_L, 0x1818,0xFFFF);
1483         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_22_L, 0x1818,0xFFFF);
1484     }
1485 }
1486 
_Hal_SC_fill_sub_sw_db_burst(void * pInstance,P_SC_SWDB_INFO pDBreg)1487 static void _Hal_SC_fill_sub_sw_db_burst(void *pInstance, P_SC_SWDB_INFO pDBreg)
1488 {
1489     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1490     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1491     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1492     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1493 
1494     if(Hal_SC_is_extra_req_en(pInstance, NULL, NULL, &pDBreg->u16H_DisStart, &pDBreg->u16H_DisEnd))
1495     {
1496         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, BIT(15), BIT(15));
1497     }
1498     else
1499     {
1500         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, 0, BIT(15));
1501     }
1502 
1503     //H pre-scaling
1504     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK04_04_L, (MS_U16)(pDBreg->u32H_PreScalingRatio>>00), 0xFFFF);
1505     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK04_05_L, (MS_U16)(pDBreg->u32H_PreScalingRatio>>16), 0xFFFF);
1506     //V pre-scaling
1507     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK04_08_L, (MS_U16)(pDBreg->u32V_PreScalingRatio>>00), 0xFFFF);
1508     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK04_09_L, (MS_U16)(pDBreg->u32V_PreScalingRatio>>16), 0xFFFF);
1509 
1510     //H post-scaling
1511     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_27_L, (MS_U16)(pDBreg->u32H_PostScalingRatio>>00), 0xFFFF);
1512     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_28_L, (MS_U16)(pDBreg->u32H_PostScalingRatio>>16), 0xFFFF);
1513     //V post-scaling
1514     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_29_L, (MS_U16)(pDBreg->u32V_PostScalingRatio>>00), 0xFFFF);
1515     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK23_2A_L, (MS_U16)(pDBreg->u32V_PostScalingRatio>>16), 0xFFFF);
1516 
1517     //SCMI: vertical limitation
1518     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_58_L, (MS_U16)(pDBreg->u16VWritelimit), 0xFFFF);
1519     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_5A_L, (MS_U16)(pDBreg->u32WritelimitBase>>00), 0xFFFF);
1520     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_5B_L, (MS_U16)(pDBreg->u32WritelimitBase>>16), 0xFFFF);
1521     //SCMI: IPM address 0
1522     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_48_L, (MS_U16)(pDBreg->u32DNRBase0>>00), 0xFFFF);
1523     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_49_L, (MS_U16)(pDBreg->u32DNRBase0>>16), 0xFFFF);
1524     //SCMI: DNR address 1
1525     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_4A_L, (MS_U16)(pDBreg->u32DNRBase1>>00), 0xFFFF);
1526     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_4B_L, (MS_U16)(pDBreg->u32DNRBase1>>16), 0xFFFF);
1527     //SCMI: DNR address 2
1528     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_4C_L, (MS_U16)(pDBreg->u32DNRBase2>>00), 0xFFFF);
1529     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_4D_L, (MS_U16)(pDBreg->u32DNRBase2>>16), 0xFFFF);
1530     //SCMI: DNR offset
1531     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_4E_L, (MS_U16)(pDBreg->u16DNROffset>>00), 0xFFFF);
1532     //SCMI: DNR fetch
1533     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_4F_L, (MS_U16)(pDBreg->u16DNRFetch>>00), 0xFFFF);
1534     //SCMI: OPM address 0
1535     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_50_L, (MS_U16)(pDBreg->u32OPMBase0>>00), 0xFFFF);
1536     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_51_L, (MS_U16)(pDBreg->u32OPMBase0>>16), 0xFFFF);
1537     //SCMI: OPM address 1
1538     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_52_L, (MS_U16)(pDBreg->u32OPMBase1>>00), 0xFFFF);
1539     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_53_L, (MS_U16)(pDBreg->u32OPMBase1>>16), 0xFFFF);
1540     //SCMI: OPM address 2
1541     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_54_L, (MS_U16)(pDBreg->u32OPMBase2>>00), 0xFFFF);
1542     //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_55_L, (MS_U16)(pDBreg->u32OPMBase2>>16), 0xFFFF);
1543     //SCMI: OPM offset
1544     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_56_L, (MS_U16)(pDBreg->u16OPMOffset>>00), 0xFFFF);
1545     //SCMI: OPM fetch
1546     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_57_L, (MS_U16)(pDBreg->u16OPMFetch>>00), 0xFFFF);
1547     //PIP
1548     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_16_L, (MS_U16)(pDBreg->u16VLen>>00), 0xFFFF); // Write V length
1549     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1D_L, (MS_U16)((pDBreg->u16LBOffset&0xFF)<<8), 0xFF00);
1550     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_1C_L, (MS_U16)((pDBreg->u16DispOffset&0xFF)<<8), 0xFF00);
1551 
1552     /// before enable ML bit mask feature, the capture size for 2P setting BK03_07[15] need to be considered
1553     if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_07_L, BIT(15)))
1554         pDBreg->u16H_CapSize |= 0x8000;
1555     else
1556         pDBreg->u16H_CapSize |= 0x0000;
1557 
1558     // capture window
1559     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_04_L, (MS_U16)(pDBreg->u16V_CapStart>>00), 0xFFFF);
1560     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_05_L, (MS_U16)(pDBreg->u16H_CapStart>>00), 0xFFFF);
1561     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_06_L, (MS_U16)(pDBreg->u16V_CapSize>>00), 0xFFFF);
1562     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_07_L, (MS_U16)(pDBreg->u16H_CapSize>>00), 0xFFFF);
1563 
1564     //Display window
1565     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_07_L, (MS_U16)(pDBreg->u16H_DisStart>>00), 0xFFFF);
1566     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_08_L, (MS_U16)(pDBreg->u16H_DisEnd>>00), 0xFFFF);
1567     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_09_L, (MS_U16)(pDBreg->u16V_DisStart>>00), 0xFFFF);
1568     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_0A_L, (MS_U16)(pDBreg->u16V_DisEnd>>00), 0xFFFF);
1569 
1570     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_5C_L, 0x0, 0x1FFF); //always disable IP H mirror line offset note:ds will enable this register at vdec firmware
1571 
1572     MS_U16 u16reg = 0;
1573     if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
1574         ||(psXCInstPri->u32DeviceID == 1))
1575     {
1576         u16reg = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK08_32_L);
1577     }
1578     else
1579     {
1580         u16reg = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK33_32_L);
1581     }
1582 
1583     if(pDBreg->bOpmLcntInv_En)
1584     {
1585         u16reg |= BIT(4);
1586     }
1587     else
1588     {
1589         u16reg &= ~ BIT(4);
1590     }
1591 
1592     if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
1593         ||(psXCInstPri->u32DeviceID == 1))
1594     {
1595         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK08_32_L, u16reg, 0xFFFF);
1596     }
1597     else
1598     {
1599         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK33_32_L, u16reg, 0xFFFF);
1600     }
1601 }
1602 //TODO: Before disable Dual miu, need disable XC miu request.
Hal_SC_sw_db_burst(void * pInstance,P_SC_SWDB_INFO pDBreg,SCALER_WIN eWindow)1603 void Hal_SC_sw_db_burst(void *pInstance, P_SC_SWDB_INFO pDBreg, SCALER_WIN eWindow )
1604 {
1605     _MLOAD_ENTRY(pInstance);
1606 
1607     if( eWindow == MAIN_WINDOW )
1608     {
1609 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
1610         E_FRC_MLOAD_TRIG_MODE eTrigMode = E_FRC_MLOAD_TRIG_MODE_FROM_OP1;
1611         XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1612         UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1613         XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1614         UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1615 
1616         // if no mute
1617         if(gSrcInfo[MAIN_WINDOW].bBlackscreenEnabled == FALSE)
1618         {
1619             if(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK68_5F_L) & BIT(15))
1620             {
1621                 eTrigMode = E_FRC_MLOAD_TRIG_MODE_FROM_OP2;
1622             }
1623             else
1624             {
1625                 eTrigMode = E_FRC_MLOAD_TRIG_MODE_FROM_OP1;
1626             }
1627 
1628             MHal_FRC_Set_Mload_Trig_Mode(pInstance, E_FRC_MLOAD_TRIG_MODE_FROM_OP1);
1629 
1630             _Hal_SC_fill_main_sw_db_burst(pInstance, pDBreg);
1631             MDrv_XC_MLoad_Fire(pInstance, TRUE);
1632 
1633             //--> restore
1634             MHal_FRC_Set_Mload_Trig_Mode(pInstance, eTrigMode);
1635         }
1636         else
1637         {
1638             _Hal_SC_fill_main_sw_db_burst(pInstance, pDBreg);
1639             MDrv_XC_MLoad_Fire(pInstance, TRUE);
1640         }
1641 #else
1642         _Hal_SC_fill_main_sw_db_burst(pInstance, pDBreg);
1643         MDrv_XC_MLoad_Fire(pInstance, TRUE);
1644 #endif
1645     }
1646     else
1647     {
1648         _Hal_SC_fill_sub_sw_db_burst(pInstance, pDBreg);
1649         MDrv_XC_MLoad_Fire(pInstance, TRUE);
1650     }
1651 
1652     _MLOAD_RETURN(pInstance);
1653 }
1654 
Hal_SC_dual_sw_db_burst(void * pInstance,P_SC_SWDB_INFO pMainDBreg,P_SC_SWDB_INFO pSubDBreg)1655 void Hal_SC_dual_sw_db_burst(void *pInstance, P_SC_SWDB_INFO pMainDBreg, P_SC_SWDB_INFO pSubDBreg)
1656 {
1657     _MLOAD_ENTRY(pInstance);
1658 
1659     _Hal_SC_fill_main_sw_db_burst(pInstance, pMainDBreg);
1660     _Hal_SC_fill_sub_sw_db_burst(pInstance, pSubDBreg);
1661     MDrv_XC_MLoad_Fire(pInstance, TRUE);
1662 
1663     _MLOAD_RETURN(pInstance);
1664 }
1665 
Hal_SC_sw_db(void * pInstance,P_SC_SWDB_INFO pDBreg,SCALER_WIN eWindow)1666 void Hal_SC_sw_db(void *pInstance, P_SC_SWDB_INFO pDBreg, SCALER_WIN eWindow )
1667 {
1668     MS_U32 u32LcentInvReg = 0;
1669     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
1670     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
1671     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
1672     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
1673 
1674     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] bDynamicScalingEnable%d  \n",__func__,__LINE__,pXCResourcePrivate->sthal_SC.bDynamicScalingEnable);
1675 
1676     if( eWindow == MAIN_WINDOW )
1677     {
1678         if(Hal_SC_is_extra_req_en(pInstance, &pDBreg->u16H_DisStart, &pDBreg->u16H_DisEnd, NULL, NULL))
1679         {
1680             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, BIT(15), BIT(15));
1681         }
1682         else
1683         {
1684             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, 0, BIT(15));
1685         }
1686 
1687         // H pre-scaling
1688         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L, pDBreg->u32H_PreScalingRatio);
1689         // V pre-scaling
1690         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L, pDBreg->u32V_PreScalingRatio);
1691         // H post-scaling
1692         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_07_L, pDBreg->u32H_PostScalingRatio);
1693         // V post-scaling
1694         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_09_L, pDBreg->u32V_PostScalingRatio);
1695 
1696         //SCMI
1697         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, pDBreg->u16VWritelimit); // Set vertical limitation
1698         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_1A_L, pDBreg->u32DNRBase1);
1699 
1700         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L, pDBreg->u32DNRBase0);     // input address0
1701         //SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0A_L, pDBreg->u32DNRBase1);     // input address1
1702         //SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0C_L, pDBreg->u32DNRBase2);     // input address2
1703 
1704         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pDBreg->u16DNROffset);// input Offset
1705         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pDBreg->u16DNRFetch); // input fetch
1706         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_1C_L, 0x0, 0xFFFF);         //always disable IP H mirror line offset note:ds will enable this register at vdec firmware
1707 
1708 
1709         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_10_L, pDBreg->u32OPMBase0); // output address0
1710         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_12_L, pDBreg->u32OPMBase1); // output address1
1711 //      SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_14_L, pDBreg->u32OPMBase2); // output address2
1712         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, pDBreg->u16OPMOffset); // output offset
1713         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, pDBreg->u16OPMFetch);  // output fetch
1714 
1715 #ifdef UFO_XC_SUPPORT_DUAL_MIU
1716         if (psXCInstPri->u32DeviceID == 0) // Dual miu just support sc0 main window for main window.
1717         {
1718             if(IsEnableDualMode(eWindow))
1719             {
1720 #if 0 // Dual miu do not support switch miu select dynamicly.
1721 #if (MIU_SEL_USE_XC_INTERNAL == FALSE)
1722                 MS_U16 u16OPMLeftMiuSel = 0;
1723                 MS_U16 u16OPMRightMiuSel = 0;
1724                 if(IsHMirrorMode(eWindow))
1725                 {
1726                     _Hal_SC_adjust_dual_miu_setting(pInstance, pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW],
1727                                                     pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW], TRUE, &u16OPMLeftMiuSel, &u16OPMRightMiuSel);
1728                 }
1729                 else
1730                 {
1731                     _Hal_SC_adjust_dual_miu_setting(pInstance, pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW],
1732                                                     pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW], FALSE, &u16OPMLeftMiuSel, &u16OPMRightMiuSel);
1733                 }
1734                 // miu request0  IPM/OPM LSB
1735                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L, ((u16OPMLeftMiuSel & BIT(0)) << 1)|(u16OPMLeftMiuSel & BIT(0)), BIT(1)| BIT(0));
1736                 // miu request0  IPM/OPM MSB
1737                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_18_L, (u16OPMLeftMiuSel & BIT(1))|((u16OPMLeftMiuSel & BIT(1)) >> 1), BIT(1)| BIT(0));
1738                 // miu request1  IPM/OPM
1739                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_19_L, (u16OPMRightMiuSel << 2)| u16OPMRightMiuSel , BIT(3)| BIT(2) | BIT(1)| BIT(0));
1740 #else
1741                 _Hal_SC_adjust_swap_miu_setting(pInstance,pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW]);
1742 #endif
1743 #endif
1744                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_08_L, pDBreg->u32DualDNRBase0 >> 0, 0xFFFF);  //F2_1 IPM base addr
1745                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_09_L, pDBreg->u32DualDNRBase0 >> 16, 0x03FF);
1746                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0E_L, pDBreg->u16DualDNROffset, 0x1FFF);  //F2_1 IPM offset
1747                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_0F_L, pDBreg->u16DualDNRFetch, 0x1FFF);  //F2_1 IPM fetch number
1748                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_10_L, pDBreg->u32DualOPMBase0 >> 0, 0xFFFF);  //F2_1 OPM base addr
1749                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_11_L, pDBreg->u32DualOPMBase0 >> 16, 0x03FF);
1750                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_16_L, pDBreg->u16DualOPMOffset, 0x1FFF);  //F2_1 OPM offset
1751                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_17_L, pDBreg->u16DualOPMFetch, 0x1FFF);  //F2_1 OPM fetch number
1752                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_28_L, pDBreg->u16DualDNRFetch + pDBreg->u16DNRFetch, 0x1FFF);  //F2 IPM total fetch
1753                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, pDBreg->u16DualOPMFetch + pDBreg->u16OPMFetch, 0x1FFF);  //F2 OPM total fetch
1754                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, BIT(15), BIT(15));  //Enable SCMI MIU Dual mode
1755             }
1756             else
1757             {
1758                 SC_W2BYTEMSK(0, REG_SC_BK11_29_L, 0, BIT(15));
1759 #if 0 // Dual miu do not support switch miu dynamicly.
1760 #if (MIU_SEL_USE_XC_INTERNAL == FALSE)
1761                 MS_U16 u16OPMLeftMiuSel = 0;
1762                 MS_U16 u16OPMRightMiuSel = 0;
1763                 _Hal_SC_adjust_dual_miu_setting(pInstance, pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW],
1764                                                 pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[MAIN_WINDOW], FALSE, &u16OPMLeftMiuSel, &u16OPMRightMiuSel);
1765                 // miu request0  IPM/OPM LSB
1766                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L, ((u16OPMLeftMiuSel & BIT(0)) << 1)|(u16OPMLeftMiuSel & BIT(0)), BIT(1)| BIT(0));
1767                 // miu request0  IPM/OPM MSB
1768                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_18_L, (u16OPMLeftMiuSel & BIT(1))|((u16OPMLeftMiuSel & BIT(1)) >> 1), BIT(1)| BIT(0));
1769                 // miu request1  IPM/OPM
1770                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_19_L, (u16OPMRightMiuSel << 2)| u16OPMRightMiuSel , BIT(3)| BIT(2) | BIT(1)| BIT(0));
1771 #else
1772                 _Hal_SC_adjust_swap_miu_setting(pInstance,pXCResourcePrivate->stdrvXC_Scaling._au32PreFBAddress[MAIN_WINDOW]);
1773 #endif
1774 #endif
1775             }
1776         }
1777 #endif
1778 
1779         //PIP
1780         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, pDBreg->u16VLen); // Write V length
1781         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pDBreg->u16LBOffset&0xFF), 0xFF);
1782         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, (pDBreg->u16DispOffset&0xFF), 0xFF);
1783         // if LB Offset > externded pixels of bottom A session,
1784         // there would be garbage on the left side of sub video
1785         if (pDBreg->u16LBOffset > SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_14_L, 0xFF))
1786         {
1787             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_14_L, (pDBreg->u16LBOffset&0xFF), 0xFF);
1788         }
1789 
1790         //HDR input DE Window info
1791         if (gSrcInfo[MAIN_WINDOW].bR_FBL)
1792         {
1793             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK79_08_L, (MS_U16)(gSrcInfo[MAIN_WINDOW].stCropWin.width>>00), 0x1FFF);
1794             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK79_09_L, (MS_U16)(gSrcInfo[MAIN_WINDOW].stCropWin.height>>00), 0x0FFF);
1795         }
1796         else
1797         {
1798             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK79_08_L, (MS_U16)(pDBreg->u16H_CapSize>>00), 0x1FFF);
1799             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK79_09_L, (MS_U16)(pDBreg->u16V_CapSize>>00), 0x0FFF);
1800         }
1801 
1802         /// before enable ML bit mask feature, the capture size for 2P setting BK01_07[15] need to be considered
1803         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, BIT(15)))
1804             pDBreg->u16H_CapSize |= 0x8000;
1805         else
1806             pDBreg->u16H_CapSize |= 0x0000;
1807 
1808         // capture window
1809         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_04_L, pDBreg->u16V_CapStart); // Capture V start
1810         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_05_L, pDBreg->u16H_CapStart); // Capture H start
1811         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_06_L, pDBreg->u16V_CapSize);  // Capture V size
1812         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, pDBreg->u16H_CapSize);  // Capture H size
1813 
1814 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
1815         //Display window
1816         if (psXCInstPri->u32DeviceID == 1)
1817         {
1818             MS_U16 u16HDEStart = SC_R2BYTE(0, REG_SC_BK10_04_L);
1819             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, u16HDEStart/2);//temp solution(+90)
1820             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, (u16HDEStart/2+ pDBreg->u16H_DisEnd -pDBreg->u16H_DisStart));
1821             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L, u16HDEStart/2);//temp solution(+90)
1822             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, (u16HDEStart/2+ pDBreg->u16H_DisEnd -pDBreg->u16H_DisStart));
1823 
1824             //  E_FRC_PIPE_DELAY_MODE ePipeDlyMode = E_FRC_PIPE_DELAY_MODE_AUTO;
1825             MS_U32 u32Sc1OneLineDly = (SC_R2BYTE(0, REG_SC_BK10_0C_L) + 1)/2;
1826             MS_U32 u32Sc1TGEN_Dly = 0;
1827             if ((SC_R2BYTEMSK(0, REG_SC_BK68_50_L, BIT(3)) == 0)
1828 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
1829                 && (!Hal_SC_3D_IsDualViewMode(pInstance, MAIN_WINDOW))
1830 #endif
1831                 )
1832             {
1833                 MS_U32 u32STGEN_Dly = VIP_SC0_V_DLY*u32Sc1OneLineDly+VIP_SC0_H_DLY;
1834                 MS_U32 u32Sc0TGEN_Dly = u32STGEN_Dly + TGEN_SC0_DLY;
1835                 MS_U32 u32Sc1VIP_Dly = VIP_SC1_V_DLY*u32Sc1OneLineDly + VIP_SC1_H_DLY;
1836 
1837                 if (u32Sc0TGEN_Dly > u32Sc1VIP_Dly + SC1_PRE_RUN_DLY)
1838                 {
1839                     u32Sc1TGEN_Dly = u32Sc0TGEN_Dly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY;
1840                     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pDBreg->u16V_DisStart);
1841                     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pDBreg->u16V_DisEnd);
1842                 }
1843                 else
1844                 {
1845                     u32Sc1TGEN_Dly = u32Sc0TGEN_Dly + u32Sc1OneLineDly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY;
1846                     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pDBreg->u16V_DisStart - 1);
1847                     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pDBreg->u16V_DisEnd - 1);
1848                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart-1, 0x1FFF);                                       // DE V start
1849                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-2, 0x1FFF);  // DE V end
1850                 }
1851                 SC_W2BYTEMSK(0, REG_SC_BK68_61_L, (u32Sc1TGEN_Dly%u32Sc1OneLineDly)*2, 0xFFFF);// 2p mode
1852                 SC_W2BYTEMSK(0, REG_SC_BK68_62_L, u32Sc1TGEN_Dly/u32Sc1OneLineDly, 0xFFFF);
1853             }
1854             else
1855             {
1856                 MS_U32 u32STGEN_Dly = VIP_SC0_USER_MODE_V_DLY*u32Sc1OneLineDly+VIP_SC0_USER_MODE_H_DLY;
1857                 MS_U32 u32Sc0TGEN_Dly = u32STGEN_Dly + TGEN_SC0_USER_MODE_DLY;
1858                 MS_U32 u32Sc1VIP_Dly = VIP_SC1_V_DLY*u32Sc1OneLineDly + VIP_SC1_H_DLY;
1859                 MS_U32 u32HComp = (pDBreg->u16H_DisStart - u16HDEStart)/2;
1860 
1861                 u32Sc1TGEN_Dly = u32Sc0TGEN_Dly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY + u32HComp;
1862                 SC_W2BYTEMSK(0, REG_SC_BK68_61_L, (u32Sc1TGEN_Dly%u32Sc1OneLineDly)*2, 0xFFFF);
1863                 SC_W2BYTEMSK(0, REG_SC_BK68_62_L, u32Sc1TGEN_Dly/u32Sc1OneLineDly, 0xFFFF);
1864                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pDBreg->u16V_DisStart);
1865                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pDBreg->u16V_DisEnd);
1866                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart, 0x1FFF);                                       // DE V start
1867                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart+pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1, 0x1FFF);  // DE V end
1868             }
1869         }
1870         else
1871         {
1872             //Display window
1873             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled && (psXCInstPri->u32DeviceID != 1) &&
1874                 (MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)))
1875             {
1876                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart));
1877                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart +pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width-1));
1878                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart));
1879                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1));
1880             }
1881             else
1882             {
1883                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pDBreg->u16H_DisStart);
1884                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pDBreg->u16H_DisEnd);
1885                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pDBreg->u16V_DisStart);
1886                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pDBreg->u16V_DisEnd);
1887             }
1888 
1889             //For SkipWaitVsync case, write riu directly.
1890             MDrv_FRC_UpdateMDE(pInstance, gSrcInfo[MAIN_WINDOW].stDispWin);
1891         }
1892 
1893         if ((psXCInstPri->u32DeviceID == 1) && (!Hal_SC_3D_IsDualViewMode(pInstance, MAIN_WINDOW)))//follow HW_DESIGN_4K2K_VER = 6 rule
1894         {
1895             //Display window
1896             SC_W2BYTE(0, REG_SC_BK0F_07_L, pDBreg->u16H_DisStart); // Display H start
1897             SC_W2BYTE(0, REG_SC_BK0F_08_L, pDBreg->u16H_DisEnd);   // Display H end
1898             SC_W2BYTE(0, REG_SC_BK0F_09_L, pDBreg->u16V_DisStart); // Display V start
1899             SC_W2BYTE(0, REG_SC_BK0F_0A_L, pDBreg->u16V_DisEnd);   // Display V end
1900         }
1901 #else
1902         //Display window
1903         if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled && (psXCInstPri->u32DeviceID != 1) &&
1904             (MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)))
1905         {
1906             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart));
1907             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart +pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width-1));
1908             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart));
1909             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1));
1910         }
1911         else
1912         {
1913             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pDBreg->u16H_DisStart); // Display H start
1914             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pDBreg->u16H_DisEnd);   // Display H end
1915             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pDBreg->u16V_DisStart); // Display V start
1916             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pDBreg->u16V_DisEnd);   // Display V end
1917         }
1918 #endif
1919 
1920         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_1C_L, 0x0, 0xFFFF);         //always disable IP H mirror line offset note:ds will enable this register at vdec firmware
1921 
1922 // 2_frame_mirror setting
1923 #if SUPPORT_2_FRAME_MIRROR
1924         // 2_frmae_mirror cannot work when UC on
1925         if( (gSrcInfo[eWindow].Status2.eFrameStoreNumber == IMAGE_STORE_2_FRAMES) && (!gSrcInfo[eWindow].bInterlace) && (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_02_L, BIT(15)) == 0))
1926         {
1927             //SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_1A_L, pDBreg->u32DNRBase1);  // IPM base1
1928             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x4000, BIT(14));   // enable two frame mirror
1929 
1930             if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, 0x0001) == 0 )//compress mode
1931             {
1932                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_32_L, 0X20 ,0x00F0 );   // opm_ce_lcnt_inv
1933             }
1934         }
1935         else
1936         {
1937             if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_02_L, BIT(15)) == BIT(15))
1938             {
1939                 printf("@@ [%s,%5d] 2_frmae_mirror cannot work when UC on  \n",__func__,__LINE__);
1940             }
1941 
1942             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0x00 , BIT(14)); // disable two frame mirror
1943         }
1944 #endif
1945         if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
1946             ||(psXCInstPri->u32DeviceID == 1))
1947         {
1948             u32LcentInvReg = REG_SC_BK08_32_L;
1949         }
1950         else
1951         {
1952             u32LcentInvReg = REG_SC_BK33_32_L;
1953         }
1954 
1955         if(pDBreg->bOpmLcntInv_En)
1956         {
1957             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32LcentInvReg, BIT(5), BIT(5));
1958         }
1959         else
1960         {
1961             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32LcentInvReg, 0x00, BIT(5));
1962         }
1963 
1964         //monaco/muji 3D mode need control sub for some output format, or else the edge of object in the image may shake
1965 #if (HW_DESIGN_4K2K_VER == 4)
1966         E_XC_3D_OUTPUT_MODE e3DOutputFormat = MDrv_XC_Get_3D_Output_Mode(pInstance);
1967         if((e3DOutputFormat == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
1968            || (e3DOutputFormat == E_XC_3D_OUTPUT_TOP_BOTTOM) || (e3DOutputFormat == E_XC_3D_OUTPUT_TOP_BOTTOM_HW)
1969            || (e3DOutputFormat == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF) || (e3DOutputFormat == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW)
1970            || (e3DOutputFormat == E_XC_3D_OUTPUT_FRAME_PACKING))
1971         {
1972             //Hal_SC_set_opm_lcnt_inv(pInstance, bopm_lcnt_inv, SUB_WINDOW);
1973             if(pDBreg->bOpmLcntInv_En)
1974             {
1975                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32LcentInvReg, BIT(4), BIT(4));
1976             }
1977             else
1978             {
1979                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32LcentInvReg, 0x00, BIT(4));
1980             }
1981         }
1982 #endif
1983     }
1984     else
1985     {
1986         if(Hal_SC_is_extra_req_en(pInstance, NULL, NULL, &pDBreg->u16H_DisStart, &pDBreg->u16H_DisEnd))
1987         {
1988             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, BIT(15), BIT(15));
1989         }
1990         else
1991         {
1992             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L, 0, BIT(15));
1993         }
1994 
1995         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_04_L, pDBreg->u32H_PreScalingRatio);   // H pre-scaling
1996         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_08_L, pDBreg->u32V_PreScalingRatio);   // V pre-scaling
1997 
1998         //HVSP
1999         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_27_L, pDBreg->u32H_PostScalingRatio);  // H post-scaling
2000         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_29_L, pDBreg->u32V_PostScalingRatio);  // V post-scaling
2001 
2002         //SCMI
2003         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_58_L, pDBreg->u16VWritelimit); // Set vertical limitation
2004         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_5A_L, pDBreg->u32WritelimitBase);
2005         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_48_L, pDBreg->u32DNRBase0);     // input address0
2006         //SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4A_L, pDBreg->u32DNRBase1); // input address1
2007         //SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4C_L, pDBreg->u32DNRBase2); // input address2
2008         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4E_L, pDBreg->u16DNROffset);// input Offset
2009         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4F_L, pDBreg->u16DNRFetch); // input fetch
2010         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, pDBreg->u32OPMBase0); // output address0
2011         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_52_L, pDBreg->u32OPMBase1); // output address1
2012         //SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_54_L, pDBreg->u32OPMBase2); // output address2
2013         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, pDBreg->u16OPMOffset); // output offset
2014         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, pDBreg->u16OPMFetch);  // output fetch
2015         //PIP
2016         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, pDBreg->u16VLen); // Write V length
2017         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1D_L, (pDBreg->u16LBOffset&0xFF)<<8, 0xFF00);
2018         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1C_L, (pDBreg->u16DispOffset&0xFF)<<8, 0xFF00);
2019 
2020         // capture window
2021         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_04_L, pDBreg->u16V_CapStart); // Capture V start
2022         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_05_L, pDBreg->u16H_CapStart); // Capture H start
2023         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_06_L, pDBreg->u16V_CapSize);  // Capture V size
2024         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_07_L, pDBreg->u16H_CapSize);  // Capture H size
2025 
2026         //Display window
2027         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pDBreg->u16H_DisStart); // Display H start
2028         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pDBreg->u16H_DisEnd);   // Display H end
2029         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pDBreg->u16V_DisStart); // Display V start
2030         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pDBreg->u16V_DisEnd);   // Display V end
2031 
2032         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_5C_L, 0x0, 0x1FFF);         //always disable IP H mirror line offset note:ds will enable this register at vdec firmware
2033 
2034         if (((psXCInstPri->u32DeviceID == 0) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
2035             ||(psXCInstPri->u32DeviceID == 1))
2036         {
2037             u32LcentInvReg = REG_SC_BK08_32_L;
2038         }
2039         else
2040         {
2041             u32LcentInvReg = REG_SC_BK33_32_L;
2042         }
2043 
2044         if(pDBreg->bOpmLcntInv_En)
2045         {
2046             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32LcentInvReg, BIT(4), BIT(4));
2047         }
2048         else
2049         {
2050             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32LcentInvReg, 0x00, BIT(4));
2051         }
2052     }
2053 
2054     // by HW RD's request, for main video BW issue, adjust R/W line buffer length
2055     if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
2056     {
2057         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_20_L, 0x2020);
2058         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_21_L, 0x2020);
2059         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_22_L, 0x2222);
2060     }
2061     else
2062     {
2063         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_20_L, 0x1818);
2064         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_21_L, 0x1818);
2065         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_22_L, 0x1818);
2066     }
2067 
2068 }
2069 #if ((defined (ANDROID) || defined(MSOS_TYPE_LINUX_KERNEL)) && defined(UFO_XC_DS_PQ))
2070 extern stDS_PQ_REG DS_REG[DS_PQ_MAX_NUM];
2071 extern MS_U16 DS_REG_CNT;
2072 extern stDS_PQ_REG DS_UFSC_REG[DS_PQ_MAX_NUM];
2073 extern MS_U16 DS_UFSC_REG_CNT;
2074 extern MS_BOOL bUFSC_DSEn;
2075 #endif
Hal_SC_SWDS_AddCmd(void * pInstance,P_SC_SWDB_INFO pDBreg,SCALER_WIN eWindow)2076 void Hal_SC_SWDS_AddCmd(void *pInstance, P_SC_SWDB_INFO pDBreg, SCALER_WIN eWindow)
2077 {
2078     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2079     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2080     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2081     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2082 
2083     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] eWindow:%d bDynamicScalingEnable%d  \n",__func__,__LINE__,eWindow,pXCResourcePrivate->sthal_SC.bDynamicScalingEnable);
2084 #if ((defined (ANDROID) || defined(MSOS_TYPE_LINUX_KERNEL)) && defined(UFO_XC_DS_PQ))
2085     MS_U16 cnt_x = 0;
2086     //MS_U16 u16TempRegVal = 0;
2087 #endif
2088 
2089     MS_U16 u16VSyncStart = 0;
2090     MS_U16 u16VSyncEnd = 0;
2091     MS_U16 u16VFDE_End = 0;
2092     MS_U16 u16VsyncSize = 0;
2093 
2094     if(eWindow == MAIN_WINDOW)
2095     {
2096         if(pXCResourcePrivate->sthal_SC.bDynamicScalingEnable)
2097         {
2098             pXCResourcePrivate->sthal_SC.u8DynamicScalingNextIndex[MAIN_WINDOW] = pXCResourcePrivate->sthal_SC.u8DynamicScalingCurrentIndex_Ring[MAIN_WINDOW];
2099 
2100             //Command Priority:
2101             //1.GOP
2102             //2.MVOP
2103             //3.XC
2104             //---------------------------------------------------------------------IP Command Start---------------------------------------------------------------------------------------//
2105 
2106             MS_U32 ActiveSWClearEn = 0;
2107             MS_U32 u32SW_Reset_Enable = 0;
2108             //ActiveSWClearEn enable in first DS IP command ;
2109             u32SW_Reset_Enable = 0x4000; // bit14: reg_ds_active_sw_clr_en,set ds_activating cleared by SW
2110             ActiveSWClearEn = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK1F_17_L, 0xFFFF);
2111             ActiveSWClearEn |= u32SW_Reset_Enable;
2112 
2113             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK1F_17_L,(MS_U16)(ActiveSWClearEn),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2114 
2115             //XC_PRINTF("[%s,%5d] bR_FBL:%d bFBL:%d  \n",__func__,__LINE__,gSrcInfo[MAIN_WINDOW].bR_FBL,gSrcInfo[MAIN_WINDOW].bFBL);
2116             //XC_PRINTF("[%s,%5d] Crop(x,y,w,h)=(%d,%d,%d,%d) \n",__func__,__LINE__,gSrcInfo[eWindow].stCropWin.x,gSrcInfo[eWindow].stCropWin.y,gSrcInfo[eWindow].stCropWin.width,gSrcInfo[eWindow].stCropWin.height);
2117 
2118             if(IsSrcTypeStorage(gSrcInfo[MAIN_WINDOW].enInputSourceType))
2119             {
2120                 if((gSrcInfo[MAIN_WINDOW].bR_FBL) || (gSrcInfo[MAIN_WINDOW].bFBL))//set MVOP crop info
2121                 {
2122                     // GET MVOP crop info first
2123                     MVOP_Handle stHdl = { E_MVOP_MODULE_MAIN };
2124                     MVOP_XCGetCrop stCropInfo;
2125                     stCropInfo.u16XStart = gSrcInfo[eWindow].stCropWin.x;
2126                     stCropInfo.u16YStart = gSrcInfo[eWindow].stCropWin.y;
2127                     stCropInfo.u16XSize = gSrcInfo[eWindow].stCropWin.width;
2128                     stCropInfo.u16YSize = gSrcInfo[eWindow].stCropWin.height;
2129 
2130                     MDrv_MVOP_GetCommand(&stHdl, E_MVOP_CMD_GET_CROP_FOR_XC, &stCropInfo, sizeof(MVOP_XCGetCrop));
2131 #if (HW_DESIGN_4K2K_VER == 6)
2132                     if(pXCResourcePrivate->stdrvXC_Display._enInputSourceType == E_XC_INPUT_SOURCE_TYPE_OTT)
2133                     {
2134                         MS_U16 u16Mvop_sub_xstart =0;
2135                         MS_U16 u16Mvop_sub_ystart =0;
2136                         MS_U16 u16Mvop_sub_xsize =0;
2137                         MS_U16 u16Mvop_sub_ysize =0;
2138 
2139                         stCropInfo.u16XStart = (stCropInfo.u16XStart + 7)&~0x7;
2140                         stCropInfo.u16YStart = ((stCropInfo.u16YStart & 0x1FFF) + 3)&~0x3;
2141                         stCropInfo.u16XSize = stCropInfo.u16XSize &~0x7;
2142                         stCropInfo.u16YSize = stCropInfo.u16YSize &~0x3;
2143 
2144                         u16Mvop_sub_xstart = (stCropInfo.u16XStart/2 + 1)&~0x1;
2145                         u16Mvop_sub_ystart = (stCropInfo.u16YStart/2 + 1)&~0x1;
2146                         u16Mvop_sub_xsize = (stCropInfo.u16XSize/2)&~0x1;
2147                         u16Mvop_sub_ysize = (stCropInfo.u16YSize/2)&~0x1;
2148 
2149                         //MVOP sub
2150                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SUBMVOP_CROP_H_START,u16Mvop_sub_xstart,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);         //0xFFFF000A 0840XXXX
2151                         if(u16Mvop_sub_ystart == 0)
2152                         {
2153                             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SUBMVOP_CROP_V_START,0x6000,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);  //0xFFFF000A 0841XXXX
2154                         }
2155                         else
2156                         {
2157                             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SUBMVOP_CROP_V_START,0x2000|u16Mvop_sub_ystart,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);  //0xFFFF000A 0841XXXX
2158                         }
2159                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SUBMVOP_CROP_H_SIZE,u16Mvop_sub_xsize,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);           //0xFFFF000A 0842XXXX
2160                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SUBMVOP_CROP_V_SIZE,u16Mvop_sub_ysize,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);           //0xFFFF000A 0843XXXX
2161                     }
2162 #endif
2163 
2164                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_H_START,stCropInfo.u16XStart,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);         //0xFFFF000A 0840XXXX
2165                     if(stCropInfo.u16YStart == 0)
2166                     {
2167                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_V_START,0x4000|stCropInfo.u16YStart,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);  //0xFFFF000A 0841XXXX
2168                     }
2169                     else
2170                     {
2171                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_V_START,0x6000|stCropInfo.u16YStart,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);  //0xFFFF000A 0841XXXX
2172                     }
2173                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_H_SIZE,stCropInfo.u16XSize,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);           //0xFFFF000A 0842XXXX
2174                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_V_SIZE,stCropInfo.u16YSize,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);           //0xFFFF000A 0843XXXX
2175                     pDBreg->u16LBOffset = 0; // mvop do crop, align in 2pixel, so xc don't need crop
2176                 }
2177                 else
2178                 {
2179                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_H_START,0x0,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);     //0xFFFF000A 0840XXXX
2180                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_V_START,0x2000,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);  //0xFFFF000A 0841XXXX
2181                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_H_SIZE,0x0,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);      //0xFFFF000A 0842XXXX
2182                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_MVOP_CROP_V_SIZE,0x0,DS_IP,DS_MVOP,&PSTXC_DS_CMDCNT);      //0xFFFF000A 0843XXXX
2183                 }
2184             }
2185 
2186             //H pre-scaling
2187             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_04_L,(MS_U16)(pDBreg->u32H_PreScalingRatio>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8104XXXX
2188             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_05_L,(MS_U16)(pDBreg->u32H_PreScalingRatio>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8105XXXX
2189             //V pre-scaling
2190             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_08_L,(MS_U16)(pDBreg->u32V_PreScalingRatio>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8108XXXX
2191             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_09_L,(MS_U16)(pDBreg->u32V_PreScalingRatio>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8109XXXX
2192 
2193             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_18_L,(MS_U16)(pDBreg->u16VWritelimit>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8918XXXX
2194 
2195             if(IsVMirrorMode(MAIN_WINDOW))
2196             {
2197                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_08_L,(MS_U16)(pDBreg->u32DNRBase0>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2198                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_09_L,(MS_U16)(pDBreg->u32DNRBase0>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2199             }
2200             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_0F_L,(MS_U16)(pDBreg->u16DNRFetch>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 890FXXXX
2201 
2202             //H_mirror_offset
2203             if(IsHMirrorMode(MAIN_WINDOW)||IsVMirrorMode(MAIN_WINDOW))
2204             {
2205                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] VB_width:%d framNum:%d u8BitPerPixel:%d  \n",__func__,__LINE__,gSrcInfo[MAIN_WINDOW].Status2.u16VirtualBox_Width,MDrv_XC_TransFrameNumToFactor(pInstance,gSrcInfo[MAIN_WINDOW].Status2.eFrameStoreNumber, gSrcInfo[MAIN_WINDOW].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED),gSrcInfo[MAIN_WINDOW].u8BitPerPixel);
2206 
2207                 MS_U32 H_mirror_offset;
2208                 H_mirror_offset = (gSrcInfo[eWindow].Status2.u16VirtualBox_Width * gSrcInfo[eWindow].u8BitPerPixel * 2 / 8 * MDrv_XC_TransFrameNumToFactor(pInstance,gSrcInfo[eWindow].Status2.eFrameStoreNumber, gSrcInfo[eWindow].bLinearMode, _FIELD_PACKING_MODE_SUPPORTED)) / BYTE_PER_WORD;
2209 
2210                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_1C_L,H_mirror_offset,DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 891CXXXX
2211             }
2212             else
2213             {
2214                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_1C_L,0x0000,DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 891CXXXX
2215             }
2216 
2217             //HDR input DE Window info
2218             if (gSrcInfo[MAIN_WINDOW].bR_FBL)
2219             {
2220                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK79_08_L,(MS_U16)(gSrcInfo[MAIN_WINDOW].stCropWin.width>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2221                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK79_09_L,(MS_U16)(gSrcInfo[MAIN_WINDOW].stCropWin.height>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2222             }
2223             else
2224             {
2225                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK79_08_L,(MS_U16)(pDBreg->u16H_CapSize>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2226                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK79_09_L,(MS_U16)(pDBreg->u16V_CapSize>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2227             }
2228 
2229             //Cap info
2230             /// before enable ML bit mask feature, the capture size for 2P setting BK01_07[15] need to be considered
2231             if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, BIT(15)))
2232                 pDBreg->u16H_CapSize |= 0x8000;
2233             else
2234                 pDBreg->u16H_CapSize |= 0x0000;
2235 
2236             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK01_06_L,(MS_U16)(pDBreg->u16V_CapSize>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8086XXXX
2237             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK01_07_L,(MS_U16)(pDBreg->u16H_CapSize>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8087XXXX
2238 
2239 #if (SUPPORT_KERNEL_DS == 0)//if SUPPORT_KERNEL_DS is true,this cmd will be set in kernel ds
2240             //toggle reg_ds_ipm_active_set in last DS IP command
2241             MS_U32 u32SW_Reset_IPM = 0;
2242             u32SW_Reset_IPM = 0x0010 ;//bit4 : reg_ds_ipm_active_clr
2243             ActiveSWClearEn |= u32SW_Reset_IPM;
2244             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK1F_17_L,(MS_U16)(ActiveSWClearEn),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);
2245 #endif
2246 
2247 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2248 #ifdef XC_DUAL_MIU_SUPPORT_DS
2249             if (IsEnableDualMode(eWindow))
2250             {
2251                 // SCMI dual miu IPM baseAddress
2252                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_08_L, (MS_U16)(pDBreg->u32DualDNRBase0>>00), DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
2253                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_09_L, (MS_U16)(pDBreg->u32DualDNRBase0>>16), DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
2254                 // SCMI dual miu IPM Offset
2255                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0E_L, (MS_U16)(pDBreg->u16DualDNROffset), DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
2256                 // SCMI dual miu IPM fetch
2257                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_0F_L, (MS_U16)(pDBreg->u16DualDNRFetch), DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
2258                 // SCMI dual miu IPM fetch total
2259                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_28_L, (MS_U16)(pDBreg->u16DualDNRFetch + pDBreg->u16DNRFetch), DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
2260             }
2261 #endif
2262 #endif
2263 
2264             //---------------------------------------------------------------------IP Command End---------------------------------------------------------------------------------------//
2265 
2266             //---------------------------------------------------------------------OP Command Start---------------------------------------------------------------------------------------//
2267             if(!((gSrcInfo[MAIN_WINDOW].bR_FBL) || (gSrcInfo[MAIN_WINDOW].bFBL))) //FB case
2268             {
2269                 //H post-scaling
2270                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_07_L,(MS_U16)(pDBreg->u32H_PostScalingRatio>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9187XXXX
2271                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_08_L,(MS_U16)(pDBreg->u32H_PostScalingRatio>>16),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9188XXXX
2272                 //V post-scaling
2273                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_09_L,(MS_U16)(pDBreg->u32V_PostScalingRatio>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9189XXXX
2274                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_0A_L,(MS_U16)(pDBreg->u32V_PostScalingRatio>>16),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 918AXXXX
2275 
2276                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_10_L, (MS_U16)(pDBreg->u32OPMBase0>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // OPM base0  //0xFFFF0009 8910XXXX
2277                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_11_L,(MS_U16)(pDBreg->u32OPMBase0>>16),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // OPM base0   //0xFFFF0009 8911XXXX
2278                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_17_L,(MS_U16)(pDBreg->u16OPMFetch>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // OPM fetch   //0xFFFF0009 8917XXXX
2279                 //Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_15_L, (MS_U16)(pDBreg->u16VLen>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // V Len
2280                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_1D_L,(MS_U16)(pDBreg->u16LBOffset&0xFF),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //LBOffset    //0xFFFF0009 901DXXXX
2281                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_1D_L,(MS_U16)(pDBreg->u16LBOffset&0xFF),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); //LBOffset    //0xFFFF0009 901DXXXX
2282                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_15_L, (MS_U16)(pDBreg->u16VLen>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // V Len          //0xFFFF0009 9015XXXX
2283 
2284                 if (SUPPORT_3D_DS && (IS_OUTPUT_LINE_ALTERNATIVE()||IS_OUTPUT_TOP_BOTTOM()||IS_OUTPUT_SIDE_BY_SIDE_HALF()||IS_OUTPUT_TOP_BOTTOM_HW()||IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()||IS_OUTPUT_FRAME_PACKING()))
2285                 {
2286                     //H post-scaling
2287                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_27_L,(MS_U16)(pDBreg->u32H_PostScalingRatio>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9187XXXX
2288                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_28_L,(MS_U16)(pDBreg->u32H_PostScalingRatio>>16),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9188XXXX
2289                     //V post-scaling
2290                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_29_L,(MS_U16)(pDBreg->u32V_PostScalingRatio>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9189XXXX
2291                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_2A_L,(MS_U16)(pDBreg->u32V_PostScalingRatio>>16),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 918AXXXX
2292 
2293                     //Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_10_L, (MS_U16)(pDBreg->u32OPMBase0>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // OPM base0  //0xFFFF0009 8910XXXX
2294                     //Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_11_L,(MS_U16)(pDBreg->u32OPMBase0>>16),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // OPM base0   //0xFFFF0009 8911XXXX
2295                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_57_L,(MS_U16)(pDBreg->u16OPMFetch>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // OPM fetch   //0xFFFF0009 8917XXXX
2296                 }
2297             }
2298             else//RFBL or FBL case
2299             {
2300                 //H post-scaling
2301                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_07_L,(MS_U16)(pDBreg->u32H_PostScalingRatio>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9187XXXX
2302                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_08_L,(MS_U16)(pDBreg->u32H_PostScalingRatio>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9188XXXX
2303                 //V post-scaling
2304                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_09_L,(MS_U16)(pDBreg->u32V_PostScalingRatio>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 9189XXXX
2305                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK23_0A_L,(MS_U16)(pDBreg->u32V_PostScalingRatio>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 918AXXXX
2306 
2307                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_10_L, (MS_U16)(pDBreg->u32OPMBase0>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT); // OPM base0  //0xFFFF0009 8910XXXX
2308                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_11_L,(MS_U16)(pDBreg->u32OPMBase0>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT); // OPM base0   //0xFFFF0009 8911XXXX
2309                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK12_17_L,(MS_U16)(pDBreg->u16OPMFetch>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT); // OPM fetch   //0xFFFF0009 8917XXXX
2310                 //Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_15_L, (MS_U16)(pDBreg->u16VLen>>00),DS_OP,DS_XC,&PSTXC_DS_CMDCNT); // V Len
2311                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_1D_L,(MS_U16)(pDBreg->u16LBOffset&0xFF),DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //LBOffset    //0xFFFF0009 901DXXXX
2312                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_1D_L,(MS_U16)(pDBreg->u16LBOffset&0xFF),DS_IP,DS_XC,&PSTXC_DS_CMDCNT); //LBOffset    //0xFFFF0009 901DXXXX
2313                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK20_15_L, (MS_U16)(pDBreg->u16VLen>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT); // V Len          //0xFFFF0009 9015XXXX
2314             }
2315 
2316             if(IS_SUPPORT_DS_SR(gSrcInfo[eWindow].u16InputVFreq))
2317             {
2318                 u16VSyncStart = (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal -
2319                                    (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelVSyncBackPorch + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelVSyncWidth));
2320                 u16VSyncEnd = (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal - (MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelVSyncBackPorch));
2321 
2322                 u16VsyncSize = u16VSyncEnd - u16VSyncStart;
2323 
2324                 if(MHal_FRC_IsFHDToFSC(pInstance,MAIN_WINDOW))
2325                 {
2326                     u16VSyncStart = u16VSyncStart/2;
2327                     u16VSyncEnd = u16VSyncStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelVSyncWidth;
2328 
2329                     u16VFDE_End = (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart/2 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 -1+VSTART_OFFSET);
2330                 }
2331                 else
2332                 {
2333                     // For RAPTORS case, adjust stgen vsync start/end
2334                     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_HDMITX_ENABLE)
2335                         &&(pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange == 0)
2336                         &&(pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange == 0)) //Check if PIXEL FEATURE is ENABLE or NOT.
2337                     {
2338                         u16VSyncStart += (FRC_PIPE_DELAY_VCNT_FSC_FHD - FRC_PIPE_DELAY_VCNT_FSC_4K);
2339                         u16VSyncEnd += (FRC_PIPE_DELAY_VCNT_FSC_FHD - FRC_PIPE_DELAY_VCNT_FSC_4K);
2340                     }
2341 
2342                     u16VFDE_End = (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height -1 + VSTART_OFFSET);
2343                 }
2344 
2345                 u16VSyncStart += VSYNCSTART_OFFSET;
2346                 u16VSyncEnd += VSYNCSTART_OFFSET;
2347 
2348                 if (((u16VSyncStart > u16VFDE_End) && ((u16VSyncStart - u16VFDE_End) < VSYNC_FRONT_PORCH))
2349                     ||(u16VSyncStart < u16VFDE_End)
2350                     )
2351                 {
2352                     u16VSyncStart = u16VFDE_End + VSYNC_FRONT_PORCH;
2353                     u16VSyncEnd = u16VSyncStart + u16VsyncSize;
2354                 }
2355             }
2356 
2357 
2358            //STGEN setting
2359             Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_23_L,(MS_U16)(0x0001),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2360 
2361             if (  (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)&&(psXCInstPri->u32DeviceID != 1)
2362 #if (SUPPORT_3D_DS == 1)
2363                 &&((!(IS_OUTPUT_LINE_ALTERNATIVE()||IS_OUTPUT_TOP_BOTTOM()||IS_OUTPUT_SIDE_BY_SIDE_HALF()||IS_OUTPUT_TOP_BOTTOM_HW()||IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()||IS_OUTPUT_FRAME_PACKING())))
2364 #endif
2365                 )
2366             {
2367                 if(MHal_FRC_IsFHDToFSC(pInstance,MAIN_WINDOW))
2368                 {
2369                     //H_MDE start and end
2370                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_05_L,(MS_U16)((pDBreg->u16H_DisStart/2 +1) & ~1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2371                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_06_L,(MS_U16)( ((pDBreg->u16H_DisStart/2 +1) & ~1) + gSrcInfo[eWindow].stDispWin.width/2 - 1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2372                     //V_MDE start and end
2373                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0D_L,(MS_U16)( (pDBreg->u16V_DisStart/2)+ VSTART_OFFSET),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2374                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0E_L,(MS_U16)((pDBreg->u16V_DisEnd/2) + VSTART_OFFSET),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2375                     //H_FDE start and end
2376                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_03_L,(MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart/2+1) & ~1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2377                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_04_L,(MS_U16)(((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart/2+1) & ~1) + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width/2 -1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2378                     //V_FDE start and end
2379                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0B_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart/2+VSTART_OFFSET),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2380                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0C_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart/2 + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height/2 -1+VSTART_OFFSET),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2381 
2382                     if(IS_SUPPORT_DS_SR(gSrcInfo[eWindow].u16InputVFreq))
2383                     {
2384                         //Vsync start and end
2385                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_09_L,(MS_U16)(u16VSyncStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2386                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0A_L,(MS_U16)(u16VSyncEnd),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2387                         //HTT and VTT
2388                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_07_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal/2),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2389                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0F_L,(MS_U16)(u16VSyncEnd + 8),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2390                         //CLK
2391                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1420,0x04, 0x120C, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2392                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK3F_60_L,0x0003,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2393                     }
2394                 }
2395                 else
2396                 {
2397                     //H_MDE start and end
2398                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_05_L,(MS_U16)(pDBreg->u16H_DisStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2399                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_06_L,(MS_U16)(pDBreg->u16H_DisEnd),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2400 
2401                     MS_U16 u16MdeVstart = pDBreg->u16V_DisStart;
2402                     MS_U16 u16MdeVend = pDBreg->u16V_DisEnd ;
2403                     u16MdeVstart += VSTART_OFFSET;
2404                     u16MdeVend += VSTART_OFFSET;
2405 
2406                     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_HDMITX_ENABLE)
2407                         &&(pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange == 0)
2408                         &&(pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange == 0)) //Check if PIXEL FEATURE is ENABLE or NOT.
2409                     {
2410                         u16MdeVstart += (FRC_PIPE_DELAY_VCNT_FSC_FHD - FRC_PIPE_DELAY_VCNT_FSC_4K);
2411                         u16MdeVend += (FRC_PIPE_DELAY_VCNT_FSC_FHD - FRC_PIPE_DELAY_VCNT_FSC_4K);
2412                     }
2413 
2414                     //V_MDE start and end
2415                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0D_L,(MS_U16)u16MdeVstart,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2416                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0E_L,(MS_U16)u16MdeVend,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2417                     //H_FDE start and end
2418                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_03_L,(MS_U16)((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart) & ~1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2419                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_04_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width -1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2420                     //V_FDE start and end
2421                     MS_U16 u16FdeVstart = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart;
2422                     MS_U16 u16FdeVend = pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height -1 ;
2423                     u16FdeVstart += VSTART_OFFSET;
2424                     u16FdeVend += VSTART_OFFSET;
2425 
2426                     // For RAPTOR case, adjust stgen Fde vstart /end
2427                     if((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_HDMITX_ENABLE)
2428                         &&(pXCResourcePrivate->stdrvXC_MVideo.gu16HPixelShiftRange == 0)
2429                         &&(pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange == 0)) //Check if PIXEL FEATURE is ENABLE or NOT.
2430                     {
2431                         u16FdeVstart += (FRC_PIPE_DELAY_VCNT_FSC_FHD - FRC_PIPE_DELAY_VCNT_FSC_4K);
2432                         u16FdeVend += (FRC_PIPE_DELAY_VCNT_FSC_FHD - FRC_PIPE_DELAY_VCNT_FSC_4K);
2433                     }
2434                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0B_L,(MS_U16)u16FdeVstart,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2435                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0C_L,(MS_U16)u16FdeVend,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2436 
2437                     if(IS_SUPPORT_DS_SR(gSrcInfo[eWindow].u16InputVFreq))
2438                     {
2439                         //Vsync start and end
2440                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_09_L,(MS_U16)(u16VSyncStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2441                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0A_L,(MS_U16)(u16VSyncEnd),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2442                         //HTT and VTT
2443                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_07_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2444                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_0F_L,(MS_U16)(u16VSyncEnd + 8),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2445                         //CLK
2446                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1420,0x04, 0x100C, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2447                         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK3F_60_L,0x0000,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2448                     }
2449                 }
2450             }
2451 
2452             if(IS_SUPPORT_DS_SR(gSrcInfo[eWindow].u16InputVFreq))
2453             {
2454                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_23_L,(MS_U16)(0x0003),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2455             }
2456             else
2457             {
2458                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK68_23_L,(MS_U16)(0x0000),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2459             }
2460 
2461 #if (SUPPORT_3D_DS == 1)
2462             if (!(IS_OUTPUT_LINE_ALTERNATIVE()||IS_OUTPUT_TOP_BOTTOM()||IS_OUTPUT_SIDE_BY_SIDE_HALF()||IS_OUTPUT_TOP_BOTTOM_HW()||IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()||IS_OUTPUT_FRAME_PACKING()))
2463 #endif
2464             {
2465                 //Disp info
2466                if (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled && (psXCInstPri->u32DeviceID != 1) &&
2467                    (MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)))
2468                 {
2469                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_08_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //0xFFFF0009 8808XXXX
2470                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_09_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HStart +pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width-1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);    //0xFFFF0009 8809XXXX
2471                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_0A_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //0xFFFF0009 880AXXXX
2472                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_0B_L,(MS_U16)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VStart + pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height-1),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);    //0xFFFF0009 880BXXXX
2473                 }
2474                 else
2475                 {
2476                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_08_L,(MS_U16)(pDBreg->u16H_DisStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //0xFFFF0009 8808XXXX
2477                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_09_L,(MS_U16)(pDBreg->u16H_DisEnd),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);    //0xFFFF0009 8809XXXX
2478                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_0A_L,(MS_U16)(pDBreg->u16V_DisStart),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);  //0xFFFF0009 880AXXXX
2479                     Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK10_0B_L,(MS_U16)(pDBreg->u16V_DisEnd),DS_OP,DS_XC,&PSTXC_DS_CMDCNT);    //0xFFFF0009 880BXXXX
2480                 }
2481             }
2482 
2483             if(IS_SUPPORT_DS_SR(gSrcInfo[eWindow].u16InputVFreq))
2484             {
2485                 //FSC setting
2486                 if(MHal_FRC_IsFHDToFSC(pInstance,MAIN_WINDOW))
2487                 {
2488                     //H scaling ratio
2489                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x10, 0x0308, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2490                     //V scaling ratio
2491                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x14, 0x0308, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2492                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x3A, 0x1080, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2493                     //Initial fac
2494                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x04, 0x000C, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2495                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x08, 0x000C, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2496                     //V_12L
2497                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x26, 0x1000, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2498                     //scaling filter
2499                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x16, 0x4444, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2500                     //input V size
2501                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x0A, 0x0438, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2502                     //input H size/2
2503                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x34, 0x03C0, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2504 
2505                     if(MHal_FRC_IsSupportFRC_byEfuse(pInstance))
2506                     {
2507                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1457,0x02, 0x0100, 0x0100,DS_OP,&PSTXC_DS_CMDCNT);
2508                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x144C,0xA0, 0x0001, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2509                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1472,0x40, 0x0001, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2510                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1471,0x60, 0x0100, 0x0100,DS_OP,&PSTXC_DS_CMDCNT);
2511                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1470,0x50, 0x0010, 0x0010,DS_OP,&PSTXC_DS_CMDCNT);
2512                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1426,0x20, 0x0001, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2513                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1472,0x80, 0x0001, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2514                     }
2515                 }
2516                 else
2517                 {
2518                     //H scaling ratio
2519                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x10, 0x0110, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2520                     //V scaling ratio
2521                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x14, 0x0110, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2522                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x3A, 0x1080, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2523                     //Initial fac
2524                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x04, 0x0000, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2525                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x08, 0x0000, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2526                     //V_12L
2527                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x26, 0x0000, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2528                     //scaling filter
2529                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x16, 0x0000, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2530 
2531                     if (IS_OUTPUT_4K2K(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height))
2532                     {
2533                         //input V size
2534                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x0A, 0x0870, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2535                         //input H size/2
2536                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x34, 0x0780, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2537                     }
2538                     else
2539                     {
2540                         //input V size
2541                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x0A, 0x0438, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2542                         //input H size/2
2543                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1423,0x34, 0x03C0, 0xFFFF,DS_OP,&PSTXC_DS_CMDCNT);
2544                     }
2545 
2546                     if(MHal_FRC_IsSupportFRC_byEfuse(pInstance))
2547                     {
2548                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1457,0x02, 0x0000, 0x0100,DS_OP,&PSTXC_DS_CMDCNT);
2549                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x144C,0xA0, 0x0000, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2550                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1472,0x40, 0x0000, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2551                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1471,0x60, 0x0000, 0x0100,DS_OP,&PSTXC_DS_CMDCNT);
2552                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1470,0x50, 0x0000, 0x0010,DS_OP,&PSTXC_DS_CMDCNT);
2553                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1426,0x20, 0x0000, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2554                         Hal_SC_WriteSWDSCommand_NonXC(pInstance,MAIN_WINDOW,0x1472,0x80, 0x0000, 0x0001,DS_OP,&PSTXC_DS_CMDCNT);
2555                     }
2556                 }
2557             }
2558 #ifdef UFO_XC_SUPPORT_DUAL_MIU
2559 #ifdef XC_DUAL_MIU_SUPPORT_DS
2560             if (IsEnableDualMode(eWindow))
2561             {
2562                 // SCMI dual miu OPM baseAddress
2563                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_10_L, (MS_U16)(pDBreg->u32DualOPMBase0>>00), DS_OP, DS_XC, &PSTXC_DS_CMDCNT);
2564                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_11_L, (MS_U16)(pDBreg->u32DualOPMBase0>>16), DS_OP, DS_XC, &PSTXC_DS_CMDCNT);
2565 
2566                 // SCMI dual miu OPM offset
2567                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_16_L, (MS_U16)(pDBreg->u16DualOPMOffset), DS_OP, DS_XC, &PSTXC_DS_CMDCNT);
2568                 // SCMI dual miu fetch number
2569                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK52_17_L, (MS_U16)(pDBreg->u16DualOPMFetch), DS_OP, DS_XC, &PSTXC_DS_CMDCNT);
2570 
2571                 // SCMI dual miu OPM fetch total and dual miu enable.
2572                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, (MS_U16)(BIT(15) | (pDBreg->u16DualOPMFetch + pDBreg->u16OPMFetch)), DS_OP,DS_XC, &PSTXC_DS_CMDCNT);
2573 
2574             }
2575             else
2576             {
2577                 Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK11_29_L, 0, DS_OP, DS_XC, &PSTXC_DS_CMDCNT);
2578             }
2579 #endif
2580 #endif
2581 
2582             //---------------------------------------------------------------------OP Command End---------------------------------------------------------------------------------------//
2583 
2584             if (SUPPORT_3D_DS&&(IS_OUTPUT_LINE_ALTERNATIVE()||IS_OUTPUT_TOP_BOTTOM()||IS_OUTPUT_SIDE_BY_SIDE_HALF()||IS_OUTPUT_TOP_BOTTOM_HW()||IS_OUTPUT_SIDE_BY_SIDE_HALF_HW()||IS_OUTPUT_FRAME_PACKING()))
2585             {
2586                 //H pre-scaling
2587                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK04_04_L,(MS_U16)(pDBreg->u32H_PreScalingRatio>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8104XXXX
2588                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK04_05_L,(MS_U16)(pDBreg->u32H_PreScalingRatio>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8105XXXX
2589                 //V pre-scaling
2590                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK04_08_L,(MS_U16)(pDBreg->u32V_PreScalingRatio>>00),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8108XXXX
2591                 Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK04_09_L,(MS_U16)(pDBreg->u32V_PreScalingRatio>>16),DS_IP,DS_XC,&PSTXC_DS_CMDCNT);//0xFFFF0009 8109XXXX
2592             }
2593 #if ((defined (ANDROID) || defined(MSOS_TYPE_LINUX_KERNEL)) && defined(UFO_XC_DS_PQ))
2594             if(DS_REG_CNT > DS_PQ_MAX_NUM)
2595             {
2596                 MS_ASSERT(0);
2597             }
2598             if(eWindow != MAIN_WINDOW)
2599             {
2600                 MS_ASSERT(0);
2601             }
2602             for(cnt_x = 0 ;cnt_x < DS_REG_CNT; cnt_x++)
2603             {
2604                 // Use HW bitmask function
2605                 //printf("\033[1;31m[%s:%d][0x%x] Value:%x  u16Mask:%x  \033[m\n",__FUNCTION__,__LINE__,DS_REG[cnt_x].u16Addr,DS_REG[cnt_x].u16Value,DS_REG[cnt_x].u16Mask);
2606                 Hal_SC_WriteSWDSCommand_Mask(pInstance,eWindow,DS_REG[cnt_x].u16Addr,DS_REG[cnt_x].u16Value,DS_OP,DS_XC,&PSTXC_DS_CMDCNT,DS_REG[cnt_x].u16Mask);
2607 
2608                 #if 0
2609                 //printf("\033[1;32m[%s:%d]u16Addr=0x%x,u16Value=0x%x,u16Mask=0x%x\033[m\n",__FUNCTION__,__LINE__,
2610                 //DS_REG[cnt_x].u16Addr | 0x130000,
2611                 //DS_REG[cnt_x].u16Value,
2612                 //DS_REG[cnt_x].u16Mask);
2613                 u16TempRegVal = SC_R2BYTE(psXCInstPri->u32DeviceID, DS_REG[cnt_x].u16Addr);
2614                 u16TempRegVal = (u16TempRegVal & ~DS_REG[cnt_x].u16Mask) | DS_REG[cnt_x].u16Value;
2615                 //printf("\033[1;31m[%s:%d][0x%x]Org=0x%x,Mod=0x%x\033[m\n",__FUNCTION__,__LINE__,DS_REG[cnt_x].u16Addr,SC_R2BYTE(psXCInstPri->u32DeviceID, DS_REG[cnt_x].u16Addr),u16TempRegVal);
2616                 Hal_SC_WriteSWDSCommand(pInstance,eWindow,DS_REG[cnt_x].u16Addr,u16TempRegVal,DS_OP,DS_XC,&PSTXC_DS_CMDCNT);
2617                 #endif
2618             }
2619             DS_REG_CNT = 0;
2620             if(bUFSC_DSEn==TRUE)
2621             {
2622                 for(cnt_x = 0 ;cnt_x < DS_UFSC_REG_CNT; cnt_x++)
2623                 {
2624                     //printf("\033[1;32m[%s:%d]u16Addr=0x%x,u16Value=0x%x,u16Mask=0x%x\033[m\n",__FUNCTION__,__LINE__,
2625                     //DS_REG[cnt_x].u16Addr | 0x130000,
2626                     //DS_REG[cnt_x].u16Value,
2627                     //DS_REG[cnt_x].u16Mask);
2628                     //u16TempRegVal = SC_R2BYTE(psXCInstPri->u32DeviceID, DS_REG[cnt_x].u16Addr);
2629                     //u16TempRegVal = (u16TempRegVal & ~DS_REG[cnt_x].u16Mask) | DS_REG[cnt_x].u16Value;
2630                     //printf("\033[1;31m[%s:%d][0x%x]Org=0x%x,Mod=0x%x\033[m\n",__FUNCTION__,__LINE__,DS_REG[cnt_x].u16Addr,SC_R2BYTE(psXCInstPri->u32DeviceID, DS_REG[cnt_x].u16Addr),u16TempRegVal);
2631                     Hal_SC_WriteSWDSCommand_NonXC(pInstance,eWindow,DS_UFSC_REG[cnt_x].u16Bank,DS_UFSC_REG[cnt_x].u16Addr,DS_UFSC_REG[cnt_x].u16Value,DS_UFSC_REG[cnt_x].u16Mask,DS_OP,&PSTXC_DS_CMDCNT);
2632                 }
2633                 DS_UFSC_REG_CNT = 0;
2634             }
2635 #endif
2636 
2637 #if (SUPPORT_KERNEL_DS == 1)
2638             Hal_SC_Add_NullCommand(pInstance, MAIN_WINDOW, DS_IP, &PSTXC_DS_CMDCNT);
2639             if(!((gSrcInfo[MAIN_WINDOW].bR_FBL) || (gSrcInfo[MAIN_WINDOW].bFBL)))
2640             {
2641                 Hal_SC_Add_NullCommand(pInstance, MAIN_WINDOW, DS_OP, &PSTXC_DS_CMDCNT);
2642             }
2643 #else
2644             MS_U8 u8MaxCmdCnt = pXCResourcePrivate->sthal_SC.u8DynamicScalingIndexDepth * (Hal_XC_MLoad_Get_64Bits_MIU_Bus_Sel(pInstance)+1);
2645 
2646             //XC_PRINTF("[%s,%5d] u16CMDCNT_IPM:%d   u8MaxCnt:%d \n",__func__,__LINE__,PSTXC_DS_CMDCNT.u16CMDCNT_IPM,u8MaxCmdCnt);
2647             //XC_PRINTF("[%s,%5d] u16CMDCNT_OPM:%d   u8MaxCnt:%d \n",__func__,__LINE__,PSTXC_DS_CMDCNT.u16CMDCNT_OPM,u8MaxCmdCnt);
2648             if(PSTXC_DS_CMDCNT.u16CMDCNT_IPM < u8MaxCmdCnt)
2649             {
2650                 Hal_SC_Add_NullCommand(pInstance,MAIN_WINDOW,DS_IP,&PSTXC_DS_CMDCNT);
2651             }
2652             if(!((gSrcInfo[MAIN_WINDOW].bR_FBL) || (gSrcInfo[MAIN_WINDOW].bFBL)))
2653             {
2654                 if(PSTXC_DS_CMDCNT.u16CMDCNT_OPM < u8MaxCmdCnt)
2655                 {
2656                     Hal_SC_Add_NullCommand(pInstance,MAIN_WINDOW,DS_OP,&PSTXC_DS_CMDCNT);
2657                 }
2658             }
2659 #endif
2660         }
2661     }
2662 }
2663 
Hal_SC_SWDS_Fire(void * pInstance,SCALER_WIN eWindow)2664 void Hal_SC_SWDS_Fire(void *pInstance, SCALER_WIN eWindow)
2665 {
2666     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2667     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2668     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
2669     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
2670 
2671     pXCResourcePrivate->sthal_SC.u8DynamicScalingCurrentIndex[eWindow]++;
2672     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] CurIdx:%d  \n",__func__,__LINE__,(int)pXCResourcePrivate->sthal_SC.u8DynamicScalingCurrentIndex[eWindow]);
2673 
2674     pXCResourcePrivate->sthal_SC.u8DynamicScalingCurrentIndex_Ring[eWindow] = pXCResourcePrivate->sthal_SC.u8DynamicScalingCurrentIndex[eWindow] % DS_BUFFER_NUM_EX;
2675     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] [DS] CurIdx_Ring:%d  \n",__func__,__LINE__,(int)pXCResourcePrivate->sthal_SC.u8DynamicScalingCurrentIndex_Ring[eWindow])
2676 }
2677 
Hal_SC_VIP_Peaking_Setting(void * pInstance,SCALER_WIN eWindow)2678 E_APIXC_ReturnValue Hal_SC_VIP_Peaking_Setting(void *pInstance, SCALER_WIN eWindow)
2679 {
2680     UNUSED(eWindow);
2681     return E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
2682 }
2683 
Hal_SC_support_source_to_ve(void * pInstance,MS_U16 * pOutputCapability)2684 E_APIXC_ReturnValue Hal_SC_support_source_to_ve(void *pInstance, MS_U16* pOutputCapability)
2685 {
2686     *pOutputCapability = E_XC_IP | E_XC_OP2 | E_XC_OVERLAP;
2687     return E_APIXC_RET_OK;
2688 }
2689 
Hal_SC_set_output_capture_enable(void * pInstance,MS_BOOL bEnable,E_XC_SOURCE_TO_VE eSourceToVE)2690 E_APIXC_ReturnValue Hal_SC_set_output_capture_enable(void *pInstance, MS_BOOL bEnable,E_XC_SOURCE_TO_VE eSourceToVE)
2691 {
2692     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2693     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2694     MS_BOOL bCaptureEna;
2695     MS_U16 u16CaptureSrc;
2696     // Current only support IP and OP2
2697     bCaptureEna = bEnable;
2698     switch(eSourceToVE)
2699     {
2700         case E_XC_VOP2:
2701         case E_XC_OVERLAP:  // compatible to previous IC, overlap is before osd blending
2702             u16CaptureSrc = 0;
2703             break;
2704         case E_XC_OP2:
2705             u16CaptureSrc = 1;
2706             break;
2707         case E_XC_BRI:
2708             u16CaptureSrc = 3;
2709             break;
2710         default:
2711             u16CaptureSrc = 0;
2712             bCaptureEna = FALSE;
2713             break;
2714     }
2715 
2716     if(bCaptureEna)
2717     {
2718         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, BIT(11), BIT(11));    // Disable
2719         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_46_L, u16CaptureSrc<<4, BMASK(7:4));            // Disable
2720     }
2721     else
2722     {
2723         //DIP and VE Opcapture both need enable this bit, so dont disable it.
2724         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, 0, BIT(11));   // Disable
2725     }
2726     return E_APIXC_RET_OK; // Support Scaler OP -> VE
2727 }
2728 
2729 /******************************************************************************/
2730 ///Set output DE window size
2731 ///@param pstWindow \b IN
2732 ///-  pointer to window information
2733 /******************************************************************************/
Hal_SC_set_de_window(void * pInstance,XC_PANEL_INFO * pPanel_Info)2734 void Hal_SC_set_de_window(void *pInstance, XC_PANEL_INFO *pPanel_Info)
2735 {
2736     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2737     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2738 #ifdef new_chakra
2739     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L, pPanel_Info->u16HStart);                                // DE H start
2740     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, pPanel_Info->u16HStart + pPanel_Info->u16Width - 1);    // DE H end
2741     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, pPanel_Info->u16VStart);                                // DE V start
2742     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pPanel_Info->u16VStart + pPanel_Info->u16Height - 1);   // DE V end
2743 #else
2744     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L, pPanel_Info->u16HStart);                                // DE H start
2745     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L, pPanel_Info->u16HStart + pPanel_Info->u16Width - 1);    // DE H end
2746     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, pSrcInfo->u8DE_V_Start);                                // DE V start
2747     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, pSrcInfo->u16DE_V_End);   // DE V end
2748 #endif
2749 }
2750 
Hal_SC_get_disp_de_window(void * pInstance,MS_WINDOW_TYPE * pWin)2751 void Hal_SC_get_disp_de_window(void *pInstance, MS_WINDOW_TYPE *pWin)
2752 {
2753     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2754     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2755     pWin->x = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L);
2756     pWin->y = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L);
2757     pWin->width = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_05_L) - pWin->x + 1;
2758     pWin->height= SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L) - pWin->y + 1;
2759 }
2760 
Hal_SC_Get_DNRBase0(void * pInstance,SCALER_WIN eWindow)2761 MS_PHY Hal_SC_Get_DNRBase0(void *pInstance, SCALER_WIN eWindow)
2762 {
2763     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2764     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2765     if(eWindow == MAIN_WINDOW)
2766     {
2767         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L);     // input address0
2768     }
2769     else
2770     {
2771         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_48_L);     // input address0
2772     }
2773 }
2774 
Hal_SC_Get_DNRBase1(void * pInstance,SCALER_WIN eWindow)2775 MS_PHY Hal_SC_Get_DNRBase1(void *pInstance, SCALER_WIN eWindow)
2776 {
2777     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2778     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2779     if(eWindow == MAIN_WINDOW)
2780     {
2781         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0A_L);     // input address1
2782     }
2783     else
2784     {
2785         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4A_L);     // input address1
2786     }
2787 }
2788 
Hal_SC_Get_OPMBase0(void * pInstance,SCALER_WIN eWindow)2789 MS_PHY Hal_SC_Get_OPMBase0(void *pInstance, SCALER_WIN eWindow)
2790 {
2791     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2792     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2793     if(eWindow == MAIN_WINDOW)
2794     {
2795         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_10_L);     // output address0
2796     }
2797     else
2798     {
2799         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L);     // output address0
2800     }
2801 }
2802 
Hal_SC_Get_OPMBase1(void * pInstance,SCALER_WIN eWindow)2803 MS_PHY Hal_SC_Get_OPMBase1(void *pInstance, SCALER_WIN eWindow)
2804 {
2805     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2806     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2807     if(eWindow == MAIN_WINDOW)
2808     {
2809         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_12_L);     // output address1
2810     }
2811     else
2812     {
2813         return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_52_L);     // output address1
2814     }
2815 }
2816 
Hal_SC_Get_FRCMBaseAddr(void * pInstance,MS_U8 u8id,SCALER_WIN eWindow)2817 MS_PHY Hal_SC_Get_FRCMBaseAddr(void *pInstance, MS_U8 u8id,SCALER_WIN eWindow)
2818 {
2819     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2820     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2821     if(eWindow == MAIN_WINDOW)
2822     {
2823         if(u8id == 0)
2824             return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_08_L);     // frcm_w base address0
2825         else if(u8id == 1)
2826             return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_1A_L);     // frcm_w base address1
2827         else //if(u8id == 2)
2828             return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_0C_L);     // frcm_w base address2
2829     }
2830     else
2831     {
2832         if(u8id == 0)
2833             return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_48_L);     // frcm_w base address0
2834         else if(u8id == 1)
2835             return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_4A_L);     // frcm_w base address1
2836         else //if(u8id == 2)
2837             return SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_4C_L);     // frcm_w base address2
2838     }
2839 }
2840 
Hal_SC_Get_LBOffset(void * pInstance,SCALER_WIN eWindow)2841 MS_U8 Hal_SC_Get_LBOffset(void *pInstance, SCALER_WIN eWindow)
2842 {
2843     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2844     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2845     if(eWindow == MAIN_WINDOW)
2846     {
2847         return SC_R2BYTEMSK(0, REG_SC_BK20_1D_L, 0x00FF);
2848     }
2849     else
2850     {
2851         return (SC_R2BYTEMSK(0, REG_SC_BK20_1D_L, 0xFF00) >> 8);
2852     }
2853 }
2854 
Hal_SC_Set_LBOffset(void * pInstance,MS_U8 u8LBOffset,SCALER_WIN eWindow)2855 void Hal_SC_Set_LBOffset(void *pInstance, MS_U8 u8LBOffset, SCALER_WIN eWindow)
2856 {
2857     if(eWindow == MAIN_WINDOW)
2858     {
2859         SC_W2BYTEMSK(0, REG_SC_BK20_1D_L, u8LBOffset, 0x00FF);
2860     }
2861     else
2862     {
2863         SC_W2BYTEMSK(0, REG_SC_BK20_1D_L, u8LBOffset << 8, 0xFF00);
2864     }
2865 }
2866 
Hal_SC_set_DNRBase0(void * pInstance,MS_PHY u32DNRBase0,SCALER_WIN eWindow)2867 void Hal_SC_set_DNRBase0(void *pInstance, MS_PHY u32DNRBase0, SCALER_WIN eWindow)
2868 {
2869     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2870     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2871     if(eWindow == MAIN_WINDOW)
2872     {
2873         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L, u32DNRBase0 / BYTE_PER_WORD);     // input address0
2874     }
2875     else
2876     {
2877         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_48_L, u32DNRBase0 / BYTE_PER_WORD);     // input address0
2878     }
2879 }
2880 
Hal_SC_set_DNRBase1(void * pInstance,MS_PHY u32DNRBase1,SCALER_WIN eWindow)2881 void Hal_SC_set_DNRBase1(void *pInstance, MS_PHY u32DNRBase1, SCALER_WIN eWindow)
2882 {
2883     UNUSED(u32DNRBase1);
2884     UNUSED(eWindow);
2885 }
2886 
Hal_SC_set_DNRBase2(void * pInstance,MS_PHY u32DNRBase2,SCALER_WIN eWindow)2887 void Hal_SC_set_DNRBase2(void *pInstance, MS_PHY u32DNRBase2, SCALER_WIN eWindow)
2888 {
2889     UNUSED(u32DNRBase2);
2890     UNUSED(eWindow);
2891 }
2892 
Hal_SC_set_OPMBase0(void * pInstance,MS_PHY u32OPMBase0,SCALER_WIN eWindow)2893 void Hal_SC_set_OPMBase0(void *pInstance, MS_PHY u32OPMBase0, SCALER_WIN eWindow)
2894 {
2895     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2896     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2897     if(eWindow == MAIN_WINDOW)
2898     {
2899         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_10_L, u32OPMBase0 / BYTE_PER_WORD);     // input address0
2900     }
2901     else
2902     {
2903         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_50_L, u32OPMBase0 / BYTE_PER_WORD);     // input address0
2904     }
2905 }
2906 
Hal_SC_set_OPMBase1(void * pInstance,MS_PHY u32OPMBase1,SCALER_WIN eWindow)2907 void Hal_SC_set_OPMBase1(void *pInstance, MS_PHY u32OPMBase1, SCALER_WIN eWindow)
2908 {
2909     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2910     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2911     if(eWindow == MAIN_WINDOW)
2912     {
2913         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_12_L, u32OPMBase1 / BYTE_PER_WORD);     // input address1
2914     }
2915     else
2916     {
2917         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_52_L, u32OPMBase1 / BYTE_PER_WORD);     // input address1
2918     }
2919 }
2920 
Hal_SC_set_OPMBase2(void * pInstance,MS_PHY u32OPMBase2,SCALER_WIN eWindow)2921 void Hal_SC_set_OPMBase2(void *pInstance, MS_PHY u32OPMBase2, SCALER_WIN eWindow)
2922 {
2923     UNUSED(u32OPMBase2);
2924     UNUSED(eWindow);
2925 }
2926 
Hal_SC_set_FRCM_WBase0(void * pInstance,MS_PHY u32FRCM_WBase0,SCALER_WIN eWindow)2927 void Hal_SC_set_FRCM_WBase0(void *pInstance, MS_PHY u32FRCM_WBase0, SCALER_WIN eWindow)
2928 {
2929     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2930     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2931     if(eWindow == MAIN_WINDOW)
2932     {
2933         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_08_L, u32FRCM_WBase0 / BYTE_PER_WORD);     // input address0
2934     }
2935     else
2936     {
2937         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_48_L, u32FRCM_WBase0 / BYTE_PER_WORD);     // input address0
2938     }
2939 }
2940 
Hal_SC_set_FRCM_WBase1(void * pInstance,MS_PHY u32FRCM_WBase1,SCALER_WIN eWindow)2941 void Hal_SC_set_FRCM_WBase1(void *pInstance, MS_PHY u32FRCM_WBase1, SCALER_WIN eWindow)
2942 {
2943     UNUSED(u32FRCM_WBase1);
2944     UNUSED(eWindow);
2945 }
2946 
Hal_SC_set_FRCM_WBase2(void * pInstance,MS_PHY u32FRCM_WBase2,SCALER_WIN eWindow)2947 void Hal_SC_set_FRCM_WBase2(void *pInstance, MS_PHY u32FRCM_WBase2, SCALER_WIN eWindow)
2948 {
2949     UNUSED(u32FRCM_WBase2);
2950     UNUSED(eWindow);
2951 }
2952 
Hal_SC_set_FRCM_RBase0(void * pInstance,MS_PHY u32FRCM_RBase0,SCALER_WIN eWindow)2953 void Hal_SC_set_FRCM_RBase0(void *pInstance, MS_PHY u32FRCM_RBase0, SCALER_WIN eWindow)
2954 {
2955     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2956     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2957     if(eWindow == MAIN_WINDOW)
2958     {
2959         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_10_L, u32FRCM_RBase0 / BYTE_PER_WORD);     // input address0
2960     }
2961     else
2962     {
2963         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_50_L, u32FRCM_RBase0 / BYTE_PER_WORD);     // input address0
2964     }
2965 }
2966 
Hal_SC_set_FRCM_RBase1(void * pInstance,MS_PHY u32FRCM_RBase1,SCALER_WIN eWindow)2967 void Hal_SC_set_FRCM_RBase1(void *pInstance, MS_PHY u32FRCM_RBase1, SCALER_WIN eWindow)
2968 {
2969     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2970     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2971     if(eWindow == MAIN_WINDOW)
2972     {
2973         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_12_L, u32FRCM_RBase1 / BYTE_PER_WORD);     // input address1
2974     }
2975     else
2976     {
2977         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_52_L, u32FRCM_RBase1 / BYTE_PER_WORD);     // input address1
2978     }
2979 }
2980 
Hal_SC_set_FRCM_RBase2(void * pInstance,MS_PHY u32FRCM_RBase2,SCALER_WIN eWindow)2981 void Hal_SC_set_FRCM_RBase2(void *pInstance, MS_PHY u32FRCM_RBase2, SCALER_WIN eWindow)
2982 {
2983     UNUSED(u32FRCM_RBase2);
2984     UNUSED(eWindow);
2985 }
2986 
Hal_SC_set_Dual_DNRBase0(void * pInstance,MS_PHY u32DNRBase0,SCALER_WIN eWindow)2987 void Hal_SC_set_Dual_DNRBase0(void *pInstance, MS_PHY u32DNRBase0, SCALER_WIN eWindow)
2988 {
2989     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
2990     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
2991     // Dual just support scaler0, main only
2992     if ((psXCInstPri->u32DeviceID > 0) || (eWindow != MAIN_WINDOW))
2993     {
2994         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
2995         return;
2996     }
2997     if(eWindow == MAIN_WINDOW)
2998     {
2999         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_08_L, u32DNRBase0 / BYTE_PER_WORD);     // input address0
3000     }
3001     else
3002     {
3003         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_48_L, u32DNRBase0 / BYTE_PER_WORD);     // input address0
3004     }
3005 }
3006 
Hal_SC_set_Dual_DNRBase1(void * pInstance,MS_PHY u32DNRBase1,SCALER_WIN eWindow)3007 void Hal_SC_set_Dual_DNRBase1(void *pInstance, MS_PHY u32DNRBase1, SCALER_WIN eWindow)
3008 {
3009     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3010     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3011     // Dual just support scaler0, main only
3012     if ((psXCInstPri->u32DeviceID > 0) || (eWindow != MAIN_WINDOW))
3013     {
3014         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
3015         return;
3016     }
3017     if(eWindow == MAIN_WINDOW)
3018     {
3019         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_1A_L, u32DNRBase1 / BYTE_PER_WORD);     // input address0
3020     }
3021     else
3022     {
3023         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_5A_L, u32DNRBase1 / BYTE_PER_WORD);     // input address0
3024     }
3025 
3026 }
3027 
Hal_SC_set_Dual_DNRBase2(void * pInstance,MS_PHY u32DNRBase2,SCALER_WIN eWindow)3028 void Hal_SC_set_Dual_DNRBase2(void *pInstance, MS_PHY u32DNRBase2, SCALER_WIN eWindow)
3029 {
3030     UNUSED(u32DNRBase2);
3031     UNUSED(eWindow);
3032 }
3033 
Hal_SC_set_Dual_OPMBase0(void * pInstance,MS_PHY u32OPMBase0,SCALER_WIN eWindow)3034 void Hal_SC_set_Dual_OPMBase0(void *pInstance, MS_PHY u32OPMBase0, SCALER_WIN eWindow)
3035 {
3036     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3037     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3038     // Dual just support scaler0, main only
3039     if ((psXCInstPri->u32DeviceID > 0) || (eWindow != MAIN_WINDOW))
3040     {
3041         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
3042         return;
3043     }
3044     if(eWindow == MAIN_WINDOW)
3045     {
3046         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_10_L, u32OPMBase0 / BYTE_PER_WORD);     // input address0
3047     }
3048     else
3049     {
3050         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_50_L, u32OPMBase0 / BYTE_PER_WORD);     // input address0
3051     }
3052 }
3053 
Hal_SC_set_Dual_OPMBase1(void * pInstance,MS_PHY u32OPMBase1,SCALER_WIN eWindow)3054 void Hal_SC_set_Dual_OPMBase1(void *pInstance, MS_PHY u32OPMBase1, SCALER_WIN eWindow)
3055 {
3056     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3057     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3058     // Dual just support scaler0, main only
3059     if ((psXCInstPri->u32DeviceID > 0) || (eWindow != MAIN_WINDOW))
3060     {
3061         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
3062         return;
3063     }
3064     if(eWindow == MAIN_WINDOW)
3065     {
3066         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_12_L, u32OPMBase1 / BYTE_PER_WORD);     // input address1
3067     }
3068     else
3069     {
3070         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_52_L, u32OPMBase1 / BYTE_PER_WORD);     // input address1
3071     }
3072 }
3073 
Hal_SC_set_Dual_OPMBase2(void * pInstance,MS_PHY u32OPMBase2,SCALER_WIN eWindow)3074 void Hal_SC_set_Dual_OPMBase2(void *pInstance, MS_PHY u32OPMBase2, SCALER_WIN eWindow)
3075 {
3076     UNUSED(u32OPMBase2);
3077     UNUSED(eWindow);
3078 }
3079 
Hal_SC_set_WriteVLength(void * pInstance,SCALER_WIN eWindow)3080 void Hal_SC_set_WriteVLength(void *pInstance, SCALER_WIN eWindow)
3081 {
3082     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3083     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3084     if(eWindow == MAIN_WINDOW)
3085     {
3086         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L, 0x0);     // Write V length
3087     }
3088     else
3089     {
3090         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_16_L, 0x0);     // Write V length
3091     }
3092 }
3093 
Hal_SC_set_memoryaddress(void * pInstance,MS_PHY u32DNRBase0,MS_PHY u32DNRBase1,MS_PHY u32DNRBase2,MS_PHY u32OPMBase0,MS_PHY u32OPMBase1,MS_PHY u32OPMBase2,SCALER_WIN eWindow)3094 void Hal_SC_set_memoryaddress(void *pInstance, MS_PHY u32DNRBase0, MS_PHY u32DNRBase1, MS_PHY u32DNRBase2, MS_PHY u32OPMBase0, MS_PHY u32OPMBase1, MS_PHY u32OPMBase2, SCALER_WIN eWindow)
3095 {
3096     Hal_SC_set_DNRBase0(pInstance, u32DNRBase0, eWindow);
3097     Hal_SC_set_DNRBase1(pInstance, u32DNRBase1, eWindow);
3098     Hal_SC_set_DNRBase2(pInstance, u32DNRBase2, eWindow);
3099     Hal_SC_set_OPMBase0(pInstance, u32OPMBase0, eWindow);
3100     Hal_SC_set_OPMBase1(pInstance, u32OPMBase1, eWindow);
3101     Hal_SC_set_OPMBase2(pInstance, u32OPMBase2, eWindow);
3102 }
3103 
Hal_SC_set_frcm_memoryaddress(void * pInstance,MS_PHY u32FRCM_WBase0,MS_PHY u32FRCM_WBase1,MS_PHY u32FRCM_WBase2,MS_PHY u32FRCM_RBase0,MS_PHY u32FRCM_RBase1,MS_PHY u32FRCM_RBase2,SCALER_WIN eWindow)3104 void Hal_SC_set_frcm_memoryaddress(void *pInstance, MS_PHY u32FRCM_WBase0, MS_PHY u32FRCM_WBase1, MS_PHY u32FRCM_WBase2, MS_PHY u32FRCM_RBase0, MS_PHY u32FRCM_RBase1, MS_PHY u32FRCM_RBase2, SCALER_WIN eWindow)
3105 {
3106     Hal_SC_set_FRCM_WBase0(pInstance, u32FRCM_WBase0, eWindow);
3107     Hal_SC_set_FRCM_WBase1(pInstance, u32FRCM_WBase1, eWindow);
3108     Hal_SC_set_FRCM_WBase2(pInstance, u32FRCM_WBase2, eWindow);
3109     Hal_SC_set_FRCM_RBase0(pInstance, u32FRCM_RBase0, eWindow);
3110     Hal_SC_set_FRCM_RBase1(pInstance, u32FRCM_RBase1, eWindow);
3111     Hal_SC_set_FRCM_RBase2(pInstance, u32FRCM_RBase2, eWindow);
3112 }
3113 
Hal_SC_set_dual_memoryaddress(void * pInstance,MS_PHY u32DNRBase0,MS_PHY u32DNRBase1,MS_PHY u32DNRBase2,MS_PHY u32OPMBase0,MS_PHY u32OPMBase1,MS_PHY u32OPMBase2,SCALER_WIN eWindow)3114 void Hal_SC_set_dual_memoryaddress(void *pInstance, MS_PHY u32DNRBase0, MS_PHY u32DNRBase1, MS_PHY u32DNRBase2, MS_PHY u32OPMBase0, MS_PHY u32OPMBase1, MS_PHY u32OPMBase2, SCALER_WIN eWindow)
3115 {
3116     Hal_SC_set_Dual_DNRBase0(pInstance, u32DNRBase0, eWindow);
3117     Hal_SC_set_Dual_DNRBase1(pInstance, u32DNRBase1, eWindow);
3118     Hal_SC_set_Dual_DNRBase2(pInstance, u32DNRBase2, eWindow);
3119     Hal_SC_set_Dual_OPMBase0(pInstance, u32OPMBase0, eWindow);
3120     Hal_SC_set_Dual_OPMBase1(pInstance, u32OPMBase1, eWindow);
3121     Hal_SC_set_Dual_OPMBase2(pInstance, u32OPMBase2, eWindow);
3122 }
3123 
Hal_SC_get_miu0mask(void)3124 static SC_MIUMASK_t Hal_SC_get_miu0mask(void)
3125 {
3126     SC_MIUMASK_t mask;
3127 
3128     mask.u16MiuG0Mask = MDrv_Read2Byte(MIU0_G0_REQUEST_MASK);
3129     mask.u16MiuG1Mask = MDrv_Read2Byte(MIU0_G1_REQUEST_MASK);
3130     mask.u16MiuG2Mask = MDrv_Read2Byte(MIU0_G2_REQUEST_MASK);
3131     mask.u16MiuG3Mask = MDrv_Read2Byte(MIU0_G3_REQUEST_MASK);
3132     mask.u16MiuG4Mask = MDrv_Read2Byte(MIU0_G4_REQUEST_MASK);
3133     mask.u16MiuG5Mask = MDrv_Read2Byte(MIU0_G5_REQUEST_MASK);
3134     mask.u16MiuG6Mask = MDrv_Read2Byte(MIU0_G6_REQUEST_MASK);
3135 
3136     return mask;
3137 }
3138 
Hal_SC_get_miu1mask(void)3139 static SC_MIUMASK_t Hal_SC_get_miu1mask(void)
3140 {
3141     SC_MIUMASK_t mask;
3142 
3143     mask.u16MiuG0Mask = MDrv_Read2Byte(MIU1_G0_REQUEST_MASK);
3144     mask.u16MiuG1Mask = MDrv_Read2Byte(MIU1_G1_REQUEST_MASK);
3145     mask.u16MiuG2Mask = MDrv_Read2Byte(MIU1_G2_REQUEST_MASK);
3146     mask.u16MiuG3Mask = MDrv_Read2Byte(MIU1_G3_REQUEST_MASK);
3147     mask.u16MiuG4Mask = MDrv_Read2Byte(MIU1_G4_REQUEST_MASK);
3148     mask.u16MiuG5Mask = MDrv_Read2Byte(MIU1_G5_REQUEST_MASK);
3149     mask.u16MiuG6Mask = MDrv_Read2Byte(MIU1_G6_REQUEST_MASK);
3150 
3151     return mask;
3152 }
3153 
Hal_SC_get_miu2mask(void)3154 static SC_MIUMASK_t Hal_SC_get_miu2mask(void)
3155 {
3156     SC_MIUMASK_t mask;
3157 
3158     mask.u16MiuG0Mask = MDrv_Read2Byte(MIU2_G0_REQUEST_MASK);
3159     mask.u16MiuG1Mask = MDrv_Read2Byte(MIU2_G1_REQUEST_MASK);
3160     mask.u16MiuG2Mask = MDrv_Read2Byte(MIU2_G2_REQUEST_MASK);
3161     mask.u16MiuG3Mask = MDrv_Read2Byte(MIU2_G3_REQUEST_MASK);
3162     mask.u16MiuG4Mask = MDrv_Read2Byte(MIU2_G4_REQUEST_MASK);
3163     mask.u16MiuG5Mask = MDrv_Read2Byte(MIU2_G5_REQUEST_MASK);
3164     mask.u16MiuG6Mask = MDrv_Read2Byte(MIU2_G6_REQUEST_MASK);
3165 
3166     return mask;
3167 }
3168 
Hal_SC_set_miu0mask(SC_MIUMASK_t mask)3169 static void Hal_SC_set_miu0mask(SC_MIUMASK_t mask)
3170 {
3171     MDrv_Write2Byte(MIU0_G0_REQUEST_MASK, mask.u16MiuG0Mask);
3172     MDrv_Write2Byte(MIU0_G1_REQUEST_MASK, mask.u16MiuG1Mask);
3173     MDrv_Write2Byte(MIU0_G2_REQUEST_MASK, mask.u16MiuG2Mask);
3174     MDrv_Write2Byte(MIU0_G3_REQUEST_MASK, mask.u16MiuG3Mask);
3175     MDrv_Write2Byte(MIU0_G4_REQUEST_MASK, mask.u16MiuG4Mask);
3176     MDrv_Write2Byte(MIU0_G5_REQUEST_MASK, mask.u16MiuG5Mask);
3177     MDrv_Write2Byte(MIU0_G6_REQUEST_MASK, mask.u16MiuG6Mask);
3178 
3179 }
3180 
Hal_SC_set_miu1mask(SC_MIUMASK_t mask)3181 static void Hal_SC_set_miu1mask(SC_MIUMASK_t mask)
3182 {
3183     MDrv_Write2Byte(MIU1_G0_REQUEST_MASK, mask.u16MiuG0Mask);
3184     MDrv_Write2Byte(MIU1_G1_REQUEST_MASK, mask.u16MiuG1Mask);
3185     MDrv_Write2Byte(MIU1_G2_REQUEST_MASK, mask.u16MiuG2Mask);
3186     MDrv_Write2Byte(MIU1_G3_REQUEST_MASK, mask.u16MiuG3Mask);
3187     MDrv_Write2Byte(MIU1_G4_REQUEST_MASK, mask.u16MiuG4Mask);
3188     MDrv_Write2Byte(MIU1_G5_REQUEST_MASK, mask.u16MiuG5Mask);
3189     MDrv_Write2Byte(MIU1_G5_REQUEST_MASK, mask.u16MiuG6Mask);
3190 }
3191 
Hal_SC_set_miu2mask(SC_MIUMASK_t mask)3192 static void Hal_SC_set_miu2mask(SC_MIUMASK_t mask)
3193 {
3194     MDrv_Write2Byte(MIU2_G0_REQUEST_MASK, mask.u16MiuG0Mask);
3195     MDrv_Write2Byte(MIU2_G1_REQUEST_MASK, mask.u16MiuG1Mask);
3196     MDrv_Write2Byte(MIU2_G2_REQUEST_MASK, mask.u16MiuG2Mask);
3197     MDrv_Write2Byte(MIU2_G3_REQUEST_MASK, mask.u16MiuG3Mask);
3198     MDrv_Write2Byte(MIU2_G4_REQUEST_MASK, mask.u16MiuG4Mask);
3199     MDrv_Write2Byte(MIU2_G5_REQUEST_MASK, mask.u16MiuG5Mask);
3200     MDrv_Write2Byte(MIU2_G6_REQUEST_MASK, mask.u16MiuG6Mask);
3201 }
3202 
Hal_SC_Enable_MiuMask(void * pInstance)3203 void Hal_SC_Enable_MiuMask(void *pInstance)
3204 {
3205     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3206     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3207     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3208     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3209     pXCResourcePrivate->sthal_SC.Miu0MaskOld = Hal_SC_get_miu0mask();
3210     pXCResourcePrivate->sthal_SC.Miu1MaskOld = Hal_SC_get_miu1mask();
3211     pXCResourcePrivate->sthal_SC.Miu2MaskOld = Hal_SC_get_miu2mask();
3212 
3213     pXCResourcePrivate->sthal_SC.Miu0Mask = pXCResourcePrivate->sthal_SC.Miu0MaskOld;
3214     pXCResourcePrivate->sthal_SC.Miu1Mask = pXCResourcePrivate->sthal_SC.Miu1MaskOld;
3215     pXCResourcePrivate->sthal_SC.Miu2Mask = pXCResourcePrivate->sthal_SC.Miu2MaskOld;
3216 
3217     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG0Mask |= MIU_SC_G0REQUEST_MASK;
3218     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG1Mask |= MIU_SC_G1REQUEST_MASK;
3219     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG2Mask |= MIU_SC_G2REQUEST_MASK;
3220     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG3Mask |= MIU_SC_G3REQUEST_MASK;
3221     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG4Mask |= MIU_SC_G4REQUEST_MASK;
3222     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG5Mask |= MIU_SC_G5REQUEST_MASK;
3223     pXCResourcePrivate->sthal_SC.Miu0Mask.u16MiuG6Mask |= MIU_SC_G6REQUEST_MASK;
3224 
3225 
3226     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG0Mask |= MIU_SC_G0REQUEST_MASK;
3227     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG1Mask |= MIU_SC_G1REQUEST_MASK;
3228     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG2Mask |= MIU_SC_G2REQUEST_MASK;
3229     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG3Mask |= MIU_SC_G3REQUEST_MASK;
3230     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG4Mask |= MIU_SC_G4REQUEST_MASK;
3231     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG5Mask |= MIU_SC_G5REQUEST_MASK;
3232     pXCResourcePrivate->sthal_SC.Miu1Mask.u16MiuG6Mask |= MIU_SC_G6REQUEST_MASK;
3233 
3234     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG0Mask |= MIU_SC_G0REQUEST_MASK;
3235     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG1Mask |= MIU_SC_G1REQUEST_MASK;
3236     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG2Mask |= MIU_SC_G2REQUEST_MASK;
3237     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG3Mask |= MIU_SC_G3REQUEST_MASK;
3238     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG4Mask |= MIU_SC_G4REQUEST_MASK;
3239     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG5Mask |= MIU_SC_G5REQUEST_MASK;
3240     pXCResourcePrivate->sthal_SC.Miu2Mask.u16MiuG6Mask |= MIU_SC_G6REQUEST_MASK;
3241 
3242     Hal_SC_set_miu0mask(pXCResourcePrivate->sthal_SC.Miu0Mask);
3243     Hal_SC_set_miu1mask(pXCResourcePrivate->sthal_SC.Miu1Mask);
3244     Hal_SC_set_miu2mask(pXCResourcePrivate->sthal_SC.Miu2Mask);
3245 }
3246 
Hal_SC_Disable_MiuMask(void * pInstance)3247 void Hal_SC_Disable_MiuMask(void *pInstance)
3248 {
3249     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3250     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3251     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3252     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3253     Hal_SC_set_miu0mask(pXCResourcePrivate->sthal_SC.Miu0MaskOld);
3254     Hal_SC_set_miu1mask(pXCResourcePrivate->sthal_SC.Miu1MaskOld);
3255     Hal_SC_set_miu2mask(pXCResourcePrivate->sthal_SC.Miu2MaskOld);
3256 }
3257 
Hal_SC_set_miusel(void * pInstance,MS_U8 u8MIUSel)3258 void Hal_SC_set_miusel(void *pInstance, MS_U8 u8MIUSel)
3259 {
3260     // Scaler control MIU by itself
3261     // So MIU1 IP-select is set to 1. At this moment, MIU0 Miu select is not working.
3262     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3263     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3264 #if 0 // remove and decided by miu_setting.txt
3265     // MIU 1, GROUP0~5: 0x78~0x7D
3266     MDrv_WriteByteMask(REG_MIU1_BASE + 0xF2, 0x60, 0x60); // IP select, group1, for [5]DIPW, [6]LD
3267     MDrv_WriteByteMask(REG_MIU1_BASE + 0xF3, 0x80, 0x80); // IP select, group1, for [f]MC2D
3268     MDrv_WriteByteMask(REG_MIU1_BASE + 0xFA, 0xE0, 0xE0); // IP select, group5
3269     MDrv_WriteByteMask(REG_MIU1_BASE + 0xFB, 0xF7, 0xF7); // IP select, group5
3270 #endif
3271 
3272 #if (MIU_SEL_USE_XC_INTERNAL == TRUE) // MIU Select control by xc internal
3273     if (psXCInstPri->u32DeviceID == 0)
3274     {
3275         //IPM_R2 miu select need follow IPM miu select.
3276         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_11_L, BIT(0) | BIT(1) | BIT(15), BIT(0) | BIT(1) | BIT(15));
3277         //ML and DS need controled by BK1F
3278         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_11_L, BIT(9), BIT(9));
3279     }
3280     else
3281     {
3282         SC_W2BYTEMSK(0, REG_SC_BK7F_11_L, BIT(12) | BIT(14), BIT(12) | BIT(14));
3283     }
3284     if (u8MIUSel==0)
3285     {
3286         ///SCM
3287         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU0
3288         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU0
3289         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU0
3290         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU0
3291     }
3292     else if(u8MIUSel==1)
3293     {
3294         ///SCM
3295         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0010, 0x0010);     // reg_miu_select_f2 to MIU1
3296         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU1
3297         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_44_L, 0x4000, 0x4000);     // reg_miu_select_f1 to MIU1
3298         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU1
3299     }
3300     else if(u8MIUSel==2)
3301     {
3302         ///SCM
3303         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU1
3304         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_05_L, 0x0010, 0x0010);     // reg_miu_select_f2 to MIU1
3305         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU1
3306         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_44_L, 0x4000, 0x4000);     // reg_miu_select_f1 to MIU1
3307     }
3308 #else
3309     // When MIU select controlled by miu, miu IPM0 use: BK7F_18[0] BK7F_10[0] Selecet miu chip select
3310     // When MIU select controlled by miu, miu OPM0 use: BK7F_18[1] BK7F_10[1] Selecet miu chip select
3311     // 00'b: MIU0, 01'b: MIU1, 10'b: MIU2
3312     if (psXCInstPri->u32DeviceID == 0)
3313     {
3314         // miu request0  IPM/OPM LSB
3315         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L,  ((u8MIUSel & BIT(0)) << 15)|((u8MIUSel & BIT(0)) << 1)|(u8MIUSel & BIT(0)), BIT(15)|BIT(1)| BIT(0));
3316         // miu request0  IPM/OPM MSB
3317         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_18_L,  ((u8MIUSel & BIT(1)) << 14)|(u8MIUSel & BIT(1))|((u8MIUSel & BIT(1)) >> 1), BIT(15)|BIT(1)| BIT(0));
3318     }
3319     else if (psXCInstPri->u32DeviceID == 1)
3320     {
3321         // miu request0  IPM/OPM LSB
3322         SC_W2BYTEMSK(0, REG_SC_BK7F_10_L, ((u8MIUSel & BIT(0)) << 14)|((u8MIUSel & BIT(0)) << 12), BIT(14)| BIT(12));
3323         // miu request0  IPM/OPM MSB
3324         u8MIUSel =  (u8MIUSel & BIT(1)) >> 1;
3325         SC_W2BYTEMSK(0, REG_SC_BK7F_18_L, (u8MIUSel << 14) | (u8MIUSel << 12), BIT(14)| BIT(12));
3326     }
3327 #endif
3328 }
3329 
Hal_SC_get_miusel(void * pInstance,SC_MIUSEL_t * stMIUSel)3330 void Hal_SC_get_miusel(void *pInstance, SC_MIUSEL_t* stMIUSel)
3331 {
3332 #if (MIU_SEL_USE_XC_INTERNAL == TRUE) // MIU Select control by xc internal
3333     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3334     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3335 
3336     if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_05_L, BIT(4)))
3337     {
3338         stMIUSel-> u8MainFBSel = 1;
3339     }
3340     else
3341     {
3342         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_05_L, BIT(4)))
3343         {
3344             stMIUSel-> u8MainFBSel = 2;
3345         }
3346         else
3347         {
3348             stMIUSel-> u8MainFBSel = 0;
3349         }
3350     }
3351 
3352     if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_05_L, BIT(4)))
3353     {
3354         stMIUSel-> u8SubFBSel = 1;
3355     }
3356     else
3357     {
3358         if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK31_05_L, BIT(4)))
3359         {
3360             stMIUSel-> u8SubFBSel = 2;
3361         }
3362         else
3363         {
3364             stMIUSel-> u8SubFBSel = 0;
3365         }
3366     }
3367 #else
3368     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3369     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3370     MS_U16 u16MiuSel = 0;
3371     //return OPM MIU select
3372     if (psXCInstPri->u32DeviceID == 0)
3373     {
3374         u16MiuSel = SC_R2BYTEMSK(0, REG_SC_BK7F_10_L, BIT(1)) >> 1;
3375         u16MiuSel |= SC_R2BYTEMSK(0, REG_SC_BK7F_18_L, BIT(1));
3376 
3377         stMIUSel-> u8MainFBSel = (MS_U8)(u16MiuSel & 0xff);
3378     }
3379     else if (psXCInstPri->u32DeviceID == 1)
3380     {
3381         u16MiuSel = SC_R2BYTEMSK(0, REG_SC_BK7F_10_L, BIT(12)) >> 1;
3382         u16MiuSel |= SC_R2BYTEMSK(0, REG_SC_BK7F_18_L, BIT(12));
3383 
3384         stMIUSel-> u8MainFBSel = (MS_U8)(u16MiuSel & 0xff);
3385     }
3386 #endif
3387 }
3388 
Hal_SC_set_dual_miusel(void * pInstance,MS_U8 u8MIUSel)3389 void Hal_SC_set_dual_miusel(void *pInstance, MS_U8 u8MIUSel)
3390 {
3391     // Scaler control MIU by itself
3392     // So MIU1 IP-select is set to 1. At this moment, MIU0 Miu select is not working.
3393     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3394     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3395     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3396     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3397     // Dual just support scaler0, main only
3398     if (psXCInstPri->u32DeviceID > 0)
3399     {
3400         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
3401         return;
3402     }
3403 #if 0 // remove and decided by miu_setting.txt
3404     // MIU 1, GROUP0~5: 0x78~0x7D
3405     MDrv_WriteByteMask(REG_MIU1_BASE + 0xF2, 0x60, 0x60); // IP select, group1, for [5]DIPW, [6]LD
3406     MDrv_WriteByteMask(REG_MIU1_BASE + 0xF3, 0x80, 0x80); // IP select, group1, for [f]MC2D
3407     MDrv_WriteByteMask(REG_MIU1_BASE + 0xFA, 0xE0, 0xE0); // IP select, group5
3408     MDrv_WriteByteMask(REG_MIU1_BASE + 0xFB, 0xF7, 0xF7); // IP select, group5
3409 #endif
3410     // TODO: dual miu support auto switch miu select for manhattan/maserati.
3411 #if (MIU_SEL_USE_XC_INTERNAL == TRUE) // MIU select ctorled by xc internal
3412     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_11_L, BIT(0) | BIT(1), BIT(0) | BIT(1));
3413     if (u8MIUSel==0)
3414     {
3415         ///SCM
3416         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU0
3417         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU0
3418         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU0
3419         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU0
3420     }
3421     else if(u8MIUSel==1)
3422     {
3423         ///SCM
3424         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_05_L, 0x0010, 0x0010);     // reg_miu_select_f2 to MIU1
3425         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU1
3426         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_44_L, 0x4000, 0x4000);     // reg_miu_select_f1 to MIU1
3427         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU1
3428     }
3429     else if(u8MIUSel==2)
3430     {
3431         ///SCM
3432         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_05_L, 0x0000, 0x0010);     // reg_miu_select_f2 to MIU1
3433         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_05_L, 0x0010, 0x0010);     // reg_miu_select_f2 to MIU1
3434         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK52_44_L, 0x0000, 0x4000);     // reg_miu_select_f1 to MIU1
3435         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK51_44_L, 0x4000, 0x4000);     // reg_miu_select_f1 to MIU1
3436     }
3437 
3438     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L, 0x0, BIT(0) | BIT(1));
3439 #else
3440     // When MIU select controlled by miu, IPM1 use: BK7F_19[0..1] Selecet miu chip select
3441     // When MIU select controlled by miu, OPM1 use: BK7F_19[2..3] Selecet miu chip select
3442     // 00'b: MIU0, 01'b: MIU1, 10'b: MIU2
3443 
3444     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK7F_19_L, (u8MIUSel << 2) | u8MIUSel , BIT(3)| BIT(2) | BIT(1)| BIT(0));
3445 #endif
3446 }
3447 
Hal_SC_set_dual_disable(void * pInstance)3448 void Hal_SC_set_dual_disable(void *pInstance)
3449 {
3450     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3451     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3452     // Dual just support scaler0, main only
3453     if (psXCInstPri->u32DeviceID > 0)
3454     {
3455         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
3456         return;
3457     }
3458 
3459     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, 0, BIT(15)); // reg_miu_select_f1 to MIU1
3460 }
3461 
Hal_SC_get_dual_miusel(void * pInstance,SC_MIUSEL_t * stMIUSel)3462 void Hal_SC_get_dual_miusel(void *pInstance, SC_MIUSEL_t* stMIUSel)
3463 {
3464     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3465     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3466     // Dual just support scaler0, main only
3467     if (psXCInstPri->u32DeviceID > 0)
3468     {
3469         XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW,"[%s,%5d] scmi dual mode just support scaler0 main only.\n",__func__,__LINE__);
3470         return;
3471     }
3472 #if (MIU_SEL_USE_XC_INTERNAL == TRUE) // MIU Select control by xc internal
3473     if(SC_R2BYTEMSK(0, REG_SC_BK52_05_L, BIT(4)))
3474     {
3475         stMIUSel->u8MainFBSel = 1;
3476     }
3477     else
3478     {
3479         if(SC_R2BYTEMSK(0, REG_SC_BK51_05_L, BIT(4)))
3480         {
3481             stMIUSel->u8MainFBSel = 2;
3482         }
3483         else
3484         {
3485             stMIUSel->u8MainFBSel = 0;
3486         }
3487     }
3488 
3489     if(SC_R2BYTEMSK(0, REG_SC_BK52_44_L, BIT(4)))
3490     {
3491         stMIUSel->u8SubFBSel = 1;
3492     }
3493     else
3494     {
3495         if(SC_R2BYTEMSK(0, REG_SC_BK51_44_L, BIT(4)))
3496         {
3497             stMIUSel->u8SubFBSel = 2;
3498         }
3499         else
3500         {
3501             stMIUSel->u8SubFBSel = 0;
3502         }
3503     }
3504 #else // MIU Select control by miu
3505     MS_U16 u16Tmp = SC_R2BYTEMSK(0, REG_SC_BK7F_19_L, BIT(0)|BIT(1));
3506     stMIUSel->u8MainFBSel = (MS_U8)(u16Tmp & 0xff);
3507 #endif
3508 }
3509 
Hal_SC_set_blsk(void * pInstance,MS_BOOL bEn)3510 void Hal_SC_set_blsk(void *pInstance, MS_BOOL bEn)
3511 {
3512     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3513     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3514     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_21_L, bEn ? BIT(12) : 0, BIT(12));
3515 }
3516 
Hal_SC_set_blsk_burst(void * pInstance,MS_BOOL bEn)3517 void Hal_SC_set_blsk_burst(void *pInstance, MS_BOOL bEn)
3518 {
3519     _MLOAD_ENTRY(pInstance);
3520     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_21_L, bEn ? BIT(12) : 0, BIT(12));
3521     MDrv_XC_MLoad_Fire(pInstance, TRUE);
3522     _MLOAD_RETURN(pInstance);
3523 }
3524 
Hal_SC_set_main_black_screen_burst(void * pInstance,MS_BOOL bEn)3525 void Hal_SC_set_main_black_screen_burst(void *pInstance, MS_BOOL bEn)
3526 {
3527      _MLOAD_ENTRY(pInstance);
3528 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3529     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3530     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3531     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3532     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3533 
3534     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
3535     if (IsVBY1_16LANE(u8LPLL_Type))
3536     {
3537         //For maints issue 1196708
3538         //If set main window next or previous the sub window will temp black in PIP Mode(120Hz)
3539         //Get PIP mode staus ON/OFF
3540         MS_U16 u16ReturnValue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_40_L, BIT(4));
3541         if(u16ReturnValue)
3542         {
3543             //To avoid sub window have temp black
3544             //For mantis issue 1219876
3545             //Disenable FRC mute when pip/pop is enable
3546             MS_U16 u16IsEnableFRCMute = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1));
3547             if(u16IsEnableFRCMute)
3548             {
3549                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(1) : 0, BIT(1));
3550                 MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3551                 MsOS_DelayTask(u16DelayTimeMs);
3552                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BKCB_17_L, 0, BIT(1));
3553             }
3554             else
3555             {
3556                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_19_L, bEn ? BIT(1) : 0, BIT(1));
3557             }
3558         }
3559         else
3560         {
3561             //PIP/3D mode & FRC_INSIDE mode
3562             //Step 1 : Set main window muting(REG_SC_BK10_19_L bit 4 set 1)
3563             //Step 2 : Change to non-pip mode and play video
3564             //Step 3 : Because REG_SC_BK10_19_L bit 4 set 1, main window will always muting
3565             //To solve the problem
3566 
3567             //Disable FRC muting step
3568             //Step 1 : W2BYTE REG_SC_BK10_19_L disable black
3569             //Step 2 : delay Time
3570             //Step 3 : MLload REG_SC_BKCB_17_L disable FRC muting
3571             if(!bEn &&
3572                 ((pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM_HW)
3573                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
3574                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW)
3575                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
3576                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_FRAME_PACKING)
3577                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)))///only 3D unmute
3578             {
3579                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? (BIT(5)|BIT(1)) : 0 ,(BIT(5)|BIT(1)));
3580             }
3581             else //PIP mode and chang 2D to 3D mode
3582             {
3583                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(1) : 0 ,BIT(1));
3584             }
3585 
3586             // Wait for OP send signal,
3587             // otherwise garbage will be showed,we need to add delay time.
3588             // only unmute need delay
3589             if(!bEn)
3590             {
3591                 MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3592                 MsOS_DelayTask(u16DelayTimeMs);
3593            }
3594             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BKCB_17_L, bEn ? BIT(1) : 0, BIT(1));
3595         }
3596     }
3597     else
3598 #endif
3599     {
3600         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_19_L, bEn ? BIT(1) : 0, BIT(1));
3601     }
3602     MDrv_XC_MLoad_Fire(pInstance, TRUE);
3603 
3604     _MLOAD_RETURN(pInstance);
3605 }
3606 
Hal_SC_set_main_sub_black_screen_burst(void * pInstance,MS_BOOL bEn)3607 void Hal_SC_set_main_sub_black_screen_burst(void *pInstance, MS_BOOL bEn)
3608 {
3609     _MLOAD_ENTRY(pInstance);
3610 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3611     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3612     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3613     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3614     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3615 
3616     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
3617     if (IsVBY1_16LANE(u8LPLL_Type))
3618     {
3619         //Disable FRC muting step
3620         //Step 1 : W2BYTE REG_SC_BK10_19_L disable black
3621         //Step 2 : delay Time
3622         //Step 3 : MLload REG_SC_BKCB_17_L disable FRC muting
3623         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? (BIT(5)|BIT(1)) : 0, (BIT(6)|BIT(5)|BIT(1)));
3624         if(!bEn)
3625         {
3626             MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3627             MsOS_DelayTask(u16DelayTimeMs);
3628         }
3629         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BKCB_17_L, bEn ? BIT(1) : 0, BIT(1));
3630     }
3631     else
3632 #endif
3633     {
3634         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_19_L, bEn ? (BIT(5)|BIT(1)) : 0, (BIT(6)|BIT(5)|BIT(1)));
3635     }
3636     MDrv_XC_MLoad_Fire(pInstance, TRUE);
3637 
3638     _MLOAD_RETURN(pInstance);
3639 }
3640 
Hal_SC_set_main_black_screen(void * pInstance,MS_BOOL bEn)3641 void Hal_SC_set_main_black_screen(void *pInstance, MS_BOOL bEn)
3642 {
3643     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3644     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3645 
3646 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3647     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3648     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3649 
3650     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
3651     if (IsVBY1_16LANE(u8LPLL_Type))
3652     {
3653         //For maints issue 1196708
3654         //If set main window next or previous the sub window will temp black in PIP Mode(120Hz)
3655         //Get PIP mode staus ON/OFF
3656         MS_U16 u16ReturnValue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_40_L, BIT(4));
3657         if(u16ReturnValue)
3658         {
3659             //To avoid sub window have temp black
3660             MS_U16 u16IsEnableFRCMute = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1));
3661             if(u16IsEnableFRCMute)
3662             {
3663                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(1) : 0, BIT(1));
3664                 MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3665                 MsOS_DelayTask(u16DelayTimeMs);
3666                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, 0, BIT(1));
3667             }
3668             else
3669             {
3670                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(1) : 0, BIT(1));
3671             }
3672         }
3673         else
3674         {
3675             //PIP/3D mode & FRC_INSIDE mode
3676             //Step 1 : Set main window muting(REG_SC_BK10_19_L bit 4 set 1)
3677             //Step 2 : Change to non-pip mode and play video
3678             //Step 3 : Because REG_SC_BK10_19_L bit 4 set 1, main window will always muting
3679             //To solve the problem
3680             //Disable XC main window avoid main window always muting
3681             if(!bEn &&
3682                 ((pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM_HW)
3683                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_TOP_BOTTOM)
3684                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF_HW)
3685                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_SIDE_BY_SIDE_HALF)
3686                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_FRAME_PACKING)
3687                 ||(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)))///only 3D unmute
3688             {
3689                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? (BIT(5)|BIT(1)) : 0 ,(BIT(5)|BIT(1)));
3690             }
3691             else //PIP mode and chang 2D to 3D mode
3692             {
3693                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(1) : 0 ,BIT(1));
3694             }
3695 
3696             // Wait for OP send signal,
3697             // otherwise garbage will be showed,we need to add delay time.
3698             // only unmute need delay
3699             if(!bEn)
3700             {
3701                 MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3702                 MsOS_DelayTask(u16DelayTimeMs);
3703            }
3704             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, bEn ? BIT(1) : 0, BIT(1));
3705         }
3706     }
3707     else
3708 #endif
3709     {
3710         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(1) : 0, BIT(1));
3711     }
3712 }
3713 
Hal_SC_set_main_sub_black_screen(void * pInstance,MS_BOOL bEn)3714 void Hal_SC_set_main_sub_black_screen(void *pInstance, MS_BOOL bEn)
3715 {
3716     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3717     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3718 
3719 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3720     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3721     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3722 
3723     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
3724     if (IsVBY1_16LANE(u8LPLL_Type))
3725     {
3726         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? (BIT(5)|BIT(1)) : 0, (BIT(6)|BIT(5)|BIT(1)));
3727         if(!bEn)
3728         {
3729             MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3730             MsOS_DelayTask(u16DelayTimeMs);
3731         }
3732         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, bEn ? BIT(1) : 0, BIT(1));
3733     }
3734     else
3735 #endif
3736     {
3737         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? (BIT(5)|BIT(1)) : 0, (BIT(6)|BIT(5)|BIT(1)));
3738     }
3739 }
3740 
Hal_SC_set_sub_blue_screen_burst(void * pInstance,MS_BOOL bEn,MS_BOOL bBlue)3741 void Hal_SC_set_sub_blue_screen_burst(void *pInstance, MS_BOOL bEn, MS_BOOL bBlue)
3742 {
3743     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3744     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3745     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3746     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3747     _MLOAD_ENTRY(pInstance);
3748 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3749     MS_U16 u16ReturnValue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1));
3750     if(u16ReturnValue)
3751     {
3752         //Disable FRC muting step
3753         //Step 1 : W2BYTE REG_SC_BK10_19_L disable black
3754         //Step 2 : delay Time
3755         //Step 3 : MLload REG_SC_BKCB_17_L disable FRC muting
3756         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bBlue ? BIT(6) : 0, BIT(6));
3757         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(5) : 0, BIT(5));
3758         MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3759         MsOS_DelayTask(u16DelayTimeMs);
3760         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BKCB_17_L, bEn ? BIT(1) : 0, BIT(1));
3761     }
3762     else
3763 #endif
3764     {
3765         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_19_L, bBlue ? BIT(6) : 0, BIT(6));
3766         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_19_L, bEn ? BIT(5) : 0, BIT(5));
3767     }
3768     MDrv_XC_MLoad_Fire(pInstance, TRUE);
3769     _MLOAD_RETURN(pInstance);
3770 }
3771 
Hal_SC_set_sub_blue_screen(void * pInstance,MS_BOOL bEn,MS_BOOL bBlue)3772 void Hal_SC_set_sub_blue_screen(void *pInstance, MS_BOOL bEn, MS_BOOL bBlue)
3773 {
3774     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3775     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3776     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3777     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3778     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3779 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3780     MS_U16 u16ReturnValue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1));
3781     if(u16ReturnValue)
3782     {
3783         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bBlue ? BIT(6) : 0, BIT(6));
3784         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(5) : 0, BIT(5));
3785         MS_U16 u16DelayTimeMs = MHal_XC_GetDelayTime(pInstance,E_DELAY_TIME_FRC);
3786         MsOS_DelayTask(u16DelayTimeMs);
3787         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, bEn ? BIT(1) : 0, BIT(1));
3788     }
3789     else
3790  #endif
3791     {
3792         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bBlue ? BIT(6) : 0, BIT(6));
3793         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, bEn ? BIT(5) : 0, BIT(5));
3794     }
3795 }
3796 
Hal_SC_IP_Memory_Write_Request(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)3797 E_APIXC_ReturnValue Hal_SC_IP_Memory_Write_Request(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
3798 {
3799     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3800     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3801     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3802     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3803 
3804     if(MAIN_WINDOW == eWindow)
3805     {
3806         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, bEnable? 0 : BIT(0) , BIT(0));
3807     }
3808     else
3809     {
3810         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, bEnable? 0 : BIT(0) , BIT(0));
3811     }
3812 
3813     return E_APIXC_RET_OK;
3814 }
3815 
Hal_SC_IP_Memory_Read_Request(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)3816 E_APIXC_ReturnValue Hal_SC_IP_Memory_Read_Request(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
3817 {
3818     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3819     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3820     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3821     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3822     if(MAIN_WINDOW == eWindow)
3823     {
3824         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L, bEnable? 0 : BIT(14) , BIT(14));
3825     }
3826     else
3827     {
3828         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_42_L, bEnable? 0 : BIT(14) , BIT(14));
3829     }
3830     return E_APIXC_RET_OK;
3831 }
3832 
Hal_SC_OP_Memory_Write_Request(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)3833 E_APIXC_ReturnValue Hal_SC_OP_Memory_Write_Request(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
3834 {
3835     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3836     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3837     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_67_L, bEnable? 0 : BIT(1) , BIT(1));//This will stop OPW and OP memory write request
3838     return E_APIXC_RET_OK;
3839 }
3840 
Hal_SC_frcmw_Memory_Write_Request(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)3841 E_APIXC_ReturnValue Hal_SC_frcmw_Memory_Write_Request(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
3842 {
3843     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3844     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3845     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3846     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3847     if(MAIN_WINDOW == eWindow)
3848     {
3849         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_07_L, bEnable? 0 : BIT(0) , BIT(0));
3850     }
3851     else
3852     {
3853         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_47_L, bEnable? 0 : BIT(0) , BIT(0));
3854     }
3855     return E_APIXC_RET_OK;
3856 }
3857 
Hal_SC_frcmr_Memory_Read_Request(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)3858 E_APIXC_ReturnValue Hal_SC_frcmr_Memory_Read_Request(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
3859 {
3860     return E_APIXC_RET_OK;
3861 }
3862 
Hal_SC_disable_inputsource_burst(void * pInstance,MS_BOOL bDisable,SCALER_WIN eWindow)3863 void Hal_SC_disable_inputsource_burst(void *pInstance, MS_BOOL bDisable, SCALER_WIN eWindow)
3864 {
3865     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3866     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3867     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3868     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3869 
3870     _MLOAD_ENTRY(pInstance);
3871 
3872     // HW PIP architeucture
3873     // Becasue BK3_02[8] and BK20_11[15] can not be enabled toghter,
3874     // otherwise garbage will be showed,we need to use BK12_47[0] to instead.
3875     if( eWindow == MAIN_WINDOW )
3876     {
3877         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK01_02_L, (bDisable ? BIT(7):0), BIT(7));
3878     }
3879     else
3880     {
3881         //MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_02_L, (bDisable ? BIT(7):0), BIT(7));
3882         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_47_L, (bDisable ? BIT(0) : 0), BIT(0));
3883 #if (HW_DESIGN_4K2K_VER == 4)
3884         if ((psXCInstPri->u32DeviceID==0)
3885             && !(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
3886         {
3887             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_47_L, (bDisable ? BIT(0) : 0), BIT(0));
3888         }
3889 #endif
3890     }
3891     MDrv_XC_MLoad_Fire(pInstance, TRUE);
3892     _MLOAD_RETURN(pInstance);
3893 }
3894 
Hal_SC_disable_inputsource(void * pInstance,MS_BOOL bDisable,SCALER_WIN eWindow)3895 void Hal_SC_disable_inputsource(void *pInstance, MS_BOOL bDisable, SCALER_WIN eWindow)
3896 {
3897     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3898     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3899     if( eWindow == MAIN_WINDOW )
3900     {
3901         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, (bDisable ? BIT(7):0), BIT(7));
3902     }
3903     else
3904     {
3905         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L, (bDisable ? BIT(7):0), BIT(7));
3906     }
3907 }
3908 
3909 
Hal_SC_Is_InputSource_Disable(void * pInstance,SCALER_WIN eWindow)3910 MS_U16 Hal_SC_Is_InputSource_Disable(void *pInstance, SCALER_WIN eWindow)
3911 {
3912     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3913     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3914     if(eWindow == MAIN_WINDOW)
3915         return (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L)&0x80);
3916     else
3917     {
3918         if((SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L)&0x01) == 0)
3919         {
3920             return (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L)&0x80);
3921         }
3922         else
3923         {
3924             return TRUE;
3925         }
3926     }
3927 }
3928 
3929 
Hal_SC_set_nosignal_color(void * pInstance,MS_U8 u8Color,SCALER_WIN eWindow)3930 void Hal_SC_set_nosignal_color(void *pInstance, MS_U8 u8Color,SCALER_WIN eWindow)
3931 {
3932     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
3933     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
3934 
3935 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3936     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
3937     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
3938 
3939     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
3940 #endif
3941     if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
3942     {
3943         //FIX ME:need follow HW_DESIGN_4K2K_VER = 6 rule
3944         _MLOAD_ENTRY(pInstance);
3945 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3946         if(psXCInstPri->u32DeviceID == 0)
3947 #else
3948         if ( eWindow == MAIN_WINDOW )
3949 #endif
3950         {
3951             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_24_L, u8Color, LBMASK);
3952 
3953             #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3954             if (IsVBY1_16LANE(u8LPLL_Type))
3955             {
3956                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BKCB_18_L, ((MS_U16)u8Color)<<8, HBMASK);
3957             }
3958             #endif
3959         }
3960         else
3961         {
3962 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3963             MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_17_L, ((MS_U16)u8Color)<<8, HBMASK);
3964 #else
3965             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_17_L, ((MS_U16)u8Color)<<8, HBMASK);
3966 #endif
3967         }
3968         MDrv_XC_MLoad_Fire(pInstance, TRUE);
3969         _MLOAD_RETURN(pInstance);
3970     }
3971     else
3972     {
3973 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3974         if(psXCInstPri->u32DeviceID == 0)
3975 #else
3976         if ( eWindow == MAIN_WINDOW )
3977 #endif
3978         {
3979 #ifdef new_chakra
3980             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_24_L, u8Color, LBMASK);
3981 #else
3982             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_24_L, u8Color, LBMASK);
3983 #endif
3984             #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
3985             if (IsVBY1_16LANE(u8LPLL_Type))
3986             {
3987                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_18_L, ((MS_U16)u8Color)<<8, HBMASK);
3988             }
3989             #endif
3990         }
3991         else
3992         {
3993 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
3994             SC_W2BYTEMSK(0, REG_SC_BK0F_17_L, ((MS_U16)u8Color)<<8, HBMASK);
3995 #else
3996             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_17_L, ((MS_U16)u8Color)<<8, HBMASK);
3997 #endif
3998         }
3999     }
4000 }
4001 
Hal_SC_set_fbl(void * pInstance,MS_BOOL bEn)4002 void Hal_SC_set_fbl(void *pInstance, MS_BOOL bEn)
4003 {
4004     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4005     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4006     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L, (bEn ? BIT(7): 0), BIT(7));  //Enable/Disable FBL
4007     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_02_L, (bEn ? BIT(14):0), BIT(14)); //F2 force IP read request disable
4008 
4009     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, (bEn ? 0x3:0), 0x3); //F2 IP read/write request disable
4010 }
4011 
Hal_SC_get_fbl(void * pInstance)4012 MS_BOOL Hal_SC_get_fbl(void *pInstance)
4013 {
4014     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4015     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4016     return SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L, BIT(7));  //Enable/Disable FBL
4017 }
4018 
Hal_SC_set_freezeimg_burst(void * pInstance,MS_BOOL bEn,SCALER_WIN eWindow)4019 void Hal_SC_set_freezeimg_burst(void *pInstance, MS_BOOL bEn, SCALER_WIN eWindow)
4020 {
4021     _MLOAD_ENTRY(pInstance);
4022 #if (HW_DESIGN_4K2K_VER == 4)
4023     if( eWindow == MAIN_WINDOW )
4024     {
4025         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_01_L, (bEn<<11), BIT(11));
4026         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_01_L, (bEn<<11), BIT(11));
4027     }
4028     else
4029     {
4030         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_41_L, (bEn<<11), BIT(11));
4031         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK32_41_L, (bEn<<11), BIT(11));
4032     }
4033 #else
4034     if( eWindow == MAIN_WINDOW )
4035     {
4036         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_01_L, (bEn<<11), BIT(11));
4037     }
4038     else
4039     {
4040         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_41_L, (bEn<<11), BIT(11));
4041     }
4042 #endif
4043     MDrv_XC_MLoad_Fire(pInstance, TRUE);
4044     _MLOAD_RETURN(pInstance);
4045 }
4046 
4047 
Hal_SC_set_freezeimg(void * pInstance,MS_BOOL bEn,SCALER_WIN eWindow)4048 void Hal_SC_set_freezeimg(void *pInstance, MS_BOOL bEn, SCALER_WIN eWindow)
4049 {
4050     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4051     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4052 #if (HW_DESIGN_4K2K_VER == 4)
4053     if( eWindow == MAIN_WINDOW )
4054     {
4055         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L, (bEn<<11), BIT(11));
4056         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_01_L, (bEn<<11), BIT(11));
4057     }
4058     else
4059     {
4060         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_41_L, (bEn<<11), BIT(11));
4061         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, (bEn<<11), BIT(11));
4062     }
4063 #else
4064     if( eWindow == MAIN_WINDOW )
4065     {
4066         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L, (bEn<<11), BIT(11));
4067     }
4068     else
4069     {
4070         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_41_L, (bEn<<11), BIT(11));
4071     }
4072 #endif
4073 }
4074 
Hal_SC_set_frcm_freezeimg(void * pInstance,MS_BOOL bEn,SCALER_WIN eWindow)4075 void Hal_SC_set_frcm_freezeimg(void *pInstance, MS_BOOL bEn, SCALER_WIN eWindow)
4076 {
4077     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4078     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4079     if( eWindow == MAIN_WINDOW )
4080     {
4081         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_01_L, (bEn<<11), BIT(11));
4082     }
4083     else
4084     {
4085         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, (bEn<<11), BIT(11));
4086     }
4087 }
4088 
Hal_SC_get_freezeimg(void * pInstance,SCALER_WIN eWindow)4089 MS_BOOL Hal_SC_get_freezeimg(void *pInstance, SCALER_WIN eWindow)
4090 {
4091     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4092     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4093 #if (HW_DESIGN_4K2K_VER == 4)
4094     if( eWindow == MAIN_WINDOW )
4095     {
4096         return (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_01_L, BIT(11)) ? TRUE: FALSE);
4097     }
4098     else
4099     {
4100         return (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_41_L, BIT(11)) ? TRUE: FALSE);
4101     }
4102 #else
4103     if( eWindow == MAIN_WINDOW )
4104     {
4105         return (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_01_L, BIT(11)) ? TRUE: FALSE);
4106     }
4107     else
4108     {
4109         return (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_41_L, BIT(11)) ? TRUE: FALSE);
4110     }
4111 #endif
4112 }
4113 
Hal_SC_exwith_miuprotect_swreset(void * pInstance,MS_U8 x)4114 void Hal_SC_exwith_miuprotect_swreset(void *pInstance, MS_U8 x)
4115 {
4116     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4117     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4118     //reset IP1F2
4119     //select pattern generator source
4120     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_02_L, x, x);
4121     //MsOS_DelayTask(2);
4122 
4123     //select pattern generator source
4124     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_02_L, 0, x);
4125     //MsOS_DelayTask(2);
4126 }
4127 
Hal_SC_ip_Init_for_internal_timing(void * pInstance,XC_Internal_TimingType timingtype,SCALER_WIN eWindow)4128 void Hal_SC_ip_Init_for_internal_timing(void *pInstance, XC_Internal_TimingType timingtype, SCALER_WIN eWindow)
4129 {
4130     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4131     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4132     if(eWindow == SUB_WINDOW)
4133     {
4134         if(Hal_SC_ip_get_IPAutoNoSignal(pInstance, eWindow)) Hal_SC_ip_set_IPAutoNoSignal(pInstance, DISABLE, eWindow);
4135 
4136         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_02_L, 0x104) ;  //Video source
4137         Hal_SC_exwith_miuprotect_swreset(pInstance, REST_IP_F1);  //when source is changed, we must reset it to make it work
4138         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_03_L, 0x890);
4139 
4140         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_21_L, 0x01, 0x03);   //force progressive mode
4141         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_0E_L, BIT(15), BIT(15));   //auto gain 10bit
4142 
4143         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_04_L, 0x020);  //capture V start
4144         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_05_L, 0x50) ;  //capture H start
4145 
4146         switch (timingtype)
4147         {
4148             case E_XC_480P:
4149             default:
4150 
4151                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_06_L, 0x1c0) ; // V size
4152                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_07_L, 0x280) ; // h size
4153 
4154                 break;
4155             case E_XC_720P:
4156                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_06_L, 0x290) ; // V size (720 - 64) = 656 = 0x290
4157                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_07_L, 0x460) ; // h size (1280 - 160) = 1120 = 0x460
4158 
4159                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4E_L, 0x0800); //DNR Offset
4160                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4F_L, 0x0460); //DNR Fetch
4161                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, 0x0800); //OPM Offsest
4162                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, 0x0460); //OPM Fetch
4163 
4164                 break;
4165             case E_XC_1080P:
4166                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_06_L, 0x3F8) ; // V size (1080 - 64) = 1016 = 0x3F8
4167                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_07_L, 0x6E0) ; // h size (1920 - 160) = 1760 = 0x6E0
4168 
4169                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4E_L, 0x0800); //DNR Offset
4170                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_4F_L, 0x06E0); //DNR Fetch
4171                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_56_L, 0x0800); //OPM Offsest
4172                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, 0x06E0); //OPM Fetch
4173                 break;
4174         }
4175     }
4176     else
4177     {
4178         if(Hal_SC_ip_get_IPAutoNoSignal(pInstance, eWindow)) Hal_SC_ip_set_IPAutoNoSignal(pInstance, DISABLE, eWindow);
4179 
4180         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, 0x104) ;  //Video source
4181         Hal_SC_exwith_miuprotect_swreset(pInstance, REST_IP_F2);  //when source is changed, we must reset it to make it work
4182         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_03_L, 0x890);
4183 
4184         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_21_L, 0x01, 0x03);   //force progressive mode
4185         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_0E_L, BIT(15), BIT(15));   //auto gain 10bit
4186 
4187         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_04_L, 0x020);  //capture V start
4188         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_05_L, 0x50) ;  //capture H start
4189 
4190         switch (timingtype)
4191         {
4192             case E_XC_480P:
4193             default:
4194 
4195                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_06_L, 0x1c0) ; // V size
4196                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, 0x280) ; // h size
4197 
4198                 break;
4199             case E_XC_720P:
4200                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_06_L, 0x290) ; // V size (720 - 64) = 656 = 0x290
4201                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, 0x460) ; // h size (1280 - 160) = 1120 = 0x460
4202 
4203                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, 0x0800); //DNR Offset
4204                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, 0x0460); //DNR Fetch
4205                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, 0x0800); //OPM Offsest
4206                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, 0x0460); //OPM Fetch
4207 
4208                 break;
4209             case E_XC_1080P:
4210                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_06_L, 0x3F8) ; // V size (1080 - 64) = 1016 = 0x3F8
4211                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L, 0x6E0) ; // h size (1920 - 160) = 1760 = 0x6E0
4212 
4213                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, 0x0800); //DNR Offset
4214                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, 0x06E0); //DNR Fetch
4215                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L, 0x0800); //OPM Offsest
4216                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, 0x06E0); //OPM Fetch
4217                 break;
4218         }
4219 
4220     }
4221 }
4222 
Hal_SC_rgb_average_info(void * pInstance,MS_U16 u16mask,SCALER_WIN eWindow)4223 MS_U16 Hal_SC_rgb_average_info(void *pInstance, MS_U16 u16mask, SCALER_WIN eWindow)
4224 {
4225     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4226     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4227     MS_U16 u16value;
4228 
4229     if(eWindow == MAIN_WINDOW)
4230     {
4231         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_0F_L, u16mask, 0x0F);
4232         u16value=SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_11_L);
4233     }
4234     else
4235     {
4236         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_0F_L, u16mask, 0x0F);
4237         u16value=SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_11_L);
4238     }
4239 
4240     return u16value;
4241 }
4242 
4243 
Hal_SC_autogain_enable(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)4244 void Hal_SC_autogain_enable(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
4245 {
4246     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4247     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4248     //auto gain enable
4249     if(eWindow == MAIN_WINDOW)
4250     {
4251         if(bEnable)
4252             W2BYTEMSK(REG_SC_BK01_0E_L, 0x11, 0x11);
4253         else
4254             W2BYTEMSK(REG_SC_BK01_0E_L, 0x00, 0x11);
4255     }
4256     else
4257     {
4258         if(bEnable)
4259             W2BYTEMSK(REG_SC_BK03_0E_L, 0x11, 0x11);
4260         else
4261             W2BYTEMSK(REG_SC_BK03_0E_L, 0x00, 0x11);
4262     }
4263 }
4264 
Hal_SC_autogain_status(void * pInstance,SCALER_WIN eWindow)4265 MS_BOOL Hal_SC_autogain_status(void *pInstance, SCALER_WIN eWindow)
4266 {
4267     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4268     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4269     MS_BOOL bvalue;
4270     if(eWindow == MAIN_WINDOW)
4271         bvalue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_0E_L, BIT(1));
4272     else
4273         bvalue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_0E_L, BIT(1));
4274 
4275     return bvalue;
4276 
4277 }
4278 
Hal_SC_set_mirror(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)4279 void Hal_SC_set_mirror(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
4280 {
4281     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4282     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4283     MS_U32 u32NoSigReg, u32MirrorReg;
4284 
4285     if(eWindow == MAIN_WINDOW)
4286     {
4287         u32NoSigReg = REG_SC_BK01_02_L;
4288         u32MirrorReg = REG_SC_BK12_03_L;
4289     }
4290     else
4291     {
4292         u32NoSigReg = REG_SC_BK03_02_L;
4293         u32MirrorReg = REG_SC_BK12_43_L;
4294 
4295     }
4296 
4297     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32NoSigReg, BIT(7), BIT(7));
4298 
4299     if( bEnable )
4300     {
4301         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32MirrorReg, (BIT(12)|BIT(13)), (BIT(12)|BIT(13)));
4302     }
4303     else
4304     {
4305         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32MirrorReg, 0x0, (BIT(12)|BIT(13)));
4306     }
4307 }
4308 
Hal_SC_set_frcm_mirror(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)4309 void Hal_SC_set_frcm_mirror(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
4310 {
4311     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4312     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4313     MS_U32 u32NoSigReg = 0, u32MirrorReg = 0;
4314 
4315     if(eWindow == MAIN_WINDOW)
4316     {
4317         u32NoSigReg = REG_SC_BK01_02_L;
4318         u32MirrorReg = REG_SC_BK32_03_L;
4319     }
4320     else
4321     {
4322         u32NoSigReg = REG_SC_BK03_02_L;
4323         u32MirrorReg = REG_SC_BK32_43_L;
4324     }
4325 
4326     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32NoSigReg, BIT(7), BIT(7));
4327 
4328     if( bEnable )
4329     {
4330         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32MirrorReg, (BIT(12)|BIT(13)), (BIT(12)|BIT(13)));
4331     }
4332     else
4333     {
4334         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32MirrorReg, 0x0, (BIT(12)|BIT(13)));
4335     }
4336 }
4337 
Hal_SC_GetAVDStatus(void)4338 MS_U16 Hal_SC_GetAVDStatus(void)
4339 {
4340     return MDrv_Read2Byte(L_BK_AFEC(0x66));
4341 }
4342 
Hal_SC_set_rep_window(void * pInstance,MS_BOOL bEnable,MS_U16 x,MS_U16 y,MS_U16 w,MS_U16 h,MS_U8 u8Color)4343 void Hal_SC_set_rep_window(void *pInstance, MS_BOOL bEnable,MS_U16 x,MS_U16 y,MS_U16 w,MS_U16 h,MS_U8 u8Color)
4344 {
4345     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4346     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4347     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, bEnable?BIT(9):0x0, BIT(9));
4348     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_42_L,x);
4349     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_43_L,x + w);
4350     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_44_L,y);
4351     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_45_L,y + h);
4352     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_46_L, (~u8Color)<<8, 0xFF00);
4353 }
4354 
4355 //--------------------------------------------------
4356 //update display window registers with input window
4357 //IN:
4358 //   pdspwin: input window info
4359 //--------------------------------------------------
Hal_SC_set_disp_window(void * pInstance,SCALER_WIN eWindow,MS_WINDOW_TYPE * pdspwin)4360 void Hal_SC_set_disp_window(void *pInstance, SCALER_WIN eWindow, MS_WINDOW_TYPE *pdspwin)
4361 {
4362     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4363     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4364     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4365     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4366 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
4367     MS_U16 u16HDEStart = SC_R2BYTE(0, REG_SC_BK10_04_L);
4368     MS_U32 u32Sc1OneLineDly = (SC_R2BYTE(0, REG_SC_BK10_0C_L) + 1)/2;
4369     MS_U32 u32Sc1TGEN_Dly = 0;
4370     if (SC_R2BYTEMSK(0, REG_SC_BK68_50_L, BIT(3)) == 0)
4371     {
4372         MS_U32 u32STGEN_Dly = VIP_SC0_V_DLY*u32Sc1OneLineDly+VIP_SC0_H_DLY;
4373         MS_U32 u32Sc0TGEN_Dly = u32STGEN_Dly + TGEN_SC0_DLY;
4374         MS_U32 u32Sc1VIP_Dly = VIP_SC1_V_DLY*u32Sc1OneLineDly + VIP_SC1_H_DLY;
4375         if (u32Sc0TGEN_Dly > u32Sc1VIP_Dly + SC1_PRE_RUN_DLY)
4376         {
4377             u32Sc1TGEN_Dly = u32Sc0TGEN_Dly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY;
4378         }
4379         else
4380         {
4381             u32Sc1TGEN_Dly = u32Sc0TGEN_Dly + u32Sc1OneLineDly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY;
4382         }
4383     }
4384     else
4385     {
4386         MS_U32 u32STGEN_Dly = VIP_SC0_USER_MODE_V_DLY*u32Sc1OneLineDly+VIP_SC0_USER_MODE_H_DLY;
4387         MS_U32 u32Sc0TGEN_Dly = u32STGEN_Dly + TGEN_SC0_USER_MODE_DLY;
4388         MS_U32 u32HComp = (pdspwin->x - u16HDEStart)/2;
4389         MS_U32 u32Sc1VIP_Dly = VIP_SC1_V_DLY*u32Sc1OneLineDly + VIP_SC1_H_DLY;
4390         u32Sc1TGEN_Dly = u32Sc0TGEN_Dly - u32Sc1VIP_Dly - SC1_PRE_RUN_DLY + u32HComp;
4391     }
4392 #endif
4393     //FIX ME:need follow HW_DESIGN_4K2K_VER = 6 rule
4394     if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
4395     {
4396         _MLOAD_ENTRY(pInstance);
4397 
4398         if(eWindow == MAIN_WINDOW)
4399         {
4400 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
4401             if (psXCInstPri->u32DeviceID == 1)
4402             {
4403                 //Display window
4404                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, u16HDEStart+90, VOP_DISPLAY_HSTART_MASK);//temp solution(+90)
4405                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (u16HDEStart+pdspwin->x+pdspwin->width-1 - pdspwin->x+90), VOP_DISPLAY_HEND_MASK);
4406             }
4407             else
4408             {
4409                 //Display window
4410                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, (MS_U16)(pdspwin->x>>00), VOP_DISPLAY_HSTART_MASK);
4411                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, (MS_U16)((pdspwin->x+pdspwin->width-1)>>00), VOP_DISPLAY_HEND_MASK);
4412             }
4413             if(Hal_SC_3D_IsDualViewMode(pInstance,MAIN_WINDOW) && (E_XC_3D_OUTPUT_TOP_BOTTOM == MDrv_XC_Get_3D_Output_Mode(pInstance)))
4414             {
4415                 if (IsVMirrorMode(eWindow))
4416                 {
4417                     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pdspwin->y+(pdspwin->height)/2), VOP_DISPLAY_VSTART_MASK);
4418                     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pdspwin->y+(pdspwin->height)-1), VOP_DISPLAY_VEND_MASK);
4419                 }
4420                 else
4421                 {
4422                     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pdspwin->y), VOP_DISPLAY_VSTART_MASK);
4423                     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pdspwin->y+(pdspwin->height)/2-1), VOP_DISPLAY_VEND_MASK);
4424                 }
4425             }
4426             else
4427             {
4428                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, (MS_U16)(pdspwin->y), VOP_DISPLAY_VSTART_MASK);
4429                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, (MS_U16)(pdspwin->y+pdspwin->height-1), VOP_DISPLAY_VEND_MASK);
4430             }
4431 
4432             if (psXCInstPri->u32DeviceID == 1)//follow HW_DESIGN_4K2K_VER = 6 rule
4433             {
4434                 //Display window
4435                 MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_07_L, (MS_U16)(pdspwin->x>>00), VOP_DISPLAY_HSTART_MASK);
4436                 MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_08_L, (MS_U16)((pdspwin->x+pdspwin->width-1)>>00), VOP_DISPLAY_HEND_MASK);
4437                 if(Hal_SC_3D_IsDualViewMode(pInstance,MAIN_WINDOW) && (E_XC_3D_OUTPUT_TOP_BOTTOM == MDrv_XC_Get_3D_Output_Mode(pInstance)))
4438                 {
4439                     if (IsVMirrorMode(eWindow))
4440                     {
4441                         MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_09_L, (MS_U16)(pdspwin->y), 0xFFFF);
4442                         MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_0A_L, (MS_U16)(pdspwin->y+pdspwin->height/2-1), 0xFFFF);
4443                     }
4444                     else
4445                     {
4446                         MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_09_L, (MS_U16)(pdspwin->y+(pdspwin->height)/2), 0xFFFF);
4447                         MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_0A_L, (MS_U16)(pdspwin->y+pdspwin->height-1), 0xFFFF);
4448                     }
4449                 }
4450                 else
4451                 {
4452                     MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_09_L, (MS_U16)(pdspwin->y), 0xFFFF);
4453                     MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK0F_0A_L, (MS_U16)(pdspwin->y+pdspwin->height-1), 0xFFFF);
4454                 }
4455                 MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK68_61_L, (MS_U16)(u32Sc1TGEN_Dly%u32Sc1OneLineDly)*2, 0xFFFF);
4456                 MDrv_XC_MLoad_WriteCmd(g_pDevice0Instance, REG_SC_BK68_62_L, (MS_U16)(u32Sc1TGEN_Dly/u32Sc1OneLineDly), 0xFFFF);
4457             }
4458 #else
4459             //Display window
4460             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_08_L, pdspwin->x,VOP_DISPLAY_HSTART_MASK);                  // Display H start
4461             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_09_L, pdspwin->x+pdspwin->width-1,VOP_DISPLAY_HEND_MASK);   // Display H end
4462             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0A_L, pdspwin->y,VOP_DISPLAY_VSTART_MASK);                  // Display V start
4463             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK10_0B_L, pdspwin->y+pdspwin->height-1,VOP_DISPLAY_VEND_MASK);  // Display V end
4464 #endif
4465         }
4466         else
4467         {
4468             //Display window
4469             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_07_L, pdspwin->x,0x3FFF);                  // Display H start
4470             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_08_L, pdspwin->x+pdspwin->width-1,0x3FFF);   // Display H end
4471             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_09_L, pdspwin->y,0x1FFF);                  // Display V start
4472             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK0F_0A_L, pdspwin->y+pdspwin->height-1,0x1FFF);  // Display V end
4473         }
4474 
4475         MDrv_XC_MLoad_Fire(pInstance, TRUE);
4476         _MLOAD_RETURN(pInstance);
4477     }
4478     else
4479     {
4480         if(eWindow == MAIN_WINDOW)
4481         {
4482 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
4483             //FIX ME:following HW_DESIGN_4K2K_VER = 6 rule
4484             //Display window
4485             if (psXCInstPri->u32DeviceID == 1)
4486             {
4487                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, u16HDEStart+90);//temp solution(+90)
4488                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, (u16HDEStart+ pdspwin->width+90-1));
4489             }
4490             else
4491             {
4492                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pdspwin->x);
4493                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pdspwin->x+pdspwin->width-1);
4494             }
4495             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pdspwin->y);
4496             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pdspwin->y+pdspwin->height-1);
4497             if (psXCInstPri->u32DeviceID == 1)//follow HW_DESIGN_4K2K_VER = 6 rule
4498             {
4499                 //Display window
4500                 SC_W2BYTE(0, REG_SC_BK0F_07_L, pdspwin->x); // Display H start
4501                 SC_W2BYTE(0, REG_SC_BK0F_08_L, pdspwin->x+pdspwin->width-1);   // Display H end
4502                 SC_W2BYTE(0, REG_SC_BK0F_09_L, pdspwin->y); // Display V start
4503                 SC_W2BYTE(0, REG_SC_BK0F_0A_L, pdspwin->y+pdspwin->height-1);   // Display V end
4504                 SC_W2BYTEMSK(0, REG_SC_BK68_61_L, (u32Sc1TGEN_Dly%u32Sc1OneLineDly)*2, 0xFFFF);
4505                 SC_W2BYTEMSK(0, REG_SC_BK68_62_L, u32Sc1TGEN_Dly/u32Sc1OneLineDly, 0xFFFF);
4506 
4507             }
4508 #else
4509             //Display window
4510             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L, pdspwin->x);                  // Display H start
4511             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L, pdspwin->x+pdspwin->width-1);   // Display H end
4512             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L, pdspwin->y);                  // Display V start
4513             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L, pdspwin->y+pdspwin->height-1);  // Display V end
4514 #endif
4515         }
4516         else
4517         {
4518             //Display window
4519             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L, pdspwin->x);                  // Display H start
4520             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L, pdspwin->x+pdspwin->width-1);   // Display H end
4521             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L, pdspwin->y);                  // Display V start
4522             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L, pdspwin->y+pdspwin->height-1);  // Display V end
4523         }
4524     }
4525 }
4526 
4527 //--------------------------------------------------
4528 //get display window registers setting
4529 //OUT:
4530 //   pdspwin: Pointer for ouput disp window register
4531 //--------------------------------------------------
Hal_SC_get_disp_window(void * pInstance,SCALER_WIN eWindow,MS_WINDOW_TYPE * pdspwin)4532 void Hal_SC_get_disp_window(void *pInstance, SCALER_WIN eWindow, MS_WINDOW_TYPE *pdspwin)
4533 {
4534     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4535     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4536     if(eWindow == MAIN_WINDOW)
4537     {
4538         //FIX ME:need follow HW_DESIGN_4K2K_VER = 6 rule
4539         //Display window
4540         pdspwin->x = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_08_L);                   // Display H start
4541         pdspwin->width  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_09_L) - pdspwin->x + 1; // Display H end
4542         pdspwin->y = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0A_L);                   // Display V start
4543         pdspwin->height = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_0B_L) - pdspwin->y + 1; // Display V end
4544     }
4545     else
4546     {
4547         //Display window
4548         pdspwin->x = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_07_L);                   // Display H start
4549         pdspwin->width  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_08_L) - pdspwin->x + 1; // Display H end
4550         pdspwin->y = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_09_L);                   // Display V start
4551         pdspwin->height = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_0A_L) - pdspwin->y + 1; // Display V end
4552     }
4553 }
4554 
Hal_SC_set_Fclk(void * pInstance,EN_SET_FCLK_CASE enCase)4555 void Hal_SC_set_Fclk(void *pInstance, EN_SET_FCLK_CASE enCase)
4556 {
4557     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4558     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4559     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4560     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4561 
4562     if (enCase == EN_FCLK_FBL)
4563     {
4564         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
4565             MDrv_WriteByteMask(REG_CKG_FCLK, CKG_FCLK_345MHZ, CKG_FCLK_MASK);
4566         else
4567             MDrv_WriteByteMask(REG_CKG_S2_FCLK, CKG_S2_FCLK_345MHZ, CKG_S2_FCLK_MASK);
4568     }
4569     else
4570     {
4571         if(E_XC_DEVICE0 == psXCInstPri->u32DeviceID)
4572             MDrv_WriteByteMask(REG_CKG_FCLK, CKG_FCLK_DEFAULT, CKG_FCLK_MASK);
4573         else
4574             MDrv_WriteByteMask(REG_CKG_S2_FCLK, CKG_S2_FCLK_320MHZ, CKG_S2_FCLK_MASK);
4575     }
4576 }
4577 
Hal_SC_get_framebuf_Info(void * pInstance,SC_FRAMEBUF_INFO_t * pFrameBufInfo,SCALER_WIN eWindow)4578 void Hal_SC_get_framebuf_Info(void *pInstance, SC_FRAMEBUF_INFO_t *pFrameBufInfo, SCALER_WIN eWindow)
4579 {
4580     MS_U8 u8Reg;
4581 
4582     if (!pFrameBufInfo) return;
4583 
4584     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4585     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4586     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4587     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4588 
4589     pFrameBufInfo->u32IPMBase0 = (((MS_PHY)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_09_L:REG_SC_BK12_49_L, 0x00FF)<<16) |
4590                                   (SC_R2BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_08_L:REG_SC_BK12_48_L))) * BYTE_PER_WORD;
4591     pFrameBufInfo->u32IPMBase1 = (((MS_PHY)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_0B_L:REG_SC_BK12_4B_L, 0x00FF)<<16) |
4592                                   (SC_R2BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_0A_L:REG_SC_BK12_4A_L))) * BYTE_PER_WORD;
4593     pFrameBufInfo->u32IPMBase2 = (((MS_PHY)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_0D_L:REG_SC_BK12_4D_L, 0x00FF)<<16) |
4594                                   (SC_R2BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_0C_L:REG_SC_BK12_4C_L))) * BYTE_PER_WORD;
4595     pFrameBufInfo->u16IPMOffset = SC_R2BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_0E_L:REG_SC_BK12_4E_L);
4596     pFrameBufInfo->u16IPMFetch = SC_R2BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_0F_L:REG_SC_BK12_4F_L);
4597     pFrameBufInfo->u16VLength = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_18_L:REG_SC_BK12_58_L, 0x0FFF);
4598     pFrameBufInfo->bLinearAddrMode = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_03_L:REG_SC_BK12_43_L, BIT(4));
4599     pFrameBufInfo->bYCSeparate = ( SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_02_L:REG_SC_BK12_42_L, BIT(10)) )?TRUE:FALSE;
4600     pFrameBufInfo->u32WriteLimitBase = SC_R4BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK0D_42_L:REG_SC_BK0D_44_L);
4601     // frcm write base address limit
4602 #if 0
4603 #if (HW_DESIGN_4K2K_VER == 4)
4604     if ((psXCInstPri->u32DeviceID==0)
4605         && !(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
4606     {
4607         pFrameBufInfo->u32FRCMWriteLimitBase = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_1A_L);
4608     }
4609 #endif
4610 #endif
4611     pFrameBufInfo->u8BitPerPixel = 24;//default
4612 
4613     u8Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_01_L:REG_SC_BK12_41_L, 0x00FF);
4614     if (u8Reg & 0x30)
4615     {//444
4616         pFrameBufInfo->bMemFormat422 = FALSE;
4617         if (u8Reg & 0x10)
4618         { // 444 8BIT
4619             pFrameBufInfo->u8BitPerPixel = 24;
4620         }
4621         else
4622         { // 444 10BIT
4623             pFrameBufInfo->u8BitPerPixel = 32;
4624         }
4625         pFrameBufInfo->bInterlace = FALSE;
4626     }
4627     else
4628     {//422
4629         pFrameBufInfo->bMemFormat422 = TRUE;
4630 
4631         if((BIT(8)|BIT(9)) == SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_02_L:REG_SC_BK12_42_L, BIT(8)|BIT(9))) //user mode
4632         {
4633             MS_U8 u8MemFmt = SC_R2BYTE(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_02_L:REG_SC_BK12_42_L) & 0x0F;
4634             if((4 == u8MemFmt) || (5 == u8MemFmt) || (6 == u8MemFmt))
4635             {
4636                 pFrameBufInfo->u8BitPerPixel = 20;
4637             }
4638             else if((8 == u8MemFmt) || (9 == u8MemFmt) || (10 == u8MemFmt) || (11 == u8MemFmt))
4639             {
4640                 pFrameBufInfo->u8BitPerPixel = 24;
4641             }
4642         }
4643         else
4644         {
4645             u8Reg = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_01_L:REG_SC_BK12_41_L, 0xFF00)) >> 8;
4646 
4647             switch(u8Reg & 0x77)
4648             {
4649                 case 0x25:
4650                     pFrameBufInfo->u8BitPerPixel = 24;
4651                     pFrameBufInfo->bInterlace = TRUE;
4652                     break;
4653                 case 0x24:
4654                     pFrameBufInfo->u8BitPerPixel = 20;
4655                     pFrameBufInfo->bInterlace = TRUE;
4656                     break;
4657                 case 0x27:
4658                     pFrameBufInfo->u8BitPerPixel = 16;
4659                     pFrameBufInfo->bInterlace = TRUE;
4660                     break;
4661                 case 0x21:
4662                     if(BIT(1) == SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_04_L:REG_SC_BK12_44_L, BIT(0)|BIT(1)))
4663                     {
4664                         pFrameBufInfo->u8BitPerPixel = 24;
4665                     }
4666                     else
4667                     {
4668                         pFrameBufInfo->u8BitPerPixel = 20;
4669                     }
4670                     pFrameBufInfo->bInterlace = FALSE;
4671                     break;
4672                 case 0x20:
4673                     pFrameBufInfo->u8BitPerPixel = 16;
4674                     pFrameBufInfo->bInterlace = FALSE;
4675                     break;
4676                 case 0x00:
4677                 default:
4678                     pFrameBufInfo->u8BitPerPixel = 16;
4679                     pFrameBufInfo->bInterlace = FALSE;
4680                     break;
4681             }
4682         }
4683     }
4684 
4685     //In M10/J2/A5/A6/A3, New SCMI
4686     pFrameBufInfo->u8FBNum = (MS_U8)(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, (eWindow == MAIN_WINDOW)?REG_SC_BK12_19_L:REG_SC_BK12_59_L, 0x1F));
4687 
4688 #if 0
4689     printf("base0=0x%x, base1=0x%x, base2=0x%x, offset=%u, 422=%u, i=%u, bpp=%u, fbnum=%u\n",
4690            (unsigned int)pFrameBufInfo->u32IPMBase0,
4691            (unsigned int)pFrameBufInfo->u32IPMBase1,
4692            (unsigned int)pFrameBufInfo->u32IPMBase2,
4693            pFrameBufInfo->u16IPMOffset,
4694            pFrameBufInfo->bMemFormat422,
4695            pFrameBufInfo->bInterlace,
4696            pFrameBufInfo->u8BitPerPixel,
4697            pFrameBufInfo->u8FBNum);
4698 #endif
4699 }
Hal_SC_set_framebuf_Info(void * pInstance,SC_FRAMEBUF_INFO_t pFrameBufInfo)4700 void Hal_SC_set_framebuf_Info(void *pInstance, SC_FRAMEBUF_INFO_t pFrameBufInfo)
4701 {
4702     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4703     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4704     MS_PHY u32IPMBase0, u32IPMBase1, u32IPMBase2;
4705     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
4706     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
4707 
4708     u32IPMBase0=pFrameBufInfo.u32IPMBase0/BYTE_PER_WORD;
4709     u32IPMBase1=pFrameBufInfo.u32IPMBase1/BYTE_PER_WORD;
4710     u32IPMBase2=pFrameBufInfo.u32IPMBase2/BYTE_PER_WORD;
4711 
4712     //Step 5.4, Memory Limit V : BK12_18[15] = 1, BK12_18[12:0] to the real V line number
4713     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, (pFrameBufInfo.u16VLength|0x8000),0x8FFF);
4714 
4715 //    u32WritelimitBase = ((u32IPMBase0 + u32MemSize) / BYTE_PER_WORD - 1) | 0x2000000;
4716     SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_1A_L, pFrameBufInfo.u32IPMBase1);
4717     // frcm write base address limit
4718 #if 0
4719 #if (HW_DESIGN_4K2K_VER == 4)
4720     if ((psXCInstPri->u32DeviceID==0)
4721         && !(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
4722     {
4723         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK32_1A_L, pFrameBufInfo.u32FRCMWriteLimitBase);
4724     }
4725 #endif
4726 #endif
4727     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_09_L, (MS_U16)(u32IPMBase0 & 0xFF0000)>>16,0x00FF);
4728     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L, (MS_U16)(u32IPMBase0 & 0xFFFF));
4729 
4730     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0B_L, (MS_U16)(u32IPMBase1 & 0xFF0000)>>16,0x00FF);
4731     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0A_L, (MS_U16)(u32IPMBase1 & 0xFFFF));
4732 
4733     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_0D_L, (MS_U16)(u32IPMBase2 & 0xFF0000)>>16,0x00FF);
4734     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0C_L, (MS_U16)(u32IPMBase2 & 0xFFFF));
4735 
4736 
4737     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0E_L, pFrameBufInfo.u16IPMOffset);
4738     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_0F_L, pFrameBufInfo.u16IPMFetch);
4739 //    SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_18_L, (pFrameBufInfo.u16VLength|0x1000),0x1FFF);
4740     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_03_L, ((pFrameBufInfo.bLinearAddrMode)?BIT(4):0),BIT(4));
4741 
4742 }
4743 
Hal_SC_get_cs_det_cnt(void * pInstance,SCALER_WIN eWindow)4744 MS_U8 Hal_SC_get_cs_det_cnt(void *pInstance, SCALER_WIN eWindow)
4745 {
4746     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4747     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4748     MS_U8 u8val;
4749 
4750     if(eWindow == MAIN_WINDOW)
4751     {
4752         u8val = ((SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_0C_L) & 0xFF00) >> 8);
4753     }
4754     else
4755     {
4756         u8val = ((SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_0C_L) & 0xFF00) >> 8);
4757     }
4758     return u8val;
4759 }
4760 
Hal_SC_set_cs_det_cnt(void * pInstance,MS_U8 u8val,SCALER_WIN eWindow)4761 void Hal_SC_set_cs_det_cnt(void *pInstance, MS_U8 u8val, SCALER_WIN eWindow)
4762 {
4763     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4764     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4765     if(eWindow == MAIN_WINDOW)
4766     {
4767         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_0C_L, (((MS_U16)u8val)<<8), 0xFF00);
4768     }
4769     else
4770     {
4771         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_0C_L, (((MS_U16)u8val)<<8), 0xFF00);
4772     }
4773 }
4774 
Hal_SC_get_plus_width(void * pInstance,SCALER_WIN eWindow)4775 MS_U8 Hal_SC_get_plus_width(void *pInstance, SCALER_WIN eWindow)
4776 {
4777     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4778     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4779     MS_U8 u8val;
4780 
4781     if(eWindow == MAIN_WINDOW)
4782     {
4783         u8val = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_22_L) & 0x00FF);
4784     }
4785     else
4786     {
4787         u8val = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK03_22_L) & 0x00FF);
4788     }
4789     return u8val;
4790 }
4791 
Hal_SC_set_opm_fetch(void * pInstance,SCALER_WIN eWindow,MS_U16 u16OPMFetch)4792 void Hal_SC_set_opm_fetch(void *pInstance, SCALER_WIN eWindow, MS_U16 u16OPMFetch)
4793 {
4794     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4795     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4796     if(eWindow == MAIN_WINDOW)
4797     {
4798         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L, u16OPMFetch, 0x1FFF);
4799     }
4800     else
4801     {
4802         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L, u16OPMFetch, 0x1FFF);
4803     }
4804 }
4805 
Hal_SC_get_opm_fetch(void * pInstance,SCALER_WIN eWindow)4806 MS_U16 Hal_SC_get_opm_fetch(void *pInstance, SCALER_WIN eWindow)
4807 {
4808     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4809     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4810     MS_U16 u16Val = 0;
4811     if(eWindow == MAIN_WINDOW)
4812     {
4813         u16Val = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_17_L) & 0x0FFF;
4814     }
4815     else
4816     {
4817         u16Val = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_57_L) & 0x0FFF;
4818     }
4819     return u16Val;
4820 }
4821 
HAL_SC_get_dnr_setting(void * pInstance,SCALER_WIN eWindow)4822 MS_U8 HAL_SC_get_dnr_setting(void *pInstance, SCALER_WIN eWindow)
4823 {
4824     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4825     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4826     if(eWindow == MAIN_WINDOW)
4827         return (MS_U8)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK06_21_L, BIT(1)|BIT(0));
4828     else
4829         return (MS_U8)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK06_01_L, BIT(1)|BIT(0));
4830 }
4831 
HAL_SC_enable_field_avg_y(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)4832 void HAL_SC_enable_field_avg_y(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
4833 {
4834     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4835     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4836     if(eWindow == MAIN_WINDOW)
4837     {
4838         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_21_L, bEnable ? BIT(6) : 0, BIT(6));
4839     }
4840     else
4841     {
4842         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_01_L, bEnable ? BIT(6) : 0, BIT(6));
4843     }
4844 
4845 }
4846 
HAL_SC_enable_field_avg_c(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)4847 void HAL_SC_enable_field_avg_c(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
4848 {
4849     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4850     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4851     if(eWindow == MAIN_WINDOW)
4852     {
4853         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_21_L, bEnable ? BIT(7) : 0, BIT(7));
4854     }
4855     else
4856     {
4857         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_01_L, bEnable ? BIT(7) : 0, BIT(7));
4858     }
4859 }
4860 
HAL_SC_enable_dnr(void * pInstance,MS_U8 u8Val,SCALER_WIN eWindow)4861 void HAL_SC_enable_dnr(void *pInstance, MS_U8 u8Val, SCALER_WIN eWindow)
4862 {
4863     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4864     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4865     if(eWindow == MAIN_WINDOW)
4866         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK06_21_L, u8Val, BIT(1)|BIT(0));
4867     else
4868         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK06_01_L, u8Val, BIT(1)|BIT(0));
4869 }
4870 
HAL_SC_VOP_Set_Contrast_En(void * pInstance,MS_BOOL bEenable,SCALER_WIN eWindow)4871 void HAL_SC_VOP_Set_Contrast_En(void *pInstance, MS_BOOL bEenable, SCALER_WIN eWindow)
4872 {
4873     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4874     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4875     if(eWindow == MAIN_WINDOW)
4876     {
4877         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_53_L, (MS_U16)(bEenable?BIT(0):0), BIT(0));
4878     }
4879     else
4880     {
4881         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_53_L, (MS_U16)(bEenable?BIT(8):0), BIT(8));
4882     }
4883 }
HAL_SC_VOP_Set_Contrast_Value(void * pInstance,MS_XC_VOP_CHANNEL_t eVop_Channel,MS_U16 u16Val,SCALER_WIN eWindow)4884 void HAL_SC_VOP_Set_Contrast_Value(void *pInstance, MS_XC_VOP_CHANNEL_t eVop_Channel, MS_U16 u16Val, SCALER_WIN eWindow)
4885 {
4886     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4887     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4888     if(eWindow == MAIN_WINDOW)
4889     {
4890         switch(eVop_Channel)
4891         {
4892             default:
4893             case XC_VOP_CHR:
4894                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_47_L, u16Val, 0x0FFF);
4895                 break;
4896             case XC_VOP_CHG:
4897                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_48_L, u16Val, 0x0FFF);
4898                 break;
4899             case XC_VOP_CHB:
4900                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_49_L, u16Val, 0x0FFF);
4901                 break;
4902             case XC_VOP_ALL:
4903                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_47_L, u16Val, 0x0FFF);
4904                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_48_L, u16Val, 0x0FFF);
4905                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_49_L, u16Val, 0x0FFF);
4906                 break;
4907         }
4908     }
4909     else
4910     {
4911         switch(eVop_Channel)
4912         {
4913             default:
4914             case XC_VOP_CHR:
4915                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4A_L, u16Val, 0x0FFF);
4916                 break;
4917             case XC_VOP_CHG:
4918                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4B_L, u16Val, 0x0FFF);
4919                 break;
4920             case XC_VOP_CHB:
4921                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4C_L, u16Val, 0x0FFF);
4922                 break;
4923             case XC_VOP_ALL:
4924                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4A_L, u16Val, 0x0FFF);
4925                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4B_L, u16Val, 0x0FFF);
4926                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4C_L, u16Val, 0x0FFF);
4927                 break;
4928         }
4929     }
4930 }
4931 
HAL_SC_VOP_Set_Brightness_En(void * pInstance,MS_BOOL bEenable,SCALER_WIN eWindow)4932 void HAL_SC_VOP_Set_Brightness_En(void *pInstance, MS_BOOL bEenable, SCALER_WIN eWindow)
4933 {
4934     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4935     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4936     if(eWindow == MAIN_WINDOW)
4937     {
4938         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_53_L, (MS_U16)(bEenable?BIT(1):0), BIT(1));
4939     }
4940     else
4941     {
4942         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_53_L, (MS_U16)(bEenable?BIT(9):0), BIT(9));
4943     }
4944 }
HAL_SC_VOP_Set_Brightness_Value(void * pInstance,MS_XC_VOP_CHANNEL_t eVop_Channel,MS_U16 u16Val,SCALER_WIN eWindow)4945 void HAL_SC_VOP_Set_Brightness_Value(void *pInstance, MS_XC_VOP_CHANNEL_t eVop_Channel, MS_U16 u16Val, SCALER_WIN eWindow)
4946 {
4947     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4948     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4949     if(eWindow == MAIN_WINDOW)
4950     {
4951         switch(eVop_Channel)
4952         {
4953             default:
4954             case XC_VOP_CHR:
4955                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4D_L, u16Val, 0x07FF);
4956                 break;
4957             case XC_VOP_CHG:
4958                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4E_L, u16Val, 0x07FF);
4959                 break;
4960             case XC_VOP_CHB:
4961                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4F_L, u16Val, 0x07FF);
4962                 break;
4963             case XC_VOP_ALL:
4964                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4D_L, u16Val, 0x07FF);
4965                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4E_L, u16Val, 0x07FF);
4966                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_4F_L, u16Val, 0x07FF);
4967                 break;
4968         }
4969     }
4970     else
4971     {
4972         switch(eVop_Channel)
4973         {
4974             default:
4975             case XC_VOP_CHR:
4976                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_50_L, u16Val, 0x07FF);
4977                 break;
4978             case XC_VOP_CHG:
4979                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_51_L, u16Val, 0x07FF);
4980                 break;
4981             case XC_VOP_CHB:
4982                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_52_L, u16Val, 0x07FF);
4983                 break;
4984             case XC_VOP_ALL:
4985                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_50_L, u16Val, 0x07FF);
4986                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_51_L, u16Val, 0x07FF);
4987                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_52_L, u16Val, 0x07FF);
4988                 break;
4989         }
4990     }
4991 }
4992 
HAL_SC_Set_FB_Num(void * pInstance,SCALER_WIN eWindow,XC_FRAME_STORE_NUMBER enFBType,MS_BOOL bInterlace)4993 void HAL_SC_Set_FB_Num(void *pInstance, SCALER_WIN eWindow, XC_FRAME_STORE_NUMBER enFBType, MS_BOOL bInterlace)
4994 {
4995     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
4996     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
4997     MS_U8 u8FrameCount = 2;
4998 
4999     switch( enFBType )
5000     {
5001         case IMAGE_STORE_2_FRAMES:
5002             u8FrameCount = 2;
5003             break;
5004         case IMAGE_STORE_3_FRAMES:
5005             u8FrameCount = 3;
5006             break;
5007         case IMAGE_STORE_4_FRAMES:
5008             u8FrameCount = 4;
5009             break;
5010         case IMAGE_STORE_6_FRAMES:
5011             u8FrameCount = 6;
5012             break;
5013         case IMAGE_STORE_8_FRAMES:
5014             u8FrameCount = 8;
5015             break;
5016         case IMAGE_STORE_12_FRAMES:
5017             u8FrameCount = 12;
5018             break;
5019         default:
5020             break;
5021     }
5022 
5023     if (!bInterlace)
5024     {
5025         if (eWindow == MAIN_WINDOW)
5026         {
5027             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L, u8FrameCount , BITMASK(4:0) );
5028         }
5029         else
5030         {
5031             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_59_L, u8FrameCount , BITMASK(4:0) );
5032         }
5033     }
5034 }
5035 
HAL_SC_Enable_VInitFactor(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)5036 void HAL_SC_Enable_VInitFactor(void *pInstance, MS_BOOL bEnable,SCALER_WIN eWindow)
5037 {
5038     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5039     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5040     if (eWindow == MAIN_WINDOW)
5041         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_13_L, (MS_U16)(bEnable?BIT(0):0), BIT(0));
5042     else
5043         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_33_L, (MS_U16)(bEnable?BIT(0):0), BIT(0));
5044 }
5045 
HAL_SC_Set_VInitFactorOne(void * pInstance,MS_U32 u32Value,SCALER_WIN eWindow)5046 void HAL_SC_Set_VInitFactorOne(void *pInstance, MS_U32 u32Value,SCALER_WIN eWindow)
5047 {
5048     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5049     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5050     if (eWindow == MAIN_WINDOW)
5051         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_03_L, u32Value);
5052     else
5053         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_23_L, u32Value);
5054 }
5055 
HAL_SC_Set_VInitFactorTwo(void * pInstance,MS_U32 u32Value,SCALER_WIN eWindow)5056 void HAL_SC_Set_VInitFactorTwo(void *pInstance, MS_U32 u32Value,SCALER_WIN eWindow)
5057 {
5058     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5059     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5060     if (eWindow == MAIN_WINDOW)
5061         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_05_L, u32Value);
5062     else
5063         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_25_L, u32Value);
5064 }
5065 
HAL_SC_Set_vsd_output_line_count(void * pInstance,MS_BOOL bEnable,MS_U32 u32LineCount,SCALER_WIN eWindow)5066 void HAL_SC_Set_vsd_output_line_count(void *pInstance, MS_BOOL bEnable,MS_U32 u32LineCount,SCALER_WIN eWindow)
5067 {
5068     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5069     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5070     MS_U16 u16OutputLineCount = 0x00;
5071 
5072     if (bEnable)
5073     {
5074         u16OutputLineCount = BIT(15);
5075         u16OutputLineCount |= (MS_U16)(u32LineCount & 0x1FFF);
5076     }
5077 
5078     if (eWindow == MAIN_WINDOW)
5079     {
5080         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_37_L, u16OutputLineCount);
5081     }
5082     else
5083     {
5084         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_37_L, u16OutputLineCount);
5085     }
5086 
5087 }
5088 
5089 /*
5090  bEnable : Enable input line count.
5091  bUserMode : 1 -> the input line count will ref u32UserLineCount
5092                    0 -> the input line count will ref V capture win
5093 */
HAL_SC_Set_vsd_input_line_count(void * pInstance,MS_BOOL bEnable,MS_BOOL bUserMode,MS_U32 u32UserLineCount,SCALER_WIN eWindow)5094 void HAL_SC_Set_vsd_input_line_count(void *pInstance, MS_BOOL bEnable,MS_BOOL bUserMode,MS_U32 u32UserLineCount,SCALER_WIN eWindow)
5095 {
5096     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5097     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5098     MS_U16 u16InputLineCount = 0x00;
5099 
5100     if (bEnable)
5101     {
5102         u16InputLineCount = BIT(15);
5103 
5104         if (bUserMode)
5105         {
5106             u16InputLineCount |= BIT(14);
5107             u16InputLineCount |= (MS_U16)(u32UserLineCount & 0x1FFF);
5108         }
5109     }
5110 
5111     if (eWindow == MAIN_WINDOW)
5112     {
5113         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_36_L, u16InputLineCount);
5114     }
5115     else
5116     {
5117         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK04_36_L, u16InputLineCount);
5118     }
5119 
5120 }
5121 
Hal_SC_CheckSubWinPreScaling(MS_U16 u16ScaleDst,MS_BOOL bInterlace)5122 MS_U32 Hal_SC_CheckSubWinPreScaling(MS_U16 u16ScaleDst,MS_BOOL bInterlace)
5123 {
5124     UNUSED(u16ScaleDst);
5125     UNUSED(bInterlace);
5126     //New chip sub window unnecessary to the same with the main window's pre scaling setting.
5127     return 0;
5128 }
5129 
HAL_SC_FilmMode_Patch1(void * pInstance)5130 void HAL_SC_FilmMode_Patch1(void *pInstance)
5131 {
5132 #if 1
5133     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5134     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5135     MS_U16 u16Value;
5136     MS_U16 u16RegValue;
5137     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5138     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5139 
5140     u16RegValue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK22_7D_L, 0xFF);
5141     if(pXCResourcePrivate->sthal_SC.g_bCntFlg)
5142         pXCResourcePrivate->sthal_SC.g_u16TmpValue = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_02_L, 0xFF);
5143 
5144     if(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_21_L, BIT(6)))
5145     {
5146         //Counter
5147         if(pXCResourcePrivate->sthal_SC.u8Time_count != 0xFF)
5148             pXCResourcePrivate->sthal_SC.u8Time_count ++;
5149 
5150         if(pXCResourcePrivate->sthal_SC.u8Time_count < u16RegValue)  // fake out duration
5151             u16Value = 0x06;      // madi fake out enable
5152         else
5153             u16Value = 0x00;      // madi fake out disable
5154 
5155         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_25_L, (0x10<<8), 0xFF00);
5156         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_02_L, 0x22, 0xFF);
5157         pXCResourcePrivate->sthal_SC.g_bCntFlg = 0;
5158     }
5159     else
5160     {
5161         pXCResourcePrivate->sthal_SC.u8Time_count = 0;
5162         u16Value = 0x00;      // madi fake out disable
5163         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_25_L, (0x08<<8), 0xFF00);
5164         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_02_L, pXCResourcePrivate->sthal_SC.g_u16TmpValue, 0xFF);
5165         pXCResourcePrivate->sthal_SC.g_bCntFlg = 1;
5166     }
5167     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0A_21_L, u16Value, BIT(2)|BIT(1));
5168 
5169 #else
5170     MS_U8 u8Bank, u8Value;
5171     MS_U8 u8RegValue;
5172 
5173     static MS_U8 u8Time_count = 0;
5174 
5175     MDrv_WriteByte(BK_SELECT_00, REG_BANK_MADI); //bk22
5176     u8RegValue = MDrv_ReadByte(L_BK_MADI(0x7D));
5177 
5178     MDrv_WriteByte(BK_SELECT_00, REG_BANK_FILM);
5179 
5180 
5181     if(MDrv_ReadRegBit(L_BK_FILM(0x21), BIT(6)))
5182     {
5183         //Counter
5184         if(u8Time_count != 0xFF)
5185             u8Time_count ++;
5186 
5187         if(u8Time_count < u8RegValue)  // fake out duration
5188             u8Value = 0x06;      // madi fake out enable
5189         else
5190             u8Value = 0x00;      // madi fake out disable
5191 
5192         MDrv_WriteByte(H_BK_FILM(0x25), 0x10);
5193 
5194     }
5195     else
5196     {
5197         u8Time_count = 0;
5198         u8Value = 0x00;      // madi fake out disable
5199         MDrv_WriteByte(H_BK_FILM(0x25), 0x08);
5200     }
5201 
5202     MDrv_WriteByteMask(L_BK_FILM(0x21), u8Value, BIT(2)|BIT(1));
5203     MDrv_WriteByte(BK_SELECT_00, u8Bank);
5204 #endif
5205 }
5206 
HAL_SC_EnableFPLL(void)5207 void HAL_SC_EnableFPLL(void)
5208 {
5209     MDrv_WriteByteMask(L_BK_LPLL(0x0C), BIT(3), BIT(3));
5210     MDrv_WriteByteMask(L_BK_LPLL(0x0C),      0, BIT(6));
5211 }
5212 
5213 
_HAL_SC_GetFPLLPhaseDiffISR(SC_INT_SRC eIntNum,void * pParam)5214 static void _HAL_SC_GetFPLLPhaseDiffISR(SC_INT_SRC eIntNum, void *pParam)
5215 {
5216     volatile MS_XC_GET_FPLL_PHASEDIFF * pFpllPhaseDiff = (volatile MS_XC_GET_FPLL_PHASEDIFF *) pParam;
5217 
5218     pFpllPhaseDiff->u16PhaseDiff = MDrv_Read2Byte(L_BK_LPLL(0x11));
5219     pFpllPhaseDiff->eFpllDir = (MDrv_Read2Byte(L_BK_LPLL(0x12)) & BIT(0)) == BIT(0) ? E_XC_FPLL_DIR_UP : E_XC_FPLL_DIR_DOWN;
5220     pFpllPhaseDiff->u8Debounce++;
5221 
5222     if(pFpllPhaseDiff->u8Debounce > 3)
5223     {
5224         if(pFpllPhaseDiff->u16PhaseDiff < 0x200)
5225         {
5226             pFpllPhaseDiff->eFpllResult = E_XC_FPLL_RES_FINISHED;
5227         }
5228         else
5229         {
5230             if(pFpllPhaseDiff->u8Debounce > 90)
5231             {
5232                 pFpllPhaseDiff->eFpllResult = E_XC_FPLL_RES_TIMEOUT;
5233             }
5234         }
5235     }
5236 }
5237 
HAL_SC_WaitFPLLDone(void * pInstance)5238 MS_BOOL HAL_SC_WaitFPLLDone(void *pInstance)
5239 {
5240     MS_XC_GET_FPLL_PHASEDIFF stGetFpllPhaseDiff = {0, 0, E_XC_FPLL_DIR_UNKNOWN, E_XC_FPLL_RES_WAITING};
5241 
5242     MDrv_XC_InterruptAttach(pInstance, SC_INT_VSINT, _HAL_SC_GetFPLLPhaseDiffISR, (void *) &stGetFpllPhaseDiff);
5243     while(*(volatile MS_BOOL*)(&(stGetFpllPhaseDiff.eFpllResult)) == E_XC_FPLL_RES_WAITING);
5244     MDrv_XC_InterruptDeAttach(pInstance, SC_INT_VSINT, _HAL_SC_GetFPLLPhaseDiffISR, (void *) &stGetFpllPhaseDiff);
5245 
5246     if(stGetFpllPhaseDiff.eFpllResult == E_XC_FPLL_RES_FINISHED)
5247     {
5248         return TRUE;
5249     }
5250     else
5251     {
5252         return FALSE;
5253     }
5254 }
5255 
HAL_SC_GetOutputVFreqX100(MS_U32 u32XTAL_Clock)5256 MS_U16 HAL_SC_GetOutputVFreqX100(MS_U32 u32XTAL_Clock)
5257 {
5258     return ((MS_U16) ((u32XTAL_Clock * 100) / MDrv_Read4Byte(L_BK_LPLL(0x23))));
5259 }
5260 
5261 //Line buffer offset between Main and Sub, MAX(Main+Sub) = 1920+960
5262 //Main Win Line buffer offset , start from max size of main's
HAL_SC_SetMainLineBufferOffset(void * pInstance,MS_U16 u16Linebuffer)5263 void HAL_SC_SetMainLineBufferOffset(void *pInstance, MS_U16 u16Linebuffer)
5264 {
5265     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5266     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5267     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_12_L, u16Linebuffer);
5268 }
5269 
5270 //Line buffer offset between Main and Sub, MAX(Main+Sub) = 1920+960
5271 //Sub Win Line buffer offset , start from max size of main's
HAL_SC_SetSubLineBufferOffset(void * pInstance,MS_U16 u16Linebuffer)5272 void HAL_SC_SetSubLineBufferOffset(void *pInstance, MS_U16 u16Linebuffer)
5273 {
5274     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5275     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5276     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_13_L, u16Linebuffer);
5277 }
5278 
5279 //Select the trig mode
5280 //0: Line base(Line Buffer Mode)
5281 //1: Fill line buffer(Ring Buffer Mode)
HAL_SC_SetDisplay_LineBuffer_Mode(void * pInstance,MS_BOOL bEnable)5282 void HAL_SC_SetDisplay_LineBuffer_Mode(void *pInstance, MS_BOOL bEnable)
5283 {
5284     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5285     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5286     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1F_L, (bEnable ? BIT(4) : 0), BIT(4));
5287 }
5288 
5289 //Select the start mode
5290 //0: start at advance 1 display line
5291 //1: start at faling edge of Vsync_init
HAL_SC_SetDisplay_Start_Mode(void * pInstance,MS_BOOL bEnable)5292 void HAL_SC_SetDisplay_Start_Mode(void *pInstance, MS_BOOL bEnable)
5293 {
5294     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5295     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5296     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_1F_L, (bEnable ? BIT(5) : 0), BIT(5));
5297 }
5298 
5299 //bk20_10[10]: Fill the main window's line buffer in vertical blanking for pip left and up corner
5300 //bk20_10[11]: Fill the sub window's line buffer in vertical blanking for pip left and down corner
HAL_SC_FillLineBuffer(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)5301 void HAL_SC_FillLineBuffer(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
5302 {
5303     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5304     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5305     if(bEnable)
5306     {
5307         if(eWindow == MAIN_WINDOW)
5308             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(10), BIT(10));
5309         else
5310             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(11), BIT(11));
5311     }
5312     else
5313     {
5314         if(eWindow == MAIN_WINDOW)
5315             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0, BIT(10));
5316         else
5317             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0, BIT(11));
5318     }
5319 }
5320 
Hal_SC_enable_window(void * pInstance,MS_BOOL bEn,SCALER_WIN eWindow)5321 void Hal_SC_enable_window(void *pInstance, MS_BOOL bEn,SCALER_WIN eWindow)
5322 {
5323     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5324     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5325     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5326     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5327 
5328     if (eWindow == MAIN_WINDOW)
5329     {
5330         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, bEn ? BIT(0) : 0, BIT(0));
5331 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
5332         if (psXCInstPri->u32DeviceID == 1)
5333         {
5334             // PIP enable need disable pixelshift
5335             if (bEn)
5336             {
5337                 MHal_XC_PixelShiftStatusChange(g_pDevice0Instance, EN_XC_PIXEL_SHIFT_DISABLE);
5338             }
5339 
5340             // set SC1 auto no signal by SC1 control
5341             SC_W2BYTEMSK(0, REG_SC_BK11_07_L, bEn ? BIT(5) : 0, BIT(5));
5342 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
5343             if (Hal_SC_3D_IsDualViewMode(pInstance, eWindow))
5344             {
5345                 SC_W2BYTEMSK(0, REG_SC_BK20_10_L, bEn ? BIT(1) : 0, BIT(1));
5346             }
5347             else
5348 #endif
5349             {
5350                 SC_W2BYTEMSK(0, REG_SC_BK20_10_L, bEn ? BIT(2)|BIT(1) : 0, BIT(2)|BIT(1));
5351                 SC_W2BYTEMSK(0, REG_SC_BK68_40_L, bEn ? BIT(4) : 0, BIT(4));
5352             }
5353             SC_W2BYTEMSK(0, REG_SC_BK46_3F_L, bEn ? 0 : BIT(0), BIT(0));
5354             //MDrv_WriteRegBit(REG_CLKGEN2_BASE + 0x87, bEn ? TRUE : FALSE, BIT(1));//FIXME:patch for PIP
5355         }
5356 #endif
5357     }
5358     else
5359     {
5360         // Sub prefill line must be enable, when PIP on (enable input source of sub win)
5361         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, BIT(11) , BIT(11));
5362         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, bEn ? BIT(1) : 0, BIT(1));
5363         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK58_10_L, bEn ? BIT(0) : 0, BIT(0));
5364         if(!bEn)
5365         {
5366             //disable sc0 sub,fsc sub de should recover default value
5367             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
5368             {
5369                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_10_L, 0x3FFF, 0x3FFF);
5370                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_11_L, 0x3FFF, 0x3FFF);
5371                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_12_L, 0x1FFF, 0x1FFF);
5372                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_13_L, 0x1FFF, 0x1FFF);
5373             }
5374         }
5375     }
5376 }
5377 
_Hal_SC_GetInputVPeriod(void * pInstance,SCALER_WIN eWindow)5378 static MS_U16 _Hal_SC_GetInputVPeriod(void *pInstance, SCALER_WIN eWindow)
5379 {
5380     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5381     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5382     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5383     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5384     MS_U16 u16VFreq = gSrcInfo[eWindow].u16InputVFreq * 10;
5385     SC_DBG(printf("(100000+u16VFreq/2)/u16VFreq)=%u, u16VFreq=%u\n",((100000+u16VFreq/2)/u16VFreq), u16VFreq));
5386     if(u16VFreq == 0)
5387     {
5388         return 0;
5389     }
5390     else
5391     {
5392         return ((100000+u16VFreq/2)/u16VFreq); //Period = 1000/(vfreq/100)
5393     }
5394 }
5395 
Hal_SC_enable_window_burst(void * pInstance,MS_BOOL bEn,SCALER_WIN eWindow)5396 void Hal_SC_enable_window_burst(void *pInstance, MS_BOOL bEn,SCALER_WIN eWindow)
5397 {
5398     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5399     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5400     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5401     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5402     _MLOAD_ENTRY(pInstance);
5403     if (eWindow == MAIN_WINDOW)
5404     {
5405         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, bEn ? BIT(0) : 0, BIT(0));
5406 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
5407         void *pInstanceTmp = NULL;
5408         if (psXCInstPri->u32DeviceID == 1)
5409         {
5410             pInstanceTmp = pInstance;  // store instance 0
5411             pInstance = g_pDevice0Instance; //switch to instance 1
5412             UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5413             // PIP enable need disable pixelshift
5414             if (bEn)
5415             {
5416                 MHal_XC_PixelShiftStatusChange(pInstanceTmp, EN_XC_PIXEL_SHIFT_DISABLE);
5417             }
5418             // set SC1 auto no signal by SC1 control
5419             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK11_07_L, bEn ? BIT(5) : 0, BIT(5));
5420 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
5421             if (Hal_SC_3D_IsDualViewMode(pInstance, eWindow))//FIXME: Manhattan dual view patch
5422             {
5423                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, bEn ? BIT(1) : 0, BIT(2)|BIT(1));
5424             }
5425             else
5426 #endif
5427             {
5428                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, bEn ? BIT(2)|BIT(1) : 0, BIT(2)|BIT(1));
5429                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_40_L, bEn ? BIT(4) : 0, BIT(4));
5430             }
5431             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3F_L, bEn ? 0 : BIT(0), BIT(0));
5432             //MDrv_WriteRegBit(REG_CLKGEN2_BASE + 0x87, bEn ? TRUE : FALSE, BIT(1));//FIXME:patch for PIP
5433             pInstance = pInstanceTmp;  // restore instance 0
5434         }
5435 
5436 #endif
5437 
5438         MDrv_XC_MLoad_Fire(pInstance, TRUE);
5439     }
5440     else
5441     {
5442         if(bEn == TRUE)
5443         {
5444             MS_U16 u16extra_req = 0;
5445             MS_U16 u16Delaytime = 0;
5446 
5447             // When Main is foreground, sub is background, extra must enable.
5448             u16extra_req = 0x01;
5449 
5450             if(Hal_SC_is_extra_req_en(pInstance, NULL, NULL , NULL , NULL))
5451             {
5452                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, BIT(15), BIT(15));
5453                 u16extra_req = u16extra_req | 0x8000;
5454             }
5455 
5456             // HW PIP architeucture
5457             // Becasue BK3_02[8] and BK20_11[15] should enable together, otherwise garbage will be showed,
5458             // we need to use BK12_47[0] to instead. And the default value of BK3_02[8] is 1. So, we need
5459             // to set it to 0 in this function.
5460             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, u16extra_req , 0x800F);
5461             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_02_L, 0, 0x0080);
5462 
5463             // Sub prefill line must be enable, when PIP on (enable input source of sub win)
5464             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, BIT(11), BIT(11) );
5465             MDrv_XC_MLoad_Fire(pInstance, TRUE);
5466             //if we let REG_SC_BK20_10_L[1] to enable with other register settings in the same menuload fire
5467             //it will produce a rectangular horizontal noise. so we move outside to let those register settings
5468             //to be set first then let REG_SC_BK20_10_L[1] on.
5469 
5470             //betwen REG_SC_BK03_02_L[7] and REG_SC_BK20_10_L[1], we need to delay time of wr mapping mode,
5471             // to let the data fill in xc sub buffer
5472             u16Delaytime = _Hal_SC_GetInputVPeriod(pInstance, eWindow) * (Hal_SC_Get_WR_Bank_Mapping(pInstance, eWindow) + 1);
5473             MsOS_DelayTask(u16Delaytime);
5474 
5475             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, BIT(1), BIT(1));
5476             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK58_10_L, BIT(0), BIT(0));
5477 
5478             MDrv_XC_MLoad_Fire(pInstance, TRUE);
5479         }
5480         else
5481         {
5482             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK58_10_L, 0, BIT(0));
5483             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, 0, BIT(1));
5484             //disable sc0 sub,fsc sub de should recover default value
5485             if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFSCEnabled)
5486             {
5487                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_10_L, 0x3FFF, 0x3FFF);
5488                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_11_L, 0x3FFF, 0x3FFF);
5489                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_12_L, 0x1FFF, 0x1FFF);
5490                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_13_L, 0x1FFF, 0x1FFF);
5491             }
5492             MDrv_XC_MLoad_Fire(pInstance, TRUE);
5493             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK03_02_L, 0x0080, 0x0080);
5494             MDrv_XC_MLoad_Fire(pInstance, TRUE);
5495         }
5496     }
5497 
5498     _MLOAD_RETURN(pInstance);
5499 }
5500 
Hal_SC_set_trigger_signal(void)5501 void Hal_SC_set_trigger_signal(void)
5502 {
5503     // only used in U4
5504 }
5505 
Hal_SC_Set_OSD2VE(void * pInstance,EN_VOP_SEL_OSD_XC2VE_MUX eVOPSelOSD_MUX)5506 void Hal_SC_Set_OSD2VE(void *pInstance, EN_VOP_SEL_OSD_XC2VE_MUX  eVOPSelOSD_MUX)
5507 {
5508     UNUSED(eVOPSelOSD_MUX);
5509 }
5510 
Hal_SC_IsOPMFetchPatch_Enable(void)5511 MS_BOOL Hal_SC_IsOPMFetchPatch_Enable(void)
5512 {
5513     //Patch for Janus u01 and T4 U01/02: OPMFetch need +2
5514     return FALSE;
5515 }
Hal_SC_Check_HNonLinearScaling(void * pInstance)5516 MS_BOOL Hal_SC_Check_HNonLinearScaling(void *pInstance)
5517 {
5518     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5519     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5520     MS_U16 u16Offset = (SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_15_L)>>8);
5521     MS_U16 u16MaxOffset = ((SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_07_L) & 0xFFFFFF)>>12);
5522     //Non-Linear scaling Postive offset, the maximum offset is HPstRatio[23:12]
5523     if(((u16Offset & BIT(7)) == 0) && (u16Offset > u16MaxOffset))
5524     {
5525         return FALSE;
5526     }
5527     return TRUE;
5528 }
5529 
5530 //IP2 Pre-Filter enable
Hal_SC_IP2_PreFilter_Enable(void * pInstance,MS_BOOL bEnable)5531 void Hal_SC_IP2_PreFilter_Enable(void* pInstance, MS_BOOL bEnable)
5532 {
5533     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5534     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5535     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_48_L, (bEnable?BIT(15):0), BIT(15));
5536 }
5537 
Hal_SC_Set_extra_fetch_line(void * pInstance,MS_U8 u8val)5538 void Hal_SC_Set_extra_fetch_line(void *pInstance, MS_U8 u8val)
5539 {
5540     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5541     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5542     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_17_L, ((MS_U16)(u8val & 0x0F))<<8, 0x0F00);
5543 }
5544 
Hal_SC_Set_extra_adv_line(void * pInstance,MS_U8 u8val)5545 void Hal_SC_Set_extra_adv_line(void *pInstance, MS_U8 u8val)
5546 {
5547     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5548     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5549     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_17_L, ((MS_U16)(u8val & 0x0F))<<12, 0xF000);
5550 }
5551 
HAL_SC_Set_FPLL_Limit(void * pInstance,MS_U32 * u32PllSet,MS_U32 u32LowBound,MS_U32 u32UpBound,MS_BOOL _bInFPLLDbgMode,MS_U32 _U32LimitD5D6D7)5552 void HAL_SC_Set_FPLL_Limit(void *pInstance, MS_U32 *u32PllSet, MS_U32 u32LowBound, MS_U32 u32UpBound, MS_BOOL _bInFPLLDbgMode, MS_U32 _U32LimitD5D6D7)
5553 {
5554     MS_U32 u32LpllLimitLow, u32LpllLimitHigh;
5555     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5556     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5557     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5558     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5559     //printf("Fpll_Limit: Set %lx, bound (%lx -> %lx)\n", *u32PllSet, u32UpBound, u32LowBound);
5560 
5561     if(_bInFPLLDbgMode)
5562     {
5563         MDrv_WriteByteMask(L_BK_LPLL(0x0D), 0x00, BIT(4));          // turn off 2 limit
5564         if(!pXCResourcePrivate->stdrvXC_MVideo._SContext.bEnableFPLLManualDebug)
5565         {
5566             MDrv_Write3Byte(L_BK_LPLL(0x06), _U32LimitD5D6D7);
5567         }
5568     }
5569     else
5570     {
5571         MDrv_WriteByteMask(L_BK_LPLL(0x0D), BIT(4), BIT(4));        // turn on 2 limit
5572 
5573         // check if u32PllSet out of range and also the FPLL limit
5574         if (*u32PllSet <= u32LowBound)
5575         {
5576             *u32PllSet = u32LowBound;
5577             gSrcInfo[MAIN_WINDOW].bEnableFPLL = FALSE;
5578         }
5579         else if (*u32PllSet >= u32UpBound)
5580         {
5581             *u32PllSet = u32UpBound;
5582             gSrcInfo[MAIN_WINDOW].bEnableFPLL = FALSE;
5583         }
5584 
5585         u32LpllLimitHigh = u32UpBound - *u32PllSet;
5586         u32LpllLimitLow = *u32PllSet - u32LowBound - 1;
5587 
5588 #if (HW_DESIGN_HDMITX_VER == 1)//Maserati +Raptor HDMITX case
5589         if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_B & E_XC_INIT_MISC_B_HDMITX_ENABLE)
5590         {
5591             u32LpllLimitHigh = 0x1600;
5592             u32LpllLimitLow = 0x1600;
5593         }
5594 #endif
5595         //printf("Fpll set %lx, limit (high %lx, low %lx)\n", *u32PllSet, u32LpllLimitHigh, u32LpllLimitLow);
5596 
5597         if(!pXCResourcePrivate->stdrvXC_MVideo._SContext.bEnableFPLLManualDebug)
5598         {
5599             MDrv_Write3Byte(L_BK_LPLL(0x06), u32LpllLimitHigh);
5600             MDrv_Write3Byte(L_BK_LPLL(0x08), u32LpllLimitLow);
5601         }
5602 
5603         //printf("Fpll limit reg (high %lx, low %lx)\n", MDrv_Read4Byte(L_BK_LPLL(0x06)), MDrv_Read4Byte(L_BK_LPLL(0x08)));
5604     }
5605 }
5606 
Hal_XC_H3D_Enable(void * pInstance,MS_BOOL bEn)5607 void Hal_XC_H3D_Enable(void *pInstance, MS_BOOL bEn)
5608 {
5609     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5610     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5611     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_70_L, (bEn<<15), (BIT(15)));
5612 }
5613 
Hal_XC_H3D_Input3DType(void * pInstance,E_XC_3D_INPUT_MODE e3DType)5614 void Hal_XC_H3D_Input3DType(void *pInstance, E_XC_3D_INPUT_MODE e3DType)
5615 {
5616     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5617     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5618     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_7B_L, (e3DType), (BIT(1) | BIT(0)));
5619 }
5620 
Hal_XC_H3D_Breakline_Enable(void * pInstance,MS_BOOL bEn)5621 void Hal_XC_H3D_Breakline_Enable(void *pInstance, MS_BOOL bEn)
5622 {
5623     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5624     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5625     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_7B_L, (bEn<<7), (BIT(7)));
5626     if(bEn)
5627     {
5628         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_7B_L, (8<<8), HBMASK);
5629     }
5630     else
5631     {
5632         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_7B_L, (0<<8), HBMASK);
5633     }
5634 }
5635 
Hal_XC_H3D_HDE(void * pInstance,MS_U16 u16Hde)5636 void Hal_XC_H3D_HDE(void *pInstance, MS_U16 u16Hde)
5637 {
5638     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5639     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5640     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_71_L, (u16Hde), 0x0FFF);
5641 }
5642 
Hal_XC_H3D_VDE_F0(MS_U16 u16Vde)5643 void Hal_XC_H3D_VDE_F0(MS_U16 u16Vde)
5644 {
5645     SC_W2BYTEMSK(0, REG_SC_BK01_73_L, (u16Vde), 0x0FFF);
5646 }
5647 
Hal_XC_H3D_VDE_F2(MS_U16 u16Vde)5648 void Hal_XC_H3D_VDE_F2(MS_U16 u16Vde)
5649 {
5650     SC_W2BYTEMSK(0, REG_SC_BK01_77_L, (u16Vde), 0x0FFF);
5651 }
5652 
Hal_XC_H3D_HBLANK(MS_U16 u16Hblank)5653 void Hal_XC_H3D_HBLANK(MS_U16 u16Hblank)
5654 {
5655     SC_W2BYTEMSK(0, REG_SC_BK01_70_L, (u16Hblank), 0x03FF);
5656 }
5657 
Hal_XC_H3D_INIT_VBLANK(MS_U8 u8Vblank)5658 void Hal_XC_H3D_INIT_VBLANK(MS_U8 u8Vblank)
5659 {
5660     SC_W2BYTEMSK(0, REG_SC_BK01_72_L, (u8Vblank), LBMASK);
5661 }
5662 
Hal_XC_H3D_VBLANK0(MS_U8 u8Vblank)5663 void Hal_XC_H3D_VBLANK0(MS_U8 u8Vblank)
5664 {
5665     SC_W2BYTEMSK(0, REG_SC_BK01_74_L, (u8Vblank), LBMASK);
5666 }
5667 
Hal_XC_H3D_VBLANK1(MS_U8 u8Vblank)5668 void Hal_XC_H3D_VBLANK1(MS_U8 u8Vblank)
5669 {
5670     SC_W2BYTEMSK(0, REG_SC_BK01_76_L, (u8Vblank), LBMASK);
5671 }
5672 
Hal_XC_H3D_VBLANK2(MS_U8 u8Vblank)5673 void Hal_XC_H3D_VBLANK2(MS_U8 u8Vblank)
5674 {
5675     SC_W2BYTEMSK(0, REG_SC_BK01_78_L, (u8Vblank), LBMASK);
5676 }
5677 
Hal_XC_H3D_VSYNC_WIDTH(MS_U8 u8Width)5678 void Hal_XC_H3D_VSYNC_WIDTH(MS_U8 u8Width)
5679 {
5680     SC_W2BYTEMSK(0, REG_SC_BK01_7A_L, (u8Width), 0x001F);
5681 }
5682 
Hal_XC_H3D_VSYNC_POSITION(MS_U16 u16Position)5683 void Hal_XC_H3D_VSYNC_POSITION(MS_U16 u16Position)
5684 {
5685     SC_W2BYTEMSK(0, REG_SC_BK01_7A_L, (u16Position), HBMASK);
5686 }
5687 
Hal_XC_H3D_SELECT_REGEN_TIMING(MS_BOOL bEn)5688 void Hal_XC_H3D_SELECT_REGEN_TIMING(MS_BOOL bEn)
5689 {
5690     SC_W2BYTEMSK(0, REG_SC_BK01_7B_L, (bEn<<4), (BIT(4)));
5691 }
5692 
Hal_XC_H3D_LR_Toggle_Enable(void * pInstance,MS_BOOL bEn,MS_BOOL b2DTo3D,MS_BOOL bSkipDefaultLRFlag)5693 void Hal_XC_H3D_LR_Toggle_Enable(void *pInstance, MS_BOOL bEn, MS_BOOL b2DTo3D, MS_BOOL bSkipDefaultLRFlag)
5694 {
5695     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5696     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5697     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5698     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5699 
5700     if(!bSkipDefaultLRFlag)
5701     {
5702         if(bEn)
5703         {
5704             //Enanble I2S_IN_SD to send out lr flag
5705             MDrv_WriteByteMask(0x101E24, 0x00, BIT(4)|BIT(5)|BIT(6));
5706             MDrv_WriteByteMask(0x101EC9, 0x00, BIT(0)|BIT(1));
5707             MDrv_WriteByteMask(0x101EDC, 0x00, BIT(2));
5708             MDrv_WriteByteMask(0x101EB3, 0xC0, 0xC0);
5709             // after timing change , hw must do  L/R alignment,BK12, 33[2]=1 to enable it.
5710             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(2), BIT(2));
5711         }
5712         else
5713         {
5714             MDrv_WriteByteMask(0x101EB3, 0x00, 0xC0);
5715             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(2));
5716         }
5717     }
5718 
5719     ///3D lr flag selection: RD's advice
5720     ///{BK20_24[13], BK20_24[11], BK20_24[1:0]}
5721     ///4'b0100: source 3D + FB
5722     ///4'b0101: source 3D + RFBL
5723     ///4'b0111: 2D to 3D
5724     ///4'b1000: FRC on : controlled by Hal_XC_Enable_FRC_3D_LR_Flag.
5725     if(bEn)
5726     {
5727         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, BIT(11), BIT(11));        //Output 3D L/R selection
5728         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, (bEn<<8), (BIT(8))); //enable Enable free run 3D LR flag: if disable, when image freezed,the output is always L or always R.
5729         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, (bEn<<1), (BIT(1)));//L first,
5730 
5731         if(b2DTo3D)
5732         {
5733             if(pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA)//output FA_LLRR for 4k0.5k@240Hz
5734             {
5735                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, 0x00, BIT(0)|BIT(1));
5736             }
5737             else
5738             {
5739                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, BIT(0)|BIT(1), BIT(0)|BIT(1));
5740                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, BIT(11), (BIT(11)));
5741             }
5742             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, BIT(15), BIT(15));///2Dto3D LR flag enable
5743         }
5744         else
5745         {
5746             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, 0x00, BIT(0)|BIT(1));
5747         }
5748     }
5749     else
5750    {
5751         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, 0x0000, BIT(0)|BIT(1)|BIT(11));        //Output 3D L/R selection
5752         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0, (BIT(8))); //enable Enable free run 3D LR flag
5753         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, (BIT(1)));
5754         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_33_L, 0, BIT(15));
5755         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_30_L, 0, (BIT(11)));
5756     }
5757 }
5758 
Hal_SC_3D_Enable_FRC_LR_Flag(void * pInstance,MS_BOOL bEnable)5759 void Hal_SC_3D_Enable_FRC_LR_Flag(void *pInstance, MS_BOOL bEnable)
5760 {
5761     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5762     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5763     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5764     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5765 
5766     //BK20_24[13] = 1: use FRC LR flag, BK20_24[13] = 0: use scaler LR flag
5767     if(bEnable)//FRC 3D enabled
5768     {
5769         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, BIT(13), BIT(13));
5770     }
5771     else
5772     {
5773         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_24_L, 0, BIT(13));
5774     }
5775 }
5776 
HAL_XC_H3D_OPM_SBYS_PIP_Enable(void * pInstance,MS_BOOL bEn)5777 void HAL_XC_H3D_OPM_SBYS_PIP_Enable(void *pInstance, MS_BOOL bEn)
5778 {
5779     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5780     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5781     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_34_L, (bEn<<7), (BIT(7)));
5782 }
5783 
Hal_SC_enable_cursor_report(void * pInstance,MS_BOOL bEn)5784 void Hal_SC_enable_cursor_report(void *pInstance, MS_BOOL bEn)
5785 {
5786     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5787     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5788     if(bEn)
5789     {
5790         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, BIT(8) | BIT(10), BIT(8) | BIT(10));
5791     }
5792     else
5793     {
5794         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, 0x00 , BIT(8) | BIT(10));
5795     }
5796 }
5797 
Hal_SC_get_pixel_rgb(void * pInstance,XC_Get_Pixel_RGB * pData)5798 MS_BOOL Hal_SC_get_pixel_rgb(void *pInstance, XC_Get_Pixel_RGB *pData)
5799 {
5800     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5801     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5802     MS_BOOL bret = TRUE;
5803 
5804     switch(pData->enStage)
5805     {
5806         case E_XC_GET_PIXEL_STAGE_AFTER_DLC:
5807             //SC_W2BYTEMSK(0, REG_SC_BK0F_46_L, 0x00 , BMASK(3:0));
5808             bret = FALSE;//Not support, Must set to stage C for HW issue
5809             break;
5810         case E_XC_GET_PIXEL_STAGE_PRE_GAMMA:
5811             //SC_W2BYTEMSK(0, REG_SC_BK0F_46_L, 0x08, BMASK(3:0));
5812             bret = FALSE;//Not support, Must set to stage C for HW issue
5813             break;
5814         case E_XC_GET_PIXEL_STAGE_AFTER_OSD:
5815             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_18_L, 0x0D, 0xFF);
5816             break;
5817         default:
5818             bret = FALSE;
5819             break;
5820     }
5821     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5822     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5823     if(bret)
5824     {
5825         // Enable
5826         if(!pXCResourcePrivate->stdrvXC_MVideo.s_bKeepPixelPointerAppear)
5827         {
5828             Hal_SC_enable_cursor_report(pInstance, TRUE);
5829         }
5830 
5831         // Initial position (x,y)  Set point you want to read.
5832         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_19_L, pData->u16x);
5833         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_1A_L, pData->u16y);
5834 
5835         //SW trigger for reading
5836         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_18_L, BIT(8), BIT(8));
5837         MsOS_DelayTask(5);
5838         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_18_L, 0, BIT(8));
5839         MsOS_DelayTask(32);  // Must wait .
5840 
5841         pData->u32r = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_2D_L);
5842         pData->u32g = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_2E_L);
5843         pData->u32b = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_2F_L);
5844 
5845         // Disable
5846         if(!pXCResourcePrivate->stdrvXC_MVideo.s_bKeepPixelPointerAppear)
5847         {
5848             Hal_SC_enable_cursor_report(pInstance, FALSE);
5849         }
5850     }
5851     return bret;
5852 }
5853 
Hal_SC_SetOPWriteOff(void * pInstance,MS_BOOL bEna)5854 void Hal_SC_SetOPWriteOff(void *pInstance, MS_BOOL bEna)
5855 {
5856     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5857     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5858     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5859     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5860 
5861     MS_BOOL u16OldReg = (MS_BOOL)(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_27_L, BIT(0)));
5862 
5863 #if (HW_DESIGN_4K2K_VER == 4)
5864     // For monaco new chip design, only Legacy mode need to control OPW
5865     // If Monaco mode, always keep OPW is on
5866     if ((psXCInstPri->u32DeviceID==0)
5867         && !(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Init_Misc.u32MISC_A & E_XC_INIT_MISC_A_LEGACY_MODE))
5868     {
5869         bEna = FALSE;
5870     }
5871 #endif
5872 
5873     if(u16OldReg != bEna)
5874     {
5875         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_27_L, bEna, BIT(0));//This will stop OPW only, OP memory write request still on
5876     }
5877 }
5878 
5879 
Hal_SC_GetOPWriteOff(void * pInstance)5880 MS_BOOL Hal_SC_GetOPWriteOff(void *pInstance)
5881 {
5882     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5883     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5884     return (MS_BOOL)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_27_L, BIT(0));
5885 }
5886 
Hal_SC_Detect_RequestFBL_Mode(void * pInstance)5887 MS_BOOL Hal_SC_Detect_RequestFBL_Mode(void *pInstance)
5888 {
5889     UNUSED(pInstance);
5890     return ENABLE_REQUEST_FBL;
5891 }
5892 
Hal_SC_Set_RequestFBL_Mode(void * pInstance,MS_BOOL bEn)5893 MS_BOOL Hal_SC_Set_RequestFBL_Mode(void *pInstance, MS_BOOL bEn)
5894 {
5895     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5896     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5897     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
5898     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
5899 
5900     if(IsSrcTypeDTV(gSrcInfo[MAIN_WINDOW].enInputSourceType) || (IsSrcTypeStorage(gSrcInfo[MAIN_WINDOW].enInputSourceType)))//MVOP source
5901     {
5902         gSrcInfo[MAIN_WINDOW].Status2.bMVOPHSKMode = bEn;
5903 
5904         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1C_L, bEn?BIT(14):0 , BIT(14)); //reg_short_1line_disable  1:Disable 0:Enable
5905         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_10_L, bEn?(BIT(0)|BIT(2)):0 , BIT(0)|BIT(2)); // Bit0: Enable HSK mode Bit2:reg_ip2_vs_sel 0:ip1 1:mvop
5906 
5907         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5D_L, 0x0828 , 0xFFFF);
5908         //this feature conflicts with HSK mode
5909         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_45_L, 0x0000, 0x9FFF); // edclk pd control start and edclk pd control enable
5910     }
5911     else
5912     {
5913         gSrcInfo[MAIN_WINDOW].Status2.bMVOPHSKMode = FALSE;
5914 
5915         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1C_L, 0x0 , BIT(14)); //reg_short_1line_disable  1:Disable 0:Enable
5916         // Disable HSK mode Bit0 Bit2 Bit5 in no-mvop case
5917         // BIT0: reg_mvop_din_en 1: data is form mvop 0: form yc delay
5918         // BIT2: reg_ip2_vs_sel  1: mvop 0:ip1
5919         // BIT5: reg_ip2_fd_sel  1: use mvop_field  0:use ip1_field
5920         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_10_L, 0x0 , BIT(0)|BIT(2)|BIT(5));
5921     }
5922 
5923 #ifdef UFO_XC_HDR
5924 #if (UFO_XC_HDR_VERSION == 2)
5925     if (IsSrcTypeHDMI(gSrcInfo[MAIN_WINDOW].enInputSourceType))
5926     {
5927         // enable hdr dma seamless with rfbl mode on maserati
5928         MApi_XC_W2BYTEMSK(REG_SC_BK79_03_L, 1, BIT(15));
5929     }
5930 #endif
5931 #endif
5932 
5933     return ENABLE_REQUEST_FBL;
5934 }
5935 
Hal_XC_SetFrameColor(void * pInstance,MS_U32 u32aRGB)5936 void Hal_XC_SetFrameColor(void *pInstance, MS_U32 u32aRGB)
5937 {
5938     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5939     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5940 
5941     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L,  (u32aRGB >> 8),0xFF00);            ///< R
5942     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1A_L,  (u32aRGB >> 8),0x00FF);            ///< G
5943     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1A_L,  (u32aRGB << 8),0xFF00);            ///< B
5944 }
Hal_SC_getVSyncWidth(void * pInstance,SCALER_WIN eWindow)5945 MS_U8 Hal_SC_getVSyncWidth(void *pInstance, SCALER_WIN eWindow)
5946 {
5947     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5948     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5949     MS_U8 u8val = 0;
5950 
5951     if(eWindow == MAIN_WINDOW)
5952     {
5953         u8val = ((SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK01_22_L) & 0xFF00) >> 8);
5954     }
5955     else
5956     {
5957     }
5958     return u8val;
5959 }
5960 
Hal_SC_Set_OSDLayer(void * pInstance,E_VOP_OSD_LAYER_SEL eVOPOSDLayer,SCALER_WIN eWindow)5961 E_APIXC_ReturnValue Hal_SC_Set_OSDLayer(void *pInstance, E_VOP_OSD_LAYER_SEL  eVOPOSDLayer, SCALER_WIN eWindow)
5962 {
5963     return E_APIXC_RET_FAIL;
5964 }
5965 
Hal_SC_Get_OSDLayer(void * pInstance,SCALER_WIN eWindow)5966 E_VOP_OSD_LAYER_SEL Hal_SC_Get_OSDLayer(void *pInstance, SCALER_WIN eWindow)
5967 {
5968     //do nothing
5969     return E_VOP_LAYER_RESERVED;
5970 }
5971 
Hal_SC_Set_VideoAlpha(void * pInstance,MS_U8 u8Val,SCALER_WIN eWindow)5972 E_APIXC_ReturnValue Hal_SC_Set_VideoAlpha(void *pInstance, MS_U8 u8Val, SCALER_WIN eWindow)
5973 {
5974     //do nothing
5975     return E_APIXC_RET_FAIL;
5976 }
5977 
Hal_SC_Get_VideoAlpha(void * pInstance,MS_U8 * pu8Val,SCALER_WIN eWindow)5978 E_APIXC_ReturnValue Hal_SC_Get_VideoAlpha(void *pInstance, MS_U8 *pu8Val, SCALER_WIN eWindow)
5979 {
5980     *pu8Val += 0;
5981 
5982     //do nothing
5983     return E_APIXC_RET_FAIL;
5984 }
5985 
Hal_SC_SetOSDBlendingFormula(void * pInstance,E_XC_OSD_INDEX enOsdIndex,E_XC_OSD_BlENDING_TYPE enType,SCALER_WIN eWindow)5986 E_APIXC_ReturnValue Hal_SC_SetOSDBlendingFormula(void *pInstance, E_XC_OSD_INDEX enOsdIndex, E_XC_OSD_BlENDING_TYPE enType, SCALER_WIN eWindow)
5987 {
5988     E_APIXC_ReturnValue bRet = E_APIXC_RET_OK;
5989     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
5990     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
5991 
5992     if (eWindow == MAIN_WINDOW)
5993     {
5994         switch(enOsdIndex)
5995         {
5996             case E_XC_OSD_0:
5997                 if(E_XC_OSD_BlENDING_MODE1 == enType) //OSD + (1-a)*Video
5998                 {
5999                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, BIT(5)|BIT(4), BIT(5)|BIT(4));
6000                     //osd check alpha define
6001                     //1: for define 8'hFF is transparent
6002                     //0: for define 8'h00 is transparent
6003                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, BIT(0), BIT(0));
6004                     // for zorder
6005                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_6B_L, BIT(15), BIT(15));
6006 
6007 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6008 #ifdef GOP_SUPPORT_DUALRATE
6009                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_50_L, BIT(10), BIT(10));
6010 #endif
6011 #endif
6012                 }
6013                 else //a*OSD + (1-a)*Video
6014                 {
6015                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, 0x00, BIT(5)|BIT(4));
6016                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, 0x00, BIT(0));
6017                     // for zorder
6018                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_6B_L, 0, BIT(15));
6019 
6020 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6021 #ifdef GOP_SUPPORT_DUALRATE
6022                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_50_L, 0, BIT(10));
6023 #endif
6024 #endif
6025                 }
6026                 break;
6027 
6028             case E_XC_OSD_1:
6029                 if(E_XC_OSD_BlENDING_MODE1 == enType) //OSD + (1-a)*Video
6030                 {
6031                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, BIT(7)|BIT(6), BIT(7)|BIT(6));
6032                     //osd check alpha define
6033                     //1: for define 8'hFF is transparent
6034                     //0: for define 8'h00 is transparent
6035                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, BIT(1), BIT(1));
6036                     // for zorder
6037                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_60_L, BIT(15), BIT(15));
6038 
6039 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6040 #ifdef GOP_SUPPORT_DUALRATE
6041                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_51_L, BIT(10), BIT(10));
6042 #endif
6043 #endif
6044                 }
6045                 else //a*OSD + (1-a)*Video
6046                 {
6047                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, 0x00, BIT(7)|BIT(6));
6048                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, 0x00, BIT(1));
6049                     // for zorder
6050                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_60_L, 0, BIT(15));
6051 
6052 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6053 #ifdef GOP_SUPPORT_DUALRATE
6054                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_51_L, 0, BIT(10));
6055 #endif
6056 #endif
6057                 }
6058                 break;
6059 
6060             case E_XC_OSD_2:
6061                 if(E_XC_OSD_BlENDING_MODE1 == enType) //OSD + (1-a)*Video
6062                 {
6063                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, BIT(9)|BIT(8), BIT(9)|BIT(8));
6064                     //osd check alpha define
6065                     //1: for define 8'hFF is transparent
6066                     //0: for define 8'h00 is transparent
6067                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, BIT(2), BIT(2));
6068                     // for zorder
6069                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_61_L, BIT(15), BIT(15));
6070 
6071 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6072 #ifdef GOP_SUPPORT_DUALRATE
6073                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_52_L, BIT(10), BIT(10));
6074 #endif
6075 #endif
6076                 }
6077                 else //a*OSD + (1-a)*Video
6078                 {
6079                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, 0x00, BIT(9)|BIT(8));
6080                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, 0x00, BIT(2));
6081                     // for zorder
6082                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_61_L, 0, BIT(15));
6083 
6084 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
6085 #ifdef GOP_SUPPORT_DUALRATE
6086                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_52_L, 0, BIT(10));
6087 #endif
6088 #endif
6089                 }
6090                 break;
6091 #if (OSD_LAYER_NUM > 3)
6092             case E_XC_OSD_3:
6093                 if(E_XC_OSD_BlENDING_MODE1 == enType) //OSD + (1-a)*Video
6094                 {
6095                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, BIT(13)|BIT(12), BIT(13)|BIT(12));
6096                     //osd check alpha define
6097                     //1: for define 8'hFF is transparent
6098                     //0: for define 8'h00 is transparent
6099                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, BIT(3), BIT(3));
6100                     // for zorder
6101                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_62_L, BIT(15), BIT(15));
6102                 }
6103                 else //a*OSD + (1-a)*Video
6104                 {
6105                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, 0x00, BIT(13)|BIT(12));
6106                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, 0x00, BIT(3));
6107                     // for zorder
6108                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_62_L, 0, BIT(15));
6109                 }
6110                 break;
6111 #endif
6112 #if (OSD_LAYER_NUM > 4)
6113             case E_XC_OSD_4:
6114                 if(E_XC_OSD_BlENDING_MODE1 == enType) //OSD + (1-a)*Video
6115                 {
6116                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, BIT(15)|BIT(14), BIT(15)|BIT(14));
6117                     //osd check alpha define
6118                     //1: for define 8'hFF is transparent
6119                     //0: for define 8'h00 is transparent
6120                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, BIT(4), BIT(4));
6121                     // for zorder
6122                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1B_L, BIT(15), BIT(15));
6123                 }
6124                 else //a*OSD + (1-a)*Video
6125                 {
6126                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_5B_L, 0x00, BIT(15)|BIT(14));
6127                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_6B_L, 0x00, BIT(4));
6128                     // for zorder
6129                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1B_L, 0, BIT(15));
6130                 }
6131                 break;
6132 #endif
6133             default:
6134                 printf("[MDrv_SC_SetOSDBlendingFormula]Invalid Parameter!enOsdIndex=%u\n", enOsdIndex);
6135                 bRet = E_APIXC_RET_FAIL_INVALID_PARAMETER;
6136                 break;
6137         }
6138     }
6139     else
6140     {
6141         // do nothing
6142         printf("[MDrv_SC_SetOSDBlendingFormula] Not support sub window now \n");
6143         bRet = E_APIXC_RET_FAIL_FUN_NOT_SUPPORT;
6144     }
6145 
6146     return bRet;
6147 }
Hal_XC_ClearScalingFactorForInternalCalib(void * pInstance)6148 void Hal_XC_ClearScalingFactorForInternalCalib(void *pInstance)
6149 {
6150     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6151     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6152     //MDrv_WriteRegBit(H_BK_SCMI(0x09), FALSE, BIT(7));
6153     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_04_L, 0x0000);   // H pre-scaling
6154     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_05_L, 0xC010);   // H pre-scaling
6155     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_08_L, 0x0000);   // V pre-scaling
6156     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK02_09_L, 0x0000);   // V pre-scaling
6157 
6158     //HVSP
6159     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_07_L, 0x0000);  // H post-scaling
6160     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_08_L, 0x0100);  // H post-scaling
6161     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_09_L, 0x0000);  // V post-scaling
6162     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK23_0A_L, 0x0100);  // V post-scaling
6163 }
6164 
MHal_SC_cal_usedgain_to_reggain(MS_U32 u16UsedGain_x32)6165 MS_U8 MHal_SC_cal_usedgain_to_reggain(MS_U32 u16UsedGain_x32)
6166 {
6167     MS_U8 u8Value = 0;
6168 
6169     if      (u16UsedGain_x32 >=65536) u8Value = 16;
6170     else if (u16UsedGain_x32 >=32768) u8Value = 15;
6171     else if (u16UsedGain_x32 >=16384) u8Value = 14;
6172     else if (u16UsedGain_x32 >= 8192) u8Value = 13;
6173     else if (u16UsedGain_x32 >= 4096) u8Value = 12;
6174     else if (u16UsedGain_x32 >= 2048) u8Value = 11;
6175     else if (u16UsedGain_x32 >= 1024) u8Value = 10;
6176     else if (u16UsedGain_x32 >=  512) u8Value = 9;
6177     else if (u16UsedGain_x32 >=  256) u8Value = 8;
6178     else if (u16UsedGain_x32 >=  128) u8Value = 7;
6179     else if (u16UsedGain_x32 >=   64) u8Value = 6;
6180     else if (u16UsedGain_x32 >=   32) u8Value = 5;
6181     else if (u16UsedGain_x32 >=   16) u8Value = 4;
6182     else if (u16UsedGain_x32 >=    8) u8Value = 3;
6183     else if (u16UsedGain_x32 >=    4) u8Value = 2;
6184     else if (u16UsedGain_x32 >=    2) u8Value = 1;
6185     else if (u16UsedGain_x32 >=    1) u8Value = 0;
6186     else
6187     {
6188         u8Value = 0;
6189     }
6190 
6191     u8Value += IPGAIN_REFACTOR;
6192 
6193     return u8Value;
6194 }
6195 
Hal_SC_OP2VOPDESel(void * pInstance,E_OP2VOP_DE_SEL eVopDESel)6196 E_APIXC_ReturnValue Hal_SC_OP2VOPDESel(void *pInstance, E_OP2VOP_DE_SEL eVopDESel)
6197 {
6198     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6199     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6200     //Select op2vop de, for DWIN capture etc
6201     if(eVopDESel == E_OP2VOPDE_WHOLEFRAME_WITHOSD)
6202     {
6203         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_6B_L, ((MS_U16)(E_OP2VOPDE_WHOLEFRAME) << 12), (BIT(12)+BIT(13)));
6204         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_23_L, BIT(15), BIT(15));
6205     }
6206     else
6207     {
6208         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_23_L, 0, BIT(15));
6209         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_6B_L, (eVopDESel << 12), (BIT(12)+BIT(13)));
6210     }
6211     return E_APIXC_RET_OK;
6212 }
6213 
Hal_XC_SVOutput_GetCaps(void * pInstance)6214 MS_BOOL Hal_XC_SVOutput_GetCaps(void *pInstance)
6215 {
6216     return FALSE;
6217 }
6218 
6219 /////Add for FRC
_MHal_SC_Flock_Caculate_LPLLSet(MS_U32 u32Dclk)6220 void _MHal_SC_Flock_Caculate_LPLLSet(MS_U32 u32Dclk)
6221 {
6222 #if 0 // Manhattan only 1 LPLL
6223     MS_U64 ldPllSet = 0xff;
6224 
6225     ldPllSet = ((MS_U64)320 * 524288 * 10000000 + (u32Dclk>>1));  // LPLL BK01 LPLL Set
6226     do_div(ldPllSet, u32Dclk);
6227 
6228     LPLL_BK_STORE;
6229     LPLL_BK_SWITCH(0x01);
6230     W4BYTE(L_BK_LPLL(0x0F), (MS_U32)ldPllSet);
6231     LPLL_BK_RESTORE;
6232 #endif
6233 }
6234 
_MHal_SC_Set_LPLL_Limit(MS_U32 u32LpllLimitHigh,MS_U32 u32LpllLimitLow,MS_U8 u8Lpll_bank)6235 void _MHal_SC_Set_LPLL_Limit(MS_U32 u32LpllLimitHigh, MS_U32 u32LpllLimitLow, MS_U8 u8Lpll_bank)
6236 {
6237     //printf("Fpll_Limit: Set %lx, bound (%lx -> %lx)\n", *u32PllSet, u32UpBound, u32LowBound);
6238     LPLL_BK_STORE;
6239     LPLL_BK_SWITCH(u8Lpll_bank);
6240 
6241 
6242     MDrv_WriteByteMask(L_BK_LPLL(0x0D), BIT(4), BIT(4));        // turn on 2 limit
6243 
6244     //printf("Fpll set %lx, limit (high %lx, low %lx)\n", *u32PllSet, u32LpllLimitHigh, u32LpllLimitLow);
6245     MDrv_Write3Byte(L_BK_LPLL(0x06), u32LpllLimitHigh);
6246     MDrv_Write3Byte(L_BK_LPLL(0x08), u32LpllLimitLow);
6247 
6248     //printf("Fpll limit reg (high %lx, low %lx)\n", MDrv_Read4Byte(L_BK_LPLL(0x06)), MDrv_Read4Byte(L_BK_LPLL(0x08)));
6249 
6250     LPLL_BK_RESTORE;
6251 }
6252 #define LVDS_FRC_CLOCK_MHZ  320
_MHal_SC_Flock_Set_IGainPGain(void * pInstance,MS_U8 u8FRC_Out,MS_U16 u16OutputVfreqAfterFRC,MS_U16 u16Htt,MS_U16 u16Vtt)6253 void _MHal_SC_Flock_Set_IGainPGain(void *pInstance, MS_U8 u8FRC_Out, MS_U16 u16OutputVfreqAfterFRC, MS_U16 u16Htt, MS_U16 u16Vtt)
6254 {
6255 #if 0 // Manhattan only 1 LPLL
6256     MS_U32  u32dclk=0;
6257     MS_U8   u8GainI, u8GainP;
6258     MS_U64  u64Div_Factor;
6259     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6260     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6261     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6262     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6263 
6264     //check parameter valid, avoiding the diving zero failure
6265     if(0 == u8FRC_Out)
6266     {
6267         u8FRC_Out = 1;
6268     }
6269 
6270     u32dclk = (MS_U32)(u16Vtt * u16Htt * u8FRC_Out);
6271     //u64Div_Factor = (MS_U64)LVDS_FRC_CLOCK_MHZ*524288*1000000/pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32XTAL_Clock;
6272     u64Div_Factor = (MS_U64)LVDS_FRC_CLOCK_MHZ*524288*1000000;
6273     do_div(u64Div_Factor, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32XTAL_Clock);
6274     do_div(u64Div_Factor, (MS_U32)u32dclk * 8);
6275 
6276     u8GainI = MHal_SC_cal_usedgain_to_reggain(u64Div_Factor);
6277 
6278     if((u8FRC_Out == 5)&&(u64Div_Factor==0))
6279     {
6280         //24 to 60Hz, because the SW can't get the real value by log table
6281         u8GainI = 1;
6282 
6283         u8GainI += 2;
6284     }
6285 
6286     u8GainP = u8GainI+1;
6287     if((u8FRC_Out >= 2) && (u8GainP == u8GainI))
6288     {
6289         u8GainP++;
6290     }
6291 
6292     LPLL_BK_STORE;
6293     LPLL_BK_SWITCH(0x01);
6294     MDrv_WriteByte(H_BK_LPLL(0x0B), (u8GainP<<4)|u8GainI);  //Gain
6295     LPLL_BK_RESTORE;
6296     XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "i_Gain= 0x%tx (%tu)\n", (ptrdiff_t)u64Div_Factor, (ptrdiff_t)u64Div_Factor)
6297     XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "REG_IGain= 0x%x (%u)\n", u8GainI, u8GainI)
6298     XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "REG_PGain= 0x%x (%u)\n", u8GainP, u8GainP)
6299 #endif
6300 }
6301 
6302 
_MHal_SC_Flock_Set_LPLL_Enable(E_XC_FLOCK_TYPE eFlock_type)6303 void _MHal_SC_Flock_Set_LPLL_Enable(E_XC_FLOCK_TYPE eFlock_type)
6304 {
6305 #if 0 // Manhattan only 1 LPLL
6306     MS_BOOL bDiv_en = DISABLE;
6307 
6308     switch(eFlock_type)
6309     {
6310         case E_XC_FLOCK_DIV_ON:
6311             bDiv_en = ENABLE;
6312             break;
6313 
6314         case E_XC_FLOCK_FPLL_ON:
6315         case E_XC_FLOCK_DIV_OFF:
6316         default:
6317             break;
6318     }
6319 
6320     LPLL_BK_STORE;
6321     LPLL_BK_SWITCH(0x01);
6322     MDrv_Write2ByteMask(L_BK_LPLL(0x7F), bDiv_en?BIT(8):0, BIT(8));
6323     LPLL_BK_RESTORE;
6324 #endif
6325 
6326 }
6327 
MHal_CLKGEN_FRC_Init(void * pInstance,MS_U8 u8LPLL_Mode)6328 void MHal_CLKGEN_FRC_Init(void *pInstance, MS_U8 u8LPLL_Mode)
6329 {
6330     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6331     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6332     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6333     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6334 
6335     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
6336 
6337 #if (PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB)
6338     if(psXCInstPri->u32DeviceID == E_XC_DEVICE1)
6339     {
6340         // not support
6341         return;
6342     }
6343 #endif
6344     //Patch for MSTV_TOOL to R/W FRC base address
6345     MDrv_WriteByte(0x103C0E, 0x02);
6346 
6347     // Enable FSC CLK: reg_ckg_fclk_frc_fsc
6348     W2BYTEMSK(L_CLKGEN1(0x3B), 0x0000, 0x000C); // 345MHz
6349     W2BYTEMSK(L_CLKGEN1(0x3B), 0x0000, 0x0002); // Not Invert
6350     W2BYTEMSK(L_CLKGEN1(0x3B), 0x0000, 0x0001); // Enable clock
6351 
6352     // Enable FRC CLK: reg_ckg_fdclk_frc
6353     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0C00); // 172MHz
6354     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0200); // Not Invert
6355     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0100); // Enable clock
6356 
6357 #if FRC_INSIDE
6358     // Enable CLK_IDCLK_FRC, Reg_ckg_idclk_frc: bk119_04[0]
6359     // Enable CLK_FICLK_FRC, Reg_ckg_ficlk_frc: bk119_02[14]
6360     // Enable CLK_FDCLK_FRC, Reg_ckg_fdclk_frc: bk119_03[8]
6361     // Enable CLK_FOCLK_FRC, Reg_ckg_foclk_frc: bk119_02[6]
6362     // Enable CLK_ODCLK_FRC, Reg_ckg_odclk_frc: bk119_02[0]
6363     // Enable CLK_FDCLK_FRC_BE, Reg_ckg_fdclk_frc_be: bk121_03[12]
6364 
6365     W2BYTEMSK(REG_FRC_BK119_02_L, 0x0034, 0x4077);
6366     W2BYTEMSK(REG_FRC_BK119_04_L, 0x0034, 0x007F);
6367 
6368     // Enable FRC FO CLK: reg_ckg_fdclk for FO
6369     if (IsVBY1_16LANE(u8LPLL_Type))
6370     {
6371         // Maserati mode
6372         W2BYTEMSK(REG_FRC_BK119_03_L, 0x0000, 0x0D00);
6373         W2BYTEMSK(REG_FRC_BK121_03_L, 0x0000, 0xD000);
6374 
6375         W2BYTEMSK(L_CLKGEN2(0x44), 0x0000, 0x0C00); // 354MHz
6376         W2BYTEMSK(L_CLKGEN2(0x44), 0x0000, 0x0200); // Not Invert
6377         W2BYTEMSK(L_CLKGEN2(0x44), 0x0000, 0x0100); // Enable clock
6378     }
6379     else
6380     {
6381         // manhattan mode
6382         W2BYTEMSK(REG_FRC_BK119_03_L, 0x0000, 0x0D00); // use 354MHz by mike-hh
6383         W2BYTEMSK(REG_FRC_BK121_03_L, 0x0000, 0xD000); // use 354MHz by mike-hh
6384 
6385         W2BYTEMSK(L_CLKGEN2(0x44), 0x0000, 0x0C00); // 192MHz --> use 354MHz by mike-hh
6386         W2BYTEMSK(L_CLKGEN2(0x44), 0x0000, 0x0200); // Not Invert
6387         W2BYTEMSK(L_CLKGEN2(0x44), 0x0000, 0x0100); // Enable clock
6388     }
6389 #endif
6390 
6391 #if 0 // Move into Panel driver
6392     // Enable CLK_DOT_MINI
6393     W2BYTEMSK(L_CLKGEN0(0x56), 0x0004, 0x000C); // FIFO_CLK
6394     W2BYTEMSK(L_CLKGEN0(0x56), 0x0000, 0x0002); // Not Invert
6395     W2BYTEMSK(L_CLKGEN0(0x56), 0x0000, 0x0001); // Enable clock
6396 
6397     // Enable CLK_DOT_MINI_PRE
6398     W2BYTEMSK(L_CLKGEN0(0x56), 0x0400, 0x0C00); // FIFO_CLK
6399     W2BYTEMSK(L_CLKGEN0(0x56), 0x0000, 0x0200); // Not Invert
6400     W2BYTEMSK(L_CLKGEN0(0x56), 0x0000, 0x0100); // Enable clock
6401 #endif
6402 
6403 #if 0 // Move into panel driver
6404     // Enable CLK_R2_FRC
6405     W2BYTEMSK(L_CLKGEN1(0x30), 0x0000, 0x000C); // 216 MHz
6406     W2BYTEMSK(L_CLKGEN1(0x30), 0x0000, 0x0002); // Not Invert
6407     W2BYTEMSK(L_CLKGEN1(0x30), 0x0000, 0x0101); // Enable clock
6408 
6409     // Enable CLK_MCU_FRC
6410     W2BYTEMSK(L_CLKGEN1(0x30), 0x0000, 0x0C00); // 216 MHz
6411     W2BYTEMSK(L_CLKGEN1(0x30), 0x0000, 0x0200); // Not Invert
6412     W2BYTEMSK(L_CLKGEN1(0x30), 0x0000, 0x0100); // Enable clock
6413 
6414     // Enable CLK_ODCLK_FRC
6415     W2BYTEMSK(L_CLKGEN1(0x31), 0x0000, 0x0C00); // CLK_LPLL
6416     W2BYTEMSK(L_CLKGEN1(0x31), 0x0000, 0x0200); // Not Invert
6417     W2BYTEMSK(L_CLKGEN1(0x31), 0x0000, 0x0100); // Enable clock
6418 
6419 
6420     // Enable CLK_TX_MOD_FRC
6421     W2BYTEMSK(L_CLKGEN1(0x32), 0x0000, 0x000C); // clk_odclk_frc
6422     W2BYTEMSK(L_CLKGEN1(0x32), 0x0000, 0x0002); // Not Invert
6423     W2BYTEMSK(L_CLKGEN1(0x32), 0x0000, 0x0001); // Enable clock
6424 
6425 
6426     // Enable CLK_MINIFIFO_FRC
6427     if (u8LPLL_Mode== E_XC_MOD_OUTPUT_SINGLE ) //0: single, 1: dual
6428     {
6429         W2BYTEMSK(L_CLKGEN1(0x32), 0x0000, 0x0C00); // CLK_LPLL
6430     }
6431     else
6432     {
6433         W2BYTEMSK(L_CLKGEN1(0x32), 0x0800, 0x0C00); // CLK_LPLL_div2
6434     }
6435     W2BYTEMSK(L_CLKGEN1(0x32), 0x0000, 0x0200); // Not Invert
6436     W2BYTEMSK(L_CLKGEN1(0x32), 0x0000, 0x0100); // Enable clock
6437 
6438 
6439     // Enable CLK_MISC_FRC
6440     if (u8LPLL_Mode == E_XC_MOD_OUTPUT_SINGLE)
6441     {
6442         W2BYTEMSK(L_CLKGEN1(0x33), 0x0000, 0x0C00); // CLK_LPLL
6443     }
6444     else
6445     {
6446         W2BYTEMSK(L_CLKGEN1(0x33), 0x0400, 0x0C00); // CLK_LPLL_div2
6447     }
6448 
6449     W2BYTEMSK(L_CLKGEN1(0x33), 0x0000, 0x0200); // Not Invert
6450     W2BYTEMSK(L_CLKGEN1(0x33), 0x0000, 0x0100); // Enable clock
6451 
6452 
6453 
6454     // Enable CLK_MFT_FRC
6455     W2BYTEMSK(L_CLKGEN1(0x34), 0x0008, 0x000C); // CLK_LPLL_div2
6456     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0002); // Not Invert
6457     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0001); // Enable clock
6458 
6459     // Enable CLK_FDCLK_FRC
6460     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x1C00); // 172 MHz
6461     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0200); // Not Invert
6462     W2BYTEMSK(L_CLKGEN1(0x34), 0x0000, 0x0100); // Enable clock
6463 
6464     // Enable CLK_ICLK_FRC
6465     W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0004); // clk_fdclk_frc
6466     W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0002); // Not Invert
6467     W2BYTEMSK(L_CLKGEN1(0x35), 0x0000, 0x0001); // Enable clock
6468 
6469     // Enable CLK_OP2_SRAM_FRC
6470     W2BYTEMSK(L_CLKGEN1(0x36), 0x0000, 0x0004); // clk_odclk_frc_p
6471     W2BYTEMSK(L_CLKGEN1(0x36), 0x0000, 0x0002); // Not Invert
6472     W2BYTEMSK(L_CLKGEN1(0x36), 0x0000, 0x0001); // Enable clock
6473 
6474     // Enable CLK_LD_SRAM_FRC
6475     W2BYTEMSK(L_CLKGEN1(0x36), 0x0000, 0x0400); // clk_odclk_frc_p
6476     W2BYTEMSK(L_CLKGEN1(0x36), 0x0000, 0x0200); // Not Invert
6477     W2BYTEMSK(L_CLKGEN1(0x36), 0x0000, 0x0100); // Enable clock
6478 
6479     // Enable CLK_OD_SRAM_FRC
6480     W2BYTEMSK(L_CLKGEN1(0x37), 0x0000, 0x0004); // clk_odclk_frc_p
6481     W2BYTEMSK(L_CLKGEN1(0x37), 0x0000, 0x0002); // Not Invert
6482     W2BYTEMSK(L_CLKGEN1(0x37), 0x0000, 0x0001); // Enable clock
6483 
6484     // Enable CLK_LPLL_FRC
6485     W2BYTEMSK(L_CLKGEN1(0x3A), 0x0000, 0x000C); // CLK_LPLL
6486     W2BYTEMSK(L_CLKGEN1(0x3A), 0x0000, 0x0002); // Not Invert
6487     W2BYTEMSK(L_CLKGEN1(0x3A), 0x0000, 0x0001); // Enable clock
6488 
6489     // Enable CLK_OCC_FRC
6490     W2BYTEMSK(L_CLKGEN1(0x3A), 0x0000, 0x0C00); // flock_clk_synth_out
6491     W2BYTEMSK(L_CLKGEN1(0x3A), 0x0000, 0x0200); // Not Invert
6492     W2BYTEMSK(L_CLKGEN1(0x3A), 0x0000, 0x0100); // Enable clock
6493 #endif
6494     // Enable LVDS_MPLL
6495     //[10]reg_lvds_mpll_clk_adc432m_pd, [8]reg_lvds_mpll_pd
6496     //W2BYTEMSK(L_BK_AFEC(0x41), 0x0000, 0x0500); // MPLL_CLK_DP432M
6497 }
6498 
MHal_CLKGEN_FRC_Bypass_Enable(MS_BOOL bEnable)6499 void MHal_CLKGEN_FRC_Bypass_Enable(MS_BOOL bEnable)
6500 {
6501 
6502     W2BYTEMSK(L_CLKGEN0(0x53),0x00,0x02); // Not Invert
6503     W2BYTEMSK(L_CLKGEN0(0x53),0x00,0x01); // Enable clock
6504 
6505     if (bEnable)
6506     {
6507         // Enable CLK_ODCLK
6508         W2BYTEMSK(L_CLKGEN0(0x53),0xC0C,0xC0C);   // LPLL output clock
6509         // Disable CLK_R2_FRC
6510         W2BYTEMSK(L_CLKGEN1(0x30), 0x00, 0xFFFF); // turn-on clk_mcu_frc
6511         // Enable CLK_SPI_M_FRC
6512         W2BYTEMSK(L_CLKGEN1(0x31), 0x00, 0x01);   // Disable clock
6513     }
6514     else
6515     {
6516         // Enable CLK_ODCLK
6517         W2BYTEMSK(L_CLKGEN0(0x53), 0x00, 0xC0C); // synthetic clock out
6518         // Enable CLK_R2_FRC
6519         W2BYTEMSK(L_CLKGEN1(0x30), 0x00, 0x0C); // 216 MHz
6520         W2BYTEMSK(L_CLKGEN1(0x30), 0x00, 0x02); // Not Invert
6521         W2BYTEMSK(L_CLKGEN1(0x30), 0x00, 0x01); // Enable clock
6522         // Enable CLK_SPI_M_FRC
6523         W2BYTEMSK(L_CLKGEN1(0x31), 0x00, 0x1C); // 27  MHz
6524         W2BYTEMSK(L_CLKGEN1(0x31), 0x00, 0x02); // Not Invert
6525         W2BYTEMSK(L_CLKGEN1(0x31), 0x00, 0x01); // Enable clock
6526     }
6527 }
6528 
6529 
Hal_XC_IsForcePrescaling(void * pInstance,const XC_InternalStatus * pSrcInfo,MS_BOOL * pbForceV,MS_BOOL * pbForceH,SCALER_WIN eWindow)6530 E_APIXC_ReturnValue Hal_XC_IsForcePrescaling(void *pInstance, const XC_InternalStatus *pSrcInfo, MS_BOOL *pbForceV, MS_BOOL *pbForceH, SCALER_WIN eWindow)
6531 {
6532     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6533     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6534     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6535     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6536     *pbForceV = FALSE;
6537     *pbForceH = FALSE;
6538 
6539     //-----------------------------------------
6540     // Vertical
6541     //-----------------------------------------
6542 
6543     //FHD case. FHD has tight bandwidth in FCLK (post scaling), so force pre-scaling if disp.v size > 80% of crop.v size.
6544     if ( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 1000) &&
6545          (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 1600) ) //consider 1680x1050 into this case
6546     {
6547         // 80%
6548         if ( ( pSrcInfo->stDispWin.height * 10 ) <  ( pSrcInfo->stCropWin.height * 8 ) )
6549         {
6550             *pbForceV = TRUE;
6551         }
6552 
6553         // for 4096x2304 MM video, force pre-scaling
6554         if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 2100) &&
6555             (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 3800) &&    // 4K2K panel
6556             (pSrcInfo->stCropWin.height > HEIGHT_4K2K))
6557         {
6558             *pbForceV = TRUE;
6559         }
6560 
6561     }
6562     else // SD, HD panel.
6563     {
6564         // 60%
6565         if ( ( pSrcInfo->stDispWin.height * 10 ) <  ( pSrcInfo->stCropWin.height * 6 ) )
6566         {
6567             *pbForceV = TRUE;
6568         }
6569     }
6570 
6571     //-----------------------------------------
6572     // Horizontal
6573     //-----------------------------------------
6574 
6575     if ( (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 1000)
6576          && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 1600) ) //consider 1680x1050 into this case
6577     {
6578         // 80% ( SEC using 80% for HD panel ). Increase % if meet FCLK bandwidth issue in the future.
6579         if ( ( pSrcInfo->stDispWin.width * 10 ) < ( pSrcInfo->stCropWin.width * 8 ) )
6580         {
6581             *pbForceH = TRUE;
6582         }
6583 
6584         // for 4096x2304 MM video, force pre-scaling
6585         if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 2100) &&
6586             (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width > 3800) &&    // 4K2K panel
6587             (pSrcInfo->stCropWin.width > WIDTH_4K2K))
6588         {
6589             *pbForceH = TRUE;
6590         }
6591     }
6592     else // SD panel.
6593     {
6594         // 60%
6595         if ( ( pSrcInfo->stDispWin.width * 10 ) < ( pSrcInfo->stCropWin.width * 6 ) )
6596         {
6597             *pbForceH = TRUE;
6598         }
6599     }
6600 
6601     if (psXCInstPri->u32DeviceID == 1)
6602     {
6603         // SC1 attach sc0, postscaling down performance not enough
6604         if ( ( pSrcInfo->stDispWin.height ) <  ( pSrcInfo->stCropWin.height) )
6605         {
6606             *pbForceV = TRUE;
6607         }
6608         if ( ( pSrcInfo->stDispWin.width) < ( pSrcInfo->stCropWin.width) )
6609         {
6610             *pbForceH = TRUE;
6611         }
6612     }
6613 
6614     return E_APIXC_RET_OK;
6615 }
6616 
Hal_SC_IsHW2Dto3DPatch_Enable(void)6617 MS_BOOL Hal_SC_IsHW2Dto3DPatch_Enable(void)
6618 {
6619     MS_BOOL bRet = FALSE;
6620     if(PM_R1BYTE(REG_CHIP_REVISION, 7:0) < 1)//a1 u01 2d to 3d hw bug
6621     {
6622         bRet = TRUE;
6623     }
6624     return bRet;
6625 }
6626 
MHal_SC_Get_LpllSet_Factor(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 u8LPLL_Type,MS_U32 u32DefaultDClk)6627 MS_U32 MHal_SC_Get_LpllSet_Factor(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 u8LPLL_Type,MS_U32 u32DefaultDClk)
6628 {
6629     MS_U32 u32Factor = 0;
6630     UNUSED(u8LPLL_Type);
6631     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6632     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6633     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
6634     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
6635 
6636     u32Factor  = LPLL_LOOPGAIN/8/2;
6637 
6638     if ((pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16HTotal> 3000) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16VTotal > 2000) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16DefaultVFreq > 500))
6639     {
6640         //printf("\033[0;31m [%s][%d] enter For 4K2K used!!!  \033[0m\n", __FUNCTION__, __LINE__);
6641         u32Factor = 1;
6642     }
6643 
6644     if (u8LPLL_Type == E_XC_PNL_LPLL_LVDS)
6645     {
6646         u32Factor = 3;
6647     }
6648 
6649     // for the WUXGA 1920x1200 case
6650     if((u8LPLL_Mode==E_XC_MOD_OUTPUT_DUAL)&&(u32DefaultDClk > 1500000000)
6651        &&(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Height > 1100)
6652        &&(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width < 2000))
6653     {
6654         u32Factor  = LPLL_LOOPGAIN/8;
6655     }
6656 
6657     if (IsVBY1(u8LPLL_Type))
6658     {
6659         u32Factor = 8;
6660     }
6661 
6662     return u32Factor;
6663 }
6664 
MHal_SC_Get_LpllSet_Div(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 u8LPLL_Type,MS_U32 u32DefaultDClk)6665 MS_U32 MHal_SC_Get_LpllSet_Div(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 u8LPLL_Type,MS_U32 u32DefaultDClk)
6666 {
6667     MS_U32 u32Div = 1;
6668 
6669     if (u8LPLL_Type == E_XC_PNL_LPLL_LVDS)
6670     {
6671         u32Div = 2;
6672     }
6673     else if (IsVBY1(u8LPLL_Type))
6674     {
6675         u32Div = 5;
6676     }
6677 
6678     return u32Div;
6679 }
6680 
Hal_SC_Enable_AVMute(void * pInstance,SCALER_WIN eWindow)6681 E_APIXC_ReturnValue Hal_SC_Enable_AVMute(void *pInstance, SCALER_WIN eWindow)
6682 {
6683     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6684     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6685     if (eWindow == MAIN_WINDOW)
6686     {
6687         //HDMI V-mute detect enable
6688         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_34_L, BIT(9), BIT(9));
6689         //force IPM enable at av-mute case
6690         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L, BIT(5), BIT(5));
6691         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_19_L, BIT(5), BIT(5));
6692 
6693         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_01_L, BIT(13) | BIT(15), BIT(13) | BIT(15));
6694 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
6695         // SC1 as subwindow case, use bank25_2E to back main window,HW bug fix after manhattan U02
6696         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_2E_L, BIT(2), BIT(2));
6697         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_23_L, BIT(9) | BIT(11), BIT(9) | BIT(11));
6698 #else
6699         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_23_L, BIT(9) | BIT(11), BIT(9) | BIT(11));
6700 #endif
6701     }
6702     else
6703     {
6704         //HDMI V-mute detect enable
6705         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK03_34_L, BIT(9), BIT(9));
6706         //force IPM enable at av-mute case
6707         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_59_L, BIT(5), BIT(5));
6708         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_59_L, BIT(5), BIT(5));
6709 
6710         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_01_L, BIT(12) | BIT(14), BIT(12) | BIT(14));
6711         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_23_L, BIT(8) | BIT(10), BIT(8) | BIT(10));
6712     }
6713 
6714     return E_APIXC_RET_OK;
6715 }
6716 
Hal_XC_ReportPixelInfo(void * pInstance,MS_XC_REPORT_PIXELINFO * pstRepPixInfo)6717 MS_BOOL Hal_XC_ReportPixelInfo(void *pInstance, MS_XC_REPORT_PIXELINFO *pstRepPixInfo)
6718 {
6719     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6720     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6721     MS_BOOL bret = TRUE;
6722 
6723     switch(pstRepPixInfo->enStage)
6724     {
6725         case E_XC_GET_PIXEL_STAGE_AFTER_DLC:
6726             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_46_L, 0x00 , BMASK(3:0));
6727             break;
6728         case E_XC_GET_PIXEL_STAGE_PRE_GAMMA:
6729             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_46_L, 0x08, BMASK(3:0));
6730             break;
6731         case E_XC_GET_PIXEL_STAGE_AFTER_OSD:
6732             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_46_L, 0x0C, BMASK(3:0));
6733             break;
6734         default:
6735             bret = FALSE;
6736             break;
6737     }
6738 
6739     if(bret)
6740     {
6741         // Enable
6742         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, BIT(8), BIT(8));
6743 
6744         if(pstRepPixInfo->bShowRepWin)
6745         {
6746             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, BIT(9), BIT(9));
6747             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_46_L, pstRepPixInfo->u16RepWinColor<<8, 0xFF00);
6748             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1A_L, BIT(0), BIT(0));
6749         }
6750 
6751         // Set Report Window
6752         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_42_L, pstRepPixInfo->u16XStart);
6753         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_43_L, pstRepPixInfo->u16XEnd);
6754         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_44_L, pstRepPixInfo->u16YStart);
6755         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_45_L, pstRepPixInfo->u16YEnd);
6756 
6757         MsOS_DelayTask(50);  // Must wait .
6758 
6759         pstRepPixInfo->u16RCrMin = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_64_L);
6760         pstRepPixInfo->u16RCrMax = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_65_L);
6761         pstRepPixInfo->u16GYMin  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_66_L);
6762         pstRepPixInfo->u16GYMax  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_67_L);
6763         pstRepPixInfo->u16BCbMin = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_68_L);
6764         pstRepPixInfo->u16BCbMax = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0F_69_L);
6765         pstRepPixInfo->u32RCrSum = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK2D_01_L)|(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK2D_02_L)<<16);
6766         pstRepPixInfo->u32GYSum  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK2D_03_L)|(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK2D_04_L)<<16);
6767         pstRepPixInfo->u32BCbSum = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK2D_05_L)|(SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK2D_06_L)<<16);
6768 
6769         if(pstRepPixInfo->bShowRepWin)
6770         {
6771             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_1A_L, 0x00, BIT(0));
6772             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, 0x00, BIT(9));
6773         }
6774         // Disable
6775         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0F_57_L, 0x00, BIT(8));
6776     }
6777 
6778     return bret;
6779 }
6780 
Hal_SC_set_mrq_miusel(void * pInstance,MS_U8 u8MIUSel)6781 void Hal_SC_set_mrq_miusel(void *pInstance, MS_U8 u8MIUSel)
6782 {
6783     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6784     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6785 
6786     // Scaler control MRQ MIU by itself
6787     // So MIU1 IP-select is set to 1. At this moment, MIU0 Miu select is not working.
6788     if (u8MIUSel==0)
6789     {
6790         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_07_L, 0, BIT(8)|BIT(9));     // reg_mrq_miu_sel to MIU0
6791     }
6792     else if (u8MIUSel==1)
6793     {
6794         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_07_L, BIT(8), BIT(8)|BIT(9));     // reg_mrq_miu_sel to MIU1
6795     }
6796     else if (u8MIUSel==2)
6797     {
6798         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_07_L, BIT(9), BIT(8)|BIT(9));     // reg_mrq_miu_sel to MIU2
6799     }
6800 
6801     MDrv_WriteByteMask(REG_MIU0_BASE + 0xF3, 0x00, 0x80); // MIU select (Group1 BIT15)
6802     MDrv_WriteByteMask(REG_MIU1_BASE + 0xF3, 0x80, 0x80); // IP select
6803 }
6804 
Hal_SC_get_mcdi_memoryaddressfromreg(void * pInstance,E_XC_MCDI_TYPE eType)6805 MS_PHY Hal_SC_get_mcdi_memoryaddressfromreg(void *pInstance, E_XC_MCDI_TYPE eType)
6806 {
6807     MS_PHY phyFBAddressTemp = 0;
6808     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6809     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6810 
6811     if (eType == E_XC_MCDI_BOTH) // MAIN
6812     {
6813         phyFBAddressTemp = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0A_L) * MCDI_BYTE_PER_WORD;
6814     }
6815     else if(eType == E_XC_MCDI_SUB_BOTH) // SUB
6816     {
6817         phyFBAddressTemp = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_28_L) * MCDI_BYTE_PER_WORD;
6818     }
6819     else if(eType == E_XC_MCDI_ME1)
6820     {
6821         phyFBAddressTemp = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0A_L) * MCDI_BYTE_PER_WORD; // MAIN ME1 address
6822     }
6823     else if (eType == E_XC_MCDI_ME2)
6824     {
6825         phyFBAddressTemp = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_12_L) * MCDI_BYTE_PER_WORD; // MAIN ME2 address
6826     }
6827     else if (eType == E_XC_MCDI_SUB_ME1)
6828     {
6829         phyFBAddressTemp = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_28_L) * MCDI_BYTE_PER_WORD; // SUB ME1 address
6830     }
6831     else if (eType == E_XC_MCDI_SUB_ME2)
6832     {
6833         phyFBAddressTemp = SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2C_L) * MCDI_BYTE_PER_WORD; // SUB ME2 address
6834     }
6835     return phyFBAddressTemp;
6836 }
6837 
Hal_SC_set_mcdi_memoryaddress(void * pInstance,MS_PHY u32FBAddress,E_XC_MCDI_TYPE eType)6838 void Hal_SC_set_mcdi_memoryaddress(void *pInstance, MS_PHY u32FBAddress, E_XC_MCDI_TYPE eType)
6839 {
6840     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6841     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6842 
6843     if (eType == E_XC_MCDI_BOTH) // MAIN
6844     {
6845         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0A_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // MAIN ME1 address
6846         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_12_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // MAIN ME2 address
6847     }
6848     else if(eType == E_XC_MCDI_SUB_BOTH) // SUB
6849     {
6850         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_28_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // SUB ME1 address
6851         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2C_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // SUB ME2 address
6852     }
6853     else if(eType == E_XC_MCDI_ME1)
6854     {
6855         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0A_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // MAIN ME1 address
6856     }
6857     else if (eType == E_XC_MCDI_ME2)
6858     {
6859         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_12_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // MAIN ME2 address
6860     }
6861     else if (eType == E_XC_MCDI_SUB_ME1)
6862     {
6863         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_28_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // SUB ME1 address
6864     }
6865     else if (eType == E_XC_MCDI_SUB_ME2)
6866     {
6867         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2C_L, u32FBAddress / MCDI_BYTE_PER_WORD);     // SUB ME2 address
6868     }
6869 }
6870 
Hal_SC_set_mcdi_write_limit(void * pInstance,MS_BOOL bEn,MS_PHY u32LimitAddress,E_XC_MCDI_TYPE eType)6871 void Hal_SC_set_mcdi_write_limit(void *pInstance, MS_BOOL bEn, MS_PHY u32LimitAddress, E_XC_MCDI_TYPE eType)
6872 {
6873     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6874     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6875 
6876     u32LimitAddress = u32LimitAddress / MCDI_BYTE_PER_WORD -1;
6877 
6878     if(eType == E_XC_MCDI_BOTH)
6879     {
6880         // Main/Sub shares the same enable bit of ME1
6881         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_08_L, bEn ? BIT(0) : 0, BIT(0));
6882         // Bit 0 ~ 26
6883         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0C_L, u32LimitAddress & 0xFFFF);
6884         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0D_L, (u32LimitAddress >> 16) & 0x3FF);
6885 
6886         // Main/Sub shares the same enable bit of ME2
6887         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_10_L, bEn ? BIT(0) : 0, BIT(0));
6888         // Bit 0 ~ 26
6889         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_14_L, u32LimitAddress & 0xFFFF);
6890         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_15_L, (u32LimitAddress >> 16) & 0x3FF);
6891     }
6892     else if(eType==E_XC_MCDI_SUB_BOTH)
6893     {
6894         // Main/Sub shares the same enable bit of ME1
6895         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_08_L, bEn ? BIT(0) : 0, BIT(0));
6896         // Bit 0 ~ 26
6897         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2A_L, u32LimitAddress & 0xFFFF);
6898         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2B_L, (u32LimitAddress >> 16) & 0x3FF);
6899 
6900         // Main/Sub shares the same enable bit of ME2
6901         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_10_L, bEn ? BIT(0) : 0, BIT(0));
6902         // Bit 0 ~ 26
6903         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2E_L, u32LimitAddress & 0xFFFF);
6904         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2F_L, (u32LimitAddress >> 16) & 0x3FF);
6905     }
6906     else if(eType == E_XC_MCDI_ME1)
6907     {
6908         // Main/Sub shares the same enable bit
6909         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_08_L, bEn ? BIT(0) : 0, BIT(0));
6910         // Bit 0 ~ 26
6911         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0C_L, u32LimitAddress & 0xFFFF);
6912         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_0D_L, (u32LimitAddress >> 16) & 0x3FF);
6913     }
6914     else if (eType == E_XC_MCDI_ME2)
6915     {
6916         // Main/Sub shares the same enable bit
6917         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_10_L, bEn ? BIT(0) : 0, BIT(0));
6918         // Bit 0 ~ 26
6919         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_14_L, u32LimitAddress & 0xFFFF);
6920         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_15_L, (u32LimitAddress >> 16) & 0x3FF);
6921     }
6922     else if (eType == E_XC_MCDI_SUB_ME1)
6923     {
6924         // Main/Sub shares the same enable bit
6925         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_08_L, bEn ? BIT(0) : 0, BIT(0));
6926         // Bit 0 ~ 26
6927         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2A_L, u32LimitAddress & 0xFFFF);
6928         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2B_L, (u32LimitAddress >> 16) & 0x3FF);
6929     }
6930     else if (eType == E_XC_MCDI_SUB_ME2)
6931     {
6932         // Main/Sub shares the same enable bit
6933         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_10_L, bEn ? BIT(0) : 0, BIT(0));
6934         // Bit 0 ~ 26
6935         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2E_L, u32LimitAddress & 0xFFFF);
6936         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_2F_L, (u32LimitAddress >> 16) & 0x3FF);
6937     }
6938 }
Hal_SC_enable_mcdi(void * pInstance,MS_BOOL bEn,E_XC_MCDI_TYPE eType)6939 void Hal_SC_enable_mcdi(void *pInstance, MS_BOOL bEn, E_XC_MCDI_TYPE eType)
6940 {
6941     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
6942     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
6943 
6944 #define ME1_CTRL_BIT ( BIT(1) )
6945 #define ME2_CTRL_BIT ( BIT(2) )
6946     MS_U16 u16Value = 0;
6947     MS_U16 u16Mask = 0;
6948     switch (eType)
6949     {
6950         case E_XC_MCDI_ME1:
6951             u16Value = u16Value | (bEn ? 0 : ME1_CTRL_BIT);
6952             u16Mask = ME1_CTRL_BIT;
6953             break;
6954         case E_XC_MCDI_ME2:
6955             u16Value = u16Value | (bEn ? 0 : ME2_CTRL_BIT);
6956             u16Mask = ME2_CTRL_BIT;
6957             break;
6958         case E_XC_MCDI_BOTH:
6959             u16Value = u16Value | (bEn ? 0 : ME1_CTRL_BIT);
6960             u16Value = u16Value | (bEn ? 0 : ME2_CTRL_BIT);
6961             u16Mask = ME1_CTRL_BIT | ME2_CTRL_BIT;
6962             break;
6963         case E_XC_MCDI_SUB_ME1:
6964             u16Value = u16Value | ((bEn ? 0 : ME1_CTRL_BIT)<<3);
6965             u16Mask = ME1_CTRL_BIT << 3;
6966             break;
6967         case E_XC_MCDI_SUB_ME2:
6968             u16Value = u16Value | ((bEn ? 0 : ME2_CTRL_BIT)<<3);
6969             u16Mask = ME2_CTRL_BIT << 3;
6970             break;
6971         case E_XC_MCDI_SUB_BOTH:
6972             u16Value = u16Value | ((bEn ? 0 : ME1_CTRL_BIT)<<3);
6973             u16Value = u16Value | ((bEn ? 0 : ME2_CTRL_BIT)<<3);
6974             u16Mask = (ME1_CTRL_BIT | ME2_CTRL_BIT)<<3;
6975             break;
6976         default:
6977             u16Value = 0;
6978             break;
6979     }
6980     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_07_L, u16Value, u16Mask);
6981     if (bEn)
6982     {
6983         // Turn on MIU access arbitor
6984         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_04_L, 0x00 , BIT(6) );
6985     }
6986     else
6987     {
6988         MS_U16 u16MCDiCtrl_Main = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_07_L) & (  ME1_CTRL_BIT | ME2_CTRL_BIT )  ;
6989         MS_U16 u16MCDiCtrl_Sub  = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK17_07_L) & (( ME1_CTRL_BIT | ME2_CTRL_BIT )<<3)  ;
6990         MS_U16 u16MCDiCtrl = u16MCDiCtrl_Main | u16MCDiCtrl_Sub;
6991         // Current ME1/2 is turned off
6992         if ( u16MCDiCtrl  == ( ( ME1_CTRL_BIT | ME2_CTRL_BIT) //  Main_Window
6993                                | ((ME1_CTRL_BIT | ME2_CTRL_BIT)<<3))) // Sub_Window
6994         {
6995             // Turn off arbitor only when all MCDi function is off.
6996             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_04_L,  BIT(6) , BIT(6) );
6997         }
6998     }
6999 }
7000 
7001 /// bandwidth saving Mode
Hal_SC_set_bws_mode(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7002 void Hal_SC_set_bws_mode(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7003 {
7004     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7005     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7006 
7007     if(eWindow == MAIN_WINDOW)
7008     {
7009         //ipm Main
7010         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, (bEnable? 0x00:BIT(0)), BIT(0));
7011     }
7012     else
7013     {
7014         //ipm Sub
7015         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_01_L, (bEnable? 0x00:BIT(1)), BIT(1));
7016     }
7017 }
7018 
Hal_SC_sw_lcnt_en(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7019 void Hal_SC_sw_lcnt_en(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7020 {
7021     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7022     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7023 
7024     if(eWindow == MAIN_WINDOW)
7025     {
7026         //ipm Main
7027         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_11_L, (bEnable? BIT(0):0x00), BIT(0));
7028     }
7029     else
7030     {
7031         //ipm Sub
7032         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_21_L, (bEnable? BIT(0):0x00), BIT(0));
7033     }
7034 }
7035 
Hal_SC_set_sw_lcnt(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7036 void Hal_SC_set_sw_lcnt(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7037 {
7038     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7039     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7040 
7041     if(eWindow == MAIN_WINDOW)
7042     {
7043         //ipm Main
7044         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_11_L, (bEnable? BIT(1):0x00), BIT(1));
7045     }
7046     else
7047     {
7048         //ipm Sub
7049         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_21_L, (bEnable? BIT(1):0x00), BIT(1));
7050     }
7051 }
7052 
Hal_SC_set_ipmw_lcnt_inv(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7053 void Hal_SC_set_ipmw_lcnt_inv(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7054 {
7055     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7056     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7057 
7058     if(eWindow == MAIN_WINDOW)
7059     {
7060         //ipm Main
7061         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_12_L, (bEnable? BIT(4):0x00), BIT(4));
7062     }
7063     else
7064     {
7065         //ipm Sub
7066         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_22_L, (bEnable? BIT(4):0x00), BIT(4));
7067     }
7068 }
7069 
Hal_SC_set_ipmr_lcnt_inv(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7070 void Hal_SC_set_ipmr_lcnt_inv(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7071 {
7072     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7073     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7074 
7075     if(eWindow == MAIN_WINDOW)
7076     {
7077         //ipm Main
7078         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_12_L, (bEnable? BIT(12):0x00), BIT(12));
7079     }
7080     else
7081     {
7082         //ipm Sub
7083         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_22_L, (bEnable? BIT(12):0x00), BIT(12));
7084     }
7085 }
7086 
Hal_SC_set_opm_lcnt_inv(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7087 void Hal_SC_set_opm_lcnt_inv(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7088 {
7089     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7090     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7091     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7092     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7093 
7094     if(eWindow == MAIN_WINDOW)
7095     {
7096         //opm Main
7097         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_32_L, (bEnable? BIT(5):0x00), BIT(5));
7098     }
7099     else
7100     {
7101         //opm Sub
7102         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK08_32_L, (bEnable? BIT(4):0x00), BIT(4));
7103     }
7104 
7105 }
7106 
MHal_XC_Calc_IGainPGain(void * pInstance,MS_U8 * u8GainI,MS_U8 * u8GainP,MS_U32 u32XTAL_Clock,MS_U8 u8LGain,MS_U8 u8Vco,MS_U16 u16HTotal,MS_U16 u16VTotal,MS_U8 u8FRC_Out)7107 void MHal_XC_Calc_IGainPGain(void *pInstance, MS_U8 *u8GainI, MS_U8 *u8GainP, MS_U32 u32XTAL_Clock, MS_U8 u8LGain, MS_U8 u8Vco, MS_U16 u16HTotal, MS_U16 u16VTotal, MS_U8 u8FRC_Out)
7108 {
7109     MS_U32 u32Factor, u32Temp;
7110     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7111     UtopiaResourceGetPrivate(g_pXCResource[E_XC_POOL_ID_INTERNAL_VARIABLE],(void**)(&pXCResourcePrivate));
7112     u32Temp = (MS_U32)(u16VTotal*u16HTotal*u8FRC_Out);
7113     u32XTAL_Clock*=2;
7114     u32Factor = ((LVDS_MPLL_CLOCK_MHZ*1000000UL/u32XTAL_Clock)*524288*u8LGain)/((MS_U32)(u32Temp*u8Vco/2*8));
7115 
7116     XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "MM=%ld,u8LGain1=%d,Htt=%d,Vtt=%d,Ovs=%d,Vco=%d,i_gain=%td,REGIg=%d,u32XTAL_Clock=%tu\n",
7117                  (LVDS_MPLL_CLOCK_MHZ*1000000UL/pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.u32XTAL_Clock),u8LGain,
7118                  u16HTotal,u16VTotal,u8FRC_Out,u8Vco/2,(ptrdiff_t)u32Factor,MHal_SC_cal_usedgain_to_reggain(u32Factor),(ptrdiff_t)u32XTAL_Clock);
7119 
7120     *u8GainI = MHal_SC_cal_usedgain_to_reggain(u32Factor);
7121     /// for high accurate log value
7122     u32Factor = ((LVDS_MPLL_CLOCK_MHZ*1000000UL/u32XTAL_Clock)*524288*u8LGain*10)/((MS_U32)(u32Temp*u8Vco/2*8));
7123 
7124     XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "new i_gain=%td\n", (ptrdiff_t)u32Factor);
7125 
7126     if(u32Factor <= 1)
7127         *u8GainI=2;
7128     else if(u32Factor <= 3)
7129         *u8GainI=3;
7130     else if(u32Factor <= 7)
7131         *u8GainI=4;
7132 
7133     *u8GainP = *u8GainI+1;
7134 
7135     XC_LOG_TRACE(XC_DBGLEVEL_SETTIMING, "==>LG1=%d,iGain=%td,I=%d,P=%d\n",u8LGain,(ptrdiff_t)u32Factor,*u8GainI,*u8GainP);
7136 }
7137 
MHAL_SC_set_osdc_tgen_hsync_start(void * pInstance,MS_U16 u16Value)7138 void MHAL_SC_set_osdc_tgen_hsync_start(void *pInstance, MS_U16 u16Value)
7139 {
7140     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7141     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7142 
7143     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_01_L, u16Value, 0x1FFF);
7144 }
7145 
MHAL_SC_set_osdc_tgen_hsync_end(void * pInstance,MS_U16 u16Value)7146 void MHAL_SC_set_osdc_tgen_hsync_end(void *pInstance, MS_U16 u16Value)
7147 {
7148     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7149     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7150 
7151     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_02_L, u16Value, 0x1FFF);
7152 }
7153 
MHAL_SC_set_osdc_tgen_hframe_de_start(void * pInstance,MS_U16 u16Value)7154 void MHAL_SC_set_osdc_tgen_hframe_de_start(void *pInstance, MS_U16 u16Value)
7155 {
7156     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7157     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7158 
7159     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_03_L, u16Value, 0x1FFF);
7160 }
7161 
MHAL_SC_set_osdc_tgen_hframe_de_end(void * pInstance,MS_U16 u16Value)7162 void MHAL_SC_set_osdc_tgen_hframe_de_end(void *pInstance, MS_U16 u16Value)
7163 {
7164     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7165     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7166 
7167     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_04_L, u16Value, 0x1FFF);
7168 }
7169 
MHAL_SC_set_osdc_tgen_htotal(void * pInstance,MS_U16 u16Value)7170 void MHAL_SC_set_osdc_tgen_htotal(void *pInstance, MS_U16 u16Value)
7171 {
7172     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7173     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7174 
7175     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_05_L, u16Value, 0x1FFF);
7176 }
7177 
MHAL_SC_set_osdc_tgen_vtotal(void * pInstance,MS_U16 u16Value)7178 void MHAL_SC_set_osdc_tgen_vtotal(void *pInstance, MS_U16 u16Value)
7179 {
7180     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7181     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7182 
7183     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_07_L, u16Value, 0x1FFF);
7184 }
7185 
MHAL_SC_set_osdc_tgen_vframe_de_start(void * pInstance,MS_U16 u16Value)7186 void MHAL_SC_set_osdc_tgen_vframe_de_start(void *pInstance, MS_U16 u16Value)
7187 {
7188     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7189     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7190 
7191     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0A_L, u16Value, 0x1FFF);
7192 }
7193 
MHAL_SC_set_osdc_tgen_vframe_de_end(void * pInstance,MS_U16 u16Value)7194 void MHAL_SC_set_osdc_tgen_vframe_de_end(void *pInstance, MS_U16 u16Value)
7195 {
7196     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7197     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7198 
7199     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0B_L, u16Value, 0x1FFF);
7200 }
7201 
MHAL_SC_set_osdc_tgen_vsync_start(void * pInstance,MS_U16 u16Value)7202 void MHAL_SC_set_osdc_tgen_vsync_start(void *pInstance, MS_U16 u16Value)
7203 {
7204     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7205     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7206 
7207     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0E_L, u16Value, 0x1FFF);
7208 }
7209 
MHAL_SC_set_osdc_tgen_vsync_end(void * pInstance,MS_U16 u16Value)7210 void MHAL_SC_set_osdc_tgen_vsync_end(void *pInstance, MS_U16 u16Value)
7211 {
7212     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7213     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7214 
7215     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0F_L, u16Value, 0x1FFF);
7216 }
7217 
MHAL_SC_set_osdc_tgen_reset_enable(void * pInstance,MS_BOOL bEnable)7218 void MHAL_SC_set_osdc_tgen_reset_enable(void *pInstance, MS_BOOL bEnable)
7219 {
7220     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7221     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7222 
7223     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_20_L, bEnable?BIT(0):0x00, BIT(0));
7224 }
7225 
MHAL_SC_set_osdc_swreset_enable(void * pInstance,MS_BOOL bEnable)7226 void MHAL_SC_set_osdc_swreset_enable(void *pInstance, MS_BOOL bEnable)
7227 {
7228     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7229     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7230 
7231     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_21_L, bEnable?BIT(0):0x00, BIT(0));
7232 }
7233 
MHAL_SC_set_osdc_mixer_bypass_enable(void * pInstance,MS_BOOL bEnable)7234 void MHAL_SC_set_osdc_mixer_bypass_enable(void *pInstance, MS_BOOL bEnable)
7235 {
7236     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7237     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7238 
7239     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, bEnable?BIT(0):0x00, BIT(0));
7240 }
7241 
MHAL_SC_set_osdc_mixer_inv_alpha_enable(void * pInstance,MS_BOOL bEnable)7242 void MHAL_SC_set_osdc_mixer_inv_alpha_enable(void *pInstance, MS_BOOL bEnable)
7243 {
7244     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7245     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7246 
7247     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, bEnable?BIT(1):0x00, BIT(1));
7248 }
7249 //1:hs_out = hs&vfde
MHAL_SC_set_osdc_mixer_hs_n_vfde_enable(void * pInstance,MS_BOOL bEnable)7250 void MHAL_SC_set_osdc_mixer_hs_n_vfde_enable(void *pInstance, MS_BOOL bEnable)
7251 {
7252     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7253     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7254 
7255     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, bEnable?BIT(2):0x00, BIT(2));
7256 }
7257 //1:de(hfde)_out = de(hfde)&vfde
MHAL_SC_set_osdc_mixer_hfde_n_vfde_enable(void * pInstance,MS_BOOL bEnable)7258 void MHAL_SC_set_osdc_mixer_hfde_n_vfde_enable(void *pInstance, MS_BOOL bEnable)
7259 {
7260     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7261     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7262 
7263     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, bEnable?BIT(3):0x00, BIT(3));
7264 }
7265 
MHAL_SC_set_osdc_clk_mux(void * pInstance,MS_U8 u8Clk_Mux)7266 void MHAL_SC_set_osdc_clk_mux(void *pInstance, MS_U8 u8Clk_Mux)
7267 {
7268     MDrv_WriteByteMask(REG_CKG_OSDC, u8Clk_Mux << 2, CKG_OSDC_MASK);
7269 }
7270 
MHAL_SC_enable_osdc(void * pInstance,MS_BOOL bEnable)7271 void MHAL_SC_enable_osdc(void *pInstance, MS_BOOL bEnable)
7272 {
7273     // Enable OSDC LPLL
7274     if(bEnable)
7275     {
7276         MDrv_WriteRegBit(REG_CKG_OSDC, DISABLE, CKG_OSDC_INVERT);                   // Not Invert
7277         MDrv_WriteRegBit(REG_CKG_OSDC, DISABLE, CKG_OSDC_GATED);                    // Enable clock
7278     }
7279     else
7280     {
7281         MDrv_WriteRegBit(REG_CKG_OSDC, ENABLE, CKG_OSDC_INVERT);                   // Not Invert
7282         MDrv_WriteRegBit(REG_CKG_OSDC, ENABLE, CKG_OSDC_GATED);                    // Enable clock
7283     }
7284 }
7285 
MHAL_SC_get_osdc_tgen_hsync_start(void * pInstance)7286 MS_U16 MHAL_SC_get_osdc_tgen_hsync_start(void *pInstance)
7287 {
7288     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7289     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7290 
7291     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_01_L, 0x1FFF);
7292 }
7293 
MHAL_SC_get_osdc_tgen_hsync_end(void * pInstance)7294 MS_U16 MHAL_SC_get_osdc_tgen_hsync_end(void *pInstance)
7295 {
7296     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7297     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7298 
7299     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_02_L, 0x1FFF);
7300 }
7301 
MHAL_SC_get_osdc_tgen_hframe_de_start(void * pInstance)7302 MS_U16 MHAL_SC_get_osdc_tgen_hframe_de_start(void *pInstance)
7303 {
7304     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7305     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7306 
7307     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_03_L, 0x1FFF);
7308 }
7309 
MHAL_SC_get_osdc_tgen_hframe_de_end(void * pInstance)7310 MS_U16 MHAL_SC_get_osdc_tgen_hframe_de_end(void *pInstance)
7311 {
7312     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7313     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7314 
7315     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_04_L, 0x1FFF);
7316 }
7317 
MHAL_SC_get_osdc_tgen_htotal(void * pInstance)7318 MS_U16 MHAL_SC_get_osdc_tgen_htotal(void *pInstance)
7319 {
7320     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7321     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7322 
7323     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_05_L, 0x1FFF);
7324 }
7325 
MHAL_SC_get_osdc_tgen_vtotal(void * pInstance)7326 MS_U16 MHAL_SC_get_osdc_tgen_vtotal(void *pInstance)
7327 {
7328     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7329     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7330 
7331     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_07_L, 0x1FFF);
7332 }
7333 
MHAL_SC_get_osdc_tgen_vframe_de_start(void * pInstance)7334 MS_U16 MHAL_SC_get_osdc_tgen_vframe_de_start(void *pInstance)
7335 {
7336     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7337     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7338 
7339     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0A_L, 0x1FFF);
7340 }
7341 
MHAL_SC_get_osdc_tgen_vframe_de_end(void * pInstance)7342 MS_U16 MHAL_SC_get_osdc_tgen_vframe_de_end(void *pInstance)
7343 {
7344     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7345     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7346 
7347     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0B_L, 0x1FFF);
7348 }
7349 
MHAL_SC_get_osdc_tgen_vsync_start(void * pInstance)7350 MS_U16 MHAL_SC_get_osdc_tgen_vsync_start(void *pInstance)
7351 {
7352     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7353     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7354 
7355     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0E_L, 0x1FFF);
7356 }
7357 
MHAL_SC_get_osdc_tgen_vsync_end(void * pInstance)7358 MS_U16 MHAL_SC_get_osdc_tgen_vsync_end(void *pInstance)
7359 {
7360     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7361     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7362 
7363     return (MS_U16)SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_0F_L, 0x1FFF);
7364 }
7365 
MHAL_SC_get_osdc_mixer_bypass_status(void * pInstance)7366 MS_BOOL MHAL_SC_get_osdc_mixer_bypass_status(void *pInstance)
7367 {
7368     MS_BOOL bEnable = DISABLE;
7369     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7370     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7371 
7372     bEnable = (MS_BOOL)(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, BIT(0)));
7373     return bEnable;
7374 }
7375 
MHAL_SC_get_osdc_mixer_inv_alpha_status(void * pInstance)7376 MS_BOOL MHAL_SC_get_osdc_mixer_inv_alpha_status(void *pInstance)
7377 {
7378     MS_BOOL bEnable = DISABLE;
7379     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7380     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7381 
7382     bEnable = (MS_BOOL)(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, BIT(1))>>1);
7383     return bEnable;
7384 }
7385 //1:hs_out = hs&vfde
MHAL_SC_get_osdc_mixer_hs_n_vfde_status(void * pInstance)7386 MS_BOOL MHAL_SC_get_osdc_mixer_hs_n_vfde_status(void *pInstance)
7387 {
7388     MS_BOOL bEnable = DISABLE;
7389     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7390     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7391 
7392     bEnable = (MS_BOOL)(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, BIT(2))>>2);
7393     return bEnable;
7394 }
7395 //1:de(hfde)_out = de(hfde)&vfde
MHAL_SC_get_osdc_mixer_hfde_n_vfde_status(void * pInstance)7396 MS_BOOL MHAL_SC_get_osdc_mixer_hfde_n_vfde_status(void *pInstance)
7397 {
7398     MS_BOOL bEnable = DISABLE;
7399     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7400     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7401 
7402     bEnable = (MS_BOOL)(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK37_22_L, BIT(3))>>3);
7403     return bEnable;
7404 }
7405 
MHAL_SC_get_osdc_onoff_status(void * pInstance)7406 MS_BOOL MHAL_SC_get_osdc_onoff_status(void *pInstance)
7407 {
7408     // Enable OSDC LPLL
7409     MS_BOOL bEnable = DISABLE;
7410     bEnable = (MS_BOOL)(MDrv_ReadRegBit(REG_CKG_OSDC, CKG_OSDC_GATED));
7411     return bEnable;
7412 }
7413 
MHal_XC_SetForceCurrentReadBank(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7414 void MHal_XC_SetForceCurrentReadBank(void *pInstance,MS_BOOL bEnable, SCALER_WIN eWindow)
7415 {
7416     UNUSED(pInstance);
7417     UNUSED(bEnable);
7418     UNUSED(eWindow);
7419 }
7420 
MHal_XC_SetForceReadBank(void * pInstance,MS_BOOL bEnable,MS_U8 u8Bank,SCALER_WIN eWindow)7421 void MHal_XC_SetForceReadBank(void *pInstance, MS_BOOL bEnable, MS_U8 u8Bank, SCALER_WIN eWindow)
7422 {
7423     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7424     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7425     if (eWindow == MAIN_WINDOW)
7426     {
7427         if (bEnable)
7428         {
7429             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(11), BIT(11));
7430             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, (u8Bank & 0x7) << 8, BIT(10)|BIT(9)|BIT(8));
7431             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, ((u8Bank & 0x8) >> 3) << 14, BIT(14));
7432         }
7433         else
7434         {
7435             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0, BIT(11));
7436             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0, BIT(10)|BIT(9)|BIT(8));
7437             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_06_L, 0, BIT(14));
7438         }
7439     }
7440     else
7441     {
7442         if (bEnable)
7443         {
7444             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, BIT(11), BIT(11));
7445             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, (u8Bank & 0x7) << 8, BIT(10)|BIT(9)|BIT(8));
7446             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_46_L, ((u8Bank & 0x8) >> 3) << 14, BIT(14));
7447         }
7448         else
7449         {
7450             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, 0, BIT(11));
7451             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_47_L, 0, BIT(10)|BIT(9)|BIT(8));
7452             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_46_L, 0, BIT(14));
7453         }
7454     }
7455 }
7456 
MHal_XC_SetDNRBufAddress(void * pInstance,MS_PHY u32DNRBaseAddr,SCALER_WIN eWindow)7457 MS_BOOL MHal_XC_SetDNRBufAddress(void *pInstance, MS_PHY u32DNRBaseAddr, SCALER_WIN eWindow)
7458 {
7459     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7460     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7461     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7462     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7463     pXCResourcePrivate->sthal_SC._u32DNRBaseAddress[eWindow] = u32DNRBaseAddr;
7464     return TRUE;
7465 }
7466 
MHal_XC_GetDNRBufAddress(void * pInstance,SCALER_WIN eWindow)7467 MS_PHY MHal_XC_GetDNRBufAddress(void *pInstance, SCALER_WIN eWindow)
7468 {
7469     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7470     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7471     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7472     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7473     return pXCResourcePrivate->sthal_SC._u32DNRBaseAddress[eWindow] ;
7474 }
7475 
MHal_XC_SetDNRBufSize(void * pInstance,MS_PHY u32DNRBufSize,SCALER_WIN eWindow)7476 MS_BOOL MHal_XC_SetDNRBufSize(void *pInstance, MS_PHY u32DNRBufSize, SCALER_WIN eWindow)
7477 {
7478     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7479     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7480     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7481     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7482     pXCResourcePrivate->sthal_SC._u32DNRBufferSize[eWindow] = u32DNRBufSize;
7483     return TRUE;
7484 }
7485 
MHal_XC_GetDNRBufSize(void * pInstance,SCALER_WIN eWindow)7486 MS_PHY MHal_XC_GetDNRBufSize(void *pInstance, SCALER_WIN eWindow)
7487 {
7488     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7489     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7490     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7491     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7492     return pXCResourcePrivate->sthal_SC._u32DNRBufferSize[eWindow] ;
7493 }
7494 
MHal_XC_SetFRCMBufAddress(void * pInstance,MS_PHY u32BaseAddr,SCALER_WIN eWindow)7495 MS_BOOL MHal_XC_SetFRCMBufAddress(void *pInstance, MS_PHY u32BaseAddr, SCALER_WIN eWindow)
7496 {
7497     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7498     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7499     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7500     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7501     pXCResourcePrivate->sthal_SC._u32FRCBaseAddress[eWindow] = u32BaseAddr;
7502     return TRUE;
7503 }
7504 
MHal_XC_GetFRCMBufAddress(void * pInstance,SCALER_WIN eWindow)7505 MS_PHY MHal_XC_GetFRCMBufAddress(void *pInstance, SCALER_WIN eWindow)
7506 {
7507     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7508     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7509     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7510     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7511     return pXCResourcePrivate->sthal_SC._u32FRCBaseAddress[eWindow] ;
7512 }
7513 
MHal_XC_SetFRCMBufSize(void * pInstance,MS_PHY u32BufSize,SCALER_WIN eWindow)7514 MS_BOOL MHal_XC_SetFRCMBufSize(void *pInstance, MS_PHY u32BufSize, SCALER_WIN eWindow)
7515 {
7516     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7517     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7518     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7519     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7520     pXCResourcePrivate->sthal_SC._u32FRCBufferSize[eWindow] = u32BufSize;
7521     return TRUE;
7522 }
7523 
MHal_XC_GetFRCMBufSize(void * pInstance,SCALER_WIN eWindow)7524 MS_PHY MHal_XC_GetFRCMBufSize(void *pInstance, SCALER_WIN eWindow)
7525 {
7526     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7527     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7528     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7529     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7530     return pXCResourcePrivate->sthal_SC._u32FRCBufferSize[eWindow] ;
7531 }
7532 
MHal_XC_SetDualDNRBufAddress(void * pInstance,MS_PHY u32DNRBaseAddr,SCALER_WIN eWindow)7533 MS_BOOL MHal_XC_SetDualDNRBufAddress(void *pInstance, MS_PHY u32DNRBaseAddr, SCALER_WIN eWindow)
7534 {
7535     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7536     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7537     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7538     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7539     pXCResourcePrivate->_u32DualDNRBaseAddress[eWindow] = u32DNRBaseAddr;
7540     return TRUE;
7541 }
7542 
MHal_XC_GetDualDNRBufAddress(void * pInstance,SCALER_WIN eWindow)7543 MS_PHY MHal_XC_GetDualDNRBufAddress(void *pInstance, SCALER_WIN eWindow)
7544 {
7545     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7546     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7547     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7548     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7549     return pXCResourcePrivate->_u32DualDNRBaseAddress[eWindow];
7550 }
7551 
MHal_XC_SetDualDNRBufSize(void * pInstance,MS_PHY u32DNRBufSize,SCALER_WIN eWindow)7552 MS_BOOL MHal_XC_SetDualDNRBufSize(void *pInstance, MS_PHY u32DNRBufSize, SCALER_WIN eWindow)
7553 {
7554     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7555     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7556     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7557     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7558     pXCResourcePrivate->_u32DualDNRBufferSize[eWindow] = u32DNRBufSize;
7559     return TRUE;
7560 }
7561 
MHal_XC_GetDualDNRBufSize(void * pInstance,SCALER_WIN eWindow)7562 MS_PHY MHal_XC_GetDualDNRBufSize(void *pInstance, SCALER_WIN eWindow)
7563 {
7564     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7565     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7566     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7567     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7568     return pXCResourcePrivate->_u32DualDNRBufferSize[eWindow] ;
7569 }
7570 
MHal_XC_Init_Patch(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)7571 MS_BOOL MHal_XC_Init_Patch(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
7572 {
7573     if (eWindow >= MAX_WINDOW)
7574     {
7575         printf("[%s,%5d] maximum window exceeded",__FUNCTION__,__LINE__);
7576         return FALSE;
7577     }
7578 
7579     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7580     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7581     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7582     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7583 
7584 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
7585     //FIX ME:review manhattan need it?
7586     if (psXCInstPri->u32DeviceID >= 1)
7587     {
7588         // by HW RD's request, for sub video BW issue, adjust R/W line buffer length
7589         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_20_L, 0x1E1E);
7590         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_21_L, 0x1E1E);
7591         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_22_L, 0x1E1E);
7592         SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_23_L, 0x1010);
7593         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_24_L, 0x20, 0xFF);
7594         return FALSE;
7595     }
7596 #endif
7597 
7598     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_6F_L, 0x20, 0x3F); // by HW RD's request, for BB section offset issue
7599 
7600     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_25_L, 0x3030); // by HW RD's request, for HDMI 4K BW issue, adjust R/W line buffer length
7601 #ifdef UFO_XC_SUPPORT_DUAL_MIU
7602     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK52_25_L, 0x3030); // by HW RD's request, for HDMI 4K BW issue, adjust R/W line buffer length
7603 #endif
7604 
7605     // SW patch for Monaco
7606     // by HW RD's request, to fix HDMI 1080i repeat garbage at left side
7607     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_37_L, 0x20); // bypass main line buffer length setting
7608     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK11_37_L, 0x20); // bypass sub line buffer length setting
7609 
7610     // ECO item for Monaco: hvsp PIP B section last flag error
7611     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_5F_L, BIT(14), BIT(14));
7612 
7613     // ECO item for Monaco: ip2ve 4K path Vsync need inverse
7614     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_7F_L, BIT(14), BIT(14));
7615     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK04_7F_L, BIT(14), BIT(14));
7616 
7617     // SW patch for muji : 4k2k 3D LA out show garbage on the top, issue with BW
7618     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK58_10_L, 0x0000, BIT(0));//disable SCM sub OP
7619 
7620     // BK00_03[13] conflict with compression mode (patch for HW issue)
7621     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, 0x0000, 0x2000);
7622 
7623     if(MDrv_ReadByte(REG_CHIP_REVISION) < 1)//Monaco U02 fix .
7624     {
7625         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK23_53_L, 0x00, BIT(10));
7626     }
7627 
7628     //U03 compatible setting
7629     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK32_66_L, BIT(13), BIT(13));
7630 
7631     ///Patch here ////
7632 #if (FRC_INSIDE)
7633     MHal_FRC_interrupt_mask(pInstance, 0xFF);
7634 
7635     //enable fsc clk
7636     MDrv_WriteByteMask( REG_FSC_BK20_05, 0x10, 0x10); // reg_ckg_ficlk
7637 #endif
7638 
7639     // SW patch for Eisntein
7640     // With HW Auto no signal case,  sub video source change would causes OP1 broken, looks like main video broken
7641     Hal_SC_ip_enable_turnoff_OP1_for_AutoNoSignal(pInstance, DISABLE);
7642 
7643     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_61_L, 0x01, 0x03); // for HDMI 2.0, always receive 444 format
7644     SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK01_63_L, 0x01, 0x01); // for HDMI odd Htt support
7645 
7646     // SW patch for Maserati only
7647     // bug fix for mantis 1031600: AC on/off see all pink video, reproduce rate about 1/20
7648     // Maserati HW would adjust the Vtt, sometimes the FRC trig (bk68_65/66) > Vtt causes no video
7649     // bk68_38[0] = 1 would makes the HW not to adjust Vtt, it will use bk10_0D to be Vtt
7650     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_38_L, BIT(0), BIT(0));
7651 
7652     // SW patch for Maserati only
7653     // For sub video flicker issue, need to invert clk by default
7654     MDrv_WriteRegBit(REG_CLKGEN2_BASE + 0x87, TRUE, BIT(1));//FIXME:patch for PIP
7655 
7656     return TRUE;
7657 }
MHal_XC_IsPNLYUVOutput(void * pInstance)7658 MS_BOOL MHal_XC_IsPNLYUVOutput(void *pInstance)
7659 {
7660     MS_BOOL bIsPNLYUVOutput = TRUE;
7661 #if 0//below is logic from TV, need box RD's confirm, disable it temporary
7662     MS_BOOL bIsY2REnable = FALSE, bIsR2YEnable = FALSE;
7663     SCALER_WIN eWindow = MAIN_WINDOW;
7664     MS_U16 u16Temp = 0;
7665     //Get CSC state before OP2
7666     if(gSrcInfo[MAIN_WINDOW].bBlackscreenEnabled || gSrcInfo[MAIN_WINDOW].bBluescreenEnabled)
7667     {
7668         //Main is mute, so check sub
7669         if(Hal_SC_Is_subwindow_enable())
7670         {
7671             if(!(gSrcInfo[SUB_WINDOW].bBlackscreenEnabled || gSrcInfo[SUB_WINDOW].bBluescreenEnabled))
7672             {
7673                 eWindow = SUB_WINDOW;
7674             }
7675         }
7676     }
7677 
7678     if(eWindow == MAIN_WINDOW)
7679     {
7680         u16Temp = SC_R2BYTE(REG_SC_BK10_2F_L);
7681         if((u16Temp & ( BIT(0) | BIT(2) | BIT(4))) == ( BIT(0) | BIT(2) | BIT(4)))
7682         {
7683             bIsY2REnable =  TRUE;
7684         }
7685     }
7686     else
7687     {
7688         u16Temp = SC_R2BYTE(REG_SC_BK0F_26_L);
7689         if((u16Temp & ( BIT(0) | BIT(2) | BIT(4))) == ( BIT(0) | BIT(2) | BIT(4)))
7690         {
7691             bIsY2REnable =  TRUE;
7692         }
7693     }
7694 
7695     if(bIsY2REnable)
7696     {
7697         bIsPNLYUVOutput = FALSE;
7698     }
7699     else
7700     {
7701         //OP Y2R disable, so check op input
7702         if(eWindow == MAIN_WINDOW)
7703         {
7704             bIsR2YEnable = (MS_BOOL)(SC_R2BYTEMSK(REG_SC_BK02_40_L, BIT(3)) || SC_R2BYTEMSK(REG_SC_BK18_06_L, BIT(0)));
7705 
7706         }
7707         else
7708         {
7709             bIsR2YEnable = (MS_BOOL)(SC_R2BYTEMSK(REG_SC_BK04_40_L, BIT(3)) || SC_R2BYTEMSK(REG_SC_BK18_76_L, BIT(0)));
7710         }
7711 
7712         if(bIsR2YEnable)
7713         {
7714             //Y2R enable
7715             bIsPNLYUVOutput = TRUE;
7716         }
7717         else
7718         {
7719             //All Csc is off, so check input
7720             //VGA/DVI/rgb HDMI is rgb input
7721             if(  IsSrcTypeVga(gSrcInfo[eWindow].enInputSourceType) //VGA
7722                  ||IsSrcTypeDVI(gSrcInfo[eWindow].enInputSourceType) //DVI
7723                  ||(  IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType)
7724                       &&(g_HdmiPollingStatus.bIsHDMIMode == TRUE)
7725                       &&(g_HdmiPollingStatus.u8ColorFormat == MS_HDMI_COLOR_RGB))//HDMI RGB
7726                  ||(  IsSrcTypeHDMI(gSrcInfo[eWindow].enInputSourceType)
7727                       &&(g_HdmiPollingStatus.bIsHDMIMode == FALSE)) //HDMI_DVI
7728               )
7729             {
7730                 bIsPNLYUVOutput = FALSE;
7731             }
7732             else
7733             {
7734                 bIsPNLYUVOutput = TRUE;
7735             }
7736         }
7737     }
7738 #endif
7739     return bIsPNLYUVOutput;
7740 }
7741 
Hal_SC_Init(void * pInstance)7742 MS_BOOL Hal_SC_Init(void *pInstance)
7743 {
7744     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7745     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7746     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7747     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7748 
7749 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
7750     MHal_FRC_Composer_User_Mode_Enable(pInstance, ENABLE);
7751     MHal_FRC_Set_Composer_User_Mode(pInstance, E_FRC_COMPOSER_SOURCE_MODE_FRC, FALSE); //Default init FRC.
7752     //MHal_FRC_Set_Composer_User_Mode(pInstance, E_FRC_COMPOSER_SOURCE_MODE_VIP, FALSE);
7753     MHal_FRC_Set_Pipe_Delay_Mode(pInstance, (E_FRC_PIPE_DELAY_MODE_USER|PIP_DELAY_COUNTER_RESET));
7754     MHal_FRC_Set_Pipe_Delay_Value(pInstance, FRC_PIPE_DELAY_HCNT_FRC, FRC_PIPE_DELAY_VCNT_FSC_FHD);
7755     MHal_FRC_Set_FSC_DE_Selection(pInstance, E_FRC_FSC_SOURCE_MODE_FDE); // make FSC use FDE range from VIP to do SR
7756 
7757     // For FSC/FRC clk init
7758     MHal_CLKGEN_FRC_Init(pInstance, pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u8LPLL_Mode);
7759 
7760     // For STGEN init
7761     MHal_FRC_TGEN_Init(pInstance);
7762 
7763     // For STGEN init setting
7764     MST_PANEL_INFO_t stFRCPanelInfo;
7765     if (FALSE == pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.FRCInfo.bFRC)
7766     {
7767         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelHSyncWidth = pXCResourcePrivate->stdrvXC_Display._u16DefaultHSyncWidth;
7768         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelHSyncBackPorch = pXCResourcePrivate->stdrvXC_Display._u16DefaultHSyncBackPorch;
7769         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelVSyncWidth = pXCResourcePrivate->stdrvXC_Display._u16DefaultVSyncWidth;
7770         pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc.u8PanelVSyncBackPorch = pXCResourcePrivate->stdrvXC_Display._u16DefaultVSyncBackPorch;
7771     }
7772 
7773     MDrv_FRC_PNLInfo_Transform(pInstance, &pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo,&pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_Pnl_Misc, &stFRCPanelInfo);
7774     MDrv_FRC_Tx_SetTgen(pInstance, &stFRCPanelInfo);
7775 
7776     if (IsVBY1_16LANE((MS_U8)(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type)))
7777     {
7778         // Maserati mode
7779         MHal_FRC_Set_3D_QMap(pInstance, E_FRC_PNL_TYPE_2D, E_XC_3D_INPUT_MODE_NONE, E_XC_3D_OUTPUT_MODE_NONE, E_XC_3D_OUTPUT_FI_MODE_NONE);
7780         MHal_FRC_ByPass_Enable(pInstance, FALSE); // always enable FRC
7781     }
7782     else
7783     {
7784         MHal_FRC_ByPass_Enable(pInstance, TRUE); // default disable FRC
7785     }
7786 
7787 #endif
7788 
7789 #if 0
7790     MHal_XC_FRCR2_IP_Patch(pInstance, MAIN_WINDOW);
7791     MHal_XC_FRCR2_OP_Patch(pInstance, MAIN_WINDOW);
7792 #endif
7793 
7794     //set the delay line cnt to vfde end, for HW RD jeff's advice
7795     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_19_L, BIT(6), BIT(6)|BIT(0));
7796 
7797     return TRUE;
7798 }
7799 
Hal_SC_Get_Device_Offset(MS_U8 deviceIdx)7800 MS_U32 Hal_SC_Get_Device_Offset(MS_U8 deviceIdx)
7801 {
7802     MS_U32 ret_U32 = 0 ;
7803     if(deviceIdx == 0 )
7804     {
7805         ret_U32 = MAX_XC_DEVICE0_OFFSET;
7806     }
7807     else if(deviceIdx == 1)
7808     {
7809         ret_U32 = MAX_XC_DEVICE1_OFFSET;
7810     }
7811     return ret_U32;
7812 }
7813 
HAL_SC_Set_LB_MergeAddress(void * pInstance)7814 void HAL_SC_Set_LB_MergeAddress(void *pInstance)
7815 {
7816     return;
7817 }
7818 
Hal_SC_set_edclk(void * pInstance,MS_U8 u8Clk_Mux,MS_BOOL bEnable,SCALER_WIN eWindow)7819 void Hal_SC_set_edclk(void *pInstance, MS_U8 u8Clk_Mux, MS_BOOL bEnable, SCALER_WIN eWindow)
7820 {
7821     if(eWindow==MAIN_WINDOW)
7822     {
7823         MDrv_WriteByteMask(REG_CKG_EDCLK_F2, (bEnable? 0x00 : CKG_EDCLK_F2_GATED), CKG_EDCLK_F2_GATED);
7824         if(bEnable)
7825             MDrv_WriteByteMask(REG_CKG_EDCLK_F2, u8Clk_Mux, CKG_EDCLK_F2_MASK);
7826     }
7827     else if(eWindow==SUB_WINDOW)
7828     {
7829         MDrv_WriteByteMask(REG_CKG_EDCLK_F1, (bEnable? 0x00 : CKG_EDCLK_F1_GATED), CKG_EDCLK_F1_GATED);
7830         if(bEnable)
7831             MDrv_WriteByteMask(REG_CKG_EDCLK_F1, u8Clk_Mux, CKG_EDCLK_F1_MASK);
7832     }
7833 }
7834 
Hal_SC_set_ficlk2(void * pInstance,MS_U8 u8Clk_Mux,MS_BOOL bEnable,SCALER_WIN eWindow)7835 void Hal_SC_set_ficlk2(void *pInstance, MS_U8 u8Clk_Mux, MS_BOOL bEnable, SCALER_WIN eWindow)
7836 {
7837     if(eWindow==MAIN_WINDOW)
7838     {
7839         MDrv_WriteByteMask(REG_CKG_FICLK2_F2, (bEnable? 0x00 : CKG_FICLK2_F2_GATED), CKG_FICLK2_F2_GATED);
7840         if(bEnable)
7841             MDrv_WriteByteMask(REG_CKG_FICLK2_F2, u8Clk_Mux, CKG_FICLK2_F2_MASK);
7842     }
7843     else if(eWindow==SUB_WINDOW)
7844     {
7845         printf("[%s,%5d] ficlk2_f2 not support sub!",__FUNCTION__,__LINE__);// no ficlk2_f1 for sub window
7846     }
7847 }
7848 
Hal_SC_set_fmclk(void * pInstance,MS_BOOL bEnable)7849 void Hal_SC_set_fmclk(void *pInstance, MS_BOOL bEnable)
7850 {
7851     if(bEnable == TRUE)
7852     {
7853         MDrv_WriteByteMask(REG_CKG_FMCLK, CKG_FMCLK_FCLK, CKG_FMCLK_MASK);
7854         MDrv_WriteByteMask(REG_CKG_FMCLK, DISABLE, CKG_FMCLK_GATED);
7855         MDrv_WriteByteMask(REG_CKG_FMCLK, DISABLE, CKG_FMCLK_INVERT);
7856     }
7857     else
7858     {
7859         MDrv_WriteByteMask(REG_CKG_FMCLK, ENABLE, CKG_FMCLK_GATED); // disable clock
7860     }
7861 }
7862 
HAL_SC_EnableLegacyMode(void * pInstance,MS_BOOL bEnable)7863 void HAL_SC_EnableLegacyMode(void *pInstance, MS_BOOL bEnable)
7864 {
7865 #if (HW_DESIGN_4K2K_VER == 4)
7866     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7867     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7868 
7869     if (psXCInstPri->u32DeviceID == 0)
7870     {
7871         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_01_L, (bEnable<<0), BIT(0));
7872     }
7873     else
7874     {
7875         // do nothing, because there is only legacy mode in SC2, we don't have to do any switch
7876     }
7877 #endif
7878 }
7879 
MHal_XC_DTVPatchISR(SC_INT_SRC eIntNum,void * pParam)7880 static void  MHal_XC_DTVPatchISR(SC_INT_SRC eIntNum, void * pParam)
7881 {
7882     void *pInstance = pu32XCInst_private;
7883     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7884     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7885     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7886     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7887 
7888     if(gSrcInfo[MAIN_WINDOW].bBlackscreenEnabled==FALSE)
7889     {
7890         //Check timing 2s
7891         if(((MsOS_GetSystemTime()- u32DTVPatchTimer)>2000))
7892         {
7893             u32DTVPatchTimer = MsOS_GetSystemTime();
7894             u16FDMaskCount=0;
7895         }
7896 
7897         //Check FD mask
7898         if(bPreFDMaskStatse != (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_67_L, BIT(4))==0))
7899         {
7900             bPreFDMaskStatse =(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_67_L, BIT(4))==0);
7901             u16FDMaskCount++;
7902         }
7903 
7904         if(u16FDMaskCount>6)
7905         {
7906             if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
7907             {
7908                 //UC_CTL off
7909                 _MLOAD_ENTRY(pInstance);
7910                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK17_01_L, 0 ,BIT(0));
7911                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK57_23_L, 0 ,0x40);
7912                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_67_L, 0x80 ,0xF0);
7913                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK12_07_L, 0 ,BIT(0));
7914                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK11_20_L, 0 ,BIT(7));
7915                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK11_21_L, 0 ,BIT(15));
7916                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK05_78_L, 0 ,0xC000);
7917                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2A_02_L, BIT(1) ,BIT(1)|BIT(15));
7918                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK05_20_L, 0 ,BIT(0));
7919                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK05_12_L, 0 ,BIT(0));
7920                 MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2A_07_L, 0 ,BIT(0));
7921                 MDrv_XC_MLoad_Fire(pInstance, TRUE);
7922                 _MLOAD_RETURN(pInstance);
7923             }
7924             else
7925             {
7926                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK17_01_L, 0 ,BIT(0));
7927                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_23_L, 0 ,0x40);
7928                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_67_L, 0x80 ,0xF0);
7929                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, 0 ,BIT(0));
7930                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_20_L, 0 ,BIT(7));
7931                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_21_L, 0 ,BIT(15));
7932                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_78_L, 0 ,0xC000);
7933                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_02_L, BIT(1) ,BIT(1)|BIT(15));
7934                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_20_L, 0 ,BIT(0));
7935                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK05_12_L, 0 ,BIT(0));
7936                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2A_07_L, 0 ,BIT(0));
7937             }
7938 
7939             u16FDMaskCount=0;
7940 
7941             if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, MHal_XC_DTVPatchISR, (void *)NULL))
7942             {
7943                 //Disable ISR
7944                 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, MHal_XC_DTVPatchISR, (void *)NULL);
7945             }
7946         }
7947     }
7948 }
7949 
Hal_SC_3D_InvertMemsyncInterlaceMode(void * pInstance)7950 void Hal_SC_3D_InvertMemsyncInterlaceMode(void *pInstance)
7951 {
7952 }
MHal_XC_DTVPatch(void * pInstance,SCALER_WIN eWindow)7953 void MHal_XC_DTVPatch(void *pInstance, SCALER_WIN eWindow)
7954 {
7955     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7956     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7957     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7958     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7959 
7960     if(eWindow ==MAIN_WINDOW)
7961     {
7962         if(IsSrcTypeDTV(gSrcInfo[MAIN_WINDOW].enInputSourceType)
7963            &&(gSrcInfo[MAIN_WINDOW].stCapWin.width==1920)
7964            &&(gSrcInfo[MAIN_WINDOW].stCapWin.height==1080)
7965            &&(gSrcInfo[MAIN_WINDOW].bInterlace==TRUE))
7966         {
7967             //DTV 1080i patch
7968             if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT,MHal_XC_DTVPatchISR, (void *)NULL))
7969             {
7970                 //Start DTV 1080i patch, enable ISR
7971                 MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT,MHal_XC_DTVPatchISR, (void *)NULL);
7972             }
7973         }
7974         else
7975         {
7976             if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, MHal_XC_DTVPatchISR, (void *)NULL))
7977             {
7978                 //Disable ISR
7979                 MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, MHal_XC_DTVPatchISR, (void *)NULL);
7980             }
7981         }
7982     }
7983 }
7984 
7985 
7986 #ifndef DONT_USE_CMA
7987 #if (XC_SUPPORT_CMA ==TRUE)
MHal_XC_Get_CMA_Addr(void * pInstance,XC_CMA_CLIENT enCmaClient,MS_U32 u32GetCMASize,SCALER_WIN eWindow)7988 MS_U64 MHal_XC_Get_CMA_Addr(void *pInstance, XC_CMA_CLIENT enCmaClient, MS_U32 u32GetCMASize, SCALER_WIN eWindow)
7989 {
7990     MS_U64 u64CMAAddr = 0;
7991     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
7992     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
7993     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
7994     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
7995 
7996     if (u32GetCMASize == 0)
7997     {
7998         return u64CMAAddr;
7999     }
8000 
8001     struct CMA_Pool_Init_Param CMA_Pool_Init_PARAM_temp[CMA_XC_MEM_NUM] = {{0},};
8002 
8003 #ifdef UFO_XC_SUPPORT_SUB_CMA
8004 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8005         SCALER_WIN eCma_Win = MAX_WINDOW;
8006         if(psXCInstPri->u32DeviceID==0)
8007         {
8008             eCma_Win = MAIN_WINDOW;
8009         }
8010         else
8011         {
8012             eCma_Win  = SUB_WINDOW;
8013         }
8014 #else
8015         eCma_Win = MAIN_WINDOW;
8016 #endif
8017 
8018     CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM] = CMA_Pool_Init_PARAM[eCma_Win][CMA_XC_SELF_MEM];
8019     CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM] = CMA_Pool_Init_PARAM[eCma_Win][CMA_XC_COBUFF_MEM];
8020 #else
8021     CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM] = CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM];
8022     CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM] = CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM];
8023 #endif
8024 
8025     struct CMA_Pool_Alloc_Param CMA_Pool_GetMem;
8026     memset(&CMA_Pool_GetMem,0,sizeof(CMA_Pool_GetMem));
8027     CMA_Pool_GetMem.pool_handle_id = CMA_Pool_Init_PARAM_temp[enCmaClient].pool_handle_id;
8028     CMA_Pool_GetMem.offset_in_pool = gSrcInfo[eWindow].Status2.stXCConfigCMA[enCmaClient].u64AddrHeapOffset;
8029     CMA_Pool_GetMem.flags = CMA_FLAG_VIRT_ADDR;
8030     if(CMA_Pool_Init_PARAM_temp[enCmaClient].heap_length >= u32GetCMASize)
8031     {
8032         CMA_Pool_GetMem.length = u32GetCMASize;
8033     }
8034     else
8035     {
8036         printf("\033[35m   Function = %s, Line = %d, CMA_POOL_INIT GetMem ERROR!!\033[m\n", __PRETTY_FUNCTION__, __LINE__);
8037         //assert(0);
8038     }
8039 
8040     MApi_CMA_Pool_GetMem(&CMA_Pool_GetMem);
8041     u64CMAAddr = CMA_Pool_Init_PARAM_temp[enCmaClient].heap_miu_start_offset;
8042     if(CMA_Pool_Init_PARAM_temp[enCmaClient].miu==E_CHIP_MIU_1)
8043     {
8044         u64CMAAddr= CMA_Pool_Init_PARAM_temp[enCmaClient].heap_miu_start_offset+HAL_MIU1_BASE;
8045     }
8046     else if(CMA_Pool_Init_PARAM_temp[enCmaClient].miu==E_CHIP_MIU_2)
8047     {
8048         u64CMAAddr= CMA_Pool_Init_PARAM_temp[enCmaClient].heap_miu_start_offset+HAL_MIU2_BASE;
8049     }
8050 
8051     return u64CMAAddr;
8052 }
8053 
_Hal_SC_Limit_WriteMem(void * pInstance,SCALER_WIN eWindow)8054 static void _Hal_SC_Limit_WriteMem(void *pInstance, SCALER_WIN eWindow)
8055 {
8056     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8057     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8058     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8059     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8060     MS_PHY u32WriteLimitAddr = pXCResourcePrivate->stdrvXC_3D._u32HW2DTO3D_DD_Buf;
8061     MS_BOOL bNeedRestore = FALSE;
8062 
8063     if (Hal_SC_Is_InputSource_Disable(pInstance, eWindow)==0)
8064     {
8065         bNeedRestore = TRUE;
8066         MDrv_XC_DisableInputSource(pInstance, TRUE, eWindow);
8067     }
8068 
8069     MDrv_XC_SetFrameBufferAddress(pInstance, u32WriteLimitAddr, 0, eWindow);
8070 
8071     if (bNeedRestore == TRUE)
8072     {
8073         bNeedRestore = FALSE;
8074         MDrv_XC_DisableInputSource(pInstance, FALSE, eWindow);
8075     }
8076 }
8077 
_Hal_SC_Limit_Dual_WriteMem(void * pInstance,SCALER_WIN eWindow)8078 static void _Hal_SC_Limit_Dual_WriteMem(void *pInstance, SCALER_WIN eWindow)
8079 {
8080     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8081     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8082     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8083     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8084     MS_BOOL bNeedRestore = FALSE;
8085 
8086     if (Hal_SC_Is_InputSource_Disable(pInstance, eWindow)==0)
8087     {
8088         bNeedRestore = TRUE;
8089         MDrv_XC_DisableInputSource(pInstance, TRUE, eWindow);
8090     }
8091 
8092     if(eWindow == MAIN_WINDOW)
8093     {
8094         /// need to disable the r/w request, when change the write limit base
8095         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_07_L, BIT(0)|BIT(1), BIT(0)|BIT(1));
8096         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK0D_38_L, BIT(4),BIT(4)); //F2 memory address limit enable
8097         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_29_L, 0, BIT(15));   // disable dual to defect xc dual write miu
8098         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_48_L, 0x00); //F2 memory min address
8099         SC_W4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_4A_L, 0x00); //F2 memory max address
8100     }
8101     pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBAddress[eWindow] = 0;
8102     pXCResourcePrivate->stdrvXC_Scaling._u32PreDualFBSize[eWindow] = 0;
8103 
8104     if (bNeedRestore == TRUE)
8105     {
8106         bNeedRestore = FALSE;
8107         MDrv_XC_DisableInputSource(pInstance, FALSE, eWindow);
8108     }
8109 }
8110 
MHal_XC_Release_CMA(void * pInstance,XC_CMA_CLIENT enCmaClient,SCALER_WIN eWindow)8111 MS_BOOL MHal_XC_Release_CMA(void *pInstance, XC_CMA_CLIENT enCmaClient, SCALER_WIN eWindow)
8112 {
8113     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8114     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8115     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8116     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8117 
8118 #ifdef MSOS_TYPE_LINUX_KERNEL
8119         if (pXCResourcePrivate->stdrvXC_MVideo._enPrevPowerState == E_POWER_SUSPEND)
8120         {
8121             return TRUE;//for kernel mode STR
8122         }
8123 #endif
8124 
8125     struct CMA_Pool_Init_Param CMA_Pool_Init_PARAM_temp[CMA_XC_MEM_NUM] = {{0},};
8126 #ifdef UFO_XC_SUPPORT_SUB_CMA
8127 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8128     SCALER_WIN eCma_Win = MAX_WINDOW;
8129     if(psXCInstPri->u32DeviceID==0)
8130     {
8131         eCma_Win = MAIN_WINDOW;
8132     }
8133     else
8134     {
8135         eCma_Win  = SUB_WINDOW;
8136     }
8137 #else
8138     eCma_Win = MAIN_WINDOW;
8139 #endif
8140     CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM] = CMA_Pool_Init_PARAM[eCma_Win][CMA_XC_SELF_MEM];
8141     CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM] = CMA_Pool_Init_PARAM[eCma_Win][CMA_XC_COBUFF_MEM];
8142 #else
8143     CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM] = CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM];
8144     CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM] = CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM];
8145 #endif
8146 
8147     struct CMA_Pool_Free_Param stCMAFreeParam;
8148     if ((gSrcInfo[eWindow].u32PreCMAMemSCMSize[enCmaClient]+gSrcInfo[eWindow].u32PreCMAMemFRCMSize[enCmaClient])!=0)
8149     {
8150         _Hal_SC_Limit_WriteMem(pInstance, eWindow);
8151         stCMAFreeParam.pool_handle_id = CMA_Pool_Init_PARAM_temp[enCmaClient].pool_handle_id; //in: pool handle id, when pool init, returned by kernel
8152         stCMAFreeParam.offset_in_pool = gSrcInfo[eWindow].Status2.stXCConfigCMA[enCmaClient].u64AddrHeapOffset;
8153         stCMAFreeParam.length = gSrcInfo[eWindow].u32PreCMAMemSCMSize[enCmaClient]+gSrcInfo[eWindow].u32PreCMAMemFRCMSize[enCmaClient];
8154         MApi_CMA_Pool_PutMem(&stCMAFreeParam);
8155 
8156         gSrcInfo[eWindow].u32PreCMAMemSCMSize[enCmaClient] = 0;
8157         gSrcInfo[eWindow].u32PreCMAMemFRCMSize[enCmaClient] = 0;
8158     }
8159 
8160     if ((gSrcInfo[MAIN_WINDOW].Status2.u32PreCMAMemDualSCMSize != 0) && (enCmaClient == CMA_XC_COBUFF_MEM))
8161     {
8162         _Hal_SC_Limit_Dual_WriteMem(pInstance, eWindow);
8163         stCMAFreeParam.pool_handle_id = CMA_Pool_Init_PARAM_temp[enCmaClient].pool_handle_id; //in: pool handle id, when pool init, returned by kernel
8164         stCMAFreeParam.offset_in_pool = gSrcInfo[eWindow].Status2.stXCConfigCMA[enCmaClient].u64AddrHeapOffset;
8165         stCMAFreeParam.length = gSrcInfo[MAIN_WINDOW].Status2.u32PreCMAMemDualSCMSize;
8166         MApi_CMA_Pool_PutMem(&stCMAFreeParam);
8167 
8168         gSrcInfo[MAIN_WINDOW].Status2.u32PreCMAMemDualSCMSize = 0;
8169     }
8170 
8171     return TRUE;
8172 }
8173 
_getDualModeMemorySize(void * pInstance,MS_U32 * pu32LeftSize,MS_U32 * pu32RightSize,SCALER_WIN eWindow)8174 static MS_BOOL _getDualModeMemorySize(void *pInstance, MS_U32 *pu32LeftSize, MS_U32 *pu32RightSize, SCALER_WIN eWindow)
8175 {
8176     MS_U32 u32TotalSize = 0;
8177 
8178     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8179     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8180     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8181     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8182     if (gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID != XC_INVALID_HEAP_ID)
8183     {
8184         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8185             u32TotalSize = XC_CMA_96MB + XC_CMA_24MB;
8186         else
8187             u32TotalSize = XC_CMA_96MB;
8188     }
8189     *pu32LeftSize  =  u32TotalSize * gSrcInfo[eWindow].Status2.stMiuDualModCfg.u32LeftFactor/(gSrcInfo[eWindow].Status2.stMiuDualModCfg.u32LeftFactor + gSrcInfo[eWindow].Status2.stMiuDualModCfg.u32RightFactor);
8190     *pu32RightSize =  u32TotalSize - *pu32LeftSize;
8191     return TRUE;
8192 }
8193 
MHal_XC_Get_CMA_UsingCondition(void * pInstance,MS_BOOL bIsGetCMABuff[],MS_U32 au32CMAMemSCMSize[],MS_U32 au32CMAMemFRCMSize[],MS_U32 * pu32DualMiuMemSize,MS_U32 u32DataSize,SCALER_WIN eWindow)8194 MS_BOOL MHal_XC_Get_CMA_UsingCondition(void *pInstance, MS_BOOL bIsGetCMABuff[], MS_U32 au32CMAMemSCMSize[],MS_U32 au32CMAMemFRCMSize[], MS_U32* pu32DualMiuMemSize, MS_U32 u32DataSize, SCALER_WIN eWindow)
8195 {
8196     MS_U32 u32CMAMemSCMSize = 0;
8197     MIU_DDR_TYPE eXcDdrType = E_MIU_DDR3,eXcDualDdrType = E_MIU_DDR3;
8198     MS_BOOL bRet = FALSE;
8199     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8200     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8201     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8202     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8203 
8204     if (u32DataSize < CMA_XC_MEM_NUM)
8205     {
8206         return FALSE;
8207     }
8208 
8209     struct CMA_Pool_Init_Param CMA_Pool_Init_PARAM_temp[CMA_XC_MEM_NUM] = {{0},};
8210 
8211 #ifdef UFO_XC_SUPPORT_SUB_CMA
8212 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
8213     SCALER_WIN eCma_Win = MAX_WINDOW;
8214     if(psXCInstPri->u32DeviceID==0)
8215     {
8216         eCma_Win = MAIN_WINDOW;
8217     }
8218     else
8219     {
8220         eCma_Win  = SUB_WINDOW;
8221     }
8222 #else
8223     eCma_Win = MAIN_WINDOW;
8224 #endif
8225     CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM] = CMA_Pool_Init_PARAM[eCma_Win][CMA_XC_SELF_MEM];
8226     CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM] = CMA_Pool_Init_PARAM[eCma_Win][CMA_XC_COBUFF_MEM];
8227 
8228     if(psXCInstPri->u32DeviceID == 1)
8229     {
8230         bIsGetCMABuff[CMA_XC_SELF_MEM] = TRUE;
8231         bIsGetCMABuff[CMA_XC_COBUFF_MEM] = FALSE;
8232         au32CMAMemSCMSize[CMA_XC_SELF_MEM] = XC_CMA_24MB;
8233         au32CMAMemSCMSize[CMA_XC_COBUFF_MEM] = 0;
8234 
8235         au32CMAMemFRCMSize[CMA_XC_SELF_MEM] = 0;
8236         au32CMAMemFRCMSize[CMA_XC_COBUFF_MEM] = 0;
8237 
8238         return TRUE;
8239     }
8240 #else
8241     CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM] = CMA_Pool_Init_PARAM[CMA_XC_SELF_MEM];
8242     CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM] = CMA_Pool_Init_PARAM[CMA_XC_COBUFF_MEM];
8243 #endif
8244 
8245     if (
8246 #ifdef UFO_XC_SUPPORT_DUAL_MIU
8247     (gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID != XC_INVALID_HEAP_ID)
8248     && IsEnableDualMode(eWindow)
8249 #else
8250     0
8251 #endif
8252      )
8253     {
8254         bIsGetCMABuff[CMA_XC_SELF_MEM] = TRUE;
8255         bIsGetCMABuff[CMA_XC_COBUFF_MEM] = TRUE;
8256     }
8257     else
8258     {
8259         bIsGetCMABuff[CMA_XC_SELF_MEM] = TRUE;
8260         bIsGetCMABuff[CMA_XC_COBUFF_MEM] = FALSE;
8261     }
8262 
8263 
8264     if((bIsGetCMABuff[CMA_XC_SELF_MEM] == TRUE)&&(bIsGetCMABuff[CMA_XC_COBUFF_MEM] == FALSE))
8265     {
8266         bRet = MDrv_MIU_GetDramType(CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM].miu,&eXcDdrType);
8267         if(bRet == FALSE)
8268         {
8269             printf("Get dram type fail %s,%d\n",__FUNCTION__,__LINE__);
8270         }
8271         if((eXcDdrType == E_MIU_DDR4))
8272         {
8273             pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc = TRUE;
8274         }
8275         else
8276         {
8277             pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc = FALSE;
8278         }
8279     }
8280     else if((bIsGetCMABuff[CMA_XC_SELF_MEM] == FALSE)&&(bIsGetCMABuff[CMA_XC_COBUFF_MEM] == TRUE))
8281     {
8282         bRet = MDrv_MIU_GetDramType(CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM].miu,&eXcDualDdrType);
8283         if(bRet == FALSE)
8284         {
8285             printf("Get dram type fail %s,%d\n",__FUNCTION__,__LINE__);
8286         }
8287 
8288         if((eXcDualDdrType == E_MIU_DDR4))
8289         {
8290 
8291             pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc = TRUE;
8292         }
8293         else
8294         {
8295             pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc = FALSE;
8296         }
8297     }
8298     else if((bIsGetCMABuff[CMA_XC_SELF_MEM] == TRUE)&&(bIsGetCMABuff[CMA_XC_SELF_MEM] == TRUE))
8299     {
8300         bRet = MDrv_MIU_GetDramType(CMA_Pool_Init_PARAM_temp[CMA_XC_SELF_MEM].miu,&eXcDdrType);
8301         if(bRet == FALSE)
8302         {
8303             printf("Get dram type fail %s,%d\n",__FUNCTION__,__LINE__);
8304         }
8305 
8306         bRet = MDrv_MIU_GetDramType(CMA_Pool_Init_PARAM_temp[CMA_XC_COBUFF_MEM].miu,&eXcDualDdrType);
8307         if(bRet == FALSE)
8308         {
8309             printf("Get dram type fail %s,%d\n",__FUNCTION__,__LINE__);
8310         }
8311 
8312         if((eXcDdrType == E_MIU_DDR4) || (eXcDualDdrType == E_MIU_DDR4))
8313         {
8314             pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc = TRUE;
8315         }
8316         else
8317         {
8318             pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc = FALSE;
8319         }
8320     }
8321 
8322     if (((MDrv_XC_Is_DSForceIndexEnabled(pInstance, MAIN_WINDOW)||MDrv_XC_GetDynamicScalingStatus(pInstance))
8323         && IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType)) ||
8324            (pXCResourcePrivate->sthal_Optee.op_tee_xc[MAIN_WINDOW].isEnable == TRUE))
8325     {
8326         // MM source and DS on 4K2K case, interlace also using 4k2k virtualbox because some streams is i/p change
8327         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8328         {
8329             u32CMAMemSCMSize = XC_CMA_96MB + XC_CMA_24MB;
8330         }
8331         else
8332         {
8333             u32CMAMemSCMSize = XC_CMA_96MB;
8334         }
8335     }
8336     else if (IsSrcTypeStorage(gSrcInfo[eWindow].enInputSourceType))
8337     {
8338         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8339         {
8340             u32CMAMemSCMSize = XC_CMA_96MB + XC_CMA_24MB;
8341         }
8342         else
8343         {
8344             u32CMAMemSCMSize = XC_CMA_96MB;
8345         }
8346     }
8347     else if (  (IsSrcTypeAV(gSrcInfo[eWindow].enInputSourceType))
8348                ||(IsSrcTypeSV(gSrcInfo[eWindow].enInputSourceType))
8349                ||(IsSrcTypeATV(gSrcInfo[eWindow].enInputSourceType))
8350                ||(IsSrcTypeScart(gSrcInfo[eWindow].enInputSourceType)))
8351     {
8352         if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8353         {
8354             u32CMAMemSCMSize = XC_CMA_22MB;
8355         }
8356         else
8357         {
8358             u32CMAMemSCMSize = XC_CMA_19MB;
8359         }
8360     }
8361     else
8362     {
8363         if ((gSrcInfo[(eWindow)].stCapWin.width>= 3840) && (gSrcInfo[(eWindow)].stCapWin.height>= 2160))
8364         {
8365             if (gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID != XC_INVALID_HEAP_ID && IsEnableDualMode(eWindow))
8366             {
8367                 // HDMI dual miu
8368                 if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8369                 {
8370                     u32CMAMemSCMSize = (XC_CMA_96MB + XC_CMA_24MB)/2;
8371                 }
8372                 else
8373                 {
8374                     u32CMAMemSCMSize = XC_CMA_48MB;
8375                 }
8376             }
8377             else
8378             {
8379                 // 4K2K DTV
8380                 u32CMAMemSCMSize = XC_CMA_96MB;
8381                 if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8382                 {
8383                     u32CMAMemSCMSize = XC_CMA_96MB + XC_CMA_24MB;
8384             }
8385                 else
8386                 {
8387                     u32CMAMemSCMSize = XC_CMA_96MB;
8388                 }
8389             }
8390         }
8391         else
8392         {
8393             if(pXCResourcePrivate->stdrvXC_MVideo.bUseDdr4DramForXc)
8394             {
8395                 u32CMAMemSCMSize = (XC_CMA_96MB + XC_CMA_24MB)/2;
8396             }
8397             else
8398             {
8399                 u32CMAMemSCMSize = XC_CMA_48MB;
8400             }
8401         }
8402 
8403     }
8404 
8405     if (
8406 #ifdef UFO_XC_SUPPORT_DUAL_MIU
8407         (gSrcInfo[eWindow].Status2.stXCConfigCMA[CMA_XC_COBUFF_MEM].u32HeapID != XC_INVALID_HEAP_ID)
8408         && IsEnableDualMode(eWindow)
8409 #else
8410         0
8411 #endif
8412          )
8413     {
8414         //*pu32DualMiuMemSize = XC_CMA_48MB;
8415         //au32CMAMemSCMSize[CMA_XC_SELF_MEM] = u32CMAMemSCMSize;
8416         _getDualModeMemorySize(pInstance, &au32CMAMemSCMSize[CMA_XC_SELF_MEM], pu32DualMiuMemSize, eWindow);
8417 
8418         au32CMAMemSCMSize[CMA_XC_COBUFF_MEM] = 0;
8419     }
8420     else
8421     {
8422         au32CMAMemSCMSize[CMA_XC_SELF_MEM] = u32CMAMemSCMSize;
8423         au32CMAMemSCMSize[CMA_XC_COBUFF_MEM] = 0;
8424         *pu32DualMiuMemSize = 0;
8425     }
8426 
8427     au32CMAMemFRCMSize[CMA_XC_SELF_MEM] = 0;
8428     au32CMAMemFRCMSize[CMA_XC_COBUFF_MEM] = 0;
8429 
8430     return TRUE;
8431 }
8432 #ifdef MSOS_TYPE_LINUX_KERNEL
8433 #else
MHal_XC_CMAPatchISR(SC_INT_SRC eIntNum,void * pParam)8434 static void  MHal_XC_CMAPatchISR(SC_INT_SRC eIntNum, void * pParam)
8435 {
8436     void *pInstance = pu32XCInst_private;
8437     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8438     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8439     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8440     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8441 
8442     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
8443 
8444     if((MDrv_XC_IsInputSourceDisabled(pInstance, MAIN_WINDOW)==TRUE)
8445        &&(   ((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_SELF_MEM]+gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_SELF_MEM])!=0)
8446              ||((gSrcInfo[MAIN_WINDOW].u32PreCMAMemSCMSize[CMA_XC_COBUFF_MEM]+gSrcInfo[MAIN_WINDOW].u32PreCMAMemFRCMSize[CMA_XC_COBUFF_MEM])!=0)
8447 #ifdef UFO_XC_SUPPORT_DUAL_MIU
8448              ||(gSrcInfo[MAIN_WINDOW].Status2.u32PreCMAMemDualSCMSize!=0)
8449 #endif
8450          )
8451       )
8452     {
8453         //Check timing 5s
8454         if(((MsOS_GetSystemTime()- u32CMAPatchTimer_Main)>5000))
8455         {
8456             u32CMAPatchTimer_Main = MsOS_GetSystemTime();
8457 
8458             //MHal_XC_Release_CMA(pInstance, CMA_XC_SELF_MEM, MAIN_WINDOW);
8459             //MHal_XC_Release_CMA(pInstance, CMA_XC_COBUFF_MEM, MAIN_WINDOW);
8460         }
8461     }
8462     else
8463     {
8464         u32CMAPatchTimer_Main = MsOS_GetSystemTime();
8465     }
8466 
8467     if((MDrv_XC_IsInputSourceDisabled(pInstance, MAIN_WINDOW)==TRUE))
8468     {
8469         //Check timing 5s
8470         if(((MsOS_GetSystemTime()- u32DisableFRCTimer)>5000))
8471         {
8472             u32DisableFRCTimer = MsOS_GetSystemTime();
8473 
8474 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
8475             // For FRC case, if no input source, need to disable FRC for power saving
8476             if (!IsVBY1_16LANE(u8LPLL_Type) && (pXCResourcePrivate->stdrvXC_MVideo_Context.g_bFRCEnabled))
8477             {
8478                 MHal_FRC_ByPass_Enable(pInstance, TRUE);
8479             }
8480             //FSC power down
8481             MDrv_WriteByteMask( REG_FSC_BK20_05, 0x00, 0x10); // reg_ckg_ficlk
8482             MDrv_WriteByteMask( REG_FSC_BK20_04, 0x01, 0x01); // reg_ckg_odclk
8483 #endif
8484 
8485             #ifdef CONFIG_MSTAR_SRAMPD
8486             // control SRAM PD here
8487             // disable SRAM here
8488             MHal_XC_SRAM_PowerDown_Control(pInstance, TRUE);
8489             #endif
8490 
8491         }
8492     }
8493     else
8494     {
8495         u32DisableFRCTimer = MsOS_GetSystemTime();
8496     }
8497 }
8498 #endif
MHal_XC_CMAPatch(void * pInstance,SCALER_WIN eWindow)8499 void MHal_XC_CMAPatch(void *pInstance, SCALER_WIN eWindow)
8500 {
8501     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8502     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8503     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8504     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8505 
8506     #ifdef MSOS_TYPE_LINUX_KERNEL
8507     #else
8508     if(eWindow ==MAIN_WINDOW)
8509     {
8510         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT,MHal_XC_CMAPatchISR, (void *)NULL))
8511         {
8512             //Start CMA  patch, enable ISR
8513             u32CMAPatchTimer_Main = MsOS_GetSystemTime();
8514             u32DisableFRCTimer = MsOS_GetSystemTime();
8515             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT,MHal_XC_CMAPatchISR, (void *)NULL);
8516         }
8517     }
8518     #endif
8519 }
8520 
MHal_XC_CMAPatchClose(void * pInstance,SCALER_WIN eWindow)8521 void MHal_XC_CMAPatchClose(void *pInstance, SCALER_WIN eWindow)
8522 {
8523     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8524     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8525     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8526     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8527 
8528     #ifdef MSOS_TYPE_LINUX_KERNEL
8529     #else
8530     if(eWindow ==MAIN_WINDOW)
8531     {
8532         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, MHal_XC_CMAPatchISR, (void *)NULL))
8533         {
8534             //Disable ISR
8535             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, MHal_XC_CMAPatchISR, (void *)NULL);
8536         }
8537     }
8538     #endif
8539 }
8540 #endif
8541 #endif
8542 
MHAL_SC_set_r2y_en(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)8543 void MHAL_SC_set_r2y_en(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
8544 {
8545     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8546     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8547     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8548     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8549 
8550     if(eWindow == MAIN_WINDOW)
8551     {
8552         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK18_06_L, bEnable?BIT(0):0x00, BIT(0));
8553     }
8554     else if(eWindow == SUB_WINDOW)
8555     {
8556         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK18_76_L, bEnable?BIT(0):0x00, BIT(0));
8557     }
8558 }
8559 
MHAL_SC_get_r2y_en_status(void * pInstance,SCALER_WIN eWindow)8560 MS_BOOL MHAL_SC_get_r2y_en_status(void *pInstance, SCALER_WIN eWindow)
8561 {
8562     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8563     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8564     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
8565     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
8566 
8567     MS_BOOL bstatus = FALSE;
8568 
8569     if(eWindow == MAIN_WINDOW)
8570     {
8571         bstatus = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK18_06_L, BIT(0));
8572     }
8573     else if(eWindow == SUB_WINDOW)
8574     {
8575         bstatus = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK18_76_L, BIT(0));
8576     }
8577 
8578     return bstatus;
8579 }
8580 
Hal_SC_set_T3D_setting(void * pInstance,MS_BOOL bEnable)8581 void Hal_SC_set_T3D_setting(void *pInstance, MS_BOOL bEnable)
8582 {
8583     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8584     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8585 
8586     if (MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
8587     {
8588         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK62_63_L, 0x00, BIT(0)); // default disable T3D SRAM
8589     }
8590     else
8591     {
8592         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK62_63_L, 0x00, BIT(0)); // default disable T3D SRAM
8593     }
8594 
8595 }
8596 
Hal_SC_set_T3D_H_size(void * pInstance,MS_U16 u16Hsize)8597 void Hal_SC_set_T3D_H_size(void *pInstance, MS_U16 u16Hsize)
8598 {
8599     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8600     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8601 
8602     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_55_L, u16Hsize, 0x1FFF); //horizontal pixel number
8603 }
8604 
Hal_SC_3D_Is_LR_Sbs2Line(void * pInstance)8605 MS_BOOL Hal_SC_3D_Is_LR_Sbs2Line(void *pInstance)
8606 {
8607     if(SC_R2BYTEMSK(0, REG_SC_BK23_53_L, BIT(15)))
8608     {
8609         return TRUE;
8610     }
8611     else
8612     {
8613         return FALSE;
8614     }
8615 }
8616 
Hal_SC_3D_SetLRChgMode(void * pInstance,HAL_SC_3D_LRCHGMODE eLRChgMode)8617 void Hal_SC_3D_SetLRChgMode(void *pInstance, HAL_SC_3D_LRCHGMODE eLRChgMode)
8618 {
8619     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8620     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8621     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, eLRChgMode, BIT(1)|BIT(0));
8622 }
8623 
8624 // 0: L is the first frame, 1: R is the first frame
Hal_SC_3D_SetInitialLRIndex(void * pInstance,MS_BOOL bRFirst)8625 void Hal_SC_3D_SetInitialLRIndex(void *pInstance, MS_BOOL bRFirst)
8626 {
8627     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8628     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8629     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, (bRFirst==TRUE)?BIT(4):0, BIT(4));
8630 }
8631 
8632 // Split 1 frame into 2 frames
Hal_SC_3D_SetSplitHalf(void * pInstance,MS_BOOL bEnable)8633 void Hal_SC_3D_SetSplitHalf(void *pInstance, MS_BOOL bEnable)
8634 {
8635     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8636     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8637     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_63_L, (bEnable==TRUE)?BIT(8):0, BIT(8));
8638 }
8639 
Hal_SC_set_frcm_to_FD_mask(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)8640 void Hal_SC_set_frcm_to_FD_mask(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
8641 {
8642     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8643     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8644     if (eWindow == MAIN_WINDOW)
8645     {
8646         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L, (bEnable==TRUE)?BIT(2):0, BIT(2));
8647     }
8648     else
8649     {
8650         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L, (bEnable==TRUE)?BIT(10):0, BIT(10));
8651     }
8652 }
8653 
Hal_SC_3D_set_top_win_6Tap(void * pInstance,MS_BOOL bEnable)8654 void Hal_SC_3D_set_top_win_6Tap(void *pInstance, MS_BOOL bEnable)
8655 {
8656     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8657     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8658     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_23_L, (bEnable==TRUE)?BIT(10):0, BIT(10)); //force top window using 6line
8659 }
8660 
Hal_SC_3D_SetActiveVideoHeight(void * pInstance,MS_U16 u16VideoSize)8661 void Hal_SC_3D_SetActiveVideoHeight(void *pInstance, MS_U16 u16VideoSize)
8662 {
8663     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8664     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8665 
8666     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8667     {
8668         Hal_SC_WriteSWDSCommand(pInstance, MAIN_WINDOW, REG_SC_BK02_65_L, u16VideoSize, DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8669     }
8670     else
8671     {
8672         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_65_L, u16VideoSize, 0x1FFF);//v_active region
8673     }
8674 }
8675 
8676 // 0 for blank area 0
8677 //v blanking between field1&field2 or field3&field4
Hal_SC_3D_SetActiveBlankSize0(void * pInstance,MS_U16 u16BlankSize)8678 void Hal_SC_3D_SetActiveBlankSize0(void *pInstance, MS_U16 u16BlankSize)
8679 {
8680     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8681     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8682 
8683     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8684     {
8685         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_66_L,u16BlankSize,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8686     }
8687     else
8688     {
8689         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_66_L, u16BlankSize, 0x1FFF);
8690     }
8691 }
8692 
8693 // 1 for blank area 1
8694 //v blanking between field2&field3
Hal_SC_3D_SetActiveBlankSize1(void * pInstance,MS_U16 u16BlankSize)8695 void Hal_SC_3D_SetActiveBlankSize1(void *pInstance, MS_U16 u16BlankSize)
8696 {
8697     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8698     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8699 
8700     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8701     {
8702         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_67_L,u16BlankSize,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8703     }
8704     else
8705     {
8706         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_67_L, u16BlankSize, 0x1FFF);//v blanking between field1&field2 or field3&field4
8707     }
8708 }
8709 
Hal_SC_3D_SetActiveVideoWidth(void * pInstance,MS_U16 u16VideoSize)8710 void Hal_SC_3D_SetActiveVideoWidth(void *pInstance, MS_U16 u16VideoSize)
8711 {
8712     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8713     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8714 
8715     MS_U16 u16ActiveWidthUsrEnable = 0;
8716     if (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_2F_L, BIT(15)) == BIT(15))
8717     {
8718         u16ActiveWidthUsrEnable = BIT(15);
8719     }
8720 
8721     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8722     {
8723         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_7F_L,u16VideoSize | u16ActiveWidthUsrEnable,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8724     }
8725     else
8726     {
8727         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_7F_L, u16VideoSize | u16ActiveWidthUsrEnable, 0x9FFF);//v_active region
8728     }
8729 }
8730 
8731 
Hal_SC_3D_SetActiveVideoHeightAfterVSD(void * pInstance,MS_U16 u16VideoSize)8732 void Hal_SC_3D_SetActiveVideoHeightAfterVSD(void *pInstance, MS_U16 u16VideoSize)
8733 {
8734     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8735     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8736 
8737     MS_U16 u16Enable = BIT(15);
8738 
8739     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8740     {
8741         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_38_L,u16VideoSize | u16Enable,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8742     }
8743     else
8744     {
8745         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_38_L, u16VideoSize | u16Enable, 0x9FFF);
8746     }
8747 }
8748 
Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(void * pInstance,MS_U16 u16VideoSize)8749 void Hal_SC_3D_SetFRCMActiveVideoHeightAfterVSD(void *pInstance, MS_U16 u16VideoSize)
8750 {
8751     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8752     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8753 
8754     MS_U16 u16Enable = BIT(15);
8755 
8756     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8757     {
8758         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW, REG_SC_BK48_38_L,u16VideoSize | u16Enable,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8759     }
8760     else
8761     {
8762         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK48_38_L, u16VideoSize | u16Enable, 0x9FFF);
8763     }
8764 }
8765 
Hal_SC_3D_SetPixelSeparationWidth(void * pInstance,MS_U16 u16VideoSize)8766 void Hal_SC_3D_SetPixelSeparationWidth(void *pInstance, MS_U16 u16VideoSize)
8767 {
8768     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8769     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8770 
8771     MS_U16 u16ActiveWidthUsrEnable = 0;
8772 #if (HW_DESIGN_3D_VER >= 3)
8773     if (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_2F_L, BIT(15)) == BIT(15))
8774     {
8775         u16ActiveWidthUsrEnable = BIT(15);
8776     }
8777 #endif
8778 
8779     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8780     {
8781         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK02_6C_L,u16VideoSize | u16ActiveWidthUsrEnable,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8782     }
8783     else
8784     {
8785         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK02_6C_L, u16VideoSize | u16ActiveWidthUsrEnable, 0x87FF);
8786     }
8787 }
8788 
Hal_SC_3D_SetSoftware_F1VBottomEndPosition(void * pInstance,MS_U16 u16VideoSize)8789 void Hal_SC_3D_SetSoftware_F1VBottomEndPosition(void *pInstance, MS_U16 u16VideoSize)
8790 {
8791     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8792     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8793 
8794     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8795     {
8796         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK57_4F_L,u16VideoSize,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8797     }
8798     else
8799     {
8800         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4F_L, u16VideoSize, 0x0FFF);
8801     }
8802 }
8803 
Hal_SC_3D_SetSoftware_F2VBottomEndPosition(void * pInstance,MS_U16 u16VideoSize)8804 void Hal_SC_3D_SetSoftware_F2VBottomEndPosition(void *pInstance, MS_U16 u16VideoSize)
8805 {
8806     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8807     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8808 
8809     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8810     {
8811         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK57_4D_L,u16VideoSize,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8812     }
8813     else
8814     {
8815         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4D_L, u16VideoSize, 0x0FFF);
8816     }
8817 }
8818 
Hal_SC_3D_SetSoftware_F1VBottomStartPosition(void * pInstance,MS_U16 u16VideoSize)8819 void Hal_SC_3D_SetSoftware_F1VBottomStartPosition(void *pInstance, MS_U16 u16VideoSize)
8820 {
8821     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8822     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8823 
8824     if(SUPPORT_3D_DS && (g_bSWDSGenScenario == TRUE))
8825     {
8826         Hal_SC_WriteSWDSCommand(pInstance,MAIN_WINDOW,REG_SC_BK57_4E_L,u16VideoSize,DS_IP, DS_XC, &PSTXC_DS_CMDCNT);
8827     }
8828     else
8829     {
8830         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK57_4E_L, u16VideoSize, 0x0FFF);
8831     }
8832 }
8833 
Hal_SC_set_frcm_to_freeze(void * pInstance,MS_BOOL bEnable,SCALER_WIN eWindow)8834 void Hal_SC_set_frcm_to_freeze(void *pInstance, MS_BOOL bEnable, SCALER_WIN eWindow)
8835 {
8836     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8837     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8838     if (eWindow == MAIN_WINDOW)
8839     {
8840         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L, (bEnable==TRUE)?BIT(0):0, BIT(0));
8841     }
8842     else
8843     {
8844         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_02_L, (bEnable==TRUE)?BIT(8):0, BIT(8));
8845     }
8846 }
8847 
Hal_SC_SetOSDDetect(void * pInstance,MS_BOOL bEnable,MS_U32 Threhold)8848 E_APIXC_ReturnValue Hal_SC_SetOSDDetect(void *pInstance, MS_BOOL bEnable, MS_U32 Threhold)
8849 {
8850     MS_U16 u16Reg = 0;
8851     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8852     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8853     if(Threhold == 0)
8854     {
8855         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_6A_L, 0x0, (BIT(15)+BMASK(11:0)));
8856         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_2E_L, BIT(1), BIT(1));
8857 
8858     }
8859     else
8860     {
8861         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK25_2E_L, 0x0, BIT(1));
8862         u16Reg = ((MS_U16)Threhold*2)|(bEnable << 15);
8863         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_6A_L, u16Reg, (BIT(15)+BMASK(11:0)));
8864     }
8865     return E_APIXC_RET_OK;
8866 }
8867 
Hal_SC_GetOSDDetect(void * pInstance,MS_BOOL * pbOSD)8868 E_APIXC_ReturnValue Hal_SC_GetOSDDetect(void *pInstance, MS_BOOL *pbOSD)
8869 {
8870     MS_U16 u16Reg = 0;
8871     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8872     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8873 
8874     u16Reg = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_6A_L);
8875     *pbOSD = ((u16Reg&BIT(14))>>14);
8876     return E_APIXC_RET_OK;
8877 }
8878 
Hal_SC_SetHDMI_Spliter(void * pInstance,XC_IP_SYNC_STATUS * sXC_Sync_Status,E_MUX_INPUTPORT enInputPort,SCALER_WIN eWindow)8879 void Hal_SC_SetHDMI_Spliter(void *pInstance,XC_IP_SYNC_STATUS *sXC_Sync_Status,E_MUX_INPUTPORT enInputPort ,SCALER_WIN eWindow)
8880 {
8881 
8882 #if 0//SUPPORT_HDMI20
8883     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8884     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8885 
8886     MS_U16 u16HDE_temp_size,u16HDE_size =0;
8887 
8888     if((sXC_Sync_Status->u8SyncStatus & XC_MD_SYNC_LOSS) != XC_MD_SYNC_LOSS)
8889     {
8890         if(MDrv_HDMI_CheckHDMI20_Setting(enInputPort))
8891         {
8892             //printf("[%s][%d]HDMI 4K2K 2P mode\n", __FUNCTION__, __LINE__);
8893             if(eWindow == MAIN_WINDOW)
8894                 W2BYTEMSK(0x102e02,0x0010,BMASK(7:4)); // ipmux sel=0xb
8895             else if(eWindow == SUB_WINDOW)
8896                 W2BYTEMSK(0x102e02,0x0001,BMASK(3:0)); // ipmux sel=0xb
8897 
8898         }
8899         else
8900         {
8901             //SUPPORT_HDMI20_420
8902             //printf("[%s][%d]HDMI 4K2K 2P mode\n", __FUNCTION__, __LINE__);
8903             //printf("[%s][%d]sXC_Sync_Status->u16Vtotal=%x, sXC_Sync_Status->u16Hperiod=%x\n",
8904             //    __FUNCTION__, __LINE__, sXC_Sync_Status->u16Vtotal, sXC_Sync_Status->u16Hperiod);
8905             if((sXC_Sync_Status->u16Vtotal >= 0x8C0)
8906                &&(sXC_Sync_Status->u16Hperiod>= 0x50))
8907             {
8908                 if((MDrv_HDMI_avi_infoframe_info(_BYTE_1)& 0x60) == 0x60)
8909                 {
8910                     //printf("@@#@@4K2K@60 420\n");
8911                     // clkgen2
8912                     W2BYTE(0x100a80,0x0004); // spt_l0 1: hdmi d: mhl
8913                     // ipmux
8914                     if(eWindow == MAIN_WINDOW)
8915                     {
8916                         W2BYTEMSK(0x102e02,0x00b0,BMASK(7:4)); // ipmux sel=0xb
8917                     }
8918                     else if(eWindow == SUB_WINDOW)
8919                     {
8920                         W2BYTEMSK(0x102e02,0x000b,BMASK(3:0)); // ipmux sel=0xb
8921                     }
8922 
8923                     //BK40_SPT4k
8924                     SC_W2BYTE(0, REG_SC_BK40_01_L,0x0000); // [3:0]  reg_spt_ipmux_sel0
8925                     // [11:8] reg_spt_ipmux_sel1
8926                     SC_W2BYTE(0, REG_SC_BK40_03_L,0x0001); // [7] reg_spt_2p_oe_en [0] reg_spt_420_en
8927                     SC_W2BYTE(0, REG_SC_BK40_04_L,0x0180); // [7] reg_spt_2p_oe_out_en [9] hsd_en
8928                     // [8] reg_spt_2poe_out_sel 1'b0: dual ch eo in
8929                     //                                    1'b1: dual ch LR in or 420
8930                     SC_W2BYTE(0, REG_SC_BK40_30_L, 0x0003); // de_only
8931                     SC_W2BYTE(0, REG_SC_BK40_0B_L, 0x0000); // gb_size
8932 
8933                     u16HDE_temp_size = MDrv_HDMI_GetHDE();
8934                     //printf("[%s][%d]u16HDE_size=%u\n", __FUNCTION__, __LINE__,u16HDE_temp_size);
8935                     if((u16HDE_temp_size >= 2028)&&(u16HDE_temp_size<= 2068))
8936                     {
8937                         u16HDE_size = 2048;
8938                     }
8939                     else //if((u16HDE_temp_size >= 1900)&&(u16HDE_temp_size<= 1940))
8940                     {
8941                         u16HDE_size = 1920;
8942                     }
8943                     SC_W2BYTE(0, REG_SC_BK40_08_L, u16HDE_size); // de_in_size
8944                     SC_W2BYTE(0, REG_SC_BK40_0A_L, u16HDE_size); // de_out_with_gb_size
8945 
8946                     SC_W2BYTE(0, REG_SC_BK40_20_L, 0x0000); // ra
8947                     SC_W2BYTE(0, REG_SC_BK40_21_L, u16HDE_size/2-2); //
8948                     SC_W2BYTE(0, REG_SC_BK40_22_L, 0x0001);
8949                     SC_W2BYTE(0, REG_SC_BK40_23_L, u16HDE_size/2-1);
8950 
8951                     SC_W2BYTE(0, REG_SC_BK40_24_L, 0x0000); // wa
8952                     SC_W2BYTE(0, REG_SC_BK40_25_L, u16HDE_size/2-2);
8953                     SC_W2BYTE(0, REG_SC_BK40_26_L, 0x0001);
8954                     SC_W2BYTE(0, REG_SC_BK40_27_L, u16HDE_size/2-1);
8955                 }
8956                 else
8957                 {
8958                     //printf("@@#@@4K2K@30\n");
8959                     /// for 4K2K@30Hz
8960                     if(eWindow == MAIN_WINDOW)
8961                     {
8962                         W2BYTEMSK(0x102e02,0x0010,BMASK(7:4)); // ipmux sel=0xb
8963                     }
8964                     else if(eWindow == SUB_WINDOW)
8965                     {
8966                         W2BYTEMSK(0x102e02,0x0001,BMASK(3:0)); // ipmux sel=0xb
8967                     }
8968                 }
8969             }
8970         }
8971     }
8972 #endif
8973 }
8974 
Hal_SC_Set_2pmode(void * pInstance,MS_BOOL benable_IP2p,MS_BOOL benable_OP2p,MS_BOOL benable_bypass_all_2p,SCALER_WIN eWindow)8975 void Hal_SC_Set_2pmode(void *pInstance,MS_BOOL benable_IP2p,MS_BOOL benable_OP2p,MS_BOOL benable_bypass_all_2p,SCALER_WIN eWindow)
8976 {
8977     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
8978     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
8979 
8980     if (eWindow == MAIN_WINDOW)
8981     {
8982         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_07_L,(benable_IP2p ? BIT(15):0), BIT(15));//reg_sprange_hdc_2p
8983         if (psXCInstPri->u32DeviceID == 0)
8984         {
8985             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_01_L,(benable_OP2p ? BIT(1):0), BIT(1));//reg_opm_2p_mode
8986             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK12_04_L,(benable_bypass_all_2p ? BIT(6):0), BIT(6));//reg_bypass_all_2p_f2
8987         }
8988     }
8989 }
8990 
MHal_SC_set_manual_rbank_switch_cnt(void * pInstance,MS_BOOL bEnable,MS_U16 u16SwitchCnt,SCALER_WIN eWindow)8991 void MHal_SC_set_manual_rbank_switch_cnt(void *pInstance, MS_BOOL bEnable, MS_U16 u16SwitchCnt, SCALER_WIN eWindow)
8992 {
8993     if (eWindow >= MAX_WINDOW)
8994     {
8995         printf("unsupported eWindow, return!\n");
8996         return;
8997     }
8998 
8999     if( eWindow == MAIN_WINDOW)
9000     {
9001         // these two registers must be set simultaneously for this feature to work
9002         // frame rate convert dependence with IP write line count
9003         SC_W2BYTEMSK(0,REG_SC_BK12_05_L, bEnable? BIT(3):0, BIT(3));
9004         // frame rate convert dependence with IP write line count FULL
9005         SC_W2BYTEMSK(0,REG_SC_BK11_18_L, bEnable? BIT(15):0, BIT(15));
9006 
9007         // set specific line count according to when you will change rbank switch
9008         // this line count starts at VDE rising edge, ends at u16SwitchCnt
9009         SC_W2BYTEMSK(0,REG_SC_BK11_18_L, u16SwitchCnt, 0x1FFF);
9010     }
9011     else
9012     {
9013         // these two registers must be set simultaneously for this feature to work
9014         // frame rate convert dependence with IP write line count
9015         SC_W2BYTEMSK(0,REG_SC_BK12_45_L, bEnable? BIT(3):0, BIT(3));
9016         // frame rate convert dependence with IP write line count FULL
9017         SC_W2BYTEMSK(0,REG_SC_BK11_58_L, bEnable? BIT(15):0, BIT(15));
9018 
9019         // set specific line count according to when you will change rbank switch
9020         // this line count starts at VDE rising edge, ends at u16SwitchCnt
9021         SC_W2BYTEMSK(0,REG_SC_BK11_58_L, u16SwitchCnt, 0x1FFF);
9022     }
9023 }
9024 
9025 #ifdef SUPPORT_BWD
_HAL_SC_BWR_set_base_address(void * pInstance,MS_U16 u16MemCfgValue,MS_U16 u16MemCfgIndex,SCALER_WIN eWindow)9026 static void _HAL_SC_BWR_set_base_address(void *pInstance, MS_U16 u16MemCfgValue,MS_U16 u16MemCfgIndex, SCALER_WIN eWindow)
9027 {
9028     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9029     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9030     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9031     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9032 
9033     E_XC_BWR_MEM_CONFIG u8Memtype = E_XC_BWR_MEM_CONFIG_1;
9034     E_XC_BWR_MEM_CFG_BPP_TYPE eBPPType = E_XC_BWR_MEM_CFG_BPP_24;
9035     for(u8Memtype=E_XC_BWR_MEM_CONFIG_1; u8Memtype<E_XC_BWR_MEM_CONFIG_Max; u8Memtype++)
9036     {
9037         if(u16MemCfgValue == gSrcInfo[eWindow].Status2.stMemCfgMap[u8Memtype].u16BWR_MEM_CFG_VALUE)
9038         {
9039             eBPPType = gSrcInfo[eWindow].Status2.stMemCfgMap[u8Memtype].eBitPerPixelType;
9040             break;
9041         }
9042     }
9043 
9044 #ifdef  UFO_XC_SUPPORT_DUAL_MIU
9045     if (IsEnableDualMode(eWindow))
9046     {
9047         //SCMI: IPM address 0
9048         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x40 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>00), 0xFFFF);
9049         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x41 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>16), 0x03FF);
9050         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x48 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase0>>00), 0xFFFF);
9051         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x49 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase0>>16), 0x03FF);
9052         //SCMI: IPM address 1
9053         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x50 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>00), 0xFFFF);
9054         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x51 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>16), 0x03FF);
9055         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x58 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase1>>00), 0xFFFF);
9056         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x59 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase1>>16), 0x03FF);
9057         //SCMI: OPM address 0
9058         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x60 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>00), 0xFFFF);
9059         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x61 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>16), 0x03FF);
9060         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x68 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase0>>00), 0xFFFF);
9061         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x69 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase0>>16), 0x03FF);
9062         //SCMI: OPM address 1
9063         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x70 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>00), 0xFFFF);
9064         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x71 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>16), 0x03FF);
9065         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x78 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase1>>00), 0xFFFF);
9066         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x79 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase1>>16), 0x03FF);
9067     }
9068     else
9069 #endif
9070     {
9071         //SCMI: IPM address 0
9072         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x40 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>00), 0xFFFF);
9073         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x41 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>16), 0x03FF);
9074         //SCMI: IPM address 1
9075         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x50 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>00), 0xFFFF);
9076         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x51 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>16), 0x03FF);
9077         //SCMI: OPM address 0
9078         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x60 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>00), 0xFFFF);
9079         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x61 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>16), 0x03FF);
9080         //SCMI: OPM address 1
9081         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x70 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>00), 0xFFFF);
9082         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, _PK_L_(0x46, (0x71 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>16), 0x03FF);
9083     }
9084 }
9085 
_HAL_SC_BWR_set_vlen(void * pInstance,SCALER_WIN eWindow)9086 void _HAL_SC_BWR_set_vlen(void * pInstance, SCALER_WIN eWindow)
9087 {
9088     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9089     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9090 
9091     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9092     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9093     //update BWR Configuration vlen,IP 3D source: LA
9094     if(MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_LINE_ALTERNATIVE)
9095     {
9096         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3D_L, BIT(15) | (gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2), BIT(15) | 0x1FFF);
9097         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_36_L, BIT(15) | (gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2), BIT(15) | 0x1FFF);
9098     }
9099     else
9100     {
9101         //update BWR Configuration vlen, VSD
9102         if(gSrcInfo[eWindow].bPreV_ScalingDown)
9103         {
9104             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3D_L, BIT(15) | gSrcInfo[eWindow].u16V_SizeAfterPreScaling, BIT(15) | 0x1FFF);
9105             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_36_L, gSrcInfo[eWindow].u16V_SizeAfterPreScaling, BIT(15) | 0x1FFF);
9106         }
9107         else
9108         {
9109             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3D_L, 0, BIT(15));
9110             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_36_L, 0, BIT(15));
9111         }
9112     }
9113 
9114     //update BWR Configuration vlen,OP 3D output: LA
9115     if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
9116     {
9117         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3E_L, BIT(15) | (gSrcInfo[eWindow].u16V_Length*2), BIT(15) | 0x1FFF);
9118     }
9119     else
9120     {
9121         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3E_L, 0, BIT(15));
9122     }
9123 
9124 }
9125 
_HAL_SC_BWR_set_3d_mode(void * pInstance,SCALER_WIN eWindow)9126 static void _HAL_SC_BWR_set_3d_mode(void * pInstance, SCALER_WIN eWindow)
9127 {
9128     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9129     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9130     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9131     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9132     //BWR 422 to 420 set drop mode register
9133     if((MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_LINE_ALTERNATIVE) && (gSrcInfo[eWindow].stCapWin.width > 1920))
9134     {
9135         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_38_L, BIT(7), BIT(7));
9136         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3A_L, 0, BIT(2));
9137     }
9138 
9139     //BWR 422 to 420 set TB mode register
9140     if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM)
9141     {
9142         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_3A_L, BIT(4), BIT(4));
9143         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_10_L, 0, BIT(11));
9144     }
9145 
9146     //OP1 must turn off initial process
9147     if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
9148     {
9149         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L,BIT(12) ,BIT(12));
9150     }
9151     else
9152     {
9153         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_11_L,0 ,BIT(12));
9154     }
9155 }
9156 
_HAL_SC_BWR_set_base_address_burst(void * pInstance,MS_U16 u16MemCfgValue,MS_U16 u16MemCfgIndex,SCALER_WIN eWindow)9157 static void _HAL_SC_BWR_set_base_address_burst(void *pInstance, MS_U16 u16MemCfgValue,MS_U16 u16MemCfgIndex, SCALER_WIN eWindow)
9158 {
9159     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9160     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9161     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9162     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9163 
9164     E_XC_BWR_MEM_CONFIG u8Memtype = E_XC_BWR_MEM_CONFIG_1;
9165     E_XC_BWR_MEM_CFG_BPP_TYPE eBPPType = E_XC_BWR_MEM_CFG_BPP_24;
9166     for(u8Memtype=E_XC_BWR_MEM_CONFIG_1; u8Memtype<E_XC_BWR_MEM_CONFIG_Max; u8Memtype++)
9167     {
9168         if(u16MemCfgValue == gSrcInfo[eWindow].Status2.stMemCfgMap[u8Memtype].u16BWR_MEM_CFG_VALUE)
9169         {
9170             eBPPType = gSrcInfo[eWindow].Status2.stMemCfgMap[u8Memtype].eBitPerPixelType;
9171             break;
9172         }
9173     }
9174 
9175 #ifdef UFO_XC_SUPPORT_DUAL_MIU
9176     if (IsEnableDualMode(eWindow))
9177     {
9178         //SCMI: IPM address 0
9179         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x40 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>00), 0xFFFF);
9180         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x41 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>16), 0x03FF);
9181 
9182         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x48 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase0>>00), 0xFFFF);
9183         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x49 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase0>>16), 0x03FF);
9184 
9185         //SCMI: IPM address 1
9186         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x50 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>00), 0xFFFF);
9187         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x51 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>16), 0x03FF);
9188 
9189         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x58 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase1>>00), 0xFFFF);
9190         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x59 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_DNRBase1>>16), 0x03FF);
9191 
9192         //SCMI: OPM address 0
9193         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x60 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>00), 0xFFFF);
9194         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x61 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>16), 0x03FF);
9195 
9196         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x68 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase0>>00), 0xFFFF);
9197         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x69 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase0>>16), 0x03FF);
9198 
9199         //SCMI: OPM address 1
9200         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x70 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>00), 0xFFFF);
9201         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x71 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>16), 0x03FF);
9202 
9203         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x78 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase1>>00), 0xFFFF);
9204         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x79 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Right_OPMBase1>>16), 0x03FF);
9205     }
9206     else // Disbale dual
9207 #endif
9208     {
9209         //SCMI: IPM address 0
9210         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x40 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>00), 0xFFFF);
9211         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x41 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase0>>16), 0x03FF);
9212 
9213         //SCMI: IPM address 1
9214         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x50 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>00), 0xFFFF);
9215         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x51 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_DNRBase1>>16), 0x03FF);
9216 
9217         //SCMI: OPM address 0
9218         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x60 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>00), 0xFFFF);
9219         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x61 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase0>>16), 0x03FF);
9220 
9221         //SCMI: OPM address 1
9222         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x70 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>00), 0xFFFF);
9223         MDrv_XC_MLoad_WriteCmd(pInstance, _PK_L_(0x46, (0x71 + u16MemCfgIndex * 2)), (MS_U16)(gSrcInfo[eWindow].Status2.stBWRBase[eBPPType].u32BWR_Miu_Left_OPMBase1>>16), 0x03FF);
9224     }
9225 }
9226 
_HAL_SC_BWR_set_vlen_burst(void * pInstance,SCALER_WIN eWindow)9227 static void _HAL_SC_BWR_set_vlen_burst(void * pInstance, SCALER_WIN eWindow)
9228 {
9229     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9230     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9231 
9232     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9233     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9234     //update BWR Configuration vlen,IP 3D source: LA
9235     if(MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_LINE_ALTERNATIVE)
9236     {
9237         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3D_L, BIT(15) | (gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2), BIT(15) | 0x1FFF);
9238         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_36_L, BIT(15) | (gSrcInfo[eWindow].u16V_SizeAfterPreScaling/2), BIT(15) | 0x1FFF);
9239     }
9240     else
9241     {
9242         //update BWR Configuration vlen, VSD
9243         if(gSrcInfo[eWindow].bPreV_ScalingDown)
9244         {
9245             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3D_L, BIT(15) | gSrcInfo[eWindow].u16V_SizeAfterPreScaling, BIT(15) | 0x1FFF);
9246             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_36_L, BIT(15) | gSrcInfo[eWindow].u16V_SizeAfterPreScaling, BIT(15) | 0x1FFF);
9247         }
9248         else
9249         {
9250             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3D_L, 0, BIT(15));
9251             MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_36_L, 0, BIT(15));
9252         }
9253     }
9254     //update BWR Configuration vlen,OP 3D output: LA
9255     if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
9256     {
9257         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3E_L, BIT(15) | (gSrcInfo[eWindow].u16V_Length*2), BIT(15) | 0x1FFF);
9258     }
9259     else
9260     {
9261         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3E_L, 0, BIT(15));
9262     }
9263 }
9264 
_HAL_SC_BWR_set_3d_mode_burst(void * pInstance,SCALER_WIN eWindow)9265 static void _HAL_SC_BWR_set_3d_mode_burst(void * pInstance, SCALER_WIN eWindow)
9266 {
9267     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9268 
9269     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9270 
9271     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9272     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9273 
9274     //BWR 422 to 420 set drop mode register
9275     if((MDrv_XC_Get_3D_Input_Mode(pInstance, eWindow) == E_XC_3D_INPUT_LINE_ALTERNATIVE) && (gSrcInfo[eWindow].stCapWin.width > 1920))
9276     {
9277         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_38_L, BIT(7), BIT(7));
9278         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3A_L, 0, BIT(2));
9279     }
9280 
9281     //BWR 422 to 420 set TB mode register
9282     if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_TOP_BOTTOM)
9283     {
9284         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_3A_L, BIT(4),BIT(4));
9285         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_10_L, 0, BIT(11));
9286     }
9287 
9288     //OP1 must turn off initial process
9289     if(MDrv_XC_Get_3D_Output_Mode(pInstance) == E_XC_3D_OUTPUT_LINE_ALTERNATIVE)
9290     {
9291         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, BIT(12), BIT(12));
9292     }
9293     else
9294     {
9295         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK20_11_L, 0, BIT(12));
9296     }
9297 }
9298 #endif
9299 
HAL_SC_set_bwr_config_burst(void * pInstance,void * pstParam,SCALER_WIN eWindow)9300 MS_BOOL HAL_SC_set_bwr_config_burst(void *pInstance, void *pstParam, SCALER_WIN eWindow)
9301 {
9302 #ifdef SUPPORT_BWD
9303     MS_U16 u16BwrMemCfgTmp = 0;
9304     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9305     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9306     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9307     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9308 
9309     u16BwrMemCfgTmp = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_17_L, 0xFFFF);
9310     _HAL_SC_BWR_set_base_address_burst(pInstance, (u16BwrMemCfgTmp&0x000F) >> 0,  E_XC_BWR_MME_CFG_INDEX_0, eWindow);
9311     _HAL_SC_BWR_set_base_address_burst(pInstance, (u16BwrMemCfgTmp&0x00F0) >> 4,  E_XC_BWR_MME_CFG_INDEX_1, eWindow);
9312     _HAL_SC_BWR_set_base_address_burst(pInstance, (u16BwrMemCfgTmp&0x0F00) >> 8,  E_XC_BWR_MME_CFG_INDEX_2, eWindow);
9313     _HAL_SC_BWR_set_base_address_burst(pInstance, (u16BwrMemCfgTmp&0xF000) >> 12, E_XC_BWR_MME_CFG_INDEX_3, eWindow);
9314     u16BwrMemCfgTmp = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_16_L, 0xF);
9315     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_28_L, u16BwrMemCfgTmp, 0x0F);
9316     MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_29_L, u16BwrMemCfgTmp, 0x0F);
9317 
9318     if(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow))
9319     {
9320         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK46_01_L, 0x0, 0x000C);
9321     }
9322 
9323     _HAL_SC_BWR_set_vlen_burst(pInstance, eWindow);
9324     _HAL_SC_BWR_set_3d_mode_burst(pInstance, eWindow);
9325 
9326     MDrv_XC_MLoad_Fire(pInstance, TRUE);
9327     return TRUE;
9328 #else
9329     return FALSE;
9330 #endif
9331 }
9332 
HAL_SC_set_bwr_config(void * pInstance,void * pstParam,SCALER_WIN eWindow)9333 MS_BOOL HAL_SC_set_bwr_config(void *pInstance, void *pstParam, SCALER_WIN eWindow)
9334 {
9335 #ifdef SUPPORT_BWD
9336     MS_U16 u16BwrMemCfgTmp = 0;
9337     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9338     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9339     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9340     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9341 
9342     u16BwrMemCfgTmp = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_17_L, 0xFFFF);
9343     _HAL_SC_BWR_set_base_address(pInstance, (u16BwrMemCfgTmp&0x000F) >> 0,  E_XC_BWR_MME_CFG_INDEX_0, eWindow);
9344     _HAL_SC_BWR_set_base_address(pInstance, (u16BwrMemCfgTmp&0x00F0) >> 4,  E_XC_BWR_MME_CFG_INDEX_1, eWindow);
9345     _HAL_SC_BWR_set_base_address(pInstance, (u16BwrMemCfgTmp&0x0F00) >> 8,  E_XC_BWR_MME_CFG_INDEX_2, eWindow);
9346     _HAL_SC_BWR_set_base_address(pInstance, (u16BwrMemCfgTmp&0xF000) >> 12, E_XC_BWR_MME_CFG_INDEX_3, eWindow);
9347     u16BwrMemCfgTmp = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_16_L, 0xF);
9348     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_28_L, u16BwrMemCfgTmp, 0x0F);
9349     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_29_L, u16BwrMemCfgTmp, 0x0F);
9350 
9351     if(MDrv_XC_GetDynamicScalingStatus(pInstance) || MDrv_XC_Is_DSForceIndexEnabled(pInstance, eWindow))
9352     {
9353         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK46_01_L, 0x0, 0x000C);
9354     }
9355 
9356     _HAL_SC_BWR_set_vlen(pInstance, eWindow);
9357     _HAL_SC_BWR_set_3d_mode(pInstance, eWindow);
9358     return TRUE;
9359 #else
9360     return FALSE;
9361 #endif
9362 }
9363 
Hal_SC_AdjustIpmWriteLimite(void * pInstance,MS_BOOL bIsLeft,MS_BOOL bNeedSwap,SCALER_WIN eWindow)9364 MS_BOOL Hal_SC_AdjustIpmWriteLimite(void *pInstance, MS_BOOL bIsLeft, MS_BOOL bNeedSwap, SCALER_WIN eWindow)
9365 {
9366     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9367     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9368     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9369     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9370     MS_PHY u32WLimitBase = 0x00;
9371     if ((psXCInstPri->u32DeviceID > 0) || (eWindow != MAIN_WINDOW))
9372     {
9373         return FALSE;
9374     }
9375 
9376     if (bIsLeft == TRUE)
9377     {
9378         if (bNeedSwap == TRUE)
9379         {
9380             u32WLimitBase = ((pXCResourcePrivate->stdrvXC_Scaling._u32DNRBaseAddr0[eWindow] + pXCResourcePrivate->stdrvXC_Scaling._u32DNRBufSize[eWindow]) / BYTE_PER_WORD - 1)  | F2_WRITE_LIMIT_EN;;
9381             MDrv_SC_set_dual_write_limit(pInstance, u32WLimitBase , eWindow);
9382         }
9383         else
9384         {
9385             u32WLimitBase = ((pXCResourcePrivate->stdrvXC_Scaling._u32DNRBaseAddr0[eWindow] + pXCResourcePrivate->stdrvXC_Scaling._u32DNRBufSize[eWindow]) / BYTE_PER_WORD - 1)  | F2_WRITE_LIMIT_EN;
9386             MDrv_SC_set_write_limit(pInstance, u32WLimitBase , eWindow);
9387         }
9388     }
9389     else
9390     {
9391         if (bNeedSwap == TRUE)
9392         {
9393             u32WLimitBase = ((pXCResourcePrivate->stdrvXC_Scaling._u32DualMiuDNRBaseAddr0[eWindow] + pXCResourcePrivate->stdrvXC_Scaling._u32DualMiuDNRBufSize[eWindow]) / BYTE_PER_WORD - 1) ;
9394             MDrv_SC_set_write_limit(pInstance, u32WLimitBase , eWindow);
9395         }
9396         else
9397         {
9398             u32WLimitBase = ((pXCResourcePrivate->stdrvXC_Scaling._u32DualMiuDNRBaseAddr0[eWindow] + pXCResourcePrivate->stdrvXC_Scaling._u32DualMiuDNRBufSize[eWindow]) / BYTE_PER_WORD - 1) ;
9399             MDrv_SC_set_dual_write_limit(pInstance, u32WLimitBase , eWindow);
9400         }
9401     }
9402     return TRUE;
9403 }
9404 
Hal_SC_3D_enable_black_edge(void * pInstance,MS_BOOL b2DTo3D)9405 void Hal_SC_3D_enable_black_edge(void *pInstance, MS_BOOL b2DTo3D)
9406 {
9407     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9408     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9409     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9410     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9411 
9412     MS_U16 u16GarbageWidth = 0;
9413     MS_U16 u16BlackBarEnd_L =  0;
9414     MS_U16 u16BlackBarStart_R =  0;
9415     MS_U16 u16FrameColorWidth =  pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart - SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK10_04_L);
9416     MS_U16 u16DispWinWidth = pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisEnd - pXCResourcePrivate->stdrvXC_MVideo_Context.stDBreg.u16H_DisStart + 1;
9417 
9418     if(b2DTo3D)
9419     {
9420         u16GarbageWidth = pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Offset>>3; //offset
9421         u16GarbageWidth = (u16GarbageWidth > 16)?(u16GarbageWidth - 16):(16 - u16GarbageWidth);
9422         u16GarbageWidth = u16GarbageWidth + (pXCResourcePrivate->stdrvXC_3D._st3DHw2DTo3DPara.u16Gain + 1) / 2;//gain
9423     }
9424     else
9425     {
9426         if(0 == pXCResourcePrivate->stdrvXC_3D._u163DHShift)
9427         {
9428             u16GarbageWidth = pXCResourcePrivate->stdrvXC_3D._u163DHShift;
9429         }
9430         else if(pXCResourcePrivate->stdrvXC_3D._u163DHShift > 112)
9431         {
9432             u16GarbageWidth = pXCResourcePrivate->stdrvXC_3D._u163DHShift - 112;//_u163DHShift = value on UI + 112
9433         }
9434         else
9435         {
9436             u16GarbageWidth = 0;
9437             printf("[%s,%5d] ERROR: invalid value of  gain\n",__FUNCTION__,__LINE__);
9438         }
9439 
9440         if((0 == u16GarbageWidth) || (16 == u16GarbageWidth))
9441         {
9442             u16GarbageWidth =  0;
9443         }
9444         else
9445         {
9446             u16GarbageWidth = (u16GarbageWidth > 16)?(u16GarbageWidth - 16):(16 - u16GarbageWidth);
9447         }
9448 
9449     }
9450 
9451     if(u16DispWinWidth > 1920)
9452     {
9453         u16GarbageWidth = u16GarbageWidth* 2;
9454     }
9455     else if(u16DispWinWidth > 960)
9456     {
9457         u16GarbageWidth = u16GarbageWidth;
9458     }
9459     else if(u16DispWinWidth > 480)
9460     {
9461         u16GarbageWidth = u16GarbageWidth / 2;
9462     }
9463     else
9464     {
9465         u16GarbageWidth = u16GarbageWidth / 4;
9466     }
9467 
9468     u16BlackBarEnd_L =  (u16FrameColorWidth + u16GarbageWidth) /2;//manhattan 2P mode
9469     u16BlackBarStart_R =  (u16FrameColorWidth + u16DispWinWidth - u16GarbageWidth) / 2;//manhattan 2P mode
9470 
9471     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_65_L, 0x8000, 0x8000);//enable  principal black-bar
9472     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_4B_L, 0x0002, 0x0002);//enable left Right black-bar
9473     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_63_L, u16BlackBarEnd_L, 0xFFF);//Left black-bar end
9474     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK63_62_L, u16BlackBarStart_R, 0xFFF);//Right black-bar start
9475 }
9476 
9477 #if FRC_INSIDE
MHal_XC_FRCR2_IP_PatchISR(SC_INT_SRC eIntNum,void * pParam)9478 static void  MHal_XC_FRCR2_IP_PatchISR(SC_INT_SRC eIntNum, void * pParam)
9479 {
9480     void *pInstance = pu32XCInst_private;
9481     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9482     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9483     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9484     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9485 
9486     MDrv_WriteByteMask(0x400640, 0x02, 0x02);
9487     MsOS_DelayTaskUs(10);
9488     MDrv_WriteByteMask(0x400640, 0x00, 0x02);
9489 }
9490 
MHal_XC_FRCR2_IP_Patch(void * pInstance,SCALER_WIN eWindow)9491 void MHal_XC_FRCR2_IP_Patch(void *pInstance, SCALER_WIN eWindow)
9492 {
9493     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9494     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9495     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9496     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9497 
9498     if(eWindow ==MAIN_WINDOW)
9499     {
9500         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, MHal_XC_FRCR2_IP_PatchISR, (void *)NULL))
9501         {
9502             //enable ISR
9503             //FIXME: PATCH
9504             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, MHal_XC_FRCR2_IP_PatchISR, (void *)NULL);
9505         }
9506     }
9507 
9508 }
MHal_XC_FRCR2_IP_PatchClose(void * pInstance,SCALER_WIN eWindow)9509 void MHal_XC_FRCR2_IP_PatchClose(void *pInstance, SCALER_WIN eWindow)
9510 {
9511     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9512     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9513     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9514     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9515 
9516     if(eWindow ==MAIN_WINDOW)
9517     {
9518         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_F2_IPVS_SB, MHal_XC_FRCR2_IP_PatchISR, (void *)NULL))
9519         {
9520             //Disable ISR
9521             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_F2_IPVS_SB, MHal_XC_FRCR2_IP_PatchISR, (void *)NULL);
9522         }
9523     }
9524 
9525 }
9526 
MHal_XC_FRCR2_OP_PatchISR(SC_INT_SRC eIntNum,void * pParam)9527 static void  MHal_XC_FRCR2_OP_PatchISR(SC_INT_SRC eIntNum, void * pParam)
9528 {
9529     void *pInstance = pu32XCInst_private;
9530     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9531     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9532     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9533     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9534 
9535     MDrv_WriteByteMask(0x400640, 0x04, 0x04);
9536     MsOS_DelayTaskUs(10);
9537     MDrv_WriteByteMask(0x400640, 0x00, 0x04);
9538 }
9539 
MHal_XC_FRCR2_OP_Patch(void * pInstance,SCALER_WIN eWindow)9540 void MHal_XC_FRCR2_OP_Patch(void *pInstance, SCALER_WIN eWindow)
9541 {
9542     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9543     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9544     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9545     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9546 
9547     if(eWindow ==MAIN_WINDOW)
9548     {
9549         if(FALSE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, MHal_XC_FRCR2_OP_PatchISR, (void *)NULL))
9550         {
9551             //enable ISR
9552             //FIXME: PATCH
9553             MDrv_XC_InterruptAttachWithoutMutex(pInstance, SC_INT_VSINT, MHal_XC_FRCR2_OP_PatchISR, (void *)NULL);
9554         }
9555     }
9556 
9557 }
MHal_XC_FRCR2_OP_PatchClose(void * pInstance,SCALER_WIN eWindow)9558 void MHal_XC_FRCR2_OP_PatchClose(void *pInstance, SCALER_WIN eWindow)
9559 {
9560     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9561     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9562     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9563     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9564 
9565     if(eWindow ==MAIN_WINDOW)
9566     {
9567         if(TRUE == MDrv_XC_InterruptIsAttached(pInstance, SC_INT_VSINT, MHal_XC_FRCR2_OP_PatchISR, (void *)NULL))
9568         {
9569             //Disable ISR
9570             MDrv_XC_InterruptDeAttachWithoutMutex(pInstance, SC_INT_VSINT, MHal_XC_FRCR2_OP_PatchISR, (void *)NULL);
9571         }
9572     }
9573 }
9574 
Hal_SC_3D_enable_FALLRR_out(void * pInstance,MS_BOOL bEnable)9575 void Hal_SC_3D_enable_FALLRR_out(void *pInstance, MS_BOOL bEnable)
9576 {
9577     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9578     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9579 
9580     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK11_33_L, (bEnable==TRUE)?BIT(8):0, BIT(8));//OPM LLRR
9581 }
9582 #endif
9583 
Hal_SC_3D_Adjust_PreHVscaling_SaveBW(void * pInstance,XC_InternalStatus * pSrcInfo,MS_BOOL * pb3DPreHScaling,MS_BOOL * pb3DPreVScaling,MS_BOOL bForcePreHScalingDown,MS_BOOL bForcePreVScalingDown,SCALER_WIN eWindow)9584 void Hal_SC_3D_Adjust_PreHVscaling_SaveBW(void *pInstance, XC_InternalStatus *pSrcInfo, MS_BOOL *pb3DPreHScaling,MS_BOOL *pb3DPreVScaling,MS_BOOL bForcePreHScalingDown,MS_BOOL bForcePreVScalingDown,SCALER_WIN eWindow)
9585 {
9586     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9587     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9588     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9589     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9590 
9591     if((pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] == E_XC_3D_INPUT_FRAME_PACKING))
9592     {
9593         if(pXCResourcePrivate->stdrvXC_3D._eOutput3DMode != E_XC_3D_OUTPUT_FRAME_ALTERNATIVE)
9594         {
9595             *pb3DPreHScaling = TRUE;
9596             pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
9597             if((pSrcInfo->stDispWin.width >= 1920)
9598                 && (pSrcInfo->stDispWin.height >= 1080))
9599             {
9600                 pSrcInfo->Status2.u16PreHCusScalingDst = MAX(640, (MS_U32)MIN(1920, pSrcInfo->stDispWin.width) * 2 / 3);
9601             }
9602             else
9603             {
9604                 pSrcInfo->Status2.u16PreHCusScalingDst = MAX(640, (MS_U32)MIN(1920, pSrcInfo->stDispWin.width) / 2);
9605             }
9606         }
9607         else// FA out
9608         {
9609             if((pXCResourcePrivate->stdrvXC_3D._bFALLRRToFA) && (pSrcInfo->stCapWin.width == DOUBLEHD_1080X2P_HSIZE))//output FA_LLRR for 4k0.5k@240Hz
9610             {
9611                 *pb3DPreHScaling = TRUE;
9612                 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
9613                 pSrcInfo->Status2.u16PreHCusScalingDst = MAX(640, (MS_U32)MIN(1920, pSrcInfo->stDispWin.width) / 2);
9614             }
9615         }
9616     }
9617     else if((pXCResourcePrivate->stdrvXC_3D._eInput3DMode[eWindow] == E_XC_3D_INPUT_FRAME_ALTERNATIVE) && (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode != E_XC_3D_OUTPUT_FRAME_ALTERNATIVE) &&(pSrcInfo->stCapWin.width >= 1280)
9618             && (MDrv_ReadRegBit(REG_CKG_FCLK, CKG_FCLK_MASK) < 24))//fclk < 320MHz may have fclk issue for fi
9619     {
9620         *pb3DPreHScaling = TRUE;
9621         pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
9622         if(pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.u16Width >= 2 * pSrcInfo->stDispWin.width)
9623         {
9624             pSrcInfo->Status2.u16PreHCusScalingDst = MIN(960, pSrcInfo->stDispWin.width);
9625         }
9626         else
9627         {
9628             pSrcInfo->Status2.u16PreHCusScalingDst = MIN(1280, pSrcInfo->stDispWin.width);
9629         }
9630     }
9631     else
9632     {
9633         if(bForcePreHScalingDown)
9634         {
9635                 *pb3DPreHScaling = FALSE;
9636                 pSrcInfo->Status2.u16PreHCusScalingSrc = pSrcInfo->stCapWin.width;
9637                 pSrcInfo->Status2.u16PreHCusScalingDst = pSrcInfo->u16H_SizeAfterPreScaling;
9638         }
9639 
9640         if(bForcePreVScalingDown)
9641         {
9642             pb3DPreVScaling = FALSE;
9643             pSrcInfo->Status2.u16PreVCusScalingSrc = pSrcInfo->stCapWin.height;
9644             pSrcInfo->Status2.u16PreVCusScalingDst = pSrcInfo->u16V_SizeAfterPreScaling;
9645         }
9646     }
9647 }
9648 
9649 #ifdef UFO_XC_AUTO_DOWNLOAD
_Hal_XC_Set_Auto_Download_WorkMode(MS_U32 u32DeviceID,MS_U32 u32RegAddr,MS_U8 u8Bit,EN_XC_AUTODOWNLOAD_MODE enMode)9650 static E_APIXC_ReturnValue _Hal_XC_Set_Auto_Download_WorkMode(MS_U32 u32DeviceID, MS_U32 u32RegAddr, MS_U8 u8Bit, EN_XC_AUTODOWNLOAD_MODE enMode)
9651 {
9652     switch (enMode)
9653     {
9654         case E_XC_AUTODOWNLOAD_TRIGGER_MODE:
9655         {
9656             SC_W2BYTEMSK(u32DeviceID, u32RegAddr, 0, BIT(u8Bit));
9657             break;
9658         }
9659         case E_XC_AUTODOWNLOAD_ENABLE_MODE:
9660         {
9661             SC_W2BYTEMSK(u32DeviceID, u32RegAddr, 1 << u8Bit, BIT(u8Bit));
9662             break;
9663         }
9664         default:
9665             return E_APIXC_RET_FAIL_INVALID_PARAMETER;
9666     }
9667 
9668     return E_APIXC_RET_OK;
9669 }
9670 
MHal_XC_AutoDownload_Config(void * pInstance,EN_XC_AUTODOWNLOAD_CLIENT enClient,MS_PHY phyBaseAddr,EN_XC_AUTODOWNLOAD_MODE enMode)9671 E_APIXC_ReturnValue MHal_XC_AutoDownload_Config(void* pInstance, EN_XC_AUTODOWNLOAD_CLIENT enClient, MS_PHY phyBaseAddr, EN_XC_AUTODOWNLOAD_MODE enMode)
9672 {
9673     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9674     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9675 
9676     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9677     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9678 
9679     switch(enClient)
9680     {
9681         case E_XC_AUTODOWNLOAD_CLIENT_HDR:
9682         {
9683             pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32StartAddr = 0xFFFFFFFF;
9684             pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32Depth = 0;
9685             pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].enMode = enMode;
9686 
9687             //set baseaddr
9688             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_29_L, phyBaseAddr & 0x0000FFFF);
9689             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_2A_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9690 
9691             //set work mode
9692             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_28_L, 1, enMode);
9693             break;
9694         }
9695         case E_XC_AUTODOWNLOAD_CLIENT_OP2GAMMA:
9696         {
9697             //set baseaddr
9698             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_02_L, phyBaseAddr & 0x0000FFFF);
9699             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_03_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9700 
9701             //set work mode
9702             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 3, enMode);
9703             break;
9704         }
9705         case E_XC_AUTODOWNLOAD_CLIENT_FRCOP2GAMMA:
9706         {
9707             //set baseaddr
9708             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_12_L, phyBaseAddr & 0x0000FFFF);
9709             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_13_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9710 
9711             //set work mode
9712             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 6, enMode);
9713             break;
9714         }
9715         case E_XC_AUTODOWNLOAD_CLIENT_XVYCC:
9716         {
9717             //set baseaddr
9718             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_16_L, phyBaseAddr & 0x0000FFFF);
9719             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_17_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9720 
9721             //set work mode
9722             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 15, enMode);
9723             break;
9724         }
9725         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE1:
9726         {
9727             //set baseaddr
9728             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_04_L, phyBaseAddr & 0x0000FFFF);
9729             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_05_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9730 
9731             //set work mode
9732             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 4, enMode);
9733             break;
9734         }
9735         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE2:
9736         {
9737             //set baseaddr
9738             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_04_L, phyBaseAddr & 0x0000FFFF);
9739             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_05_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9740 
9741             //set work mode
9742             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 4, enMode);
9743             break;
9744         }
9745         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE3:
9746         {
9747             //set baseaddr
9748             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_04_L, phyBaseAddr & 0x0000FFFF);
9749             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_05_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9750 
9751             //set work mode
9752             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 4, enMode);
9753             break;
9754         }
9755         case E_XC_AUTODOWNLOAD_CLIENT_DEMURA:
9756         {
9757             //set baseaddr
9758             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_06_L, phyBaseAddr & 0x0000FFFF);
9759             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_07_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9760 
9761             //set work mode
9762             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 5, enMode);
9763             break;
9764         }
9765         case E_XC_AUTODOWNLOAD_CLIENT_OP2LUT:
9766         {
9767             //set baseaddr
9768             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_23_L, phyBaseAddr & 0x0000FFFF);
9769             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_24_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9770 
9771             //set work mode
9772             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_22_L, 1, enMode);
9773             break;
9774         }
9775         case E_XC_AUTODOWNLOAD_CLIENT_T3D_0:
9776         {
9777             //set baseaddr
9778             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_33_L, phyBaseAddr & 0x0000FFFF);
9779             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_34_L, (phyBaseAddr >>16 & 0x0000FFFF), 0x07FF);
9780 
9781             //set work mode
9782             _Hal_XC_Set_Auto_Download_WorkMode(psXCInstPri->u32DeviceID, REG_SC_BK67_32_L, 1, enMode);
9783             break;
9784         }
9785         case E_XC_AUTODOWNLOAD_CLIENT_T3D_1:
9786         {
9787             return E_APIXC_RET_FAIL;
9788         }
9789         case E_XC_AUTODOWNLOAD_CLIENT_FRCSPTPOPM:
9790         {
9791             return E_APIXC_RET_FAIL;
9792         }
9793         case E_XC_AUTODOWNLOAD_CLIENT_FOOPM:
9794         {
9795             return E_APIXC_RET_FAIL;
9796         }
9797         case E_XC_AUTODOWNLOAD_CLIENT_MAX:
9798         default:
9799         {
9800             return E_APIXC_RET_FAIL;
9801         }
9802 
9803     }
9804 
9805     return E_APIXC_RET_OK;
9806 }
9807 
MHal_XC_AutoDownload_Fire(void * pInstance,EN_XC_AUTODOWNLOAD_CLIENT enClient)9808 E_APIXC_ReturnValue MHal_XC_AutoDownload_Fire(void* pInstance, EN_XC_AUTODOWNLOAD_CLIENT enClient)
9809 {
9810     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9811     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9812 
9813     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9814     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9815 
9816     switch(enClient)
9817     {
9818         case E_XC_AUTODOWNLOAD_CLIENT_HDR:
9819         {
9820             MS_PHY phyBaseAddr = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].phyBaseAddr;
9821             MS_U32 u32Depth = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32Depth;
9822             MS_VIRT* pVirtBaseAddr = (MS_VIRT *)MS_PA2KSEG1(phyBaseAddr);
9823             MS_U8 *pu8BaseAddr = (MS_U8 *)pVirtBaseAddr;
9824             MS_U32 u32StartAddr = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32StartAddr;
9825             pu8BaseAddr += 16 * u32StartAddr;
9826 
9827             // set baseaddr
9828             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_29_L, (MS_PHY)MS_VA2PA((MS_VIRT)pu8BaseAddr) & 0x0000FFFF);
9829             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_2A_L, (MS_PHY)(MS_VA2PA((MS_VIRT)pu8BaseAddr) >> 16 & 0x0000FFFF), 0x07FF);
9830 
9831             // set depth
9832             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_2B_L, u32Depth);
9833             SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_2C_L, u32Depth);
9834 
9835             // enable auto download
9836             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_28_L, 1, BIT(0));
9837 
9838             EN_XC_AUTODOWNLOAD_MODE enMode = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].enMode;
9839             if (enMode == E_XC_AUTODOWNLOAD_TRIGGER_MODE)
9840             {
9841                 //check auto download done
9842                 MS_U32 u32Delayms = 0;
9843                 while(((SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK67_28_L) & 0x0001) != 0) && u32Delayms < 500)
9844                 {
9845                     MsOS_DelayTask(1);
9846                     u32Delayms++;
9847                 }
9848 
9849                 // clear buffer
9850                 MS_U32 i = 0;
9851                 for (i = 0; i < u32Depth; i++)
9852                 {
9853                     CLEAR_HDR_DATA_FORMAT_1(pu8BaseAddr + i * 16);
9854                 }
9855                 if (u32Delayms >= 500)
9856                 {
9857                     printf("Check auto download done timeout.\n");
9858                 }
9859             }
9860 
9861             pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32StartAddr = 0xFFFFFFFF;
9862             pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32Depth = 0;
9863             break;
9864         }
9865         case E_XC_AUTODOWNLOAD_CLIENT_OP2GAMMA:
9866         {
9867             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 1, BIT(0));
9868             break;
9869         }
9870         case E_XC_AUTODOWNLOAD_CLIENT_FRCOP2GAMMA:
9871         {
9872             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_11_L, 1, BIT(0));
9873             break;
9874         }
9875         case E_XC_AUTODOWNLOAD_CLIENT_XVYCC:
9876         {
9877             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_11_L, 1 << 2, BIT(2));
9878             break;
9879         }
9880         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE1:
9881         {
9882             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 1 << 1, BIT(1));
9883             break;
9884         }
9885         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE2:
9886         {
9887             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_21_L, 1, BIT(0));
9888             break;
9889         }
9890         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE3:
9891         {
9892             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_21_L, 1 << 1, BIT(1));
9893             break;
9894         }
9895         case E_XC_AUTODOWNLOAD_CLIENT_DEMURA:
9896         {
9897             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_01_L, 1 << 2, BIT(2));
9898             break;
9899         }
9900         case E_XC_AUTODOWNLOAD_CLIENT_OP2LUT:
9901         {
9902             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_22_L, 1, BIT(0));
9903             break;
9904         }
9905         case E_XC_AUTODOWNLOAD_CLIENT_T3D_0:
9906         {
9907             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK67_32_L, 1, BIT(0));
9908             break;
9909         }
9910         case E_XC_AUTODOWNLOAD_CLIENT_T3D_1:
9911         {
9912             return E_APIXC_RET_FAIL;
9913         }
9914         case E_XC_AUTODOWNLOAD_CLIENT_FRCSPTPOPM:
9915         {
9916             return E_APIXC_RET_FAIL;
9917         }
9918         case E_XC_AUTODOWNLOAD_CLIENT_FOOPM:
9919         {
9920             return E_APIXC_RET_FAIL;
9921         }
9922         case E_XC_AUTODOWNLOAD_CLIENT_MAX:
9923         default:
9924         {
9925             return E_APIXC_RET_FAIL;
9926         }
9927 
9928     }
9929 
9930     return E_APIXC_RET_OK;
9931 }
9932 
_Hal_XC_Auto_Download_Format_Hdr_Data(void * pInstance,EN_XC_AUTODOWNLOAD_SUB_CLIENT enSubClient,MS_U8 * pu8Data,MS_U32 u32Size,MS_PHY u16StartAddr)9933 static E_APIXC_ReturnValue _Hal_XC_Auto_Download_Format_Hdr_Data(void* pInstance,
9934         EN_XC_AUTODOWNLOAD_SUB_CLIENT enSubClient, MS_U8* pu8Data, MS_U32 u32Size, MS_PHY u16StartAddr)
9935 {
9936     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
9937     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
9938 
9939     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
9940     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
9941 
9942     MS_PHY phyBaseAddr = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].phyBaseAddr;
9943     MS_U32 u32Depth = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32Depth;
9944     MS_VIRT* pVirtBaseAddr = (MS_VIRT *)MS_PA2KSEG1(phyBaseAddr);
9945     unsigned int i = 0;
9946     MS_PHY u32Index = u16StartAddr;
9947     MS_U32 u32WriteNum = 0;
9948     MS_U8 *pu8BaseAddr = (MS_U8 *)pVirtBaseAddr;
9949     pu8BaseAddr += 16 * u16StartAddr;
9950 
9951     // update start addr of DRAM
9952     MS_PHY u32StartAddr = pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32StartAddr;
9953     if (u32StartAddr == 0xFFFFFFFF)
9954     {
9955         pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32StartAddr = u16StartAddr;
9956     }
9957     else
9958     {
9959         pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32StartAddr = u32StartAddr > u16StartAddr ? u16StartAddr : u32StartAddr;
9960     }
9961 
9962     //format&write datas into DRAM
9963     for (i = 0; i < u32Size; )
9964     {
9965         switch (enSubClient)
9966         {
9967             case E_XC_AUTODOWNLOAD_HDR_SUB_TMO:
9968             {
9969                 MS_U16 u16Value = *(((MS_U16 *)pu8Data) + i);
9970                 if (u16Value & 0xF000)
9971                 {
9972                     printf("The %dth data is 0x%x, exceed max value, please check!!!\n", i + 1, u16Value);
9973                     return E_APIXC_RET_FAIL_INVALID_PARAMETER;
9974                 }
9975                 WRITE_TMO_DATA_FORMAT_1(pu8BaseAddr, u32Index, u16Value);
9976                 i++;
9977                 break;
9978             }
9979             case E_XC_AUTODOWNLOAD_HDR_SUB_GAMMA:
9980             {
9981                 MS_U16 u16Value = *(((MS_U16 *)pu8Data) + i);
9982                 WRITE_GAMMA_DATA_FORMAT_1(pu8BaseAddr, u32Index, u16Value);
9983                 i++;
9984                 break;
9985             }
9986             case E_XC_AUTODOWNLOAD_HDR_SUB_DEGAMMA:
9987             {
9988                 MS_U32 u32Value = *(((MS_U32 *)pu8Data) + i);
9989                 if (u32Value & 0xFFF80000)
9990                 {
9991                     printf("The %dth data is 0x%x, exceed max value, please check!!!\n", i + 1, (unsigned int)u32Value);
9992                     return E_APIXC_RET_FAIL_INVALID_PARAMETER;
9993                 }
9994                 WRITE_DEGAMMA_DATA_FORMAT_1(pu8BaseAddr, u32Index, u32Value);
9995                 i++;
9996                 break;
9997             }
9998             case E_XC_AUTODOWNLOAD_HDR_SUB_3DLUT:
9999             {
10000                 MS_U16 u16RVal = *(((MS_U16 *)pu8Data) + i);
10001                 MS_U16 u16GVal = *(((MS_U16 *)pu8Data) + i + 1);
10002                 MS_U16 u16BVal = *(((MS_U16 *)pu8Data) + i + 2);
10003                 MS_U16 u16Subindex = 0;
10004                 if(i < _au32_3dlut_entry_num[0])
10005                 {
10006                     u16Subindex = 0;
10007                 }
10008                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1]))
10009                 {
10010                     u16Subindex = 1;
10011                 }
10012                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1] + _au32_3dlut_entry_num[2]))
10013                 {
10014                     u16Subindex = 2;
10015                 }
10016                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1] + _au32_3dlut_entry_num[2] + _au32_3dlut_entry_num[3]))
10017                 {
10018                     u16Subindex = 3;
10019                 }
10020                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1] + _au32_3dlut_entry_num[2] + _au32_3dlut_entry_num[3] + _au32_3dlut_entry_num[4]))
10021                 {
10022                     u16Subindex = 4;
10023                 }
10024                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1] + _au32_3dlut_entry_num[2] + _au32_3dlut_entry_num[3] + _au32_3dlut_entry_num[4] + _au32_3dlut_entry_num[5]))
10025                 {
10026                     u16Subindex = 5;
10027                 }
10028                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1] + _au32_3dlut_entry_num[2] + _au32_3dlut_entry_num[3] + _au32_3dlut_entry_num[4] + _au32_3dlut_entry_num[5] + _au32_3dlut_entry_num[6]))
10029                 {
10030                     u16Subindex = 6;
10031                 }
10032                 else if(i < (_au32_3dlut_entry_num[0] + _au32_3dlut_entry_num[1] + _au32_3dlut_entry_num[2] + _au32_3dlut_entry_num[3] + _au32_3dlut_entry_num[4] + _au32_3dlut_entry_num[5] + _au32_3dlut_entry_num[6] + _au32_3dlut_entry_num[7]))
10033                 {
10034                     u16Subindex = 7;
10035                 }
10036                 WRITE_3DLUT_DATA_FORMAT_1(pu8BaseAddr, u32Index, u16Subindex, u16RVal, u16GVal, u16BVal);
10037                 i += 3;
10038                 break;
10039             }
10040         }
10041         pu8BaseAddr += 16;
10042         u32WriteNum++;
10043         u32Index++;
10044     }
10045 
10046     u32Depth = u32Depth > u32WriteNum ? u32Depth : u32WriteNum;
10047     pXCResourcePrivate->stdrvXC_Display._stClientInfo[E_XC_AUTODOWNLOAD_CLIENT_HDR].u32Depth = u32Depth;
10048 
10049 #if DEBUG_HDR
10050     int j = 0;
10051     int l = 0;
10052 
10053     printf("\n#####################Dump Input Data####################\n");
10054     for (j = 0; j < u32Size;)
10055     {
10056         printf("The %04dth row: ", u16StartAddr++);
10057         switch (enSubClient)
10058         {
10059             case E_XC_AUTODOWNLOAD_HDR_SUB_TMO:
10060             {
10061                 MS_U16 u16Value = *(((MS_U16 *)pu8Data) + j);
10062                 printf("%02X \n", u16Value);
10063                 j++;
10064                 break;
10065             }
10066             case E_XC_AUTODOWNLOAD_HDR_SUB_GAMMA:
10067             {
10068                 MS_U16 u16Value = *(((MS_U16 *)pu8Data) + j);
10069                 printf("%02X \n", u16Value);
10070                 j++;
10071                 break;
10072             }
10073             case E_XC_AUTODOWNLOAD_HDR_SUB_DEGAMMA:
10074             {
10075                 MS_U32 u32Value = *(((MS_U32 *)pu8Data) + j);
10076                 printf("%04X \n", u32Value);
10077                 j++;
10078                 break;
10079             }
10080             case E_XC_AUTODOWNLOAD_HDR_SUB_3DLUT:
10081             {
10082                 MS_U16 u16RVal = *(((MS_U16 *)pu8Data) + j);
10083                 MS_U16 u16GVal = *(((MS_U16 *)pu8Data) + j + 1);
10084                 MS_U16 u16BVal = *(((MS_U16 *)pu8Data) + j + 2);
10085                 printf("%02X %02X %02X \n", u16RVal, u16GVal, u16BVal);
10086                 j += 3;
10087                 break;
10088             }
10089         }
10090         printf("\n");
10091     }
10092     printf("\n#####################Dump End####################\n\n");
10093 
10094     int k = AUTO_DOWNLOAD_HDR_TMO_SRAM_MAX_ADDR;
10095     printf("\n#####################Dump DRAM Buffer####################\n");
10096     for (j = 0; j < k; j++)
10097     {
10098         MS_U8 *pu8BaseAddr = (MS_U8 *)pVirtBaseAddr;
10099         printf("\nThe %04dth row: ", j);
10100         for (l = 0; l < 16; l++)
10101         {
10102             switch (enSubClient)
10103             {
10104                 case E_XC_AUTODOWNLOAD_HDR_SUB_TMO:
10105                 case E_XC_AUTODOWNLOAD_HDR_SUB_GAMMA:
10106                 case E_XC_AUTODOWNLOAD_HDR_SUB_DEGAMMA:
10107                 {
10108                     printf("%02X ", *(pu8BaseAddr + 16 * j + l));
10109                     break;
10110                 }
10111                 case E_XC_AUTODOWNLOAD_HDR_SUB_3DLUT:
10112                 {
10113                     printf("%02X ", *(pu8BaseAddr + 16 * j + l));
10114                     k = AUTO_DOWNLOAD_HDR_3DLUT_SRAM_MAX_ADDR;
10115                     break;
10116                 }
10117             }
10118         }
10119     }
10120     printf("\n#####################Dump End####################\n");
10121 #endif
10122 
10123     return E_APIXC_RET_OK;
10124 }
10125 
MHal_XC_AutoDownload_Write(void * pInstance,EN_XC_AUTODOWNLOAD_CLIENT enClient,MS_U8 * pu8Data,MS_U32 u32Size,void * pParam)10126 E_APIXC_ReturnValue MHal_XC_AutoDownload_Write(void* pInstance, EN_XC_AUTODOWNLOAD_CLIENT enClient, MS_U8* pu8Data, MS_U32 u32Size, void* pParam)
10127 {
10128     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10129     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10130 
10131     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10132     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10133 
10134     switch(enClient)
10135     {
10136         case E_XC_AUTODOWNLOAD_CLIENT_HDR:
10137         {
10138             XC_AUTODOWNLOAD_FORMAT_INFO* pstFormatInfo = (XC_AUTODOWNLOAD_FORMAT_INFO *)pParam;
10139             MS_PHY u16StartAddr = 0;
10140             MS_U32 u32MaxSize = 0;
10141             switch (pstFormatInfo->enSubClient)
10142             {
10143                 case E_XC_AUTODOWNLOAD_HDR_SUB_TMO:
10144                 case E_XC_AUTODOWNLOAD_HDR_SUB_GAMMA:
10145                 case E_XC_AUTODOWNLOAD_HDR_SUB_DEGAMMA:
10146                 {
10147                     u32MaxSize = AUTO_DOWNLOAD_HDR_TMO_SRAM_MAX_ADDR;
10148                     break;
10149                 }
10150                 case E_XC_AUTODOWNLOAD_HDR_SUB_3DLUT:
10151                 {
10152                     u32MaxSize = AUTO_DOWNLOAD_HDR_3DLUT_SRAM_MAX_ADDR * 3;
10153                     break;
10154                 }
10155                 default:
10156                 {
10157                     printf("Write auto download fail, invaild paramters, subClient: %d\n", pstFormatInfo->enSubClient);
10158                     return E_APIXC_RET_FAIL_INVALID_PARAMETER;
10159                 }
10160             }
10161             if (pstFormatInfo->bEnableRange == TRUE)
10162             {
10163                 if (pstFormatInfo->u16StartAddr <= pstFormatInfo->u16EndAddr && pstFormatInfo->u16EndAddr < u32MaxSize
10164                     && (pstFormatInfo->u16StartAddr + u32Size - 1) < u32MaxSize)
10165                 {
10166                     u16StartAddr = pstFormatInfo->u16StartAddr;
10167                 }
10168                 else
10169                 {
10170                     printf("Write auto download fail, invaild paramters, size: %d, addr range(enable, start, end) = (%d, %td, %td)\n",
10171                            (unsigned int)u32Size, pstFormatInfo->bEnableRange, (ptrdiff_t)pstFormatInfo->u16StartAddr, (ptrdiff_t)pstFormatInfo->u16EndAddr);
10172                     return E_APIXC_RET_FAIL_INVALID_PARAMETER;
10173                 }
10174             }
10175             else
10176             {
10177                 if (u32Size > u32MaxSize)
10178                 {
10179                     printf("Write auto download fail, invaild paramters, size: %d\n", (unsigned int)u32Size);
10180                     return E_APIXC_RET_FAIL_INVALID_PARAMETER;
10181                 }
10182             }
10183             return _Hal_XC_Auto_Download_Format_Hdr_Data(pInstance, pstFormatInfo->enSubClient, pu8Data, u32Size, u16StartAddr);
10184         }
10185         case E_XC_AUTODOWNLOAD_CLIENT_OP2GAMMA:
10186         case E_XC_AUTODOWNLOAD_CLIENT_FRCOP2GAMMA:
10187         case E_XC_AUTODOWNLOAD_CLIENT_XVYCC:
10188         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE1:
10189         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE2:
10190         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE3:
10191         case E_XC_AUTODOWNLOAD_CLIENT_DEMURA:
10192         case E_XC_AUTODOWNLOAD_CLIENT_OP2LUT:
10193         case E_XC_AUTODOWNLOAD_CLIENT_T3D_0:
10194         case E_XC_AUTODOWNLOAD_CLIENT_T3D_1:
10195         case E_XC_AUTODOWNLOAD_CLIENT_FRCSPTPOPM:
10196         case E_XC_AUTODOWNLOAD_CLIENT_FOOPM:
10197         case E_XC_AUTODOWNLOAD_CLIENT_MAX:
10198         default:
10199         {
10200             return E_APIXC_RET_FAIL;
10201         }
10202 
10203     }
10204 
10205     return E_APIXC_RET_OK;
10206 }
10207 
MHal_XC_GetAutoDownloadCaps(EN_XC_AUTODOWNLOAD_CLIENT enClient,MS_BOOL * pbSupported)10208 E_APIXC_ReturnValue MHal_XC_GetAutoDownloadCaps(EN_XC_AUTODOWNLOAD_CLIENT enClient, MS_BOOL *pbSupported)
10209 {
10210     switch(enClient)
10211     {
10212         case E_XC_AUTODOWNLOAD_CLIENT_HDR:
10213         case E_XC_AUTODOWNLOAD_CLIENT_OP2GAMMA:
10214         case E_XC_AUTODOWNLOAD_CLIENT_FRCOP2GAMMA:
10215         case E_XC_AUTODOWNLOAD_CLIENT_XVYCC:
10216         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE1:
10217         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE2:
10218         case E_XC_AUTODOWNLOAD_CLIENT_ODTABLE3:
10219         case E_XC_AUTODOWNLOAD_CLIENT_DEMURA:
10220         case E_XC_AUTODOWNLOAD_CLIENT_OP2LUT:
10221         case E_XC_AUTODOWNLOAD_CLIENT_T3D_0:
10222         case E_XC_AUTODOWNLOAD_CLIENT_T3D_1:
10223         case E_XC_AUTODOWNLOAD_CLIENT_FRCSPTPOPM:
10224         case E_XC_AUTODOWNLOAD_CLIENT_FOOPM:
10225         {
10226             *pbSupported = TRUE;
10227             break;
10228         }
10229         case E_XC_AUTODOWNLOAD_CLIENT_MAX:
10230         default:
10231         {
10232             *pbSupported = FALSE;
10233             break;
10234         }
10235 
10236     }
10237 
10238     return E_APIXC_RET_OK;
10239 }
10240 #endif
10241 
10242 #ifdef UFO_XC_HDR
10243 #if (UFO_XC_HDR_VERSION == 2)
_Hal_XC_HDR_UpdateDMAMode(void * pInstance)10244 static E_APIXC_ReturnValue _Hal_XC_HDR_UpdateDMAMode(void* pInstance)
10245 {
10246     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10247     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10248 
10249     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10250     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10251 
10252     EN_XC_HDR_COLOR_FORMAT enColorFormat = pXCResourcePrivate->stdrvXC_Display._enColorFormat;
10253     EN_XC_HDR_DMA_MODE enMode = pXCResourcePrivate->stdrvXC_Display._stDMAConfigInfo.enMode;
10254 
10255     switch (enColorFormat)
10256     {
10257         case E_XC_HDR_COLOR_YUV422:
10258         {
10259             // set dma mode
10260             if (enMode == E_XC_HDR_DMA_MODE_12BIT)
10261             {
10262                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_01_L, 0, 0x0003);
10263             }
10264             else if (enMode == E_XC_HDR_DMA_MODE_8BIT)
10265             {
10266                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_01_L, 2, 0x0003);
10267             }
10268             else if (enMode == E_XC_HDR_DMA_MODE_10BIT)
10269             {
10270                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_01_L, 3, 0x0003);
10271             }
10272             break;
10273         }
10274         case E_XC_HDR_COLOR_YUV444:
10275         {
10276             if (enMode == E_XC_HDR_DMA_MODE_10BIT)
10277             {
10278                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_01_L, 1, 0x0003);
10279             }
10280             break;
10281         }
10282         case E_XC_HDR_COLOR_YUV420:
10283         case E_XC_HDR_COLOR_RGB:
10284         default:
10285         {
10286             break;
10287         }
10288     }
10289 
10290     return E_APIXC_RET_OK;
10291 }
10292 
MHal_XC_HDR_Control(void * pInstance,EN_XC_HDR_CTRL_TYPE enCtrlType,void * pParam)10293 E_APIXC_ReturnValue MHal_XC_HDR_Control(void* pInstance, EN_XC_HDR_CTRL_TYPE enCtrlType, void *pParam)
10294 {
10295     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10296     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10297 
10298     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10299     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10300 
10301     switch(enCtrlType)
10302     {
10303         case E_XC_HDR_CTRL_CONFIG_DMA:
10304         case E_XC_HDR_CTRL_SET_COLOR_FORMAT:
10305         {
10306             _Hal_XC_HDR_UpdateDMAMode(pInstance);
10307             break;
10308         }
10309 #ifdef UFO_XC_HDMI_4K2K_DMA
10310         case E_XC_HDR_CTRL_INIT_DMA_HDMI:
10311 #endif
10312         case E_XC_HDR_CTRL_INIT_DMA:
10313         {
10314             MS_U8 u8MIUSel = 0;
10315             MS_U8 u8FrameNum = 0;
10316             XC_HDR_DMA_INIT_INFO stDMAInitInfo = *(XC_HDR_DMA_INIT_INFO *)pParam;
10317             _phy_to_miu_offset(u8MIUSel, stDMAInitInfo.phyBaseAddr, stDMAInitInfo.phyBaseAddr);
10318             if (stDMAInitInfo.u32Size != 0)
10319             {
10320                 // set IPM/OPM addr
10321                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK42_08_L, stDMAInitInfo.phyBaseAddr / BYTE_PER_WORD);
10322                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_09_L, (stDMAInitInfo.phyBaseAddr / BYTE_PER_WORD) >> 16, 0x01FF);
10323                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK42_10_L, stDMAInitInfo.phyBaseAddr / BYTE_PER_WORD);
10324                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_11_L, (stDMAInitInfo.phyBaseAddr / BYTE_PER_WORD) >> 16, 0x01FF);
10325                 // set miu
10326                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_05_L, u8MIUSel << 4, BMASK(5:4));
10327                 // set limit addr
10328                 // enable limit
10329                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_50_L, 1, BIT(0));
10330                 // min addr
10331                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK42_52_L, stDMAInitInfo.phyBaseAddr / BYTE_PER_WORD);
10332                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_53_L, (stDMAInitInfo.phyBaseAddr / BYTE_PER_WORD) >> 16, 0x01FF);
10333                 // max addr
10334                 SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK42_54_L, (stDMAInitInfo.phyBaseAddr + stDMAInitInfo.u32Size) / BYTE_PER_WORD - 1);
10335                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_55_L, ((stDMAInitInfo.phyBaseAddr + stDMAInitInfo.u32Size) / BYTE_PER_WORD - 1) >> 16, 0x01FF);
10336                 // frame number
10337                 u8FrameNum = stDMAInitInfo.u32Size/(3840*2160*3);
10338                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK42_19_L, u8FrameNum, 0x001F);
10339             }
10340             break;
10341         }
10342         case E_XC_HDR_CTRL_ENABLE:
10343         case E_XC_HDR_CTRL_SET_TYPE:
10344         case E_XC_HDR_CTRL_SET_3DLUT:
10345         case E_XC_HDR_CTRL_SET_OTT_SHARE_MEMORY:
10346         case E_XC_HDR_CTRL_SET_OPEN_METADATA:
10347         default:
10348         {
10349             break;
10350         }
10351     }
10352 
10353     return E_APIXC_RET_OK;
10354 }
10355 
MHal_XC_DolbySWBonded(void * pInstance)10356 MS_BOOL MHal_XC_DolbySWBonded(void *pInstance)
10357 {
10358     MS_U16 u16OldVal = 0;
10359     MS_U16 u16Val = 0;
10360     MS_U32 u32Count = 0;
10361     MS_U16 u16DolbySWBondStatus;
10362 
10363     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10364     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10365 
10366     u16OldVal = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L);
10367     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L, 0x60<<2, 0x1FFF);
10368     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L, 0, BIT(15));
10369     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L, BIT(13), BIT(13));
10370     u16Val = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L, BIT(13));
10371 
10372     while (u16Val & BIT(13))
10373     {
10374         u32Count ++;
10375         MsOS_DelayTask(10);
10376 
10377         if(u32Count > 10)
10378         {
10379             break;
10380         }
10381         u16Val = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L, BIT(13));
10382     }
10383     u16DolbySWBondStatus = SC_R2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_2C_L);
10384     SC_W2BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_28_L, u16OldVal);
10385 
10386     if(u16DolbySWBondStatus & BIT(0))
10387     {
10388         u16DolbySWBondStatus = FALSE;
10389     }
10390     else
10391     {
10392         u16DolbySWBondStatus = (u16DolbySWBondStatus & BIT(4)) > 0? TRUE : FALSE;
10393     }
10394 
10395     return u16DolbySWBondStatus;
10396 }
10397 
10398 
10399 
MHal_XC_HDR_GetCaps(void * pInstance,XC_HDR_SUPPORTED_CAPS * pstHDRCaps)10400 E_APIXC_ReturnValue MHal_XC_HDR_GetCaps(void *pInstance, XC_HDR_SUPPORTED_CAPS *pstHDRCaps)
10401 {
10402     EN_XC_HDR_TYPE enHDRType = pstHDRCaps->enHDRType;
10403 
10404     switch (enHDRType)
10405     {
10406         case E_XC_HDR_TYPE_OPEN:
10407         {
10408             pstHDRCaps->bSupported = TRUE;
10409             break;
10410         }
10411         case E_XC_HDR_TYPE_DOLBY:
10412         {
10413             if(MHal_XC_DolbySWBonded(pInstance))                      //SW bonded
10414             {
10415                 pstHDRCaps->bSupported = FALSE;
10416             }
10417 #ifndef CONFIG_MBOOT  //Add For GPL (content protection)
10418             else if (MDrv_AUTH_IPCheck(IPAUTH_DOLBY_HDR_PIN))
10419             {
10420                 pstHDRCaps->bSupported = TRUE;
10421             }
10422 #endif
10423             else
10424             {
10425                 pstHDRCaps->bSupported = FALSE;
10426             }
10427             break;
10428         }
10429         case E_XC_HDR_TYPE_TECHNICOLOR:
10430         {
10431             pstHDRCaps->bSupported = FALSE;
10432             break;
10433         }
10434         case E_XC_HDR_TYPE_HLG:
10435         {
10436             pstHDRCaps->bSupported = FALSE;
10437             break;
10438         }
10439         default:
10440         {
10441             pstHDRCaps->bSupported = FALSE;
10442         }
10443     }
10444 
10445     pstHDRCaps->s32MaxLuminanceData = -1;
10446     pstHDRCaps->s32MinLuminanceData = -1;
10447     pstHDRCaps->s32MaxFrameAveLumiance = -1;
10448 
10449     return E_APIXC_RET_OK;
10450 }
10451 #endif
10452 #endif
10453 
10454 //T3D MIU select from external
Hal_SC_Set_T3D_MiuSelectExternal(void * pInstance,MS_U8 u8MIUSel)10455 void Hal_SC_Set_T3D_MiuSelectExternal(void *pInstance, MS_U8 u8MIUSel)
10456 {
10457     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10458     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10459     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10460     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10461 
10462     if(2 == u8MIUSel)//MIU2 = (10) ==> REG_SC_BK7F_18_[10] = 1 && REG_SC_BK7F_10_[10] = 0
10463     {
10464         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_11_L, 0, BIT(10));//Enable T3D select MIU exteral
10465         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L, 0, BIT(10));//T3D MIU select low 1 bit
10466         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_18_L, BIT(10), BIT(10));//T3D MIU select hight 1 bit
10467     }
10468     else if(1 == u8MIUSel)//MIU1
10469     {
10470         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_11_L, 0, BIT(10));//Enable T3D select MIU exteral
10471         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L, BIT(10), BIT(10));//T3D MIU select low 1 bit
10472         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_18_L, 0, BIT(10));//T3D MIU select hight 1 bit
10473     }
10474     else//MIU0
10475     {
10476         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_11_L, 0, BIT(10));//Enable T3D select MIU exteral
10477         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_10_L,0, BIT(10));// T3D MIU select low 1 bit
10478         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK7F_18_L, 0, BIT(10));//T3D MIU select hight 1 bit
10479     }
10480 }
10481 
10482 #ifdef CONFIG_MSTAR_SRAMPD
MHal_XC_SRAM_PowerDown_Control(void * pInstance,MS_BOOL bEnable)10483 E_APIXC_ReturnValue MHal_XC_SRAM_PowerDown_Control(void* pInstance, MS_BOOL bEnable)
10484 {
10485     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10486     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10487 
10488     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10489     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10490 
10491     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
10492 
10493     if (bEnable)
10494     {
10495         // power down case
10496         if (!IsVBY1_16LANE(u8LPLL_Type))
10497         {
10498             // FO_TOP SRAM PD
10499             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_65_L, 0x0001, 0x0001); // SC_FO_BKC9_65[0]
10500             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_69_L, 0x000F, 0x000F); // SC_FO_BKC9_69[3:0]
10501             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6C_L, 0x0003, 0x0003); // SC_FO_BKC9_6C[1:0]
10502             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6D_L, 0x0001, 0x0001); // SC_FO_BKC9_6d[0]
10503             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6E_L, 0x0100, 0x0100); // SC_FO_BKC9_6e[8]
10504             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6F_L, 0x0101, 0x0101); // SC_FO_BKC9_6f[0] + SC_FO_BKC9_6f[8]
10505             // FO_TOP clk gate
10506             W2BYTEMSK(L_CLKGEN0(0x53),0x0001,0x0001); // BK100B_CKGEN0_53[0]
10507             W2BYTEMSK(L_CLKGEN2(0x44),0x0100,0x0100); // BK100A_CKGEN2_44[8]
10508             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_03_L, 0x0000, 0x0010); // ~SC_FO_BKC9_03[4]
10509         }
10510 
10511         // SPF SRAM PD
10512         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0D_L, 0x0007, 0x0007); // SC_SPD_BK3F_0D[2:0]
10513         // SPF clk gate
10514         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_50_L, 0x0000, 0x4000); // ~SC_SPD_BK3F_50[14] (clk_fclk)
10515         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_52_L, 0x0000, 0x4000); // ~SC_SPD_BK3F_52[14] (clk_fclk_live)
10516 
10517         // DI SRAM PD
10518         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_05_L, 0x003F, 0x003F); // SC_SPD_BK3F_05[5:0]
10519         // DI clk gate
10520         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_40_L, 0x0000, 0x0001); // ~SC_SPD_BK3F_40[0](clk_fclk)
10521 
10522         // IPM  + OPW SRAM PD
10523         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_03_L, 0x005F, 0x005F); // SC_SPD_BK3F_03[4:0] + SC_SPD_BK3F_03[6]
10524         // IPM  + OPW clk gate
10525         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_40_L, 0x0000, 0x1004); // ~SC_SPD_BK3F_40[2](clk_mclk) + ~SC_SPD_BK3F_40[12](clk_mclk)
10526 
10527         _bSRAMPowerDown = TRUE;
10528     }
10529     else
10530     {
10531         // power on case
10532         if (!IsVBY1_16LANE(u8LPLL_Type))
10533         {
10534             // FO_TOP SRAM PD
10535             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_65_L, 0x0000, 0x0001); // SC_FO_BKC9_65[0]
10536             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_69_L, 0x0000, 0x000F); // SC_FO_BKC9_69[3:0]
10537             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6C_L, 0x0000, 0x0003); // SC_FO_BKC9_6C[1:0]
10538             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6D_L, 0x0000, 0x0001); // SC_FO_BKC9_6d[0]
10539             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6E_L, 0x0000, 0x0100); // SC_FO_BKC9_6e[8]
10540             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_6F_L, 0x0000, 0x0101); // SC_FO_BKC9_6f[0] + SC_FO_BKC9_6f[8]
10541             // FO_TOP clk gate
10542             W2BYTEMSK(L_CLKGEN0(0x53),0x0000,0x0001); // BK100B_CKGEN0_53[0]
10543             W2BYTEMSK(L_CLKGEN2(0x44),0x0000,0x0100); // BK100A_CKGEN2_44[8]
10544             SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKC9_03_L, 0x0010, 0x0010); // ~SC_FO_BKC9_03[4]
10545         }
10546 
10547         // SPF SRAM PD
10548         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0D_L, 0x0000, 0x0007); // SC_SPD_BK3F_0D[2:0]
10549         // SPF clk gate
10550         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_50_L, 0x4000, 0x4000); // ~SC_SPD_BK3F_50[14] (clk_fclk)
10551         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_52_L, 0x4000, 0x4000); // ~SC_SPD_BK3F_52[14] (clk_fclk_live)
10552 
10553         // DI SRAM PD
10554         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_05_L, 0x0000, 0x003F); // SC_SPD_BK3F_05[5:0]
10555         // DI clk gate
10556         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_40_L, 0x0001, 0x0001); // ~SC_SPD_BK3F_40[0](clk_fclk)
10557 
10558         // IPM  + OPW SRAM PD
10559         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_03_L, 0x0000, 0x005F); // SC_SPD_BK3F_03[4:0] + SC_SPD_BK3F_03[6]
10560         // IPM  + OPW clk gate
10561         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_40_L, 0x1004, 0x1004); // ~SC_SPD_BK3F_40[2](clk_mclk) + ~SC_SPD_BK3F_40[12](clk_mclk)
10562 
10563         _bSRAMPowerDown = FALSE;
10564     }
10565 
10566     return E_APIXC_RET_OK;
10567 }
10568 
MHal_XC_Is_SRAM_PowerDown(void * pInstance)10569 MS_BOOL MHal_XC_Is_SRAM_PowerDown(void* pInstance)
10570 {
10571     return _bSRAMPowerDown;
10572 }
10573 
MHal_XC_Set_LD_SRAM_Power_Down(void * pInstance,MS_BOOL bIsSRAMPowerDown)10574 void MHal_XC_Set_LD_SRAM_Power_Down(void* pInstance, MS_BOOL bIsSRAMPowerDown)
10575 {
10576     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10577     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10578     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10579     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10580 
10581     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
10582 
10583     if(bIsSRAMPowerDown)
10584     {
10585         //power dowm
10586         // FO setting
10587         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BKC9_65_L, (BIT(0)), 0x0001);
10588         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BKCE_01_L, (0x0000), 0x1000);
10589         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BKCE_37_L, (BIT(15)), 0x8000);
10590         //non-FO setting
10591         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK3F_12_L, (BIT(0)| BIT(1)), 0x0003);
10592         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK3F_50_L, (0x0000), 0x3800);
10593         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK2E_37_L, (BIT(15)), 0x8000);
10594     }
10595     else
10596     {
10597         //power on
10598         if (IsVBY1_16LANE(u8LPLL_Type))
10599         {
10600             // FO setting
10601             SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BKC9_65_L, (0x0000), 0x0001);
10602             SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BKCE_01_L, (BIT(12)), 0x1000);
10603             SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BKCE_37_L, (0x0000), 0x8000);
10604         }
10605         else
10606         {
10607             SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK3F_12_L,  0x0000, 0x0003);
10608             SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK3F_50_L, (BIT(11)| BIT(12)|BIT(13)), 0x3800);
10609             SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK2E_37_L, (0x0000), 0x8000);
10610         }
10611     }
10612 }
10613 
MHal_XC_Set_ADC_SRAM_Power_Down(void * pInstance,MS_BOOL bIsSRAMPowerDown)10614 void MHal_XC_Set_ADC_SRAM_Power_Down(void* pInstance, MS_BOOL bIsSRAMPowerDown)
10615 {
10616     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10617     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10618     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10619     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10620 
10621     if(bIsSRAMPowerDown)
10622     {
10623         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK3F_03_L, 0x0080, 0x0080);
10624     }
10625     else
10626     {
10627         SC_W2BYTEMSK(psXCInstPri->u32DeviceID,REG_SC_BK3F_03_L, 0x0000, 0x0080);
10628     }
10629 }
10630 
Hal_SC_Sub_SRAM_PowerDown_Control(void * pInstance,MS_BOOL bPipEnable)10631 void Hal_SC_Sub_SRAM_PowerDown_Control(void *pInstance, MS_BOOL bPipEnable)
10632 {
10633     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10634     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10635     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10636     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10637 
10638     if(psXCInstPri->u32DeviceID != 1)
10639     {
10640         printf("[%s,%5d]  not support this device ID!",__FUNCTION__,__LINE__);
10641         return;
10642     }
10643 
10644     if(bPipEnable == TRUE)
10645     {
10646         MDrv_WriteRegBit(REG_CKG_S2_IDCLK2, DISABLE, CKG_S2_IDCLK2_GATED);
10647 
10648         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, 0, BIT(7));
10649 //        SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, 0, BIT(11));
10650         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_20_L, 0, BIT(0)|BIT(8));
10651         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_01_L, 0, 0xFFFF);
10652         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_02_L, 0, 0xFFFF);
10653         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_03_L, 0, 0xFFFF);
10654         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_04_L, 0, 0xFFFF);
10655         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_05_L, 0, 0xFFFF);
10656         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_06_L, 0, 0xFFFF);
10657         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_07_L, 0, 0xFFFF);
10658         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_08_L, 0, 0xFFFF);
10659         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_09_L, 0, 0xFFFF);
10660         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0A_L, 0, 0xFFFF);
10661         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0B_L, 0, 0xFFFF);
10662         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0C_L, 0, 0xFFFF);
10663         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0D_L, 0, 0xFFFF);
10664         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_10_L, 0, 0xFFFF);
10665         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_11_L, 0, 0xFFFF);
10666         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_12_L, 0, 0xFFDF);
10667         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_13_L, 0, 0xFFFF);
10668         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_14_L, 0, 0xFFFF);
10669         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_15_L, 0, 0xFFFF);
10670         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_16_L, 0, BIT(11));
10671     }
10672     else
10673     {
10674         //for power saving
10675         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK01_02_L, BIT(7), BIT(7));
10676 //        SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK00_03_L, BIT(11), BIT(11));
10677         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_20_L, BIT(0)|BIT(8), BIT(0)|BIT(8));
10678         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_01_L, 0xFFFF, 0xFFFF);
10679         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_02_L, 0xFFFF, 0xFFFF);
10680         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_03_L, 0xFFFF, 0xFFFF);
10681         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_04_L, 0xFFFF, 0xFFFF);
10682         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_05_L, 0xFFFF, 0xFFFF);
10683         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_06_L, 0xFFFF, 0xFFFF);
10684         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_07_L, 0xFFFF, 0xFFFF);
10685         //SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_08_L, 0xFFFF, 0xFFFF); //!!! Sub HVSP can not be closed
10686         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_09_L, 0xFFFF, 0xFFFF);
10687         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0A_L, 0xFFFF, 0xFFFF);
10688         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0B_L, 0xFFFF, 0xFFFF);
10689         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0C_L, 0xFFFF, 0xFFFF);
10690         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_0D_L, 0xFFFF, 0xFFFF);
10691         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_10_L, 0xFFFF, 0xFFFF);
10692         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_11_L, 0xFFFF, 0xFFFF);
10693         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_12_L, 0xFFDF, 0xFFDF);
10694         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_13_L, 0xFFFF, 0xFFFF);
10695         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_14_L, 0xFFFF, 0xFFFF);
10696         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_15_L, 0xFFFF, 0xFFFF);
10697         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK3F_16_L,  BIT(11), BIT(11));
10698 
10699         MDrv_WriteRegBit(REG_CKG_S2_IDCLK2, ENABLE, CKG_S2_IDCLK2_GATED);
10700     }
10701 }
10702 #endif
10703 
MHal_XC_GetPQPathStatus(void * pInstance,E_XC_PQ_Path_Type ePqPathType,MS_U16 u16Width,MS_U16 u16Height)10704 MS_BOOL MHal_XC_GetPQPathStatus(void* pInstance, E_XC_PQ_Path_Type ePqPathType, MS_U16 u16Width, MS_U16 u16Height)
10705 {
10706     MS_BOOL bRet = FALSE;
10707     switch (ePqPathType)
10708     {
10709         case E_XC_PQ_4K_PATH :
10710             bRet = (IS_4K2K_MODE(u16Width, u16Height)||IS_4K1K_MODE(u16Width, u16Height));
10711             break;
10712         case  E_XC_PQ_UFSC_4K_PATH :
10713             if(MHal_FRC_IsFHDToFSC(pInstance, MAIN_WINDOW))
10714             {
10715                 bRet = FALSE;
10716             }
10717             else
10718             {
10719                 bRet = TRUE;
10720             }
10721             break;
10722         default :
10723             printf("[%s][%d]  not path type(%d)!\n", __FUNCTION__, __LINE__, ePqPathType);
10724             break;
10725     }
10726 
10727     return bRet;
10728 }
10729 
10730 static XC_VSYNC_VSTART stXCVstart = {0, 0, 0, 0};
MHal_XC_PixelShiftStatusChange(void * pInstance,XC_PIXEL_SHIFT_STATUS enStatus)10731 MS_BOOL MHal_XC_PixelShiftStatusChange(void* pInstance, XC_PIXEL_SHIFT_STATUS enStatus)
10732 {
10733     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10734     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10735     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10736     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10737     MS_U8 u8LPLL_Type = 0;
10738     MS_U16 u16Reg = 0;
10739     u8LPLL_Type =(MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
10740     XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "enStatus: %d, psXCInstPri->u32DeviceID: %d.\n", enStatus, psXCInstPri->u32DeviceID);
10741 
10742     switch (enStatus)
10743     {
10744         case EN_XC_PIXEL_SHIFT_DISABLE:
10745             // Maserati mode
10746             if (IsVBY1_16LANE(u8LPLL_Type))
10747             {
10748                 // Restore DE_VStart;
10749                 u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, 0x1FFF);
10750                 if ((u16Reg != stXCVstart.u16RegTGenDeVstart) && (stXCVstart.u16RegTGenDeVstart != 0))
10751                 {
10752                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, stXCVstart.u16RegTGenDeVstart, 0x1FFF);
10753                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, stXCVstart.u16RegTGenDeVend, 0x1FFF);
10754                     stXCVstart.u16RegTGenDeVstart = 0;
10755                     stXCVstart.u16RegTGenDeVend   = 0;
10756                 }
10757             }
10758             u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0B_L, 0x1FFF);
10759             if ((u16Reg != stXCVstart.u16RegSTGenDeVstart) && (stXCVstart.u16RegSTGenDeVstart != 0))
10760             {
10761                 //BK68_0B [12:0]:reg_f_de_yst
10762                 //BK68_0C [12:0]:reg_f_de_yend
10763                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0B_L, stXCVstart.u16RegSTGenDeVstart, 0x1FFF);
10764                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0C_L, stXCVstart.u16RegSTGenDeVend, 0x1FFF);
10765                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0E_L, stXCVstart.u16RegSTGenDeVend, 0x1FFF);
10766                 stXCVstart.u16RegSTGenDeVstart = 0;
10767                 stXCVstart.u16RegSTGenDeVend = 0;
10768             }
10769         break;
10770         case EN_XC_PIXEL_SHIFT_ENABLE:
10771             // Maserati mode
10772             if (IsVBY1_16LANE(u8LPLL_Type))
10773             {
10774                 if (0 == stXCVstart.u16RegTGenDeVstart)
10775                 {
10776                     u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, 0x1FFF);
10777                     stXCVstart.u16RegTGenDeVstart = u16Reg;
10778                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, (u16Reg + 2), 0x1FFF);
10779 
10780                     u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, 0x1FFF);
10781                     stXCVstart.u16RegTGenDeVend = u16Reg;
10782                     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (u16Reg + 2), 0x1FFF);
10783                 }
10784             }
10785             if (0 == stXCVstart.u16RegSTGenDeVstart)
10786             {
10787                 //BK68_0B [12:0]:reg_f_de_yst
10788                 //BK68_0C [12:0]:reg_f_de_yend
10789                 u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0B_L, 0x1FFF);
10790                 stXCVstart.u16RegSTGenDeVstart = u16Reg;
10791                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0B_L, (u16Reg + 2), 0x1FFF);
10792 
10793                 u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0C_L, 0x1FFF);
10794                 stXCVstart.u16RegSTGenDeVend = u16Reg;
10795                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0C_L, (u16Reg + 2), 0x1FFF);
10796                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0E_L, (u16Reg + 2), 0x1FFF);
10797             }
10798         break;
10799         case EN_XC_PIXEL_SHIFT_FORCE_UPDATE:
10800             if ((pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange != 0)
10801                 && ((pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW] == E_XC_3D_INPUT_MODE_NONE) && (pXCResourcePrivate->stdrvXC_3D._eOutput3DMode == E_XC_3D_OUTPUT_MODE_NONE))
10802                 )
10803             {
10804                 // pixelshift
10805                 if (IsVBY1_16LANE(u8LPLL_Type))
10806                 {
10807                     u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, 0x1FFF);
10808                     if (stXCVstart.u16RegTGenDeVstart == 0)
10809                     {
10810                         stXCVstart.u16RegTGenDeVstart = u16Reg;
10811                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_06_L, (u16Reg + 2), 0x1FFF);
10812 
10813                         u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, 0x1FFF);
10814                         stXCVstart.u16RegTGenDeVend = u16Reg;
10815                         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_07_L, (u16Reg + 2), 0x1FFF);
10816                     }
10817                 }
10818 
10819                 //BK68_0B [12:0]:reg_f_de_yst
10820                 //BK68_0C [12:0]:reg_f_de_yend
10821                 u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0B_L, 0x1FFF);
10822                 stXCVstart.u16RegSTGenDeVstart = u16Reg;
10823                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0B_L, (u16Reg + 2), 0x1FFF);
10824 
10825                 u16Reg = SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0C_L, 0x1FFF);
10826                 stXCVstart.u16RegSTGenDeVend = u16Reg;
10827                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0C_L, (u16Reg + 2), 0x1FFF);
10828                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_0E_L, (u16Reg + 2), 0x1FFF);
10829             }
10830             else
10831             {
10832                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "gu16VPixelShiftRange: %u.\n", pXCResourcePrivate->stdrvXC_MVideo.gu16VPixelShiftRange);
10833                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_eInput3DMode: %d.\n", pXCResourcePrivate->stdrvXC_3D._eInput3DMode[MAIN_WINDOW]);
10834                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "_eOutput3DMode: %d.\n", pXCResourcePrivate->stdrvXC_3D._eOutput3DMode);
10835                 XC_LOG_TRACE(XC_DBGLEVEL_SETWINDOW, "ByPass EN_XC_PIXEL_SHIFT_FORCE_UPDATE.\n");
10836             }
10837         break;
10838         default:
10839         break;
10840     }
10841 
10842     return TRUE;
10843 }
10844 
10845 #if defined(PATCH_HW_VTT_LIMITATION)
10846 //There is the hareware bug on Macan U1 Chip REG_SC_BK10_0D.
10847 //That is replaced by REG_SC_BK68 byMHal_XC_SetVopVtt function.
MHal_XC_SetVopVttByBK68(void * pInstance,MS_U16 u16Vtt,MS_BOOL bMLoadEnable)10848 void MHal_XC_SetVopVttByBK68(void* pInstance, MS_U16 u16Vtt, MS_BOOL bMLoadEnable)
10849 {
10850     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10851     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10852     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10853     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10854     SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_38_L, 0xFA, 0xFFFF);
10855 
10856     if(bMLoadEnable)
10857     {
10858         Mhal_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_33_L, BIT(3) , BIT(3));
10859         Mhal_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_33_L, 0 , BIT(3));
10860         Mhal_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_36_L, u16Vtt , 0xFFFF);
10861         Mhal_XC_MLoad_WriteCmd(pInstance, REG_SC_BK68_37_L, u16Vtt , 0xFFFF);
10862         Mhal_XC_MLoad_Fire(pInstance, TRUE);
10863     }
10864     else
10865     {
10866         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_33_L, BIT(3) , BIT(3));
10867         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_33_L, 0 , BIT(3));
10868         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_36_L, u16Vtt , 0xFFFF);
10869         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK68_37_L, u16Vtt , 0xFFFF);
10870     }
10871 }
10872 #endif
10873 
Hal_SC_CheckMuteStatusByRegister(void * pInstance,SCALER_WIN eWindow)10874 MS_BOOL Hal_SC_CheckMuteStatusByRegister(void *pInstance, SCALER_WIN eWindow)
10875 {
10876     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10877     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10878 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
10879     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10880     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10881 
10882     MS_U8 u8LPLL_Type = (MS_U8)pXCResourcePrivate->stdrvXC_MVideo_Context.g_XC_InitData.stPanelInfo.eLPLL_Type;
10883 #endif
10884     MS_BOOL bRet = FALSE;
10885 
10886 #if (PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB)
10887     if(((MAIN_WINDOW == eWindow) && (psXCInstPri->u32DeviceID == 1))
10888         || (SUB_WINDOW == eWindow)
10889     )
10890     {
10891         bRet = (SC_R2BYTEMSK(0, REG_SC_BK10_19_L, BIT(5)) ? TRUE: FALSE);
10892     }
10893 #else
10894     if(SUB_WINDOW == eWindow)
10895     {
10896         bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(5)) ? TRUE: FALSE);
10897     }
10898 #endif
10899     else if(MAIN_WINDOW == eWindow)
10900     {
10901 #if (FRC_INSIDE && (HW_DESIGN_4K2K_VER == 6))
10902         if (IsVBY1_16LANE(u8LPLL_Type))
10903         {
10904             bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(1)) ? TRUE: FALSE)||(SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BKCB_17_L, BIT(1)) ? TRUE: FALSE);
10905         }
10906         else
10907         {
10908         bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(1)) ? TRUE: FALSE);
10909     }
10910 #else
10911         bRet = (SC_R2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK10_19_L, BIT(1)) ? TRUE: FALSE);
10912 #endif
10913     }
10914     return bRet;
10915 }
10916 
Hal_SC_add_dram_to_shm(void * pInstance,SCALER_WIN eWindow,MS_PHY u32address,MS_U32 u32length)10917 void Hal_SC_add_dram_to_shm(void *pInstance,SCALER_WIN eWindow,MS_PHY u32address,MS_U32 u32length)
10918 {
10919     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10920     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10921     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10922     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10923 
10924     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_cnt].address = u32address;
10925     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_cnt].length = u32length;
10926     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_cnt++;
10927 }
Hal_SC_add_reg_to_shm(void * pInstance,SCALER_WIN eWindow,MS_U32 u32_bk,MS_U16 u16_value,MS_U16 u16_mask)10928 void Hal_SC_add_reg_to_shm(void *pInstance,SCALER_WIN eWindow,MS_U32 u32_bk,MS_U16 u16_value,MS_U16 u16_mask)
10929 {
10930     MS_U32 u32offset = 0;
10931     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10932     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10933     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10934     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10935 
10936     u32offset = _XC_Device_Offset[psXCInstPri->u32DeviceID];
10937 
10938     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_cnt].bk = REG_SCALER_BASE + u32_bk + (u32offset << 8);
10939     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_cnt].value = u16_value;
10940     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_data[pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_cnt].mask = u16_mask;
10941     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].regs_cnt ++;
10942 }
10943 
Hal_SC_secure_lock(void * pInstance,SCALER_WIN eWindow,MS_U32 u32SecureDMA,MS_U32 u32OperationMode)10944 MS_BOOL Hal_SC_secure_lock(void *pInstance, SCALER_WIN eWindow, MS_U32 u32SecureDMA, MS_U32 u32OperationMode)
10945 {
10946 #ifdef MSOS_TYPE_OPTEE
10947     MS_PHY phy_dramAddr = 0;
10948     MS_U8 u8i = 0;
10949 #endif
10950     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
10951     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
10952     #ifndef MSOS_TYPE_OPTEE
10953     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
10954     #else
10955     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
10956     #endif
10957     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
10958     #ifdef MSOS_TYPE_OPTEE
10959 
10960     if (u32SecureDMA == 0)
10961     {
10962         MDrv_Seal_ChangeIPSecureDMAAbillity(MODULE_XC, 0 , FALSE);
10963     }
10964 
10965     for (u8i = 0; u8i < pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_cnt; u8i++)
10966     {
10967         phy_dramAddr = (MS_PHY) pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[u8i].address;
10968         if(pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[u8i].length != 0)
10969         {
10970             if (u8i >= OP_TEE_XC_DRAM_MAX_CNT)
10971             {
10972                 printf("dram cnt overflow\n");
10973                 break;
10974             }
10975             if (u32OperationMode == 1)
10976             {
10977                 if(MDrv_Seal_SetSecureRange(phy_dramAddr, pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[u8i].length , TRUE) == FALSE)
10978                 {
10979                     return FALSE;
10980                 }
10981             }
10982             else if (u32OperationMode == 0)
10983             {
10984                 if(MDrv_Seal_SetSecureRange(phy_dramAddr , pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[u8i].length , FALSE) == FALSE)
10985                 {
10986                     return FALSE;
10987                 }
10988             }
10989         }
10990     }
10991     if (u32SecureDMA == 1)
10992     {
10993         MDrv_Seal_ChangeIPSecureDMAAbillity(MODULE_XC, 0 , TRUE);
10994     }
10995     if (u32OperationMode == 1)
10996     {
10997         MDrv_Seal_SecureSlaveSet(E_SEAL_SC0_PROT_NONPM, TRUE);
10998         MDrv_Seal_BufferLock(E_SEAL_SC_WP_SCM_M, TRUE);
10999     }
11000     else if (u32OperationMode == 0)
11001     {
11002         MDrv_Seal_SecureSlaveSet(E_SEAL_SC0_PROT_NONPM, FALSE);
11003         MDrv_Seal_BufferLock(E_SEAL_SC_WP_SCM_M, FALSE);
11004     }
11005     pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].isEnable=u32OperationMode; //Update OPtee status for tee side
11006     #endif
11007     return TRUE;
11008 }
11009 
11010 
Hal_SC_secure_Check_RBase(void * pInstance)11011 MS_BOOL Hal_SC_secure_Check_RBase(void *pInstance)
11012 {
11013     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11014     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11015 
11016     XC_RESOURCE_PRIVATE_FOR_TEE* pXCResourcePrivate = NULL;
11017     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11018 
11019     MS_U32 u32HW_OPM_BaseAddr;
11020     u32HW_OPM_BaseAddr = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_10_L) & 0xFFFFFFFF) * BYTE_PER_WORD;
11021 
11022     MS_U32 u32HW_IPM_BaseAddr,u32HW_IMP_MaxLimitAddress,u32HW_OPM_MaxLimitAddress;
11023     MS_U32 u32Frame_H = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_16_L) & 0x00000FFF);
11024     MS_U32 u32Frame_L = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK20_15_L) & 0xFFFFFFFF);
11025     MS_U32 u32FBnum = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_19_L) & 0x00000003);
11026     u32HW_IPM_BaseAddr = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK12_08_L) & 0xFFFFFFFF) * BYTE_PER_WORD;
11027     u32HW_IMP_MaxLimitAddress = (SC_R4BYTE(psXCInstPri->u32DeviceID, REG_SC_BK0D_42_L) & 0xFFFFFFFF) * BYTE_PER_WORD;
11028     u32HW_OPM_MaxLimitAddress = u32HW_OPM_BaseAddr + u32Frame_H * u32Frame_L * 3 * (u32FBnum+1);
11029     MS_U32 u32IPMSize = u32HW_IMP_MaxLimitAddress - u32HW_IPM_BaseAddr;
11030     MS_U32 u32OPMSize = u32Frame_H * u32Frame_L * 3 * (u32FBnum+1);
11031 
11032     //Check OPM Addr is in legal range
11033     if ((u32HW_IPM_BaseAddr <= u32HW_OPM_BaseAddr && u32HW_OPM_BaseAddr <= u32HW_IMP_MaxLimitAddress) && u32HW_OPM_MaxLimitAddress <= u32HW_IMP_MaxLimitAddress && u32OPMSize<=u32IPMSize)
11034     {
11035         return TRUE;
11036     }
11037     else
11038     {
11039         return FALSE;
11040     }
11041 }
11042 
Hal_SC_update_to_shm(void * pInstance,SCALER_WIN eWindow)11043 void Hal_SC_update_to_shm(void *pInstance, SCALER_WIN eWindow)
11044 {
11045     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11046     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11047     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11048     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11049      MS_U8 u8MIUSel = E_CHIP_MIU_0;
11050      MS_PHY u32FBAddress=0;
11051     _phy_to_miu_offset(u8MIUSel, u32FBAddress, pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[0].address);
11052     if (eWindow == MAIN_WINDOW)
11053     {
11054         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK0D_38_L, (BIT(0) | BIT(4)), (BIT(0) | BIT(4)));
11055         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK12_08_L, ((u32FBAddress/BYTE_PER_WORD) & 0xFFFF), 0xFFFF);
11056         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK12_09_L, ((u32FBAddress/BYTE_PER_WORD) >> 16), 0xFFFF);
11057         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK12_1C_L, 0x0000, 0xFFFF);
11058     }
11059     else if (eWindow == SUB_WINDOW)
11060     {
11061         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK0D_38_L, (BIT(1) | BIT(6)), (BIT(1) | BIT(6)));
11062         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK12_48_L, ((pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[0].address/BYTE_PER_WORD) & 0xFFFF), 0xFFFF);
11063         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK12_49_L, ((pXCResourcePrivate->sthal_Optee.op_tee_xc[eWindow].drams_data[0].address/BYTE_PER_WORD) >> 16), 0xFFFF);
11064         Hal_SC_add_reg_to_shm(pInstance, eWindow, REG_SC_BK12_5C_L, 0x0000, 0xFFFF);
11065     }
11066 }
11067 
MHal_XC_Vtrack_SetPayloadData(void * pInstance,MS_U16 u16Timecode,MS_U8 u8OperatorID)11068 E_APIXC_ReturnValue MHal_XC_Vtrack_SetPayloadData(void *pInstance, MS_U16 u16Timecode, MS_U8 u8OperatorID)
11069 {
11070     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11071     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11072 
11073     /*
11074      * reg_payload_use from 0x08 to 0x0C (1B - 1F)
11075      * {14'h0, TimeCode[55:40], Unique ID (OTP)[39:8], Operator ID[7:0]}
11076      */
11077     if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
11078     {
11079         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_08_L, (MS_U16)u8OperatorID, 0x00ff);
11080         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_0A_L, (u16Timecode << 8) , 0xff00);
11081         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_0B_L, (u16Timecode >> 8) , 0x00ff);
11082 
11083         MDrv_XC_MLoad_Fire(pInstance, TRUE);
11084     }
11085     else
11086     {
11087         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_08_L, (MS_U16)u8OperatorID, 0x00ff);
11088         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_0A_L, (u16Timecode << 8) , 0xff00);
11089         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_0B_L, (u16Timecode >> 8) , 0x00ff);
11090     }
11091 
11092     return  E_APIXC_RET_OK;
11093 }
11094 
11095 #define  VTRACK_SETTING_LENGTH 23
11096 
11097 static MS_U8 u8VtrackSetting[VTRACK_SETTING_LENGTH]=
11098 {
11099     0x00, 0x00, 0x53, 0x8c, 0x31,
11100     0x86, 0x10, 0x42, 0x08, 0x21,
11101     0x84, 0x10, 0x42, 0x08, 0x21,
11102     0xc4, 0x18, 0x63, 0x8c, 0x41,
11103     0x08, 0x21, 0x04,
11104 };
11105 
MHal_XC_Vtrack_SetUserDefindedSetting(void * pInstance,MS_BOOL bUserDefinded,MS_U8 * pu8Setting)11106 E_APIXC_ReturnValue MHal_XC_Vtrack_SetUserDefindedSetting(void *pInstance, MS_BOOL bUserDefinded, MS_U8 *pu8Setting)
11107 {
11108     /*
11109      * Default Setting:
11110      * setting1 [0e]              => 8'h00
11111      * setting2 [0f]              => 8'h00
11112      * setting3 [1a:10]           => 165'h04 21 08 418c6318c4 21084210842108421086318c53
11113      */
11114     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11115     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11116 
11117     MS_U8 *pu8Data = NULL;
11118     MS_U16 u16Index = 0;
11119     MS_U16 u16Data = 0;
11120 
11121     if (bUserDefinded == TRUE)
11122     {
11123         pu8Data = pu8Setting;
11124     }
11125     else
11126     {
11127         pu8Data = &u8VtrackSetting[0];
11128     }
11129 
11130     //MenuLoad enable
11131     if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
11132     {
11133         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_0E_L, pu8Data[0], 0xff);
11134         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_0F_L, pu8Data[1], 0xff);
11135     }
11136     else
11137     {
11138         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_0E_L, pu8Data[0], 0xff);
11139         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_0F_L, pu8Data[1], 0xff);
11140     }
11141 
11142     for (u16Index = 2; u16Index < VTRACK_SETTING_LENGTH; u16Index = u16Index+2)
11143     {
11144         MS_U8 u8Offset = (( (u16Index - 2) / 2) *2 );
11145         MS_U32 u32Addr = REG_SC_BK2F_10_L + u8Offset;
11146 
11147         if ( (VTRACK_SETTING_LENGTH - u16Index) >= 2)
11148         {
11149             u16Data = (MS_U16)pu8Data[u16Index +1];
11150             u16Data = (u16Data << 8) + (MS_U16) pu8Data[u16Index];
11151 
11152             //MenuLoad enable
11153             if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
11154                 MDrv_XC_MLoad_WriteCmd(pInstance, u32Addr , u16Data, 0xffff); //write 16 bits
11155             else
11156                 SC_W2BYTE(psXCInstPri->u32DeviceID, u32Addr, u16Data);
11157         }
11158         else
11159         {
11160             u16Data = (MS_U16) pu8Data[u16Index];
11161 
11162             //MenuLoad enable
11163             if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
11164                 MDrv_XC_MLoad_WriteCmd(pInstance, u32Addr , u16Data, 0x00ff); //write low 8bits
11165             else
11166                 SC_W2BYTEMSK(psXCInstPri->u32DeviceID, u32Addr, u16Data, 0x00ff);
11167         }
11168     }
11169 
11170     if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
11171         MDrv_XC_MLoad_Fire(pInstance, TRUE);
11172 
11173     return  E_APIXC_RET_OK;
11174 }
11175 
MHal_XC_Vtrack_Enable(void * pInstance,MS_U8 u8FrameRate,MS_BOOL bEnable)11176 E_APIXC_ReturnValue MHal_XC_Vtrack_Enable(void *pInstance, MS_U8 u8FrameRate, MS_BOOL bEnable)
11177 {
11178     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11179     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11180 
11181     MS_U16 u16Setting = 0x00;
11182 
11183     if (bEnable == TRUE)
11184     {
11185         //Vtrack_h_pol_inv: [8] => 1
11186         //Vtrack_v_pol_inv: [9] => 1
11187         u16Setting |= (BIT(8)|BIT(9));
11188 
11189         //EnableIn: [5:4][0] => 1
11190         //DebugEn: [1]        => 0
11191         u16Setting |= (BIT(5)|BIT(4)|BIT(0));
11192     }
11193 
11194     if(MDrv_XC_MLoad_GetStatus(pInstance) == E_MLOAD_ENABLED)
11195     {
11196         //FrameRateIn     => 8'h1E
11197         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_02_L , u8FrameRate, 0xFF);
11198 
11199         MDrv_XC_MLoad_WriteCmd(pInstance, REG_SC_BK2F_01_L , u16Setting, (BIT(9)|BIT(8)|BIT(5)|BIT(4)|BIT(1)|BIT(0)));
11200 
11201         MDrv_XC_MLoad_Fire(pInstance, TRUE);
11202     }
11203     else
11204     {
11205         //FrameRateIn     => 8'h1E
11206         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_02_L , u8FrameRate, 0xFF);
11207 
11208         SC_W2BYTEMSK(psXCInstPri->u32DeviceID, REG_SC_BK2F_01_L , u16Setting, (BIT(9)|BIT(8)|BIT(5)|BIT(4)|BIT(1)|BIT(0)));
11209     }
11210 
11211     return  E_APIXC_RET_OK;
11212 }
11213 
11214 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
11215 //-------------------------------------------------------------------------------------------------
11216 /// Set Dual View
11217 //-------------------------------------------------------------------------------------------------
Hal_SC_3D_Set_DualView(void * pInstance,MS_BOOL bEnable)11218 void Hal_SC_3D_Set_DualView(void *pInstance, MS_BOOL bEnable)
11219 {
11220     // manhattan dual view
11221     // clone SC1 main to SC0 sub
11222     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11223     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11224     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11225     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11226 
11227     Hal_SC_set_dualview_clone(pInstance,bEnable);
11228 
11229     if (bEnable)
11230     {
11231         if (IS_OUTPUT_FRAME_ALTERNATIVE())
11232         {
11233             SC_W2BYTEMSK(0, REG_SC_BK20_24_L, BIT(2), BIT(2)); // reg_op1lr_sel
11234             SC_W2BYTEMSK(0, REG_SC_BK20_24_L, BIT(1), BIT(1)|BIT(0)); // reg_lr2mod_sel
11235         }
11236         else if (IS_OUTPUT_LINE_ALTERNATIVE())
11237         {
11238             SC_W2BYTEMSK(0, REG_SC_BK23_53_L, BIT(15), BIT(15));//dnr offset
11239             SC_W2BYTEMSK(1, REG_SC_BK20_1B_L, 0x0800,  0x0FFF); //FIXME: tmp solution from HW RD for fixing dual view sub window shaking problem
11240         }
11241 
11242         SC_W2BYTEMSK(0, REG_SC_BK68_40_L, 0, BIT(4)); // disable sc1 pip
11243         SC_W2BYTEMSK(0, REG_SC_BK20_10_L, 0, BIT(2));
11244         SC_W2BYTEMSK(1, REG_SC_BK20_10_L, BIT(10), BIT(10));
11245         if((SC_R2BYTEMSK(1, REG_SC_BK12_01_L, BIT(5)) == BIT(5)) ||(SC_R2BYTEMSK(1, REG_SC_BK12_01_L, BIT(4)) == BIT(4)))
11246         {
11247             SC_W2BYTEMSK(0, REG_SC_BK23_2C_L, 0, 0xFFFF);
11248         }
11249         else
11250         {
11251             SC_W2BYTEMSK(0, REG_SC_BK23_2C_L, BIT(6) |BIT(7), BIT(6) |BIT(7));
11252         }
11253 
11254 #if(HW_DESIGN_3D_VER == 3) //monet mode
11255         if (SC_R2BYTEMSK(0, REG_SC_BK20_03_L, BIT(2)) == BIT(2))
11256         {
11257             SC_W2BYTEMSK(0, REG_SC_BK20_03_L,0, BIT(2));//reg_force_fe2_en
11258         }
11259 #endif
11260     }
11261     else
11262     {
11263         SC_W2BYTEMSK(0, REG_SC_BK20_24_L, 0, BIT(2)); // reg_op1lr_sel
11264         SC_W2BYTEMSK(0, REG_SC_BK20_24_L, 0, BIT(1)|BIT(0)); // reg_lr2mod_sel
11265         SC_W2BYTEMSK(0, REG_SC_BK23_53_L, 0, 0x8000);//dnr offset
11266 
11267         SC_W2BYTEMSK(1, REG_SC_BK20_10_L, 0, BIT(10));
11268 
11269         if ((SC_R2BYTEMSK(1, REG_SC_BK20_10_L, BIT(0)) == BIT(0))
11270             && (SC_R2BYTEMSK(0, REG_SC_BK20_10_L, BIT(1)) == BIT(1)))
11271         {
11272             //restore sc1 pip setting
11273             SC_W2BYTEMSK(0, REG_SC_BK68_40_L, BIT(4), BIT(4));
11274         }
11275     }
11276 }
11277 
Hal_SC_3D_IsDualViewMode(void * pInstance,SCALER_WIN eWindow)11278 MS_BOOL Hal_SC_3D_IsDualViewMode(void* pInstance, SCALER_WIN eWindow) //elaine.chen
11279 {
11280     MS_BOOL ret = FALSE;
11281 
11282     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11283     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11284     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11285     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11286 #if PIP_PATCH_USING_SC1_MAIN_AS_SC0_SUB
11287     if(IS_INPUT_MODE_NONE(eWindow) &&
11288         (IS_OUTPUT_FRAME_ALTERNATIVE() || IS_OUTPUT_LINE_ALTERNATIVE() || IS_OUTPUT_TOP_BOTTOM() ))
11289     {
11290             ret = TRUE;
11291     }
11292 #endif
11293     return ret;
11294 }
11295 
11296 
11297 // clone SC1 main to SC0 sub
Hal_SC_set_dualview_clone(void * pInstance,MS_BOOL bEnable)11298 void Hal_SC_set_dualview_clone(void *pInstance, MS_BOOL bEnable)
11299 {
11300     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11301     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11302     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11303     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11304     SC_DBG(printf("\33[0;35m [Dual View] %s %d: ,bEnable = %u   \33[m \n", __FUNCTION__,  __LINE__,bEnable));
11305 
11306     if (bEnable)
11307     {
11308         MS_U16 u16value = 0;
11309         MS_U32 u32value = 0;
11310 
11311         // memfmt
11312         u16value = SC_R2BYTE(1, REG_SC_BK12_01_L);
11313         SC_W2BYTE(0, REG_SC_BK12_41_L, u16value);
11314 
11315         u16value = SC_R2BYTE(1, REG_SC_BK12_02_L);
11316         SC_W2BYTE(0, REG_SC_BK12_42_L, u16value);
11317 
11318         u16value = SC_R2BYTE(1, REG_SC_BK12_03_L);
11319         SC_W2BYTE(0, REG_SC_BK12_43_L, u16value);
11320 
11321         u16value = SC_R2BYTE(1, REG_SC_BK12_04_L);
11322         SC_W2BYTE(0, REG_SC_BK12_44_L, u16value);
11323 
11324         u16value = SC_R2BYTE(1, REG_SC_BK12_05_L);
11325         SC_W2BYTE(0, REG_SC_BK12_45_L, u16value);
11326 
11327         u16value = SC_R2BYTE(1, REG_SC_BK12_06_L);
11328         SC_W2BYTE(0, REG_SC_BK12_46_L, u16value);
11329 
11330         u16value = SC_R2BYTE(1, REG_SC_BK12_07_L);
11331         SC_W2BYTE(0, REG_SC_BK12_47_L, u16value);
11332 
11333         u32value = SC_R4BYTE(1, REG_SC_BK12_08_L); // ipm base
11334         SC_W4BYTE(0, REG_SC_BK12_48_L, u32value);
11335 
11336         u32value = SC_R4BYTE(1, REG_SC_BK12_10_L); // opm base
11337         SC_W4BYTE(0, REG_SC_BK12_50_L, u32value);
11338 
11339         u16value = SC_R2BYTE(1, REG_SC_BK12_0E_L); //ipm offset
11340         SC_W2BYTE(0, REG_SC_BK12_4E_L, u16value);
11341 
11342         u16value = SC_R2BYTE(1, REG_SC_BK12_0F_L); //ipm fetch
11343         SC_W2BYTE(0, REG_SC_BK12_4F_L, u16value);
11344 
11345         u16value = SC_R2BYTE(1, REG_SC_BK12_16_L); //opm offset
11346         SC_W2BYTE(0, REG_SC_BK12_56_L, u16value);
11347 
11348         u16value = SC_R2BYTE(1, REG_SC_BK12_17_L); //opm fetch
11349         SC_W2BYTE(0, REG_SC_BK12_57_L, u16value);
11350 
11351         u16value = SC_R2BYTE(1, REG_SC_BK12_18_L);
11352         SC_W2BYTE(0, REG_SC_BK12_58_L, u16value);
11353 
11354         u16value = SC_R2BYTEMSK(1, REG_SC_BK12_19_L, 0x1F); // frame count
11355         SC_W2BYTEMSK(0, REG_SC_BK12_59_L, u16value, 0x1F);
11356 
11357         u16value = SC_R2BYTEMSK(1, REG_SC_BK20_15_L, 0x0FFF); // v_length
11358         SC_W2BYTEMSK(0, REG_SC_BK20_16_L, u16value, 0x0FFF);
11359 
11360         u16value = SC_R2BYTEMSK(1, REG_SC_BK20_1D_L, 0xFF); // H_offset
11361         SC_W2BYTEMSK(0, REG_SC_BK20_1D_L, u16value<<8, 0xFF00);
11362 
11363         u32value = SC_R4BYTE(1, REG_SC_BK23_07_L); // post H scaling
11364         SC_W4BYTE(0, REG_SC_BK23_27_L, u32value);
11365 
11366         u32value = SC_R4BYTE(1, REG_SC_BK23_09_L); // post V scaling
11367         SC_W4BYTE(0, REG_SC_BK23_29_L, u32value);
11368 
11369         u16value = SC_R2BYTEMSK(0, REG_SC_BK01_61_L, 0x03);
11370         SC_W2BYTEMSK(1, REG_SC_BK01_61_L, u16value, 0x03); // copy main setting for HDMI Y422 color wrong when dual view on
11371 
11372         if (IS_OUTPUT_LINE_ALTERNATIVE())
11373         {   //Solution from HW RD cc.yang for fixing dual view sub window shaking problem
11374             u16value = SC_R2BYTEMSK(0, REG_SC_BK20_1A_L, 0x0FFF);//Get the delay line for Auto tune area
11375             SC_W2BYTEMSK(1, REG_SC_BK20_1A_L, u16value - 3, 0x0FFF);//(Value -3) is a empirical value given by cc.yang
11376             u16value = SC_R2BYTEMSK(0, REG_SC_BK20_1B_L, 0x0FFF);//Get the delay line for Display area
11377             SC_W2BYTEMSK(1, REG_SC_BK20_1B_L, u16value - 3,  0x0FFF);//(Value -3) is a empirical value given by cc.yang
11378         }
11379 
11380         if(SC_R2BYTEMSK(0, REG_SC_BK7F_11_L, BIT(1)) == BIT(1))//if miu arb or xc internel control miu
11381         {
11382             if(SC_R2BYTEMSK(1, REG_SC_BK12_05_L, BIT(4)) == BIT(4))//if sc1 opm seletect miu1
11383             {
11384                 SC_W2BYTEMSK(0, REG_SC_BK12_44_L, BIT(14), BIT(14));
11385             }
11386             else
11387             {
11388                 SC_W2BYTEMSK(0, REG_SC_BK12_44_L, 0, BIT(14));
11389             }
11390        }
11391     }
11392 }
11393 #endif
11394 
11395 //#define GET_FB_LEVEL_DBG(x) //x
MHal_XC_Get_FB_Level(void * pInstance,MS_WINDOW_TYPE * pstCropWin,MS_WINDOW_TYPE * pstDispWin,MS_BOOL bInterlace,MS_U16 * pu16HSize,MS_U16 * pu16VSize)11396 E_XC_FB_LEVEL MHal_XC_Get_FB_Level(void* pInstance, MS_WINDOW_TYPE* pstCropWin, MS_WINDOW_TYPE* pstDispWin, MS_BOOL bInterlace, MS_U16* pu16HSize, MS_U16* pu16VSize)
11397 {
11398     return E_XC_FB_LEVEL_NUM;//default return E_XC_FB_LEVEL_NUM
11399 }
11400 
Hal_SC_get_HDMIpolicy(void * pInstance)11401 MS_U32 Hal_SC_get_HDMIpolicy(void *pInstance)
11402 {
11403     UNUSED(pInstance);
11404     return 0;
11405 }
11406 
MHal_XC_GetDelayTime(void * pInstance,XC_DELAY_TIME_STATUS enStatus)11407 MS_U16 MHal_XC_GetDelayTime(void* pInstance,XC_DELAY_TIME_STATUS enStatus)
11408 {
11409     XC_INSTANCE_PRIVATE *psXCInstPri = NULL;
11410     UtopiaInstanceGetPrivate(pInstance, (void**)&psXCInstPri);
11411     XC_RESOURCE_PRIVATE* pXCResourcePrivate = NULL;
11412     UtopiaResourceGetPrivate(g_pXCResource[_XC_SELECT_INTERNAL_VARIABLE(psXCInstPri->u32DeviceID)],(void**)(&pXCResourcePrivate));
11413     MS_U16 u16DelayTimeMS = 0;
11414     switch(enStatus)
11415     {
11416         case E_DELAY_TIME_FRC:
11417             if(pXCResourcePrivate->stdrvXC_MVideo._SCShared.StatusInfo[psXCInstPri->u32DeviceID].u16InputVFreq > 0)
11418             {
11419                 u16DelayTimeMS = 5 * ((10000 + pXCResourcePrivate->stdrvXC_MVideo._SCShared.StatusInfo[psXCInstPri->u32DeviceID].u16InputVFreq/2))/pXCResourcePrivate->stdrvXC_MVideo._SCShared.StatusInfo[psXCInstPri->u32DeviceID].u16InputVFreq;
11420             }
11421             else
11422             {
11423                 u16DelayTimeMS = 0;
11424             }
11425         break;
11426         default:
11427         break;
11428     }
11429     return u16DelayTimeMS;
11430 }
11431 
11432 #undef  MHAL_SC_C
11433