intel_ddi.c 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682
  1. /*
  2. * Copyright © 2012 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 DEALINGS
  21. * IN THE SOFTWARE.
  22. *
  23. * Authors:
  24. * Eugeni Dodonov <eugeni.dodonov@intel.com>
  25. *
  26. */
  27. #include "i915_drv.h"
  28. #include "intel_drv.h"
  29. struct ddi_buf_trans {
  30. u32 trans1; /* balance leg enable, de-emph level */
  31. u32 trans2; /* vref sel, vswing */
  32. };
  33. /* HDMI/DVI modes ignore everything but the last 2 items. So we share
  34. * them for both DP and FDI transports, allowing those ports to
  35. * automatically adapt to HDMI connections as well
  36. */
  37. static const struct ddi_buf_trans hsw_ddi_translations_dp[] = {
  38. { 0x00FFFFFF, 0x0006000E },
  39. { 0x00D75FFF, 0x0005000A },
  40. { 0x00C30FFF, 0x00040006 },
  41. { 0x80AAAFFF, 0x000B0000 },
  42. { 0x00FFFFFF, 0x0005000A },
  43. { 0x00D75FFF, 0x000C0004 },
  44. { 0x80C30FFF, 0x000B0000 },
  45. { 0x00FFFFFF, 0x00040006 },
  46. { 0x80D75FFF, 0x000B0000 },
  47. };
  48. static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = {
  49. { 0x00FFFFFF, 0x0007000E },
  50. { 0x00D75FFF, 0x000F000A },
  51. { 0x00C30FFF, 0x00060006 },
  52. { 0x00AAAFFF, 0x001E0000 },
  53. { 0x00FFFFFF, 0x000F000A },
  54. { 0x00D75FFF, 0x00160004 },
  55. { 0x00C30FFF, 0x001E0000 },
  56. { 0x00FFFFFF, 0x00060006 },
  57. { 0x00D75FFF, 0x001E0000 },
  58. };
  59. static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = {
  60. /* Idx NT mV d T mV d db */
  61. { 0x00FFFFFF, 0x0006000E }, /* 0: 400 400 0 */
  62. { 0x00E79FFF, 0x000E000C }, /* 1: 400 500 2 */
  63. { 0x00D75FFF, 0x0005000A }, /* 2: 400 600 3.5 */
  64. { 0x00FFFFFF, 0x0005000A }, /* 3: 600 600 0 */
  65. { 0x00E79FFF, 0x001D0007 }, /* 4: 600 750 2 */
  66. { 0x00D75FFF, 0x000C0004 }, /* 5: 600 900 3.5 */
  67. { 0x00FFFFFF, 0x00040006 }, /* 6: 800 800 0 */
  68. { 0x80E79FFF, 0x00030002 }, /* 7: 800 1000 2 */
  69. { 0x00FFFFFF, 0x00140005 }, /* 8: 850 850 0 */
  70. { 0x00FFFFFF, 0x000C0004 }, /* 9: 900 900 0 */
  71. { 0x00FFFFFF, 0x001C0003 }, /* 10: 950 950 0 */
  72. { 0x80FFFFFF, 0x00030002 }, /* 11: 1000 1000 0 */
  73. };
  74. static const struct ddi_buf_trans bdw_ddi_translations_edp[] = {
  75. { 0x00FFFFFF, 0x00000012 },
  76. { 0x00EBAFFF, 0x00020011 },
  77. { 0x00C71FFF, 0x0006000F },
  78. { 0x00AAAFFF, 0x000E000A },
  79. { 0x00FFFFFF, 0x00020011 },
  80. { 0x00DB6FFF, 0x0005000F },
  81. { 0x00BEEFFF, 0x000A000C },
  82. { 0x00FFFFFF, 0x0005000F },
  83. { 0x00DB6FFF, 0x000A000C },
  84. };
  85. static const struct ddi_buf_trans bdw_ddi_translations_dp[] = {
  86. { 0x00FFFFFF, 0x0007000E },
  87. { 0x00D75FFF, 0x000E000A },
  88. { 0x00BEFFFF, 0x00140006 },
  89. { 0x80B2CFFF, 0x001B0002 },
  90. { 0x00FFFFFF, 0x000E000A },
  91. { 0x00DB6FFF, 0x00160005 },
  92. { 0x80C71FFF, 0x001A0002 },
  93. { 0x00F7DFFF, 0x00180004 },
  94. { 0x80D75FFF, 0x001B0002 },
  95. };
  96. static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = {
  97. { 0x00FFFFFF, 0x0001000E },
  98. { 0x00D75FFF, 0x0004000A },
  99. { 0x00C30FFF, 0x00070006 },
  100. { 0x00AAAFFF, 0x000C0000 },
  101. { 0x00FFFFFF, 0x0004000A },
  102. { 0x00D75FFF, 0x00090004 },
  103. { 0x00C30FFF, 0x000C0000 },
  104. { 0x00FFFFFF, 0x00070006 },
  105. { 0x00D75FFF, 0x000C0000 },
  106. };
  107. static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = {
  108. /* Idx NT mV d T mV df db */
  109. { 0x00FFFFFF, 0x0007000E }, /* 0: 400 400 0 */
  110. { 0x00D75FFF, 0x000E000A }, /* 1: 400 600 3.5 */
  111. { 0x00BEFFFF, 0x00140006 }, /* 2: 400 800 6 */
  112. { 0x00FFFFFF, 0x0009000D }, /* 3: 450 450 0 */
  113. { 0x00FFFFFF, 0x000E000A }, /* 4: 600 600 0 */
  114. { 0x00D7FFFF, 0x00140006 }, /* 5: 600 800 2.5 */
  115. { 0x80CB2FFF, 0x001B0002 }, /* 6: 600 1000 4.5 */
  116. { 0x00FFFFFF, 0x00140006 }, /* 7: 800 800 0 */
  117. { 0x80E79FFF, 0x001B0002 }, /* 8: 800 1000 2 */
  118. { 0x80FFFFFF, 0x001B0002 }, /* 9: 1000 1000 0 */
  119. };
  120. static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
  121. { 0x00000018, 0x000000a0 },
  122. { 0x00004014, 0x00000098 },
  123. { 0x00006012, 0x00000088 },
  124. { 0x00008010, 0x00000080 },
  125. { 0x00000018, 0x00000098 },
  126. { 0x00004014, 0x00000088 },
  127. { 0x00006012, 0x00000080 },
  128. { 0x00000018, 0x00000088 },
  129. { 0x00004014, 0x00000080 },
  130. };
  131. static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
  132. /* Idx NT mV T mV db */
  133. { 0x00000018, 0x000000a0 }, /* 0: 400 400 0 */
  134. { 0x00004014, 0x00000098 }, /* 1: 400 600 3.5 */
  135. { 0x00006012, 0x00000088 }, /* 2: 400 800 6 */
  136. { 0x00000018, 0x0000003c }, /* 3: 450 450 0 */
  137. { 0x00000018, 0x00000098 }, /* 4: 600 600 0 */
  138. { 0x00003015, 0x00000088 }, /* 5: 600 800 2.5 */
  139. { 0x00005013, 0x00000080 }, /* 6: 600 1000 4.5 */
  140. { 0x00000018, 0x00000088 }, /* 7: 800 800 0 */
  141. { 0x00000096, 0x00000080 }, /* 8: 800 1000 2 */
  142. { 0x00000018, 0x00000080 }, /* 9: 1200 1200 0 */
  143. };
  144. enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
  145. {
  146. struct drm_encoder *encoder = &intel_encoder->base;
  147. int type = intel_encoder->type;
  148. if (type == INTEL_OUTPUT_DP_MST) {
  149. struct intel_digital_port *intel_dig_port = enc_to_mst(encoder)->primary;
  150. return intel_dig_port->port;
  151. } else if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP ||
  152. type == INTEL_OUTPUT_HDMI || type == INTEL_OUTPUT_UNKNOWN) {
  153. struct intel_digital_port *intel_dig_port =
  154. enc_to_dig_port(encoder);
  155. return intel_dig_port->port;
  156. } else if (type == INTEL_OUTPUT_ANALOG) {
  157. return PORT_E;
  158. } else {
  159. DRM_ERROR("Invalid DDI encoder type %d\n", type);
  160. BUG();
  161. }
  162. }
  163. /*
  164. * Starting with Haswell, DDI port buffers must be programmed with correct
  165. * values in advance. The buffer values are different for FDI and DP modes,
  166. * but the HDMI/DVI fields are shared among those. So we program the DDI
  167. * in either FDI or DP modes only, as HDMI connections will work with both
  168. * of those
  169. */
  170. static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
  171. {
  172. struct drm_i915_private *dev_priv = dev->dev_private;
  173. u32 reg;
  174. int i, n_hdmi_entries, hdmi_800mV_0dB;
  175. int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
  176. const struct ddi_buf_trans *ddi_translations_fdi;
  177. const struct ddi_buf_trans *ddi_translations_dp;
  178. const struct ddi_buf_trans *ddi_translations_edp;
  179. const struct ddi_buf_trans *ddi_translations_hdmi;
  180. const struct ddi_buf_trans *ddi_translations;
  181. if (IS_SKYLAKE(dev)) {
  182. ddi_translations_fdi = NULL;
  183. ddi_translations_dp = skl_ddi_translations_dp;
  184. ddi_translations_edp = skl_ddi_translations_dp;
  185. ddi_translations_hdmi = skl_ddi_translations_hdmi;
  186. n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
  187. hdmi_800mV_0dB = 7;
  188. } else if (IS_BROADWELL(dev)) {
  189. ddi_translations_fdi = bdw_ddi_translations_fdi;
  190. ddi_translations_dp = bdw_ddi_translations_dp;
  191. ddi_translations_edp = bdw_ddi_translations_edp;
  192. ddi_translations_hdmi = bdw_ddi_translations_hdmi;
  193. n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
  194. hdmi_800mV_0dB = 7;
  195. } else if (IS_HASWELL(dev)) {
  196. ddi_translations_fdi = hsw_ddi_translations_fdi;
  197. ddi_translations_dp = hsw_ddi_translations_dp;
  198. ddi_translations_edp = hsw_ddi_translations_dp;
  199. ddi_translations_hdmi = hsw_ddi_translations_hdmi;
  200. n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
  201. hdmi_800mV_0dB = 6;
  202. } else {
  203. WARN(1, "ddi translation table missing\n");
  204. ddi_translations_edp = bdw_ddi_translations_dp;
  205. ddi_translations_fdi = bdw_ddi_translations_fdi;
  206. ddi_translations_dp = bdw_ddi_translations_dp;
  207. ddi_translations_hdmi = bdw_ddi_translations_hdmi;
  208. n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
  209. hdmi_800mV_0dB = 7;
  210. }
  211. switch (port) {
  212. case PORT_A:
  213. ddi_translations = ddi_translations_edp;
  214. break;
  215. case PORT_B:
  216. case PORT_C:
  217. ddi_translations = ddi_translations_dp;
  218. break;
  219. case PORT_D:
  220. if (intel_dp_is_edp(dev, PORT_D))
  221. ddi_translations = ddi_translations_edp;
  222. else
  223. ddi_translations = ddi_translations_dp;
  224. break;
  225. case PORT_E:
  226. if (ddi_translations_fdi)
  227. ddi_translations = ddi_translations_fdi;
  228. else
  229. ddi_translations = ddi_translations_dp;
  230. break;
  231. default:
  232. BUG();
  233. }
  234. for (i = 0, reg = DDI_BUF_TRANS(port);
  235. i < ARRAY_SIZE(hsw_ddi_translations_fdi); i++) {
  236. I915_WRITE(reg, ddi_translations[i].trans1);
  237. reg += 4;
  238. I915_WRITE(reg, ddi_translations[i].trans2);
  239. reg += 4;
  240. }
  241. /* Choose a good default if VBT is badly populated */
  242. if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
  243. hdmi_level >= n_hdmi_entries)
  244. hdmi_level = hdmi_800mV_0dB;
  245. /* Entry 9 is for HDMI: */
  246. I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans1);
  247. reg += 4;
  248. I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans2);
  249. reg += 4;
  250. }
  251. /* Program DDI buffers translations for DP. By default, program ports A-D in DP
  252. * mode and port E for FDI.
  253. */
  254. void intel_prepare_ddi(struct drm_device *dev)
  255. {
  256. int port;
  257. if (!HAS_DDI(dev))
  258. return;
  259. for (port = PORT_A; port <= PORT_E; port++)
  260. intel_prepare_ddi_buffers(dev, port);
  261. }
  262. static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
  263. enum port port)
  264. {
  265. uint32_t reg = DDI_BUF_CTL(port);
  266. int i;
  267. for (i = 0; i < 8; i++) {
  268. udelay(1);
  269. if (I915_READ(reg) & DDI_BUF_IS_IDLE)
  270. return;
  271. }
  272. DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
  273. }
  274. /* Starting with Haswell, different DDI ports can work in FDI mode for
  275. * connection to the PCH-located connectors. For this, it is necessary to train
  276. * both the DDI port and PCH receiver for the desired DDI buffer settings.
  277. *
  278. * The recommended port to work in FDI mode is DDI E, which we use here. Also,
  279. * please note that when FDI mode is active on DDI E, it shares 2 lines with
  280. * DDI A (which is used for eDP)
  281. */
  282. void hsw_fdi_link_train(struct drm_crtc *crtc)
  283. {
  284. struct drm_device *dev = crtc->dev;
  285. struct drm_i915_private *dev_priv = dev->dev_private;
  286. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  287. u32 temp, i, rx_ctl_val;
  288. /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
  289. * mode set "sequence for CRT port" document:
  290. * - TP1 to TP2 time with the default value
  291. * - FDI delay to 90h
  292. *
  293. * WaFDIAutoLinkSetTimingOverrride:hsw
  294. */
  295. I915_WRITE(_FDI_RXA_MISC, FDI_RX_PWRDN_LANE1_VAL(2) |
  296. FDI_RX_PWRDN_LANE0_VAL(2) |
  297. FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
  298. /* Enable the PCH Receiver FDI PLL */
  299. rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
  300. FDI_RX_PLL_ENABLE |
  301. FDI_DP_PORT_WIDTH(intel_crtc->config.fdi_lanes);
  302. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  303. POSTING_READ(_FDI_RXA_CTL);
  304. udelay(220);
  305. /* Switch from Rawclk to PCDclk */
  306. rx_ctl_val |= FDI_PCDCLK;
  307. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  308. /* Configure Port Clock Select */
  309. I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config.ddi_pll_sel);
  310. WARN_ON(intel_crtc->config.ddi_pll_sel != PORT_CLK_SEL_SPLL);
  311. /* Start the training iterating through available voltages and emphasis,
  312. * testing each value twice. */
  313. for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
  314. /* Configure DP_TP_CTL with auto-training */
  315. I915_WRITE(DP_TP_CTL(PORT_E),
  316. DP_TP_CTL_FDI_AUTOTRAIN |
  317. DP_TP_CTL_ENHANCED_FRAME_ENABLE |
  318. DP_TP_CTL_LINK_TRAIN_PAT1 |
  319. DP_TP_CTL_ENABLE);
  320. /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
  321. * DDI E does not support port reversal, the functionality is
  322. * achieved on the PCH side in FDI_RX_CTL, so no need to set the
  323. * port reversal bit */
  324. I915_WRITE(DDI_BUF_CTL(PORT_E),
  325. DDI_BUF_CTL_ENABLE |
  326. ((intel_crtc->config.fdi_lanes - 1) << 1) |
  327. DDI_BUF_TRANS_SELECT(i / 2));
  328. POSTING_READ(DDI_BUF_CTL(PORT_E));
  329. udelay(600);
  330. /* Program PCH FDI Receiver TU */
  331. I915_WRITE(_FDI_RXA_TUSIZE1, TU_SIZE(64));
  332. /* Enable PCH FDI Receiver with auto-training */
  333. rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
  334. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  335. POSTING_READ(_FDI_RXA_CTL);
  336. /* Wait for FDI receiver lane calibration */
  337. udelay(30);
  338. /* Unset FDI_RX_MISC pwrdn lanes */
  339. temp = I915_READ(_FDI_RXA_MISC);
  340. temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
  341. I915_WRITE(_FDI_RXA_MISC, temp);
  342. POSTING_READ(_FDI_RXA_MISC);
  343. /* Wait for FDI auto training time */
  344. udelay(5);
  345. temp = I915_READ(DP_TP_STATUS(PORT_E));
  346. if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
  347. DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
  348. /* Enable normal pixel sending for FDI */
  349. I915_WRITE(DP_TP_CTL(PORT_E),
  350. DP_TP_CTL_FDI_AUTOTRAIN |
  351. DP_TP_CTL_LINK_TRAIN_NORMAL |
  352. DP_TP_CTL_ENHANCED_FRAME_ENABLE |
  353. DP_TP_CTL_ENABLE);
  354. return;
  355. }
  356. temp = I915_READ(DDI_BUF_CTL(PORT_E));
  357. temp &= ~DDI_BUF_CTL_ENABLE;
  358. I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
  359. POSTING_READ(DDI_BUF_CTL(PORT_E));
  360. /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
  361. temp = I915_READ(DP_TP_CTL(PORT_E));
  362. temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
  363. temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
  364. I915_WRITE(DP_TP_CTL(PORT_E), temp);
  365. POSTING_READ(DP_TP_CTL(PORT_E));
  366. intel_wait_ddi_buf_idle(dev_priv, PORT_E);
  367. rx_ctl_val &= ~FDI_RX_ENABLE;
  368. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  369. POSTING_READ(_FDI_RXA_CTL);
  370. /* Reset FDI_RX_MISC pwrdn lanes */
  371. temp = I915_READ(_FDI_RXA_MISC);
  372. temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
  373. temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
  374. I915_WRITE(_FDI_RXA_MISC, temp);
  375. POSTING_READ(_FDI_RXA_MISC);
  376. }
  377. DRM_ERROR("FDI link training failed!\n");
  378. }
  379. void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
  380. {
  381. struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
  382. struct intel_digital_port *intel_dig_port =
  383. enc_to_dig_port(&encoder->base);
  384. intel_dp->DP = intel_dig_port->saved_port_bits |
  385. DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
  386. intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
  387. }
  388. static struct intel_encoder *
  389. intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
  390. {
  391. struct drm_device *dev = crtc->dev;
  392. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  393. struct intel_encoder *intel_encoder, *ret = NULL;
  394. int num_encoders = 0;
  395. for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
  396. ret = intel_encoder;
  397. num_encoders++;
  398. }
  399. if (num_encoders != 1)
  400. WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
  401. pipe_name(intel_crtc->pipe));
  402. BUG_ON(ret == NULL);
  403. return ret;
  404. }
  405. #define LC_FREQ 2700
  406. #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
  407. #define P_MIN 2
  408. #define P_MAX 64
  409. #define P_INC 2
  410. /* Constraints for PLL good behavior */
  411. #define REF_MIN 48
  412. #define REF_MAX 400
  413. #define VCO_MIN 2400
  414. #define VCO_MAX 4800
  415. #define abs_diff(a, b) ({ \
  416. typeof(a) __a = (a); \
  417. typeof(b) __b = (b); \
  418. (void) (&__a == &__b); \
  419. __a > __b ? (__a - __b) : (__b - __a); })
  420. struct wrpll_rnp {
  421. unsigned p, n2, r2;
  422. };
  423. static unsigned wrpll_get_budget_for_freq(int clock)
  424. {
  425. unsigned budget;
  426. switch (clock) {
  427. case 25175000:
  428. case 25200000:
  429. case 27000000:
  430. case 27027000:
  431. case 37762500:
  432. case 37800000:
  433. case 40500000:
  434. case 40541000:
  435. case 54000000:
  436. case 54054000:
  437. case 59341000:
  438. case 59400000:
  439. case 72000000:
  440. case 74176000:
  441. case 74250000:
  442. case 81000000:
  443. case 81081000:
  444. case 89012000:
  445. case 89100000:
  446. case 108000000:
  447. case 108108000:
  448. case 111264000:
  449. case 111375000:
  450. case 148352000:
  451. case 148500000:
  452. case 162000000:
  453. case 162162000:
  454. case 222525000:
  455. case 222750000:
  456. case 296703000:
  457. case 297000000:
  458. budget = 0;
  459. break;
  460. case 233500000:
  461. case 245250000:
  462. case 247750000:
  463. case 253250000:
  464. case 298000000:
  465. budget = 1500;
  466. break;
  467. case 169128000:
  468. case 169500000:
  469. case 179500000:
  470. case 202000000:
  471. budget = 2000;
  472. break;
  473. case 256250000:
  474. case 262500000:
  475. case 270000000:
  476. case 272500000:
  477. case 273750000:
  478. case 280750000:
  479. case 281250000:
  480. case 286000000:
  481. case 291750000:
  482. budget = 4000;
  483. break;
  484. case 267250000:
  485. case 268500000:
  486. budget = 5000;
  487. break;
  488. default:
  489. budget = 1000;
  490. break;
  491. }
  492. return budget;
  493. }
  494. static void wrpll_update_rnp(uint64_t freq2k, unsigned budget,
  495. unsigned r2, unsigned n2, unsigned p,
  496. struct wrpll_rnp *best)
  497. {
  498. uint64_t a, b, c, d, diff, diff_best;
  499. /* No best (r,n,p) yet */
  500. if (best->p == 0) {
  501. best->p = p;
  502. best->n2 = n2;
  503. best->r2 = r2;
  504. return;
  505. }
  506. /*
  507. * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
  508. * freq2k.
  509. *
  510. * delta = 1e6 *
  511. * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
  512. * freq2k;
  513. *
  514. * and we would like delta <= budget.
  515. *
  516. * If the discrepancy is above the PPM-based budget, always prefer to
  517. * improve upon the previous solution. However, if you're within the
  518. * budget, try to maximize Ref * VCO, that is N / (P * R^2).
  519. */
  520. a = freq2k * budget * p * r2;
  521. b = freq2k * budget * best->p * best->r2;
  522. diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
  523. diff_best = abs_diff(freq2k * best->p * best->r2,
  524. LC_FREQ_2K * best->n2);
  525. c = 1000000 * diff;
  526. d = 1000000 * diff_best;
  527. if (a < c && b < d) {
  528. /* If both are above the budget, pick the closer */
  529. if (best->p * best->r2 * diff < p * r2 * diff_best) {
  530. best->p = p;
  531. best->n2 = n2;
  532. best->r2 = r2;
  533. }
  534. } else if (a >= c && b < d) {
  535. /* If A is below the threshold but B is above it? Update. */
  536. best->p = p;
  537. best->n2 = n2;
  538. best->r2 = r2;
  539. } else if (a >= c && b >= d) {
  540. /* Both are below the limit, so pick the higher n2/(r2*r2) */
  541. if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
  542. best->p = p;
  543. best->n2 = n2;
  544. best->r2 = r2;
  545. }
  546. }
  547. /* Otherwise a < c && b >= d, do nothing */
  548. }
  549. static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
  550. int reg)
  551. {
  552. int refclk = LC_FREQ;
  553. int n, p, r;
  554. u32 wrpll;
  555. wrpll = I915_READ(reg);
  556. switch (wrpll & WRPLL_PLL_REF_MASK) {
  557. case WRPLL_PLL_SSC:
  558. case WRPLL_PLL_NON_SSC:
  559. /*
  560. * We could calculate spread here, but our checking
  561. * code only cares about 5% accuracy, and spread is a max of
  562. * 0.5% downspread.
  563. */
  564. refclk = 135;
  565. break;
  566. case WRPLL_PLL_LCPLL:
  567. refclk = LC_FREQ;
  568. break;
  569. default:
  570. WARN(1, "bad wrpll refclk\n");
  571. return 0;
  572. }
  573. r = wrpll & WRPLL_DIVIDER_REF_MASK;
  574. p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
  575. n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
  576. /* Convert to KHz, p & r have a fixed point portion */
  577. return (refclk * n * 100) / (p * r);
  578. }
  579. static void hsw_ddi_clock_get(struct intel_encoder *encoder,
  580. struct intel_crtc_config *pipe_config)
  581. {
  582. struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
  583. int link_clock = 0;
  584. u32 val, pll;
  585. val = pipe_config->ddi_pll_sel;
  586. switch (val & PORT_CLK_SEL_MASK) {
  587. case PORT_CLK_SEL_LCPLL_810:
  588. link_clock = 81000;
  589. break;
  590. case PORT_CLK_SEL_LCPLL_1350:
  591. link_clock = 135000;
  592. break;
  593. case PORT_CLK_SEL_LCPLL_2700:
  594. link_clock = 270000;
  595. break;
  596. case PORT_CLK_SEL_WRPLL1:
  597. link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL1);
  598. break;
  599. case PORT_CLK_SEL_WRPLL2:
  600. link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL2);
  601. break;
  602. case PORT_CLK_SEL_SPLL:
  603. pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
  604. if (pll == SPLL_PLL_FREQ_810MHz)
  605. link_clock = 81000;
  606. else if (pll == SPLL_PLL_FREQ_1350MHz)
  607. link_clock = 135000;
  608. else if (pll == SPLL_PLL_FREQ_2700MHz)
  609. link_clock = 270000;
  610. else {
  611. WARN(1, "bad spll freq\n");
  612. return;
  613. }
  614. break;
  615. default:
  616. WARN(1, "bad port clock sel\n");
  617. return;
  618. }
  619. pipe_config->port_clock = link_clock * 2;
  620. if (pipe_config->has_pch_encoder)
  621. pipe_config->adjusted_mode.crtc_clock =
  622. intel_dotclock_calculate(pipe_config->port_clock,
  623. &pipe_config->fdi_m_n);
  624. else if (pipe_config->has_dp_encoder)
  625. pipe_config->adjusted_mode.crtc_clock =
  626. intel_dotclock_calculate(pipe_config->port_clock,
  627. &pipe_config->dp_m_n);
  628. else
  629. pipe_config->adjusted_mode.crtc_clock = pipe_config->port_clock;
  630. }
  631. void intel_ddi_clock_get(struct intel_encoder *encoder,
  632. struct intel_crtc_config *pipe_config)
  633. {
  634. hsw_ddi_clock_get(encoder, pipe_config);
  635. }
  636. static void
  637. hsw_ddi_calculate_wrpll(int clock /* in Hz */,
  638. unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
  639. {
  640. uint64_t freq2k;
  641. unsigned p, n2, r2;
  642. struct wrpll_rnp best = { 0, 0, 0 };
  643. unsigned budget;
  644. freq2k = clock / 100;
  645. budget = wrpll_get_budget_for_freq(clock);
  646. /* Special case handling for 540 pixel clock: bypass WR PLL entirely
  647. * and directly pass the LC PLL to it. */
  648. if (freq2k == 5400000) {
  649. *n2_out = 2;
  650. *p_out = 1;
  651. *r2_out = 2;
  652. return;
  653. }
  654. /*
  655. * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
  656. * the WR PLL.
  657. *
  658. * We want R so that REF_MIN <= Ref <= REF_MAX.
  659. * Injecting R2 = 2 * R gives:
  660. * REF_MAX * r2 > LC_FREQ * 2 and
  661. * REF_MIN * r2 < LC_FREQ * 2
  662. *
  663. * Which means the desired boundaries for r2 are:
  664. * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
  665. *
  666. */
  667. for (r2 = LC_FREQ * 2 / REF_MAX + 1;
  668. r2 <= LC_FREQ * 2 / REF_MIN;
  669. r2++) {
  670. /*
  671. * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
  672. *
  673. * Once again we want VCO_MIN <= VCO <= VCO_MAX.
  674. * Injecting R2 = 2 * R and N2 = 2 * N, we get:
  675. * VCO_MAX * r2 > n2 * LC_FREQ and
  676. * VCO_MIN * r2 < n2 * LC_FREQ)
  677. *
  678. * Which means the desired boundaries for n2 are:
  679. * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
  680. */
  681. for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
  682. n2 <= VCO_MAX * r2 / LC_FREQ;
  683. n2++) {
  684. for (p = P_MIN; p <= P_MAX; p += P_INC)
  685. wrpll_update_rnp(freq2k, budget,
  686. r2, n2, p, &best);
  687. }
  688. }
  689. *n2_out = best.n2;
  690. *p_out = best.p;
  691. *r2_out = best.r2;
  692. }
  693. static bool
  694. hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
  695. struct intel_encoder *intel_encoder,
  696. int clock)
  697. {
  698. if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
  699. struct intel_shared_dpll *pll;
  700. uint32_t val;
  701. unsigned p, n2, r2;
  702. hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
  703. val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
  704. WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
  705. WRPLL_DIVIDER_POST(p);
  706. intel_crtc->config.dpll_hw_state.wrpll = val;
  707. pll = intel_get_shared_dpll(intel_crtc);
  708. if (pll == NULL) {
  709. DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
  710. pipe_name(intel_crtc->pipe));
  711. return false;
  712. }
  713. intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
  714. }
  715. return true;
  716. }
  717. /*
  718. * Tries to find a *shared* PLL for the CRTC and store it in
  719. * intel_crtc->ddi_pll_sel.
  720. *
  721. * For private DPLLs, compute_config() should do the selection for us. This
  722. * function should be folded into compute_config() eventually.
  723. */
  724. bool intel_ddi_pll_select(struct intel_crtc *intel_crtc)
  725. {
  726. struct drm_crtc *crtc = &intel_crtc->base;
  727. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  728. int clock = intel_crtc->config.port_clock;
  729. intel_put_shared_dpll(intel_crtc);
  730. return hsw_ddi_pll_select(intel_crtc, intel_encoder, clock);
  731. }
  732. void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
  733. {
  734. struct drm_i915_private *dev_priv = crtc->dev->dev_private;
  735. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  736. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  737. enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
  738. int type = intel_encoder->type;
  739. uint32_t temp;
  740. if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
  741. temp = TRANS_MSA_SYNC_CLK;
  742. switch (intel_crtc->config.pipe_bpp) {
  743. case 18:
  744. temp |= TRANS_MSA_6_BPC;
  745. break;
  746. case 24:
  747. temp |= TRANS_MSA_8_BPC;
  748. break;
  749. case 30:
  750. temp |= TRANS_MSA_10_BPC;
  751. break;
  752. case 36:
  753. temp |= TRANS_MSA_12_BPC;
  754. break;
  755. default:
  756. BUG();
  757. }
  758. I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
  759. }
  760. }
  761. void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
  762. {
  763. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  764. struct drm_device *dev = crtc->dev;
  765. struct drm_i915_private *dev_priv = dev->dev_private;
  766. enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
  767. uint32_t temp;
  768. temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
  769. if (state == true)
  770. temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
  771. else
  772. temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
  773. I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
  774. }
  775. void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
  776. {
  777. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  778. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  779. struct drm_encoder *encoder = &intel_encoder->base;
  780. struct drm_device *dev = crtc->dev;
  781. struct drm_i915_private *dev_priv = dev->dev_private;
  782. enum pipe pipe = intel_crtc->pipe;
  783. enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
  784. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  785. int type = intel_encoder->type;
  786. uint32_t temp;
  787. /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
  788. temp = TRANS_DDI_FUNC_ENABLE;
  789. temp |= TRANS_DDI_SELECT_PORT(port);
  790. switch (intel_crtc->config.pipe_bpp) {
  791. case 18:
  792. temp |= TRANS_DDI_BPC_6;
  793. break;
  794. case 24:
  795. temp |= TRANS_DDI_BPC_8;
  796. break;
  797. case 30:
  798. temp |= TRANS_DDI_BPC_10;
  799. break;
  800. case 36:
  801. temp |= TRANS_DDI_BPC_12;
  802. break;
  803. default:
  804. BUG();
  805. }
  806. if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
  807. temp |= TRANS_DDI_PVSYNC;
  808. if (intel_crtc->config.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
  809. temp |= TRANS_DDI_PHSYNC;
  810. if (cpu_transcoder == TRANSCODER_EDP) {
  811. switch (pipe) {
  812. case PIPE_A:
  813. /* On Haswell, can only use the always-on power well for
  814. * eDP when not using the panel fitter, and when not
  815. * using motion blur mitigation (which we don't
  816. * support). */
  817. if (IS_HASWELL(dev) &&
  818. (intel_crtc->config.pch_pfit.enabled ||
  819. intel_crtc->config.pch_pfit.force_thru))
  820. temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
  821. else
  822. temp |= TRANS_DDI_EDP_INPUT_A_ON;
  823. break;
  824. case PIPE_B:
  825. temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
  826. break;
  827. case PIPE_C:
  828. temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
  829. break;
  830. default:
  831. BUG();
  832. break;
  833. }
  834. }
  835. if (type == INTEL_OUTPUT_HDMI) {
  836. if (intel_crtc->config.has_hdmi_sink)
  837. temp |= TRANS_DDI_MODE_SELECT_HDMI;
  838. else
  839. temp |= TRANS_DDI_MODE_SELECT_DVI;
  840. } else if (type == INTEL_OUTPUT_ANALOG) {
  841. temp |= TRANS_DDI_MODE_SELECT_FDI;
  842. temp |= (intel_crtc->config.fdi_lanes - 1) << 1;
  843. } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
  844. type == INTEL_OUTPUT_EDP) {
  845. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  846. if (intel_dp->is_mst) {
  847. temp |= TRANS_DDI_MODE_SELECT_DP_MST;
  848. } else
  849. temp |= TRANS_DDI_MODE_SELECT_DP_SST;
  850. temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
  851. } else if (type == INTEL_OUTPUT_DP_MST) {
  852. struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;
  853. if (intel_dp->is_mst) {
  854. temp |= TRANS_DDI_MODE_SELECT_DP_MST;
  855. } else
  856. temp |= TRANS_DDI_MODE_SELECT_DP_SST;
  857. temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
  858. } else {
  859. WARN(1, "Invalid encoder type %d for pipe %c\n",
  860. intel_encoder->type, pipe_name(pipe));
  861. }
  862. I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
  863. }
  864. void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
  865. enum transcoder cpu_transcoder)
  866. {
  867. uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
  868. uint32_t val = I915_READ(reg);
  869. val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
  870. val |= TRANS_DDI_PORT_NONE;
  871. I915_WRITE(reg, val);
  872. }
  873. bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
  874. {
  875. struct drm_device *dev = intel_connector->base.dev;
  876. struct drm_i915_private *dev_priv = dev->dev_private;
  877. struct intel_encoder *intel_encoder = intel_connector->encoder;
  878. int type = intel_connector->base.connector_type;
  879. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  880. enum pipe pipe = 0;
  881. enum transcoder cpu_transcoder;
  882. enum intel_display_power_domain power_domain;
  883. uint32_t tmp;
  884. power_domain = intel_display_port_power_domain(intel_encoder);
  885. if (!intel_display_power_is_enabled(dev_priv, power_domain))
  886. return false;
  887. if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
  888. return false;
  889. if (port == PORT_A)
  890. cpu_transcoder = TRANSCODER_EDP;
  891. else
  892. cpu_transcoder = (enum transcoder) pipe;
  893. tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
  894. switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
  895. case TRANS_DDI_MODE_SELECT_HDMI:
  896. case TRANS_DDI_MODE_SELECT_DVI:
  897. return (type == DRM_MODE_CONNECTOR_HDMIA);
  898. case TRANS_DDI_MODE_SELECT_DP_SST:
  899. if (type == DRM_MODE_CONNECTOR_eDP)
  900. return true;
  901. return (type == DRM_MODE_CONNECTOR_DisplayPort);
  902. case TRANS_DDI_MODE_SELECT_DP_MST:
  903. /* if the transcoder is in MST state then
  904. * connector isn't connected */
  905. return false;
  906. case TRANS_DDI_MODE_SELECT_FDI:
  907. return (type == DRM_MODE_CONNECTOR_VGA);
  908. default:
  909. return false;
  910. }
  911. }
  912. bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
  913. enum pipe *pipe)
  914. {
  915. struct drm_device *dev = encoder->base.dev;
  916. struct drm_i915_private *dev_priv = dev->dev_private;
  917. enum port port = intel_ddi_get_encoder_port(encoder);
  918. enum intel_display_power_domain power_domain;
  919. u32 tmp;
  920. int i;
  921. power_domain = intel_display_port_power_domain(encoder);
  922. if (!intel_display_power_is_enabled(dev_priv, power_domain))
  923. return false;
  924. tmp = I915_READ(DDI_BUF_CTL(port));
  925. if (!(tmp & DDI_BUF_CTL_ENABLE))
  926. return false;
  927. if (port == PORT_A) {
  928. tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
  929. switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
  930. case TRANS_DDI_EDP_INPUT_A_ON:
  931. case TRANS_DDI_EDP_INPUT_A_ONOFF:
  932. *pipe = PIPE_A;
  933. break;
  934. case TRANS_DDI_EDP_INPUT_B_ONOFF:
  935. *pipe = PIPE_B;
  936. break;
  937. case TRANS_DDI_EDP_INPUT_C_ONOFF:
  938. *pipe = PIPE_C;
  939. break;
  940. }
  941. return true;
  942. } else {
  943. for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
  944. tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
  945. if ((tmp & TRANS_DDI_PORT_MASK)
  946. == TRANS_DDI_SELECT_PORT(port)) {
  947. if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
  948. return false;
  949. *pipe = i;
  950. return true;
  951. }
  952. }
  953. }
  954. DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
  955. return false;
  956. }
  957. void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
  958. {
  959. struct drm_crtc *crtc = &intel_crtc->base;
  960. struct drm_i915_private *dev_priv = crtc->dev->dev_private;
  961. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  962. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  963. enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
  964. if (cpu_transcoder != TRANSCODER_EDP)
  965. I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
  966. TRANS_CLK_SEL_PORT(port));
  967. }
  968. void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
  969. {
  970. struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
  971. enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
  972. if (cpu_transcoder != TRANSCODER_EDP)
  973. I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
  974. TRANS_CLK_SEL_DISABLED);
  975. }
  976. static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
  977. {
  978. struct drm_encoder *encoder = &intel_encoder->base;
  979. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  980. struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
  981. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  982. int type = intel_encoder->type;
  983. if (crtc->config.has_audio) {
  984. DRM_DEBUG_DRIVER("Audio on pipe %c on DDI\n",
  985. pipe_name(crtc->pipe));
  986. /* write eld */
  987. DRM_DEBUG_DRIVER("DDI audio: write eld information\n");
  988. intel_write_eld(encoder, &crtc->config.adjusted_mode);
  989. }
  990. if (type == INTEL_OUTPUT_EDP) {
  991. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  992. intel_edp_panel_on(intel_dp);
  993. }
  994. WARN_ON(crtc->config.ddi_pll_sel == PORT_CLK_SEL_NONE);
  995. I915_WRITE(PORT_CLK_SEL(port), crtc->config.ddi_pll_sel);
  996. if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
  997. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  998. intel_ddi_init_dp_buf_reg(intel_encoder);
  999. intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
  1000. intel_dp_start_link_train(intel_dp);
  1001. intel_dp_complete_link_train(intel_dp);
  1002. if (port != PORT_A)
  1003. intel_dp_stop_link_train(intel_dp);
  1004. } else if (type == INTEL_OUTPUT_HDMI) {
  1005. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  1006. intel_hdmi->set_infoframes(encoder,
  1007. crtc->config.has_hdmi_sink,
  1008. &crtc->config.adjusted_mode);
  1009. }
  1010. }
  1011. static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
  1012. {
  1013. struct drm_encoder *encoder = &intel_encoder->base;
  1014. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  1015. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1016. int type = intel_encoder->type;
  1017. uint32_t val;
  1018. bool wait = false;
  1019. val = I915_READ(DDI_BUF_CTL(port));
  1020. if (val & DDI_BUF_CTL_ENABLE) {
  1021. val &= ~DDI_BUF_CTL_ENABLE;
  1022. I915_WRITE(DDI_BUF_CTL(port), val);
  1023. wait = true;
  1024. }
  1025. val = I915_READ(DP_TP_CTL(port));
  1026. val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
  1027. val |= DP_TP_CTL_LINK_TRAIN_PAT1;
  1028. I915_WRITE(DP_TP_CTL(port), val);
  1029. if (wait)
  1030. intel_wait_ddi_buf_idle(dev_priv, port);
  1031. if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
  1032. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1033. intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
  1034. intel_edp_panel_vdd_on(intel_dp);
  1035. intel_edp_panel_off(intel_dp);
  1036. }
  1037. I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
  1038. }
  1039. static void intel_enable_ddi(struct intel_encoder *intel_encoder)
  1040. {
  1041. struct drm_encoder *encoder = &intel_encoder->base;
  1042. struct drm_crtc *crtc = encoder->crtc;
  1043. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1044. int pipe = intel_crtc->pipe;
  1045. struct drm_device *dev = encoder->dev;
  1046. struct drm_i915_private *dev_priv = dev->dev_private;
  1047. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1048. int type = intel_encoder->type;
  1049. uint32_t tmp;
  1050. if (type == INTEL_OUTPUT_HDMI) {
  1051. struct intel_digital_port *intel_dig_port =
  1052. enc_to_dig_port(encoder);
  1053. /* In HDMI/DVI mode, the port width, and swing/emphasis values
  1054. * are ignored so nothing special needs to be done besides
  1055. * enabling the port.
  1056. */
  1057. I915_WRITE(DDI_BUF_CTL(port),
  1058. intel_dig_port->saved_port_bits |
  1059. DDI_BUF_CTL_ENABLE);
  1060. } else if (type == INTEL_OUTPUT_EDP) {
  1061. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1062. if (port == PORT_A)
  1063. intel_dp_stop_link_train(intel_dp);
  1064. intel_edp_backlight_on(intel_dp);
  1065. intel_edp_psr_enable(intel_dp);
  1066. }
  1067. if (intel_crtc->config.has_audio) {
  1068. intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
  1069. tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
  1070. tmp |= ((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) << (pipe * 4));
  1071. I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
  1072. }
  1073. }
  1074. static void intel_disable_ddi(struct intel_encoder *intel_encoder)
  1075. {
  1076. struct drm_encoder *encoder = &intel_encoder->base;
  1077. struct drm_crtc *crtc = encoder->crtc;
  1078. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1079. int pipe = intel_crtc->pipe;
  1080. int type = intel_encoder->type;
  1081. struct drm_device *dev = encoder->dev;
  1082. struct drm_i915_private *dev_priv = dev->dev_private;
  1083. uint32_t tmp;
  1084. /* We can't touch HSW_AUD_PIN_ELD_CP_VLD uncionditionally because this
  1085. * register is part of the power well on Haswell. */
  1086. if (intel_crtc->config.has_audio) {
  1087. tmp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
  1088. tmp &= ~((AUDIO_OUTPUT_ENABLE_A | AUDIO_ELD_VALID_A) <<
  1089. (pipe * 4));
  1090. I915_WRITE(HSW_AUD_PIN_ELD_CP_VLD, tmp);
  1091. intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
  1092. }
  1093. if (type == INTEL_OUTPUT_EDP) {
  1094. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1095. intel_edp_psr_disable(intel_dp);
  1096. intel_edp_backlight_off(intel_dp);
  1097. }
  1098. }
  1099. static int bdw_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1100. {
  1101. uint32_t lcpll = I915_READ(LCPLL_CTL);
  1102. uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
  1103. if (lcpll & LCPLL_CD_SOURCE_FCLK)
  1104. return 800000;
  1105. else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
  1106. return 450000;
  1107. else if (freq == LCPLL_CLK_FREQ_450)
  1108. return 450000;
  1109. else if (freq == LCPLL_CLK_FREQ_54O_BDW)
  1110. return 540000;
  1111. else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
  1112. return 337500;
  1113. else
  1114. return 675000;
  1115. }
  1116. static int hsw_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1117. {
  1118. struct drm_device *dev = dev_priv->dev;
  1119. uint32_t lcpll = I915_READ(LCPLL_CTL);
  1120. uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
  1121. if (lcpll & LCPLL_CD_SOURCE_FCLK)
  1122. return 800000;
  1123. else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
  1124. return 450000;
  1125. else if (freq == LCPLL_CLK_FREQ_450)
  1126. return 450000;
  1127. else if (IS_ULT(dev))
  1128. return 337500;
  1129. else
  1130. return 540000;
  1131. }
  1132. int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1133. {
  1134. struct drm_device *dev = dev_priv->dev;
  1135. if (IS_BROADWELL(dev))
  1136. return bdw_get_cdclk_freq(dev_priv);
  1137. /* Haswell */
  1138. return hsw_get_cdclk_freq(dev_priv);
  1139. }
  1140. static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
  1141. struct intel_shared_dpll *pll)
  1142. {
  1143. I915_WRITE(WRPLL_CTL(pll->id), pll->hw_state.wrpll);
  1144. POSTING_READ(WRPLL_CTL(pll->id));
  1145. udelay(20);
  1146. }
  1147. static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
  1148. struct intel_shared_dpll *pll)
  1149. {
  1150. uint32_t val;
  1151. val = I915_READ(WRPLL_CTL(pll->id));
  1152. I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
  1153. POSTING_READ(WRPLL_CTL(pll->id));
  1154. }
  1155. static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
  1156. struct intel_shared_dpll *pll,
  1157. struct intel_dpll_hw_state *hw_state)
  1158. {
  1159. uint32_t val;
  1160. if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
  1161. return false;
  1162. val = I915_READ(WRPLL_CTL(pll->id));
  1163. hw_state->wrpll = val;
  1164. return val & WRPLL_PLL_ENABLE;
  1165. }
  1166. static const char * const hsw_ddi_pll_names[] = {
  1167. "WRPLL 1",
  1168. "WRPLL 2",
  1169. };
  1170. static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
  1171. {
  1172. int i;
  1173. dev_priv->num_shared_dpll = 2;
  1174. for (i = 0; i < dev_priv->num_shared_dpll; i++) {
  1175. dev_priv->shared_dplls[i].id = i;
  1176. dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
  1177. dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
  1178. dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable;
  1179. dev_priv->shared_dplls[i].get_hw_state =
  1180. hsw_ddi_pll_get_hw_state;
  1181. }
  1182. }
  1183. void intel_ddi_pll_init(struct drm_device *dev)
  1184. {
  1185. struct drm_i915_private *dev_priv = dev->dev_private;
  1186. uint32_t val = I915_READ(LCPLL_CTL);
  1187. hsw_shared_dplls_init(dev_priv);
  1188. /* The LCPLL register should be turned on by the BIOS. For now let's
  1189. * just check its state and print errors in case something is wrong.
  1190. * Don't even try to turn it on.
  1191. */
  1192. DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
  1193. intel_ddi_get_cdclk_freq(dev_priv));
  1194. if (val & LCPLL_CD_SOURCE_FCLK)
  1195. DRM_ERROR("CDCLK source is not LCPLL\n");
  1196. if (val & LCPLL_PLL_DISABLE)
  1197. DRM_ERROR("LCPLL is disabled\n");
  1198. }
  1199. void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
  1200. {
  1201. struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
  1202. struct intel_dp *intel_dp = &intel_dig_port->dp;
  1203. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  1204. enum port port = intel_dig_port->port;
  1205. uint32_t val;
  1206. bool wait = false;
  1207. if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
  1208. val = I915_READ(DDI_BUF_CTL(port));
  1209. if (val & DDI_BUF_CTL_ENABLE) {
  1210. val &= ~DDI_BUF_CTL_ENABLE;
  1211. I915_WRITE(DDI_BUF_CTL(port), val);
  1212. wait = true;
  1213. }
  1214. val = I915_READ(DP_TP_CTL(port));
  1215. val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
  1216. val |= DP_TP_CTL_LINK_TRAIN_PAT1;
  1217. I915_WRITE(DP_TP_CTL(port), val);
  1218. POSTING_READ(DP_TP_CTL(port));
  1219. if (wait)
  1220. intel_wait_ddi_buf_idle(dev_priv, port);
  1221. }
  1222. val = DP_TP_CTL_ENABLE |
  1223. DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
  1224. if (intel_dp->is_mst)
  1225. val |= DP_TP_CTL_MODE_MST;
  1226. else {
  1227. val |= DP_TP_CTL_MODE_SST;
  1228. if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
  1229. val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
  1230. }
  1231. I915_WRITE(DP_TP_CTL(port), val);
  1232. POSTING_READ(DP_TP_CTL(port));
  1233. intel_dp->DP |= DDI_BUF_CTL_ENABLE;
  1234. I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
  1235. POSTING_READ(DDI_BUF_CTL(port));
  1236. udelay(600);
  1237. }
  1238. void intel_ddi_fdi_disable(struct drm_crtc *crtc)
  1239. {
  1240. struct drm_i915_private *dev_priv = crtc->dev->dev_private;
  1241. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  1242. uint32_t val;
  1243. intel_ddi_post_disable(intel_encoder);
  1244. val = I915_READ(_FDI_RXA_CTL);
  1245. val &= ~FDI_RX_ENABLE;
  1246. I915_WRITE(_FDI_RXA_CTL, val);
  1247. val = I915_READ(_FDI_RXA_MISC);
  1248. val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
  1249. val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
  1250. I915_WRITE(_FDI_RXA_MISC, val);
  1251. val = I915_READ(_FDI_RXA_CTL);
  1252. val &= ~FDI_PCDCLK;
  1253. I915_WRITE(_FDI_RXA_CTL, val);
  1254. val = I915_READ(_FDI_RXA_CTL);
  1255. val &= ~FDI_RX_PLL_ENABLE;
  1256. I915_WRITE(_FDI_RXA_CTL, val);
  1257. }
  1258. static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
  1259. {
  1260. struct intel_digital_port *intel_dig_port = enc_to_dig_port(&intel_encoder->base);
  1261. int type = intel_dig_port->base.type;
  1262. if (type != INTEL_OUTPUT_DISPLAYPORT &&
  1263. type != INTEL_OUTPUT_EDP &&
  1264. type != INTEL_OUTPUT_UNKNOWN) {
  1265. return;
  1266. }
  1267. intel_dp_hot_plug(intel_encoder);
  1268. }
  1269. void intel_ddi_get_config(struct intel_encoder *encoder,
  1270. struct intel_crtc_config *pipe_config)
  1271. {
  1272. struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
  1273. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
  1274. enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
  1275. u32 temp, flags = 0;
  1276. temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
  1277. if (temp & TRANS_DDI_PHSYNC)
  1278. flags |= DRM_MODE_FLAG_PHSYNC;
  1279. else
  1280. flags |= DRM_MODE_FLAG_NHSYNC;
  1281. if (temp & TRANS_DDI_PVSYNC)
  1282. flags |= DRM_MODE_FLAG_PVSYNC;
  1283. else
  1284. flags |= DRM_MODE_FLAG_NVSYNC;
  1285. pipe_config->adjusted_mode.flags |= flags;
  1286. switch (temp & TRANS_DDI_BPC_MASK) {
  1287. case TRANS_DDI_BPC_6:
  1288. pipe_config->pipe_bpp = 18;
  1289. break;
  1290. case TRANS_DDI_BPC_8:
  1291. pipe_config->pipe_bpp = 24;
  1292. break;
  1293. case TRANS_DDI_BPC_10:
  1294. pipe_config->pipe_bpp = 30;
  1295. break;
  1296. case TRANS_DDI_BPC_12:
  1297. pipe_config->pipe_bpp = 36;
  1298. break;
  1299. default:
  1300. break;
  1301. }
  1302. switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
  1303. case TRANS_DDI_MODE_SELECT_HDMI:
  1304. pipe_config->has_hdmi_sink = true;
  1305. case TRANS_DDI_MODE_SELECT_DVI:
  1306. case TRANS_DDI_MODE_SELECT_FDI:
  1307. break;
  1308. case TRANS_DDI_MODE_SELECT_DP_SST:
  1309. case TRANS_DDI_MODE_SELECT_DP_MST:
  1310. pipe_config->has_dp_encoder = true;
  1311. intel_dp_get_m_n(intel_crtc, pipe_config);
  1312. break;
  1313. default:
  1314. break;
  1315. }
  1316. if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
  1317. temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
  1318. if (temp & (AUDIO_OUTPUT_ENABLE_A << (intel_crtc->pipe * 4)))
  1319. pipe_config->has_audio = true;
  1320. }
  1321. if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
  1322. pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
  1323. /*
  1324. * This is a big fat ugly hack.
  1325. *
  1326. * Some machines in UEFI boot mode provide us a VBT that has 18
  1327. * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
  1328. * unknown we fail to light up. Yet the same BIOS boots up with
  1329. * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
  1330. * max, not what it tells us to use.
  1331. *
  1332. * Note: This will still be broken if the eDP panel is not lit
  1333. * up by the BIOS, and thus we can't get the mode at module
  1334. * load.
  1335. */
  1336. DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
  1337. pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
  1338. dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
  1339. }
  1340. hsw_ddi_clock_get(encoder, pipe_config);
  1341. }
  1342. static void intel_ddi_destroy(struct drm_encoder *encoder)
  1343. {
  1344. /* HDMI has nothing special to destroy, so we can go with this. */
  1345. intel_dp_encoder_destroy(encoder);
  1346. }
  1347. static bool intel_ddi_compute_config(struct intel_encoder *encoder,
  1348. struct intel_crtc_config *pipe_config)
  1349. {
  1350. int type = encoder->type;
  1351. int port = intel_ddi_get_encoder_port(encoder);
  1352. WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
  1353. if (port == PORT_A)
  1354. pipe_config->cpu_transcoder = TRANSCODER_EDP;
  1355. if (type == INTEL_OUTPUT_HDMI)
  1356. return intel_hdmi_compute_config(encoder, pipe_config);
  1357. else
  1358. return intel_dp_compute_config(encoder, pipe_config);
  1359. }
  1360. static const struct drm_encoder_funcs intel_ddi_funcs = {
  1361. .destroy = intel_ddi_destroy,
  1362. };
  1363. static struct intel_connector *
  1364. intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
  1365. {
  1366. struct intel_connector *connector;
  1367. enum port port = intel_dig_port->port;
  1368. connector = kzalloc(sizeof(*connector), GFP_KERNEL);
  1369. if (!connector)
  1370. return NULL;
  1371. intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
  1372. if (!intel_dp_init_connector(intel_dig_port, connector)) {
  1373. kfree(connector);
  1374. return NULL;
  1375. }
  1376. return connector;
  1377. }
  1378. static struct intel_connector *
  1379. intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
  1380. {
  1381. struct intel_connector *connector;
  1382. enum port port = intel_dig_port->port;
  1383. connector = kzalloc(sizeof(*connector), GFP_KERNEL);
  1384. if (!connector)
  1385. return NULL;
  1386. intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
  1387. intel_hdmi_init_connector(intel_dig_port, connector);
  1388. return connector;
  1389. }
  1390. void intel_ddi_init(struct drm_device *dev, enum port port)
  1391. {
  1392. struct drm_i915_private *dev_priv = dev->dev_private;
  1393. struct intel_digital_port *intel_dig_port;
  1394. struct intel_encoder *intel_encoder;
  1395. struct drm_encoder *encoder;
  1396. bool init_hdmi, init_dp;
  1397. init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
  1398. dev_priv->vbt.ddi_port_info[port].supports_hdmi);
  1399. init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
  1400. if (!init_dp && !init_hdmi) {
  1401. DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n",
  1402. port_name(port));
  1403. init_hdmi = true;
  1404. init_dp = true;
  1405. }
  1406. intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
  1407. if (!intel_dig_port)
  1408. return;
  1409. intel_encoder = &intel_dig_port->base;
  1410. encoder = &intel_encoder->base;
  1411. drm_encoder_init(dev, encoder, &intel_ddi_funcs,
  1412. DRM_MODE_ENCODER_TMDS);
  1413. intel_encoder->compute_config = intel_ddi_compute_config;
  1414. intel_encoder->enable = intel_enable_ddi;
  1415. intel_encoder->pre_enable = intel_ddi_pre_enable;
  1416. intel_encoder->disable = intel_disable_ddi;
  1417. intel_encoder->post_disable = intel_ddi_post_disable;
  1418. intel_encoder->get_hw_state = intel_ddi_get_hw_state;
  1419. intel_encoder->get_config = intel_ddi_get_config;
  1420. intel_dig_port->port = port;
  1421. intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
  1422. (DDI_BUF_PORT_REVERSAL |
  1423. DDI_A_4_LANES);
  1424. intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
  1425. intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
  1426. intel_encoder->cloneable = 0;
  1427. intel_encoder->hot_plug = intel_ddi_hot_plug;
  1428. if (init_dp) {
  1429. if (!intel_ddi_init_dp_connector(intel_dig_port))
  1430. goto err;
  1431. intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
  1432. dev_priv->hpd_irq_port[port] = intel_dig_port;
  1433. }
  1434. /* In theory we don't need the encoder->type check, but leave it just in
  1435. * case we have some really bad VBTs... */
  1436. if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
  1437. if (!intel_ddi_init_hdmi_connector(intel_dig_port))
  1438. goto err;
  1439. }
  1440. return;
  1441. err:
  1442. drm_encoder_cleanup(encoder);
  1443. kfree(intel_dig_port);
  1444. }