ddp_ovl.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356
  1. /* Copyright Statement:
  2. *
  3. * This software/firmware and related documentation ("MediaTek Software") are
  4. * protected under relevant copyright laws. The information contained herein
  5. * is confidential and proprietary to MediaTek Inc. and/or its licensors.
  6. * Without the prior written permission of MediaTek inc. and/or its licensors,
  7. * any reproduction, modification, use or disclosure of MediaTek Software,
  8. * and information contained herein, in whole or in part, shall be strictly prohibited.
  9. */
  10. /* MediaTek Inc. (C) 2015. All rights reserved.
  11. *
  12. * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  13. * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  14. * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER ON
  15. * AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  16. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  18. * NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  19. * SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  20. * SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES TO LOOK ONLY TO SUCH
  21. * THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. RECEIVER EXPRESSLY ACKNOWLEDGES
  22. * THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES
  23. * CONTAINED IN MEDIATEK SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK
  24. * SOFTWARE RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
  25. * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND
  26. * CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  27. * AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  28. * OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY RECEIVER TO
  29. * MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
  30. */
  31. #define LOG_TAG "OVL"
  32. #include "platform/ddp_reg.h"
  33. #include "platform/ddp_matrix_para.h"
  34. #include "platform/ddp_info.h"
  35. #include "platform/ddp_log.h"
  36. #include "platform/ddp_ovl.h"
  37. #include "platform/disp_drv_platform.h"
  38. /*#define OVL_NUM (2)*/
  39. #define OVL_REG_BACK_MAX (40)
  40. #define OVL_LAYER_OFFSET (0x20)
  41. #define OVL_RDMA_DEBUG_OFFSET (0x4)
  42. enum OVL_COLOR_SPACE {
  43. OVL_COLOR_SPACE_RGB = 0,
  44. OVL_COLOR_SPACE_YUV,
  45. };
  46. enum OVL_INPUT_FORMAT {
  47. OVL_INPUT_FORMAT_BGR565 = 0,
  48. OVL_INPUT_FORMAT_RGB888 = 1,
  49. OVL_INPUT_FORMAT_RGBA8888 = 2,
  50. OVL_INPUT_FORMAT_ARGB8888 = 3,
  51. OVL_INPUT_FORMAT_VYUY = 4,
  52. OVL_INPUT_FORMAT_YVYU = 5,
  53. OVL_INPUT_FORMAT_RGB565 = 6,
  54. OVL_INPUT_FORMAT_BGR888 = 7,
  55. OVL_INPUT_FORMAT_BGRA8888 = 8,
  56. OVL_INPUT_FORMAT_ABGR8888 = 9,
  57. OVL_INPUT_FORMAT_UYVY = 10,
  58. OVL_INPUT_FORMAT_YUYV = 11,
  59. OVL_INPUT_FORMAT_RGBA4444 = 12,
  60. OVL_INPUT_FORMAT_BGRA4444 = 13,
  61. OVL_INPUT_FORMAT_UNKNOWN = 32,
  62. };
  63. typedef struct {
  64. unsigned int address;
  65. unsigned int value;
  66. } OVL_REG;
  67. static int reg_back_cnt[OVL_NUM];
  68. static OVL_REG reg_back[OVL_NUM][OVL_REG_BACK_MAX];
  69. static enum OVL_INPUT_FORMAT ovl_input_fmt_convert(DpColorFormat fmt);
  70. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat);
  71. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat);
  72. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat);
  73. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat);
  74. static void ovl_store_regs(int idx);
  75. static void ovl_restore_regs(int idx,void * handle);
  76. static DISP_MODULE_ENUM next_rsz_module = DISP_MODULE_UNKNOWN;
  77. static DISP_MODULE_ENUM prev_rsz_module = DISP_MODULE_UNKNOWN;
  78. static enum OVL_INPUT_FORMAT ovl_input_fmt_convert(DpColorFormat fmt)
  79. {
  80. enum OVL_INPUT_FORMAT ovl_fmt = OVL_INPUT_FORMAT_UNKNOWN;
  81. switch (fmt) {
  82. case eBGR565:
  83. ovl_fmt = OVL_INPUT_FORMAT_BGR565;
  84. break;
  85. case eRGB565:
  86. ovl_fmt = OVL_INPUT_FORMAT_RGB565;
  87. break;
  88. case eRGB888:
  89. ovl_fmt = OVL_INPUT_FORMAT_RGB888;
  90. break;
  91. case eBGR888:
  92. ovl_fmt = OVL_INPUT_FORMAT_BGR888;
  93. break;
  94. case eRGBA4444:
  95. ovl_fmt = OVL_INPUT_FORMAT_RGBA4444;
  96. break;
  97. case eBGRA4444:
  98. ovl_fmt = OVL_INPUT_FORMAT_BGRA4444;
  99. break;
  100. case eRGBA8888:
  101. ovl_fmt = OVL_INPUT_FORMAT_RGBA8888;
  102. break;
  103. case eBGRA8888:
  104. ovl_fmt = OVL_INPUT_FORMAT_BGRA8888;
  105. break;
  106. case eARGB8888:
  107. ovl_fmt = OVL_INPUT_FORMAT_ARGB8888;
  108. break;
  109. case eABGR8888:
  110. ovl_fmt = OVL_INPUT_FORMAT_ABGR8888;
  111. break;
  112. case eVYUY:
  113. ovl_fmt = OVL_INPUT_FORMAT_VYUY;
  114. break;
  115. case eYVYU:
  116. ovl_fmt = OVL_INPUT_FORMAT_YVYU;
  117. break;
  118. case eUYVY:
  119. ovl_fmt = OVL_INPUT_FORMAT_UYVY;
  120. break;
  121. case eYUY2:
  122. ovl_fmt = OVL_INPUT_FORMAT_YUYV;
  123. break;
  124. default:
  125. DDPERR("ovl_fmt_convert fmt=%d, ovl_fmt=%d\n", fmt, ovl_fmt);
  126. break;
  127. }
  128. return ovl_fmt;
  129. }
  130. unsigned long ovl_base_addr(DISP_MODULE_ENUM module)
  131. {
  132. switch (module) {
  133. case DISP_MODULE_OVL0:
  134. return DISPSYS_OVL0_BASE;
  135. case DISP_MODULE_OVL0_2L:
  136. return DISPSYS_OVL0_2L_BASE;
  137. case DISP_MODULE_OVL1_2L:
  138. return DISPSYS_OVL1_2L_BASE;
  139. default:
  140. return 0;
  141. }
  142. }
  143. unsigned long mmsys_ovl_ultra_offset(DISP_MODULE_ENUM module)
  144. {
  145. switch (module) {
  146. case DISP_MODULE_OVL0:
  147. return FLD_OVL0_ULTRA_SEL;
  148. case DISP_MODULE_OVL0_2L:
  149. return FLD_OVL0_2L_ULTRA_SEL;
  150. case DISP_MODULE_OVL1_2L:
  151. return FLD_OVL1_2L_ULTRA_SEL;
  152. default:
  153. return 0;
  154. }
  155. return 0;
  156. }
  157. static DpColorFormat ovl_input_fmt(enum OVL_INPUT_FORMAT fmt, int swap)
  158. {
  159. switch (fmt) {
  160. case OVL_INPUT_FORMAT_BGR565:
  161. return swap ? eBGR565 : eRGB565;
  162. case OVL_INPUT_FORMAT_RGB888:
  163. return swap ? eRGB888 : eBGR888;
  164. case OVL_INPUT_FORMAT_RGBA8888:
  165. return swap ? eRGBA8888 : eBGRA8888;
  166. case OVL_INPUT_FORMAT_ARGB8888:
  167. return swap ? eARGB8888 : eABGR8888;
  168. case OVL_INPUT_FORMAT_VYUY:
  169. return swap ? eVYUY : eUYVY;
  170. case OVL_INPUT_FORMAT_YVYU:
  171. return swap ? eYVYU : eYUY2;
  172. case OVL_INPUT_FORMAT_RGBA4444:
  173. return swap ? eRGBA4444 : eBGRA4444;
  174. default:
  175. DDPERR("ovl_input_fmt fmt=%d, swap=%d\n", fmt, swap);
  176. break;
  177. }
  178. return eRGB888;
  179. }
  180. static inline bool is_module_rsz(DISP_MODULE_ENUM module)
  181. {
  182. if (module == DISP_MODULE_RSZ0)
  183. return true;
  184. return false;
  185. }
  186. static char *ovl_intput_format_name(enum OVL_INPUT_FORMAT fmt, int swap)
  187. {
  188. switch (fmt) {
  189. case OVL_INPUT_FORMAT_BGR565:
  190. return swap ? "eBGR565" : "eRGB565";
  191. case OVL_INPUT_FORMAT_RGB565:
  192. return "eRGB565";
  193. case OVL_INPUT_FORMAT_RGB888:
  194. return swap ? "eRGB888" : "eBGR888";
  195. case OVL_INPUT_FORMAT_BGR888:
  196. return "eBGR888";
  197. case OVL_INPUT_FORMAT_RGBA8888:
  198. return swap ? "eRGBA8888" : "eBGRA8888";
  199. case OVL_INPUT_FORMAT_BGRA8888:
  200. return "eBGRA8888";
  201. case OVL_INPUT_FORMAT_ARGB8888:
  202. return swap ? "eARGB8888" : "eABGR8888";
  203. case OVL_INPUT_FORMAT_ABGR8888:
  204. return "eABGR8888";
  205. case OVL_INPUT_FORMAT_VYUY:
  206. return swap ? "eVYUY" : "eUYVY";
  207. case OVL_INPUT_FORMAT_UYVY:
  208. return "eUYVY";
  209. case OVL_INPUT_FORMAT_YVYU:
  210. return swap ? "eYVYU" : "eYUY2";
  211. case OVL_INPUT_FORMAT_YUYV:
  212. return "eYUY2";
  213. case OVL_INPUT_FORMAT_RGBA4444:
  214. return swap ? "eRGBA4444" : "eBGRA4444";
  215. default:
  216. DDPERR("ovl_intput_fmt unknow fmt=%d, swap=%d\n", fmt, swap);
  217. break;
  218. }
  219. return "unknow";
  220. }
  221. static unsigned int ovl_index(DISP_MODULE_ENUM module)
  222. {
  223. int idx = 0;
  224. switch (module) {
  225. case DISP_MODULE_OVL0:
  226. idx = 0;
  227. break;
  228. case DISP_MODULE_OVL0_2L:
  229. idx = 1;
  230. break;
  231. case DISP_MODULE_OVL1_2L:
  232. idx = 2;
  233. break;
  234. default:
  235. DDPERR("invalid module=%d \n", module);// invalid module
  236. ASSERT(0);
  237. }
  238. return idx;
  239. }
  240. int OVLStart(DISP_MODULE_ENUM module, void *handle)
  241. {
  242. int idx = ovl_index(module);
  243. /* bypass shadow */
  244. #ifdef LK_BYPASS_SHADOW_REG
  245. DISP_REG_SET_FIELD(handle, EN_FLD_BYPASS_SHADOW,
  246. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  247. DISP_REG_SET_FIELD(handle, EN_FLD_RD_WRK_REG,
  248. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  249. #endif
  250. DISP_REG_SET_FIELD(handle, EN_FLD_OVL_EN,
  251. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  252. DISP_REG_SET(handle, idx*DISP_INDEX_OFFSET + DISP_REG_OVL_INTEN,
  253. 0x1E | REG_FLD_VAL(INTEN_FLD_ABNORMAL_SOF, 1));
  254. DISP_REG_SET_FIELD(handle, FLD_RDMA_BURST_CON1_BURST16_EN,
  255. idx*DISP_INDEX_OFFSET +
  256. DISP_REG_OVL_RDMA_BURST_CON1, 1);
  257. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_LAYER_SMI_ID_EN,
  258. idx*DISP_INDEX_OFFSET +
  259. DISP_REG_OVL_DATAPATH_CON, 1);
  260. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_GCLAST_EN,
  261. idx*DISP_INDEX_OFFSET +
  262. DISP_REG_OVL_DATAPATH_CON, 1);
  263. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_OUTPUT_CLAMP,
  264. idx*DISP_INDEX_OFFSET +
  265. DISP_REG_OVL_DATAPATH_CON, 1);
  266. DISP_REG_SET_FIELD(handle, FLD_FBDC_8XE_MODE,
  267. idx*DISP_INDEX_OFFSET +
  268. DISP_REG_OVL_FBDC_CFG1, 1);
  269. return 0;
  270. }
  271. int OVLStop(DISP_MODULE_ENUM module, void *handle)
  272. {
  273. int idx = ovl_index(module);
  274. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  275. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_EN, 0x00);
  276. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTSTA, 0x00);
  277. return 0;
  278. }
  279. int OVLReset(DISP_MODULE_ENUM module, void *handle)
  280. {
  281. #define OVL_IDLE (0x3)
  282. unsigned int delay_cnt = 0;
  283. int idx = ovl_index(module);
  284. /*always use cpu do reset*/
  285. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x1); // soft reset
  286. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x0);
  287. while (!(DISP_REG_GET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_FLOW_CTRL_DBG) & OVL_IDLE)) {
  288. delay_cnt++;
  289. udelay(10);
  290. if (delay_cnt>2000) {
  291. DDPERR("OVL%dReset() timeout! \n",idx);
  292. break;
  293. }
  294. }
  295. return 0;
  296. }
  297. int OVLROI(DISP_MODULE_ENUM module,
  298. unsigned int bgW,
  299. unsigned int bgH,
  300. unsigned int bgColor,
  301. void * handle)
  302. {
  303. int idx = ovl_index(module);
  304. if ((bgW > OVL_MAX_WIDTH) || (bgH > OVL_MAX_HEIGHT)) {
  305. DDPERR("OVLROI(), exceed OVL max size, w=%d, h=%d \n", bgW, bgH);
  306. ASSERT(0);
  307. }
  308. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_SIZE, bgH<<16 | bgW);
  309. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_BGCLR, bgColor);
  310. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_LC_SRC_SIZE, bgH << 16 | bgW);
  311. return 0;
  312. }
  313. int OVLLayerSwitch(DISP_MODULE_ENUM module,
  314. unsigned layer,
  315. unsigned int en,
  316. void * handle)
  317. {
  318. int idx = ovl_index(module);
  319. ASSERT(layer<=3);
  320. switch (layer) {
  321. case 0:
  322. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L0_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  323. break;
  324. case 1:
  325. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L1_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  326. break;
  327. case 2:
  328. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L2_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  329. break;
  330. case 3:
  331. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L3_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  332. break;
  333. default:
  334. DDPERR("invalid layer=%d\n", layer); // invalid layer
  335. ASSERT(0);
  336. }
  337. return 0;
  338. }
  339. int OVL3DConfig(DISP_MODULE_ENUM module,
  340. unsigned int layer_id,
  341. unsigned int en_3d,
  342. unsigned int landscape,
  343. unsigned int r_first,
  344. void *handle)
  345. {
  346. return 0;
  347. }
  348. void OVLLayerConfig(DISP_MODULE_ENUM module,
  349. unsigned int layer,
  350. unsigned int source,
  351. DpColorFormat format,
  352. unsigned int addr,
  353. unsigned int src_x, // ROI x offset
  354. unsigned int src_y, // ROI y offset
  355. unsigned int src_pitch,
  356. unsigned int dst_x, // ROI x offset
  357. unsigned int dst_y, // ROI y offset
  358. unsigned int dst_w, // ROT width
  359. unsigned int dst_h, // ROI height
  360. unsigned int keyEn,
  361. unsigned int key, // color key
  362. unsigned int aen, // alpha enable
  363. unsigned char alpha,
  364. void * handle)
  365. {
  366. int idx = ovl_index(module);
  367. unsigned int value = 0;
  368. enum OVL_INPUT_FORMAT fmt = ovl_input_fmt_convert(format);
  369. unsigned int bpp = ovl_input_fmt_bpp(fmt);
  370. unsigned int input_swap = ovl_input_fmt_byte_swap(fmt);
  371. unsigned int input_fmt = ovl_input_fmt_reg_value(fmt);
  372. enum OVL_COLOR_SPACE space = ovl_input_fmt_color_space(fmt);
  373. unsigned int offset = 0;
  374. /*0100 MTX_JPEG_TO_RGB (YUV FUll TO RGB)*/
  375. int color_matrix = 0x4;
  376. unsigned int idx_offset = idx*DISP_INDEX_OFFSET;
  377. unsigned int layer_offset = idx_offset + layer * 0x20;
  378. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  379. unsigned int bg_h, bg_w;
  380. #endif
  381. ASSERT((dst_w <= OVL_MAX_WIDTH) &&
  382. (dst_h <= OVL_MAX_HEIGHT) &&
  383. (layer <= 3));
  384. if (addr == 0) {
  385. DDPERR("source from memory, but addr is 0!\n");
  386. ASSERT(0);
  387. }
  388. DDPDBG("ovl%d, layer=%d, source=%s, off(x=%d, y=%d), dst(%d, %d, %d, %d),pitch=%d,"
  389. "fmt=%s, addr=%x, keyEn=%d, key=%d, aen=%d, alpha=%d \n",
  390. idx,
  391. layer,
  392. (source==0)?"memory":"constant_color",
  393. src_x,
  394. src_y,
  395. dst_x,
  396. dst_y,
  397. dst_w,
  398. dst_h,
  399. src_pitch,
  400. ovl_intput_format_name(fmt, input_swap),
  401. addr,
  402. keyEn,
  403. key,
  404. aen,
  405. alpha);
  406. if (source==OVL_LAYER_SOURCE_RESERVED) { //==1, means constant color
  407. if (aen==0) {
  408. DDPERR("dim layer ahpha enable should be 1!\n");
  409. }
  410. if (fmt!=OVL_INPUT_FORMAT_RGB565) {
  411. DDPERR("dim layer format should be RGB565");
  412. fmt = OVL_INPUT_FORMAT_RGB565;
  413. }
  414. }
  415. DISP_REG_SET(handle, DISP_REG_OVL_RDMA0_CTRL+layer_offset, 0x1);
  416. value = (REG_FLD_VAL((L_CON_FLD_LSRC), (source)) |
  417. REG_FLD_VAL((L_CON_FLD_CFMT), (input_fmt)) |
  418. REG_FLD_VAL((L_CON_FLD_AEN), (aen)) |
  419. REG_FLD_VAL((L_CON_FLD_APHA), (alpha)) |
  420. REG_FLD_VAL((L_CON_FLD_SKEN), (keyEn)) |
  421. REG_FLD_VAL((L_CON_FLD_BTSW), (input_swap)));
  422. if (fmt == OVL_INPUT_FORMAT_RGBA4444)
  423. value |= REG_FLD_VAL((L_CON_FLD_CLRFMT_MAN), (1));
  424. if (space == OVL_COLOR_SPACE_YUV)
  425. value = value | REG_FLD_VAL((L_CON_FLD_MTX), (color_matrix));
  426. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  427. value |= (REG_FLD_VAL((L_CON_FLD_VIRTICAL_FLIP), 1) |
  428. REG_FLD_VAL((L_CON_FLD_HORI_FLIP), 1));
  429. #endif
  430. DISP_REG_SET(handle, DISP_REG_OVL_L0_CON+layer_offset, value);
  431. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  432. bg_h = DISP_REG_GET(idx_offset + DISP_REG_OVL_ROI_SIZE);
  433. bg_w = bg_h & 0xFFFF;
  434. bg_h = bg_h >> 16;
  435. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  436. (bg_h-dst_h-dst_y)<<16 | (bg_w-dst_w-dst_x));
  437. offset = (src_x+dst_w+1)*bpp + (src_y+dst_h-1)*src_pitch - 1;
  438. #else
  439. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  440. dst_y<<16 | dst_x);
  441. offset = src_x*bpp+src_y*src_pitch;
  442. #endif
  443. DISP_REG_SET(handle, DISP_REG_OVL_L0_ADDR+layer_offset,
  444. addr+offset);
  445. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRC_SIZE+layer_offset,
  446. dst_h<<16 | dst_w);
  447. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRCKEY+layer_offset,
  448. key);
  449. value = (REG_FLD_VAL((L_PITCH_FLD_SUR_ALFA), (value)) |
  450. REG_FLD_VAL((L_PITCH_FLD_LSP), (src_pitch)));
  451. if (fmt == OVL_INPUT_FORMAT_RGBA4444) {
  452. value |= REG_FLD_VAL(L_PITCH_FLD_SRGB_SEL, (1)) |
  453. REG_FLD_VAL(L_PITCH_FLD_DRGB_SEL, (2)) |
  454. REG_FLD_VAL(L_PITCH_FLD_SURFL_EN, (1)) |
  455. REG_FLD_VAL((L_PITCH_FLD_SUR_ALFA), (value)) |
  456. REG_FLD_VAL((L_PITCH_FLD_LSP), (src_pitch));
  457. }
  458. DISP_REG_SET(handle, DISP_REG_OVL_L0_PITCH+layer_offset, value);
  459. }
  460. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat)
  461. {
  462. int input_swap = 0;
  463. switch (inputFormat) {
  464. case OVL_INPUT_FORMAT_BGR565:
  465. case OVL_INPUT_FORMAT_RGB888:
  466. case OVL_INPUT_FORMAT_RGBA8888:
  467. case OVL_INPUT_FORMAT_ARGB8888:
  468. case OVL_INPUT_FORMAT_BGRA4444:
  469. case OVL_INPUT_FORMAT_VYUY:
  470. case OVL_INPUT_FORMAT_YVYU:
  471. input_swap = 1;
  472. break;
  473. case OVL_INPUT_FORMAT_RGB565:
  474. case OVL_INPUT_FORMAT_BGR888:
  475. case OVL_INPUT_FORMAT_BGRA8888:
  476. case OVL_INPUT_FORMAT_ABGR8888:
  477. case OVL_INPUT_FORMAT_RGBA4444:
  478. case OVL_INPUT_FORMAT_UYVY:
  479. case OVL_INPUT_FORMAT_YUYV:
  480. input_swap = 0;
  481. break;
  482. default:
  483. DDPERR("unknow input ovl format is %d\n", inputFormat);
  484. ASSERT(0);
  485. }
  486. return input_swap;
  487. }
  488. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat)
  489. {
  490. int bpp = 0;
  491. switch (inputFormat) {
  492. case OVL_INPUT_FORMAT_BGR565:
  493. case OVL_INPUT_FORMAT_RGB565:
  494. case OVL_INPUT_FORMAT_VYUY:
  495. case OVL_INPUT_FORMAT_UYVY:
  496. case OVL_INPUT_FORMAT_YVYU:
  497. case OVL_INPUT_FORMAT_YUYV:
  498. case OVL_INPUT_FORMAT_RGBA4444:
  499. case OVL_INPUT_FORMAT_BGRA4444:
  500. bpp = 2;
  501. break;
  502. case OVL_INPUT_FORMAT_RGB888:
  503. case OVL_INPUT_FORMAT_BGR888:
  504. bpp = 3;
  505. break;
  506. case OVL_INPUT_FORMAT_RGBA8888:
  507. case OVL_INPUT_FORMAT_BGRA8888:
  508. case OVL_INPUT_FORMAT_ARGB8888:
  509. case OVL_INPUT_FORMAT_ABGR8888:
  510. bpp = 4;
  511. break;
  512. default:
  513. DDPERR("unknown ovl input format = %d\n", inputFormat);
  514. ASSERT(0);
  515. }
  516. return bpp;
  517. }
  518. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat)
  519. {
  520. enum OVL_COLOR_SPACE space = OVL_COLOR_SPACE_RGB;
  521. switch (inputFormat) {
  522. case OVL_INPUT_FORMAT_BGR565:
  523. case OVL_INPUT_FORMAT_RGB565:
  524. case OVL_INPUT_FORMAT_RGB888:
  525. case OVL_INPUT_FORMAT_BGR888:
  526. case OVL_INPUT_FORMAT_BGRA4444:
  527. case OVL_INPUT_FORMAT_RGBA4444:
  528. case OVL_INPUT_FORMAT_RGBA8888:
  529. case OVL_INPUT_FORMAT_BGRA8888:
  530. case OVL_INPUT_FORMAT_ARGB8888:
  531. case OVL_INPUT_FORMAT_ABGR8888:
  532. space = OVL_COLOR_SPACE_RGB;
  533. break;
  534. case OVL_INPUT_FORMAT_VYUY:
  535. case OVL_INPUT_FORMAT_UYVY:
  536. case OVL_INPUT_FORMAT_YVYU:
  537. case OVL_INPUT_FORMAT_YUYV:
  538. space = OVL_COLOR_SPACE_YUV;
  539. break;
  540. default:
  541. DDPERR("unknown ovl input format = %d\n", inputFormat);
  542. ASSERT(0);
  543. }
  544. return space;
  545. }
  546. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat)
  547. {
  548. int reg_value = 0;
  549. switch (inputFormat) {
  550. case OVL_INPUT_FORMAT_BGR565:
  551. case OVL_INPUT_FORMAT_RGB565:
  552. reg_value = 0x0;
  553. break;
  554. case OVL_INPUT_FORMAT_RGB888:
  555. case OVL_INPUT_FORMAT_BGR888:
  556. reg_value = 0x1;
  557. break;
  558. case OVL_INPUT_FORMAT_RGBA8888:
  559. case OVL_INPUT_FORMAT_BGRA8888:
  560. reg_value = 0x2;
  561. break;
  562. case OVL_INPUT_FORMAT_ARGB8888:
  563. case OVL_INPUT_FORMAT_ABGR8888:
  564. reg_value = 0x3;
  565. break;
  566. case OVL_INPUT_FORMAT_VYUY:
  567. case OVL_INPUT_FORMAT_UYVY:
  568. case OVL_INPUT_FORMAT_RGBA4444:
  569. case OVL_INPUT_FORMAT_BGRA4444:
  570. reg_value = 0x4;
  571. break;
  572. case OVL_INPUT_FORMAT_YVYU:
  573. case OVL_INPUT_FORMAT_YUYV:
  574. reg_value = 0x5;
  575. break;
  576. default:
  577. DDPERR("unknow ovl input format is %d\n", inputFormat);
  578. ASSERT(0);
  579. }
  580. return reg_value;
  581. }
  582. void OVLRegStore(DISP_MODULE_ENUM module)
  583. {
  584. int i =0;
  585. int idx = ovl_index(module);
  586. static const unsigned int regs[] = {
  587. //start
  588. DISP_REG_OVL_INTEN , DISP_REG_OVL_EN ,DISP_REG_OVL_DATAPATH_CON,
  589. // roi
  590. DISP_REG_OVL_ROI_SIZE , DISP_REG_OVL_ROI_BGCLR ,
  591. //layers enable
  592. DISP_REG_OVL_SRC_CON,
  593. //layer0
  594. DISP_REG_OVL_RDMA0_CTRL , DISP_REG_OVL_L0_CON ,DISP_REG_OVL_L0_SRC_SIZE,
  595. DISP_REG_OVL_L0_OFFSET , DISP_REG_OVL_L0_ADDR ,DISP_REG_OVL_L0_PITCH,
  596. DISP_REG_OVL_L0_SRCKEY ,
  597. //layer1
  598. DISP_REG_OVL_RDMA1_CTRL , DISP_REG_OVL_L1_CON ,DISP_REG_OVL_L1_SRC_SIZE,
  599. DISP_REG_OVL_L1_OFFSET , DISP_REG_OVL_L1_ADDR ,DISP_REG_OVL_L1_PITCH,
  600. DISP_REG_OVL_L1_SRCKEY ,
  601. //layer2
  602. DISP_REG_OVL_RDMA2_CTRL , DISP_REG_OVL_L2_CON ,DISP_REG_OVL_L2_SRC_SIZE,
  603. DISP_REG_OVL_L2_OFFSET , DISP_REG_OVL_L2_ADDR ,DISP_REG_OVL_L2_PITCH,
  604. DISP_REG_OVL_L2_SRCKEY ,
  605. //layer3
  606. DISP_REG_OVL_RDMA3_CTRL , DISP_REG_OVL_L3_CON ,DISP_REG_OVL_L3_SRC_SIZE,
  607. DISP_REG_OVL_L3_OFFSET , DISP_REG_OVL_L3_ADDR ,DISP_REG_OVL_L3_PITCH,
  608. DISP_REG_OVL_L3_SRCKEY ,
  609. };
  610. reg_back_cnt[idx] = sizeof(regs)/sizeof(unsigned int);
  611. ASSERT(reg_back_cnt[idx] <= OVL_REG_BACK_MAX);
  612. for (i =0; i< reg_back_cnt[idx]; i++) {
  613. reg_back[idx][i].address = regs[i];
  614. reg_back[idx][i].value = DISP_REG_GET(regs[i]);
  615. }
  616. DDPDBG("store %d cnt registers on ovl %d",reg_back_cnt[idx],idx);
  617. }
  618. void OVLRegRestore(DISP_MODULE_ENUM module,void * handle)
  619. {
  620. int idx = ovl_index(module);
  621. int i = reg_back_cnt[idx];
  622. while (i > 0) {
  623. i--;
  624. DISP_REG_SET(handle,reg_back[idx][i].address, reg_back[idx][i].value);
  625. }
  626. DDPDBG("restore %d cnt registers on ovl %d",reg_back_cnt[idx],idx);
  627. reg_back_cnt[idx] = 0;
  628. }
  629. int OVLClockOn(DISP_MODULE_ENUM module,void * handle)
  630. {
  631. int idx = ovl_index(module);
  632. ddp_enable_module_clock(module);
  633. DDPMSG("OVL%dClockOn CG 0x%x \n",idx, DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  634. return 0;
  635. }
  636. int OVLClockOff(DISP_MODULE_ENUM module,void * handle)
  637. {
  638. int idx = ovl_index(module);
  639. DDPMSG("OVL%dClockOff\n",idx);
  640. //store registers
  641. // OVLRegRestore(module,handle);
  642. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x00);
  643. OVLReset(module,handle);
  644. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  645. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_INTSTA, 0x00);
  646. ddp_disable_module_clock(module);
  647. return 0;
  648. }
  649. int OVLInit(DISP_MODULE_ENUM module,void * handle)
  650. {
  651. //power on, no need to care clock
  652. ddp_enable_module_clock(module);
  653. return 0;
  654. }
  655. int OVLDeInit(DISP_MODULE_ENUM module,void * handle)
  656. {
  657. int idx = ovl_index(module);
  658. DDPMSG("OVL%dDeInit close CG \n",idx);
  659. ddp_disable_module_clock(module);
  660. return 0;
  661. }
  662. static inline int is_module_ovl(DISP_MODULE_ENUM module)
  663. {
  664. if (module == DISP_MODULE_OVL0 ||
  665. module == DISP_MODULE_OVL1 ||
  666. module == DISP_MODULE_OVL0_2L ||
  667. module == DISP_MODULE_OVL1_2L)
  668. return 1;
  669. else
  670. return 0;
  671. }
  672. static int _ovl_UFOd_in(DISP_MODULE_ENUM module, int connect, void *handle)
  673. {
  674. int idx = ovl_index(module);
  675. if (!connect) {
  676. DISP_REG_SET_FIELD(handle, SRC_CON_FLD_LC_EN,
  677. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_SRC_CON, 0);
  678. DISP_REG_SET_FIELD(handle, L_CON_FLD_LSRC,
  679. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_LC_CON, 0);
  680. return 0;
  681. }
  682. DISP_REG_SET_FIELD(handle, L_CON_FLD_LSRC,
  683. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_LC_CON, 2);
  684. DISP_REG_SET_FIELD(handle, LC_SRC_SEL_FLD_L_SEL,
  685. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_LC_SRC_SEL, 0);
  686. DISP_REG_SET_FIELD(handle, L_CON_FLD_AEN,
  687. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_LC_CON, 0);
  688. DISP_REG_SET_FIELD(handle, SRC_CON_FLD_LC_EN,
  689. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_SRC_CON, 1);
  690. return 0;
  691. }
  692. int OVLConnect(DISP_MODULE_ENUM module, DISP_MODULE_ENUM prev,
  693. DISP_MODULE_ENUM next, int connect, void *handle)
  694. {
  695. int idx = ovl_index(module);
  696. if (connect && is_module_ovl(prev))
  697. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_BGCLR_IN_SEL,
  698. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 1);
  699. else
  700. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_BGCLR_IN_SEL,
  701. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 0);
  702. if (connect && is_module_rsz(prev)) {
  703. _ovl_UFOd_in(module, 1, handle);
  704. next_rsz_module = module;
  705. } else {
  706. _ovl_UFOd_in(module, 0, handle);
  707. }
  708. if (connect && is_module_rsz(next))
  709. prev_rsz_module = module;
  710. return 0;
  711. }
  712. void ovl_dump_golden_setting(DISP_MODULE_ENUM module)
  713. {
  714. unsigned long base = ovl_base_addr(module);
  715. base -= DISPSYS_OVL0_BASE;
  716. DDPDUMP("-- %s Golden Setting --\n", ddp_get_module_name(module));
  717. DDPDUMP("RDMA0_MEM_GMC_SETTING1\n");
  718. DDPDUMP("[9:0]:%x [25:16]:%x [28]:%x [31]:%x\n",
  719. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC_ULTRA_THRESHOLD,
  720. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  721. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC_PRE_ULTRA_THRESHOLD,
  722. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  723. DISP_REG_GET_FIELD(
  724. FLD_OVL_RDMA_MEM_GMC_ULTRA_THRESHOLD_HIGH_OFS,
  725. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  726. DISP_REG_GET_FIELD(
  727. FLD_OVL_RDMA_MEM_GMC_PRE_ULTRA_THRESHOLD_HIGH_OFS,
  728. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING));
  729. DDPDUMP("RDMA0_FIFO_CTRL\n");
  730. DDPDUMP("[9:0]:%u [25:16]:%u\n",
  731. DISP_REG_GET_FIELD(FLD_OVL_RDMA_FIFO_THRD,
  732. base + DISP_REG_OVL_RDMA0_FIFO_CTRL),
  733. DISP_REG_GET_FIELD(FLD_OVL_RDMA_FIFO_SIZE,
  734. base + DISP_REG_OVL_RDMA0_FIFO_CTRL));
  735. DDPDUMP("RDMA0_MEM_GMC_SETTING2\n");
  736. DDPDUMP("[11:0]:%u [27:16]:%u [28]:%u [29]:%u [30]:%u\n",
  737. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_ISSUE_REQ_THRES,
  738. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  739. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_ISSUE_REQ_THRES_URG,
  740. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  741. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_REQ_THRES_PREULTRA,
  742. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  743. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_REQ_THRES_ULTRA,
  744. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  745. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_FORCE_REQ_THRES,
  746. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2));
  747. DDPDUMP("OVL_RDMA_BURST_CON1\n");
  748. DDPDUMP("[28]:%u\n",
  749. DISP_REG_GET_FIELD(FLD_RDMA_BURST_CON1_BURST16_EN,
  750. base + DISP_REG_OVL_RDMA_BURST_CON1));
  751. DDPDUMP("RDMA_GREQ_NUM\n");
  752. DDPDUMP("[3:0]%u [7:4]%u [11:8]%u [15:12]%u [23:16]%x [26:24]%u\n",
  753. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER0_GREQ_NUM,
  754. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  755. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER1_GREQ_NUM,
  756. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  757. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER2_GREQ_NUM,
  758. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  759. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER3_GREQ_NUM,
  760. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  761. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_OSTD_GREQ_NUM,
  762. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  763. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_GREQ_DIS_CNT,
  764. base + DISP_REG_OVL_RDMA_GREQ_NUM));
  765. DDPDUMP("[27]%u [28]%u [29]%u [30]%u [31]%u\n",
  766. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_STOP_EN,
  767. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  768. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_GRP_END_STOP,
  769. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  770. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_GRP_BRK_STOP,
  771. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  772. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_IOBUF_FLUSH_PREULTRA,
  773. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  774. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_IOBUF_FLUSH_ULTRA,
  775. base + DISP_REG_OVL_RDMA_GREQ_NUM));
  776. DDPDUMP("RDMA_GREQ_URG_NUM\n");
  777. DDPDUMP("[3:0]:%u [7:4]:%u [11:8]:%u [15:12]:%u [25:16]:%u [28]:%u\n",
  778. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER0_GREQ_URG_NUM,
  779. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  780. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER1_GREQ_URG_NUM,
  781. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  782. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER2_GREQ_URG_NUM,
  783. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  784. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER3_GREQ_URG_NUM,
  785. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  786. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_ARG_GREQ_URG_TH,
  787. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  788. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_ARG_URG_BIAS,
  789. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM));
  790. DDPDUMP("RDMA_ULTRA_SRC\n");
  791. DDPDUMP("[1:0]%u [3:2]%u [5:4]%u [7:6]%u [9:8]%u\n",
  792. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_BUF_SRC,
  793. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  794. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_SMI_SRC,
  795. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  796. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_ROI_END_SRC,
  797. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  798. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_RDMA_SRC,
  799. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  800. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_BUF_SRC,
  801. base + DISP_REG_OVL_RDMA_ULTRA_SRC));
  802. DDPDUMP("[11:10]%u [13:12]%u [15:14]%u\n",
  803. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_SMI_SRC,
  804. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  805. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_ROI_END_SRC,
  806. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  807. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_RDMA_SRC,
  808. base + DISP_REG_OVL_RDMA_ULTRA_SRC));
  809. DDPDUMP("RDMA0_BUF_LOW\n");
  810. DDPDUMP("[11:0]:%x [23:12]:%x\n",
  811. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_LOW_ULTRA_TH,
  812. base + DISP_REG_OVL_RDMAn_BUF_LOW(0)),
  813. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_LOW_PREULTRA_TH,
  814. base + DISP_REG_OVL_RDMAn_BUF_LOW(0)));
  815. DDPDUMP("RDMA0_BUF_HIGH\n");
  816. DDPDUMP("[23:12]:%x [31]:%x\n",
  817. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_HIGH_PREULTRA_TH,
  818. base + DISP_REG_OVL_RDMAn_BUF_HIGH(0)),
  819. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_HIGH_PREULTRA_DIS,
  820. base + DISP_REG_OVL_RDMAn_BUF_HIGH(0)));
  821. DDPDUMP("OVL_EN\n");
  822. DDPDUMP("[18]:%x [19]:%x\n",
  823. DISP_REG_GET_FIELD(EN_FLD_BLOCK_EXT_ULTRA,
  824. base + DISP_REG_OVL_EN),
  825. DISP_REG_GET_FIELD(EN_FLD_BLOCK_EXT_PREULTRA,
  826. base + DISP_REG_OVL_EN));
  827. DDPDUMP("DATAPATH_CON\n");
  828. DDPDUMP("[0]:%u, [3]:%u [24]:%u [25]:%u [26]:%u\n",
  829. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_LAYER_SMI_ID_EN,
  830. base + DISP_REG_OVL_DATAPATH_CON),
  831. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_OUTPUT_NO_RND,
  832. base + DISP_REG_OVL_DATAPATH_CON),
  833. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_GCLAST_EN,
  834. base + DISP_REG_OVL_DATAPATH_CON),
  835. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_HDR_GCLAST_EN,
  836. base + DISP_REG_OVL_DATAPATH_CON),
  837. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_OUTPUT_CLAMP,
  838. base + DISP_REG_OVL_DATAPATH_CON));
  839. DDPDUMP("OVL_FBDC_CFG1\n");
  840. DDPDUMP("[24]:%u\n", DISP_REG_GET_FIELD(FLD_FBDC_8XE_MODE,
  841. base + DISP_REG_OVL_FBDC_CFG1));
  842. }
  843. void OVLDump(DISP_MODULE_ENUM module)
  844. {
  845. ovl_dump_golden_setting(module);
  846. }
  847. static void ovl_printf_status(unsigned int status)
  848. {
  849. DDPDUMP("=OVL_FLOW_CONTROL_DEBUG=:\n");
  850. DDPDUMP("addcon_idle:%d,blend_idle:%d,out_valid:%d,out_ready:%d,out_idle:%d\n",
  851. (status >> 10) & (0x1),
  852. (status >> 11) & (0x1),
  853. (status >> 12) & (0x1), (status >> 13) & (0x1), (status >> 15) & (0x1)
  854. );
  855. DDPDUMP("rdma3_idle:%d,rdma2_idle:%d,rdma1_idle:%d, rdma0_idle:%d,rst:%d\n",
  856. (status >> 16) & (0x1),
  857. (status >> 17) & (0x1),
  858. (status >> 18) & (0x1), (status >> 19) & (0x1), (status >> 20) & (0x1)
  859. );
  860. DDPDUMP("trig:%d,frame_hwrst_done:%d,frame_swrst_done:%d,frame_underrun:%d,frame_done:%d\n",
  861. (status >> 21) & (0x1),
  862. (status >> 23) & (0x1),
  863. (status >> 24) & (0x1), (status >> 25) & (0x1), (status >> 26) & (0x1)
  864. );
  865. DDPDUMP("ovl_running:%d,ovl_start:%d,ovl_clr:%d,reg_update:%d,ovl_upd_reg:%d\n",
  866. (status >> 27) & (0x1),
  867. (status >> 28) & (0x1),
  868. (status >> 29) & (0x1), (status >> 30) & (0x1), (status >> 31) & (0x1)
  869. );
  870. DDPDUMP("ovl_fms_state:\n");
  871. switch (status & 0x3ff) {
  872. case 0x1:
  873. DDPDUMP("idle\n");
  874. break;
  875. case 0x2:
  876. DDPDUMP("wait_SOF\n");
  877. break;
  878. case 0x4:
  879. DDPDUMP("prepare\n");
  880. break;
  881. case 0x8:
  882. DDPDUMP("reg_update\n");
  883. break;
  884. case 0x10:
  885. DDPDUMP("eng_clr(internal reset)\n");
  886. break;
  887. case 0x20:
  888. DDPDUMP("eng_act(processing)\n");
  889. break;
  890. case 0x40:
  891. DDPDUMP("h_wait_w_rst\n");
  892. break;
  893. case 0x80:
  894. DDPDUMP("s_wait_w_rst\n");
  895. break;
  896. case 0x100:
  897. DDPDUMP("h_w_rst\n");
  898. break;
  899. case 0x200:
  900. DDPDUMP("s_w_rst\n");
  901. break;
  902. default:
  903. DDPDUMP("ovl_fsm_unknown\n");
  904. break;
  905. }
  906. }
  907. static void ovl_print_ovl_rdma_status(unsigned int status)
  908. {
  909. DDPDUMP("wram_rst_cs:0x%x,layer_greq:0x%x,out_data:0x%x,",
  910. status & 0x7, (status >> 3) & 0x1, (status >> 4) & 0xffffff);
  911. DDPDUMP("out_ready:0x%x,out_valid:0x%x,smi_busy:0x%x,smi_greq:0x%x\n",
  912. (status >> 28) & 0x1, (status >> 29) & 0x1, (status >> 30) & 0x1,
  913. (status >> 31) & 0x1);
  914. }
  915. static void ovl_dump_layer_info(int layer, unsigned long layer_offset)
  916. {
  917. DDPDUMP("layer%d: w=%d,h=%d,off(x=%d,y=%d),pitch=%d,addr=0x%x,fmt=%s,source=%s,aen=%d,alpha=%d\n",
  918. layer, DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_SRC_SIZE) & 0xfff,
  919. (DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_SRC_SIZE) >> 16) & 0xfff,
  920. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_OFFSET) & 0xfff,
  921. (DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_OFFSET) >> 16) & 0xfff,
  922. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_PITCH) & 0xffff,
  923. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_ADDR),
  924. ovl_intput_format_name(
  925. DISP_REG_GET_FIELD(L_CON_FLD_CFMT, DISP_REG_OVL_L0_CON+layer_offset),
  926. DISP_REG_GET_FIELD(L_CON_FLD_BTSW, DISP_REG_OVL_L0_CON+layer_offset)),
  927. (DISP_REG_GET_FIELD(L_CON_FLD_LSRC, DISP_REG_OVL_L0_CON + layer_offset) ==
  928. 0) ? "memory" : "constant_color", DISP_REG_GET_FIELD(L_CON_FLD_AEN,
  929. DISP_REG_OVL_L0_CON +
  930. layer_offset),
  931. DISP_REG_GET_FIELD(L_CON_FLD_APHA, DISP_REG_OVL_L0_CON + layer_offset)
  932. );
  933. }
  934. void ovl_dump_analysis(DISP_MODULE_ENUM module)
  935. {
  936. int i = 0;
  937. unsigned int layer_offset = 0;
  938. unsigned int rdma_offset = 0;
  939. int idx = ovl_index(module);
  940. unsigned int offset = idx * DISP_INDEX_OFFSET;
  941. unsigned int src_on = DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset);
  942. unsigned int rdma_ctrl;
  943. DDPDUMP("==DISP %s ANALYSIS==\n", ddp_get_module_name(module));
  944. DDPDUMP("ovl_en=%d,layer_enable(%d,%d,%d,%d),bg(w=%d, h=%d),",
  945. DISP_REG_GET(DISP_REG_OVL_EN + offset),
  946. DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) & 0x1,
  947. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 1) & 0x1,
  948. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 2) & 0x1,
  949. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 3) & 0x1,
  950. DISP_REG_GET(DISP_REG_OVL_ROI_SIZE + offset) & 0xfff,
  951. (DISP_REG_GET(DISP_REG_OVL_ROI_SIZE + offset) >> 16) & 0xfff);
  952. DDPDUMP("cur_pos(x=%d,y=%d),layer_hit(%d,%d,%d,%d),bg_mode=%s,sta=0x%x\n",
  953. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_X, DISP_REG_OVL_ADDCON_DBG + offset),
  954. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_Y, DISP_REG_OVL_ADDCON_DBG + offset),
  955. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L0_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  956. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L1_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  957. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L2_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  958. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L3_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  959. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_BGCLR_IN_SEL,
  960. DISP_REG_OVL_DATAPATH_CON + offset) ? "directlink" : "const",
  961. DISP_REG_GET(DISP_REG_OVL_STA + offset)
  962. );
  963. for (i = 0; i < 4; i++) {
  964. layer_offset = i * OVL_LAYER_OFFSET + offset;
  965. rdma_offset = i * OVL_RDMA_DEBUG_OFFSET + offset;
  966. if (src_on & (0x1 << i))
  967. ovl_dump_layer_info(i, layer_offset);
  968. else
  969. DDPDUMP("layer%d: disabled\n", i);
  970. rdma_ctrl = DISP_REG_GET(layer_offset + DISP_REG_OVL_RDMA0_CTRL);
  971. DDPDUMP("ovl rdma%d status:(en=%d, fifo_used %d, GMC=0x%x)\n", i,
  972. REG_FLD_VAL_GET(RDMA0_CTRL_FLD_RDMA_EN, rdma_ctrl),
  973. REG_FLD_VAL_GET(RDMA0_CTRL_FLD_RMDA_FIFO_USED_SZ, rdma_ctrl),
  974. DISP_REG_GET(layer_offset + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING));
  975. ovl_print_ovl_rdma_status(DISP_REG_GET(DISP_REG_OVL_RDMA0_DBG + rdma_offset));
  976. }
  977. ovl_printf_status(DISP_REG_GET(DISP_REG_OVL_FLOW_CTRL_DBG + offset));
  978. }
  979. static inline unsigned long ovl_layer_num(DISP_MODULE_ENUM module)
  980. {
  981. switch (module) {
  982. case DISP_MODULE_OVL0:
  983. return 4;
  984. case DISP_MODULE_OVL1:
  985. return 0;
  986. case DISP_MODULE_OVL0_2L:
  987. return 2;
  988. case DISP_MODULE_OVL1_2L:
  989. return 2;
  990. default:
  991. DDPERR("invalid ovl module=%d\n", module);
  992. ASSERT(0);
  993. }
  994. return 0;
  995. }
  996. void ovl_cal_golden_setting(unsigned int *gs)
  997. {
  998. /* OVL_RDMA_MEM_GMC_SETTING_1 */
  999. gs[GS_OVL_RDMA_ULTRA_TH] = 0x3ff;
  1000. gs[GS_OVL_RDMA_PRE_ULTRA_TH] = 0x3ff;
  1001. /* OVL_RDMA_FIFO_CTRL */
  1002. gs[GS_OVL_RDMA_FIFO_THRD] = 0;
  1003. gs[GS_OVL_RDMA_FIFO_SIZE] = 288;
  1004. /* OVL_RDMA_MEM_GMC_SETTING_2 */
  1005. gs[GS_OVL_RDMA_ISSUE_REQ_TH] = 191;
  1006. gs[GS_OVL_RDMA_ISSUE_REQ_TH_URG] = 95;
  1007. gs[GS_OVL_RDMA_REQ_TH_PRE_ULTRA] = 0;
  1008. gs[GS_OVL_RDMA_REQ_TH_ULTRA] = 1;
  1009. gs[GS_OVL_RDMA_FORCE_REQ_TH] = 0;
  1010. /* OVL_RDMA_GREQ_NUM */
  1011. gs[GS_OVL_RDMA_GREQ_NUM] = 0xF1FFBBBB;
  1012. /* OVL_RDMA_GREQURG_NUM */
  1013. gs[GS_OVL_RDMA_GREQ_URG_NUM] = 0xBBBB;
  1014. /* OVL_RDMA_ULTRA_SRC */
  1015. gs[GS_OVL_RDMA_ULTRA_SRC] = 0x8040;
  1016. /* OVL_RDMA_BUF_LOW_TH */
  1017. gs[GS_OVL_RDMA_ULTRA_LOW_TH] = 0;
  1018. gs[GS_OVL_RDMA_PRE_ULTRA_LOW_TH] = 0;
  1019. /* OVL_RDMA_BUF_HIGH_TH */
  1020. gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_TH] = 0;
  1021. gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_DIS] = 1;
  1022. /* OVL_EN */
  1023. gs[GS_OVL_BLOCK_EXT_ULTRA] = 0;
  1024. gs[GS_OVL_BLOCK_EXT_PRE_ULTRA] = 0;
  1025. }
  1026. static int ovl_golden_setting(DISP_MODULE_ENUM module, void *cmdq)
  1027. {
  1028. unsigned long baddr = ovl_base_addr(module);
  1029. unsigned int regval;
  1030. unsigned int gs[GS_OVL_FLD_NUM];
  1031. int i, layer_num;
  1032. unsigned long Lx_base;
  1033. baddr -= DISPSYS_OVL0_BASE;
  1034. layer_num = ovl_layer_num(module);
  1035. /* calculate ovl golden setting */
  1036. ovl_cal_golden_setting(gs);
  1037. /* OVL_RDMA_MEM_GMC_SETTING_1 */
  1038. regval = gs[GS_OVL_RDMA_ULTRA_TH] +
  1039. (gs[GS_OVL_RDMA_PRE_ULTRA_TH] << 16);
  1040. for (i = 0; i < layer_num; i++) {
  1041. Lx_base = i * OVL_LAYER_OFFSET + baddr;
  1042. DISP_REG_SET(cmdq, Lx_base +
  1043. DISP_REG_OVL_RDMA0_MEM_GMC_SETTING, regval);
  1044. }
  1045. /* OVL_RDMA_FIFO_CTRL */
  1046. regval = gs[GS_OVL_RDMA_FIFO_THRD] +
  1047. (gs[GS_OVL_RDMA_FIFO_SIZE] << 16);
  1048. for (i = 0; i < layer_num; i++) {
  1049. Lx_base = i * OVL_LAYER_OFFSET + baddr;
  1050. DISP_REG_SET(cmdq, Lx_base + DISP_REG_OVL_RDMA0_FIFO_CTRL,
  1051. regval);
  1052. }
  1053. /* OVL_RDMA_MEM_GMC_SETTING_2 */
  1054. regval = gs[GS_OVL_RDMA_ISSUE_REQ_TH] +
  1055. (gs[GS_OVL_RDMA_ISSUE_REQ_TH_URG] << 16) +
  1056. (gs[GS_OVL_RDMA_REQ_TH_PRE_ULTRA] << 28) +
  1057. (gs[GS_OVL_RDMA_REQ_TH_ULTRA] << 29) +
  1058. (gs[GS_OVL_RDMA_FORCE_REQ_TH] << 30);
  1059. for (i = 0; i < layer_num; i++)
  1060. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA0_MEM_GMC_S2 +
  1061. i * 4, regval);
  1062. /* DISP_REG_OVL_RDMA_GREQ_NUM */
  1063. regval = gs[GS_OVL_RDMA_GREQ_NUM];
  1064. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA_GREQ_NUM, regval);
  1065. /* DISP_REG_OVL_RDMA_GREQ_URG_NUM */
  1066. regval = gs[GS_OVL_RDMA_GREQ_URG_NUM];
  1067. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA_GREQ_URG_NUM, regval);
  1068. /* DISP_REG_OVL_RDMA_ULTRA_SRC */
  1069. regval = gs[GS_OVL_RDMA_ULTRA_SRC];
  1070. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA_ULTRA_SRC, regval);
  1071. /* DISP_REG_OVL_RDMAn_BUF_LOW */
  1072. regval = gs[GS_OVL_RDMA_ULTRA_LOW_TH] +
  1073. (gs[GS_OVL_RDMA_PRE_ULTRA_LOW_TH] << 12);
  1074. for (i = 0; i < layer_num; i++)
  1075. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMAn_BUF_LOW(i),
  1076. regval);
  1077. /* DISP_REG_OVL_RDMAn_BUF_HIGH */
  1078. regval = (gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_TH] << 12) +
  1079. (gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_DIS] << 31);
  1080. for (i = 0; i < layer_num; i++)
  1081. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMAn_BUF_HIGH(i),
  1082. regval);
  1083. /* OVL_EN */
  1084. regval = gs[GS_OVL_BLOCK_EXT_ULTRA] +
  1085. (gs[GS_OVL_BLOCK_EXT_PRE_ULTRA] << 1);
  1086. DISP_REG_SET_FIELD(cmdq, REG_FLD_MSB_LSB(19, 18), baddr +
  1087. DISP_REG_OVL_EN, regval);
  1088. /* Set ultra_sel of ovl0 & ovl0_2l to RDMA0 if path is DL with rsz
  1089. * OVL0_2l -> RSZ -> OVL0 -> RDMA0 -> DSI
  1090. */
  1091. DISP_REG_SET_FIELD(cmdq, mmsys_ovl_ultra_offset(module),
  1092. DISP_REG_CONFIG_MMSYS_MISC, 1);
  1093. return 0;
  1094. }
  1095. static int OVLConfig_l(DISP_MODULE_ENUM module, disp_ddp_path_config* pConfig, void* handle)
  1096. {
  1097. int enabled_layers = 0;
  1098. unsigned int local_layer = 0, global_layer = 0;
  1099. int idx = ovl_index(module);
  1100. if (pConfig->dst_dirty) {
  1101. OVLROI(module,
  1102. pConfig->dst_w, // width
  1103. pConfig->dst_h, // height
  1104. 0xFF000000, // background color
  1105. handle);
  1106. }
  1107. if (!pConfig->ovl_dirty) {
  1108. return 0;
  1109. }
  1110. for (global_layer = 0; global_layer < TOTAL_OVL_LAYER_NUM; global_layer++) {
  1111. if (!(pConfig->ovl_layer_scanned & (1 << global_layer)))
  1112. break;
  1113. }
  1114. if (global_layer > TOTAL_OVL_LAYER_NUM - ovl_layer_num(module)) {
  1115. DDPERR("%s: %s scan error, layer_scanned=%u\n", __func__,
  1116. ddp_get_module_name(module), pConfig->ovl_layer_scanned);
  1117. ASSERT(0);
  1118. }
  1119. for (local_layer = 0; local_layer < ovl_layer_num(module); local_layer++, global_layer++) {
  1120. OVL_CONFIG_STRUCT *ovl_cfg = &pConfig->ovl_config[global_layer];
  1121. pConfig->ovl_layer_scanned |= (1 << global_layer);
  1122. if (ovl_cfg->layer_en == 0)
  1123. continue;
  1124. if (ovl_cfg->addr==0 || ovl_cfg->dst_w==0 || ovl_cfg->dst_h==0) {
  1125. DDPERR("ovl parameter invalidate, addr=0x%x, w=%d, h=%d \n",
  1126. ovl_cfg->addr,
  1127. ovl_cfg->dst_w,
  1128. ovl_cfg->dst_h);
  1129. return -1;
  1130. }
  1131. DDPDBG("module %d, layer=%d, en=%d, src=%d, fmt=%d, addr=0x%x, x=%d, y=%d, pitch=%d, dst(%d, %d, %d, %d),keyEn=%d, key=%d, aen=%d, alpha=%d\n",
  1132. module,
  1133. local_layer,
  1134. ovl_cfg->layer_en,
  1135. ovl_cfg->source, // data source (0=memory)
  1136. ovl_cfg->fmt,
  1137. ovl_cfg->addr, // addr
  1138. ovl_cfg->src_x, // x
  1139. ovl_cfg->src_y, // y
  1140. ovl_cfg->src_pitch, //pitch, pixel number
  1141. ovl_cfg->dst_x, // x
  1142. ovl_cfg->dst_y, // y
  1143. ovl_cfg->dst_w, // width
  1144. ovl_cfg->dst_h, // height
  1145. ovl_cfg->keyEn, //color key
  1146. ovl_cfg->key, //color key
  1147. ovl_cfg->aen, // alpha enable
  1148. ovl_cfg->alpha);
  1149. OVLLayerConfig(module,
  1150. local_layer,
  1151. ovl_cfg->source,
  1152. ovl_cfg->fmt,
  1153. ovl_cfg->addr,
  1154. ovl_cfg->src_x,
  1155. ovl_cfg->src_y,
  1156. ovl_cfg->src_pitch,
  1157. ovl_cfg->dst_x,
  1158. ovl_cfg->dst_y,
  1159. ovl_cfg->dst_w,
  1160. ovl_cfg->dst_h,
  1161. ovl_cfg->keyEn,
  1162. ovl_cfg->key,
  1163. ovl_cfg->aen,
  1164. ovl_cfg->alpha,
  1165. handle);
  1166. // print_layer_config_args(module, local_layer, ovl_cfg);
  1167. // ovl_layer_config(module, local_layer, has_sec_layer, ovl_cfg, handle);
  1168. enabled_layers |= 1 << local_layer;
  1169. }
  1170. DISP_REG_SET_FIELD(handle, SRC_CON_FLD_L_EN, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_SRC_CON, enabled_layers);
  1171. ovl_golden_setting(module, handle);
  1172. return 0;
  1173. }
  1174. DDP_MODULE_DRIVER ddp_driver_ovl = {
  1175. .module = DISP_MODULE_OVL0,
  1176. .init = OVLInit,
  1177. .deinit = OVLDeInit,
  1178. .config = OVLConfig_l,
  1179. .start = OVLStart,
  1180. .trigger = NULL,
  1181. .stop = OVLStop,
  1182. .reset = NULL,
  1183. .power_on = OVLClockOn,
  1184. .power_off = OVLClockOff,
  1185. .is_idle = NULL,
  1186. .is_busy = NULL,
  1187. .dump_info = NULL,
  1188. .bypass = NULL,
  1189. .build_cmdq = NULL,
  1190. .set_lcm_utils = NULL,
  1191. .connect = OVLConnect,
  1192. };