ddp_ovl.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  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/mt_gpt.h>
  33. #include "platform/ddp_reg.h"
  34. #include "platform/ddp_matrix_para.h"
  35. #include "platform/ddp_info.h"
  36. #include "platform/ddp_log.h"
  37. #include "platform/ddp_ovl.h"
  38. #include "platform/disp_drv_platform.h"
  39. #define OVL_NUM (1)
  40. #define OVL_REG_BACK_MAX (40)
  41. #define OVL_LAYER_OFFSET (0x20)
  42. #define OVL_RDMA_DEBUG_OFFSET (0x4)
  43. enum OVL_COLOR_SPACE {
  44. OVL_COLOR_SPACE_RGB = 0,
  45. OVL_COLOR_SPACE_YUV,
  46. };
  47. enum OVL_INPUT_FORMAT {
  48. OVL_INPUT_FORMAT_BGR565 = 0,
  49. OVL_INPUT_FORMAT_RGB888 = 1,
  50. OVL_INPUT_FORMAT_RGBA8888 = 2,
  51. OVL_INPUT_FORMAT_ARGB8888 = 3,
  52. OVL_INPUT_FORMAT_VYUY = 4,
  53. OVL_INPUT_FORMAT_YVYU = 5,
  54. OVL_INPUT_FORMAT_RGB565 = 6,
  55. OVL_INPUT_FORMAT_BGR888 = 7,
  56. OVL_INPUT_FORMAT_BGRA8888 = 8,
  57. OVL_INPUT_FORMAT_ABGR8888 = 9,
  58. OVL_INPUT_FORMAT_UYVY = 10,
  59. OVL_INPUT_FORMAT_YUYV = 11,
  60. OVL_INPUT_FORMAT_RGBA4444 = 12,
  61. OVL_INPUT_FORMAT_BGRA4444 = 13,
  62. OVL_INPUT_FORMAT_UNKNOWN = 32,
  63. };
  64. typedef struct {
  65. unsigned int address;
  66. unsigned int value;
  67. } OVL_REG;
  68. static enum OVL_INPUT_FORMAT ovl_input_fmt_convert(DpColorFormat fmt);
  69. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat);
  70. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat);
  71. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat);
  72. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat);
  73. static void ovl_store_regs(int idx);
  74. static void ovl_restore_regs(int idx,void * handle);
  75. static enum OVL_INPUT_FORMAT ovl_input_fmt_convert(DpColorFormat fmt)
  76. {
  77. enum OVL_INPUT_FORMAT ovl_fmt = OVL_INPUT_FORMAT_UNKNOWN;
  78. switch (fmt) {
  79. case eBGR565:
  80. ovl_fmt = OVL_INPUT_FORMAT_BGR565;
  81. break;
  82. case eRGB565:
  83. ovl_fmt = OVL_INPUT_FORMAT_RGB565;
  84. break;
  85. case eRGB888:
  86. ovl_fmt = OVL_INPUT_FORMAT_RGB888;
  87. break;
  88. case eBGR888:
  89. ovl_fmt = OVL_INPUT_FORMAT_BGR888;
  90. break;
  91. case eRGBA4444:
  92. ovl_fmt = OVL_INPUT_FORMAT_RGBA4444;
  93. break;
  94. case eBGRA4444:
  95. ovl_fmt = OVL_INPUT_FORMAT_BGRA4444;
  96. break;
  97. case eRGBA8888:
  98. ovl_fmt = OVL_INPUT_FORMAT_RGBA8888;
  99. break;
  100. case eBGRA8888:
  101. ovl_fmt = OVL_INPUT_FORMAT_BGRA8888;
  102. break;
  103. case eARGB8888:
  104. ovl_fmt = OVL_INPUT_FORMAT_ARGB8888;
  105. break;
  106. case eABGR8888:
  107. ovl_fmt = OVL_INPUT_FORMAT_ABGR8888;
  108. break;
  109. case eVYUY:
  110. ovl_fmt = OVL_INPUT_FORMAT_VYUY;
  111. break;
  112. case eYVYU:
  113. ovl_fmt = OVL_INPUT_FORMAT_YVYU;
  114. break;
  115. case eUYVY:
  116. ovl_fmt = OVL_INPUT_FORMAT_UYVY;
  117. break;
  118. case eYUY2:
  119. ovl_fmt = OVL_INPUT_FORMAT_YUYV;
  120. break;
  121. default:
  122. DDPERR("ovl_fmt_convert fmt=%d, ovl_fmt=%d\n", fmt, ovl_fmt);
  123. break;
  124. }
  125. return ovl_fmt;
  126. }
  127. static DpColorFormat ovl_input_fmt(enum OVL_INPUT_FORMAT fmt, int swap)
  128. {
  129. switch (fmt) {
  130. case OVL_INPUT_FORMAT_BGR565:
  131. return swap ? eBGR565 : eRGB565;
  132. case OVL_INPUT_FORMAT_RGB888:
  133. return swap ? eRGB888 : eBGR888;
  134. case OVL_INPUT_FORMAT_RGBA8888:
  135. return swap ? eRGBA8888 : eBGRA8888;
  136. case OVL_INPUT_FORMAT_ARGB8888:
  137. return swap ? eARGB8888 : eABGR8888;
  138. case OVL_INPUT_FORMAT_VYUY:
  139. return swap ? eVYUY : eUYVY;
  140. case OVL_INPUT_FORMAT_YVYU:
  141. return swap ? eYVYU : eYUY2;
  142. case OVL_INPUT_FORMAT_RGBA4444:
  143. return swap ? eRGBA4444 : eBGRA4444;
  144. default:
  145. DDPERR("ovl_input_fmt fmt=%d, swap=%d\n", fmt, swap);
  146. break;
  147. }
  148. return eRGB888;
  149. }
  150. static char *ovl_intput_format_name(enum OVL_INPUT_FORMAT fmt, int swap)
  151. {
  152. switch (fmt) {
  153. case OVL_INPUT_FORMAT_BGR565:
  154. return swap ? "eBGR565" : "eRGB565";
  155. case OVL_INPUT_FORMAT_RGB565:
  156. return "eRGB565";
  157. case OVL_INPUT_FORMAT_RGB888:
  158. return swap ? "eRGB888" : "eBGR888";
  159. case OVL_INPUT_FORMAT_BGR888:
  160. return "eBGR888";
  161. case OVL_INPUT_FORMAT_RGBA8888:
  162. return swap ? "eRGBA8888" : "eBGRA8888";
  163. case OVL_INPUT_FORMAT_BGRA8888:
  164. return "eBGRA8888";
  165. case OVL_INPUT_FORMAT_ARGB8888:
  166. return swap ? "eARGB8888" : "eABGR8888";
  167. case OVL_INPUT_FORMAT_ABGR8888:
  168. return "eABGR8888";
  169. case OVL_INPUT_FORMAT_VYUY:
  170. return swap ? "eVYUY" : "eUYVY";
  171. case OVL_INPUT_FORMAT_UYVY:
  172. return "eUYVY";
  173. case OVL_INPUT_FORMAT_YVYU:
  174. return swap ? "eYVYU" : "eYUY2";
  175. case OVL_INPUT_FORMAT_YUYV:
  176. return "eYUY2";
  177. case OVL_INPUT_FORMAT_RGBA4444:
  178. return swap ? "eRGBA4444" : "eBGRA4444";
  179. default:
  180. DDPERR("ovl_intput_fmt unknow fmt=%d, swap=%d\n", fmt, swap);
  181. break;
  182. }
  183. return "unknow";
  184. }
  185. static unsigned int ovl_index(DISP_MODULE_ENUM module)
  186. {
  187. int idx = 0;
  188. switch (module) {
  189. case DISP_MODULE_OVL0:
  190. idx = 0;
  191. break;
  192. default:
  193. DDPERR("invalid module=%d \n", module);// invalid module
  194. ASSERT(0);
  195. }
  196. return idx;
  197. }
  198. int OVLStart(DISP_MODULE_ENUM module, void *handle)
  199. {
  200. int idx = ovl_index(module);
  201. /* bypass shadow */
  202. #ifdef LK_BYPASS_SHADOW_REG
  203. DISP_REG_SET_FIELD(handle, EN_FLD_BYPASS_SHADOW,
  204. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  205. DISP_REG_SET_FIELD(handle, EN_FLD_RD_WRK_REG,
  206. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  207. #endif
  208. DISP_REG_SET_FIELD(handle, EN_FLD_OVL_EN,
  209. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  210. DISP_REG_SET(handle, idx*DISP_INDEX_OFFSET + DISP_REG_OVL_INTEN,
  211. 0x1E | REG_FLD_VAL(INTEN_FLD_ABNORMAL_SOF, 1));
  212. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_LAYER_SMI_ID_EN,
  213. idx*DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 0x1);
  214. return 0;
  215. }
  216. int OVLStop(DISP_MODULE_ENUM module, void *handle)
  217. {
  218. int idx = ovl_index(module);
  219. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  220. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_EN, 0x00);
  221. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTSTA, 0x00);
  222. return 0;
  223. }
  224. int OVLReset(DISP_MODULE_ENUM module, void *handle)
  225. {
  226. #define OVL_IDLE (0x3)
  227. unsigned int delay_cnt = 0;
  228. int idx = ovl_index(module);
  229. /*always use cpu do reset*/
  230. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x1); // soft reset
  231. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x0);
  232. while (!(DISP_REG_GET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_FLOW_CTRL_DBG) & OVL_IDLE)) {
  233. delay_cnt++;
  234. udelay(10);
  235. if (delay_cnt>2000) {
  236. DDPERR("OVL%dReset() timeout! \n",idx);
  237. break;
  238. }
  239. }
  240. return 0;
  241. }
  242. int OVLROI(DISP_MODULE_ENUM module,
  243. unsigned int bgW,
  244. unsigned int bgH,
  245. unsigned int bgColor,
  246. void * handle)
  247. {
  248. int idx = ovl_index(module);
  249. if ((bgW > OVL_MAX_WIDTH) || (bgH > OVL_MAX_HEIGHT)) {
  250. DDPERR("OVLROI(), exceed OVL max size, w=%d, h=%d \n", bgW, bgH);
  251. ASSERT(0);
  252. }
  253. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_SIZE, bgH<<16 | bgW);
  254. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_BGCLR, bgColor);
  255. return 0;
  256. }
  257. int OVLLayerSwitch(DISP_MODULE_ENUM module,
  258. unsigned layer,
  259. unsigned int en,
  260. void * handle)
  261. {
  262. int idx = ovl_index(module);
  263. ASSERT(layer<=3);
  264. switch (layer) {
  265. case 0:
  266. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L0_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  267. break;
  268. case 1:
  269. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L1_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  270. break;
  271. case 2:
  272. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L2_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  273. break;
  274. case 3:
  275. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L3_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  276. break;
  277. default:
  278. DDPERR("invalid layer=%d\n", layer); // invalid layer
  279. ASSERT(0);
  280. }
  281. return 0;
  282. }
  283. int OVL3DConfig(DISP_MODULE_ENUM module,
  284. unsigned int layer_id,
  285. unsigned int en_3d,
  286. unsigned int landscape,
  287. unsigned int r_first,
  288. void *handle)
  289. {
  290. return 0;
  291. }
  292. int OVLLayerConfig(DISP_MODULE_ENUM module,
  293. unsigned int layer,
  294. unsigned int source,
  295. DpColorFormat format,
  296. unsigned int addr,
  297. unsigned int src_x, // ROI x offset
  298. unsigned int src_y, // ROI y offset
  299. unsigned int src_pitch,
  300. unsigned int dst_x, // ROI x offset
  301. unsigned int dst_y, // ROI y offset
  302. unsigned int dst_w, // ROT width
  303. unsigned int dst_h, // ROI height
  304. unsigned int keyEn,
  305. unsigned int key, // color key
  306. unsigned int aen, // alpha enable
  307. unsigned char alpha,
  308. void * handle)
  309. {
  310. int idx = ovl_index(module);
  311. unsigned int value = 0;
  312. enum OVL_INPUT_FORMAT fmt = ovl_input_fmt_convert(format);
  313. unsigned int bpp = ovl_input_fmt_bpp(fmt);
  314. unsigned int input_swap = ovl_input_fmt_byte_swap(fmt);
  315. unsigned int input_fmt = ovl_input_fmt_reg_value(fmt);
  316. enum OVL_COLOR_SPACE space = ovl_input_fmt_color_space(fmt);
  317. unsigned int offset = 0;
  318. /*0100 MTX_JPEG_TO_RGB (YUV FUll TO RGB)*/
  319. int color_matrix = 0x4;
  320. unsigned int idx_offset = idx*DISP_INDEX_OFFSET;
  321. unsigned int layer_offset = idx_offset + layer * 0x20;
  322. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  323. unsigned int bg_h, bg_w;
  324. #endif
  325. ASSERT((dst_w <= OVL_MAX_WIDTH) &&
  326. (dst_h <= OVL_MAX_HEIGHT) &&
  327. (layer <= 3));
  328. if (addr == 0) {
  329. DDPERR("source from memory, but addr is 0!\n");
  330. ASSERT(0);
  331. }
  332. DDPDBG("ovl%d, layer=%d, source=%s, off(x=%d, y=%d), dst(%d, %d, %d, %d),pitch=%d,"
  333. "fmt=%s, addr=%x, keyEn=%d, key=%d, aen=%d, alpha=%d \n",
  334. idx,
  335. layer,
  336. (source==0)?"memory":"constant_color",
  337. src_x,
  338. src_y,
  339. dst_x,
  340. dst_y,
  341. dst_w,
  342. dst_h,
  343. src_pitch,
  344. ovl_intput_format_name(fmt, input_swap),
  345. addr,
  346. keyEn,
  347. key,
  348. aen,
  349. alpha);
  350. if (source==OVL_LAYER_SOURCE_RESERVED) { //==1, means constant color
  351. if (aen==0) {
  352. DDPERR("dim layer ahpha enable should be 1!\n");
  353. }
  354. if (fmt!=OVL_INPUT_FORMAT_RGB565) {
  355. DDPERR("dim layer format should be RGB565");
  356. fmt = OVL_INPUT_FORMAT_RGB565;
  357. }
  358. }
  359. DISP_REG_SET(handle, DISP_REG_OVL_RDMA0_CTRL+layer_offset, 0x1);
  360. value = (REG_FLD_VAL((L_CON_FLD_LSRC), (source)) |
  361. REG_FLD_VAL((L_CON_FLD_CFMT), (input_fmt)) |
  362. REG_FLD_VAL((L_CON_FLD_AEN), (aen)) |
  363. REG_FLD_VAL((L_CON_FLD_APHA), (alpha)) |
  364. REG_FLD_VAL((L_CON_FLD_SKEN), (keyEn)) |
  365. REG_FLD_VAL((L_CON_FLD_BTSW), (input_swap)));
  366. if (fmt == OVL_INPUT_FORMAT_RGBA4444)
  367. value |= REG_FLD_VAL((L_CON_FLD_CLRFMT_MAN), (1));
  368. if (space == OVL_COLOR_SPACE_YUV)
  369. value = value | REG_FLD_VAL((L_CON_FLD_MTX), (color_matrix));
  370. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  371. value |= (REG_FLD_VAL((L_CON_FLD_VIRTICAL_FLIP), 1) |
  372. REG_FLD_VAL((L_CON_FLD_HORI_FLIP), 1));
  373. #endif
  374. DISP_REG_SET(handle, DISP_REG_OVL_L0_CON+layer_offset, value);
  375. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  376. bg_h = DISP_REG_GET(idx_offset + DISP_REG_OVL_ROI_SIZE);
  377. bg_w = bg_h & 0xFFFF;
  378. bg_h = bg_h >> 16;
  379. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  380. (bg_h-dst_h-dst_y)<<16 | (bg_w-dst_w-dst_x));
  381. offset = (src_x+dst_w+1)*bpp + (src_y+dst_h-1)*src_pitch - 1;
  382. #else
  383. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  384. dst_y<<16 | dst_x);
  385. offset = src_x*bpp+src_y*src_pitch;
  386. #endif
  387. DISP_REG_SET(handle, DISP_REG_OVL_L0_ADDR+layer_offset,
  388. addr+offset);
  389. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRC_SIZE+layer_offset,
  390. dst_h<<16 | dst_w);
  391. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRCKEY+layer_offset,
  392. key);
  393. value = (REG_FLD_VAL((L_PITCH_FLD_SUR_ALFA), (0)) |
  394. REG_FLD_VAL((L_PITCH_FLD_SRC_PITCH), (src_pitch)));
  395. if (fmt == OVL_INPUT_FORMAT_RGBA4444) {
  396. value = REG_FLD_VAL(L_PITCH_FLD_SRGB_SEL, (1)) |
  397. REG_FLD_VAL(L_PITCH_FLD_DRGB_SEL, (2)) |
  398. REG_FLD_VAL(L_PITCH_FLD_SURFL_EN, (1)) |
  399. REG_FLD_VAL((L_PITCH_FLD_SRC_PITCH), (src_pitch));
  400. }
  401. DISP_REG_SET(handle, DISP_REG_OVL_L0_PITCH+layer_offset, value);
  402. //DISP_REG_SET(handle, DISP_REG_OVL_RDMA0_MEM_GMC_SETTING+layer_offset, 0x6070);
  403. return 0;
  404. }
  405. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat)
  406. {
  407. int input_swap = 0;
  408. switch (inputFormat) {
  409. case OVL_INPUT_FORMAT_BGR565:
  410. case OVL_INPUT_FORMAT_RGB888:
  411. case OVL_INPUT_FORMAT_RGBA8888:
  412. case OVL_INPUT_FORMAT_ARGB8888:
  413. case OVL_INPUT_FORMAT_BGRA4444:
  414. case OVL_INPUT_FORMAT_VYUY:
  415. case OVL_INPUT_FORMAT_YVYU:
  416. input_swap = 1;
  417. break;
  418. case OVL_INPUT_FORMAT_RGB565:
  419. case OVL_INPUT_FORMAT_BGR888:
  420. case OVL_INPUT_FORMAT_BGRA8888:
  421. case OVL_INPUT_FORMAT_ABGR8888:
  422. case OVL_INPUT_FORMAT_RGBA4444:
  423. case OVL_INPUT_FORMAT_UYVY:
  424. case OVL_INPUT_FORMAT_YUYV:
  425. input_swap = 0;
  426. break;
  427. default:
  428. DDPERR("unknow input ovl format is %d\n", inputFormat);
  429. ASSERT(0);
  430. }
  431. return input_swap;
  432. }
  433. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat)
  434. {
  435. int bpp = 0;
  436. switch (inputFormat) {
  437. case OVL_INPUT_FORMAT_BGR565:
  438. case OVL_INPUT_FORMAT_RGB565:
  439. case OVL_INPUT_FORMAT_VYUY:
  440. case OVL_INPUT_FORMAT_UYVY:
  441. case OVL_INPUT_FORMAT_YVYU:
  442. case OVL_INPUT_FORMAT_YUYV:
  443. case OVL_INPUT_FORMAT_RGBA4444:
  444. case OVL_INPUT_FORMAT_BGRA4444:
  445. bpp = 2;
  446. break;
  447. case OVL_INPUT_FORMAT_RGB888:
  448. case OVL_INPUT_FORMAT_BGR888:
  449. bpp = 3;
  450. break;
  451. case OVL_INPUT_FORMAT_RGBA8888:
  452. case OVL_INPUT_FORMAT_BGRA8888:
  453. case OVL_INPUT_FORMAT_ARGB8888:
  454. case OVL_INPUT_FORMAT_ABGR8888:
  455. bpp = 4;
  456. break;
  457. default:
  458. DDPERR("unknown ovl input format = %d\n", inputFormat);
  459. ASSERT(0);
  460. }
  461. return bpp;
  462. }
  463. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat)
  464. {
  465. enum OVL_COLOR_SPACE space = OVL_COLOR_SPACE_RGB;
  466. switch (inputFormat) {
  467. case OVL_INPUT_FORMAT_BGR565:
  468. case OVL_INPUT_FORMAT_RGB565:
  469. case OVL_INPUT_FORMAT_RGB888:
  470. case OVL_INPUT_FORMAT_BGR888:
  471. case OVL_INPUT_FORMAT_BGRA4444:
  472. case OVL_INPUT_FORMAT_RGBA4444:
  473. case OVL_INPUT_FORMAT_RGBA8888:
  474. case OVL_INPUT_FORMAT_BGRA8888:
  475. case OVL_INPUT_FORMAT_ARGB8888:
  476. case OVL_INPUT_FORMAT_ABGR8888:
  477. space = OVL_COLOR_SPACE_RGB;
  478. break;
  479. case OVL_INPUT_FORMAT_VYUY:
  480. case OVL_INPUT_FORMAT_UYVY:
  481. case OVL_INPUT_FORMAT_YVYU:
  482. case OVL_INPUT_FORMAT_YUYV:
  483. space = OVL_COLOR_SPACE_YUV;
  484. break;
  485. default:
  486. DDPERR("unknown ovl input format = %d\n", inputFormat);
  487. ASSERT(0);
  488. }
  489. return space;
  490. }
  491. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat)
  492. {
  493. int reg_value = 0;
  494. switch (inputFormat) {
  495. case OVL_INPUT_FORMAT_BGR565:
  496. case OVL_INPUT_FORMAT_RGB565:
  497. reg_value = 0x0;
  498. break;
  499. case OVL_INPUT_FORMAT_RGB888:
  500. case OVL_INPUT_FORMAT_BGR888:
  501. reg_value = 0x1;
  502. break;
  503. case OVL_INPUT_FORMAT_RGBA8888:
  504. case OVL_INPUT_FORMAT_BGRA8888:
  505. reg_value = 0x2;
  506. break;
  507. case OVL_INPUT_FORMAT_ARGB8888:
  508. case OVL_INPUT_FORMAT_ABGR8888:
  509. reg_value = 0x3;
  510. break;
  511. case OVL_INPUT_FORMAT_VYUY:
  512. case OVL_INPUT_FORMAT_UYVY:
  513. case OVL_INPUT_FORMAT_RGBA4444:
  514. case OVL_INPUT_FORMAT_BGRA4444:
  515. reg_value = 0x4;
  516. break;
  517. case OVL_INPUT_FORMAT_YVYU:
  518. case OVL_INPUT_FORMAT_YUYV:
  519. reg_value = 0x5;
  520. break;
  521. default:
  522. DDPERR("unknow ovl input format is %d\n", inputFormat);
  523. ASSERT(0);
  524. }
  525. return reg_value;
  526. }
  527. int OVLClockOn(DISP_MODULE_ENUM module,void * handle)
  528. {
  529. int idx = ovl_index(module);
  530. ddp_enable_module_clock(module);
  531. DDPMSG("OVL%dClockOn CG 0x%x \n",idx, DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  532. return 0;
  533. }
  534. int OVLClockOff(DISP_MODULE_ENUM module,void * handle)
  535. {
  536. int idx = ovl_index(module);
  537. DDPMSG("OVL%dClockOff\n",idx);
  538. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x00);
  539. OVLReset(module,handle);
  540. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  541. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_INTSTA, 0x00);
  542. ddp_disable_module_clock(module);
  543. return 0;
  544. }
  545. int OVLInit(DISP_MODULE_ENUM module,void * handle)
  546. {
  547. //power on, no need to care clock
  548. /*int idx = ovl_index(module);*/
  549. ddp_enable_module_clock(module);
  550. return 0;
  551. }
  552. int OVLDeInit(DISP_MODULE_ENUM module,void * handle)
  553. {
  554. int idx = ovl_index(module);
  555. DDPMSG("OVL%dDeInit close CG \n",idx);
  556. ddp_disable_module_clock(module);
  557. return 0;
  558. }
  559. static inline int is_module_ovl(DISP_MODULE_ENUM module)
  560. {
  561. if (module == DISP_MODULE_OVL0)
  562. return 1;
  563. else
  564. return 0;
  565. }
  566. int OVLConnect(DISP_MODULE_ENUM module, DISP_MODULE_ENUM prev,
  567. DISP_MODULE_ENUM next, int connect, void *handle)
  568. {
  569. int idx = ovl_index(module);
  570. if (connect && is_module_ovl(prev))
  571. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_BGCLR_IN_SEL,
  572. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 1);
  573. else
  574. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_BGCLR_IN_SEL,
  575. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 0);
  576. return 0;
  577. }
  578. void OVLDump(DISP_MODULE_ENUM module)
  579. {
  580. int idx = ovl_index(module);
  581. unsigned long offset = DISP_INDEX_OFFSET*idx;
  582. unsigned long module_base = DISP_REG_OVL_STA + offset;
  583. DDPDUMP("== START: DISP %s REGS ==\n", ddp_get_module_name(module));
  584. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  585. 0x0, INREG32(module_base + 0x0),
  586. 0x4, INREG32(module_base + 0x4),
  587. 0x8, INREG32(module_base + 0x8),
  588. 0xc, INREG32(module_base + 0xc));
  589. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  590. 0x10, INREG32(module_base + 0x10),
  591. 0x14, INREG32(module_base + 0x14),
  592. 0x20, INREG32(module_base + 0x20),
  593. 0x24, INREG32(module_base + 0x24));
  594. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  595. 0x28, INREG32(module_base + 0x28),
  596. 0x2c, INREG32(module_base + 0x2c),
  597. 0x30, INREG32(module_base + 0x30),
  598. 0x34, INREG32(module_base + 0x34));
  599. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  600. 0x38, INREG32(module_base + 0x38),
  601. 0x3c, INREG32(module_base + 0x3c),
  602. 0xf40, INREG32(module_base + 0xf40),
  603. 0x44, INREG32(module_base + 0x44));
  604. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  605. 0x48, INREG32(module_base + 0x48),
  606. 0x4c, INREG32(module_base + 0x4c),
  607. 0x50, INREG32(module_base + 0x50),
  608. 0x54, INREG32(module_base + 0x54));
  609. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  610. 0x58, INREG32(module_base + 0x58),
  611. 0x5c, INREG32(module_base + 0x5c),
  612. 0xf60, INREG32(module_base + 0xf60),
  613. 0x64, INREG32(module_base + 0x64));
  614. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  615. 0x68, INREG32(module_base + 0x68),
  616. 0x6c, INREG32(module_base + 0x6c),
  617. 0x70, INREG32(module_base + 0x70),
  618. 0x74, INREG32(module_base + 0x74));
  619. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  620. 0x78, INREG32(module_base + 0x78),
  621. 0x7c, INREG32(module_base + 0x7c),
  622. 0xf80, INREG32(module_base + 0xf80),
  623. 0x84, INREG32(module_base + 0x84));
  624. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  625. 0x88, INREG32(module_base + 0x88),
  626. 0x8c, INREG32(module_base + 0x8c),
  627. 0x90, INREG32(module_base + 0x90),
  628. 0x94, INREG32(module_base + 0x94));
  629. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  630. 0x98, INREG32(module_base + 0x98),
  631. 0x9c, INREG32(module_base + 0x9c),
  632. 0xfa0, INREG32(module_base + 0xfa0),
  633. 0xa4, INREG32(module_base + 0xa4));
  634. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  635. 0xa8, INREG32(module_base + 0xa8),
  636. 0xac, INREG32(module_base + 0xac),
  637. 0xc0, INREG32(module_base + 0xc0),
  638. 0xc8, INREG32(module_base + 0xc8));
  639. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  640. 0xcc, INREG32(module_base + 0xcc),
  641. 0xd0, INREG32(module_base + 0xd0),
  642. 0xe0, INREG32(module_base + 0xe0),
  643. 0xe8, INREG32(module_base + 0xe8));
  644. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  645. 0xec, INREG32(module_base + 0xec),
  646. 0xf0, INREG32(module_base + 0xf0),
  647. 0x100, INREG32(module_base + 0x100),
  648. 0x108, INREG32(module_base + 0x108));
  649. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  650. 0x10c, INREG32(module_base + 0x10c),
  651. 0x110, INREG32(module_base + 0x110),
  652. 0x120, INREG32(module_base + 0x120),
  653. 0x128, INREG32(module_base + 0x128));
  654. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  655. 0x12c, INREG32(module_base + 0x12c),
  656. 0x130, INREG32(module_base + 0x130),
  657. 0x1d4, INREG32(module_base + 0x1d4),
  658. 0x1dc, INREG32(module_base + 0x1dc));
  659. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  660. 0x1e0, INREG32(module_base + 0x1e0),
  661. 0x1e4, INREG32(module_base + 0x1e4),
  662. 0x1e8, INREG32(module_base + 0x1e8),
  663. 0x1ec, INREG32(module_base + 0x1ec));
  664. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  665. 0x1f0, INREG32(module_base + 0x1f0),
  666. 0x1f4, INREG32(module_base + 0x1f4),
  667. 0x1f8, INREG32(module_base + 0x1f8),
  668. 0x1fc, INREG32(module_base + 0x1fc));
  669. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  670. 0x200, INREG32(module_base + 0x200),
  671. 0x208, INREG32(module_base + 0x208),
  672. 0x20c, INREG32(module_base + 0x20c),
  673. 0x210, INREG32(module_base + 0x210));
  674. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  675. 0x214, INREG32(module_base + 0x214),
  676. 0x218, INREG32(module_base + 0x218),
  677. 0x21c, INREG32(module_base + 0x21c),
  678. 0x220, INREG32(module_base + 0x220));
  679. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  680. 0x224, INREG32(module_base + 0x224),
  681. 0x228, INREG32(module_base + 0x228),
  682. 0x22c, INREG32(module_base + 0x22c),
  683. 0x230, INREG32(module_base + 0x230));
  684. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  685. 0x234, INREG32(module_base + 0x234),
  686. 0x238, INREG32(module_base + 0x238),
  687. 0x240, INREG32(module_base + 0x240),
  688. 0x244, INREG32(module_base + 0x244));
  689. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  690. 0x24c, INREG32(module_base + 0x24c),
  691. 0x250, INREG32(module_base + 0x250),
  692. 0x254, INREG32(module_base + 0x254),
  693. 0x258, INREG32(module_base + 0x258));
  694. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  695. 0x25c, INREG32(module_base + 0x25c),
  696. 0x260, INREG32(module_base + 0x260),
  697. 0x264, INREG32(module_base + 0x264),
  698. 0x268, INREG32(module_base + 0x268));
  699. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  700. 0x26c, INREG32(module_base + 0x26c),
  701. 0x270, INREG32(module_base + 0x270),
  702. 0x280, INREG32(module_base + 0x280),
  703. 0x284, INREG32(module_base + 0x284));
  704. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  705. 0x288, INREG32(module_base + 0x288),
  706. 0x28c, INREG32(module_base + 0x28c),
  707. 0x290, INREG32(module_base + 0x290),
  708. 0x29c, INREG32(module_base + 0x29c));
  709. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  710. 0x2a0, INREG32(module_base + 0x2a0),
  711. 0x2a4, INREG32(module_base + 0x2a4),
  712. 0x2b0, INREG32(module_base + 0x2b0),
  713. 0x2b4, INREG32(module_base + 0x2b4));
  714. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  715. 0x2b8, INREG32(module_base + 0x2b8),
  716. 0x2bc, INREG32(module_base + 0x2bc),
  717. 0x2c0, INREG32(module_base + 0x2c0),
  718. 0x2c4, INREG32(module_base + 0x2c4));
  719. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  720. 0x2c8, INREG32(module_base + 0x2c8),
  721. 0x324, INREG32(module_base + 0x324),
  722. 0x330, INREG32(module_base + 0x330),
  723. 0x334, INREG32(module_base + 0x334));
  724. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  725. 0x338, INREG32(module_base + 0x338),
  726. 0x33c, INREG32(module_base + 0x33c),
  727. 0xfb0, INREG32(module_base + 0xfb0),
  728. 0x344, INREG32(module_base + 0x344));
  729. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  730. 0x348, INREG32(module_base + 0x348),
  731. 0x34c, INREG32(module_base + 0x34c),
  732. 0x350, INREG32(module_base + 0x350),
  733. 0x354, INREG32(module_base + 0x354));
  734. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  735. 0x358, INREG32(module_base + 0x358),
  736. 0x35c, INREG32(module_base + 0x35c),
  737. 0xfb4, INREG32(module_base + 0xfb4),
  738. 0x364, INREG32(module_base + 0x364));
  739. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  740. 0x368, INREG32(module_base + 0x368),
  741. 0x36c, INREG32(module_base + 0x36c),
  742. 0x370, INREG32(module_base + 0x370),
  743. 0x374, INREG32(module_base + 0x374));
  744. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  745. 0x378, INREG32(module_base + 0x378),
  746. 0x37c, INREG32(module_base + 0x37c),
  747. 0xfb8, INREG32(module_base + 0xfb8),
  748. 0x384, INREG32(module_base + 0x384));
  749. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  750. 0x388, INREG32(module_base + 0x388),
  751. 0x38c, INREG32(module_base + 0x38c),
  752. 0x390, INREG32(module_base + 0x390),
  753. 0x394, INREG32(module_base + 0x394));
  754. DDPDUMP("ovl: 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  755. 0x398, INREG32(module_base + 0x398),
  756. 0xfc0, INREG32(module_base + 0xfc0));
  757. DDPDUMP("-- END: DISP %s REGS --\n", ddp_get_module_name(module));
  758. }
  759. static void ovl_printf_status(unsigned int status)
  760. {
  761. DDPDUMP("=OVL_FLOW_CONTROL_DEBUG=:\n");
  762. DDPDUMP("addcon_idle:%d,blend_idle:%d,out_valid:%d,out_ready:%d,out_idle:%d\n",
  763. (status >> 10) & (0x1),
  764. (status >> 11) & (0x1),
  765. (status >> 12) & (0x1), (status >> 13) & (0x1), (status >> 15) & (0x1)
  766. );
  767. DDPDUMP("rdma3_idle:%d,rdma2_idle:%d,rdma1_idle:%d, rdma0_idle:%d,rst:%d\n",
  768. (status >> 16) & (0x1),
  769. (status >> 17) & (0x1),
  770. (status >> 18) & (0x1), (status >> 19) & (0x1), (status >> 20) & (0x1)
  771. );
  772. DDPDUMP("trig:%d,frame_hwrst_done:%d,frame_swrst_done:%d,frame_underrun:%d,frame_done:%d\n",
  773. (status >> 21) & (0x1),
  774. (status >> 23) & (0x1),
  775. (status >> 24) & (0x1), (status >> 25) & (0x1), (status >> 26) & (0x1)
  776. );
  777. DDPDUMP("ovl_running:%d,ovl_start:%d,ovl_clr:%d,reg_update:%d,ovl_upd_reg:%d\n",
  778. (status >> 27) & (0x1),
  779. (status >> 28) & (0x1),
  780. (status >> 29) & (0x1), (status >> 30) & (0x1), (status >> 31) & (0x1)
  781. );
  782. DDPDUMP("ovl_fms_state:\n");
  783. switch (status & 0x3ff) {
  784. case 0x1:
  785. DDPDUMP("idle\n");
  786. break;
  787. case 0x2:
  788. DDPDUMP("wait_SOF\n");
  789. break;
  790. case 0x4:
  791. DDPDUMP("prepare\n");
  792. break;
  793. case 0x8:
  794. DDPDUMP("reg_update\n");
  795. break;
  796. case 0x10:
  797. DDPDUMP("eng_clr(internal reset)\n");
  798. break;
  799. case 0x20:
  800. DDPDUMP("eng_act(processing)\n");
  801. break;
  802. case 0x40:
  803. DDPDUMP("h_wait_w_rst\n");
  804. break;
  805. case 0x80:
  806. DDPDUMP("s_wait_w_rst\n");
  807. break;
  808. case 0x100:
  809. DDPDUMP("h_w_rst\n");
  810. break;
  811. case 0x200:
  812. DDPDUMP("s_w_rst\n");
  813. break;
  814. default:
  815. DDPDUMP("ovl_fsm_unknown\n");
  816. break;
  817. }
  818. }
  819. static void ovl_print_ovl_rdma_status(unsigned int status)
  820. {
  821. DDPDUMP("wram_rst_cs:0x%x,layer_greq:0x%x,out_data:0x%x,",
  822. status & 0x7, (status >> 3) & 0x1, (status >> 4) & 0xffffff);
  823. DDPDUMP("out_ready:0x%x,out_valid:0x%x,smi_busy:0x%x,smi_greq:0x%x\n",
  824. (status >> 28) & 0x1, (status >> 29) & 0x1, (status >> 30) & 0x1,
  825. (status >> 31) & 0x1);
  826. }
  827. static void ovl_dump_layer_info(int layer, unsigned long layer_offset)
  828. {
  829. 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",
  830. layer, DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_SRC_SIZE) & 0xfff,
  831. (DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_SRC_SIZE) >> 16) & 0xfff,
  832. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_OFFSET) & 0xfff,
  833. (DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_OFFSET) >> 16) & 0xfff,
  834. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_PITCH) & 0xffff,
  835. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_ADDR),
  836. ovl_intput_format_name(
  837. DISP_REG_GET_FIELD(L_CON_FLD_CFMT, DISP_REG_OVL_L0_CON+layer_offset),
  838. DISP_REG_GET_FIELD(L_CON_FLD_BTSW, DISP_REG_OVL_L0_CON+layer_offset)),
  839. (DISP_REG_GET_FIELD(L_CON_FLD_LSRC, DISP_REG_OVL_L0_CON + layer_offset) ==
  840. 0) ? "memory" : "constant_color", DISP_REG_GET_FIELD(L_CON_FLD_AEN,
  841. DISP_REG_OVL_L0_CON +
  842. layer_offset),
  843. DISP_REG_GET_FIELD(L_CON_FLD_APHA, DISP_REG_OVL_L0_CON + layer_offset)
  844. );
  845. }
  846. void ovl_dump_analysis(DISP_MODULE_ENUM module)
  847. {
  848. int i = 0;
  849. unsigned int layer_offset = 0;
  850. unsigned int rdma_offset = 0;
  851. int idx = ovl_index(module);
  852. unsigned int offset = idx * DISP_INDEX_OFFSET;
  853. unsigned int src_on = DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset);
  854. unsigned int rdma_ctrl;
  855. DDPDUMP("==DISP %s ANALYSIS==\n", ddp_get_module_name(module));
  856. DDPDUMP("ovl_en=%d,layer_enable(%d,%d,%d,%d),bg(w=%d, h=%d),",
  857. DISP_REG_GET(DISP_REG_OVL_EN + offset),
  858. DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) & 0x1,
  859. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 1) & 0x1,
  860. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 2) & 0x1,
  861. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 3) & 0x1,
  862. DISP_REG_GET(DISP_REG_OVL_ROI_SIZE + offset) & 0xfff,
  863. (DISP_REG_GET(DISP_REG_OVL_ROI_SIZE + offset) >> 16) & 0xfff);
  864. DDPDUMP("cur_pos(x=%d,y=%d),layer_hit(%d,%d,%d,%d),bg_mode=%s,sta=0x%x\n",
  865. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_X, DISP_REG_OVL_ADDCON_DBG + offset),
  866. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_Y, DISP_REG_OVL_ADDCON_DBG + offset),
  867. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L0_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  868. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L1_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  869. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L2_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  870. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L3_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  871. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_BGCLR_IN_SEL,
  872. DISP_REG_OVL_DATAPATH_CON + offset) ? "directlink" : "const",
  873. DISP_REG_GET(DISP_REG_OVL_STA + offset)
  874. );
  875. for (i = 0; i < 4; i++) {
  876. layer_offset = i * OVL_LAYER_OFFSET + offset;
  877. rdma_offset = i * OVL_RDMA_DEBUG_OFFSET + offset;
  878. if (src_on & (0x1 << i))
  879. ovl_dump_layer_info(i, layer_offset);
  880. else
  881. DDPDUMP("layer%d: disabled\n", i);
  882. rdma_ctrl = DISP_REG_GET(layer_offset + DISP_REG_OVL_RDMA0_CTRL);
  883. DDPDUMP("ovl rdma%d status:(en=%d, fifo_used %d, GMC=0x%x)\n", i,
  884. REG_FLD_VAL_GET(RDMA0_CTRL_FLD_RDMA_EN, rdma_ctrl),
  885. REG_FLD_VAL_GET(RDMA0_CTRL_FLD_RMDA_FIFO_USED_SZ, rdma_ctrl),
  886. DISP_REG_GET(layer_offset + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING));
  887. ovl_print_ovl_rdma_status(DISP_REG_GET(DISP_REG_OVL_RDMA0_DBG + rdma_offset));
  888. }
  889. ovl_printf_status(DISP_REG_GET(DISP_REG_OVL_FLOW_CTRL_DBG + offset));
  890. }
  891. static inline unsigned long ovl_layer_num(DISP_MODULE_ENUM module)
  892. {
  893. switch (module) {
  894. case DISP_MODULE_OVL0:
  895. return 4;
  896. default:
  897. DDPERR("invalid ovl module=%d\n", module);
  898. ASSERT(0);
  899. }
  900. return 0;
  901. }
  902. static int OVLConfig_l(DISP_MODULE_ENUM module, disp_ddp_path_config* pConfig, void* handle)
  903. {
  904. /*int i=0;*/
  905. int enabled_layers = 0;
  906. unsigned int local_layer = 0, global_layer = 0;
  907. int idx = ovl_index(module);
  908. if (pConfig->dst_dirty) {
  909. OVLROI(module,
  910. pConfig->dst_w, // width
  911. pConfig->dst_h, // height
  912. 0xFF000000, // background color
  913. handle);
  914. }
  915. if (!pConfig->ovl_dirty) {
  916. return 0;
  917. }
  918. for (global_layer = 0; global_layer < TOTAL_OVL_LAYER_NUM; global_layer++) {
  919. if (!(pConfig->ovl_layer_scanned & (1 << global_layer)))
  920. break;
  921. }
  922. if (global_layer > TOTAL_OVL_LAYER_NUM - ovl_layer_num(module)) {
  923. DDPERR("%s: %s scan error, layer_scanned=%u\n", __func__,
  924. ddp_get_module_name(module), pConfig->ovl_layer_scanned);
  925. ASSERT(0);
  926. }
  927. for (local_layer = 0; local_layer < ovl_layer_num(module); local_layer++, global_layer++) {
  928. OVL_CONFIG_STRUCT *ovl_cfg = &pConfig->ovl_config[global_layer];
  929. pConfig->ovl_layer_scanned |= (1 << global_layer);
  930. if (ovl_cfg->layer_en == 0)
  931. continue;
  932. if (ovl_cfg->addr==0 || ovl_cfg->dst_w==0 || ovl_cfg->dst_h==0) {
  933. DDPERR("ovl parameter invalidate, addr=0x%x, w=%d, h=%d \n",
  934. ovl_cfg->addr,
  935. ovl_cfg->dst_w,
  936. ovl_cfg->dst_h);
  937. return -1;
  938. }
  939. 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",
  940. module,
  941. local_layer,
  942. ovl_cfg->layer_en,
  943. ovl_cfg->source, // data source (0=memory)
  944. ovl_cfg->fmt,
  945. ovl_cfg->addr, // addr
  946. ovl_cfg->src_x, // x
  947. ovl_cfg->src_y, // y
  948. ovl_cfg->src_pitch, //pitch, pixel number
  949. ovl_cfg->dst_x, // x
  950. ovl_cfg->dst_y, // y
  951. ovl_cfg->dst_w, // width
  952. ovl_cfg->dst_h, // height
  953. ovl_cfg->keyEn, //color key
  954. ovl_cfg->key, //color key
  955. ovl_cfg->aen, // alpha enable
  956. ovl_cfg->alpha);
  957. OVLLayerConfig(module,
  958. local_layer,
  959. ovl_cfg->source,
  960. ovl_cfg->fmt,
  961. ovl_cfg->addr,
  962. ovl_cfg->src_x,
  963. ovl_cfg->src_y,
  964. ovl_cfg->src_pitch,
  965. ovl_cfg->dst_x,
  966. ovl_cfg->dst_y,
  967. ovl_cfg->dst_w,
  968. ovl_cfg->dst_h,
  969. ovl_cfg->keyEn,
  970. ovl_cfg->key,
  971. ovl_cfg->aen,
  972. ovl_cfg->alpha,
  973. handle);
  974. // print_layer_config_args(module, local_layer, ovl_cfg);
  975. // ovl_layer_config(module, local_layer, has_sec_layer, ovl_cfg, handle);
  976. enabled_layers |= 1 << local_layer;
  977. }
  978. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_SRC_CON, enabled_layers);
  979. return 0;
  980. }
  981. DDP_MODULE_DRIVER ddp_driver_ovl = {
  982. .module = DISP_MODULE_OVL0,
  983. .init = OVLInit,
  984. .deinit = OVLDeInit,
  985. .config = OVLConfig_l,
  986. .start = OVLStart,
  987. .trigger = NULL,
  988. .stop = OVLStop,
  989. .reset = NULL,
  990. .power_on = OVLClockOn,
  991. .power_off = OVLClockOff,
  992. .is_idle = NULL,
  993. .is_busy = NULL,
  994. .dump_info = NULL,
  995. .bypass = NULL,
  996. .build_cmdq = NULL,
  997. .set_lcm_utils = NULL,
  998. .connect = OVLConnect,
  999. };