sde_rsc_hw.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  4. * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "[sde_rsc_hw:%s:%d]: " fmt, __func__, __LINE__
  7. #include <linux/kernel.h>
  8. #include <linux/debugfs.h>
  9. #include <linux/delay.h>
  10. #include "sde_rsc_priv.h"
  11. #include "sde_dbg.h"
  12. #include "sde_rsc_hw.h"
  13. static void rsc_event_trigger(struct sde_rsc_priv *rsc, uint32_t event_type)
  14. {
  15. struct sde_rsc_event *event;
  16. list_for_each_entry(event, &rsc->event_list, list)
  17. if (event->event_type & event_type)
  18. event->cb_func(event_type, event->usr);
  19. }
  20. static int rsc_hw_qtimer_init(struct sde_rsc_priv *rsc)
  21. {
  22. pr_debug("rsc hardware qtimer init\n");
  23. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_HW_FRAME_SEL_1,
  24. 0xffffffff, rsc->debug_mode);
  25. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_HW_FRAME_SEL_2,
  26. 0xffffffff, rsc->debug_mode);
  27. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_CNTACR0_FG0,
  28. 0x1, rsc->debug_mode);
  29. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_QTMR_AC_CNTACR1_FG0,
  30. 0x1, rsc->debug_mode);
  31. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  32. 0xffffffff, rsc->debug_mode);
  33. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  34. 0xffffffff, rsc->debug_mode);
  35. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  36. 0xffffffff, rsc->debug_mode);
  37. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  38. 0xffffffff, rsc->debug_mode);
  39. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CTL,
  40. 0x1, rsc->debug_mode);
  41. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CTL,
  42. 0x1, rsc->debug_mode);
  43. return 0;
  44. }
  45. static int rsc_hw_pdc_init(struct sde_rsc_priv *rsc)
  46. {
  47. pr_debug("rsc hardware pdc init\n");
  48. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_SEQ_START_ADDR_REG_OFFSET_DRV0,
  49. 0x4520, rsc->debug_mode);
  50. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_MATCH_VALUE_LO_REG_OFFSET_DRV0,
  51. 0x4510, rsc->debug_mode);
  52. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_MATCH_VALUE_HI_REG_OFFSET_DRV0,
  53. 0x4514, rsc->debug_mode);
  54. dss_reg_w(&rsc->drv_io, SDE_RSCC_PDC_SLAVE_ID_DRV0,
  55. 0x1, rsc->debug_mode);
  56. return 0;
  57. }
  58. static int rsc_hw_wrapper_init(struct sde_rsc_priv *rsc)
  59. {
  60. pr_debug("rsc hardware wrapper init\n");
  61. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_STATIC_WAKEUP_0,
  62. rsc->timer_config.static_wakeup_time_ns, rsc->debug_mode);
  63. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_RSCC_MODE_THRESHOLD,
  64. rsc->timer_config.rsc_mode_threshold_time_ns, rsc->debug_mode);
  65. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  66. BIT(8), rsc->debug_mode);
  67. return 0;
  68. }
  69. static int rsc_hw_seq_memory_init_v2(struct sde_rsc_priv *rsc)
  70. {
  71. const u32 mode_0_start_addr = 0x0;
  72. const u32 mode_1_start_addr = 0xc;
  73. const u32 mode_2_start_addr = 0x18;
  74. pr_debug("rsc sequencer memory init v2\n");
  75. /* Mode - 0 sequence */
  76. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x0,
  77. 0xe0bb9ebe, rsc->debug_mode);
  78. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x4,
  79. 0x9ebeff39, rsc->debug_mode);
  80. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x8,
  81. 0x2020209b, rsc->debug_mode);
  82. /* Mode - 1 sequence */
  83. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0xc,
  84. 0x38bb9ebe, rsc->debug_mode);
  85. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x10,
  86. 0xbeff39e0, rsc->debug_mode);
  87. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x14,
  88. 0x20209b9e, rsc->debug_mode);
  89. /* Mode - 2 sequence */
  90. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x18,
  91. 0xb9bae5a0, rsc->debug_mode);
  92. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x1c,
  93. 0xbdbbf9fa, rsc->debug_mode);
  94. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x20,
  95. 0x38999afe, rsc->debug_mode);
  96. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x24,
  97. 0xac81e1a1, rsc->debug_mode);
  98. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x28,
  99. 0x82e2a2e0, rsc->debug_mode);
  100. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x2c,
  101. 0x8cfd9d39, rsc->debug_mode);
  102. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x30,
  103. 0xbc20209b, rsc->debug_mode);
  104. /* tcs sleep & wake sequence */
  105. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x34,
  106. 0xe601a6fc, rsc->debug_mode);
  107. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x38,
  108. 0xbc20209c, rsc->debug_mode);
  109. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x3c,
  110. 0xe701a7fc, rsc->debug_mode);
  111. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x40,
  112. 0x0000209c, rsc->debug_mode);
  113. /* branch address */
  114. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_0_DRV0,
  115. 0x33, rsc->debug_mode);
  116. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_1_DRV0,
  117. 0x3b, rsc->debug_mode);
  118. /* start address */
  119. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_CTRL_DRV0,
  120. mode_0_start_addr,
  121. rsc->debug_mode);
  122. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE0,
  123. mode_0_start_addr,
  124. rsc->debug_mode);
  125. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE1,
  126. mode_1_start_addr,
  127. rsc->debug_mode);
  128. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE2,
  129. mode_2_start_addr,
  130. rsc->debug_mode);
  131. return 0;
  132. }
  133. static int rsc_hw_seq_memory_init(struct sde_rsc_priv *rsc)
  134. {
  135. const u32 mode_0_start_addr = 0x0;
  136. const u32 mode_1_start_addr = 0xa;
  137. const u32 mode_2_start_addr = 0x15;
  138. pr_debug("rsc sequencer memory init\n");
  139. /* Mode - 0 sequence */
  140. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x0,
  141. 0xe0a88bab, rsc->debug_mode);
  142. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x4,
  143. 0x8babec39, rsc->debug_mode);
  144. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x8,
  145. 0x8bab2088, rsc->debug_mode);
  146. /* Mode - 1 sequence */
  147. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0xc,
  148. 0x39e038a8, rsc->debug_mode);
  149. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x10,
  150. 0x888babec, rsc->debug_mode);
  151. /* Mode - 2 sequence */
  152. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x14,
  153. 0xaaa8a020, rsc->debug_mode);
  154. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x18,
  155. 0xe1a138eb, rsc->debug_mode);
  156. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x1c,
  157. 0xe0aca581, rsc->debug_mode);
  158. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x20,
  159. 0x82e2a2ed, rsc->debug_mode);
  160. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x24,
  161. 0x8cea8a39, rsc->debug_mode);
  162. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x28,
  163. 0xe9a92088, rsc->debug_mode);
  164. /* tcs sleep & wake sequence */
  165. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x2c,
  166. 0x89e686a6, rsc->debug_mode);
  167. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x30,
  168. 0xa7e9a920, rsc->debug_mode);
  169. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_MEM_0_DRV0 + 0x34,
  170. 0x2089e787, rsc->debug_mode);
  171. /* branch address */
  172. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_0_DRV0,
  173. 0x2a, rsc->debug_mode);
  174. dss_reg_w(&rsc->drv_io, SDE_RSCC_SEQ_CFG_BR_ADDR_1_DRV0,
  175. 0x31, rsc->debug_mode);
  176. /* start address */
  177. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_CTRL_DRV0,
  178. mode_0_start_addr,
  179. rsc->debug_mode);
  180. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE0,
  181. mode_0_start_addr,
  182. rsc->debug_mode);
  183. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE1,
  184. mode_1_start_addr,
  185. rsc->debug_mode);
  186. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM0_DRV0_MODE2,
  187. mode_2_start_addr,
  188. rsc->debug_mode);
  189. return 0;
  190. }
  191. static int rsc_hw_solver_init(struct sde_rsc_priv *rsc)
  192. {
  193. pr_debug("rsc solver init\n");
  194. dss_reg_w(&rsc->drv_io, SDE_RSCC_SOFT_WAKEUP_TIME_LO_DRV0,
  195. 0xFFFFFFFF, rsc->debug_mode);
  196. dss_reg_w(&rsc->drv_io, SDE_RSCC_SOFT_WAKEUP_TIME_HI_DRV0,
  197. 0xFFFFFFFF, rsc->debug_mode);
  198. dss_reg_w(&rsc->drv_io, SDE_RSCC_MAX_IDLE_DURATION_DRV0,
  199. 0xEFFFFFFF, rsc->debug_mode);
  200. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_0_DRV0,
  201. 0x0, rsc->debug_mode);
  202. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_1_DRV0,
  203. rsc->timer_config.rsc_time_slot_0_ns, rsc->debug_mode);
  204. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_2_DRV0,
  205. rsc->timer_config.rsc_time_slot_1_ns, rsc->debug_mode);
  206. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_3_DRV0,
  207. rsc->timer_config.rsc_time_slot_2_ns, rsc->debug_mode);
  208. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_SOLVER_MODES_ENABLED_DRV0,
  209. 0x7, rsc->debug_mode);
  210. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT0_PRI0_DRV0,
  211. 0x0, rsc->debug_mode);
  212. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT1_PRI0_DRV0,
  213. 0x1, rsc->debug_mode);
  214. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT1_PRI3_DRV0,
  215. 0x1, rsc->debug_mode);
  216. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT2_PRI0_DRV0,
  217. 0x2, rsc->debug_mode);
  218. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PRI_TABLE_SLOT2_PRI3_DRV0,
  219. 0x2, rsc->debug_mode);
  220. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_MODE_DRV0,
  221. 0x0, rsc->debug_mode);
  222. dss_reg_w(&rsc->drv_io, SDE_RSC_TIMERS_CONSIDERED_DRV0,
  223. 0x1, rsc->debug_mode);
  224. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_OVERRIDE_IDLE_TIME_DRV0,
  225. 0x01000010, rsc->debug_mode);
  226. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM1_DRV0_MODE0,
  227. 0x80000000, rsc->debug_mode);
  228. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE0,
  229. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  230. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE0,
  231. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  232. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM1_DRV0_MODE1,
  233. 0x80000000, rsc->debug_mode);
  234. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE1,
  235. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  236. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE1,
  237. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  238. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM1_DRV0_MODE2,
  239. 0x80000000, rsc->debug_mode);
  240. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE2,
  241. 0x0, rsc->debug_mode);
  242. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE2,
  243. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  244. return 0;
  245. }
  246. static int rsc_hw_timer_update(struct sde_rsc_priv *rsc)
  247. {
  248. if (!rsc) {
  249. pr_debug("invalid input param\n");
  250. return -EINVAL;
  251. }
  252. pr_debug("rsc hw timer update\n");
  253. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_1_DRV0,
  254. rsc->timer_config.rsc_time_slot_0_ns, rsc->debug_mode);
  255. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_2_DRV0,
  256. rsc->timer_config.rsc_time_slot_1_ns, rsc->debug_mode);
  257. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_3_DRV0,
  258. rsc->timer_config.rsc_time_slot_2_ns, rsc->debug_mode);
  259. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE0,
  260. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  261. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE0,
  262. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  263. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM2_DRV0_MODE1,
  264. rsc->timer_config.rsc_backoff_time_ns, rsc->debug_mode);
  265. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE1,
  266. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  267. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_MODE_PARM3_DRV0_MODE2,
  268. rsc->timer_config.pdc_backoff_time_ns, rsc->debug_mode);
  269. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_STATIC_WAKEUP_0,
  270. rsc->timer_config.static_wakeup_time_ns, rsc->debug_mode);
  271. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_RSCC_MODE_THRESHOLD,
  272. rsc->timer_config.rsc_mode_threshold_time_ns, rsc->debug_mode);
  273. /* make sure that hw timers are updated */
  274. wmb();
  275. return 0;
  276. }
  277. int sde_rsc_mode2_exit(struct sde_rsc_priv *rsc, enum sde_rsc_state state)
  278. {
  279. int rc = -EBUSY;
  280. int count, reg;
  281. unsigned long power_status;
  282. rsc_event_trigger(rsc, SDE_RSC_EVENT_PRE_CORE_RESTORE);
  283. /**
  284. * force busy and idle during clk & video mode state because it
  285. * is trying to entry in mode-2 without turning on the vysnc.
  286. */
  287. if ((state == SDE_RSC_VID_STATE) || (state == SDE_RSC_CLK_STATE)) {
  288. reg = dss_reg_r(&rsc->wrapper_io,
  289. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  290. reg &= ~(BIT(8) | BIT(0));
  291. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  292. reg, rsc->debug_mode);
  293. }
  294. // needs review with HPG sequence
  295. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  296. 0x0, rsc->debug_mode);
  297. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  298. 0x0, rsc->debug_mode);
  299. reg = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  300. rsc->debug_mode);
  301. reg &= ~BIT(3);
  302. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  303. reg, rsc->debug_mode);
  304. if (rsc->version < SDE_RSC_REV_2) {
  305. reg = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  306. rsc->debug_mode);
  307. reg |= BIT(13);
  308. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  309. reg, rsc->debug_mode);
  310. }
  311. /* make sure that mode-2 exit before wait*/
  312. wmb();
  313. /* this wait is required to make sure that gdsc is powered on */
  314. for (count = MAX_CHECK_LOOPS; count > 0; count--) {
  315. power_status = dss_reg_r(&rsc->wrapper_io,
  316. SDE_RSCC_PWR_CTRL, rsc->debug_mode);
  317. if (!test_bit(POWER_CTRL_BIT_12, &power_status)) {
  318. reg = dss_reg_r(&rsc->drv_io,
  319. SDE_RSCC_SEQ_PROGRAM_COUNTER, rsc->debug_mode);
  320. SDE_EVT32_VERBOSE(count, reg, power_status);
  321. rc = 0;
  322. break;
  323. }
  324. usleep_range(10, 100);
  325. }
  326. if (rsc->version < SDE_RSC_REV_2) {
  327. reg = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  328. rsc->debug_mode);
  329. reg &= ~BIT(13);
  330. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_SPARE_PWR_EVENT,
  331. reg, rsc->debug_mode);
  332. }
  333. if (rc)
  334. pr_err("vdd reg is not enabled yet\n");
  335. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_SOLVER_MODES_ENABLED_DRV0,
  336. 0x3, rsc->debug_mode);
  337. reg = dss_reg_r(&rsc->wrapper_io,
  338. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  339. reg &= ~(BIT(0) | BIT(8));
  340. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  341. reg, rsc->debug_mode);
  342. wmb(); /* make sure to disable rsc solver state */
  343. reg = dss_reg_r(&rsc->wrapper_io,
  344. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  345. reg |= (BIT(0) | BIT(8));
  346. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  347. reg, rsc->debug_mode);
  348. wmb(); /* make sure to enable rsc solver state */
  349. rsc_event_trigger(rsc, SDE_RSC_EVENT_POST_CORE_RESTORE);
  350. return rc;
  351. }
  352. static int sde_rsc_mode2_entry_trigger(struct sde_rsc_priv *rsc)
  353. {
  354. int rc;
  355. int count, wrapper_status;
  356. unsigned long reg;
  357. /* update qtimers to high during clk & video mode state */
  358. if ((rsc->current_state == SDE_RSC_VID_STATE) ||
  359. (rsc->current_state == SDE_RSC_CLK_STATE)) {
  360. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  361. 0xffffffff, rsc->debug_mode);
  362. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  363. 0xffffffff, rsc->debug_mode);
  364. }
  365. wrapper_status = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  366. rsc->debug_mode);
  367. wrapper_status |= BIT(3);
  368. wrapper_status |= BIT(0);
  369. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  370. wrapper_status, rsc->debug_mode);
  371. /**
  372. * force busy and idle during clk & video mode state because it
  373. * is trying to entry in mode-2 without turning on the vysnc.
  374. */
  375. if ((rsc->current_state == SDE_RSC_VID_STATE) ||
  376. (rsc->current_state == SDE_RSC_CLK_STATE)) {
  377. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  378. BIT(0) | BIT(1), rsc->debug_mode);
  379. wmb(); /* force busy gurantee */
  380. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  381. BIT(0) | BIT(9), rsc->debug_mode);
  382. }
  383. /* make sure that mode-2 is triggered before wait*/
  384. wmb();
  385. rc = -EBUSY;
  386. /* this wait is required to turn off the rscc clocks */
  387. for (count = MAX_CHECK_LOOPS; count > 0; count--) {
  388. reg = dss_reg_r(&rsc->wrapper_io,
  389. SDE_RSCC_PWR_CTRL, rsc->debug_mode);
  390. if (test_bit(POWER_CTRL_BIT_12, &reg)) {
  391. rc = 0;
  392. break;
  393. }
  394. usleep_range(10, 100);
  395. }
  396. return rc;
  397. }
  398. static void sde_rsc_reset_mode_0_1(struct sde_rsc_priv *rsc)
  399. {
  400. u32 seq_busy, current_mode, curr_inst_addr;
  401. seq_busy = dss_reg_r(&rsc->drv_io, SDE_RSCC_SEQ_BUSY_DRV0,
  402. rsc->debug_mode);
  403. current_mode = dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS2_DRV0,
  404. rsc->debug_mode);
  405. curr_inst_addr = dss_reg_r(&rsc->drv_io, SDE_RSCC_SEQ_PROGRAM_COUNTER,
  406. rsc->debug_mode);
  407. SDE_EVT32(seq_busy, current_mode, curr_inst_addr);
  408. if (seq_busy && (current_mode == SDE_RSC_MODE_0_VAL ||
  409. current_mode == SDE_RSC_MODE_1_VAL)) {
  410. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  411. 0xffffff, rsc->debug_mode);
  412. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  413. 0xffffffff, rsc->debug_mode);
  414. /* unstick f1 qtimer */
  415. wmb();
  416. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_HI,
  417. 0x0, rsc->debug_mode);
  418. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F1_QTMR_V1_CNTP_CVAL_LO,
  419. 0x0, rsc->debug_mode);
  420. /* manually trigger f1 qtimer interrupt */
  421. wmb();
  422. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  423. 0xffffff, rsc->debug_mode);
  424. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  425. 0xffffffff, rsc->debug_mode);
  426. /* unstick f0 qtimer */
  427. wmb();
  428. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_HI,
  429. 0x0, rsc->debug_mode);
  430. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_F0_QTMR_V1_CNTP_CVAL_LO,
  431. 0x0, rsc->debug_mode);
  432. /* manually trigger f0 qtimer interrupt */
  433. wmb();
  434. }
  435. }
  436. static int sde_rsc_mode2_entry(struct sde_rsc_priv *rsc)
  437. {
  438. int rc = 0, i;
  439. u32 reg;
  440. if (rsc->power_collapse_block)
  441. return -EINVAL;
  442. if (rsc->sw_fs_enabled) {
  443. rc = regulator_set_mode(rsc->fs, REGULATOR_MODE_FAST);
  444. if (rc) {
  445. pr_err("vdd reg fast mode set failed rc:%d\n", rc);
  446. return rc;
  447. }
  448. }
  449. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_SOLVER_MODES_ENABLED_DRV0,
  450. 0x7, rsc->debug_mode);
  451. rsc_event_trigger(rsc, SDE_RSC_EVENT_PRE_CORE_PC);
  452. for (i = 0; i <= MAX_MODE2_ENTRY_TRY; i++) {
  453. rc = sde_rsc_mode2_entry_trigger(rsc);
  454. if (!rc)
  455. break;
  456. reg = dss_reg_r(&rsc->drv_io,
  457. SDE_RSCC_SEQ_PROGRAM_COUNTER, rsc->debug_mode);
  458. pr_err("mdss gdsc power down failed, instruction:0x%x, rc:%d\n",
  459. reg, rc);
  460. SDE_EVT32(rc, reg, SDE_EVTLOG_ERROR);
  461. /* avoid touching f1 qtimer for last try */
  462. if (i != MAX_MODE2_ENTRY_TRY)
  463. sde_rsc_reset_mode_0_1(rsc);
  464. }
  465. if (rc)
  466. goto end;
  467. if ((rsc->current_state == SDE_RSC_VID_STATE) ||
  468. (rsc->current_state == SDE_RSC_CLK_STATE)) {
  469. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  470. BIT(0) | BIT(8), rsc->debug_mode);
  471. wmb(); /* force busy on vsync */
  472. }
  473. rsc_event_trigger(rsc, SDE_RSC_EVENT_POST_CORE_PC);
  474. if (rsc->sw_fs_enabled) {
  475. regulator_disable(rsc->fs);
  476. rsc->sw_fs_enabled = false;
  477. }
  478. return 0;
  479. end:
  480. sde_rsc_mode2_exit(rsc, rsc->current_state);
  481. return rc;
  482. }
  483. static int sde_rsc_state_update(struct sde_rsc_priv *rsc,
  484. enum sde_rsc_state state)
  485. {
  486. int rc = 0;
  487. int reg;
  488. if (rsc->power_collapse) {
  489. rc = sde_rsc_mode2_exit(rsc, state);
  490. if (rc)
  491. pr_err("power collapse: mode2 exit failed\n");
  492. else
  493. rsc->power_collapse = false;
  494. }
  495. switch (state) {
  496. case SDE_RSC_CMD_STATE:
  497. pr_debug("command mode handling\n");
  498. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  499. 0x1, rsc->debug_mode);
  500. dss_reg_w(&rsc->drv_io, SDE_RSCC_SOLVER_OVERRIDE_CTRL_DRV0,
  501. 0x0, rsc->debug_mode);
  502. reg = dss_reg_r(&rsc->wrapper_io,
  503. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  504. reg |= (BIT(0) | BIT(8));
  505. reg &= ~(BIT(1) | BIT(2) | BIT(3) | BIT(6) | BIT(7) | BIT(9));
  506. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  507. reg, rsc->debug_mode);
  508. /* make sure that solver is enabled */
  509. wmb();
  510. rsc_event_trigger(rsc, SDE_RSC_EVENT_SOLVER_ENABLED);
  511. break;
  512. case SDE_RSC_VID_STATE:
  513. pr_debug("video mode handling\n");
  514. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  515. 0x1, rsc->debug_mode);
  516. reg = dss_reg_r(&rsc->wrapper_io,
  517. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  518. reg |= BIT(8);
  519. reg &= ~(BIT(1) | BIT(0));
  520. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  521. reg, rsc->debug_mode);
  522. /* make sure that solver mode is override */
  523. wmb();
  524. rsc_event_trigger(rsc, SDE_RSC_EVENT_SOLVER_DISABLED);
  525. break;
  526. case SDE_RSC_CLK_STATE:
  527. pr_debug("clk state handling\n");
  528. reg = dss_reg_r(&rsc->wrapper_io,
  529. SDE_RSCC_WRAPPER_OVERRIDE_CTRL, rsc->debug_mode);
  530. reg &= ~BIT(0);
  531. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  532. reg, rsc->debug_mode);
  533. /* make sure that solver mode is disabled */
  534. wmb();
  535. break;
  536. case SDE_RSC_IDLE_STATE:
  537. rc = sde_rsc_mode2_entry(rsc);
  538. if (rc)
  539. pr_err("power collapse - mode 2 entry failed\n");
  540. else
  541. rsc->power_collapse = true;
  542. break;
  543. default:
  544. pr_err("state:%d handling is not supported\n", state);
  545. break;
  546. }
  547. return rc;
  548. }
  549. int rsc_hw_init(struct sde_rsc_priv *rsc)
  550. {
  551. int rc = 0;
  552. rc = rsc_hw_qtimer_init(rsc);
  553. if (rc) {
  554. pr_err("rsc hw qtimer init failed\n");
  555. goto end;
  556. }
  557. rc = rsc_hw_wrapper_init(rsc);
  558. if (rc) {
  559. pr_err("rsc hw wrapper init failed\n");
  560. goto end;
  561. }
  562. if (rsc->version == SDE_RSC_REV_2)
  563. rc = rsc_hw_seq_memory_init_v2(rsc);
  564. else
  565. rc = rsc_hw_seq_memory_init(rsc);
  566. if (rc) {
  567. pr_err("rsc sequencer memory init failed\n");
  568. goto end;
  569. }
  570. rc = rsc_hw_solver_init(rsc);
  571. if (rc) {
  572. pr_err("rsc solver init failed\n");
  573. goto end;
  574. }
  575. rc = rsc_hw_pdc_init(rsc);
  576. if (rc) {
  577. pr_err("rsc hw pdc init failed\n");
  578. goto end;
  579. }
  580. /* make sure that hw is initialized */
  581. wmb();
  582. pr_info("sde rsc init successfully done\n");
  583. end:
  584. return rc;
  585. }
  586. int rsc_hw_mode_ctrl(struct sde_rsc_priv *rsc, enum rsc_mode_req request,
  587. char *buffer, int buffer_size, u32 mode)
  588. {
  589. u32 blen = 0;
  590. u32 slot_time;
  591. switch (request) {
  592. case MODE_READ:
  593. if (!buffer || !buffer_size)
  594. return blen;
  595. blen = scnprintf(buffer, buffer_size, "mode_status:0x%x\n",
  596. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS2_DRV0,
  597. rsc->debug_mode));
  598. break;
  599. case MODE_UPDATE:
  600. slot_time = mode & BIT(0) ? 0x0 :
  601. rsc->timer_config.rsc_time_slot_2_ns;
  602. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_0_DRV0,
  603. slot_time, rsc->debug_mode);
  604. slot_time = mode & BIT(1) ?
  605. rsc->timer_config.rsc_time_slot_0_ns :
  606. rsc->timer_config.rsc_time_slot_2_ns;
  607. dss_reg_w(&rsc->drv_io, SDE_RSC_SOLVER_TIME_SLOT_TABLE_1_DRV0,
  608. slot_time, rsc->debug_mode);
  609. rsc->power_collapse_block = !(mode & BIT(2));
  610. break;
  611. default:
  612. break;
  613. }
  614. return blen;
  615. }
  616. int sde_rsc_debug_show(struct seq_file *s, struct sde_rsc_priv *rsc)
  617. {
  618. seq_printf(s, "override ctrl:0x%x\n",
  619. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_OVERRIDE_CTRL,
  620. rsc->debug_mode));
  621. seq_printf(s, "power ctrl:0x%x\n",
  622. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_PWR_CTRL,
  623. rsc->debug_mode));
  624. seq_printf(s, "vsycn timestamp0:0x%x\n",
  625. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP0,
  626. rsc->debug_mode));
  627. seq_printf(s, "vsycn timestamp1:0x%x\n",
  628. dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP1,
  629. rsc->debug_mode));
  630. seq_printf(s, "error irq status:0x%x\n",
  631. dss_reg_r(&rsc->drv_io, SDE_RSCC_ERROR_IRQ_STATUS_DRV0,
  632. rsc->debug_mode));
  633. seq_printf(s, "seq busy status:0x%x\n",
  634. dss_reg_r(&rsc->drv_io, SDE_RSCC_SEQ_BUSY_DRV0,
  635. rsc->debug_mode));
  636. seq_printf(s, "solver override ctrl status:0x%x\n",
  637. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_OVERRIDE_CTRL_DRV0,
  638. rsc->debug_mode));
  639. seq_printf(s, "solver override status:0x%x\n",
  640. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS0_DRV0,
  641. rsc->debug_mode));
  642. seq_printf(s, "solver timeslot status:0x%x\n",
  643. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS1_DRV0,
  644. rsc->debug_mode));
  645. seq_printf(s, "solver mode status:0x%x\n",
  646. dss_reg_r(&rsc->drv_io, SDE_RSCC_SOLVER_STATUS2_DRV0,
  647. rsc->debug_mode));
  648. seq_printf(s, "amc status:0x%x\n",
  649. dss_reg_r(&rsc->drv_io, SDE_RSCC_AMC_TCS_MODE_IRQ_STATUS_DRV0,
  650. rsc->debug_mode));
  651. return 0;
  652. }
  653. int rsc_hw_vsync(struct sde_rsc_priv *rsc, enum rsc_vsync_req request,
  654. char *buffer, int buffer_size, u32 mode)
  655. {
  656. u32 blen = 0, reg;
  657. switch (request) {
  658. case VSYNC_READ:
  659. if (!buffer || !buffer_size)
  660. return blen;
  661. blen = scnprintf(buffer, buffer_size, "vsync0:0x%x\n",
  662. dss_reg_r(&rsc->wrapper_io,
  663. SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP0,
  664. rsc->debug_mode));
  665. blen += scnprintf(buffer + blen, buffer_size - blen,
  666. "vsync1:0x%x\n",
  667. dss_reg_r(&rsc->wrapper_io,
  668. SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP1,
  669. rsc->debug_mode));
  670. break;
  671. case VSYNC_READ_VSYNC0:
  672. return dss_reg_r(&rsc->wrapper_io,
  673. SDE_RSCC_WRAPPER_VSYNC_TIMESTAMP0,
  674. rsc->debug_mode);
  675. case VSYNC_ENABLE:
  676. /* clear the current VSYNC value */
  677. reg = BIT(9) | ((mode & 0x7) << 10);
  678. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  679. reg, rsc->debug_mode);
  680. /* enable the VSYNC logging */
  681. reg = BIT(8) | ((mode & 0x7) << 10);
  682. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  683. reg, rsc->debug_mode);
  684. /* ensure vsync config has been written before waiting on it */
  685. wmb();
  686. break;
  687. case VSYNC_DISABLE:
  688. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  689. 0x0, rsc->debug_mode);
  690. break;
  691. }
  692. return blen;
  693. }
  694. void rsc_hw_debug_dump(struct sde_rsc_priv *rsc, u32 mux_sel)
  695. {
  696. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_DEBUG_BUS,
  697. ((mux_sel & 0xf) << 1) | BIT(0), rsc->debug_mode);
  698. }
  699. int rsc_hw_tcs_wait(struct sde_rsc_priv *rsc)
  700. {
  701. int rc = -EBUSY;
  702. int count, seq_status;
  703. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  704. 0x0, rsc->debug_mode);
  705. seq_status = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  706. rsc->debug_mode) & BIT(1);
  707. /* if seq busy - set TCS use OK to high and wait for 200us */
  708. if (seq_status) {
  709. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  710. 0x1, rsc->debug_mode);
  711. usleep_range(100, 200);
  712. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  713. 0x0, rsc->debug_mode);
  714. }
  715. /* check for sequence running status before exiting */
  716. for (count = (MAX_CHECK_LOOPS / 4); count > 0; count--) {
  717. seq_status = dss_reg_r(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  718. rsc->debug_mode) & BIT(1);
  719. if (!seq_status) {
  720. rc = 0;
  721. break;
  722. }
  723. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  724. 0x1, rsc->debug_mode);
  725. usleep_range(3, 4);
  726. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  727. 0x0, rsc->debug_mode);
  728. }
  729. return rc;
  730. }
  731. int rsc_hw_tcs_use_ok(struct sde_rsc_priv *rsc)
  732. {
  733. dss_reg_w(&rsc->wrapper_io, SDE_RSCC_WRAPPER_CTRL,
  734. 0x1, rsc->debug_mode);
  735. return 0;
  736. }
  737. int sde_rsc_hw_register(struct sde_rsc_priv *rsc)
  738. {
  739. pr_debug("rsc hardware register\n");
  740. rsc->hw_ops.init = rsc_hw_init;
  741. rsc->hw_ops.timer_update = rsc_hw_timer_update;
  742. rsc->hw_ops.tcs_wait = rsc_hw_tcs_wait;
  743. rsc->hw_ops.tcs_use_ok = rsc_hw_tcs_use_ok;
  744. rsc->hw_ops.hw_vsync = rsc_hw_vsync;
  745. rsc->hw_ops.state_update = sde_rsc_state_update;
  746. rsc->hw_ops.debug_show = sde_rsc_debug_show;
  747. rsc->hw_ops.mode_ctrl = rsc_hw_mode_ctrl;
  748. rsc->hw_ops.debug_dump = rsc_hw_debug_dump;
  749. return 0;
  750. }