ddp_ovl.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  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. * The following software/firmware and/or related documentation ("MediaTek Software")
  32. * have been modified by MediaTek Inc. All revisions are subject to any receiver\'s
  33. * applicable license agreements with MediaTek Inc.
  34. */
  35. #define LOG_TAG "OVL"
  36. #include <platform/mt_gpt.h>
  37. #include "platform/ddp_reg.h"
  38. #include "platform/ddp_matrix_para.h"
  39. #include "platform/ddp_info.h"
  40. #include "platform/ddp_log.h"
  41. #include "platform/ddp_ovl.h"
  42. #define OVL_NUM (2)
  43. #define OVL_REG_BACK_MAX (40)
  44. enum OVL_COLOR_SPACE {
  45. OVL_COLOR_SPACE_RGB = 0,
  46. OVL_COLOR_SPACE_YUV,
  47. };
  48. #define OVL_COLOR_BASE 30
  49. enum OVL_INPUT_FORMAT {
  50. OVL_INPUT_FORMAT_BGR565 = 0,
  51. OVL_INPUT_FORMAT_RGB888 = 1,
  52. OVL_INPUT_FORMAT_RGBA8888 = 2,
  53. OVL_INPUT_FORMAT_ARGB8888 = 3,
  54. OVL_INPUT_FORMAT_VYUY = 4,
  55. OVL_INPUT_FORMAT_YVYU = 5,
  56. OVL_INPUT_FORMAT_RGB565 = 6,
  57. OVL_INPUT_FORMAT_BGR888 = 7,
  58. OVL_INPUT_FORMAT_BGRA8888 = 8,
  59. OVL_INPUT_FORMAT_ABGR8888 = 9,
  60. OVL_INPUT_FORMAT_UYVY = 10,
  61. OVL_INPUT_FORMAT_YUYV = 11,
  62. OVL_INPUT_FORMAT_UNKNOWN = 32,
  63. };
  64. typedef struct {
  65. unsigned int address;
  66. unsigned int value;
  67. } OVL_REG;
  68. static int reg_back_cnt[OVL_NUM];
  69. static OVL_REG reg_back[OVL_NUM][OVL_REG_BACK_MAX];
  70. static enum OVL_INPUT_FORMAT ovl_input_fmt_convert(DpColorFormat fmt);
  71. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat);
  72. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat);
  73. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat);
  74. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat);
  75. static void ovl_store_regs(int idx);
  76. static void ovl_restore_regs(int idx,void * handle);
  77. static enum OVL_INPUT_FORMAT ovl_input_fmt_convert(DpColorFormat fmt)
  78. {
  79. enum OVL_INPUT_FORMAT ovl_fmt = OVL_INPUT_FORMAT_UNKNOWN;
  80. switch (fmt) {
  81. case eBGR565:
  82. ovl_fmt = OVL_INPUT_FORMAT_BGR565;
  83. break;
  84. case eRGB565:
  85. ovl_fmt = OVL_INPUT_FORMAT_RGB565;
  86. break;
  87. case eRGB888:
  88. ovl_fmt = OVL_INPUT_FORMAT_RGB888;
  89. break;
  90. case eBGR888:
  91. ovl_fmt = OVL_INPUT_FORMAT_BGR888;
  92. break;
  93. case eRGBA8888:
  94. ovl_fmt = OVL_INPUT_FORMAT_RGBA8888;
  95. break;
  96. case eBGRA8888:
  97. ovl_fmt = OVL_INPUT_FORMAT_BGRA8888;
  98. break;
  99. case eARGB8888:
  100. ovl_fmt = OVL_INPUT_FORMAT_ARGB8888;
  101. break;
  102. case eABGR8888:
  103. ovl_fmt = OVL_INPUT_FORMAT_ABGR8888;
  104. break;
  105. case eVYUY:
  106. ovl_fmt = OVL_INPUT_FORMAT_VYUY;
  107. break;
  108. case eYVYU:
  109. ovl_fmt = OVL_INPUT_FORMAT_YVYU;
  110. break;
  111. case eUYVY:
  112. ovl_fmt = OVL_INPUT_FORMAT_UYVY;
  113. break;
  114. case eYUY2:
  115. ovl_fmt = OVL_INPUT_FORMAT_YUYV;
  116. break;
  117. default:
  118. DDPERR("ovl_fmt_convert fmt=%d, ovl_fmt=%d\n", fmt, ovl_fmt);
  119. break;
  120. }
  121. return ovl_fmt;
  122. }
  123. static DpColorFormat ovl_input_fmt(enum OVL_INPUT_FORMAT fmt, int swap)
  124. {
  125. switch (fmt) {
  126. case OVL_INPUT_FORMAT_BGR565:
  127. return swap ? eBGR565 : eRGB565;
  128. case OVL_INPUT_FORMAT_RGB888:
  129. return swap ? eRGB888 : eBGR888;
  130. case OVL_INPUT_FORMAT_RGBA8888:
  131. return swap ? eRGBA8888 : eBGRA8888;
  132. case OVL_INPUT_FORMAT_ARGB8888:
  133. return swap ? eARGB8888 : eABGR8888;
  134. case OVL_INPUT_FORMAT_VYUY:
  135. return swap ? eVYUY : eUYVY;
  136. case OVL_INPUT_FORMAT_YVYU:
  137. return swap ? eYVYU : eYUY2;
  138. default:
  139. DDPERR("ovl_input_fmt fmt=%d, swap=%d\n", fmt, swap);
  140. break;
  141. }
  142. return eRGB888;
  143. }
  144. static char *ovl_intput_format_name(enum OVL_INPUT_FORMAT fmt, int swap)
  145. {
  146. switch (fmt) {
  147. case OVL_INPUT_FORMAT_BGR565:
  148. return swap ? "eBGR565" : "eRGB565";
  149. case OVL_INPUT_FORMAT_RGB565:
  150. return "eRGB565";
  151. case OVL_INPUT_FORMAT_RGB888:
  152. return swap ? "eRGB888" : "eBGR888";
  153. case OVL_INPUT_FORMAT_BGR888:
  154. return "eBGR888";
  155. case OVL_INPUT_FORMAT_RGBA8888:
  156. return swap ? "eRGBA8888" : "eBGRA8888";
  157. case OVL_INPUT_FORMAT_BGRA8888:
  158. return "eBGRA8888";
  159. case OVL_INPUT_FORMAT_ARGB8888:
  160. return swap ? "eARGB8888" : "eABGR8888";
  161. case OVL_INPUT_FORMAT_ABGR8888:
  162. return "eABGR8888";
  163. case OVL_INPUT_FORMAT_VYUY:
  164. return swap ? "eVYUY" : "eUYVY";
  165. case OVL_INPUT_FORMAT_UYVY:
  166. return "eUYVY";
  167. case OVL_INPUT_FORMAT_YVYU:
  168. return swap ? "eYVYU" : "eYUY2";
  169. case OVL_INPUT_FORMAT_YUYV:
  170. return "eYUY2";
  171. default:
  172. DDPERR("ovl_intput_fmt unknow fmt=%d, swap=%d\n", fmt, swap);
  173. break;
  174. }
  175. return "unknow";
  176. }
  177. static unsigned int ovl_index(DISP_MODULE_ENUM module)
  178. {
  179. int idx = 0;
  180. switch (module) {
  181. case DISP_MODULE_OVL0:
  182. idx = 0;
  183. break;
  184. case DISP_MODULE_OVL1:
  185. idx = 1;
  186. break;
  187. default:
  188. DDPERR("invalid module=%d \n", module);// invalid module
  189. ASSERT(0);
  190. }
  191. return idx;
  192. }
  193. int OVLStart(DISP_MODULE_ENUM module,void * handle)
  194. {
  195. int idx = ovl_index(module);
  196. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x0E);
  197. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_EN, 0x01);
  198. DISP_REG_SET_FIELD(handle,DATAPATH_CON_FLD_LAYER_SMI_ID_EN,
  199. idx*DISP_INDEX_OFFSET+DISP_REG_OVL_DATAPATH_CON,0x1);
  200. return 0;
  201. }
  202. int OVLStop(DISP_MODULE_ENUM module,void * handle)
  203. {
  204. int idx = ovl_index(module);
  205. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  206. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_EN, 0x00);
  207. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTSTA, 0x00);
  208. return 0;
  209. }
  210. int OVLReset(DISP_MODULE_ENUM module,void * handle)
  211. {
  212. #define OVL_IDLE (0x3)
  213. unsigned int delay_cnt = 0;
  214. int idx = ovl_index(module);
  215. /*always use cpu do reset*/
  216. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x1); // soft reset
  217. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x0);
  218. while (!(DISP_REG_GET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_FLOW_CTRL_DBG) & OVL_IDLE)) {
  219. delay_cnt++;
  220. udelay(10);
  221. if (delay_cnt>2000) {
  222. DDPERR("OVL%dReset() timeout! \n",idx);
  223. break;
  224. }
  225. }
  226. return 0;
  227. }
  228. int OVLROI(DISP_MODULE_ENUM module,
  229. unsigned int bgW,
  230. unsigned int bgH,
  231. unsigned int bgColor,
  232. void * handle)
  233. {
  234. int idx = ovl_index(module);
  235. if ((bgW > OVL_MAX_WIDTH) || (bgH > OVL_MAX_HEIGHT)) {
  236. DDPERR("OVLROI(), exceed OVL max size, w=%d, h=%d \n", bgW, bgH);
  237. ASSERT(0);
  238. }
  239. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_SIZE, bgH<<16 | bgW);
  240. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_BGCLR, bgColor);
  241. return 0;
  242. }
  243. int OVLLayerSwitch(DISP_MODULE_ENUM module,
  244. unsigned layer,
  245. unsigned int en,
  246. void * handle)
  247. {
  248. int idx = ovl_index(module);
  249. ASSERT(layer<=3);
  250. switch (layer) {
  251. case 0:
  252. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L0_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  253. break;
  254. case 1:
  255. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L1_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  256. break;
  257. case 2:
  258. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L2_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  259. break;
  260. case 3:
  261. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L3_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  262. break;
  263. default:
  264. DDPERR("invalid layer=%d\n", layer); // invalid layer
  265. ASSERT(0);
  266. }
  267. return 0;
  268. }
  269. int OVL3DConfig(DISP_MODULE_ENUM module,
  270. unsigned int layer_id,
  271. unsigned int en_3d,
  272. unsigned int landscape,
  273. unsigned int r_first,
  274. void *handle)
  275. {
  276. return 0;
  277. }
  278. int OVLLayerConfig(DISP_MODULE_ENUM module,
  279. unsigned int layer,
  280. unsigned int source,
  281. DpColorFormat format,
  282. unsigned int addr,
  283. unsigned int src_x, // ROI x offset
  284. unsigned int src_y, // ROI y offset
  285. unsigned int src_pitch,
  286. unsigned int dst_x, // ROI x offset
  287. unsigned int dst_y, // ROI y offset
  288. unsigned int dst_w, // ROT width
  289. unsigned int dst_h, // ROI height
  290. unsigned int keyEn,
  291. unsigned int key, // color key
  292. unsigned int aen, // alpha enable
  293. unsigned char alpha,
  294. void * handle)
  295. {
  296. int idx = ovl_index(module);
  297. unsigned int value = 0;
  298. enum OVL_INPUT_FORMAT fmt = ovl_input_fmt_convert(format);
  299. unsigned int bpp = ovl_input_fmt_bpp(fmt);
  300. unsigned int input_swap = ovl_input_fmt_byte_swap(fmt);
  301. unsigned int input_fmt = ovl_input_fmt_reg_value(fmt);
  302. enum OVL_COLOR_SPACE space = ovl_input_fmt_color_space(fmt);
  303. /*0100 MTX_JPEG_TO_RGB (YUV FUll TO RGB)*/
  304. int color_matrix = 0x4;
  305. unsigned int idx_offset = idx*DISP_INDEX_OFFSET;
  306. unsigned int layer_offset = idx_offset + layer * 0x20;
  307. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  308. unsigned int bg_h, bg_w;
  309. #endif
  310. ASSERT((dst_w <= OVL_MAX_WIDTH) &&
  311. (dst_h <= OVL_MAX_HEIGHT) &&
  312. (layer <= 3));
  313. if (addr == 0) {
  314. DDPERR("source from memory, but addr is 0!\n");
  315. ASSERT(0);
  316. }
  317. DDPDBG("ovl%d, layer=%d, source=%s, off(x=%d, y=%d), dst(%d, %d, %d, %d),pitch=%d,"
  318. "fmt=%s, addr=%x, keyEn=%d, key=%d, aen=%d, alpha=%d \n",
  319. idx,
  320. layer,
  321. (source==0)?"memory":"constant_color",
  322. src_x,
  323. src_y,
  324. dst_x,
  325. dst_y,
  326. dst_w,
  327. dst_h,
  328. src_pitch,
  329. ovl_intput_format_name(fmt, input_swap),
  330. addr,
  331. keyEn,
  332. key,
  333. aen,
  334. alpha);
  335. if (source==OVL_LAYER_SOURCE_RESERVED) { //==1, means constant color
  336. if (aen==0) {
  337. DDPERR("dim layer ahpha enable should be 1!\n");
  338. }
  339. if (fmt!=OVL_INPUT_FORMAT_RGB565) {
  340. DDPERR("dim layer format should be RGB565");
  341. fmt = OVL_INPUT_FORMAT_RGB565;
  342. }
  343. }
  344. DISP_REG_SET(handle, DISP_REG_OVL_RDMA0_CTRL+layer_offset, 0x1);
  345. value = (REG_FLD_VAL((L_CON_FLD_LARC), (source)) |
  346. REG_FLD_VAL((L_CON_FLD_CFMT), (input_fmt)) |
  347. REG_FLD_VAL((L_CON_FLD_AEN), (aen)) |
  348. REG_FLD_VAL((L_CON_FLD_APHA), (alpha)) |
  349. REG_FLD_VAL((L_CON_FLD_SKEN), (keyEn)) |
  350. REG_FLD_VAL((L_CON_FLD_BTSW), (input_swap)));
  351. if (space == OVL_COLOR_SPACE_YUV)
  352. value = value | REG_FLD_VAL((L_CON_FLD_MTX), (color_matrix));
  353. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  354. value |= 0x600;
  355. #endif
  356. DISP_REG_SET(handle, DISP_REG_OVL_L0_CON+layer_offset, value);
  357. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRC_SIZE+layer_offset,
  358. dst_h<<16 | dst_w);
  359. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  360. bg_h = DISP_REG_GET(idx_offset + DISP_REG_OVL_ROI_SIZE);
  361. bg_w = bg_h & 0xFFFF;
  362. bg_h = bg_h >> 16;
  363. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset, ((bg_h-dst_h-dst_y)<<16)|(bg_w-dst_w-dst_x));
  364. #else
  365. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  366. dst_y<<16 | dst_x);
  367. #endif
  368. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  369. DISP_REG_SET(handle, DISP_REG_OVL_L0_ADDR+layer_offset,
  370. addr+src_pitch*(dst_h+src_y-1)+(src_x+dst_w)*bpp-1);
  371. #else
  372. DISP_REG_SET(handle, DISP_REG_OVL_L0_ADDR+layer_offset,
  373. addr+src_x*bpp+src_y*src_pitch);
  374. #endif
  375. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRCKEY+layer_offset,
  376. key);
  377. value = (REG_FLD_VAL((L_PITCH_FLD_SUR_ALFA), (value)) |
  378. REG_FLD_VAL((L_PITCH_FLD_LSP), (src_pitch)));
  379. DISP_REG_SET(handle, DISP_REG_OVL_L0_PITCH+layer_offset, value);
  380. DISP_REG_SET(handle, DISP_REG_OVL_RDMA0_MEM_GMC_SETTING+layer_offset, 0x6070);
  381. return 0;
  382. }
  383. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat)
  384. {
  385. int input_swap = 0;
  386. switch (inputFormat) {
  387. case OVL_INPUT_FORMAT_BGR565:
  388. case OVL_INPUT_FORMAT_RGB888:
  389. case OVL_INPUT_FORMAT_RGBA8888:
  390. case OVL_INPUT_FORMAT_ARGB8888:
  391. case OVL_INPUT_FORMAT_VYUY:
  392. case OVL_INPUT_FORMAT_YVYU:
  393. input_swap = 1;
  394. break;
  395. case OVL_INPUT_FORMAT_RGB565:
  396. case OVL_INPUT_FORMAT_BGR888:
  397. case OVL_INPUT_FORMAT_BGRA8888:
  398. case OVL_INPUT_FORMAT_ABGR8888:
  399. case OVL_INPUT_FORMAT_UYVY:
  400. case OVL_INPUT_FORMAT_YUYV:
  401. input_swap = 0;
  402. break;
  403. default:
  404. DDPERR("unknow input ovl format is %d\n", inputFormat);
  405. ASSERT(0);
  406. }
  407. return input_swap;
  408. }
  409. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat)
  410. {
  411. int bpp = 0;
  412. switch (inputFormat) {
  413. case OVL_INPUT_FORMAT_BGR565:
  414. case OVL_INPUT_FORMAT_RGB565:
  415. case OVL_INPUT_FORMAT_VYUY:
  416. case OVL_INPUT_FORMAT_UYVY:
  417. case OVL_INPUT_FORMAT_YVYU:
  418. case OVL_INPUT_FORMAT_YUYV:
  419. bpp = 2;
  420. break;
  421. case OVL_INPUT_FORMAT_RGB888:
  422. case OVL_INPUT_FORMAT_BGR888:
  423. bpp = 3;
  424. break;
  425. case OVL_INPUT_FORMAT_RGBA8888:
  426. case OVL_INPUT_FORMAT_BGRA8888:
  427. case OVL_INPUT_FORMAT_ARGB8888:
  428. case OVL_INPUT_FORMAT_ABGR8888:
  429. bpp = 4;
  430. break;
  431. default:
  432. DDPERR("unknown ovl input format = %d\n", inputFormat);
  433. ASSERT(0);
  434. }
  435. return bpp;
  436. }
  437. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat)
  438. {
  439. enum OVL_COLOR_SPACE space = OVL_COLOR_SPACE_RGB;
  440. switch (inputFormat) {
  441. case OVL_INPUT_FORMAT_BGR565:
  442. case OVL_INPUT_FORMAT_RGB565:
  443. case OVL_INPUT_FORMAT_RGB888:
  444. case OVL_INPUT_FORMAT_BGR888:
  445. case OVL_INPUT_FORMAT_RGBA8888:
  446. case OVL_INPUT_FORMAT_BGRA8888:
  447. case OVL_INPUT_FORMAT_ARGB8888:
  448. case OVL_INPUT_FORMAT_ABGR8888:
  449. space = OVL_COLOR_SPACE_RGB;
  450. break;
  451. case OVL_INPUT_FORMAT_VYUY:
  452. case OVL_INPUT_FORMAT_UYVY:
  453. case OVL_INPUT_FORMAT_YVYU:
  454. case OVL_INPUT_FORMAT_YUYV:
  455. space = OVL_COLOR_SPACE_YUV;
  456. break;
  457. default:
  458. DDPERR("unknown ovl input format = %d\n", inputFormat);
  459. ASSERT(0);
  460. }
  461. return space;
  462. }
  463. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat)
  464. {
  465. int reg_value = 0;
  466. switch (inputFormat) {
  467. case OVL_INPUT_FORMAT_BGR565:
  468. case OVL_INPUT_FORMAT_RGB565:
  469. reg_value = 0x0;
  470. break;
  471. case OVL_INPUT_FORMAT_RGB888:
  472. case OVL_INPUT_FORMAT_BGR888:
  473. reg_value = 0x1;
  474. break;
  475. case OVL_INPUT_FORMAT_RGBA8888:
  476. case OVL_INPUT_FORMAT_BGRA8888:
  477. reg_value = 0x2;
  478. break;
  479. case OVL_INPUT_FORMAT_ARGB8888:
  480. case OVL_INPUT_FORMAT_ABGR8888:
  481. reg_value = 0x3;
  482. break;
  483. case OVL_INPUT_FORMAT_VYUY:
  484. case OVL_INPUT_FORMAT_UYVY:
  485. reg_value = 0x4;
  486. break;
  487. case OVL_INPUT_FORMAT_YVYU:
  488. case OVL_INPUT_FORMAT_YUYV:
  489. reg_value = 0x5;
  490. break;
  491. default:
  492. DDPERR("unknow ovl input format is %d\n", inputFormat);
  493. ASSERT(0);
  494. }
  495. return reg_value;
  496. }
  497. void OVLRegStore(DISP_MODULE_ENUM module)
  498. {
  499. int i =0;
  500. int idx = ovl_index(module);
  501. static const unsigned int regs[] = {
  502. //start
  503. DISP_REG_OVL_INTEN , DISP_REG_OVL_EN ,DISP_REG_OVL_DATAPATH_CON,
  504. // roi
  505. DISP_REG_OVL_ROI_SIZE , DISP_REG_OVL_ROI_BGCLR ,
  506. //layers enable
  507. DISP_REG_OVL_SRC_CON,
  508. //layer0
  509. DISP_REG_OVL_RDMA0_CTRL , DISP_REG_OVL_L0_CON ,DISP_REG_OVL_L0_SRC_SIZE,
  510. DISP_REG_OVL_L0_OFFSET , DISP_REG_OVL_L0_ADDR ,DISP_REG_OVL_L0_PITCH,
  511. DISP_REG_OVL_L0_SRCKEY ,
  512. //layer1
  513. DISP_REG_OVL_RDMA1_CTRL , DISP_REG_OVL_L1_CON ,DISP_REG_OVL_L1_SRC_SIZE,
  514. DISP_REG_OVL_L1_OFFSET , DISP_REG_OVL_L1_ADDR ,DISP_REG_OVL_L1_PITCH,
  515. DISP_REG_OVL_L1_SRCKEY ,
  516. //layer2
  517. DISP_REG_OVL_RDMA2_CTRL , DISP_REG_OVL_L2_CON ,DISP_REG_OVL_L2_SRC_SIZE,
  518. DISP_REG_OVL_L2_OFFSET , DISP_REG_OVL_L2_ADDR ,DISP_REG_OVL_L2_PITCH,
  519. DISP_REG_OVL_L2_SRCKEY ,
  520. //layer3
  521. DISP_REG_OVL_RDMA3_CTRL , DISP_REG_OVL_L3_CON ,DISP_REG_OVL_L3_SRC_SIZE,
  522. DISP_REG_OVL_L3_OFFSET , DISP_REG_OVL_L3_ADDR ,DISP_REG_OVL_L3_PITCH,
  523. DISP_REG_OVL_L3_SRCKEY ,
  524. };
  525. reg_back_cnt[idx] = sizeof(regs)/sizeof(unsigned int);
  526. ASSERT(reg_back_cnt[idx] <= OVL_REG_BACK_MAX);
  527. for (i =0; i< reg_back_cnt[idx]; i++) {
  528. reg_back[idx][i].address = regs[i];
  529. reg_back[idx][i].value = DISP_REG_GET(regs[i]);
  530. }
  531. DDPDBG("store %d cnt registers on ovl %d",reg_back_cnt[idx],idx);
  532. }
  533. void OVLRegRestore(DISP_MODULE_ENUM module,void * handle)
  534. {
  535. int idx = ovl_index(module);
  536. int i = reg_back_cnt[idx];
  537. while (i > 0) {
  538. i--;
  539. DISP_REG_SET(handle,reg_back[idx][i].address, reg_back[idx][i].value);
  540. }
  541. DDPDBG("restore %d cnt registers on ovl %d",reg_back_cnt[idx],idx);
  542. reg_back_cnt[idx] = 0;
  543. }
  544. int OVLClockOn(DISP_MODULE_ENUM module,void * handle)
  545. {
  546. int idx = ovl_index(module);
  547. ddp_enable_module_clock(module);
  548. DDPMSG("OVL%dClockOn CG 0x%x \n",idx, DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  549. return 0;
  550. }
  551. int OVLClockOff(DISP_MODULE_ENUM module,void * handle)
  552. {
  553. int idx = ovl_index(module);
  554. DDPMSG("OVL%dClockOff\n",idx);
  555. //store registers
  556. // OVLRegRestore(module,handle);
  557. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x00);
  558. OVLReset(module,handle);
  559. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  560. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_INTSTA, 0x00);
  561. ddp_disable_module_clock(module);
  562. return 0;
  563. }
  564. int OVLInit(DISP_MODULE_ENUM module,void * handle)
  565. {
  566. //power on, no need to care clock
  567. int idx = ovl_index(module);
  568. ddp_enable_module_clock(module);
  569. DDPMSG("OVL%dInit open CG 0x%x \n",idx, DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  570. return 0;
  571. }
  572. int OVLDeInit(DISP_MODULE_ENUM module,void * handle)
  573. {
  574. int idx = ovl_index(module);
  575. DDPMSG("OVL%dDeInit close CG \n",idx);
  576. ddp_disable_module_clock(module);
  577. return 0;
  578. }
  579. void OVLDump(DISP_MODULE_ENUM module)
  580. {
  581. int idx = ovl_index(module);
  582. DDPMSG("== DISP OVL%d ==\n", idx);
  583. DDPMSG("(0x000)O_STA =0x%x\n", DISP_REG_GET(DISP_REG_OVL_STA+DISP_INDEX_OFFSET*idx));
  584. DDPMSG("(0x004)O_INTEN =0x%x\n", DISP_REG_GET(DISP_REG_OVL_INTEN+DISP_INDEX_OFFSET*idx));
  585. DDPMSG("(0x008)O_INTSTA =0x%x\n", DISP_REG_GET(DISP_REG_OVL_INTSTA+DISP_INDEX_OFFSET*idx));
  586. DDPMSG("(0x00c)O_EN =0x%x\n", DISP_REG_GET(DISP_REG_OVL_EN+DISP_INDEX_OFFSET*idx));
  587. DDPMSG("(0x010)O_TRIG =0x%x\n", DISP_REG_GET(DISP_REG_OVL_TRIG+DISP_INDEX_OFFSET*idx));
  588. DDPMSG("(0x014)O_RST =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RST+DISP_INDEX_OFFSET*idx));
  589. DDPMSG("(0x020)O_ROI_SIZE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_ROI_SIZE+DISP_INDEX_OFFSET*idx));
  590. DDPMSG("(0x024)O_PATH_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_DATAPATH_CON+DISP_INDEX_OFFSET*idx));
  591. DDPMSG("(0x028)O_ROI_BGCLR =0x%x\n", DISP_REG_GET(DISP_REG_OVL_ROI_BGCLR+DISP_INDEX_OFFSET*idx));
  592. DDPMSG("(0x02c)O_SRC_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_SRC_CON+DISP_INDEX_OFFSET*idx));
  593. if (DISP_REG_GET(DISP_REG_OVL_SRC_CON+DISP_INDEX_OFFSET*idx)&0x1) {
  594. DDPMSG("(0x030)O0_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_CON+DISP_INDEX_OFFSET*idx));
  595. DDPMSG("(0x034)O0_SRCKEY =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_SRCKEY+DISP_INDEX_OFFSET*idx));
  596. DDPMSG("(0x038)O0_SRC_SIZE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_SRC_SIZE+DISP_INDEX_OFFSET*idx));
  597. DDPMSG("(0x03c)O0_OFFSET =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_OFFSET+DISP_INDEX_OFFSET*idx));
  598. DDPMSG("(0xf40)O0_ADDR =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_ADDR+DISP_INDEX_OFFSET*idx));
  599. DDPMSG("(0x044)O0_PITCH =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_PITCH+DISP_INDEX_OFFSET*idx));
  600. DDPMSG("(0x048)O0_TILE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L0_TILE+DISP_INDEX_OFFSET*idx));
  601. DDPMSG("(0x0c0)O0_R_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA0_CTRL+DISP_INDEX_OFFSET*idx));
  602. DDPMSG("(0x0c8)O0_R_M_GMC_SET1 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA0_MEM_GMC_SETTING+DISP_INDEX_OFFSET*idx));
  603. DDPMSG("(0x0cc)O0_R_M_SLOW_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA0_MEM_SLOW_CON+DISP_INDEX_OFFSET*idx));
  604. DDPMSG("(0x0d0)O0_R_FIFO_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA0_FIFO_CTRL+DISP_INDEX_OFFSET*idx));
  605. //DDPMSG("(0x1e0)O0_R_M_GMC_SET2 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA0_MEM_GMC_SETTING2+DISP_INDEX_OFFSET*idx));
  606. DDPMSG("(0x24c)O0_R_DBG =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA0_DBG+DISP_INDEX_OFFSET*idx));
  607. }
  608. if (DISP_REG_GET(DISP_REG_OVL_SRC_CON+DISP_INDEX_OFFSET*idx)&0x2) {
  609. DDPMSG("(0x050)O1_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_CON+DISP_INDEX_OFFSET*idx));
  610. DDPMSG("(0x054)O1_SRCKEY =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_SRCKEY+DISP_INDEX_OFFSET*idx));
  611. DDPMSG("(0x058)O1_SRC_SIZE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_SRC_SIZE+DISP_INDEX_OFFSET*idx));
  612. DDPMSG("(0x05c)O1_OFFSET =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_OFFSET+DISP_INDEX_OFFSET*idx));
  613. DDPMSG("(0xf60)O1_ADDR =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_ADDR+DISP_INDEX_OFFSET*idx));
  614. DDPMSG("(0x064)O1_PITCH =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_PITCH+DISP_INDEX_OFFSET*idx));
  615. DDPMSG("(0x068)O1_TILE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L1_TILE+DISP_INDEX_OFFSET*idx));
  616. DDPMSG("(0x0e0)O1_R_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA1_CTRL+DISP_INDEX_OFFSET*idx));
  617. DDPMSG("(0x0e8)O1_R_M_GMC_SET1 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA1_MEM_GMC_SETTING+DISP_INDEX_OFFSET*idx));
  618. DDPMSG("(0x0ec)O1_R_M_SLOW_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA1_MEM_SLOW_CON+DISP_INDEX_OFFSET*idx));
  619. DDPMSG("(0x0f0)O1_R_FIFO_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA1_FIFO_CTRL+DISP_INDEX_OFFSET*idx));
  620. //DDPMSG("(0x1e4)O1_R_M_GMC_SET2 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA1_MEM_GMC_SETTING2+DISP_INDEX_OFFSET*idx));
  621. DDPMSG("(0x250)O1_R_DBG =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA1_DBG+DISP_INDEX_OFFSET*idx));
  622. }
  623. if (DISP_REG_GET(DISP_REG_OVL_SRC_CON+DISP_INDEX_OFFSET*idx)&0x4) {
  624. DDPMSG("(0x070)O2_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_CON+DISP_INDEX_OFFSET*idx));
  625. DDPMSG("(0x074)O2_SRCKEY =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_SRCKEY+DISP_INDEX_OFFSET*idx));
  626. DDPMSG("(0x078)O2_SRC_SIZE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_SRC_SIZE+DISP_INDEX_OFFSET*idx));
  627. DDPMSG("(0x07c)O2_OFFSET =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_OFFSET+DISP_INDEX_OFFSET*idx));
  628. DDPMSG("(0xf80)O2_ADDR =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_ADDR+DISP_INDEX_OFFSET*idx));
  629. DDPMSG("(0x084)O2_PITCH =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_PITCH+DISP_INDEX_OFFSET*idx));
  630. DDPMSG("(0x088)O2_TILE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L2_TILE+DISP_INDEX_OFFSET*idx));
  631. DDPMSG("(0x100)O2_R_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA2_CTRL+DISP_INDEX_OFFSET*idx));
  632. DDPMSG("(0x108)O2_R_M_GMC_SET1 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA2_MEM_GMC_SETTING+DISP_INDEX_OFFSET*idx));
  633. DDPMSG("(0x10c)O2_R_M_SLOW_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA2_MEM_SLOW_CON+DISP_INDEX_OFFSET*idx));
  634. DDPMSG("(0x110)O2_R_FIFO_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA2_FIFO_CTRL+DISP_INDEX_OFFSET*idx));
  635. //DDPMSG("(0x1e8)O2_R_M_GMC_SET2 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA2_MEM_GMC_SETTING2+DISP_INDEX_OFFSET*idx));
  636. DDPMSG("(0x254)O2_R_DBG =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA2_DBG+DISP_INDEX_OFFSET*idx));
  637. }
  638. if (DISP_REG_GET(DISP_REG_OVL_SRC_CON+DISP_INDEX_OFFSET*idx)&0x8) {
  639. DDPMSG("(0x090)O3_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_CON+DISP_INDEX_OFFSET*idx));
  640. DDPMSG("(0x094)O3_SRCKEY =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_SRCKEY+DISP_INDEX_OFFSET*idx));
  641. DDPMSG("(0x098)O3_SRC_SIZE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_SRC_SIZE+DISP_INDEX_OFFSET*idx));
  642. DDPMSG("(0x09c)O3_OFFSET =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_OFFSET+DISP_INDEX_OFFSET*idx));
  643. DDPMSG("(0xfa0)O3_ADDR =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_ADDR+DISP_INDEX_OFFSET*idx));
  644. DDPMSG("(0x0a4)O3_PITCH =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_PITCH+DISP_INDEX_OFFSET*idx));
  645. DDPMSG("(0x0a8)O3_TILE =0x%x\n", DISP_REG_GET(DISP_REG_OVL_L3_TILE+DISP_INDEX_OFFSET*idx));
  646. DDPMSG("(0x120)O3_R_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA3_CTRL+DISP_INDEX_OFFSET*idx));
  647. DDPMSG("(0x128)O3_R_M_GMC_SET1 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA3_MEM_GMC_SETTING+DISP_INDEX_OFFSET*idx));
  648. DDPMSG("(0x12c)O3_R_M_SLOW_CON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA3_MEM_SLOW_CON+DISP_INDEX_OFFSET*idx));
  649. DDPMSG("(0x130)O3_R_FIFO_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA3_FIFO_CTRL+DISP_INDEX_OFFSET*idx));
  650. //DDPMSG("(0x1ec)O3_R_M_GMC_SET2 =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA3_MEM_GMC_SETTING2+DISP_INDEX_OFFSET*idx));
  651. DDPMSG("(0x258)O3_R_DBG =0x%x\n", DISP_REG_GET(DISP_REG_OVL_RDMA3_DBG+DISP_INDEX_OFFSET*idx));
  652. }
  653. DDPMSG("(0x1d4)O_DBG_MON_SEL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_DEBUG_MON_SEL+DISP_INDEX_OFFSET*idx));
  654. DDPMSG("(0x200)O_DUMMY_REG =0x%x\n", DISP_REG_GET(DISP_REG_OVL_DUMMY_REG+DISP_INDEX_OFFSET*idx));
  655. DDPMSG("(0x240)O_FLOW_CTRL =0x%x\n", DISP_REG_GET(DISP_REG_OVL_FLOW_CTRL_DBG+DISP_INDEX_OFFSET*idx));
  656. DDPMSG("(0x244)O_ADDCON =0x%x\n", DISP_REG_GET(DISP_REG_OVL_ADDCON_DBG+DISP_INDEX_OFFSET*idx));
  657. }
  658. void ovl_dump_analysis(DISP_MODULE_ENUM module)
  659. {
  660. int i = 0;
  661. unsigned int layer_offset = 0;
  662. int index = (module==DISP_MODULE_OVL0)?0:1;
  663. unsigned int offset = index*DISP_INDEX_OFFSET;
  664. unsigned int src_on = DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset);
  665. DDPMSG("==DISP OVL%d ANALYSIS==\n", index);
  666. DDPMSG("ovl_en=%d,layer_enable(%d,%d,%d,%d),bg(w=%d, h=%d),"
  667. "cur_pos(x=%d,y=%d),layer_hit(%d,%d,%d,%d)\n",
  668. DISP_REG_GET(DISP_REG_OVL_EN+offset),
  669. DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset)&0x1,
  670. (DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset)>>1)&0x1,
  671. (DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset)>>2)&0x1,
  672. (DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset)>>3)&0x1,
  673. DISP_REG_GET(DISP_REG_OVL_ROI_SIZE+offset)&0xfff,
  674. (DISP_REG_GET(DISP_REG_OVL_ROI_SIZE+offset)>>16)&0xfff,
  675. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_X, DISP_REG_OVL_ADDCON_DBG+offset),
  676. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_Y, DISP_REG_OVL_ADDCON_DBG+offset),
  677. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L0_WIN_HIT, DISP_REG_OVL_ADDCON_DBG+offset),
  678. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L1_WIN_HIT, DISP_REG_OVL_ADDCON_DBG+offset),
  679. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L2_WIN_HIT, DISP_REG_OVL_ADDCON_DBG+offset),
  680. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L3_WIN_HIT, DISP_REG_OVL_ADDCON_DBG+offset)
  681. );
  682. for (i = 0; i < 4; i++) {
  683. layer_offset = i * 0x20 + offset;
  684. if (src_on & (0x1<<i)) {
  685. DDPMSG("layer%d: w=%d,h=%d,off(x=%d,y=%d),pitch=%d,addr=0x%x,fmt=%s, source=%s\n",
  686. i,
  687. DISP_REG_GET(layer_offset+DISP_REG_OVL_L0_SRC_SIZE)&0xfff,
  688. (DISP_REG_GET(layer_offset+DISP_REG_OVL_L0_SRC_SIZE)>>16)&0xfff,
  689. DISP_REG_GET(layer_offset+DISP_REG_OVL_L0_OFFSET)&0xfff,
  690. (DISP_REG_GET(layer_offset+DISP_REG_OVL_L0_OFFSET)>>16)&0xfff,
  691. DISP_REG_GET(layer_offset+DISP_REG_OVL_L0_PITCH)&0xffff,
  692. DISP_REG_GET(layer_offset+DISP_REG_OVL_L0_ADDR),
  693. ovl_intput_format_name(
  694. DISP_REG_GET_FIELD(L_CON_FLD_CFMT, DISP_REG_OVL_L0_CON+layer_offset),
  695. DISP_REG_GET_FIELD(L_CON_FLD_BTSW, DISP_REG_OVL_L0_CON+layer_offset)),
  696. (DISP_REG_GET_FIELD(L_CON_FLD_LARC, DISP_REG_OVL_L0_CON+layer_offset)==0)?"memory":"constant_color"
  697. );
  698. DDPMSG("ovl rdma%d status:(en %d)\n", i, DISP_REG_GET(layer_offset+DISP_REG_OVL_RDMA0_CTRL));
  699. }
  700. }
  701. return;
  702. }
  703. static int OVLConfig_l(DISP_MODULE_ENUM module, disp_ddp_path_config* pConfig, void* handle)
  704. {
  705. int i=0;
  706. if (pConfig->dst_dirty) {
  707. OVLROI(module,
  708. pConfig->dst_w, // width
  709. pConfig->dst_h, // height
  710. 0x00000000, // background color
  711. handle);
  712. }
  713. if (!pConfig->ovl_dirty) {
  714. return 0;
  715. }
  716. for (i=0; i<OVL_LAYER_NUM; i++) {
  717. OVLLayerSwitch(module, i , pConfig->ovl_config[i].layer_en,handle);
  718. if (pConfig->ovl_config[i].layer_en!=0) {
  719. if (pConfig->ovl_config[i].addr==0 ||
  720. pConfig->ovl_config[i].dst_w==0 ||
  721. pConfig->ovl_config[i].dst_h==0 ) {
  722. DDPERR("ovl parameter invalidate, addr=0x%x, w=%d, h=%d \n",
  723. pConfig->ovl_config[i].addr,
  724. pConfig->ovl_config[i].dst_w,
  725. pConfig->ovl_config[i].dst_h);
  726. return -1;
  727. }
  728. 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 ",
  729. module,
  730. i,
  731. pConfig->ovl_config[i].layer_en,
  732. pConfig->ovl_config[i].source, // data source (0=memory)
  733. pConfig->ovl_config[i].fmt,
  734. pConfig->ovl_config[i].addr, // addr
  735. pConfig->ovl_config[i].src_x, // x
  736. pConfig->ovl_config[i].src_y, // y
  737. pConfig->ovl_config[i].src_pitch, //pitch, pixel number
  738. pConfig->ovl_config[i].dst_x, // x
  739. pConfig->ovl_config[i].dst_y, // y
  740. pConfig->ovl_config[i].dst_w, // width
  741. pConfig->ovl_config[i].dst_h, // height
  742. pConfig->ovl_config[i].keyEn, //color key
  743. pConfig->ovl_config[i].key, //color key
  744. pConfig->ovl_config[i].aen, // alpha enable
  745. pConfig->ovl_config[i].alpha);
  746. OVLLayerConfig(module,
  747. i,
  748. pConfig->ovl_config[i].source,
  749. pConfig->ovl_config[i].fmt,
  750. pConfig->ovl_config[i].addr,
  751. pConfig->ovl_config[i].src_x,
  752. pConfig->ovl_config[i].src_y,
  753. pConfig->ovl_config[i].src_pitch,
  754. pConfig->ovl_config[i].dst_x,
  755. pConfig->ovl_config[i].dst_y,
  756. pConfig->ovl_config[i].dst_w,
  757. pConfig->ovl_config[i].dst_h,
  758. pConfig->ovl_config[i].keyEn,
  759. pConfig->ovl_config[i].key,
  760. pConfig->ovl_config[i].aen,
  761. pConfig->ovl_config[i].alpha,
  762. handle);
  763. } else {
  764. #if 0
  765. DDPDBG("module %d, layer=%d disable\n", module, pConfig->ovl_config[i].layer);
  766. OVLLayerConfig(module,
  767. i,
  768. OVL_LAYER_SOURCE_MEM, // data source (0=memory)
  769. eRGB888, //fmt
  770. 1, // addr
  771. 0, // x
  772. 0, // y
  773. 0, //pitch, pixel number
  774. 0, // x
  775. 0, // y
  776. 0, // width
  777. 0, // height
  778. 0, //color key
  779. 0, //color key
  780. 0, // alpha enable
  781. 0, // alpha
  782. handle);
  783. #endif
  784. }
  785. }
  786. return 0;
  787. }
  788. DDP_MODULE_DRIVER ddp_driver_ovl = {
  789. .module = DISP_MODULE_OVL0,
  790. .init = OVLInit,
  791. .deinit = OVLDeInit,
  792. .config = OVLConfig_l,
  793. .start = OVLStart,
  794. .trigger = NULL,
  795. .stop = OVLStop,
  796. .reset = NULL,
  797. .power_on = OVLClockOn,
  798. .power_off = OVLClockOff,
  799. .is_idle = NULL,
  800. .is_busy = NULL,
  801. .dump_info = NULL,
  802. .bypass = NULL,
  803. .build_cmdq = NULL,
  804. .set_lcm_utils = NULL,
  805. };