dce_hwseq.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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 "dce_hwseq.h"
  26. #include "reg_helper.h"
  27. #include "hw_sequencer.h"
  28. #include "core_types.h"
  29. #define CTX \
  30. hws->ctx
  31. #define REG(reg)\
  32. hws->regs->reg
  33. #undef FN
  34. #define FN(reg_name, field_name) \
  35. hws->shifts->field_name, hws->masks->field_name
  36. void dce_enable_fe_clock(struct dce_hwseq *hws,
  37. unsigned int fe_inst, bool enable)
  38. {
  39. REG_UPDATE(DCFE_CLOCK_CONTROL[fe_inst],
  40. DCFE_CLOCK_ENABLE, enable);
  41. }
  42. void dce_pipe_control_lock(struct dc *dc,
  43. struct pipe_ctx *pipe,
  44. bool lock)
  45. {
  46. uint32_t lock_val = lock ? 1 : 0;
  47. uint32_t dcp_grph, scl, blnd, update_lock_mode, val;
  48. struct dce_hwseq *hws = dc->hwseq;
  49. /* Not lock pipe when blank */
  50. if (lock && pipe->stream_res.tg->funcs->is_blanked(pipe->stream_res.tg))
  51. return;
  52. val = REG_GET_4(BLND_V_UPDATE_LOCK[pipe->pipe_idx],
  53. BLND_DCP_GRPH_V_UPDATE_LOCK, &dcp_grph,
  54. BLND_SCL_V_UPDATE_LOCK, &scl,
  55. BLND_BLND_V_UPDATE_LOCK, &blnd,
  56. BLND_V_UPDATE_LOCK_MODE, &update_lock_mode);
  57. dcp_grph = lock_val;
  58. scl = lock_val;
  59. blnd = lock_val;
  60. update_lock_mode = lock_val;
  61. REG_SET_2(BLND_V_UPDATE_LOCK[pipe->pipe_idx], val,
  62. BLND_DCP_GRPH_V_UPDATE_LOCK, dcp_grph,
  63. BLND_SCL_V_UPDATE_LOCK, scl);
  64. if (hws->masks->BLND_BLND_V_UPDATE_LOCK != 0)
  65. REG_SET_2(BLND_V_UPDATE_LOCK[pipe->pipe_idx], val,
  66. BLND_BLND_V_UPDATE_LOCK, blnd,
  67. BLND_V_UPDATE_LOCK_MODE, update_lock_mode);
  68. if (hws->wa.blnd_crtc_trigger) {
  69. if (!lock) {
  70. uint32_t value = REG_READ(CRTC_H_BLANK_START_END[pipe->pipe_idx]);
  71. REG_WRITE(CRTC_H_BLANK_START_END[pipe->pipe_idx], value);
  72. }
  73. }
  74. }
  75. void dce_set_blender_mode(struct dce_hwseq *hws,
  76. unsigned int blnd_inst,
  77. enum blnd_mode mode)
  78. {
  79. uint32_t feedthrough = 1;
  80. uint32_t blnd_mode = 0;
  81. uint32_t multiplied_mode = 0;
  82. uint32_t alpha_mode = 2;
  83. switch (mode) {
  84. case BLND_MODE_OTHER_PIPE:
  85. feedthrough = 0;
  86. blnd_mode = 1;
  87. alpha_mode = 0;
  88. break;
  89. case BLND_MODE_BLENDING:
  90. feedthrough = 0;
  91. blnd_mode = 2;
  92. alpha_mode = 0;
  93. multiplied_mode = 1;
  94. break;
  95. case BLND_MODE_CURRENT_PIPE:
  96. default:
  97. if (REG(BLND_CONTROL[blnd_inst]) == REG(BLNDV_CONTROL) ||
  98. blnd_inst == 0)
  99. feedthrough = 0;
  100. break;
  101. }
  102. REG_UPDATE(BLND_CONTROL[blnd_inst],
  103. BLND_MODE, blnd_mode);
  104. if (hws->masks->BLND_ALPHA_MODE != 0) {
  105. REG_UPDATE_3(BLND_CONTROL[blnd_inst],
  106. BLND_FEEDTHROUGH_EN, feedthrough,
  107. BLND_ALPHA_MODE, alpha_mode,
  108. BLND_MULTIPLIED_MODE, multiplied_mode);
  109. }
  110. }
  111. static void dce_disable_sram_shut_down(struct dce_hwseq *hws)
  112. {
  113. if (REG(DC_MEM_GLOBAL_PWR_REQ_CNTL))
  114. REG_UPDATE(DC_MEM_GLOBAL_PWR_REQ_CNTL,
  115. DC_MEM_GLOBAL_PWR_REQ_DIS, 1);
  116. }
  117. static void dce_underlay_clock_enable(struct dce_hwseq *hws)
  118. {
  119. /* todo: why do we need this at boot? is dce_enable_fe_clock enough? */
  120. if (REG(DCFEV_CLOCK_CONTROL))
  121. REG_UPDATE(DCFEV_CLOCK_CONTROL,
  122. DCFEV_CLOCK_ENABLE, 1);
  123. }
  124. static void enable_hw_base_light_sleep(void)
  125. {
  126. /* TODO: implement */
  127. }
  128. static void disable_sw_manual_control_light_sleep(void)
  129. {
  130. /* TODO: implement */
  131. }
  132. void dce_clock_gating_power_up(struct dce_hwseq *hws,
  133. bool enable)
  134. {
  135. if (enable) {
  136. enable_hw_base_light_sleep();
  137. disable_sw_manual_control_light_sleep();
  138. } else {
  139. dce_disable_sram_shut_down(hws);
  140. dce_underlay_clock_enable(hws);
  141. }
  142. }
  143. void dce_crtc_switch_to_clk_src(struct dce_hwseq *hws,
  144. struct clock_source *clk_src,
  145. unsigned int tg_inst)
  146. {
  147. if (clk_src->id == CLOCK_SOURCE_ID_DP_DTO || clk_src->dp_clk_src) {
  148. REG_UPDATE(PIXEL_RATE_CNTL[tg_inst],
  149. DP_DTO0_ENABLE, 1);
  150. } else if (clk_src->id >= CLOCK_SOURCE_COMBO_PHY_PLL0) {
  151. uint32_t rate_source = clk_src->id - CLOCK_SOURCE_COMBO_PHY_PLL0;
  152. REG_UPDATE_2(PHYPLL_PIXEL_RATE_CNTL[tg_inst],
  153. PHYPLL_PIXEL_RATE_SOURCE, rate_source,
  154. PIXEL_RATE_PLL_SOURCE, 0);
  155. REG_UPDATE(PIXEL_RATE_CNTL[tg_inst],
  156. DP_DTO0_ENABLE, 0);
  157. } else if (clk_src->id <= CLOCK_SOURCE_ID_PLL2) {
  158. uint32_t rate_source = clk_src->id - CLOCK_SOURCE_ID_PLL0;
  159. REG_UPDATE_2(PIXEL_RATE_CNTL[tg_inst],
  160. PIXEL_RATE_SOURCE, rate_source,
  161. DP_DTO0_ENABLE, 0);
  162. if (REG(PHYPLL_PIXEL_RATE_CNTL[tg_inst]))
  163. REG_UPDATE(PHYPLL_PIXEL_RATE_CNTL[tg_inst],
  164. PIXEL_RATE_PLL_SOURCE, 1);
  165. } else {
  166. DC_ERR("Unknown clock source. clk_src id: %d, TG_inst: %d",
  167. clk_src->id, tg_inst);
  168. }
  169. }
  170. /* Only use LUT for 8 bit formats */
  171. bool dce_use_lut(const struct dc_plane_state *plane_state)
  172. {
  173. switch (plane_state->format) {
  174. case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
  175. case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
  176. return true;
  177. default:
  178. return false;
  179. }
  180. }