disp_assert_layer.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460
  1. #include <linux/types.h>
  2. #include "primary_display.h"
  3. #include "ddp_hal.h"
  4. #include "disp_drv_log.h"
  5. #include "disp_assert_layer.h"
  6. #include <linux/semaphore.h>
  7. #include <linux/mutex.h>
  8. #include "ddp_mmp.h"
  9. #include "disp_session.h"
  10. /* /common part */
  11. #define DAL_BPP (2)
  12. #define DAL_WIDTH (DISP_GetScreenWidth())
  13. #define DAL_HEIGHT (DISP_GetScreenHeight())
  14. /* #ifdef CONFIG_MTK_FB_SUPPORT_ASSERTION_LAYER */
  15. #include <linux/string.h>
  16. #include <linux/semaphore.h>
  17. #include <asm/cacheflush.h>
  18. #include <linux/module.h>
  19. #include "mtkfb_console.h"
  20. #include "disp_drv_platform.h"
  21. #include "mtk_disp_mgr.h"
  22. #include "mtkfb.h"
  23. /* --------------------------------------------------------------------------- */
  24. #define DAL_FORMAT (DISP_FORMAT_RGB565)
  25. #define DAL_BG_COLOR (dal_bg_color)
  26. #define DAL_FG_COLOR (dal_fg_color)
  27. #define RGB888_To_RGB565(x) ((((x) & 0xF80000) >> 8) | \
  28. (((x) & 0x00FC00) >> 5) | \
  29. (((x) & 0x0000F8) >> 3))
  30. #define MAKE_TWO_RGB565_COLOR(high, low) (((low) << 16) | (high))
  31. #define DAL_LOG(fmt, arg...) pr_debug("DISP/DAL " fmt, ##arg)
  32. /* --------------------------------------------------------------------------- */
  33. static MFC_HANDLE mfc_handle;
  34. static void *dal_fb_addr;
  35. static unsigned long dal_fb_pa;
  36. unsigned int isAEEEnabled = 0;
  37. /* static BOOL dal_shown = FALSE; */
  38. bool dal_shown = false;
  39. static unsigned int dal_fg_color = RGB888_To_RGB565(DAL_COLOR_WHITE);
  40. static unsigned int dal_bg_color = RGB888_To_RGB565(DAL_COLOR_RED);
  41. /* extern struct mutex OverlaySettingMutex; */
  42. /* extern atomic_t OverlaySettingDirtyFlag; */
  43. /* extern atomic_t OverlaySettingApplied; */
  44. /* extern OVL_CONFIG_STRUCT cached_layer_config[DDP_OVL_LAYER_MUN]; */
  45. /* extern disp_session_input_config *captured_session_input; */
  46. /* DECLARE_MUTEX(dal_sem); */
  47. DEFINE_SEMAPHORE(dal_sem);
  48. static char dal_print_buffer[1024];
  49. /* --------------------------------------------------------------------------- */
  50. uint32_t DAL_GetLayerSize(void)
  51. {
  52. /* xuecheng, avoid lcdc read buffersize+1 issue */
  53. return DAL_WIDTH * DAL_HEIGHT * DAL_BPP + 4096;
  54. }
  55. DAL_STATUS DAL_SetScreenColor(DAL_COLOR color)
  56. {
  57. #if 1
  58. uint32_t i;
  59. uint32_t size;
  60. uint32_t BG_COLOR;
  61. MFC_CONTEXT *ctxt = NULL;
  62. uint32_t offset;
  63. unsigned int *addr;
  64. color = RGB888_To_RGB565(color);
  65. BG_COLOR = MAKE_TWO_RGB565_COLOR(color, color);
  66. ctxt = (MFC_CONTEXT *) mfc_handle;
  67. if (!ctxt)
  68. return DAL_STATUS_FATAL_ERROR;
  69. if (ctxt->screen_color == color)
  70. return DAL_STATUS_OK;
  71. offset = MFC_Get_Cursor_Offset(mfc_handle);
  72. addr = (unsigned int *)(ctxt->fb_addr + offset);
  73. size = DAL_GetLayerSize() - offset;
  74. for (i = 0; i < size / sizeof(uint32_t); ++i)
  75. *addr++ = BG_COLOR;
  76. ctxt->screen_color = color;
  77. return DAL_STATUS_OK;
  78. }
  79. EXPORT_SYMBOL(DAL_SetScreenColor);
  80. DAL_STATUS DAL_Init(unsigned long layerVA, unsigned long layerPA)
  81. {
  82. MFC_STATUS ret;
  83. pr_debug("%s, layerVA=0x%lx, layerPA=0x%lx\n", __func__, layerVA, layerPA);
  84. dal_fb_addr = (void *)layerVA;
  85. dal_fb_pa = layerPA;
  86. ret = MFC_Open(&mfc_handle, dal_fb_addr, DAL_WIDTH, DAL_HEIGHT, DAL_BPP, DAL_FG_COLOR, DAL_BG_COLOR);
  87. if (MFC_STATUS_OK != ret) {
  88. pr_debug("DISP/DAL: Warning: call MFC_XXX function failed in %s(), line: %d, ret: %x\n",
  89. __func__, __LINE__, ret);
  90. return ret;
  91. }
  92. /* DAL_Clean(); */
  93. DAL_SetScreenColor(DAL_COLOR_RED);
  94. return DAL_STATUS_OK;
  95. }
  96. DAL_STATUS DAL_SetColor(unsigned int fgColor, unsigned int bgColor)
  97. {
  98. MFC_STATUS ret;
  99. if (NULL == mfc_handle)
  100. return DAL_STATUS_NOT_READY;
  101. if (down_interruptible(&dal_sem)) {
  102. pr_debug("DISP/DAL " "Can't get semaphore in %s()\n", __func__);
  103. return DAL_STATUS_LOCK_FAIL;
  104. }
  105. dal_fg_color = RGB888_To_RGB565(fgColor);
  106. dal_bg_color = RGB888_To_RGB565(bgColor);
  107. ret = MFC_SetColor(mfc_handle, dal_fg_color, dal_bg_color);
  108. if (MFC_STATUS_OK != ret) {
  109. pr_debug("DISP/DAL: Warning: call MFC_XXX function failed in %s(), line: %d, ret: %x\n",
  110. __func__, __LINE__, ret);
  111. return ret;
  112. }
  113. up(&dal_sem);
  114. return DAL_STATUS_OK;
  115. }
  116. EXPORT_SYMBOL(DAL_SetColor);
  117. DAL_STATUS DAL_Dynamic_Change_FB_Layer(unsigned int isAEEEnabled)
  118. {
  119. #if 0
  120. static int ui_layer_tdshp;
  121. pr_debug("[DDP] DAL_Dynamic_Change_FB_Layer, isAEEEnabled=%d\n", isAEEEnabled);
  122. if (DISP_DEFAULT_UI_LAYER_ID == DISP_CHANGED_UI_LAYER_ID) {
  123. pr_debug("[DDP] DAL_Dynamic_Change_FB_Layer, no dynamic switch\n");
  124. return DAL_STATUS_OK;
  125. }
  126. if (isAEEEnabled == 1) {
  127. /* change ui layer from DISP_DEFAULT_UI_LAYER_ID to DISP_CHANGED_UI_LAYER_ID */
  128. memcpy((void *)(&cached_layer_config[DISP_CHANGED_UI_LAYER_ID]),
  129. (void *)(&cached_layer_config[DISP_DEFAULT_UI_LAYER_ID]),
  130. sizeof(OVL_CONFIG_STRUCT));
  131. ui_layer_tdshp = cached_layer_config[DISP_DEFAULT_UI_LAYER_ID].isTdshp;
  132. cached_layer_config[DISP_DEFAULT_UI_LAYER_ID].isTdshp = 0;
  133. /* change global variable value, else error-check will find layer 2, 3 enable tdshp together */
  134. disp_path_change_tdshp_status(DISP_DEFAULT_UI_LAYER_ID, 0);
  135. FB_LAYER = DISP_CHANGED_UI_LAYER_ID;
  136. } else {
  137. memcpy((void *)(&cached_layer_config[DISP_DEFAULT_UI_LAYER_ID]),
  138. (void *)(&cached_layer_config[DISP_CHANGED_UI_LAYER_ID]),
  139. sizeof(OVL_CONFIG_STRUCT));
  140. cached_layer_config[DISP_DEFAULT_UI_LAYER_ID].isTdshp = ui_layer_tdshp;
  141. FB_LAYER = DISP_DEFAULT_UI_LAYER_ID;
  142. memset((void *)(&cached_layer_config[DISP_CHANGED_UI_LAYER_ID]), 0,
  143. sizeof(OVL_CONFIG_STRUCT));
  144. }
  145. /* no matter memcpy or memset, layer ID should not be changed */
  146. cached_layer_config[DISP_DEFAULT_UI_LAYER_ID].layer = DISP_DEFAULT_UI_LAYER_ID;
  147. cached_layer_config[DISP_CHANGED_UI_LAYER_ID].layer = DISP_CHANGED_UI_LAYER_ID;
  148. cached_layer_config[DISP_DEFAULT_UI_LAYER_ID].isDirty = 1;
  149. cached_layer_config[DISP_CHANGED_UI_LAYER_ID].isDirty = 1;
  150. #endif
  151. return DAL_STATUS_OK;
  152. }
  153. DAL_STATUS DAL_Clean(void)
  154. {
  155. DAL_STATUS ret = DAL_STATUS_OK;
  156. MFC_STATUS r;
  157. static int dal_clean_cnt;
  158. MFC_CONTEXT *ctxt = (MFC_CONTEXT *) mfc_handle;
  159. DISPFUNC();
  160. if (NULL == mfc_handle)
  161. return DAL_STATUS_NOT_READY;
  162. MMProfileLogEx(ddp_mmp_get_events()->dal_clean, MMProfileFlagStart, 0, 0);
  163. if (down_interruptible(&dal_sem)) {
  164. pr_debug("DISP/DAL " "Can't get semaphore in %s()\n", __func__);
  165. return DAL_STATUS_LOCK_FAIL;
  166. }
  167. r = MFC_ResetCursor(mfc_handle);
  168. if (MFC_STATUS_OK != r) {
  169. pr_debug("DISP/DAL: Warning: call MFC_XXX function failed in %s(), line: %d, ret: %x\n",
  170. __func__, __LINE__, r);
  171. return r;
  172. }
  173. ctxt->screen_color = 0;
  174. DAL_SetScreenColor(DAL_COLOR_RED);
  175. /* TODO: if dal_shown=false, and 3D enabled, mtkfb may disable UI layer, please modify 3D driver */
  176. if (isAEEEnabled == 1) {
  177. disp_session_input_config *session_input;
  178. disp_input_config input;
  179. int layer_id;
  180. session_input = &captured_session_input[DISP_SESSION_PRIMARY - 1];
  181. session_input->setter = SESSION_USER_AEE;
  182. session_input->config_layer_num = 4;
  183. layer_id = primary_display_get_option("ASSERT_LAYER");
  184. input = session_input->config[layer_id];
  185. memset((void *)&input, 0, sizeof(input));
  186. input.src_phy_addr = (void *)dal_fb_pa;
  187. input.layer_id = primary_display_get_option("ASSERT_LAYER");
  188. input.layer_enable = 0;
  189. input.src_offset_x = 0;
  190. input.src_offset_y = 0;
  191. input.src_width = DAL_WIDTH;
  192. input.src_height = DAL_HEIGHT;
  193. input.tgt_offset_x = 0;
  194. input.tgt_offset_y = 0;
  195. input.tgt_width = DAL_WIDTH;
  196. input.tgt_height = DAL_HEIGHT;
  197. input.alpha = 0x80;
  198. input.alpha_enable = 1;
  199. input.next_buff_idx = -1;
  200. input.src_pitch = DAL_WIDTH;
  201. input.src_fmt = DAL_FORMAT;
  202. input.next_buff_idx = -1;
  203. captured_session_input[DISP_SESSION_PRIMARY - 1].config[input.layer_id] = input;
  204. ret = primary_display_config_input_multiple(session_input);
  205. /* DAL disable, switch UI layer to default layer 3 */
  206. pr_warn("[DDP]* isAEEEnabled from 1 to 0, %d\n",
  207. dal_clean_cnt++);
  208. isAEEEnabled = 0;
  209. DAL_Dynamic_Change_FB_Layer(isAEEEnabled); /* restore UI layer to DEFAULT_UI_LAYER */
  210. }
  211. up(&dal_sem);
  212. MMProfileLogEx(ddp_mmp_get_events()->dal_clean, MMProfileFlagEnd, 0, 0);
  213. return ret;
  214. }
  215. EXPORT_SYMBOL(DAL_Clean);
  216. int is_DAL_Enabled(void)
  217. {
  218. int ret = 0;
  219. if (down_interruptible(&dal_sem)) {
  220. pr_debug("DISP/DAL " "Can't get semaphore in %s()\n", __func__);
  221. return DAL_STATUS_LOCK_FAIL;
  222. }
  223. ret = isAEEEnabled;
  224. up(&dal_sem);
  225. return ret;
  226. }
  227. unsigned long get_Assert_Layer_PA(void)
  228. {
  229. return dal_fb_pa;
  230. }
  231. DAL_STATUS DAL_Printf(const char *fmt, ...)
  232. {
  233. va_list args;
  234. uint i;
  235. DAL_STATUS ret = DAL_STATUS_OK;
  236. disp_session_input_config *session_input;
  237. disp_input_config input;
  238. int layer_id;
  239. MFC_STATUS r;
  240. DISPFUNC();
  241. if (NULL == mfc_handle)
  242. return DAL_STATUS_NOT_READY;
  243. if (NULL == fmt)
  244. return DAL_STATUS_INVALID_ARGUMENT;
  245. MMProfileLogEx(ddp_mmp_get_events()->dal_printf, MMProfileFlagStart, 0, 0);
  246. if (down_interruptible(&dal_sem)) {
  247. pr_debug("DISP/DAL " "Can't get semaphore in %s()\n", __func__);
  248. return DAL_STATUS_LOCK_FAIL;
  249. }
  250. if (isAEEEnabled == 0) {
  251. MFC_STATUS r;
  252. pr_warn("[DDP] isAEEEnabled from 0 to 1, ASSERT_LAYER=%d, dal_fb_pa %lx\n",
  253. primary_display_get_option("ASSERT_LAYER"), dal_fb_pa);
  254. isAEEEnabled = 1;
  255. DAL_Dynamic_Change_FB_Layer(isAEEEnabled); /* default_ui_ layer coniig to changed_ui_layer */
  256. r = MFC_Open(&mfc_handle, dal_fb_addr, DAL_WIDTH, DAL_HEIGHT,
  257. DAL_BPP, DAL_FG_COLOR, DAL_BG_COLOR);
  258. if (MFC_STATUS_OK != r) {
  259. pr_debug("DISP/DAL: Warning: call MFC_XXX function failed in %s(), line: %d, ret: %x\n",
  260. __func__, __LINE__, r);
  261. return r;
  262. }
  263. session_input = &captured_session_input[DISP_SESSION_PRIMARY - 1];
  264. session_input->setter = SESSION_USER_AEE;
  265. session_input->config_layer_num = 4;
  266. layer_id = primary_display_get_option("ASSERT_LAYER");
  267. input = session_input->config[layer_id];
  268. memset((void *)&input, 0, sizeof(input));
  269. input.src_phy_addr = (void *)dal_fb_pa;
  270. input.layer_id = primary_display_get_option("ASSERT_LAYER");
  271. input.layer_enable = 1;
  272. input.src_offset_x = 0;
  273. input.src_offset_y = 0;
  274. input.src_width = DAL_WIDTH;
  275. input.src_height = DAL_HEIGHT;
  276. input.tgt_offset_x = 0;
  277. input.tgt_offset_y = 0;
  278. input.tgt_width = DAL_WIDTH;
  279. input.tgt_height = DAL_HEIGHT;
  280. input.alpha = 0x80;
  281. input.alpha_enable = 1;
  282. input.next_buff_idx = -1;
  283. input.src_pitch = DAL_WIDTH;
  284. input.src_fmt = DAL_FORMAT;
  285. input.next_buff_idx = -1;
  286. captured_session_input[DISP_SESSION_PRIMARY - 1].config[input.layer_id] = input;
  287. ret = primary_display_config_input_multiple(session_input);
  288. }
  289. va_start(args, fmt);
  290. i = vsprintf(dal_print_buffer, fmt, args);
  291. BUG_ON(i >= ARRAY_SIZE(dal_print_buffer));
  292. va_end(args);
  293. r = MFC_Print(mfc_handle, dal_print_buffer);
  294. if (MFC_STATUS_OK != r) {
  295. pr_debug("DISP/DAL: Warning: call MFC_XXX function failed in %s(), line: %d, ret: %x\n",
  296. __func__, __LINE__, r);
  297. return r;
  298. }
  299. flush_cache_all();
  300. if (!dal_shown)
  301. dal_shown = true;
  302. mutex_lock(&disp_trigger_lock);
  303. /* Since the output buffer may not exsit, so skip frame trigger update. */
  304. if (primary_display_get_session_mode() != DISP_SESSION_DECOUPLE_MIRROR_MODE)
  305. ret = primary_display_trigger(0, NULL, 0);
  306. mutex_unlock(&disp_trigger_lock);
  307. up(&dal_sem);
  308. MMProfileLogEx(ddp_mmp_get_events()->dal_printf, MMProfileFlagEnd, 0, 0);
  309. return ret;
  310. }
  311. EXPORT_SYMBOL(DAL_Printf);
  312. DAL_STATUS DAL_OnDispPowerOn(void)
  313. {
  314. return DAL_STATUS_OK;
  315. }
  316. /* ########################################################################## */
  317. /* !CONFIG_MTK_FB_SUPPORT_ASSERTION_LAYER */
  318. /* ########################################################################## */
  319. #else
  320. unsigned int isAEEEnabled = 0;
  321. uint32_t DAL_GetLayerSize(void)
  322. {
  323. /* xuecheng, avoid lcdc read buffersize+1 issue */
  324. return DAL_WIDTH * DAL_HEIGHT * DAL_BPP + 4096;
  325. }
  326. DAL_STATUS DAL_Init(uint32_t layerVA, uint32_t layerPA)
  327. {
  328. NOT_REFERENCED(layerVA);
  329. NOT_REFERENCED(layerPA);
  330. return DAL_STATUS_OK;
  331. }
  332. DAL_STATUS DAL_SetColor(unsigned int fgColor, unsigned int bgColor)
  333. {
  334. NOT_REFERENCED(fgColor);
  335. NOT_REFERENCED(bgColor);
  336. return DAL_STATUS_OK;
  337. }
  338. EXPORT_SYMBOL(DAL_SetColor);
  339. DAL_STATUS DAL_Clean(void)
  340. {
  341. pr_debug("[MTKFB_DAL] DAL_Clean is not implemented\n");
  342. return DAL_STATUS_OK;
  343. }
  344. EXPORT_SYMBOL(DAL_Clean);
  345. DAL_STATUS DAL_Printf(const char *fmt, ...)
  346. {
  347. NOT_REFERENCED(fmt);
  348. pr_debug("[MTKFB_DAL] DAL_Printf is not implemented\n");
  349. return DAL_STATUS_OK;
  350. }
  351. EXPORT_SYMBOL(DAL_Printf);
  352. DAL_STATUS DAL_OnDispPowerOn(void)
  353. {
  354. return DAL_STATUS_OK;
  355. }
  356. DAL_STATUS DAL_SetScreenColor(DAL_COLOR color)
  357. {
  358. return DAL_STATUS_OK;
  359. }
  360. EXPORT_SYMBOL(DAL_SetScreenColor);
  361. #endif /* CONFIG_MTK_FB_SUPPORT_ASSERTION_LAYER */
  362. #ifdef DAL_LOWMEMORY_ASSERT
  363. /* EXPORT_SYMBOL(DAL_LowMemoryOn); */
  364. /* EXPORT_SYMBOL(DAL_LowMemoryOff); */
  365. #endif