ddp_ovl.c 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598
  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. #include "platform/mt_gpt.h"
  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. unsigned long ovl_base_addr(DISP_MODULE_ENUM module)
  129. {
  130. switch (module) {
  131. case DISP_MODULE_OVL0:
  132. return DISPSYS_OVL0_BASE;
  133. case DISP_MODULE_OVL0_2L:
  134. return DISPSYS_OVL0_2L_BASE;
  135. default:
  136. return 0;
  137. }
  138. }
  139. unsigned long mmsys_ovl_ultra_offset(DISP_MODULE_ENUM module)
  140. {
  141. switch (module) {
  142. case DISP_MODULE_OVL0:
  143. return FLD_OVL0_ULTRA_SEL;
  144. case DISP_MODULE_OVL0_2L:
  145. return FLD_OVL0_2L_ULTRA_SEL;
  146. default:
  147. return 0;
  148. }
  149. return 0;
  150. }
  151. static DpColorFormat ovl_input_fmt(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_RGB888:
  157. return swap ? eRGB888 : eBGR888;
  158. case OVL_INPUT_FORMAT_RGBA8888:
  159. return swap ? eRGBA8888 : eBGRA8888;
  160. case OVL_INPUT_FORMAT_ARGB8888:
  161. return swap ? eARGB8888 : eABGR8888;
  162. case OVL_INPUT_FORMAT_VYUY:
  163. return swap ? eVYUY : eUYVY;
  164. case OVL_INPUT_FORMAT_YVYU:
  165. return swap ? eYVYU : eYUY2;
  166. case OVL_INPUT_FORMAT_RGBA4444:
  167. return swap ? eRGBA4444 : eBGRA4444;
  168. default:
  169. DDPERR("ovl_input_fmt fmt=%d, swap=%d\n", fmt, swap);
  170. break;
  171. }
  172. return eRGB888;
  173. }
  174. static char *ovl_intput_format_name(enum OVL_INPUT_FORMAT fmt, int swap)
  175. {
  176. switch (fmt) {
  177. case OVL_INPUT_FORMAT_BGR565:
  178. return swap ? "eBGR565" : "eRGB565";
  179. case OVL_INPUT_FORMAT_RGB565:
  180. return "eRGB565";
  181. case OVL_INPUT_FORMAT_RGB888:
  182. return swap ? "eRGB888" : "eBGR888";
  183. case OVL_INPUT_FORMAT_BGR888:
  184. return "eBGR888";
  185. case OVL_INPUT_FORMAT_RGBA8888:
  186. return swap ? "eRGBA8888" : "eBGRA8888";
  187. case OVL_INPUT_FORMAT_BGRA8888:
  188. return "eBGRA8888";
  189. case OVL_INPUT_FORMAT_ARGB8888:
  190. return swap ? "eARGB8888" : "eABGR8888";
  191. case OVL_INPUT_FORMAT_ABGR8888:
  192. return "eABGR8888";
  193. case OVL_INPUT_FORMAT_VYUY:
  194. return swap ? "eVYUY" : "eUYVY";
  195. case OVL_INPUT_FORMAT_UYVY:
  196. return "eUYVY";
  197. case OVL_INPUT_FORMAT_YVYU:
  198. return swap ? "eYVYU" : "eYUY2";
  199. case OVL_INPUT_FORMAT_YUYV:
  200. return "eYUY2";
  201. case OVL_INPUT_FORMAT_RGBA4444:
  202. return swap ? "eRGBA4444" : "eBGRA4444";
  203. default:
  204. DDPERR("ovl_intput_fmt unknow fmt=%d, swap=%d\n", fmt, swap);
  205. break;
  206. }
  207. return "unknow";
  208. }
  209. static unsigned int ovl_index(DISP_MODULE_ENUM module)
  210. {
  211. int idx = 0;
  212. switch (module) {
  213. case DISP_MODULE_OVL0:
  214. idx = 0;
  215. break;
  216. case DISP_MODULE_OVL0_2L:
  217. idx = 1;
  218. break;
  219. default:
  220. DDPERR("invalid module=%d \n", module);// invalid module
  221. ASSERT(0);
  222. }
  223. return idx;
  224. }
  225. int OVLStart(DISP_MODULE_ENUM module, void *handle)
  226. {
  227. int idx = ovl_index(module);
  228. DISP_REG_SET_FIELD(handle, EN_FLD_OVL_EN, idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x1);
  229. DISP_REG_SET(handle, idx*DISP_INDEX_OFFSET + DISP_REG_OVL_INTEN,
  230. 0x1E | REG_FLD_VAL(INTEN_FLD_ABNORMAL_SOF, 1));
  231. DISP_REG_SET_FIELD(handle, FLD_RDMA_BURST_CON1_BURST16_EN,
  232. idx * DISP_INDEX_OFFSET +
  233. DISP_REG_OVL_RDMA_BURST_CON1, 1);
  234. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_LAYER_SMI_ID_EN,
  235. idx * DISP_INDEX_OFFSET +
  236. DISP_REG_OVL_DATAPATH_CON, 1);
  237. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_GCLAST_EN,
  238. idx * DISP_INDEX_OFFSET +
  239. DISP_REG_OVL_DATAPATH_CON, 1);
  240. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_OUTPUT_CLAMP,
  241. idx * DISP_INDEX_OFFSET +
  242. DISP_REG_OVL_DATAPATH_CON, 1);
  243. /* DISP_REG_SET_FIELD(handle, FLD_FBDC_8XE_MODE,
  244. idx * DISP_INDEX_OFFSET +
  245. DISP_REG_OVL_FBDC_CFG1, 1);
  246. */
  247. #if 0
  248. dprintf(CRITICAL, "ovl start done idx = %d, addr = 0x%x\n", idx, idx*DISP_INDEX_OFFSET + DISP_REG_OVL_EN);
  249. dprintf(CRITICAL, "ovl start done addr0 = 0x%x\n", DISP_INDEX_OFFSET);
  250. dprintf(CRITICAL, "ovl start done addr1 = 0x%x\n", idx*DISP_INDEX_OFFSET);
  251. dprintf(CRITICAL, "ovl start done addr2 = 0x%x\n", DISP_REG_OVL_EN);
  252. dprintf(CRITICAL, "ovl start done addr3 = 0x%x\n", (idx*DISP_INDEX_OFFSET) + DISP_REG_OVL_EN);
  253. dprintf(CRITICAL, "ovl start done addr4 = 0x%x\n", idx*DISP_INDEX_OFFSET+DISP_REG_OVL_EN);
  254. #endif
  255. return 0;
  256. }
  257. int OVLStop(DISP_MODULE_ENUM module, void *handle)
  258. {
  259. int idx = ovl_index(module);
  260. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  261. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_EN, 0x00);
  262. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTSTA, 0x00);
  263. return 0;
  264. }
  265. int OVLReset(DISP_MODULE_ENUM module, void *handle)
  266. {
  267. #define OVL_IDLE (0x3)
  268. unsigned int delay_cnt = 0;
  269. int idx = ovl_index(module);
  270. /*always use cpu do reset*/
  271. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x1); // soft reset
  272. DISP_CPU_REG_SET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_RST, 0x0);
  273. while (!(DISP_REG_GET(idx*DISP_INDEX_OFFSET+DISP_REG_OVL_FLOW_CTRL_DBG) & OVL_IDLE)) {
  274. delay_cnt++;
  275. udelay(10);
  276. if (delay_cnt>2000) {
  277. DDPERR("OVL%dReset() timeout! \n",idx);
  278. break;
  279. }
  280. }
  281. return 0;
  282. }
  283. int OVLROI(DISP_MODULE_ENUM module,
  284. unsigned int bgW,
  285. unsigned int bgH,
  286. unsigned int bgColor,
  287. void * handle)
  288. {
  289. int idx = ovl_index(module);
  290. if ((bgW > OVL_MAX_WIDTH) || (bgH > OVL_MAX_HEIGHT)) {
  291. DDPERR("OVLROI(), exceed OVL max size, w=%d, h=%d \n", bgW, bgH);
  292. ASSERT(0);
  293. }
  294. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_SIZE, bgH<<16 | bgW);
  295. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_ROI_BGCLR, bgColor);
  296. return 0;
  297. }
  298. int OVLLayerSwitch(DISP_MODULE_ENUM module,
  299. unsigned layer,
  300. unsigned int en,
  301. void * handle)
  302. {
  303. int idx = ovl_index(module);
  304. ASSERT(layer<=3);
  305. switch (layer) {
  306. case 0:
  307. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L0_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  308. break;
  309. case 1:
  310. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L1_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  311. break;
  312. case 2:
  313. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L2_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  314. break;
  315. case 3:
  316. DISP_REG_SET_FIELD(handle,SRC_CON_FLD_L3_EN, idx*DISP_INDEX_OFFSET+DISP_REG_OVL_SRC_CON, en);
  317. break;
  318. default:
  319. DDPERR("invalid layer=%d\n", layer); // invalid layer
  320. ASSERT(0);
  321. }
  322. return 0;
  323. }
  324. int OVL3DConfig(DISP_MODULE_ENUM module,
  325. unsigned int layer_id,
  326. unsigned int en_3d,
  327. unsigned int landscape,
  328. unsigned int r_first,
  329. void *handle)
  330. {
  331. return 0;
  332. }
  333. int OVLLayerConfig(DISP_MODULE_ENUM module,
  334. unsigned int layer,
  335. unsigned int source,
  336. DpColorFormat format,
  337. unsigned int addr,
  338. unsigned int src_x, // ROI x offset
  339. unsigned int src_y, // ROI y offset
  340. unsigned int src_pitch,
  341. unsigned int dst_x, // ROI x offset
  342. unsigned int dst_y, // ROI y offset
  343. unsigned int dst_w, // ROT width
  344. unsigned int dst_h, // ROI height
  345. unsigned int keyEn,
  346. unsigned int key, // color key
  347. unsigned int aen, // alpha enable
  348. unsigned char alpha,
  349. void * handle)
  350. {
  351. int idx = ovl_index(module);
  352. unsigned int value = 0;
  353. enum OVL_INPUT_FORMAT fmt = ovl_input_fmt_convert(format);
  354. unsigned int bpp = ovl_input_fmt_bpp(fmt);
  355. unsigned int input_swap = ovl_input_fmt_byte_swap(fmt);
  356. unsigned int input_fmt = ovl_input_fmt_reg_value(fmt);
  357. enum OVL_COLOR_SPACE space = ovl_input_fmt_color_space(fmt);
  358. unsigned int offset = 0;
  359. /*0100 MTX_JPEG_TO_RGB (YUV FUll TO RGB)*/
  360. int color_matrix = 0x4;
  361. unsigned int idx_offset = idx*DISP_INDEX_OFFSET;
  362. unsigned int layer_offset = idx_offset + layer * 0x20;
  363. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  364. unsigned int bg_h, bg_w;
  365. #endif
  366. ASSERT((dst_w <= OVL_MAX_WIDTH) &&
  367. (dst_h <= OVL_MAX_HEIGHT) &&
  368. (layer <= 3));
  369. if (addr == 0) {
  370. DDPERR("source from memory, but addr is 0!\n");
  371. ASSERT(0);
  372. }
  373. DDPDBG("ovl%d, layer=%d, source=%s, off(x=%d, y=%d), dst(%d, %d, %d, %d),pitch=%d,"
  374. "fmt=%s, addr=%x, keyEn=%d, key=%d, aen=%d, alpha=%d \n",
  375. idx,
  376. layer,
  377. (source==0)?"memory":"constant_color",
  378. src_x,
  379. src_y,
  380. dst_x,
  381. dst_y,
  382. dst_w,
  383. dst_h,
  384. src_pitch,
  385. ovl_intput_format_name(fmt, input_swap),
  386. addr,
  387. keyEn,
  388. key,
  389. aen,
  390. alpha);
  391. if (source==OVL_LAYER_SOURCE_RESERVED) { //==1, means constant color
  392. if (aen==0) {
  393. DDPERR("dim layer ahpha enable should be 1!\n");
  394. }
  395. if (fmt!=OVL_INPUT_FORMAT_RGB565) {
  396. DDPERR("dim layer format should be RGB565");
  397. fmt = OVL_INPUT_FORMAT_RGB565;
  398. }
  399. }
  400. DISP_REG_SET(handle, DISP_REG_OVL_RDMA0_CTRL+layer_offset, 0x1);
  401. value = (REG_FLD_VAL((L_CON_FLD_LARC), (source)) |
  402. REG_FLD_VAL((L_CON_FLD_CFMT), (input_fmt)) |
  403. REG_FLD_VAL((L_CON_FLD_AEN), (aen)) |
  404. REG_FLD_VAL((L_CON_FLD_APHA), (alpha)) |
  405. REG_FLD_VAL((L_CON_FLD_SKEN), (keyEn)) |
  406. REG_FLD_VAL((L_CON_FLD_BTSW), (input_swap)));
  407. if (fmt == OVL_INPUT_FORMAT_RGBA4444)
  408. value |= REG_FLD_VAL((L_CON_FLD_CLRFMT_MAN), (1));
  409. if (space == OVL_COLOR_SPACE_YUV)
  410. value = value | REG_FLD_VAL((L_CON_FLD_MTX), (color_matrix));
  411. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  412. value |= (REG_FLD_VAL((L_CON_FLD_VIRTICAL_FLIP), 1) |
  413. REG_FLD_VAL((L_CON_FLD_HORI_FLIP), 1));
  414. #endif
  415. DISP_REG_SET(handle, DISP_REG_OVL_L0_CON+layer_offset, value);
  416. #ifdef MTK_LCM_PHYSICAL_ROTATION_HW
  417. bg_h = DISP_REG_GET(idx_offset + DISP_REG_OVL_ROI_SIZE);
  418. bg_w = bg_h & 0xFFFF;
  419. bg_h = bg_h >> 16;
  420. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  421. (bg_h-dst_h-dst_y)<<16 | (bg_w-dst_w-dst_x));
  422. offset = (src_x+dst_w)*bpp + (src_y+dst_h-1)*src_pitch - 1;
  423. #else
  424. DISP_REG_SET(handle, DISP_REG_OVL_L0_OFFSET+layer_offset,
  425. dst_y<<16 | dst_x);
  426. offset = src_x*bpp+src_y*src_pitch;
  427. #endif
  428. DISP_REG_SET(handle, DISP_REG_OVL_L0_ADDR+layer_offset,
  429. addr+offset);
  430. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRC_SIZE+layer_offset,
  431. dst_h<<16 | dst_w);
  432. DISP_REG_SET(handle, DISP_REG_OVL_L0_SRCKEY+layer_offset,
  433. key);
  434. value = REG_FLD_VAL((L_PITCH_FLD_LSP), (src_pitch));
  435. if (fmt == OVL_INPUT_FORMAT_RGBA4444) {
  436. value |= REG_FLD_VAL(L_PITCH_FLD_SRGB_SEL, (1)) |
  437. REG_FLD_VAL(L_PITCH_FLD_DRGB_SEL, (2)) |
  438. REG_FLD_VAL(L_PITCH_FLD_SURFL_EN, (1));
  439. }
  440. DISP_REG_SET(handle, DISP_REG_OVL_L0_PITCH+layer_offset, value);
  441. return 0;
  442. }
  443. static unsigned int ovl_input_fmt_byte_swap(enum OVL_INPUT_FORMAT inputFormat)
  444. {
  445. int input_swap = 0;
  446. switch (inputFormat) {
  447. case OVL_INPUT_FORMAT_BGR565:
  448. case OVL_INPUT_FORMAT_RGB888:
  449. case OVL_INPUT_FORMAT_RGBA8888:
  450. case OVL_INPUT_FORMAT_ARGB8888:
  451. case OVL_INPUT_FORMAT_BGRA4444:
  452. case OVL_INPUT_FORMAT_VYUY:
  453. case OVL_INPUT_FORMAT_YVYU:
  454. input_swap = 1;
  455. break;
  456. case OVL_INPUT_FORMAT_RGB565:
  457. case OVL_INPUT_FORMAT_BGR888:
  458. case OVL_INPUT_FORMAT_BGRA8888:
  459. case OVL_INPUT_FORMAT_ABGR8888:
  460. case OVL_INPUT_FORMAT_RGBA4444:
  461. case OVL_INPUT_FORMAT_UYVY:
  462. case OVL_INPUT_FORMAT_YUYV:
  463. input_swap = 0;
  464. break;
  465. default:
  466. DDPERR("unknow input ovl format is %d\n", inputFormat);
  467. ASSERT(0);
  468. }
  469. return input_swap;
  470. }
  471. static unsigned int ovl_input_fmt_bpp(enum OVL_INPUT_FORMAT inputFormat)
  472. {
  473. int bpp = 0;
  474. switch (inputFormat) {
  475. case OVL_INPUT_FORMAT_BGR565:
  476. case OVL_INPUT_FORMAT_RGB565:
  477. case OVL_INPUT_FORMAT_VYUY:
  478. case OVL_INPUT_FORMAT_UYVY:
  479. case OVL_INPUT_FORMAT_YVYU:
  480. case OVL_INPUT_FORMAT_YUYV:
  481. case OVL_INPUT_FORMAT_RGBA4444:
  482. case OVL_INPUT_FORMAT_BGRA4444:
  483. bpp = 2;
  484. break;
  485. case OVL_INPUT_FORMAT_RGB888:
  486. case OVL_INPUT_FORMAT_BGR888:
  487. bpp = 3;
  488. break;
  489. case OVL_INPUT_FORMAT_RGBA8888:
  490. case OVL_INPUT_FORMAT_BGRA8888:
  491. case OVL_INPUT_FORMAT_ARGB8888:
  492. case OVL_INPUT_FORMAT_ABGR8888:
  493. bpp = 4;
  494. break;
  495. default:
  496. DDPERR("unknown ovl input format = %d\n", inputFormat);
  497. ASSERT(0);
  498. }
  499. return bpp;
  500. }
  501. static enum OVL_COLOR_SPACE ovl_input_fmt_color_space(enum OVL_INPUT_FORMAT inputFormat)
  502. {
  503. enum OVL_COLOR_SPACE space = OVL_COLOR_SPACE_RGB;
  504. switch (inputFormat) {
  505. case OVL_INPUT_FORMAT_BGR565:
  506. case OVL_INPUT_FORMAT_RGB565:
  507. case OVL_INPUT_FORMAT_RGB888:
  508. case OVL_INPUT_FORMAT_BGR888:
  509. case OVL_INPUT_FORMAT_BGRA4444:
  510. case OVL_INPUT_FORMAT_RGBA4444:
  511. case OVL_INPUT_FORMAT_RGBA8888:
  512. case OVL_INPUT_FORMAT_BGRA8888:
  513. case OVL_INPUT_FORMAT_ARGB8888:
  514. case OVL_INPUT_FORMAT_ABGR8888:
  515. space = OVL_COLOR_SPACE_RGB;
  516. break;
  517. case OVL_INPUT_FORMAT_VYUY:
  518. case OVL_INPUT_FORMAT_UYVY:
  519. case OVL_INPUT_FORMAT_YVYU:
  520. case OVL_INPUT_FORMAT_YUYV:
  521. space = OVL_COLOR_SPACE_YUV;
  522. break;
  523. default:
  524. DDPERR("unknown ovl input format = %d\n", inputFormat);
  525. ASSERT(0);
  526. }
  527. return space;
  528. }
  529. static unsigned int ovl_input_fmt_reg_value(enum OVL_INPUT_FORMAT inputFormat)
  530. {
  531. int reg_value = 0;
  532. switch (inputFormat) {
  533. case OVL_INPUT_FORMAT_BGR565:
  534. case OVL_INPUT_FORMAT_RGB565:
  535. reg_value = 0x0;
  536. break;
  537. case OVL_INPUT_FORMAT_RGB888:
  538. case OVL_INPUT_FORMAT_BGR888:
  539. reg_value = 0x1;
  540. break;
  541. case OVL_INPUT_FORMAT_RGBA8888:
  542. case OVL_INPUT_FORMAT_BGRA8888:
  543. reg_value = 0x2;
  544. break;
  545. case OVL_INPUT_FORMAT_ARGB8888:
  546. case OVL_INPUT_FORMAT_ABGR8888:
  547. reg_value = 0x3;
  548. break;
  549. case OVL_INPUT_FORMAT_VYUY:
  550. case OVL_INPUT_FORMAT_UYVY:
  551. case OVL_INPUT_FORMAT_RGBA4444:
  552. case OVL_INPUT_FORMAT_BGRA4444:
  553. reg_value = 0x4;
  554. break;
  555. case OVL_INPUT_FORMAT_YVYU:
  556. case OVL_INPUT_FORMAT_YUYV:
  557. reg_value = 0x5;
  558. break;
  559. default:
  560. DDPERR("unknow ovl input format is %d\n", inputFormat);
  561. ASSERT(0);
  562. }
  563. return reg_value;
  564. }
  565. void OVLRegStore(DISP_MODULE_ENUM module)
  566. {
  567. int i =0;
  568. int idx = ovl_index(module);
  569. const unsigned int regs[] = {
  570. //start
  571. DISP_REG_OVL_INTEN , DISP_REG_OVL_EN ,DISP_REG_OVL_DATAPATH_CON,
  572. // roi
  573. DISP_REG_OVL_ROI_SIZE , DISP_REG_OVL_ROI_BGCLR ,
  574. //layers enable
  575. DISP_REG_OVL_SRC_CON,
  576. //layer0
  577. DISP_REG_OVL_RDMA0_CTRL , DISP_REG_OVL_L0_CON ,DISP_REG_OVL_L0_SRC_SIZE,
  578. DISP_REG_OVL_L0_OFFSET , DISP_REG_OVL_L0_ADDR ,DISP_REG_OVL_L0_PITCH,
  579. DISP_REG_OVL_L0_SRCKEY ,
  580. //layer1
  581. DISP_REG_OVL_RDMA1_CTRL , DISP_REG_OVL_L1_CON ,DISP_REG_OVL_L1_SRC_SIZE,
  582. DISP_REG_OVL_L1_OFFSET , DISP_REG_OVL_L1_ADDR ,DISP_REG_OVL_L1_PITCH,
  583. DISP_REG_OVL_L1_SRCKEY ,
  584. //layer2
  585. DISP_REG_OVL_RDMA2_CTRL , DISP_REG_OVL_L2_CON ,DISP_REG_OVL_L2_SRC_SIZE,
  586. DISP_REG_OVL_L2_OFFSET , DISP_REG_OVL_L2_ADDR ,DISP_REG_OVL_L2_PITCH,
  587. DISP_REG_OVL_L2_SRCKEY ,
  588. //layer3
  589. DISP_REG_OVL_RDMA3_CTRL , DISP_REG_OVL_L3_CON ,DISP_REG_OVL_L3_SRC_SIZE,
  590. DISP_REG_OVL_L3_OFFSET , DISP_REG_OVL_L3_ADDR ,DISP_REG_OVL_L3_PITCH,
  591. DISP_REG_OVL_L3_SRCKEY ,
  592. };
  593. reg_back_cnt[idx] = sizeof(regs)/sizeof(unsigned int);
  594. ASSERT(reg_back_cnt[idx] <= OVL_REG_BACK_MAX);
  595. for (i =0; i< reg_back_cnt[idx]; i++) {
  596. reg_back[idx][i].address = regs[i];
  597. reg_back[idx][i].value = DISP_REG_GET(regs[i]);
  598. }
  599. DDPDBG("store %c cnt registers on ovl %d",reg_back_cnt[idx],idx);
  600. }
  601. void OVLRegRestore(DISP_MODULE_ENUM module,void * handle)
  602. {
  603. int idx = ovl_index(module);
  604. int i = reg_back_cnt[idx];
  605. while (i > 0) {
  606. i--;
  607. DISP_REG_SET(handle,reg_back[idx][i].address, reg_back[idx][i].value);
  608. }
  609. DDPDBG("restore %d cnt registers on ovl %d",reg_back_cnt[idx],idx);
  610. reg_back_cnt[idx] = 0;
  611. }
  612. int OVLClockOn(DISP_MODULE_ENUM module,void * handle)
  613. {
  614. int idx = ovl_index(module);
  615. ddp_enable_module_clock(module);
  616. DDPMSG("OVL%dClockOn CG 0x%x \n",idx, DISP_REG_GET(DISP_REG_CONFIG_MMSYS_CG_CON0));
  617. return 0;
  618. }
  619. int OVLClockOff(DISP_MODULE_ENUM module,void * handle)
  620. {
  621. int idx = ovl_index(module);
  622. DDPMSG("OVL%dClockOff\n",idx);
  623. //store registers
  624. // OVLRegRestore(module,handle);
  625. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_EN, 0x00);
  626. OVLReset(module,handle);
  627. DISP_REG_SET(handle,idx*DISP_INDEX_OFFSET+DISP_REG_OVL_INTEN, 0x00);
  628. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_INTSTA, 0x00);
  629. ddp_disable_module_clock(module);
  630. return 0;
  631. }
  632. int OVLInit(DISP_MODULE_ENUM module,void * handle)
  633. {
  634. //power on, no need to care clock
  635. ddp_enable_module_clock(module);
  636. return 0;
  637. }
  638. int OVLDeInit(DISP_MODULE_ENUM module,void * handle)
  639. {
  640. int idx = ovl_index(module);
  641. DDPMSG("OVL%dDeInit close CG \n",idx);
  642. ddp_disable_module_clock(module);
  643. return 0;
  644. }
  645. static inline int is_module_ovl(DISP_MODULE_ENUM module)
  646. {
  647. if (module == DISP_MODULE_OVL0 ||
  648. module == DISP_MODULE_OVL0_2L)
  649. return 1;
  650. else
  651. return 0;
  652. }
  653. int OVLConnect(DISP_MODULE_ENUM module, DISP_MODULE_ENUM prev,
  654. DISP_MODULE_ENUM next, int connect, void *handle)
  655. {
  656. int idx = ovl_index(module);
  657. if (connect && is_module_ovl(prev))
  658. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_BGCLR_IN_SEL,
  659. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 1);
  660. else
  661. DISP_REG_SET_FIELD(handle, DATAPATH_CON_FLD_BGCLR_IN_SEL,
  662. idx * DISP_INDEX_OFFSET + DISP_REG_OVL_DATAPATH_CON, 0);
  663. if (connect && is_module_ovl(next)) {
  664. switch (module) {
  665. case DISP_MODULE_OVL0:
  666. DISP_REG_SET_FIELD(handle, FLD_CON_OVL0, DISP_REG_CONFIG_MMSYS_OVL_CON, 0x2);
  667. break;
  668. case DISP_MODULE_OVL0_2L:
  669. DISP_REG_SET_FIELD(handle, FLD_CON_OVL0_2L, DISP_REG_CONFIG_MMSYS_OVL_CON, 0x2);
  670. break;
  671. default:
  672. DDPERR("invalid module=%d \n", module);// invalid module
  673. ASSERT(0);
  674. }
  675. } else {
  676. switch (module) {
  677. case DISP_MODULE_OVL0:
  678. DISP_REG_SET_FIELD(handle, FLD_CON_OVL0, DISP_REG_CONFIG_MMSYS_OVL_CON, 0x1);
  679. break;
  680. case DISP_MODULE_OVL0_2L:
  681. DISP_REG_SET_FIELD(handle, FLD_CON_OVL0_2L, DISP_REG_CONFIG_MMSYS_OVL_CON, 0x1);
  682. break;
  683. default:
  684. DDPERR("invalid module=%d \n", module);// invalid module
  685. ASSERT(0);
  686. }
  687. }
  688. return 0;
  689. }
  690. void ovl_dump_golden_setting(DISP_MODULE_ENUM module)
  691. {
  692. unsigned long base = ovl_base_addr(module);
  693. base -= DISPSYS_OVL0_BASE;
  694. DDPDUMP("-- %s Golden Setting --\n", ddp_get_module_name(module));
  695. DDPDUMP("RDMA0_MEM_GMC_SETTING1\n");
  696. DDPDUMP("[9:0]:%x [25:16]:%x [28]:%x [31]:%x\n",
  697. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC_ULTRA_THRESHOLD,
  698. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  699. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC_PRE_ULTRA_THRESHOLD,
  700. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  701. DISP_REG_GET_FIELD(
  702. FLD_OVL_RDMA_MEM_GMC_ULTRA_THRESHOLD_HIGH_OFS,
  703. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING),
  704. DISP_REG_GET_FIELD(
  705. FLD_OVL_RDMA_MEM_GMC_PRE_ULTRA_THRESHOLD_HIGH_OFS,
  706. base + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING));
  707. DDPDUMP("RDMA0_FIFO_CTRL\n");
  708. DDPDUMP("[9:0]:%u [25:16]:%u\n",
  709. DISP_REG_GET_FIELD(FLD_OVL_RDMA_FIFO_THRD,
  710. base + DISP_REG_OVL_RDMA0_FIFO_CTRL),
  711. DISP_REG_GET_FIELD(FLD_OVL_RDMA_FIFO_SIZE,
  712. base + DISP_REG_OVL_RDMA0_FIFO_CTRL));
  713. DDPDUMP("RDMA0_MEM_GMC_SETTING2\n");
  714. DDPDUMP("[11:0]:%u [27:16]:%u [28]:%u [29]:%u [30]:%u\n",
  715. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_ISSUE_REQ_THRES,
  716. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  717. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_ISSUE_REQ_THRES_URG,
  718. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  719. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_REQ_THRES_PREULTRA,
  720. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  721. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_REQ_THRES_ULTRA,
  722. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2),
  723. DISP_REG_GET_FIELD(FLD_OVL_RDMA_MEM_GMC2_FORCE_REQ_THRES,
  724. base + DISP_REG_OVL_RDMA0_MEM_GMC_S2));
  725. DDPDUMP("OVL_RDMA_BURST_CON1\n");
  726. DDPDUMP("[28]:%u\n",
  727. DISP_REG_GET_FIELD(FLD_RDMA_BURST_CON1_BURST16_EN,
  728. base + DISP_REG_OVL_RDMA_BURST_CON1));
  729. DDPDUMP("RDMA_GREQ_NUM\n");
  730. DDPDUMP("[3:0]%u [7:4]%u [11:8]%u [15:12]%u [23:16]%x [26:24]%u\n",
  731. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER0_GREQ_NUM,
  732. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  733. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER1_GREQ_NUM,
  734. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  735. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER2_GREQ_NUM,
  736. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  737. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER3_GREQ_NUM,
  738. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  739. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_OSTD_GREQ_NUM,
  740. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  741. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_GREQ_DIS_CNT,
  742. base + DISP_REG_OVL_RDMA_GREQ_NUM));
  743. DDPDUMP("[27]%u [28]%u [29]%u [30]%u [31]%u\n",
  744. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_STOP_EN,
  745. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  746. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_GRP_END_STOP,
  747. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  748. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_GRP_BRK_STOP,
  749. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  750. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_IOBUF_FLUSH_PREULTRA,
  751. base + DISP_REG_OVL_RDMA_GREQ_NUM),
  752. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_IOBUF_FLUSH_ULTRA,
  753. base + DISP_REG_OVL_RDMA_GREQ_NUM));
  754. DDPDUMP("RDMA_GREQ_URG_NUM\n");
  755. DDPDUMP("[3:0]:%u [7:4]:%u [11:8]:%u [15:12]:%u [25:16]:%u [28]:%u\n",
  756. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER0_GREQ_URG_NUM,
  757. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  758. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER1_GREQ_URG_NUM,
  759. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  760. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER2_GREQ_URG_NUM,
  761. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  762. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_LAYER3_GREQ_URG_NUM,
  763. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  764. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_ARG_GREQ_URG_TH,
  765. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM),
  766. DISP_REG_GET_FIELD(FLD_OVL_RDMA_GREQ_ARG_URG_BIAS,
  767. base + DISP_REG_OVL_RDMA_GREQ_URG_NUM));
  768. DDPDUMP("RDMA_ULTRA_SRC\n");
  769. DDPDUMP("[1:0]%u [3:2]%u [5:4]%u [7:6]%u [9:8]%u\n",
  770. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_BUF_SRC,
  771. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  772. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_SMI_SRC,
  773. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  774. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_ROI_END_SRC,
  775. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  776. DISP_REG_GET_FIELD(FLD_OVL_RDMA_PREULTRA_RDMA_SRC,
  777. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  778. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_BUF_SRC,
  779. base + DISP_REG_OVL_RDMA_ULTRA_SRC));
  780. DDPDUMP("[11:10]%u [13:12]%u [15:14]%u\n",
  781. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_SMI_SRC,
  782. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  783. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_ROI_END_SRC,
  784. base + DISP_REG_OVL_RDMA_ULTRA_SRC),
  785. DISP_REG_GET_FIELD(FLD_OVL_RDMA_ULTRA_RDMA_SRC,
  786. base + DISP_REG_OVL_RDMA_ULTRA_SRC));
  787. DDPDUMP("RDMA0_BUF_LOW\n");
  788. DDPDUMP("[11:0]:%x [23:12]:%x\n",
  789. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_LOW_ULTRA_TH,
  790. base + DISP_REG_OVL_RDMAn_BUF_LOW(0)),
  791. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_LOW_PREULTRA_TH,
  792. base + DISP_REG_OVL_RDMAn_BUF_LOW(0)));
  793. DDPDUMP("RDMA0_BUF_HIGH\n");
  794. DDPDUMP("[23:12]:%x [31]:%x\n",
  795. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_HIGH_PREULTRA_TH,
  796. base + DISP_REG_OVL_RDMAn_BUF_HIGH(0)),
  797. DISP_REG_GET_FIELD(FLD_OVL_RDMA_BUF_HIGH_PREULTRA_DIS,
  798. base + DISP_REG_OVL_RDMAn_BUF_HIGH(0)));
  799. DDPDUMP("OVL_EN\n");
  800. DDPDUMP("[18]:%x [19]:%x\n",
  801. DISP_REG_GET_FIELD(EN_FLD_BLOCK_EXT_ULTRA,
  802. base + DISP_REG_OVL_EN),
  803. DISP_REG_GET_FIELD(EN_FLD_BLOCK_EXT_PREULTRA,
  804. base + DISP_REG_OVL_EN));
  805. DDPDUMP("DATAPATH_CON\n");
  806. DDPDUMP("[0]:%u, [3]:%u [24]:%u [25]:%u [26]:%u\n",
  807. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_LAYER_SMI_ID_EN,
  808. base + DISP_REG_OVL_DATAPATH_CON),
  809. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_OUTPUT_NO_RND,
  810. base + DISP_REG_OVL_DATAPATH_CON),
  811. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_GCLAST_EN,
  812. base + DISP_REG_OVL_DATAPATH_CON),
  813. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_HDR_GCLAST_EN,
  814. base + DISP_REG_OVL_DATAPATH_CON),
  815. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_OUTPUT_CLAMP,
  816. base + DISP_REG_OVL_DATAPATH_CON));
  817. DDPDUMP("OVL_FBDC_CFG1\n");
  818. DDPDUMP("[24]:%u\n", DISP_REG_GET_FIELD(FLD_FBDC_8XE_MODE,
  819. base + DISP_REG_OVL_FBDC_CFG1));
  820. }
  821. void OVLDump(DISP_MODULE_ENUM module)
  822. {
  823. int idx = ovl_index(module);
  824. unsigned long module_base = 0;
  825. const char *module_name = ddp_get_module_name(module);
  826. module_base = idx * DISP_INDEX_OFFSET + DISP_OVL0_OVL_STA;
  827. DDPDUMP("== START: DISP %s registers ==\n", module_name);
  828. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  829. module_name,
  830. 0x0, INREG32(module_base + 0x0),
  831. 0x4, INREG32(module_base + 0x4),
  832. 0x8, INREG32(module_base + 0x8),
  833. 0xC, INREG32(module_base + 0xC));
  834. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  835. module_name,
  836. 0x10, INREG32(module_base + 0x10),
  837. 0x14, INREG32(module_base + 0x14),
  838. 0x20, INREG32(module_base + 0x20),
  839. 0x24, INREG32(module_base + 0x24));
  840. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  841. module_name,
  842. 0x28, INREG32(module_base + 0x28),
  843. 0x2C, INREG32(module_base + 0x2C),
  844. 0x30, INREG32(module_base + 0x30),
  845. 0x34, INREG32(module_base + 0x34));
  846. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  847. module_name,
  848. 0x38, INREG32(module_base + 0x38),
  849. 0x3C, INREG32(module_base + 0x3C),
  850. 0xF40, INREG32(module_base + 0xF40),
  851. 0x44, INREG32(module_base + 0x44));
  852. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  853. module_name,
  854. 0x48, INREG32(module_base + 0x48),
  855. 0x4C, INREG32(module_base + 0x4C),
  856. 0x50, INREG32(module_base + 0x50),
  857. 0x54, INREG32(module_base + 0x54));
  858. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  859. module_name,
  860. 0x58, INREG32(module_base + 0x58),
  861. 0x5C, INREG32(module_base + 0x5C),
  862. 0xF60, INREG32(module_base + 0xF60),
  863. 0x64, INREG32(module_base + 0x64));
  864. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  865. module_name,
  866. 0x68, INREG32(module_base + 0x68),
  867. 0x6C, INREG32(module_base + 0x6C),
  868. 0x70, INREG32(module_base + 0x70),
  869. 0x74, INREG32(module_base + 0x74));
  870. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  871. module_name,
  872. 0x78, INREG32(module_base + 0x78),
  873. 0x7C, INREG32(module_base + 0x7C),
  874. 0xF80, INREG32(module_base + 0xF80),
  875. 0x84, INREG32(module_base + 0x84));
  876. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  877. module_name,
  878. 0x88, INREG32(module_base + 0x88),
  879. 0x8C, INREG32(module_base + 0x8C),
  880. 0x90, INREG32(module_base + 0x90),
  881. 0x94, INREG32(module_base + 0x94));
  882. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  883. module_name,
  884. 0x98, INREG32(module_base + 0x98),
  885. 0x9C, INREG32(module_base + 0x9C),
  886. 0xFa0, INREG32(module_base + 0xFa0),
  887. 0xa4, INREG32(module_base + 0xa4));
  888. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  889. module_name,
  890. 0xa8, INREG32(module_base + 0xa8),
  891. 0xAC, INREG32(module_base + 0xAC),
  892. 0xc0, INREG32(module_base + 0xc0),
  893. 0xc8, INREG32(module_base + 0xc8));
  894. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  895. module_name,
  896. 0xcc, INREG32(module_base + 0xcc),
  897. 0xd0, INREG32(module_base + 0xd0),
  898. 0xe0, INREG32(module_base + 0xe0),
  899. 0xe8, INREG32(module_base + 0xe8));
  900. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  901. module_name,
  902. 0xec, INREG32(module_base + 0xec),
  903. 0xf0, INREG32(module_base + 0xf0),
  904. 0x100, INREG32(module_base + 0x100),
  905. 0x108, INREG32(module_base + 0x108));
  906. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  907. module_name,
  908. 0x10c, INREG32(module_base + 0x10c),
  909. 0x110, INREG32(module_base + 0x110),
  910. 0x120, INREG32(module_base + 0x120),
  911. 0x128, INREG32(module_base + 0x128));
  912. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  913. module_name,
  914. 0x12c, INREG32(module_base + 0x12c),
  915. 0x130, INREG32(module_base + 0x130),
  916. 0x134, INREG32(module_base + 0x134),
  917. 0x138, INREG32(module_base + 0x138));
  918. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  919. module_name,
  920. 0x13c, INREG32(module_base + 0x13c),
  921. 0x140, INREG32(module_base + 0x140),
  922. 0x144, INREG32(module_base + 0x144),
  923. 0x148, INREG32(module_base + 0x148));
  924. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  925. module_name,
  926. 0x14c, INREG32(module_base + 0x14c),
  927. 0x150, INREG32(module_base + 0x150),
  928. 0x154, INREG32(module_base + 0x154),
  929. 0x158, INREG32(module_base + 0x158));
  930. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  931. module_name,
  932. 0x15c, INREG32(module_base + 0x15c),
  933. 0x160, INREG32(module_base + 0x160),
  934. 0x164, INREG32(module_base + 0x164),
  935. 0x168, INREG32(module_base + 0x168));
  936. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  937. module_name,
  938. 0x16c, INREG32(module_base + 0x16c),
  939. 0x170, INREG32(module_base + 0x170),
  940. 0x174, INREG32(module_base + 0x174),
  941. 0x178, INREG32(module_base + 0x178));
  942. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  943. module_name,
  944. 0x17c, INREG32(module_base + 0x17c),
  945. 0x180, INREG32(module_base + 0x180),
  946. 0x184, INREG32(module_base + 0x184),
  947. 0x188, INREG32(module_base + 0x188));
  948. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  949. module_name,
  950. 0x18c, INREG32(module_base + 0x18c),
  951. 0x190, INREG32(module_base + 0x190),
  952. 0x194, INREG32(module_base + 0x194),
  953. 0x198, INREG32(module_base + 0x198));
  954. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  955. module_name,
  956. 0x19c, INREG32(module_base + 0x19c),
  957. 0x1a0, INREG32(module_base + 0x1a0),
  958. 0x1a4, INREG32(module_base + 0x1a4),
  959. 0x1a8, INREG32(module_base + 0x1a8));
  960. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  961. module_name,
  962. 0x1ac, INREG32(module_base + 0x1ac),
  963. 0x1b0, INREG32(module_base + 0x1b0),
  964. 0x1b4, INREG32(module_base + 0x1b4),
  965. 0x1b8, INREG32(module_base + 0x1b8));
  966. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  967. module_name,
  968. 0x1bc, INREG32(module_base + 0x1bc),
  969. 0x1c0, INREG32(module_base + 0x1c0),
  970. 0x1c4, INREG32(module_base + 0x1c4),
  971. 0x1c8, INREG32(module_base + 0x1c8));
  972. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  973. module_name,
  974. 0x1cc, INREG32(module_base + 0x1cc),
  975. 0x1d0, INREG32(module_base + 0x1d0),
  976. 0x1d4, INREG32(module_base + 0x1d4),
  977. 0x1dc, INREG32(module_base + 0x1dc));
  978. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  979. module_name,
  980. 0x1e0, INREG32(module_base + 0x1e0),
  981. 0x1e4, INREG32(module_base + 0x1e4),
  982. 0x1e8, INREG32(module_base + 0x1e8),
  983. 0x1ec, INREG32(module_base + 0x1ec));
  984. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  985. module_name,
  986. 0x1F0, INREG32(module_base + 0x1F0),
  987. 0x1F4, INREG32(module_base + 0x1F4),
  988. 0x1F8, INREG32(module_base + 0x1F8),
  989. 0x1FC, INREG32(module_base + 0x1FC));
  990. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  991. module_name,
  992. 0x200, INREG32(module_base + 0x200),
  993. 0x208, INREG32(module_base + 0x208),
  994. 0x20C, INREG32(module_base + 0x20C),
  995. 0x210, INREG32(module_base + 0x210));
  996. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  997. module_name,
  998. 0x214, INREG32(module_base + 0x214),
  999. 0x218, INREG32(module_base + 0x218),
  1000. 0x21C, INREG32(module_base + 0x21C),
  1001. 0x220, INREG32(module_base + 0x220));
  1002. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1003. module_name,
  1004. 0x224, INREG32(module_base + 0x224),
  1005. 0x228, INREG32(module_base + 0x228),
  1006. 0x22C, INREG32(module_base + 0x22C),
  1007. 0x230, INREG32(module_base + 0x230));
  1008. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1009. module_name,
  1010. 0x234, INREG32(module_base + 0x234),
  1011. 0x238, INREG32(module_base + 0x238),
  1012. 0x240, INREG32(module_base + 0x240),
  1013. 0x244, INREG32(module_base + 0x244));
  1014. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1015. module_name,
  1016. 0x24c, INREG32(module_base + 0x24c),
  1017. 0x250, INREG32(module_base + 0x250),
  1018. 0x254, INREG32(module_base + 0x254),
  1019. 0x258, INREG32(module_base + 0x258));
  1020. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1021. module_name,
  1022. 0x25c, INREG32(module_base + 0x25c),
  1023. 0x260, INREG32(module_base + 0x260),
  1024. 0x264, INREG32(module_base + 0x264),
  1025. 0x268, INREG32(module_base + 0x268));
  1026. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1027. module_name,
  1028. 0x26C, INREG32(module_base + 0x26C),
  1029. 0x270, INREG32(module_base + 0x270),
  1030. 0x280, INREG32(module_base + 0x280),
  1031. 0x284, INREG32(module_base + 0x284));
  1032. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1033. module_name,
  1034. 0x288, INREG32(module_base + 0x288),
  1035. 0x28C, INREG32(module_base + 0x28C),
  1036. 0x290, INREG32(module_base + 0x290),
  1037. 0x29C, INREG32(module_base + 0x29C));
  1038. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1039. module_name,
  1040. 0x2A0, INREG32(module_base + 0x2A0),
  1041. 0x2A4, INREG32(module_base + 0x2A4),
  1042. 0x2B0, INREG32(module_base + 0x2B0),
  1043. 0x2B4, INREG32(module_base + 0x2B4));
  1044. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1045. module_name,
  1046. 0x2B8, INREG32(module_base + 0x2B8),
  1047. 0x2BC, INREG32(module_base + 0x2BC),
  1048. 0x2C0, INREG32(module_base + 0x2C0),
  1049. 0x2C4, INREG32(module_base + 0x2C4));
  1050. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1051. module_name,
  1052. 0x2C8, INREG32(module_base + 0x2C8),
  1053. 0x324, INREG32(module_base + 0x324),
  1054. 0x330, INREG32(module_base + 0x330),
  1055. 0x334, INREG32(module_base + 0x334));
  1056. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1057. module_name,
  1058. 0x338, INREG32(module_base + 0x338),
  1059. 0x33C, INREG32(module_base + 0x33C),
  1060. 0xFB0, INREG32(module_base + 0xFB0),
  1061. 0x344, INREG32(module_base + 0x344));
  1062. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1063. module_name,
  1064. 0x348, INREG32(module_base + 0x348),
  1065. 0x34C, INREG32(module_base + 0x34C),
  1066. 0x350, INREG32(module_base + 0x350),
  1067. 0x354, INREG32(module_base + 0x354));
  1068. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1069. module_name,
  1070. 0x358, INREG32(module_base + 0x358),
  1071. 0x35C, INREG32(module_base + 0x35C),
  1072. 0xFB4, INREG32(module_base + 0xFB4),
  1073. 0x364, INREG32(module_base + 0x364));
  1074. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1075. module_name,
  1076. 0x368, INREG32(module_base + 0x368),
  1077. 0x36C, INREG32(module_base + 0x36C),
  1078. 0x370, INREG32(module_base + 0x370),
  1079. 0x374, INREG32(module_base + 0x374));
  1080. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1081. module_name,
  1082. 0x378, INREG32(module_base + 0x378),
  1083. 0x37C, INREG32(module_base + 0x37C),
  1084. 0xFB8, INREG32(module_base + 0xFB8),
  1085. 0x384, INREG32(module_base + 0x384));
  1086. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1087. module_name,
  1088. 0x388, INREG32(module_base + 0x388),
  1089. 0x38C, INREG32(module_base + 0x38C),
  1090. 0x390, INREG32(module_base + 0x390),
  1091. 0x394, INREG32(module_base + 0x394));
  1092. DDPDUMP("%s 0x%04x=0x%08x, 0x%04x=0x%08x\n",
  1093. module_name,
  1094. 0x398, INREG32(module_base + 0x398),
  1095. 0xFC0, INREG32(module_base + 0xFC0));
  1096. DDPDUMP("-- END: DISP %s registers --\n", module_name);
  1097. ovl_dump_golden_setting(module);
  1098. }
  1099. static void ovl_printf_status(unsigned int status)
  1100. {
  1101. DDPDUMP("=OVL_FLOW_CONTROL_DEBUG=:\n");
  1102. DDPDUMP("addcon_idle:%d,blend_idle:%d,out_valid:%d,out_ready:%d,out_idle:%d\n",
  1103. (status >> 10) & (0x1),
  1104. (status >> 11) & (0x1),
  1105. (status >> 12) & (0x1), (status >> 13) & (0x1), (status >> 15) & (0x1)
  1106. );
  1107. DDPDUMP("rdma3_idle:%d,rdma2_idle:%d,rdma1_idle:%d, rdma0_idle:%d,rst:%d\n",
  1108. (status >> 16) & (0x1),
  1109. (status >> 17) & (0x1),
  1110. (status >> 18) & (0x1), (status >> 19) & (0x1), (status >> 20) & (0x1)
  1111. );
  1112. DDPDUMP("trig:%d,frame_hwrst_done:%d,frame_swrst_done:%d,frame_underrun:%d,frame_done:%d\n",
  1113. (status >> 21) & (0x1),
  1114. (status >> 23) & (0x1),
  1115. (status >> 24) & (0x1), (status >> 25) & (0x1), (status >> 26) & (0x1)
  1116. );
  1117. DDPDUMP("ovl_running:%d,ovl_start:%d,ovl_clr:%d,reg_update:%d,ovl_upd_reg:%d\n",
  1118. (status >> 27) & (0x1),
  1119. (status >> 28) & (0x1),
  1120. (status >> 29) & (0x1), (status >> 30) & (0x1), (status >> 31) & (0x1)
  1121. );
  1122. DDPDUMP("ovl_fms_state:\n");
  1123. switch (status & 0x3ff) {
  1124. case 0x1:
  1125. DDPDUMP("idle\n");
  1126. break;
  1127. case 0x2:
  1128. DDPDUMP("wait_SOF\n");
  1129. break;
  1130. case 0x4:
  1131. DDPDUMP("prepare\n");
  1132. break;
  1133. case 0x8:
  1134. DDPDUMP("reg_update\n");
  1135. break;
  1136. case 0x10:
  1137. DDPDUMP("eng_clr(internal reset)\n");
  1138. break;
  1139. case 0x20:
  1140. DDPDUMP("eng_act(processing)\n");
  1141. break;
  1142. case 0x40:
  1143. DDPDUMP("h_wait_w_rst\n");
  1144. break;
  1145. case 0x80:
  1146. DDPDUMP("s_wait_w_rst\n");
  1147. break;
  1148. case 0x100:
  1149. DDPDUMP("h_w_rst\n");
  1150. break;
  1151. case 0x200:
  1152. DDPDUMP("s_w_rst\n");
  1153. break;
  1154. default:
  1155. DDPDUMP("ovl_fsm_unknown\n");
  1156. break;
  1157. }
  1158. }
  1159. static void ovl_print_ovl_rdma_status(unsigned int status)
  1160. {
  1161. DDPDUMP("wram_rst_cs:0x%x,layer_greq:0x%x,out_data:0x%x,",
  1162. status & 0x7, (status >> 3) & 0x1, (status >> 4) & 0xffffff);
  1163. DDPDUMP("out_ready:0x%x,out_valid:0x%x,smi_busy:0x%x,smi_greq:0x%x\n",
  1164. (status >> 28) & 0x1, (status >> 29) & 0x1, (status >> 30) & 0x1,
  1165. (status >> 31) & 0x1);
  1166. }
  1167. static void ovl_dump_layer_info(int layer, unsigned long layer_offset)
  1168. {
  1169. 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",
  1170. layer, DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_SRC_SIZE) & 0xfff,
  1171. (DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_SRC_SIZE) >> 16) & 0xfff,
  1172. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_OFFSET) & 0xfff,
  1173. (DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_OFFSET) >> 16) & 0xfff,
  1174. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_PITCH) & 0xffff,
  1175. DISP_REG_GET(layer_offset + DISP_REG_OVL_L0_ADDR),
  1176. ovl_intput_format_name(
  1177. DISP_REG_GET_FIELD(L_CON_FLD_CFMT, DISP_REG_OVL_L0_CON+layer_offset),
  1178. DISP_REG_GET_FIELD(L_CON_FLD_BTSW, DISP_REG_OVL_L0_CON+layer_offset)),
  1179. (DISP_REG_GET_FIELD(L_CON_FLD_LARC, DISP_REG_OVL_L0_CON + layer_offset) ==
  1180. 0) ? "memory" : "constant_color", DISP_REG_GET_FIELD(L_CON_FLD_AEN,
  1181. DISP_REG_OVL_L0_CON +
  1182. layer_offset),
  1183. DISP_REG_GET_FIELD(L_CON_FLD_APHA, DISP_REG_OVL_L0_CON + layer_offset)
  1184. );
  1185. }
  1186. void ovl_dump_analysis(DISP_MODULE_ENUM module)
  1187. {
  1188. int i = 0;
  1189. unsigned int layer_offset = 0;
  1190. unsigned int rdma_offset = 0;
  1191. int idx = ovl_index(module);
  1192. unsigned int offset = idx * DISP_INDEX_OFFSET;
  1193. unsigned int src_on = DISP_REG_GET(DISP_REG_OVL_SRC_CON+offset);
  1194. unsigned int rdma_ctrl;
  1195. DDPDUMP("==DISP %s ANALYSIS==\n", ddp_get_module_name(module));
  1196. DDPDUMP("ovl_en=%d,layer_enable(%d,%d,%d,%d),bg(w=%d, h=%d),",
  1197. DISP_REG_GET(DISP_REG_OVL_EN + offset),
  1198. DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) & 0x1,
  1199. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 1) & 0x1,
  1200. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 2) & 0x1,
  1201. (DISP_REG_GET(DISP_REG_OVL_SRC_CON + offset) >> 3) & 0x1,
  1202. DISP_REG_GET(DISP_REG_OVL_ROI_SIZE + offset) & 0xfff,
  1203. (DISP_REG_GET(DISP_REG_OVL_ROI_SIZE + offset) >> 16) & 0xfff);
  1204. DDPDUMP("cur_pos(x=%d,y=%d),layer_hit(%d,%d,%d,%d),bg_mode=%s,sta=0x%x\n",
  1205. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_X, DISP_REG_OVL_ADDCON_DBG + offset),
  1206. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_ROI_Y, DISP_REG_OVL_ADDCON_DBG + offset),
  1207. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L0_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  1208. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L1_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  1209. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L2_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  1210. DISP_REG_GET_FIELD(ADDCON_DBG_FLD_L3_WIN_HIT, DISP_REG_OVL_ADDCON_DBG + offset),
  1211. DISP_REG_GET_FIELD(DATAPATH_CON_FLD_BGCLR_IN_SEL,
  1212. DISP_REG_OVL_DATAPATH_CON + offset) ? "directlink" : "const",
  1213. DISP_REG_GET(DISP_REG_OVL_STA + offset)
  1214. );
  1215. for (i = 0; i < 4; i++) {
  1216. layer_offset = i * OVL_LAYER_OFFSET + offset;
  1217. rdma_offset = i * OVL_RDMA_DEBUG_OFFSET + offset;
  1218. if (src_on & (0x1 << i))
  1219. ovl_dump_layer_info(i, layer_offset);
  1220. else
  1221. DDPDUMP("layer%d: disabled\n", i);
  1222. rdma_ctrl = DISP_REG_GET(layer_offset + DISP_REG_OVL_RDMA0_CTRL);
  1223. DDPDUMP("ovl rdma%d status:(en=%d, fifo_used %d, GMC=0x%x)\n", i,
  1224. REG_FLD_VAL_GET(RDMA0_CTRL_FLD_RDMA_EN, rdma_ctrl),
  1225. REG_FLD_VAL_GET(RDMA0_CTRL_FLD_RMDA_FIFO_USED_SZ, rdma_ctrl),
  1226. DISP_REG_GET(layer_offset + DISP_REG_OVL_RDMA0_MEM_GMC_SETTING));
  1227. ovl_print_ovl_rdma_status(DISP_REG_GET(DISP_REG_OVL_RDMA0_DBG + rdma_offset));
  1228. }
  1229. ovl_printf_status(DISP_REG_GET(DISP_REG_OVL_FLOW_CTRL_DBG + offset));
  1230. }
  1231. static inline unsigned long ovl_layer_num(DISP_MODULE_ENUM module)
  1232. {
  1233. switch (module) {
  1234. case DISP_MODULE_OVL0:
  1235. return 4;
  1236. case DISP_MODULE_OVL0_2L:
  1237. return 2;
  1238. default:
  1239. DDPERR("invalid ovl module=%d\n", module);
  1240. ASSERT(0);
  1241. }
  1242. return 0;
  1243. }
  1244. void ovl_cal_golden_setting(unsigned int *gs)
  1245. {
  1246. /* OVL_RDMA_MEM_GMC_SETTING_1 */
  1247. gs[GS_OVL_RDMA_ULTRA_TH] = 0x3ff;
  1248. gs[GS_OVL_RDMA_PRE_ULTRA_TH] = 0x3ff;
  1249. /* OVL_RDMA_FIFO_CTRL */
  1250. gs[GS_OVL_RDMA_FIFO_THRD] = 0;
  1251. gs[GS_OVL_RDMA_FIFO_SIZE] = 288;
  1252. /* OVL_RDMA_MEM_GMC_SETTING_2 */
  1253. gs[GS_OVL_RDMA_ISSUE_REQ_TH] = 191;
  1254. gs[GS_OVL_RDMA_ISSUE_REQ_TH_URG] = 95;
  1255. gs[GS_OVL_RDMA_REQ_TH_PRE_ULTRA] = 0;
  1256. gs[GS_OVL_RDMA_REQ_TH_ULTRA] = 1;
  1257. gs[GS_OVL_RDMA_FORCE_REQ_TH] = 0;
  1258. /* OVL_RDMA_GREQ_NUM */
  1259. gs[GS_OVL_RDMA_GREQ_NUM] = 0xF1FF5555;
  1260. /* OVL_RDMA_GREQURG_NUM */
  1261. gs[GS_OVL_RDMA_GREQ_URG_NUM] = 0x5555;
  1262. /* OVL_RDMA_ULTRA_SRC */
  1263. gs[GS_OVL_RDMA_ULTRA_SRC] = 0x8040;
  1264. /* OVL_RDMA_BUF_LOW_TH */
  1265. gs[GS_OVL_RDMA_ULTRA_LOW_TH] = 0;
  1266. gs[GS_OVL_RDMA_PRE_ULTRA_LOW_TH] = 0;
  1267. /* OVL_RDMA_BUF_HIGH_TH */
  1268. gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_TH] = 0;
  1269. gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_DIS] = 1;
  1270. /* OVL_EN */
  1271. gs[GS_OVL_BLOCK_EXT_ULTRA] = 0;
  1272. gs[GS_OVL_BLOCK_EXT_PRE_ULTRA] = 0;
  1273. }
  1274. static int ovl_golden_setting(DISP_MODULE_ENUM module, void *cmdq)
  1275. {
  1276. unsigned long baddr = ovl_base_addr(module);
  1277. unsigned int regval;
  1278. unsigned int gs[GS_OVL_FLD_NUM];
  1279. int i, layer_num;
  1280. unsigned long Lx_base;
  1281. baddr -= DISPSYS_OVL0_BASE;
  1282. layer_num = ovl_layer_num(module);
  1283. /* calculate ovl golden setting */
  1284. ovl_cal_golden_setting(gs);
  1285. /* OVL_RDMA_MEM_GMC_SETTING_1 */
  1286. regval = gs[GS_OVL_RDMA_ULTRA_TH] +
  1287. (gs[GS_OVL_RDMA_PRE_ULTRA_TH] << 16);
  1288. for (i = 0; i < layer_num; i++) {
  1289. Lx_base = i * OVL_LAYER_OFFSET + baddr;
  1290. DISP_REG_SET(cmdq, Lx_base +
  1291. DISP_REG_OVL_RDMA0_MEM_GMC_SETTING, regval);
  1292. }
  1293. /* OVL_RDMA_FIFO_CTRL */
  1294. regval = gs[GS_OVL_RDMA_FIFO_THRD] +
  1295. (gs[GS_OVL_RDMA_FIFO_SIZE] << 16);
  1296. for (i = 0; i < layer_num; i++) {
  1297. Lx_base = i * OVL_LAYER_OFFSET + baddr;
  1298. DISP_REG_SET(cmdq, Lx_base + DISP_REG_OVL_RDMA0_FIFO_CTRL,
  1299. regval);
  1300. }
  1301. /* OVL_RDMA_MEM_GMC_SETTING_2 */
  1302. regval = gs[GS_OVL_RDMA_ISSUE_REQ_TH] +
  1303. (gs[GS_OVL_RDMA_ISSUE_REQ_TH_URG] << 16) +
  1304. (gs[GS_OVL_RDMA_REQ_TH_PRE_ULTRA] << 28) +
  1305. (gs[GS_OVL_RDMA_REQ_TH_ULTRA] << 29) +
  1306. (gs[GS_OVL_RDMA_FORCE_REQ_TH] << 30);
  1307. for (i = 0; i < layer_num; i++)
  1308. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA0_MEM_GMC_S2 +
  1309. i * 4, regval);
  1310. /* DISP_REG_OVL_RDMA_GREQ_NUM */
  1311. regval = gs[GS_OVL_RDMA_GREQ_NUM];
  1312. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA_GREQ_NUM, regval);
  1313. /* DISP_REG_OVL_RDMA_GREQ_URG_NUM */
  1314. regval = gs[GS_OVL_RDMA_GREQ_URG_NUM];
  1315. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA_GREQ_URG_NUM, regval);
  1316. /* DISP_REG_OVL_RDMA_ULTRA_SRC */
  1317. regval = gs[GS_OVL_RDMA_ULTRA_SRC];
  1318. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMA_ULTRA_SRC, regval);
  1319. /* DISP_REG_OVL_RDMAn_BUF_LOW */
  1320. regval = gs[GS_OVL_RDMA_ULTRA_LOW_TH] +
  1321. (gs[GS_OVL_RDMA_PRE_ULTRA_LOW_TH] << 12);
  1322. for (i = 0; i < layer_num; i++)
  1323. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMAn_BUF_LOW(i),
  1324. regval);
  1325. /* DISP_REG_OVL_RDMAn_BUF_HIGH */
  1326. regval = (gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_TH] << 12) +
  1327. (gs[GS_OVL_RDMA_PRE_ULTRA_HIGH_DIS] << 31);
  1328. for (i = 0; i < layer_num; i++)
  1329. DISP_REG_SET(cmdq, baddr + DISP_REG_OVL_RDMAn_BUF_HIGH(i),
  1330. regval);
  1331. /* OVL_EN */
  1332. regval = gs[GS_OVL_BLOCK_EXT_ULTRA] +
  1333. (gs[GS_OVL_BLOCK_EXT_PRE_ULTRA] << 1);
  1334. DISP_REG_SET_FIELD(cmdq, REG_FLD_MSB_LSB(19, 18), baddr +
  1335. DISP_REG_OVL_EN, regval);
  1336. /* Set ultra_sel of ovl0 & ovl0_2l to RDMA0 if path is DL with rsz
  1337. * OVL0_2l -> RSZ -> OVL0 -> RDMA0 -> DSI
  1338. */
  1339. DISP_REG_SET_FIELD(cmdq, mmsys_ovl_ultra_offset(module),
  1340. DISP_REG_CONFIG_MMSYS_MISC, 1);
  1341. return 0;
  1342. }
  1343. static int OVLConfig_l(DISP_MODULE_ENUM module, disp_ddp_path_config* pConfig, void* handle)
  1344. {
  1345. int enabled_layers = 0;
  1346. unsigned int local_layer = 0, global_layer = 0;
  1347. int idx = ovl_index(module);
  1348. if (pConfig->dst_dirty) {
  1349. OVLROI(module,
  1350. pConfig->dst_w, // width
  1351. pConfig->dst_h, // height
  1352. 0xFF000000, // background color
  1353. handle);
  1354. }
  1355. if (!pConfig->ovl_dirty) {
  1356. return 0;
  1357. }
  1358. for (global_layer = 0; global_layer < TOTAL_OVL_LAYER_NUM; global_layer++) {
  1359. if (!(pConfig->ovl_layer_scanned & (1 << global_layer)))
  1360. break;
  1361. }
  1362. if (global_layer > TOTAL_OVL_LAYER_NUM - ovl_layer_num(module)) {
  1363. DDPERR("%s: %s scan error, layer_scanned=%u\n", __func__,
  1364. ddp_get_module_name(module), pConfig->ovl_layer_scanned);
  1365. ASSERT(0);
  1366. }
  1367. for (local_layer = 0; local_layer < ovl_layer_num(module); local_layer++, global_layer++) {
  1368. OVL_CONFIG_STRUCT *ovl_cfg = &pConfig->ovl_config[global_layer];
  1369. pConfig->ovl_layer_scanned |= (1 << global_layer);
  1370. if (ovl_cfg->layer_en == 0)
  1371. continue;
  1372. if (ovl_cfg->addr==0 || ovl_cfg->dst_w==0 || ovl_cfg->dst_h==0) {
  1373. DDPERR("ovl parameter invalidate, addr=0x%x, w=%d, h=%d \n",
  1374. ovl_cfg->addr,
  1375. ovl_cfg->dst_w,
  1376. ovl_cfg->dst_h);
  1377. return -1;
  1378. }
  1379. 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",
  1380. module,
  1381. local_layer,
  1382. ovl_cfg->layer_en,
  1383. ovl_cfg->source, // data source (0=memory)
  1384. ovl_cfg->fmt,
  1385. ovl_cfg->addr, // addr
  1386. ovl_cfg->src_x, // x
  1387. ovl_cfg->src_y, // y
  1388. ovl_cfg->src_pitch, //pitch, pixel number
  1389. ovl_cfg->dst_x, // x
  1390. ovl_cfg->dst_y, // y
  1391. ovl_cfg->dst_w, // width
  1392. ovl_cfg->dst_h, // height
  1393. ovl_cfg->keyEn, //color key
  1394. ovl_cfg->key, //color key
  1395. ovl_cfg->aen, // alpha enable
  1396. ovl_cfg->alpha);
  1397. OVLLayerConfig(module,
  1398. local_layer,
  1399. ovl_cfg->source,
  1400. ovl_cfg->fmt,
  1401. ovl_cfg->addr,
  1402. ovl_cfg->src_x,
  1403. ovl_cfg->src_y,
  1404. ovl_cfg->src_pitch,
  1405. ovl_cfg->dst_x,
  1406. ovl_cfg->dst_y,
  1407. ovl_cfg->dst_w,
  1408. ovl_cfg->dst_h,
  1409. ovl_cfg->keyEn,
  1410. ovl_cfg->key,
  1411. ovl_cfg->aen,
  1412. ovl_cfg->alpha,
  1413. handle);
  1414. // print_layer_config_args(module, local_layer, ovl_cfg);
  1415. // ovl_layer_config(module, local_layer, has_sec_layer, ovl_cfg, handle);
  1416. enabled_layers |= 1 << local_layer;
  1417. }
  1418. DISP_REG_SET(handle, idx * DISP_INDEX_OFFSET + DISP_REG_OVL_SRC_CON, enabled_layers);
  1419. ovl_golden_setting(module, handle);
  1420. return 0;
  1421. }
  1422. DDP_MODULE_DRIVER ddp_driver_ovl = {
  1423. .module = DISP_MODULE_OVL0,
  1424. .init = OVLInit,
  1425. .deinit = OVLDeInit,
  1426. .config = OVLConfig_l,
  1427. .start = OVLStart,
  1428. .trigger = NULL,
  1429. .stop = OVLStop,
  1430. .reset = NULL,
  1431. .power_on = OVLClockOn,
  1432. .power_off = OVLClockOff,
  1433. .is_idle = NULL,
  1434. .is_busy = NULL,
  1435. .dump_info = NULL,
  1436. .bypass = NULL,
  1437. .build_cmdq = NULL,
  1438. .set_lcm_utils = NULL,
  1439. .connect = OVLConnect,
  1440. };