dcn10_hubbub.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. /*
  2. * Copyright 2016 Advanced Micro Devices, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in
  12. * all copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  17. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20. * OTHER DEALINGS IN THE SOFTWARE.
  21. *
  22. * Authors: AMD
  23. *
  24. */
  25. #include "dm_services.h"
  26. #include "dcn10_hubp.h"
  27. #include "dcn10_hubbub.h"
  28. #include "reg_helper.h"
  29. #define CTX \
  30. hubbub->ctx
  31. #define DC_LOGGER \
  32. hubbub->ctx->logger
  33. #define REG(reg)\
  34. hubbub->regs->reg
  35. #undef FN
  36. #define FN(reg_name, field_name) \
  37. hubbub->shifts->field_name, hubbub->masks->field_name
  38. void hubbub1_wm_read_state(struct hubbub *hubbub,
  39. struct dcn_hubbub_wm *wm)
  40. {
  41. struct dcn_hubbub_wm_set *s;
  42. memset(wm, 0, sizeof(struct dcn_hubbub_wm));
  43. s = &wm->sets[0];
  44. s->wm_set = 0;
  45. s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A);
  46. s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A);
  47. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
  48. s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A);
  49. s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A);
  50. }
  51. s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A);
  52. s = &wm->sets[1];
  53. s->wm_set = 1;
  54. s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B);
  55. s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B);
  56. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
  57. s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B);
  58. s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B);
  59. }
  60. s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B);
  61. s = &wm->sets[2];
  62. s->wm_set = 2;
  63. s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C);
  64. s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C);
  65. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
  66. s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C);
  67. s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C);
  68. }
  69. s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C);
  70. s = &wm->sets[3];
  71. s->wm_set = 3;
  72. s->data_urgent = REG_READ(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D);
  73. s->pte_meta_urgent = REG_READ(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D);
  74. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
  75. s->sr_enter = REG_READ(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D);
  76. s->sr_exit = REG_READ(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D);
  77. }
  78. s->dram_clk_chanage = REG_READ(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D);
  79. }
  80. bool hubbub1_verify_allow_pstate_change_high(
  81. struct hubbub *hubbub)
  82. {
  83. /* pstate latency is ~20us so if we wait over 40us and pstate allow
  84. * still not asserted, we are probably stuck and going to hang
  85. *
  86. * TODO: Figure out why it takes ~100us on linux
  87. * pstate takes around ~100us on linux. Unknown currently as to
  88. * why it takes that long on linux
  89. */
  90. static unsigned int pstate_wait_timeout_us = 200;
  91. static unsigned int pstate_wait_expected_timeout_us = 40;
  92. static unsigned int max_sampled_pstate_wait_us; /* data collection */
  93. static bool forced_pstate_allow; /* help with revert wa */
  94. unsigned int debug_data;
  95. unsigned int i;
  96. if (forced_pstate_allow) {
  97. /* we hacked to force pstate allow to prevent hang last time
  98. * we verify_allow_pstate_change_high. so disable force
  99. * here so we can check status
  100. */
  101. REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
  102. DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 0,
  103. DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 0);
  104. forced_pstate_allow = false;
  105. }
  106. /* RV1:
  107. * dchubbubdebugind, at: 0x7
  108. * description "3-0: Pipe0 cursor0 QOS
  109. * 7-4: Pipe1 cursor0 QOS
  110. * 11-8: Pipe2 cursor0 QOS
  111. * 15-12: Pipe3 cursor0 QOS
  112. * 16: Pipe0 Plane0 Allow Pstate Change
  113. * 17: Pipe1 Plane0 Allow Pstate Change
  114. * 18: Pipe2 Plane0 Allow Pstate Change
  115. * 19: Pipe3 Plane0 Allow Pstate Change
  116. * 20: Pipe0 Plane1 Allow Pstate Change
  117. * 21: Pipe1 Plane1 Allow Pstate Change
  118. * 22: Pipe2 Plane1 Allow Pstate Change
  119. * 23: Pipe3 Plane1 Allow Pstate Change
  120. * 24: Pipe0 cursor0 Allow Pstate Change
  121. * 25: Pipe1 cursor0 Allow Pstate Change
  122. * 26: Pipe2 cursor0 Allow Pstate Change
  123. * 27: Pipe3 cursor0 Allow Pstate Change
  124. * 28: WB0 Allow Pstate Change
  125. * 29: WB1 Allow Pstate Change
  126. * 30: Arbiter's allow_pstate_change
  127. * 31: SOC pstate change request
  128. */
  129. REG_WRITE(DCHUBBUB_TEST_DEBUG_INDEX, hubbub->debug_test_index_pstate);
  130. for (i = 0; i < pstate_wait_timeout_us; i++) {
  131. debug_data = REG_READ(DCHUBBUB_TEST_DEBUG_DATA);
  132. if (debug_data & (1 << 30)) {
  133. if (i > pstate_wait_expected_timeout_us)
  134. DC_LOG_WARNING("pstate took longer than expected ~%dus\n",
  135. i);
  136. return true;
  137. }
  138. if (max_sampled_pstate_wait_us < i)
  139. max_sampled_pstate_wait_us = i;
  140. udelay(1);
  141. }
  142. /* force pstate allow to prevent system hang
  143. * and break to debugger to investigate
  144. */
  145. REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
  146. DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_VALUE, 1,
  147. DCHUBBUB_ARB_ALLOW_PSTATE_CHANGE_FORCE_ENABLE, 1);
  148. forced_pstate_allow = true;
  149. DC_LOG_WARNING("pstate TEST_DEBUG_DATA: 0x%X\n",
  150. debug_data);
  151. return false;
  152. }
  153. static uint32_t convert_and_clamp(
  154. uint32_t wm_ns,
  155. uint32_t refclk_mhz,
  156. uint32_t clamp_value)
  157. {
  158. uint32_t ret_val = 0;
  159. ret_val = wm_ns * refclk_mhz;
  160. ret_val /= 1000;
  161. if (ret_val > clamp_value)
  162. ret_val = clamp_value;
  163. return ret_val;
  164. }
  165. void hubbub1_program_watermarks(
  166. struct hubbub *hubbub,
  167. struct dcn_watermark_set *watermarks,
  168. unsigned int refclk_mhz)
  169. {
  170. uint32_t force_en = hubbub->ctx->dc->debug.disable_stutter ? 1 : 0;
  171. /*
  172. * Need to clamp to max of the register values (i.e. no wrap)
  173. * for dcn1, all wm registers are 21-bit wide
  174. */
  175. uint32_t prog_wm_value;
  176. REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
  177. DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 0);
  178. /* Repeat for water mark set A, B, C and D. */
  179. /* clock state A */
  180. prog_wm_value = convert_and_clamp(watermarks->a.urgent_ns,
  181. refclk_mhz, 0x1fffff);
  182. REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_A, prog_wm_value);
  183. DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_A calculated =%d\n"
  184. "HW register value = 0x%x\n",
  185. watermarks->a.urgent_ns, prog_wm_value);
  186. prog_wm_value = convert_and_clamp(watermarks->a.pte_meta_urgent_ns,
  187. refclk_mhz, 0x1fffff);
  188. REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_A, prog_wm_value);
  189. DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_A calculated =%d\n"
  190. "HW register value = 0x%x\n",
  191. watermarks->a.pte_meta_urgent_ns, prog_wm_value);
  192. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A)) {
  193. prog_wm_value = convert_and_clamp(
  194. watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns,
  195. refclk_mhz, 0x1fffff);
  196. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_A, prog_wm_value);
  197. DC_LOG_BANDWIDTH_CALCS("SR_ENTER_EXIT_WATERMARK_A calculated =%d\n"
  198. "HW register value = 0x%x\n",
  199. watermarks->a.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
  200. prog_wm_value = convert_and_clamp(
  201. watermarks->a.cstate_pstate.cstate_exit_ns,
  202. refclk_mhz, 0x1fffff);
  203. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_A, prog_wm_value);
  204. DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_A calculated =%d\n"
  205. "HW register value = 0x%x\n",
  206. watermarks->a.cstate_pstate.cstate_exit_ns, prog_wm_value);
  207. }
  208. prog_wm_value = convert_and_clamp(
  209. watermarks->a.cstate_pstate.pstate_change_ns,
  210. refclk_mhz, 0x1fffff);
  211. REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_A, prog_wm_value);
  212. DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_A calculated =%d\n"
  213. "HW register value = 0x%x\n\n",
  214. watermarks->a.cstate_pstate.pstate_change_ns, prog_wm_value);
  215. /* clock state B */
  216. prog_wm_value = convert_and_clamp(
  217. watermarks->b.urgent_ns, refclk_mhz, 0x1fffff);
  218. REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_B, prog_wm_value);
  219. DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_B calculated =%d\n"
  220. "HW register value = 0x%x\n",
  221. watermarks->b.urgent_ns, prog_wm_value);
  222. prog_wm_value = convert_and_clamp(
  223. watermarks->b.pte_meta_urgent_ns,
  224. refclk_mhz, 0x1fffff);
  225. REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_B, prog_wm_value);
  226. DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_B calculated =%d\n"
  227. "HW register value = 0x%x\n",
  228. watermarks->b.pte_meta_urgent_ns, prog_wm_value);
  229. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B)) {
  230. prog_wm_value = convert_and_clamp(
  231. watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns,
  232. refclk_mhz, 0x1fffff);
  233. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_B, prog_wm_value);
  234. DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_B calculated =%d\n"
  235. "HW register value = 0x%x\n",
  236. watermarks->b.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
  237. prog_wm_value = convert_and_clamp(
  238. watermarks->b.cstate_pstate.cstate_exit_ns,
  239. refclk_mhz, 0x1fffff);
  240. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_B, prog_wm_value);
  241. DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_B calculated =%d\n"
  242. "HW register value = 0x%x\n",
  243. watermarks->b.cstate_pstate.cstate_exit_ns, prog_wm_value);
  244. }
  245. prog_wm_value = convert_and_clamp(
  246. watermarks->b.cstate_pstate.pstate_change_ns,
  247. refclk_mhz, 0x1fffff);
  248. REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_B, prog_wm_value);
  249. DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_B calculated =%d\n\n"
  250. "HW register value = 0x%x\n",
  251. watermarks->b.cstate_pstate.pstate_change_ns, prog_wm_value);
  252. /* clock state C */
  253. prog_wm_value = convert_and_clamp(
  254. watermarks->c.urgent_ns, refclk_mhz, 0x1fffff);
  255. REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_C, prog_wm_value);
  256. DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_C calculated =%d\n"
  257. "HW register value = 0x%x\n",
  258. watermarks->c.urgent_ns, prog_wm_value);
  259. prog_wm_value = convert_and_clamp(
  260. watermarks->c.pte_meta_urgent_ns,
  261. refclk_mhz, 0x1fffff);
  262. REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_C, prog_wm_value);
  263. DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_C calculated =%d\n"
  264. "HW register value = 0x%x\n",
  265. watermarks->c.pte_meta_urgent_ns, prog_wm_value);
  266. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C)) {
  267. prog_wm_value = convert_and_clamp(
  268. watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns,
  269. refclk_mhz, 0x1fffff);
  270. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_C, prog_wm_value);
  271. DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_C calculated =%d\n"
  272. "HW register value = 0x%x\n",
  273. watermarks->c.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
  274. prog_wm_value = convert_and_clamp(
  275. watermarks->c.cstate_pstate.cstate_exit_ns,
  276. refclk_mhz, 0x1fffff);
  277. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_C, prog_wm_value);
  278. DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_C calculated =%d\n"
  279. "HW register value = 0x%x\n",
  280. watermarks->c.cstate_pstate.cstate_exit_ns, prog_wm_value);
  281. }
  282. prog_wm_value = convert_and_clamp(
  283. watermarks->c.cstate_pstate.pstate_change_ns,
  284. refclk_mhz, 0x1fffff);
  285. REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_C, prog_wm_value);
  286. DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_C calculated =%d\n\n"
  287. "HW register value = 0x%x\n",
  288. watermarks->c.cstate_pstate.pstate_change_ns, prog_wm_value);
  289. /* clock state D */
  290. prog_wm_value = convert_and_clamp(
  291. watermarks->d.urgent_ns, refclk_mhz, 0x1fffff);
  292. REG_WRITE(DCHUBBUB_ARB_DATA_URGENCY_WATERMARK_D, prog_wm_value);
  293. DC_LOG_BANDWIDTH_CALCS("URGENCY_WATERMARK_D calculated =%d\n"
  294. "HW register value = 0x%x\n",
  295. watermarks->d.urgent_ns, prog_wm_value);
  296. prog_wm_value = convert_and_clamp(
  297. watermarks->d.pte_meta_urgent_ns,
  298. refclk_mhz, 0x1fffff);
  299. REG_WRITE(DCHUBBUB_ARB_PTE_META_URGENCY_WATERMARK_D, prog_wm_value);
  300. DC_LOG_BANDWIDTH_CALCS("PTE_META_URGENCY_WATERMARK_D calculated =%d\n"
  301. "HW register value = 0x%x\n",
  302. watermarks->d.pte_meta_urgent_ns, prog_wm_value);
  303. if (REG(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D)) {
  304. prog_wm_value = convert_and_clamp(
  305. watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns,
  306. refclk_mhz, 0x1fffff);
  307. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_ENTER_WATERMARK_D, prog_wm_value);
  308. DC_LOG_BANDWIDTH_CALCS("SR_ENTER_WATERMARK_D calculated =%d\n"
  309. "HW register value = 0x%x\n",
  310. watermarks->d.cstate_pstate.cstate_enter_plus_exit_ns, prog_wm_value);
  311. prog_wm_value = convert_and_clamp(
  312. watermarks->d.cstate_pstate.cstate_exit_ns,
  313. refclk_mhz, 0x1fffff);
  314. REG_WRITE(DCHUBBUB_ARB_ALLOW_SR_EXIT_WATERMARK_D, prog_wm_value);
  315. DC_LOG_BANDWIDTH_CALCS("SR_EXIT_WATERMARK_D calculated =%d\n"
  316. "HW register value = 0x%x\n",
  317. watermarks->d.cstate_pstate.cstate_exit_ns, prog_wm_value);
  318. }
  319. prog_wm_value = convert_and_clamp(
  320. watermarks->d.cstate_pstate.pstate_change_ns,
  321. refclk_mhz, 0x1fffff);
  322. REG_WRITE(DCHUBBUB_ARB_ALLOW_DRAM_CLK_CHANGE_WATERMARK_D, prog_wm_value);
  323. DC_LOG_BANDWIDTH_CALCS("DRAM_CLK_CHANGE_WATERMARK_D calculated =%d\n"
  324. "HW register value = 0x%x\n\n",
  325. watermarks->d.cstate_pstate.pstate_change_ns, prog_wm_value);
  326. REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
  327. DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1);
  328. REG_UPDATE(DCHUBBUB_ARB_SAT_LEVEL,
  329. DCHUBBUB_ARB_SAT_LEVEL, 60 * refclk_mhz);
  330. REG_UPDATE(DCHUBBUB_ARB_DF_REQ_OUTSTAND,
  331. DCHUBBUB_ARB_MIN_REQ_OUTSTAND, 68);
  332. REG_UPDATE_2(DCHUBBUB_ARB_DRAM_STATE_CNTL,
  333. DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_VALUE, 0,
  334. DCHUBBUB_ARB_ALLOW_SELF_REFRESH_FORCE_ENABLE, force_en);
  335. #if 0
  336. REG_UPDATE_2(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
  337. DCHUBBUB_ARB_WATERMARK_CHANGE_DONE_INTERRUPT_DISABLE, 1,
  338. DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, 1);
  339. #endif
  340. }
  341. void hubbub1_update_dchub(
  342. struct hubbub *hubbub,
  343. struct dchub_init_data *dh_data)
  344. {
  345. /* TODO: port code from dal2 */
  346. switch (dh_data->fb_mode) {
  347. case FRAME_BUFFER_MODE_ZFB_ONLY:
  348. /*For ZFB case need to put DCHUB FB BASE and TOP upside down to indicate ZFB mode*/
  349. REG_UPDATE(DCHUBBUB_SDPIF_FB_TOP,
  350. SDPIF_FB_TOP, 0);
  351. REG_UPDATE(DCHUBBUB_SDPIF_FB_BASE,
  352. SDPIF_FB_BASE, 0x0FFFF);
  353. REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE,
  354. SDPIF_AGP_BASE, dh_data->zfb_phys_addr_base >> 22);
  355. REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT,
  356. SDPIF_AGP_BOT, dh_data->zfb_mc_base_addr >> 22);
  357. REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP,
  358. SDPIF_AGP_TOP, (dh_data->zfb_mc_base_addr +
  359. dh_data->zfb_size_in_byte - 1) >> 22);
  360. break;
  361. case FRAME_BUFFER_MODE_MIXED_ZFB_AND_LOCAL:
  362. /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/
  363. REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE,
  364. SDPIF_AGP_BASE, dh_data->zfb_phys_addr_base >> 22);
  365. REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT,
  366. SDPIF_AGP_BOT, dh_data->zfb_mc_base_addr >> 22);
  367. REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP,
  368. SDPIF_AGP_TOP, (dh_data->zfb_mc_base_addr +
  369. dh_data->zfb_size_in_byte - 1) >> 22);
  370. break;
  371. case FRAME_BUFFER_MODE_LOCAL_ONLY:
  372. /*Should not touch FB LOCATION (done by VBIOS on AsicInit table)*/
  373. REG_UPDATE(DCHUBBUB_SDPIF_AGP_BASE,
  374. SDPIF_AGP_BASE, 0);
  375. REG_UPDATE(DCHUBBUB_SDPIF_AGP_BOT,
  376. SDPIF_AGP_BOT, 0X03FFFF);
  377. REG_UPDATE(DCHUBBUB_SDPIF_AGP_TOP,
  378. SDPIF_AGP_TOP, 0);
  379. break;
  380. default:
  381. break;
  382. }
  383. dh_data->dchub_initialzied = true;
  384. dh_data->dchub_info_valid = false;
  385. }
  386. void hubbub1_toggle_watermark_change_req(struct hubbub *hubbub)
  387. {
  388. uint32_t watermark_change_req;
  389. REG_GET(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
  390. DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, &watermark_change_req);
  391. if (watermark_change_req)
  392. watermark_change_req = 0;
  393. else
  394. watermark_change_req = 1;
  395. REG_UPDATE(DCHUBBUB_ARB_WATERMARK_CHANGE_CNTL,
  396. DCHUBBUB_ARB_WATERMARK_CHANGE_REQUEST, watermark_change_req);
  397. }
  398. static const struct hubbub_funcs hubbub1_funcs = {
  399. .update_dchub = hubbub1_update_dchub
  400. };
  401. void hubbub1_construct(struct hubbub *hubbub,
  402. struct dc_context *ctx,
  403. const struct dcn_hubbub_registers *hubbub_regs,
  404. const struct dcn_hubbub_shift *hubbub_shift,
  405. const struct dcn_hubbub_mask *hubbub_mask)
  406. {
  407. hubbub->ctx = ctx;
  408. hubbub->funcs = &hubbub1_funcs;
  409. hubbub->regs = hubbub_regs;
  410. hubbub->shifts = hubbub_shift;
  411. hubbub->masks = hubbub_mask;
  412. hubbub->debug_test_index_pstate = 0x7;
  413. }