intel_dpio_phy.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  1. /*
  2. * Copyright © 2014-2016 Intel Corporation
  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 (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. */
  23. #include "intel_drv.h"
  24. void chv_set_phy_signal_level(struct intel_encoder *encoder,
  25. u32 deemph_reg_value, u32 margin_reg_value,
  26. bool uniq_trans_scale)
  27. {
  28. struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  29. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  30. struct intel_crtc *intel_crtc = to_intel_crtc(dport->base.base.crtc);
  31. enum dpio_channel ch = vlv_dport_to_channel(dport);
  32. enum pipe pipe = intel_crtc->pipe;
  33. u32 val;
  34. int i;
  35. mutex_lock(&dev_priv->sb_lock);
  36. /* Clear calc init */
  37. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
  38. val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
  39. val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
  40. val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
  41. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
  42. if (intel_crtc->config->lane_count > 2) {
  43. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
  44. val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
  45. val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
  46. val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
  47. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
  48. }
  49. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
  50. val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
  51. val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
  52. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
  53. if (intel_crtc->config->lane_count > 2) {
  54. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
  55. val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
  56. val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
  57. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
  58. }
  59. /* Program swing deemph */
  60. for (i = 0; i < intel_crtc->config->lane_count; i++) {
  61. val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
  62. val &= ~DPIO_SWING_DEEMPH9P5_MASK;
  63. val |= deemph_reg_value << DPIO_SWING_DEEMPH9P5_SHIFT;
  64. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val);
  65. }
  66. /* Program swing margin */
  67. for (i = 0; i < intel_crtc->config->lane_count; i++) {
  68. val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
  69. val &= ~DPIO_SWING_MARGIN000_MASK;
  70. val |= margin_reg_value << DPIO_SWING_MARGIN000_SHIFT;
  71. /*
  72. * Supposedly this value shouldn't matter when unique transition
  73. * scale is disabled, but in fact it does matter. Let's just
  74. * always program the same value and hope it's OK.
  75. */
  76. val &= ~(0xff << DPIO_UNIQ_TRANS_SCALE_SHIFT);
  77. val |= 0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT;
  78. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
  79. }
  80. /*
  81. * The document said it needs to set bit 27 for ch0 and bit 26
  82. * for ch1. Might be a typo in the doc.
  83. * For now, for this unique transition scale selection, set bit
  84. * 27 for ch0 and ch1.
  85. */
  86. for (i = 0; i < intel_crtc->config->lane_count; i++) {
  87. val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
  88. if (uniq_trans_scale)
  89. val |= DPIO_TX_UNIQ_TRANS_SCALE_EN;
  90. else
  91. val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN;
  92. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
  93. }
  94. /* Start swing calculation */
  95. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
  96. val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
  97. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
  98. if (intel_crtc->config->lane_count > 2) {
  99. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
  100. val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
  101. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
  102. }
  103. mutex_unlock(&dev_priv->sb_lock);
  104. }
  105. void chv_data_lane_soft_reset(struct intel_encoder *encoder,
  106. bool reset)
  107. {
  108. struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  109. enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base));
  110. struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
  111. enum pipe pipe = crtc->pipe;
  112. uint32_t val;
  113. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
  114. if (reset)
  115. val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
  116. else
  117. val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET;
  118. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
  119. if (crtc->config->lane_count > 2) {
  120. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
  121. if (reset)
  122. val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
  123. else
  124. val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET;
  125. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
  126. }
  127. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
  128. val |= CHV_PCS_REQ_SOFTRESET_EN;
  129. if (reset)
  130. val &= ~DPIO_PCS_CLK_SOFT_RESET;
  131. else
  132. val |= DPIO_PCS_CLK_SOFT_RESET;
  133. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
  134. if (crtc->config->lane_count > 2) {
  135. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
  136. val |= CHV_PCS_REQ_SOFTRESET_EN;
  137. if (reset)
  138. val &= ~DPIO_PCS_CLK_SOFT_RESET;
  139. else
  140. val |= DPIO_PCS_CLK_SOFT_RESET;
  141. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
  142. }
  143. }
  144. void chv_phy_pre_pll_enable(struct intel_encoder *encoder)
  145. {
  146. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  147. struct drm_device *dev = encoder->base.dev;
  148. struct drm_i915_private *dev_priv = to_i915(dev);
  149. struct intel_crtc *intel_crtc =
  150. to_intel_crtc(encoder->base.crtc);
  151. enum dpio_channel ch = vlv_dport_to_channel(dport);
  152. enum pipe pipe = intel_crtc->pipe;
  153. unsigned int lane_mask =
  154. intel_dp_unused_lane_mask(intel_crtc->config->lane_count);
  155. u32 val;
  156. /*
  157. * Must trick the second common lane into life.
  158. * Otherwise we can't even access the PLL.
  159. */
  160. if (ch == DPIO_CH0 && pipe == PIPE_B)
  161. dport->release_cl2_override =
  162. !chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, true);
  163. chv_phy_powergate_lanes(encoder, true, lane_mask);
  164. mutex_lock(&dev_priv->sb_lock);
  165. /* Assert data lane reset */
  166. chv_data_lane_soft_reset(encoder, true);
  167. /* program left/right clock distribution */
  168. if (pipe != PIPE_B) {
  169. val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
  170. val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
  171. if (ch == DPIO_CH0)
  172. val |= CHV_BUFLEFTENA1_FORCE;
  173. if (ch == DPIO_CH1)
  174. val |= CHV_BUFRIGHTENA1_FORCE;
  175. vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
  176. } else {
  177. val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
  178. val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
  179. if (ch == DPIO_CH0)
  180. val |= CHV_BUFLEFTENA2_FORCE;
  181. if (ch == DPIO_CH1)
  182. val |= CHV_BUFRIGHTENA2_FORCE;
  183. vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
  184. }
  185. /* program clock channel usage */
  186. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
  187. val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
  188. if (pipe != PIPE_B)
  189. val &= ~CHV_PCS_USEDCLKCHANNEL;
  190. else
  191. val |= CHV_PCS_USEDCLKCHANNEL;
  192. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
  193. if (intel_crtc->config->lane_count > 2) {
  194. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
  195. val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
  196. if (pipe != PIPE_B)
  197. val &= ~CHV_PCS_USEDCLKCHANNEL;
  198. else
  199. val |= CHV_PCS_USEDCLKCHANNEL;
  200. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
  201. }
  202. /*
  203. * This a a bit weird since generally CL
  204. * matches the pipe, but here we need to
  205. * pick the CL based on the port.
  206. */
  207. val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
  208. if (pipe != PIPE_B)
  209. val &= ~CHV_CMN_USEDCLKCHANNEL;
  210. else
  211. val |= CHV_CMN_USEDCLKCHANNEL;
  212. vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
  213. mutex_unlock(&dev_priv->sb_lock);
  214. }
  215. void chv_phy_pre_encoder_enable(struct intel_encoder *encoder)
  216. {
  217. struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
  218. struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
  219. struct drm_device *dev = encoder->base.dev;
  220. struct drm_i915_private *dev_priv = to_i915(dev);
  221. struct intel_crtc *intel_crtc =
  222. to_intel_crtc(encoder->base.crtc);
  223. enum dpio_channel ch = vlv_dport_to_channel(dport);
  224. int pipe = intel_crtc->pipe;
  225. int data, i, stagger;
  226. u32 val;
  227. mutex_lock(&dev_priv->sb_lock);
  228. /* allow hardware to manage TX FIFO reset source */
  229. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
  230. val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
  231. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
  232. if (intel_crtc->config->lane_count > 2) {
  233. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
  234. val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
  235. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
  236. }
  237. /* Program Tx lane latency optimal setting*/
  238. for (i = 0; i < intel_crtc->config->lane_count; i++) {
  239. /* Set the upar bit */
  240. if (intel_crtc->config->lane_count == 1)
  241. data = 0x0;
  242. else
  243. data = (i == 1) ? 0x0 : 0x1;
  244. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
  245. data << DPIO_UPAR_SHIFT);
  246. }
  247. /* Data lane stagger programming */
  248. if (intel_crtc->config->port_clock > 270000)
  249. stagger = 0x18;
  250. else if (intel_crtc->config->port_clock > 135000)
  251. stagger = 0xd;
  252. else if (intel_crtc->config->port_clock > 67500)
  253. stagger = 0x7;
  254. else if (intel_crtc->config->port_clock > 33750)
  255. stagger = 0x4;
  256. else
  257. stagger = 0x2;
  258. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
  259. val |= DPIO_TX2_STAGGER_MASK(0x1f);
  260. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
  261. if (intel_crtc->config->lane_count > 2) {
  262. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
  263. val |= DPIO_TX2_STAGGER_MASK(0x1f);
  264. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
  265. }
  266. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW12(ch),
  267. DPIO_LANESTAGGER_STRAP(stagger) |
  268. DPIO_LANESTAGGER_STRAP_OVRD |
  269. DPIO_TX1_STAGGER_MASK(0x1f) |
  270. DPIO_TX1_STAGGER_MULT(6) |
  271. DPIO_TX2_STAGGER_MULT(0));
  272. if (intel_crtc->config->lane_count > 2) {
  273. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch),
  274. DPIO_LANESTAGGER_STRAP(stagger) |
  275. DPIO_LANESTAGGER_STRAP_OVRD |
  276. DPIO_TX1_STAGGER_MASK(0x1f) |
  277. DPIO_TX1_STAGGER_MULT(7) |
  278. DPIO_TX2_STAGGER_MULT(5));
  279. }
  280. /* Deassert data lane reset */
  281. chv_data_lane_soft_reset(encoder, false);
  282. mutex_unlock(&dev_priv->sb_lock);
  283. }
  284. void chv_phy_release_cl2_override(struct intel_encoder *encoder)
  285. {
  286. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  287. struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  288. if (dport->release_cl2_override) {
  289. chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, false);
  290. dport->release_cl2_override = false;
  291. }
  292. }
  293. void chv_phy_post_pll_disable(struct intel_encoder *encoder)
  294. {
  295. struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  296. enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe;
  297. u32 val;
  298. mutex_lock(&dev_priv->sb_lock);
  299. /* disable left/right clock distribution */
  300. if (pipe != PIPE_B) {
  301. val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
  302. val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
  303. vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
  304. } else {
  305. val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
  306. val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
  307. vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
  308. }
  309. mutex_unlock(&dev_priv->sb_lock);
  310. /*
  311. * Leave the power down bit cleared for at least one
  312. * lane so that chv_powergate_phy_ch() will power
  313. * on something when the channel is otherwise unused.
  314. * When the port is off and the override is removed
  315. * the lanes power down anyway, so otherwise it doesn't
  316. * really matter what the state of power down bits is
  317. * after this.
  318. */
  319. chv_phy_powergate_lanes(encoder, false, 0x0);
  320. }
  321. void vlv_set_phy_signal_level(struct intel_encoder *encoder,
  322. u32 demph_reg_value, u32 preemph_reg_value,
  323. u32 uniqtranscale_reg_value, u32 tx3_demph)
  324. {
  325. struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  326. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
  327. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  328. enum dpio_channel port = vlv_dport_to_channel(dport);
  329. int pipe = intel_crtc->pipe;
  330. mutex_lock(&dev_priv->sb_lock);
  331. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000);
  332. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), demph_reg_value);
  333. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port),
  334. uniqtranscale_reg_value);
  335. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0C782040);
  336. if (tx3_demph)
  337. vlv_dpio_write(dev_priv, pipe, VLV_TX3_DW4(port), tx3_demph);
  338. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
  339. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), preemph_reg_value);
  340. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
  341. mutex_unlock(&dev_priv->sb_lock);
  342. }
  343. void vlv_phy_pre_pll_enable(struct intel_encoder *encoder)
  344. {
  345. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  346. struct drm_device *dev = encoder->base.dev;
  347. struct drm_i915_private *dev_priv = to_i915(dev);
  348. struct intel_crtc *intel_crtc =
  349. to_intel_crtc(encoder->base.crtc);
  350. enum dpio_channel port = vlv_dport_to_channel(dport);
  351. int pipe = intel_crtc->pipe;
  352. /* Program Tx lane resets to default */
  353. mutex_lock(&dev_priv->sb_lock);
  354. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
  355. DPIO_PCS_TX_LANE2_RESET |
  356. DPIO_PCS_TX_LANE1_RESET);
  357. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
  358. DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
  359. DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
  360. (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
  361. DPIO_PCS_CLK_SOFT_RESET);
  362. /* Fix up inter-pair skew failure */
  363. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
  364. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
  365. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);
  366. mutex_unlock(&dev_priv->sb_lock);
  367. }
  368. void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder)
  369. {
  370. struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
  371. struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
  372. struct drm_device *dev = encoder->base.dev;
  373. struct drm_i915_private *dev_priv = to_i915(dev);
  374. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
  375. enum dpio_channel port = vlv_dport_to_channel(dport);
  376. int pipe = intel_crtc->pipe;
  377. u32 val;
  378. mutex_lock(&dev_priv->sb_lock);
  379. /* Enable clock channels for this port */
  380. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
  381. val = 0;
  382. if (pipe)
  383. val |= (1<<21);
  384. else
  385. val &= ~(1<<21);
  386. val |= 0x001000c4;
  387. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
  388. /* Program lane clock */
  389. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
  390. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
  391. mutex_unlock(&dev_priv->sb_lock);
  392. }
  393. void vlv_phy_reset_lanes(struct intel_encoder *encoder)
  394. {
  395. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  396. struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
  397. struct intel_crtc *intel_crtc =
  398. to_intel_crtc(encoder->base.crtc);
  399. enum dpio_channel port = vlv_dport_to_channel(dport);
  400. int pipe = intel_crtc->pipe;
  401. mutex_lock(&dev_priv->sb_lock);
  402. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
  403. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
  404. mutex_unlock(&dev_priv->sb_lock);
  405. }