cmdq_mdp.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642
  1. #include "cmdq_core.h"
  2. #include "cmdq_reg.h"
  3. #include "cmdq_mdp_common.h"
  4. #ifdef CMDQ_MET_READY
  5. #include <linux/met_drv.h>
  6. #endif
  7. #ifndef CMDQ_USE_CCF
  8. #include <mach/mt_clkmgr.h>
  9. #endif /* !defined(CMDQ_USE_CCF) */
  10. #include "cmdq_device.h"
  11. typedef struct CmdqMdpModuleBaseVA {
  12. long MDP_RDMA;
  13. long MDP_RSZ0;
  14. long MDP_RSZ1;
  15. long MDP_WDMA;
  16. long MDP_WROT;
  17. long MDP_TDSHP;
  18. long VENC;
  19. } CmdqMdpModuleBaseVA;
  20. static CmdqMdpModuleBaseVA gCmdqMdpModuleBaseVA;
  21. #ifndef CMDQ_USE_CCF
  22. #define IMP_ENABLE_MDP_HW_CLOCK(FN_NAME, HW_NAME) \
  23. uint32_t cmdq_mdp_enable_clock_##FN_NAME(bool enable) \
  24. { \
  25. return cmdq_dev_enable_mtk_clock(enable, MT_CG_DISP0_##HW_NAME, "CMDQ_MDP_"#HW_NAME); \
  26. }
  27. #define IMP_MDP_HW_CLOCK_IS_ENABLE(FN_NAME, HW_NAME) \
  28. bool cmdq_mdp_clock_is_enable_##FN_NAME(void) \
  29. { \
  30. return cmdq_dev_mtk_clock_is_enable(MT_CG_DISP0_##HW_NAME); \
  31. }
  32. #else
  33. typedef struct CmdqMdpModuleClock {
  34. struct clk *clk_CAM_MDP;
  35. struct clk *clk_MDP_RDMA;
  36. struct clk *clk_MDP_RSZ0;
  37. struct clk *clk_MDP_RSZ1;
  38. struct clk *clk_MDP_WDMA;
  39. struct clk *clk_MDP_WROT;
  40. struct clk *clk_MDP_TDSHP;
  41. } CmdqMdpModuleClock;
  42. static CmdqMdpModuleClock gCmdqMdpModuleClock;
  43. #define IMP_ENABLE_MDP_HW_CLOCK(FN_NAME, HW_NAME) \
  44. uint32_t cmdq_mdp_enable_clock_##FN_NAME(bool enable) \
  45. { \
  46. return cmdq_dev_enable_device_clock(enable, gCmdqMdpModuleClock.clk_##HW_NAME, #HW_NAME "-clk"); \
  47. }
  48. #define IMP_MDP_HW_CLOCK_IS_ENABLE(FN_NAME, HW_NAME) \
  49. bool cmdq_mdp_clock_is_enable_##FN_NAME(void) \
  50. { \
  51. return cmdq_dev_device_clock_is_enable(gCmdqMdpModuleClock.clk_##HW_NAME); \
  52. }
  53. #endif /* !defined(CMDQ_USE_CCF) */
  54. IMP_ENABLE_MDP_HW_CLOCK(CAM_MDP, CAM_MDP);
  55. IMP_ENABLE_MDP_HW_CLOCK(MDP_RDMA0, MDP_RDMA);
  56. IMP_ENABLE_MDP_HW_CLOCK(MDP_RSZ0, MDP_RSZ0);
  57. IMP_ENABLE_MDP_HW_CLOCK(MDP_RSZ1, MDP_RSZ1);
  58. IMP_ENABLE_MDP_HW_CLOCK(MDP_WDMA, MDP_WDMA);
  59. IMP_ENABLE_MDP_HW_CLOCK(MDP_WROT0, MDP_WROT);
  60. IMP_ENABLE_MDP_HW_CLOCK(MDP_TDSHP0, MDP_TDSHP);
  61. IMP_MDP_HW_CLOCK_IS_ENABLE(CAM_MDP, CAM_MDP);
  62. IMP_MDP_HW_CLOCK_IS_ENABLE(MDP_RDMA0, MDP_RDMA);
  63. IMP_MDP_HW_CLOCK_IS_ENABLE(MDP_RSZ0, MDP_RSZ0);
  64. IMP_MDP_HW_CLOCK_IS_ENABLE(MDP_RSZ1, MDP_RSZ1);
  65. IMP_MDP_HW_CLOCK_IS_ENABLE(MDP_WDMA, MDP_WDMA);
  66. IMP_MDP_HW_CLOCK_IS_ENABLE(MDP_WROT0, MDP_WROT);
  67. IMP_MDP_HW_CLOCK_IS_ENABLE(MDP_TDSHP0, MDP_TDSHP);
  68. #undef IMP_ENABLE_MDP_HW_CLOCK
  69. #undef IMP_MDP_HW_CLOCK_IS_ENABLE
  70. long cmdq_mdp_get_module_base_VA_MDP_RDMA(void)
  71. {
  72. return gCmdqMdpModuleBaseVA.MDP_RDMA;
  73. }
  74. long cmdq_mdp_get_module_base_VA_MDP_RSZ0(void)
  75. {
  76. return gCmdqMdpModuleBaseVA.MDP_RSZ0;
  77. }
  78. long cmdq_mdp_get_module_base_VA_MDP_RSZ1(void)
  79. {
  80. return gCmdqMdpModuleBaseVA.MDP_RSZ1;
  81. }
  82. long cmdq_mdp_get_module_base_VA_MDP_WDMA(void)
  83. {
  84. return gCmdqMdpModuleBaseVA.MDP_WDMA;
  85. }
  86. long cmdq_mdp_get_module_base_VA_MDP_WROT(void)
  87. {
  88. return gCmdqMdpModuleBaseVA.MDP_WROT;
  89. }
  90. long cmdq_mdp_get_module_base_VA_MDP_TDSHP(void)
  91. {
  92. return gCmdqMdpModuleBaseVA.MDP_TDSHP;
  93. }
  94. long cmdq_mdp_get_module_base_VA_VENC(void)
  95. {
  96. return gCmdqMdpModuleBaseVA.VENC;
  97. }
  98. #ifdef CMDQ_OF_SUPPORT
  99. #define MDP_RDMA_BASE cmdq_mdp_get_module_base_VA_MDP_RDMA()
  100. #define MDP_RSZ0_BASE cmdq_mdp_get_module_base_VA_MDP_RSZ0()
  101. #define MDP_RSZ1_BASE cmdq_mdp_get_module_base_VA_MDP_RSZ1()
  102. #define MDP_TDSHP_BASE cmdq_mdp_get_module_base_VA_MDP_TDSHP()
  103. #define MDP_WROT_BASE cmdq_mdp_get_module_base_VA_MDP_WROT()
  104. #define MDP_WDMA_BASE cmdq_mdp_get_module_base_VA_MDP_WDMA()
  105. #define VENC_BASE cmdq_mdp_get_module_base_VA_VENC()
  106. #else
  107. #include <mach/mt_reg_base.h>
  108. #endif
  109. int32_t cmdq_mdp_reset_with_mmsys(const uint64_t engineToResetAgain)
  110. {
  111. long MMSYS_SW0_RST_B_REG = MMSYS_CONFIG_BASE + (0x140);
  112. int i = 0;
  113. uint32_t reset_bits = 0L;
  114. static const int engineResetBit[32] = {
  115. -1, /* bit 0 : SMI COMMON */
  116. -1, /* bit 1 : SMI LARB0 */
  117. CMDQ_ENG_MDP_CAMIN, /* bit 2 : CAM_MDP */
  118. CMDQ_ENG_MDP_RDMA0, /* bit 3 : MDP_RDMA0 */
  119. CMDQ_ENG_MDP_RSZ0, /* bit 4 : MDP_RSZ0 */
  120. CMDQ_ENG_MDP_RSZ1, /* bit 5 : MDP_RSZ1 */
  121. CMDQ_ENG_MDP_TDSHP0, /* bit 6 : MDP_TDSHP0 */
  122. CMDQ_ENG_MDP_WDMA, /* bit 7 : MDP_WDMA */
  123. CMDQ_ENG_MDP_WROT0, /* bit 8 : MDP_WROT0 */
  124. [9 ... 31] = -1
  125. };
  126. for (i = 0; i < 32; ++i) {
  127. if (0 > engineResetBit[i])
  128. continue;
  129. if (engineToResetAgain & (1LL << engineResetBit[i]))
  130. reset_bits |= (1 << i);
  131. }
  132. if (0 != reset_bits) {
  133. /* 0: reset */
  134. /* 1: not reset */
  135. /* so we need to reverse the bits */
  136. reset_bits = ~reset_bits;
  137. CMDQ_REG_SET32(MMSYS_SW0_RST_B_REG, reset_bits);
  138. CMDQ_REG_SET32(MMSYS_SW0_RST_B_REG, ~0);
  139. /* This takes effect immediately, no need to poll state */
  140. }
  141. return 0;
  142. }
  143. int32_t cmdqVEncDumpInfo(uint64_t engineFlag, int logLevel)
  144. {
  145. if (engineFlag & (1LL << CMDQ_ENG_VIDEO_ENC))
  146. cmdq_mdp_dump_venc(VENC_BASE, "VENC");
  147. return 0;
  148. }
  149. void cmdq_mdp_init_module_base_VA(void)
  150. {
  151. memset(&gCmdqMdpModuleBaseVA, 0, sizeof(CmdqMdpModuleBaseVA));
  152. #ifdef CMDQ_OF_SUPPORT
  153. gCmdqMdpModuleBaseVA.MDP_RDMA = cmdq_dev_alloc_module_base_VA_by_name("mediatek,mdp_rdma");
  154. gCmdqMdpModuleBaseVA.MDP_RSZ0 = cmdq_dev_alloc_module_base_VA_by_name("mediatek,mdp_rsz0");
  155. gCmdqMdpModuleBaseVA.MDP_RSZ1 = cmdq_dev_alloc_module_base_VA_by_name("mediatek,mdp_rsz1");
  156. gCmdqMdpModuleBaseVA.MDP_WDMA = cmdq_dev_alloc_module_base_VA_by_name("mediatek,mdp_wdma");
  157. gCmdqMdpModuleBaseVA.MDP_WROT = cmdq_dev_alloc_module_base_VA_by_name("mediatek,mdp_wrot");
  158. gCmdqMdpModuleBaseVA.MDP_TDSHP = cmdq_dev_alloc_module_base_VA_by_name("mediatek,mdp_tdshp");
  159. gCmdqMdpModuleBaseVA.VENC = cmdq_dev_alloc_module_base_VA_by_name("mediatek,VENC");
  160. #endif
  161. }
  162. void cmdq_mdp_deinit_module_base_VA(void)
  163. {
  164. #ifdef CMDQ_OF_SUPPORT
  165. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_MDP_RDMA());
  166. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_MDP_RSZ0());
  167. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_MDP_RSZ1());
  168. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_MDP_WDMA());
  169. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_MDP_WROT());
  170. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_MDP_TDSHP());
  171. cmdq_dev_free_module_base_VA(cmdq_mdp_get_module_base_VA_VENC());
  172. memset(&gCmdqMdpModuleBaseVA, 0, sizeof(CmdqMdpModuleBaseVA));
  173. #else
  174. /* do nothing, registers' IOMAP will be destroyed by platform */
  175. #endif
  176. }
  177. bool cmdq_mdp_clock_is_on(CMDQ_ENG_ENUM engine)
  178. {
  179. switch (engine) {
  180. case CMDQ_ENG_MDP_CAMIN:
  181. return cmdq_mdp_clock_is_enable_CAM_MDP();
  182. case CMDQ_ENG_MDP_RDMA0:
  183. return cmdq_mdp_clock_is_enable_MDP_RDMA0();
  184. case CMDQ_ENG_MDP_RSZ0:
  185. return cmdq_mdp_clock_is_enable_MDP_RSZ0();
  186. case CMDQ_ENG_MDP_RSZ1:
  187. return cmdq_mdp_clock_is_enable_MDP_RSZ1();
  188. case CMDQ_ENG_MDP_WDMA:
  189. return cmdq_mdp_clock_is_enable_MDP_WDMA();
  190. case CMDQ_ENG_MDP_WROT0:
  191. return cmdq_mdp_clock_is_enable_MDP_WROT0();
  192. case CMDQ_ENG_MDP_TDSHP0:
  193. return cmdq_mdp_clock_is_enable_MDP_TDSHP0();
  194. default:
  195. CMDQ_ERR("try to query unknown mdp clock");
  196. return false;
  197. }
  198. }
  199. void cmdq_mdp_enable_clock(bool enable, CMDQ_ENG_ENUM engine)
  200. {
  201. switch (engine) {
  202. case CMDQ_ENG_MDP_CAMIN:
  203. cmdq_mdp_enable_clock_CAM_MDP(enable);
  204. break;
  205. case CMDQ_ENG_MDP_RDMA0:
  206. cmdq_mdp_enable_clock_MDP_RDMA0(enable);
  207. break;
  208. case CMDQ_ENG_MDP_RSZ0:
  209. cmdq_mdp_enable_clock_MDP_RSZ0(enable);
  210. break;
  211. case CMDQ_ENG_MDP_RSZ1:
  212. cmdq_mdp_enable_clock_MDP_RSZ1(enable);
  213. break;
  214. case CMDQ_ENG_MDP_WDMA:
  215. cmdq_mdp_enable_clock_MDP_WDMA(enable);
  216. break;
  217. case CMDQ_ENG_MDP_WROT0:
  218. cmdq_mdp_enable_clock_MDP_WROT0(enable);
  219. break;
  220. case CMDQ_ENG_MDP_TDSHP0:
  221. cmdq_mdp_enable_clock_MDP_TDSHP0(enable);
  222. break;
  223. default:
  224. CMDQ_ERR("try to enable unknown mdp clock");
  225. break;
  226. }
  227. }
  228. /* Common Clock Framework */
  229. void cmdq_mdp_init_module_clk(void)
  230. {
  231. #if defined(CMDQ_OF_SUPPORT) && defined(CMDQ_USE_CCF)
  232. cmdq_dev_get_module_clock_by_name("mediatek,mmsys_config", "CAM_MDP",
  233. &gCmdqMdpModuleClock.clk_CAM_MDP);
  234. cmdq_dev_get_module_clock_by_name("mediatek,mdp_rdma", "MDP_RDMA",
  235. &gCmdqMdpModuleClock.clk_MDP_RDMA);
  236. cmdq_dev_get_module_clock_by_name("mediatek,mdp_rsz0", "MDP_RSZ0",
  237. &gCmdqMdpModuleClock.clk_MDP_RSZ0);
  238. cmdq_dev_get_module_clock_by_name("mediatek,mdp_rsz1", "MDP_RSZ1",
  239. &gCmdqMdpModuleClock.clk_MDP_RSZ1);
  240. cmdq_dev_get_module_clock_by_name("mediatek,mdp_wdma", "MDP_WDMA",
  241. &gCmdqMdpModuleClock.clk_MDP_WDMA);
  242. cmdq_dev_get_module_clock_by_name("mediatek,mdp_wrot", "MDP_WROT",
  243. &gCmdqMdpModuleClock.clk_MDP_WROT);
  244. cmdq_dev_get_module_clock_by_name("mediatek,mdp_tdshp", "MDP_TDSHP",
  245. &gCmdqMdpModuleClock.clk_MDP_TDSHP);
  246. #endif
  247. }
  248. int32_t cmdqMdpClockOn(uint64_t engineFlag)
  249. {
  250. CMDQ_MSG("Enable MDP(0x%llx) clock begin\n", engineFlag);
  251. #ifdef CMDQ_PWR_AWARE
  252. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_CAMIN);
  253. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_RDMA0);
  254. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_RSZ0);
  255. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_RSZ1);
  256. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_TDSHP0);
  257. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_WROT0);
  258. cmdq_mdp_enable(engineFlag, CMDQ_ENG_MDP_WDMA);
  259. #else
  260. CMDQ_MSG("Force MDP clock all on\n");
  261. /* enable all bits in MMSYS_CG_CLR0 and MMSYS_CG_CLR1 */
  262. CMDQ_REG_SET32(MMSYS_CONFIG_BASE + 0x108, 0xFFFFFFFF);
  263. CMDQ_REG_SET32(MMSYS_CONFIG_BASE + 0x118, 0xFFFFFFFF);
  264. #endif /* #ifdef CMDQ_PWR_AWARE */
  265. CMDQ_MSG("Enable MDP(0x%llx) clock end\n", engineFlag);
  266. return 0;
  267. }
  268. typedef struct MODULE_BASE {
  269. uint64_t engine;
  270. long base; /* considering 64 bit kernel, use long type to store base addr */
  271. const char *name;
  272. } MODULE_BASE;
  273. #define DEFINE_MODULE(eng, base) {eng, base, #eng}
  274. int32_t cmdqMdpDumpInfo(uint64_t engineFlag, int logLevel)
  275. {
  276. if (engineFlag & (1LL << CMDQ_ENG_MDP_RDMA0))
  277. cmdq_mdp_dump_rdma(MDP_RDMA_BASE, "RDMA");
  278. if (engineFlag & (1LL << CMDQ_ENG_MDP_RSZ0))
  279. cmdq_mdp_get_func()->mdpDumpRsz(MDP_RSZ0_BASE, "RSZ0");
  280. if (engineFlag & (1LL << CMDQ_ENG_MDP_RSZ1))
  281. cmdq_mdp_get_func()->mdpDumpRsz(MDP_RSZ1_BASE, "RSZ1");
  282. if (engineFlag & (1LL << CMDQ_ENG_MDP_TDSHP0))
  283. cmdq_mdp_get_func()->mdpDumpTdshp(MDP_TDSHP_BASE, "TDSHP");
  284. if (engineFlag & (1LL << CMDQ_ENG_MDP_WROT0))
  285. cmdq_mdp_dump_rot(MDP_WROT_BASE, "WROT");
  286. if (engineFlag & (1LL << CMDQ_ENG_MDP_WDMA))
  287. cmdq_mdp_dump_wdma(MDP_WDMA_BASE, "WDMA");
  288. /* verbose case, dump entire 1KB HW register region */
  289. /* for each enabled HW module. */
  290. if (logLevel >= 1) {
  291. int inner = 0;
  292. const MODULE_BASE bases[] = {
  293. DEFINE_MODULE(CMDQ_ENG_MDP_RDMA0, MDP_RDMA_BASE),
  294. DEFINE_MODULE(CMDQ_ENG_MDP_RSZ0, MDP_RSZ0_BASE),
  295. DEFINE_MODULE(CMDQ_ENG_MDP_RSZ1, MDP_RSZ1_BASE),
  296. DEFINE_MODULE(CMDQ_ENG_MDP_TDSHP0, MDP_TDSHP_BASE),
  297. DEFINE_MODULE(CMDQ_ENG_MDP_WROT0, MDP_WROT_BASE),
  298. DEFINE_MODULE(CMDQ_ENG_MDP_WDMA, MDP_WDMA_BASE),
  299. };
  300. for (inner = 0; inner < (sizeof(bases) / sizeof(bases[0])); ++inner) {
  301. if (engineFlag & (1LL << bases[inner].engine)) {
  302. CMDQ_ERR("========= [CMDQ] %s dump base 0x%lx ========\n",
  303. bases[inner].name, bases[inner].base);
  304. print_hex_dump(KERN_ERR, "", DUMP_PREFIX_ADDRESS, 32, 4,
  305. (void *)bases[inner].base, 1024, false);
  306. }
  307. }
  308. }
  309. return 0;
  310. }
  311. typedef enum MOUT_BITS {
  312. MOUT_BITS_ISP_MDP = 0, /* bit 0: ISP_MDP multiple outupt reset */
  313. MOUT_BITS_MDP_RDMA0 = 1, /* bit 1: MDP_RDMA0 multiple outupt reset */
  314. MOUT_BITS_MDP_PRZ0 = 2, /* bit 2: MDP_PRZ0 multiple outupt reset */
  315. MOUT_BITS_MDP_PRZ1 = 3, /* bit 3: MDP_PRZ1 multiple outupt reset */
  316. MOUT_BITS_MDP_TDSHP0 = 4, /* bit 4: MDP_TDSHP0 multiple outupt reset */
  317. } MOUT_BITS;
  318. int32_t cmdqMdpResetEng(uint64_t engineFlag)
  319. {
  320. #ifndef CMDQ_PWR_AWARE
  321. return 0;
  322. #else
  323. int status = 0;
  324. int64_t engineToResetAgain = 0LL;
  325. uint32_t mout_bits_old = 0L;
  326. uint32_t mout_bits = 0L;
  327. long MMSYS_MOUT_RST_REG = MMSYS_CONFIG_BASE + (0x040);
  328. CMDQ_PROF_START(0, "MDP_Rst");
  329. CMDQ_VERBOSE("Reset MDP(0x%llx) begin\n", engineFlag);
  330. /* After resetting each component, */
  331. /* we need also reset corresponding MOUT config. */
  332. mout_bits_old = CMDQ_REG_GET32(MMSYS_MOUT_RST_REG);
  333. mout_bits = 0;
  334. if (engineFlag & (1LL << CMDQ_ENG_MDP_RDMA0)) {
  335. mout_bits |= (1 << MOUT_BITS_MDP_RDMA0);
  336. status = cmdq_mdp_loop_reset(CMDQ_ENG_MDP_RDMA0,
  337. MDP_RDMA_BASE + 0x8,
  338. MDP_RDMA_BASE + 0x408, 0x7FF00, 0x100, false);
  339. if (0 != status)
  340. engineToResetAgain |= (1LL << CMDQ_ENG_MDP_RDMA0);
  341. }
  342. if (engineFlag & (1LL << CMDQ_ENG_MDP_RSZ0)) {
  343. mout_bits |= (1 << MOUT_BITS_MDP_PRZ0);
  344. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_RSZ0)) {
  345. CMDQ_REG_SET32(MDP_RSZ0_BASE, 0x0);
  346. CMDQ_REG_SET32(MDP_RSZ0_BASE, 0x10000);
  347. CMDQ_REG_SET32(MDP_RSZ0_BASE, 0x0);
  348. }
  349. }
  350. if (engineFlag & (1LL << CMDQ_ENG_MDP_RSZ1)) {
  351. mout_bits |= (1 << MOUT_BITS_MDP_PRZ1);
  352. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_RSZ1)) {
  353. CMDQ_REG_SET32(MDP_RSZ1_BASE, 0x0);
  354. CMDQ_REG_SET32(MDP_RSZ1_BASE, 0x10000);
  355. CMDQ_REG_SET32(MDP_RSZ1_BASE, 0x0);
  356. }
  357. }
  358. if (engineFlag & (1LL << CMDQ_ENG_MDP_TDSHP0)) {
  359. mout_bits |= (1 << MOUT_BITS_MDP_TDSHP0);
  360. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_TDSHP0)) {
  361. CMDQ_REG_SET32(MDP_TDSHP_BASE + 0x100, 0x0);
  362. CMDQ_REG_SET32(MDP_TDSHP_BASE + 0x100, 0x2);
  363. CMDQ_REG_SET32(MDP_TDSHP_BASE + 0x100, 0x0);
  364. }
  365. }
  366. if (engineFlag & (1LL << CMDQ_ENG_MDP_WROT0)) {
  367. status = cmdq_mdp_loop_reset(CMDQ_ENG_MDP_WROT0,
  368. MDP_WROT_BASE + 0x010,
  369. MDP_WROT_BASE + 0x014, 0x1, 0x1, true);
  370. if (0 != status)
  371. engineToResetAgain |= (1LL << CMDQ_ENG_MDP_WROT0);
  372. }
  373. if (engineFlag & (1LL << CMDQ_ENG_MDP_WDMA)) {
  374. status = cmdq_mdp_loop_reset(CMDQ_ENG_MDP_WDMA,
  375. MDP_WDMA_BASE + 0x00C,
  376. MDP_WDMA_BASE + 0x0A0, 0x3FF, 0x1, false);
  377. if (0 != status)
  378. engineToResetAgain |= (1LL << CMDQ_ENG_MDP_WDMA);
  379. }
  380. if (engineFlag & (1LL << CMDQ_ENG_MDP_CAMIN)) {
  381. /* MDP_CAMIN can only reset by mmsys, */
  382. /* so this is not a "error" */
  383. cmdq_mdp_reset_with_mmsys((1LL << CMDQ_ENG_MDP_CAMIN));
  384. }
  385. /*
  386. when MDP engines fail to reset,
  387. 1. print SMI debug log
  388. 2. try resetting from MMSYS to restore system state
  389. 3. report to QA by raising AEE warning
  390. this reset will reset all registers to power on state.
  391. but DpFramework always reconfigures register values,
  392. so there is no need to backup registers.
  393. */
  394. if (0 != engineToResetAgain) {
  395. /* check SMI state immediately */
  396. /* if (1 == is_smi_larb_busy(0)) */
  397. /* { */
  398. /* smi_hanging_debug(5); */
  399. /* } */
  400. CMDQ_ERR("Reset failed MDP engines(0x%llx), reset again with MMSYS_SW0_RST_B\n",
  401. engineToResetAgain);
  402. cmdq_mdp_reset_with_mmsys(engineToResetAgain);
  403. /* finally, raise AEE warning to report normal reset fail. */
  404. /* we hope that reset MMSYS. */
  405. CMDQ_AEE("MDP", "Disable 0x%llx engine failed\n", engineToResetAgain);
  406. status = -EFAULT;
  407. }
  408. /* MOUT configuration reset */
  409. CMDQ_REG_SET32(MMSYS_MOUT_RST_REG, (mout_bits_old & (~mout_bits)));
  410. CMDQ_REG_SET32(MMSYS_MOUT_RST_REG, (mout_bits_old | mout_bits));
  411. CMDQ_REG_SET32(MMSYS_MOUT_RST_REG, (mout_bits_old & (~mout_bits)));
  412. CMDQ_MSG("Reset MDP(0x%llx) end\n", engineFlag);
  413. CMDQ_PROF_END(0, "MDP_Rst");
  414. return status;
  415. #endif /* #ifdef CMDQ_PWR_AWARE */
  416. }
  417. int32_t cmdqMdpClockOff(uint64_t engineFlag)
  418. {
  419. #ifdef CMDQ_PWR_AWARE
  420. CMDQ_MSG("Disable MDP(0x%llx) clock begin\n", engineFlag);
  421. if (engineFlag & (1LL << CMDQ_ENG_MDP_WDMA)) {
  422. cmdq_mdp_loop_off(CMDQ_ENG_MDP_WDMA,
  423. MDP_WDMA_BASE + 0x00C, MDP_WDMA_BASE + 0X0A0, 0x3FF, 0x1, false);
  424. }
  425. if (engineFlag & (1LL << CMDQ_ENG_MDP_WROT0)) {
  426. cmdq_mdp_loop_off(CMDQ_ENG_MDP_WROT0,
  427. MDP_WROT_BASE + 0X010, MDP_WROT_BASE + 0X014, 0x1, 0x1, true);
  428. }
  429. if (engineFlag & (1LL << CMDQ_ENG_MDP_TDSHP0)) {
  430. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_TDSHP0)) {
  431. CMDQ_REG_SET32(MDP_TDSHP_BASE + 0x100, 0x0);
  432. CMDQ_REG_SET32(MDP_TDSHP_BASE + 0x100, 0x2);
  433. CMDQ_REG_SET32(MDP_TDSHP_BASE + 0x100, 0x0);
  434. CMDQ_MSG("Disable MDP_TDSHP0 clock\n");
  435. cmdq_mdp_get_func()->enableMdpClock(false, CMDQ_ENG_MDP_TDSHP0);
  436. }
  437. }
  438. if (engineFlag & (1LL << CMDQ_ENG_MDP_RSZ1)) {
  439. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_RSZ1)) {
  440. CMDQ_REG_SET32(MDP_RSZ1_BASE, 0x0);
  441. CMDQ_REG_SET32(MDP_RSZ1_BASE, 0x10000);
  442. CMDQ_REG_SET32(MDP_RSZ1_BASE, 0x0);
  443. CMDQ_MSG("Disable MDP_RSZ1 clock\n");
  444. cmdq_mdp_get_func()->enableMdpClock(false, CMDQ_ENG_MDP_RSZ1);
  445. }
  446. }
  447. if (engineFlag & (1LL << CMDQ_ENG_MDP_RSZ0)) {
  448. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_RSZ0)) {
  449. CMDQ_REG_SET32(MDP_RSZ0_BASE, 0x0);
  450. CMDQ_REG_SET32(MDP_RSZ0_BASE, 0x10000);
  451. CMDQ_REG_SET32(MDP_RSZ0_BASE, 0x0);
  452. CMDQ_MSG("Disable MDP_RSZ0 clock\n");
  453. cmdq_mdp_get_func()->enableMdpClock(false, CMDQ_ENG_MDP_RSZ0);
  454. }
  455. }
  456. if (engineFlag & (1LL << CMDQ_ENG_MDP_RDMA0)) {
  457. cmdq_mdp_loop_off(CMDQ_ENG_MDP_RDMA0,
  458. MDP_RDMA_BASE + 0x008,
  459. MDP_RDMA_BASE + 0x408, 0x7FF00, 0x100, false);
  460. }
  461. if (engineFlag & (1LL << CMDQ_ENG_MDP_CAMIN)) {
  462. if (cmdq_mdp_get_func()->mdpClockIsOn(CMDQ_ENG_MDP_CAMIN)) {
  463. cmdq_mdp_reset_with_mmsys((1LL << CMDQ_ENG_MDP_CAMIN));
  464. CMDQ_MSG("Disable MDP_CAMIN clock\n");
  465. cmdq_mdp_get_func()->enableMdpClock(false, CMDQ_ENG_MDP_CAMIN);
  466. }
  467. }
  468. CMDQ_MSG("Disable MDP(0x%llx) clock end\n", engineFlag);
  469. #endif /* #ifdef CMDQ_PWR_AWARE */
  470. return 0;
  471. }
  472. uint32_t cmdq_mdp_rdma_get_reg_offset_src_addr(void)
  473. {
  474. return 0xF00;
  475. }
  476. uint32_t cmdq_mdp_wrot_get_reg_offset_dst_addr(void)
  477. {
  478. return 0xF00;
  479. }
  480. uint32_t cmdq_mdp_wdma_get_reg_offset_dst_addr(void)
  481. {
  482. return 0xF00;
  483. }
  484. void testcase_clkmgr_mdp(void)
  485. {
  486. #if defined(CMDQ_PWR_AWARE) && !defined(CMDQ_USE_CCF)
  487. /* RDMA clk test with src buffer addr */
  488. testcase_clkmgr_impl(MT_CG_DISP0_MDP_RDMA,
  489. "CMDQ_TEST_MDP_RDMA",
  490. MDP_RDMA_BASE + cmdq_mdp_rdma_get_reg_offset_src_addr(),
  491. 0xAACCBBDD,
  492. MDP_RDMA_BASE + cmdq_mdp_rdma_get_reg_offset_src_addr(), true);
  493. /* WDMA clk test with dst buffer addr */
  494. testcase_clkmgr_impl(MT_CG_DISP0_MDP_WDMA,
  495. "CMDQ_TEST_MDP_WDMA",
  496. MDP_WDMA_BASE + cmdq_mdp_wdma_get_reg_offset_dst_addr(),
  497. 0xAACCBBDD,
  498. MDP_WDMA_BASE + cmdq_mdp_wdma_get_reg_offset_dst_addr(), true);
  499. /* WROT clk test with dst buffer addr */
  500. testcase_clkmgr_impl(MT_CG_DISP0_MDP_WROT,
  501. "CMDQ_TEST_MDP_WROT",
  502. MDP_WROT_BASE + cmdq_mdp_wrot_get_reg_offset_dst_addr(),
  503. 0xAACCBBDD,
  504. MDP_WROT_BASE + cmdq_mdp_wrot_get_reg_offset_dst_addr(), true);
  505. /* TDSHP clk test with input size */
  506. testcase_clkmgr_impl(MT_CG_DISP0_MDP_TDSHP,
  507. "CMDQ_TEST_MDP_TDSHP",
  508. MDP_TDSHP_BASE + 0x244, 0xAACCBBDD, MDP_TDSHP_BASE + 0x244, true);
  509. /* RSZ clk test with debug port */
  510. testcase_clkmgr_impl(MT_CG_DISP0_MDP_RSZ0,
  511. "CMDQ_TEST_MDP_RSZ0",
  512. MDP_RSZ0_BASE + 0x040, 0x00000001, MDP_RSZ0_BASE + 0x044, false);
  513. testcase_clkmgr_impl(MT_CG_DISP0_MDP_RSZ1,
  514. "CMDQ_TEST_MDP_RSZ1",
  515. MDP_RSZ1_BASE + 0x040, 0x00000001, MDP_RSZ1_BASE + 0x044, false);
  516. #endif /* !defined(CMDQ_USE_CCF) */
  517. }
  518. void cmdq_mdp_platform_function_setting(void)
  519. {
  520. cmdqMDPFuncStruct *pFunc;
  521. pFunc = cmdq_mdp_get_func();
  522. pFunc->vEncDumpInfo = cmdqVEncDumpInfo;
  523. pFunc->initModuleBaseVA = cmdq_mdp_init_module_base_VA;
  524. pFunc->deinitModuleBaseVA = cmdq_mdp_deinit_module_base_VA;
  525. pFunc->mdpClockIsOn = cmdq_mdp_clock_is_on;
  526. pFunc->enableMdpClock = cmdq_mdp_enable_clock;
  527. pFunc->initModuleCLK = cmdq_mdp_init_module_clk;
  528. pFunc->mdpClockOn = cmdqMdpClockOn;
  529. pFunc->mdpDumpInfo = cmdqMdpDumpInfo;
  530. pFunc->mdpResetEng = cmdqMdpResetEng;
  531. pFunc->mdpClockOff = cmdqMdpClockOff;
  532. pFunc->rdmaGetRegOffsetSrcAddr = cmdq_mdp_rdma_get_reg_offset_src_addr;
  533. pFunc->wrotGetRegOffsetDstAddr = cmdq_mdp_wrot_get_reg_offset_dst_addr;
  534. pFunc->wdmaGetRegOffsetDstAddr = cmdq_mdp_wdma_get_reg_offset_dst_addr;
  535. pFunc->testcaseClkmgrMdp = testcase_clkmgr_mdp;
  536. }