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