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