intel_ddi.c 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298
  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, 0x000000a2 },
  122. { 0x00004014, 0x0000009B },
  123. { 0x00006012, 0x00000088 },
  124. { 0x00008010, 0x00000087 },
  125. { 0x00000018, 0x0000009B },
  126. { 0x00004014, 0x00000088 },
  127. { 0x00006012, 0x00000087 },
  128. { 0x00000018, 0x00000088 },
  129. { 0x00004014, 0x00000087 },
  130. };
  131. /* eDP 1.4 low vswing translation parameters */
  132. static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
  133. { 0x00000018, 0x000000a8 },
  134. { 0x00002016, 0x000000ab },
  135. { 0x00006012, 0x000000a2 },
  136. { 0x00008010, 0x00000088 },
  137. { 0x00000018, 0x000000ab },
  138. { 0x00004014, 0x000000a2 },
  139. { 0x00006012, 0x000000a6 },
  140. { 0x00000018, 0x000000a2 },
  141. { 0x00005013, 0x0000009c },
  142. { 0x00000018, 0x00000088 },
  143. };
  144. static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
  145. /* Idx NT mV T mV db */
  146. { 0x00004014, 0x00000087 }, /* 0: 800 1000 2 */
  147. };
  148. enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
  149. {
  150. struct drm_encoder *encoder = &intel_encoder->base;
  151. int type = intel_encoder->type;
  152. if (type == INTEL_OUTPUT_DP_MST) {
  153. struct intel_digital_port *intel_dig_port = enc_to_mst(encoder)->primary;
  154. return intel_dig_port->port;
  155. } else if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP ||
  156. type == INTEL_OUTPUT_HDMI || type == INTEL_OUTPUT_UNKNOWN) {
  157. struct intel_digital_port *intel_dig_port =
  158. enc_to_dig_port(encoder);
  159. return intel_dig_port->port;
  160. } else if (type == INTEL_OUTPUT_ANALOG) {
  161. return PORT_E;
  162. } else {
  163. DRM_ERROR("Invalid DDI encoder type %d\n", type);
  164. BUG();
  165. }
  166. }
  167. /*
  168. * Starting with Haswell, DDI port buffers must be programmed with correct
  169. * values in advance. The buffer values are different for FDI and DP modes,
  170. * but the HDMI/DVI fields are shared among those. So we program the DDI
  171. * in either FDI or DP modes only, as HDMI connections will work with both
  172. * of those
  173. */
  174. static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port)
  175. {
  176. struct drm_i915_private *dev_priv = dev->dev_private;
  177. u32 reg;
  178. int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
  179. size;
  180. int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
  181. const struct ddi_buf_trans *ddi_translations_fdi;
  182. const struct ddi_buf_trans *ddi_translations_dp;
  183. const struct ddi_buf_trans *ddi_translations_edp;
  184. const struct ddi_buf_trans *ddi_translations_hdmi;
  185. const struct ddi_buf_trans *ddi_translations;
  186. if (IS_SKYLAKE(dev)) {
  187. ddi_translations_fdi = NULL;
  188. ddi_translations_dp = skl_ddi_translations_dp;
  189. n_dp_entries = ARRAY_SIZE(skl_ddi_translations_dp);
  190. if (dev_priv->vbt.edp_low_vswing) {
  191. ddi_translations_edp = skl_ddi_translations_edp;
  192. n_edp_entries = ARRAY_SIZE(skl_ddi_translations_edp);
  193. } else {
  194. ddi_translations_edp = skl_ddi_translations_dp;
  195. n_edp_entries = ARRAY_SIZE(skl_ddi_translations_dp);
  196. }
  197. /*
  198. * On SKL, the recommendation from the hw team is to always use
  199. * a certain type of level shifter (and thus the corresponding
  200. * 800mV+2dB entry). Given that's the only validated entry, we
  201. * override what is in the VBT, at least until further notice.
  202. */
  203. hdmi_level = 0;
  204. ddi_translations_hdmi = skl_ddi_translations_hdmi;
  205. n_hdmi_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
  206. hdmi_default_entry = 0;
  207. } else if (IS_BROADWELL(dev)) {
  208. ddi_translations_fdi = bdw_ddi_translations_fdi;
  209. ddi_translations_dp = bdw_ddi_translations_dp;
  210. ddi_translations_edp = bdw_ddi_translations_edp;
  211. ddi_translations_hdmi = bdw_ddi_translations_hdmi;
  212. n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
  213. n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
  214. n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
  215. hdmi_default_entry = 7;
  216. } else if (IS_HASWELL(dev)) {
  217. ddi_translations_fdi = hsw_ddi_translations_fdi;
  218. ddi_translations_dp = hsw_ddi_translations_dp;
  219. ddi_translations_edp = hsw_ddi_translations_dp;
  220. ddi_translations_hdmi = hsw_ddi_translations_hdmi;
  221. n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
  222. n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
  223. hdmi_default_entry = 6;
  224. } else {
  225. WARN(1, "ddi translation table missing\n");
  226. ddi_translations_edp = bdw_ddi_translations_dp;
  227. ddi_translations_fdi = bdw_ddi_translations_fdi;
  228. ddi_translations_dp = bdw_ddi_translations_dp;
  229. ddi_translations_hdmi = bdw_ddi_translations_hdmi;
  230. n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
  231. n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
  232. n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
  233. hdmi_default_entry = 7;
  234. }
  235. switch (port) {
  236. case PORT_A:
  237. ddi_translations = ddi_translations_edp;
  238. size = n_edp_entries;
  239. break;
  240. case PORT_B:
  241. case PORT_C:
  242. ddi_translations = ddi_translations_dp;
  243. size = n_dp_entries;
  244. break;
  245. case PORT_D:
  246. if (intel_dp_is_edp(dev, PORT_D)) {
  247. ddi_translations = ddi_translations_edp;
  248. size = n_edp_entries;
  249. } else {
  250. ddi_translations = ddi_translations_dp;
  251. size = n_dp_entries;
  252. }
  253. break;
  254. case PORT_E:
  255. if (ddi_translations_fdi)
  256. ddi_translations = ddi_translations_fdi;
  257. else
  258. ddi_translations = ddi_translations_dp;
  259. size = n_dp_entries;
  260. break;
  261. default:
  262. BUG();
  263. }
  264. for (i = 0, reg = DDI_BUF_TRANS(port); i < size; i++) {
  265. I915_WRITE(reg, ddi_translations[i].trans1);
  266. reg += 4;
  267. I915_WRITE(reg, ddi_translations[i].trans2);
  268. reg += 4;
  269. }
  270. /* Choose a good default if VBT is badly populated */
  271. if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
  272. hdmi_level >= n_hdmi_entries)
  273. hdmi_level = hdmi_default_entry;
  274. /* Entry 9 is for HDMI: */
  275. I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans1);
  276. reg += 4;
  277. I915_WRITE(reg, ddi_translations_hdmi[hdmi_level].trans2);
  278. reg += 4;
  279. }
  280. /* Program DDI buffers translations for DP. By default, program ports A-D in DP
  281. * mode and port E for FDI.
  282. */
  283. void intel_prepare_ddi(struct drm_device *dev)
  284. {
  285. int port;
  286. if (!HAS_DDI(dev))
  287. return;
  288. for (port = PORT_A; port <= PORT_E; port++)
  289. intel_prepare_ddi_buffers(dev, port);
  290. }
  291. static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
  292. enum port port)
  293. {
  294. uint32_t reg = DDI_BUF_CTL(port);
  295. int i;
  296. for (i = 0; i < 8; i++) {
  297. udelay(1);
  298. if (I915_READ(reg) & DDI_BUF_IS_IDLE)
  299. return;
  300. }
  301. DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
  302. }
  303. /* Starting with Haswell, different DDI ports can work in FDI mode for
  304. * connection to the PCH-located connectors. For this, it is necessary to train
  305. * both the DDI port and PCH receiver for the desired DDI buffer settings.
  306. *
  307. * The recommended port to work in FDI mode is DDI E, which we use here. Also,
  308. * please note that when FDI mode is active on DDI E, it shares 2 lines with
  309. * DDI A (which is used for eDP)
  310. */
  311. void hsw_fdi_link_train(struct drm_crtc *crtc)
  312. {
  313. struct drm_device *dev = crtc->dev;
  314. struct drm_i915_private *dev_priv = dev->dev_private;
  315. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  316. u32 temp, i, rx_ctl_val;
  317. /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
  318. * mode set "sequence for CRT port" document:
  319. * - TP1 to TP2 time with the default value
  320. * - FDI delay to 90h
  321. *
  322. * WaFDIAutoLinkSetTimingOverrride:hsw
  323. */
  324. I915_WRITE(_FDI_RXA_MISC, FDI_RX_PWRDN_LANE1_VAL(2) |
  325. FDI_RX_PWRDN_LANE0_VAL(2) |
  326. FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
  327. /* Enable the PCH Receiver FDI PLL */
  328. rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
  329. FDI_RX_PLL_ENABLE |
  330. FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
  331. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  332. POSTING_READ(_FDI_RXA_CTL);
  333. udelay(220);
  334. /* Switch from Rawclk to PCDclk */
  335. rx_ctl_val |= FDI_PCDCLK;
  336. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  337. /* Configure Port Clock Select */
  338. I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config->ddi_pll_sel);
  339. WARN_ON(intel_crtc->config->ddi_pll_sel != PORT_CLK_SEL_SPLL);
  340. /* Start the training iterating through available voltages and emphasis,
  341. * testing each value twice. */
  342. for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
  343. /* Configure DP_TP_CTL with auto-training */
  344. I915_WRITE(DP_TP_CTL(PORT_E),
  345. DP_TP_CTL_FDI_AUTOTRAIN |
  346. DP_TP_CTL_ENHANCED_FRAME_ENABLE |
  347. DP_TP_CTL_LINK_TRAIN_PAT1 |
  348. DP_TP_CTL_ENABLE);
  349. /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
  350. * DDI E does not support port reversal, the functionality is
  351. * achieved on the PCH side in FDI_RX_CTL, so no need to set the
  352. * port reversal bit */
  353. I915_WRITE(DDI_BUF_CTL(PORT_E),
  354. DDI_BUF_CTL_ENABLE |
  355. ((intel_crtc->config->fdi_lanes - 1) << 1) |
  356. DDI_BUF_TRANS_SELECT(i / 2));
  357. POSTING_READ(DDI_BUF_CTL(PORT_E));
  358. udelay(600);
  359. /* Program PCH FDI Receiver TU */
  360. I915_WRITE(_FDI_RXA_TUSIZE1, TU_SIZE(64));
  361. /* Enable PCH FDI Receiver with auto-training */
  362. rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
  363. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  364. POSTING_READ(_FDI_RXA_CTL);
  365. /* Wait for FDI receiver lane calibration */
  366. udelay(30);
  367. /* Unset FDI_RX_MISC pwrdn lanes */
  368. temp = I915_READ(_FDI_RXA_MISC);
  369. temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
  370. I915_WRITE(_FDI_RXA_MISC, temp);
  371. POSTING_READ(_FDI_RXA_MISC);
  372. /* Wait for FDI auto training time */
  373. udelay(5);
  374. temp = I915_READ(DP_TP_STATUS(PORT_E));
  375. if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
  376. DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
  377. /* Enable normal pixel sending for FDI */
  378. I915_WRITE(DP_TP_CTL(PORT_E),
  379. DP_TP_CTL_FDI_AUTOTRAIN |
  380. DP_TP_CTL_LINK_TRAIN_NORMAL |
  381. DP_TP_CTL_ENHANCED_FRAME_ENABLE |
  382. DP_TP_CTL_ENABLE);
  383. return;
  384. }
  385. temp = I915_READ(DDI_BUF_CTL(PORT_E));
  386. temp &= ~DDI_BUF_CTL_ENABLE;
  387. I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
  388. POSTING_READ(DDI_BUF_CTL(PORT_E));
  389. /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
  390. temp = I915_READ(DP_TP_CTL(PORT_E));
  391. temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
  392. temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
  393. I915_WRITE(DP_TP_CTL(PORT_E), temp);
  394. POSTING_READ(DP_TP_CTL(PORT_E));
  395. intel_wait_ddi_buf_idle(dev_priv, PORT_E);
  396. rx_ctl_val &= ~FDI_RX_ENABLE;
  397. I915_WRITE(_FDI_RXA_CTL, rx_ctl_val);
  398. POSTING_READ(_FDI_RXA_CTL);
  399. /* Reset FDI_RX_MISC pwrdn lanes */
  400. temp = I915_READ(_FDI_RXA_MISC);
  401. temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
  402. temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
  403. I915_WRITE(_FDI_RXA_MISC, temp);
  404. POSTING_READ(_FDI_RXA_MISC);
  405. }
  406. DRM_ERROR("FDI link training failed!\n");
  407. }
  408. void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
  409. {
  410. struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
  411. struct intel_digital_port *intel_dig_port =
  412. enc_to_dig_port(&encoder->base);
  413. intel_dp->DP = intel_dig_port->saved_port_bits |
  414. DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
  415. intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
  416. }
  417. static struct intel_encoder *
  418. intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
  419. {
  420. struct drm_device *dev = crtc->dev;
  421. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  422. struct intel_encoder *intel_encoder, *ret = NULL;
  423. int num_encoders = 0;
  424. for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
  425. ret = intel_encoder;
  426. num_encoders++;
  427. }
  428. if (num_encoders != 1)
  429. WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
  430. pipe_name(intel_crtc->pipe));
  431. BUG_ON(ret == NULL);
  432. return ret;
  433. }
  434. static struct intel_encoder *
  435. intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
  436. {
  437. struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
  438. struct intel_encoder *ret = NULL;
  439. struct drm_atomic_state *state;
  440. int num_encoders = 0;
  441. int i;
  442. state = crtc_state->base.state;
  443. for (i = 0; i < state->num_connector; i++) {
  444. if (!state->connectors[i] ||
  445. state->connector_states[i]->crtc != crtc_state->base.crtc)
  446. continue;
  447. ret = to_intel_encoder(state->connector_states[i]->best_encoder);
  448. num_encoders++;
  449. }
  450. WARN(num_encoders != 1, "%d encoders on crtc for pipe %c\n", num_encoders,
  451. pipe_name(crtc->pipe));
  452. BUG_ON(ret == NULL);
  453. return ret;
  454. }
  455. #define LC_FREQ 2700
  456. #define LC_FREQ_2K U64_C(LC_FREQ * 2000)
  457. #define P_MIN 2
  458. #define P_MAX 64
  459. #define P_INC 2
  460. /* Constraints for PLL good behavior */
  461. #define REF_MIN 48
  462. #define REF_MAX 400
  463. #define VCO_MIN 2400
  464. #define VCO_MAX 4800
  465. #define abs_diff(a, b) ({ \
  466. typeof(a) __a = (a); \
  467. typeof(b) __b = (b); \
  468. (void) (&__a == &__b); \
  469. __a > __b ? (__a - __b) : (__b - __a); })
  470. struct wrpll_rnp {
  471. unsigned p, n2, r2;
  472. };
  473. static unsigned wrpll_get_budget_for_freq(int clock)
  474. {
  475. unsigned budget;
  476. switch (clock) {
  477. case 25175000:
  478. case 25200000:
  479. case 27000000:
  480. case 27027000:
  481. case 37762500:
  482. case 37800000:
  483. case 40500000:
  484. case 40541000:
  485. case 54000000:
  486. case 54054000:
  487. case 59341000:
  488. case 59400000:
  489. case 72000000:
  490. case 74176000:
  491. case 74250000:
  492. case 81000000:
  493. case 81081000:
  494. case 89012000:
  495. case 89100000:
  496. case 108000000:
  497. case 108108000:
  498. case 111264000:
  499. case 111375000:
  500. case 148352000:
  501. case 148500000:
  502. case 162000000:
  503. case 162162000:
  504. case 222525000:
  505. case 222750000:
  506. case 296703000:
  507. case 297000000:
  508. budget = 0;
  509. break;
  510. case 233500000:
  511. case 245250000:
  512. case 247750000:
  513. case 253250000:
  514. case 298000000:
  515. budget = 1500;
  516. break;
  517. case 169128000:
  518. case 169500000:
  519. case 179500000:
  520. case 202000000:
  521. budget = 2000;
  522. break;
  523. case 256250000:
  524. case 262500000:
  525. case 270000000:
  526. case 272500000:
  527. case 273750000:
  528. case 280750000:
  529. case 281250000:
  530. case 286000000:
  531. case 291750000:
  532. budget = 4000;
  533. break;
  534. case 267250000:
  535. case 268500000:
  536. budget = 5000;
  537. break;
  538. default:
  539. budget = 1000;
  540. break;
  541. }
  542. return budget;
  543. }
  544. static void wrpll_update_rnp(uint64_t freq2k, unsigned budget,
  545. unsigned r2, unsigned n2, unsigned p,
  546. struct wrpll_rnp *best)
  547. {
  548. uint64_t a, b, c, d, diff, diff_best;
  549. /* No best (r,n,p) yet */
  550. if (best->p == 0) {
  551. best->p = p;
  552. best->n2 = n2;
  553. best->r2 = r2;
  554. return;
  555. }
  556. /*
  557. * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
  558. * freq2k.
  559. *
  560. * delta = 1e6 *
  561. * abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
  562. * freq2k;
  563. *
  564. * and we would like delta <= budget.
  565. *
  566. * If the discrepancy is above the PPM-based budget, always prefer to
  567. * improve upon the previous solution. However, if you're within the
  568. * budget, try to maximize Ref * VCO, that is N / (P * R^2).
  569. */
  570. a = freq2k * budget * p * r2;
  571. b = freq2k * budget * best->p * best->r2;
  572. diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
  573. diff_best = abs_diff(freq2k * best->p * best->r2,
  574. LC_FREQ_2K * best->n2);
  575. c = 1000000 * diff;
  576. d = 1000000 * diff_best;
  577. if (a < c && b < d) {
  578. /* If both are above the budget, pick the closer */
  579. if (best->p * best->r2 * diff < p * r2 * diff_best) {
  580. best->p = p;
  581. best->n2 = n2;
  582. best->r2 = r2;
  583. }
  584. } else if (a >= c && b < d) {
  585. /* If A is below the threshold but B is above it? Update. */
  586. best->p = p;
  587. best->n2 = n2;
  588. best->r2 = r2;
  589. } else if (a >= c && b >= d) {
  590. /* Both are below the limit, so pick the higher n2/(r2*r2) */
  591. if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
  592. best->p = p;
  593. best->n2 = n2;
  594. best->r2 = r2;
  595. }
  596. }
  597. /* Otherwise a < c && b >= d, do nothing */
  598. }
  599. static int intel_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv,
  600. int reg)
  601. {
  602. int refclk = LC_FREQ;
  603. int n, p, r;
  604. u32 wrpll;
  605. wrpll = I915_READ(reg);
  606. switch (wrpll & WRPLL_PLL_REF_MASK) {
  607. case WRPLL_PLL_SSC:
  608. case WRPLL_PLL_NON_SSC:
  609. /*
  610. * We could calculate spread here, but our checking
  611. * code only cares about 5% accuracy, and spread is a max of
  612. * 0.5% downspread.
  613. */
  614. refclk = 135;
  615. break;
  616. case WRPLL_PLL_LCPLL:
  617. refclk = LC_FREQ;
  618. break;
  619. default:
  620. WARN(1, "bad wrpll refclk\n");
  621. return 0;
  622. }
  623. r = wrpll & WRPLL_DIVIDER_REF_MASK;
  624. p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
  625. n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
  626. /* Convert to KHz, p & r have a fixed point portion */
  627. return (refclk * n * 100) / (p * r);
  628. }
  629. static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
  630. uint32_t dpll)
  631. {
  632. uint32_t cfgcr1_reg, cfgcr2_reg;
  633. uint32_t cfgcr1_val, cfgcr2_val;
  634. uint32_t p0, p1, p2, dco_freq;
  635. cfgcr1_reg = GET_CFG_CR1_REG(dpll);
  636. cfgcr2_reg = GET_CFG_CR2_REG(dpll);
  637. cfgcr1_val = I915_READ(cfgcr1_reg);
  638. cfgcr2_val = I915_READ(cfgcr2_reg);
  639. p0 = cfgcr2_val & DPLL_CFGCR2_PDIV_MASK;
  640. p2 = cfgcr2_val & DPLL_CFGCR2_KDIV_MASK;
  641. if (cfgcr2_val & DPLL_CFGCR2_QDIV_MODE(1))
  642. p1 = (cfgcr2_val & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
  643. else
  644. p1 = 1;
  645. switch (p0) {
  646. case DPLL_CFGCR2_PDIV_1:
  647. p0 = 1;
  648. break;
  649. case DPLL_CFGCR2_PDIV_2:
  650. p0 = 2;
  651. break;
  652. case DPLL_CFGCR2_PDIV_3:
  653. p0 = 3;
  654. break;
  655. case DPLL_CFGCR2_PDIV_7:
  656. p0 = 7;
  657. break;
  658. }
  659. switch (p2) {
  660. case DPLL_CFGCR2_KDIV_5:
  661. p2 = 5;
  662. break;
  663. case DPLL_CFGCR2_KDIV_2:
  664. p2 = 2;
  665. break;
  666. case DPLL_CFGCR2_KDIV_3:
  667. p2 = 3;
  668. break;
  669. case DPLL_CFGCR2_KDIV_1:
  670. p2 = 1;
  671. break;
  672. }
  673. dco_freq = (cfgcr1_val & DPLL_CFGCR1_DCO_INTEGER_MASK) * 24 * 1000;
  674. dco_freq += (((cfgcr1_val & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) * 24 *
  675. 1000) / 0x8000;
  676. return dco_freq / (p0 * p1 * p2 * 5);
  677. }
  678. static void skl_ddi_clock_get(struct intel_encoder *encoder,
  679. struct intel_crtc_state *pipe_config)
  680. {
  681. struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
  682. int link_clock = 0;
  683. uint32_t dpll_ctl1, dpll;
  684. dpll = pipe_config->ddi_pll_sel;
  685. dpll_ctl1 = I915_READ(DPLL_CTRL1);
  686. if (dpll_ctl1 & DPLL_CTRL1_HDMI_MODE(dpll)) {
  687. link_clock = skl_calc_wrpll_link(dev_priv, dpll);
  688. } else {
  689. link_clock = dpll_ctl1 & DPLL_CRTL1_LINK_RATE_MASK(dpll);
  690. link_clock >>= DPLL_CRTL1_LINK_RATE_SHIFT(dpll);
  691. switch (link_clock) {
  692. case DPLL_CRTL1_LINK_RATE_810:
  693. link_clock = 81000;
  694. break;
  695. case DPLL_CRTL1_LINK_RATE_1080:
  696. link_clock = 108000;
  697. break;
  698. case DPLL_CRTL1_LINK_RATE_1350:
  699. link_clock = 135000;
  700. break;
  701. case DPLL_CRTL1_LINK_RATE_1620:
  702. link_clock = 162000;
  703. break;
  704. case DPLL_CRTL1_LINK_RATE_2160:
  705. link_clock = 216000;
  706. break;
  707. case DPLL_CRTL1_LINK_RATE_2700:
  708. link_clock = 270000;
  709. break;
  710. default:
  711. WARN(1, "Unsupported link rate\n");
  712. break;
  713. }
  714. link_clock *= 2;
  715. }
  716. pipe_config->port_clock = link_clock;
  717. if (pipe_config->has_dp_encoder)
  718. pipe_config->base.adjusted_mode.crtc_clock =
  719. intel_dotclock_calculate(pipe_config->port_clock,
  720. &pipe_config->dp_m_n);
  721. else
  722. pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
  723. }
  724. static void hsw_ddi_clock_get(struct intel_encoder *encoder,
  725. struct intel_crtc_state *pipe_config)
  726. {
  727. struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
  728. int link_clock = 0;
  729. u32 val, pll;
  730. val = pipe_config->ddi_pll_sel;
  731. switch (val & PORT_CLK_SEL_MASK) {
  732. case PORT_CLK_SEL_LCPLL_810:
  733. link_clock = 81000;
  734. break;
  735. case PORT_CLK_SEL_LCPLL_1350:
  736. link_clock = 135000;
  737. break;
  738. case PORT_CLK_SEL_LCPLL_2700:
  739. link_clock = 270000;
  740. break;
  741. case PORT_CLK_SEL_WRPLL1:
  742. link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL1);
  743. break;
  744. case PORT_CLK_SEL_WRPLL2:
  745. link_clock = intel_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL2);
  746. break;
  747. case PORT_CLK_SEL_SPLL:
  748. pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
  749. if (pll == SPLL_PLL_FREQ_810MHz)
  750. link_clock = 81000;
  751. else if (pll == SPLL_PLL_FREQ_1350MHz)
  752. link_clock = 135000;
  753. else if (pll == SPLL_PLL_FREQ_2700MHz)
  754. link_clock = 270000;
  755. else {
  756. WARN(1, "bad spll freq\n");
  757. return;
  758. }
  759. break;
  760. default:
  761. WARN(1, "bad port clock sel\n");
  762. return;
  763. }
  764. pipe_config->port_clock = link_clock * 2;
  765. if (pipe_config->has_pch_encoder)
  766. pipe_config->base.adjusted_mode.crtc_clock =
  767. intel_dotclock_calculate(pipe_config->port_clock,
  768. &pipe_config->fdi_m_n);
  769. else if (pipe_config->has_dp_encoder)
  770. pipe_config->base.adjusted_mode.crtc_clock =
  771. intel_dotclock_calculate(pipe_config->port_clock,
  772. &pipe_config->dp_m_n);
  773. else
  774. pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
  775. }
  776. void intel_ddi_clock_get(struct intel_encoder *encoder,
  777. struct intel_crtc_state *pipe_config)
  778. {
  779. struct drm_device *dev = encoder->base.dev;
  780. if (INTEL_INFO(dev)->gen <= 8)
  781. hsw_ddi_clock_get(encoder, pipe_config);
  782. else
  783. skl_ddi_clock_get(encoder, pipe_config);
  784. }
  785. static void
  786. hsw_ddi_calculate_wrpll(int clock /* in Hz */,
  787. unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
  788. {
  789. uint64_t freq2k;
  790. unsigned p, n2, r2;
  791. struct wrpll_rnp best = { 0, 0, 0 };
  792. unsigned budget;
  793. freq2k = clock / 100;
  794. budget = wrpll_get_budget_for_freq(clock);
  795. /* Special case handling for 540 pixel clock: bypass WR PLL entirely
  796. * and directly pass the LC PLL to it. */
  797. if (freq2k == 5400000) {
  798. *n2_out = 2;
  799. *p_out = 1;
  800. *r2_out = 2;
  801. return;
  802. }
  803. /*
  804. * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
  805. * the WR PLL.
  806. *
  807. * We want R so that REF_MIN <= Ref <= REF_MAX.
  808. * Injecting R2 = 2 * R gives:
  809. * REF_MAX * r2 > LC_FREQ * 2 and
  810. * REF_MIN * r2 < LC_FREQ * 2
  811. *
  812. * Which means the desired boundaries for r2 are:
  813. * LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
  814. *
  815. */
  816. for (r2 = LC_FREQ * 2 / REF_MAX + 1;
  817. r2 <= LC_FREQ * 2 / REF_MIN;
  818. r2++) {
  819. /*
  820. * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
  821. *
  822. * Once again we want VCO_MIN <= VCO <= VCO_MAX.
  823. * Injecting R2 = 2 * R and N2 = 2 * N, we get:
  824. * VCO_MAX * r2 > n2 * LC_FREQ and
  825. * VCO_MIN * r2 < n2 * LC_FREQ)
  826. *
  827. * Which means the desired boundaries for n2 are:
  828. * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
  829. */
  830. for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
  831. n2 <= VCO_MAX * r2 / LC_FREQ;
  832. n2++) {
  833. for (p = P_MIN; p <= P_MAX; p += P_INC)
  834. wrpll_update_rnp(freq2k, budget,
  835. r2, n2, p, &best);
  836. }
  837. }
  838. *n2_out = best.n2;
  839. *p_out = best.p;
  840. *r2_out = best.r2;
  841. }
  842. static bool
  843. hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
  844. struct intel_crtc_state *crtc_state,
  845. struct intel_encoder *intel_encoder,
  846. int clock)
  847. {
  848. if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
  849. struct intel_shared_dpll *pll;
  850. uint32_t val;
  851. unsigned p, n2, r2;
  852. hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
  853. val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
  854. WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
  855. WRPLL_DIVIDER_POST(p);
  856. crtc_state->dpll_hw_state.wrpll = val;
  857. pll = intel_get_shared_dpll(intel_crtc, crtc_state);
  858. if (pll == NULL) {
  859. DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
  860. pipe_name(intel_crtc->pipe));
  861. return false;
  862. }
  863. crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
  864. }
  865. return true;
  866. }
  867. struct skl_wrpll_params {
  868. uint32_t dco_fraction;
  869. uint32_t dco_integer;
  870. uint32_t qdiv_ratio;
  871. uint32_t qdiv_mode;
  872. uint32_t kdiv;
  873. uint32_t pdiv;
  874. uint32_t central_freq;
  875. };
  876. static void
  877. skl_ddi_calculate_wrpll(int clock /* in Hz */,
  878. struct skl_wrpll_params *wrpll_params)
  879. {
  880. uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
  881. uint64_t dco_central_freq[3] = {8400000000ULL,
  882. 9000000000ULL,
  883. 9600000000ULL};
  884. uint32_t min_dco_deviation = 400;
  885. uint32_t min_dco_index = 3;
  886. uint32_t P0[4] = {1, 2, 3, 7};
  887. uint32_t P2[4] = {1, 2, 3, 5};
  888. bool found = false;
  889. uint32_t candidate_p = 0;
  890. uint32_t candidate_p0[3] = {0}, candidate_p1[3] = {0};
  891. uint32_t candidate_p2[3] = {0};
  892. uint32_t dco_central_freq_deviation[3];
  893. uint32_t i, P1, k, dco_count;
  894. bool retry_with_odd = false;
  895. uint64_t dco_freq;
  896. /* Determine P0, P1 or P2 */
  897. for (dco_count = 0; dco_count < 3; dco_count++) {
  898. found = false;
  899. candidate_p =
  900. div64_u64(dco_central_freq[dco_count], afe_clock);
  901. if (retry_with_odd == false)
  902. candidate_p = (candidate_p % 2 == 0 ?
  903. candidate_p : candidate_p + 1);
  904. for (P1 = 1; P1 < candidate_p; P1++) {
  905. for (i = 0; i < 4; i++) {
  906. if (!(P0[i] != 1 || P1 == 1))
  907. continue;
  908. for (k = 0; k < 4; k++) {
  909. if (P1 != 1 && P2[k] != 2)
  910. continue;
  911. if (candidate_p == P0[i] * P1 * P2[k]) {
  912. /* Found possible P0, P1, P2 */
  913. found = true;
  914. candidate_p0[dco_count] = P0[i];
  915. candidate_p1[dco_count] = P1;
  916. candidate_p2[dco_count] = P2[k];
  917. goto found;
  918. }
  919. }
  920. }
  921. }
  922. found:
  923. if (found) {
  924. dco_central_freq_deviation[dco_count] =
  925. div64_u64(10000 *
  926. abs_diff((candidate_p * afe_clock),
  927. dco_central_freq[dco_count]),
  928. dco_central_freq[dco_count]);
  929. if (dco_central_freq_deviation[dco_count] <
  930. min_dco_deviation) {
  931. min_dco_deviation =
  932. dco_central_freq_deviation[dco_count];
  933. min_dco_index = dco_count;
  934. }
  935. }
  936. if (min_dco_index > 2 && dco_count == 2) {
  937. retry_with_odd = true;
  938. dco_count = 0;
  939. }
  940. }
  941. if (min_dco_index > 2) {
  942. WARN(1, "No valid values found for the given pixel clock\n");
  943. } else {
  944. wrpll_params->central_freq = dco_central_freq[min_dco_index];
  945. switch (dco_central_freq[min_dco_index]) {
  946. case 9600000000ULL:
  947. wrpll_params->central_freq = 0;
  948. break;
  949. case 9000000000ULL:
  950. wrpll_params->central_freq = 1;
  951. break;
  952. case 8400000000ULL:
  953. wrpll_params->central_freq = 3;
  954. }
  955. switch (candidate_p0[min_dco_index]) {
  956. case 1:
  957. wrpll_params->pdiv = 0;
  958. break;
  959. case 2:
  960. wrpll_params->pdiv = 1;
  961. break;
  962. case 3:
  963. wrpll_params->pdiv = 2;
  964. break;
  965. case 7:
  966. wrpll_params->pdiv = 4;
  967. break;
  968. default:
  969. WARN(1, "Incorrect PDiv\n");
  970. }
  971. switch (candidate_p2[min_dco_index]) {
  972. case 5:
  973. wrpll_params->kdiv = 0;
  974. break;
  975. case 2:
  976. wrpll_params->kdiv = 1;
  977. break;
  978. case 3:
  979. wrpll_params->kdiv = 2;
  980. break;
  981. case 1:
  982. wrpll_params->kdiv = 3;
  983. break;
  984. default:
  985. WARN(1, "Incorrect KDiv\n");
  986. }
  987. wrpll_params->qdiv_ratio = candidate_p1[min_dco_index];
  988. wrpll_params->qdiv_mode =
  989. (wrpll_params->qdiv_ratio == 1) ? 0 : 1;
  990. dco_freq = candidate_p0[min_dco_index] *
  991. candidate_p1[min_dco_index] *
  992. candidate_p2[min_dco_index] * afe_clock;
  993. /*
  994. * Intermediate values are in Hz.
  995. * Divide by MHz to match bsepc
  996. */
  997. wrpll_params->dco_integer = div_u64(dco_freq, (24 * MHz(1)));
  998. wrpll_params->dco_fraction =
  999. div_u64(((div_u64(dco_freq, 24) -
  1000. wrpll_params->dco_integer * MHz(1)) * 0x8000), MHz(1));
  1001. }
  1002. }
  1003. static bool
  1004. skl_ddi_pll_select(struct intel_crtc *intel_crtc,
  1005. struct intel_crtc_state *crtc_state,
  1006. struct intel_encoder *intel_encoder,
  1007. int clock)
  1008. {
  1009. struct intel_shared_dpll *pll;
  1010. uint32_t ctrl1, cfgcr1, cfgcr2;
  1011. /*
  1012. * See comment in intel_dpll_hw_state to understand why we always use 0
  1013. * as the DPLL id in this function.
  1014. */
  1015. ctrl1 = DPLL_CTRL1_OVERRIDE(0);
  1016. if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
  1017. struct skl_wrpll_params wrpll_params = { 0, };
  1018. ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
  1019. skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params);
  1020. cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
  1021. DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
  1022. wrpll_params.dco_integer;
  1023. cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
  1024. DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
  1025. DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
  1026. DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
  1027. wrpll_params.central_freq;
  1028. } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT) {
  1029. struct drm_encoder *encoder = &intel_encoder->base;
  1030. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1031. switch (intel_dp->link_bw) {
  1032. case DP_LINK_BW_1_62:
  1033. ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_810, 0);
  1034. break;
  1035. case DP_LINK_BW_2_7:
  1036. ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_1350, 0);
  1037. break;
  1038. case DP_LINK_BW_5_4:
  1039. ctrl1 |= DPLL_CRTL1_LINK_RATE(DPLL_CRTL1_LINK_RATE_2700, 0);
  1040. break;
  1041. }
  1042. cfgcr1 = cfgcr2 = 0;
  1043. } else /* eDP */
  1044. return true;
  1045. crtc_state->dpll_hw_state.ctrl1 = ctrl1;
  1046. crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
  1047. crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
  1048. pll = intel_get_shared_dpll(intel_crtc, crtc_state);
  1049. if (pll == NULL) {
  1050. DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
  1051. pipe_name(intel_crtc->pipe));
  1052. return false;
  1053. }
  1054. /* shared DPLL id 0 is DPLL 1 */
  1055. crtc_state->ddi_pll_sel = pll->id + 1;
  1056. return true;
  1057. }
  1058. /*
  1059. * Tries to find a *shared* PLL for the CRTC and store it in
  1060. * intel_crtc->ddi_pll_sel.
  1061. *
  1062. * For private DPLLs, compute_config() should do the selection for us. This
  1063. * function should be folded into compute_config() eventually.
  1064. */
  1065. bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
  1066. struct intel_crtc_state *crtc_state)
  1067. {
  1068. struct drm_device *dev = intel_crtc->base.dev;
  1069. struct intel_encoder *intel_encoder =
  1070. intel_ddi_get_crtc_new_encoder(crtc_state);
  1071. int clock = crtc_state->port_clock;
  1072. if (IS_SKYLAKE(dev))
  1073. return skl_ddi_pll_select(intel_crtc, crtc_state,
  1074. intel_encoder, clock);
  1075. else
  1076. return hsw_ddi_pll_select(intel_crtc, crtc_state,
  1077. intel_encoder, clock);
  1078. }
  1079. void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
  1080. {
  1081. struct drm_i915_private *dev_priv = crtc->dev->dev_private;
  1082. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1083. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  1084. enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
  1085. int type = intel_encoder->type;
  1086. uint32_t temp;
  1087. if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
  1088. temp = TRANS_MSA_SYNC_CLK;
  1089. switch (intel_crtc->config->pipe_bpp) {
  1090. case 18:
  1091. temp |= TRANS_MSA_6_BPC;
  1092. break;
  1093. case 24:
  1094. temp |= TRANS_MSA_8_BPC;
  1095. break;
  1096. case 30:
  1097. temp |= TRANS_MSA_10_BPC;
  1098. break;
  1099. case 36:
  1100. temp |= TRANS_MSA_12_BPC;
  1101. break;
  1102. default:
  1103. BUG();
  1104. }
  1105. I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
  1106. }
  1107. }
  1108. void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
  1109. {
  1110. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1111. struct drm_device *dev = crtc->dev;
  1112. struct drm_i915_private *dev_priv = dev->dev_private;
  1113. enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
  1114. uint32_t temp;
  1115. temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
  1116. if (state == true)
  1117. temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
  1118. else
  1119. temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
  1120. I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
  1121. }
  1122. void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
  1123. {
  1124. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1125. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  1126. struct drm_encoder *encoder = &intel_encoder->base;
  1127. struct drm_device *dev = crtc->dev;
  1128. struct drm_i915_private *dev_priv = dev->dev_private;
  1129. enum pipe pipe = intel_crtc->pipe;
  1130. enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
  1131. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1132. int type = intel_encoder->type;
  1133. uint32_t temp;
  1134. /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
  1135. temp = TRANS_DDI_FUNC_ENABLE;
  1136. temp |= TRANS_DDI_SELECT_PORT(port);
  1137. switch (intel_crtc->config->pipe_bpp) {
  1138. case 18:
  1139. temp |= TRANS_DDI_BPC_6;
  1140. break;
  1141. case 24:
  1142. temp |= TRANS_DDI_BPC_8;
  1143. break;
  1144. case 30:
  1145. temp |= TRANS_DDI_BPC_10;
  1146. break;
  1147. case 36:
  1148. temp |= TRANS_DDI_BPC_12;
  1149. break;
  1150. default:
  1151. BUG();
  1152. }
  1153. if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
  1154. temp |= TRANS_DDI_PVSYNC;
  1155. if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
  1156. temp |= TRANS_DDI_PHSYNC;
  1157. if (cpu_transcoder == TRANSCODER_EDP) {
  1158. switch (pipe) {
  1159. case PIPE_A:
  1160. /* On Haswell, can only use the always-on power well for
  1161. * eDP when not using the panel fitter, and when not
  1162. * using motion blur mitigation (which we don't
  1163. * support). */
  1164. if (IS_HASWELL(dev) &&
  1165. (intel_crtc->config->pch_pfit.enabled ||
  1166. intel_crtc->config->pch_pfit.force_thru))
  1167. temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
  1168. else
  1169. temp |= TRANS_DDI_EDP_INPUT_A_ON;
  1170. break;
  1171. case PIPE_B:
  1172. temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
  1173. break;
  1174. case PIPE_C:
  1175. temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
  1176. break;
  1177. default:
  1178. BUG();
  1179. break;
  1180. }
  1181. }
  1182. if (type == INTEL_OUTPUT_HDMI) {
  1183. if (intel_crtc->config->has_hdmi_sink)
  1184. temp |= TRANS_DDI_MODE_SELECT_HDMI;
  1185. else
  1186. temp |= TRANS_DDI_MODE_SELECT_DVI;
  1187. } else if (type == INTEL_OUTPUT_ANALOG) {
  1188. temp |= TRANS_DDI_MODE_SELECT_FDI;
  1189. temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
  1190. } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
  1191. type == INTEL_OUTPUT_EDP) {
  1192. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1193. if (intel_dp->is_mst) {
  1194. temp |= TRANS_DDI_MODE_SELECT_DP_MST;
  1195. } else
  1196. temp |= TRANS_DDI_MODE_SELECT_DP_SST;
  1197. temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
  1198. } else if (type == INTEL_OUTPUT_DP_MST) {
  1199. struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;
  1200. if (intel_dp->is_mst) {
  1201. temp |= TRANS_DDI_MODE_SELECT_DP_MST;
  1202. } else
  1203. temp |= TRANS_DDI_MODE_SELECT_DP_SST;
  1204. temp |= DDI_PORT_WIDTH(intel_dp->lane_count);
  1205. } else {
  1206. WARN(1, "Invalid encoder type %d for pipe %c\n",
  1207. intel_encoder->type, pipe_name(pipe));
  1208. }
  1209. I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
  1210. }
  1211. void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
  1212. enum transcoder cpu_transcoder)
  1213. {
  1214. uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
  1215. uint32_t val = I915_READ(reg);
  1216. val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
  1217. val |= TRANS_DDI_PORT_NONE;
  1218. I915_WRITE(reg, val);
  1219. }
  1220. bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
  1221. {
  1222. struct drm_device *dev = intel_connector->base.dev;
  1223. struct drm_i915_private *dev_priv = dev->dev_private;
  1224. struct intel_encoder *intel_encoder = intel_connector->encoder;
  1225. int type = intel_connector->base.connector_type;
  1226. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1227. enum pipe pipe = 0;
  1228. enum transcoder cpu_transcoder;
  1229. enum intel_display_power_domain power_domain;
  1230. uint32_t tmp;
  1231. power_domain = intel_display_port_power_domain(intel_encoder);
  1232. if (!intel_display_power_is_enabled(dev_priv, power_domain))
  1233. return false;
  1234. if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
  1235. return false;
  1236. if (port == PORT_A)
  1237. cpu_transcoder = TRANSCODER_EDP;
  1238. else
  1239. cpu_transcoder = (enum transcoder) pipe;
  1240. tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
  1241. switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
  1242. case TRANS_DDI_MODE_SELECT_HDMI:
  1243. case TRANS_DDI_MODE_SELECT_DVI:
  1244. return (type == DRM_MODE_CONNECTOR_HDMIA);
  1245. case TRANS_DDI_MODE_SELECT_DP_SST:
  1246. if (type == DRM_MODE_CONNECTOR_eDP)
  1247. return true;
  1248. return (type == DRM_MODE_CONNECTOR_DisplayPort);
  1249. case TRANS_DDI_MODE_SELECT_DP_MST:
  1250. /* if the transcoder is in MST state then
  1251. * connector isn't connected */
  1252. return false;
  1253. case TRANS_DDI_MODE_SELECT_FDI:
  1254. return (type == DRM_MODE_CONNECTOR_VGA);
  1255. default:
  1256. return false;
  1257. }
  1258. }
  1259. bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
  1260. enum pipe *pipe)
  1261. {
  1262. struct drm_device *dev = encoder->base.dev;
  1263. struct drm_i915_private *dev_priv = dev->dev_private;
  1264. enum port port = intel_ddi_get_encoder_port(encoder);
  1265. enum intel_display_power_domain power_domain;
  1266. u32 tmp;
  1267. int i;
  1268. power_domain = intel_display_port_power_domain(encoder);
  1269. if (!intel_display_power_is_enabled(dev_priv, power_domain))
  1270. return false;
  1271. tmp = I915_READ(DDI_BUF_CTL(port));
  1272. if (!(tmp & DDI_BUF_CTL_ENABLE))
  1273. return false;
  1274. if (port == PORT_A) {
  1275. tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
  1276. switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
  1277. case TRANS_DDI_EDP_INPUT_A_ON:
  1278. case TRANS_DDI_EDP_INPUT_A_ONOFF:
  1279. *pipe = PIPE_A;
  1280. break;
  1281. case TRANS_DDI_EDP_INPUT_B_ONOFF:
  1282. *pipe = PIPE_B;
  1283. break;
  1284. case TRANS_DDI_EDP_INPUT_C_ONOFF:
  1285. *pipe = PIPE_C;
  1286. break;
  1287. }
  1288. return true;
  1289. } else {
  1290. for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
  1291. tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
  1292. if ((tmp & TRANS_DDI_PORT_MASK)
  1293. == TRANS_DDI_SELECT_PORT(port)) {
  1294. if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
  1295. return false;
  1296. *pipe = i;
  1297. return true;
  1298. }
  1299. }
  1300. }
  1301. DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
  1302. return false;
  1303. }
  1304. void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
  1305. {
  1306. struct drm_crtc *crtc = &intel_crtc->base;
  1307. struct drm_i915_private *dev_priv = crtc->dev->dev_private;
  1308. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  1309. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1310. enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
  1311. if (cpu_transcoder != TRANSCODER_EDP)
  1312. I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
  1313. TRANS_CLK_SEL_PORT(port));
  1314. }
  1315. void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
  1316. {
  1317. struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
  1318. enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
  1319. if (cpu_transcoder != TRANSCODER_EDP)
  1320. I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
  1321. TRANS_CLK_SEL_DISABLED);
  1322. }
  1323. static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
  1324. {
  1325. struct drm_encoder *encoder = &intel_encoder->base;
  1326. struct drm_device *dev = encoder->dev;
  1327. struct drm_i915_private *dev_priv = dev->dev_private;
  1328. struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
  1329. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1330. int type = intel_encoder->type;
  1331. if (type == INTEL_OUTPUT_EDP) {
  1332. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1333. intel_edp_panel_on(intel_dp);
  1334. }
  1335. if (IS_SKYLAKE(dev)) {
  1336. uint32_t dpll = crtc->config->ddi_pll_sel;
  1337. uint32_t val;
  1338. /*
  1339. * DPLL0 is used for eDP and is the only "private" DPLL (as
  1340. * opposed to shared) on SKL
  1341. */
  1342. if (type == INTEL_OUTPUT_EDP) {
  1343. WARN_ON(dpll != SKL_DPLL0);
  1344. val = I915_READ(DPLL_CTRL1);
  1345. val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
  1346. DPLL_CTRL1_SSC(dpll) |
  1347. DPLL_CRTL1_LINK_RATE_MASK(dpll));
  1348. val |= crtc->config->dpll_hw_state.ctrl1 << (dpll * 6);
  1349. I915_WRITE(DPLL_CTRL1, val);
  1350. POSTING_READ(DPLL_CTRL1);
  1351. }
  1352. /* DDI -> PLL mapping */
  1353. val = I915_READ(DPLL_CTRL2);
  1354. val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) |
  1355. DPLL_CTRL2_DDI_CLK_SEL_MASK(port));
  1356. val |= (DPLL_CTRL2_DDI_CLK_SEL(dpll, port) |
  1357. DPLL_CTRL2_DDI_SEL_OVERRIDE(port));
  1358. I915_WRITE(DPLL_CTRL2, val);
  1359. } else {
  1360. WARN_ON(crtc->config->ddi_pll_sel == PORT_CLK_SEL_NONE);
  1361. I915_WRITE(PORT_CLK_SEL(port), crtc->config->ddi_pll_sel);
  1362. }
  1363. if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
  1364. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1365. intel_ddi_init_dp_buf_reg(intel_encoder);
  1366. intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
  1367. intel_dp_start_link_train(intel_dp);
  1368. intel_dp_complete_link_train(intel_dp);
  1369. if (port != PORT_A || INTEL_INFO(dev)->gen >= 9)
  1370. intel_dp_stop_link_train(intel_dp);
  1371. } else if (type == INTEL_OUTPUT_HDMI) {
  1372. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  1373. intel_hdmi->set_infoframes(encoder,
  1374. crtc->config->has_hdmi_sink,
  1375. &crtc->config->base.adjusted_mode);
  1376. }
  1377. }
  1378. static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
  1379. {
  1380. struct drm_encoder *encoder = &intel_encoder->base;
  1381. struct drm_device *dev = encoder->dev;
  1382. struct drm_i915_private *dev_priv = dev->dev_private;
  1383. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1384. int type = intel_encoder->type;
  1385. uint32_t val;
  1386. bool wait = false;
  1387. val = I915_READ(DDI_BUF_CTL(port));
  1388. if (val & DDI_BUF_CTL_ENABLE) {
  1389. val &= ~DDI_BUF_CTL_ENABLE;
  1390. I915_WRITE(DDI_BUF_CTL(port), val);
  1391. wait = true;
  1392. }
  1393. val = I915_READ(DP_TP_CTL(port));
  1394. val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
  1395. val |= DP_TP_CTL_LINK_TRAIN_PAT1;
  1396. I915_WRITE(DP_TP_CTL(port), val);
  1397. if (wait)
  1398. intel_wait_ddi_buf_idle(dev_priv, port);
  1399. if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
  1400. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1401. intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
  1402. intel_edp_panel_vdd_on(intel_dp);
  1403. intel_edp_panel_off(intel_dp);
  1404. }
  1405. if (IS_SKYLAKE(dev))
  1406. I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
  1407. DPLL_CTRL2_DDI_CLK_OFF(port)));
  1408. else
  1409. I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
  1410. }
  1411. static void intel_enable_ddi(struct intel_encoder *intel_encoder)
  1412. {
  1413. struct drm_encoder *encoder = &intel_encoder->base;
  1414. struct drm_crtc *crtc = encoder->crtc;
  1415. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1416. struct drm_device *dev = encoder->dev;
  1417. struct drm_i915_private *dev_priv = dev->dev_private;
  1418. enum port port = intel_ddi_get_encoder_port(intel_encoder);
  1419. int type = intel_encoder->type;
  1420. if (type == INTEL_OUTPUT_HDMI) {
  1421. struct intel_digital_port *intel_dig_port =
  1422. enc_to_dig_port(encoder);
  1423. /* In HDMI/DVI mode, the port width, and swing/emphasis values
  1424. * are ignored so nothing special needs to be done besides
  1425. * enabling the port.
  1426. */
  1427. I915_WRITE(DDI_BUF_CTL(port),
  1428. intel_dig_port->saved_port_bits |
  1429. DDI_BUF_CTL_ENABLE);
  1430. } else if (type == INTEL_OUTPUT_EDP) {
  1431. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1432. if (port == PORT_A && INTEL_INFO(dev)->gen < 9)
  1433. intel_dp_stop_link_train(intel_dp);
  1434. intel_edp_backlight_on(intel_dp);
  1435. intel_psr_enable(intel_dp);
  1436. intel_edp_drrs_enable(intel_dp);
  1437. }
  1438. if (intel_crtc->config->has_audio) {
  1439. intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
  1440. intel_audio_codec_enable(intel_encoder);
  1441. }
  1442. }
  1443. static void intel_disable_ddi(struct intel_encoder *intel_encoder)
  1444. {
  1445. struct drm_encoder *encoder = &intel_encoder->base;
  1446. struct drm_crtc *crtc = encoder->crtc;
  1447. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  1448. int type = intel_encoder->type;
  1449. struct drm_device *dev = encoder->dev;
  1450. struct drm_i915_private *dev_priv = dev->dev_private;
  1451. if (intel_crtc->config->has_audio) {
  1452. intel_audio_codec_disable(intel_encoder);
  1453. intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
  1454. }
  1455. if (type == INTEL_OUTPUT_EDP) {
  1456. struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
  1457. intel_edp_drrs_disable(intel_dp);
  1458. intel_psr_disable(intel_dp);
  1459. intel_edp_backlight_off(intel_dp);
  1460. }
  1461. }
  1462. static int skl_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1463. {
  1464. uint32_t lcpll1 = I915_READ(LCPLL1_CTL);
  1465. uint32_t cdctl = I915_READ(CDCLK_CTL);
  1466. uint32_t linkrate;
  1467. if (!(lcpll1 & LCPLL_PLL_ENABLE)) {
  1468. WARN(1, "LCPLL1 not enabled\n");
  1469. return 24000; /* 24MHz is the cd freq with NSSC ref */
  1470. }
  1471. if ((cdctl & CDCLK_FREQ_SEL_MASK) == CDCLK_FREQ_540)
  1472. return 540000;
  1473. linkrate = (I915_READ(DPLL_CTRL1) &
  1474. DPLL_CRTL1_LINK_RATE_MASK(SKL_DPLL0)) >> 1;
  1475. if (linkrate == DPLL_CRTL1_LINK_RATE_2160 ||
  1476. linkrate == DPLL_CRTL1_LINK_RATE_1080) {
  1477. /* vco 8640 */
  1478. switch (cdctl & CDCLK_FREQ_SEL_MASK) {
  1479. case CDCLK_FREQ_450_432:
  1480. return 432000;
  1481. case CDCLK_FREQ_337_308:
  1482. return 308570;
  1483. case CDCLK_FREQ_675_617:
  1484. return 617140;
  1485. default:
  1486. WARN(1, "Unknown cd freq selection\n");
  1487. }
  1488. } else {
  1489. /* vco 8100 */
  1490. switch (cdctl & CDCLK_FREQ_SEL_MASK) {
  1491. case CDCLK_FREQ_450_432:
  1492. return 450000;
  1493. case CDCLK_FREQ_337_308:
  1494. return 337500;
  1495. case CDCLK_FREQ_675_617:
  1496. return 675000;
  1497. default:
  1498. WARN(1, "Unknown cd freq selection\n");
  1499. }
  1500. }
  1501. /* error case, do as if DPLL0 isn't enabled */
  1502. return 24000;
  1503. }
  1504. static int bdw_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1505. {
  1506. uint32_t lcpll = I915_READ(LCPLL_CTL);
  1507. uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
  1508. if (lcpll & LCPLL_CD_SOURCE_FCLK)
  1509. return 800000;
  1510. else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
  1511. return 450000;
  1512. else if (freq == LCPLL_CLK_FREQ_450)
  1513. return 450000;
  1514. else if (freq == LCPLL_CLK_FREQ_54O_BDW)
  1515. return 540000;
  1516. else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
  1517. return 337500;
  1518. else
  1519. return 675000;
  1520. }
  1521. static int hsw_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1522. {
  1523. struct drm_device *dev = dev_priv->dev;
  1524. uint32_t lcpll = I915_READ(LCPLL_CTL);
  1525. uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
  1526. if (lcpll & LCPLL_CD_SOURCE_FCLK)
  1527. return 800000;
  1528. else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
  1529. return 450000;
  1530. else if (freq == LCPLL_CLK_FREQ_450)
  1531. return 450000;
  1532. else if (IS_HSW_ULT(dev))
  1533. return 337500;
  1534. else
  1535. return 540000;
  1536. }
  1537. int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
  1538. {
  1539. struct drm_device *dev = dev_priv->dev;
  1540. if (IS_SKYLAKE(dev))
  1541. return skl_get_cdclk_freq(dev_priv);
  1542. if (IS_BROADWELL(dev))
  1543. return bdw_get_cdclk_freq(dev_priv);
  1544. /* Haswell */
  1545. return hsw_get_cdclk_freq(dev_priv);
  1546. }
  1547. static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
  1548. struct intel_shared_dpll *pll)
  1549. {
  1550. I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
  1551. POSTING_READ(WRPLL_CTL(pll->id));
  1552. udelay(20);
  1553. }
  1554. static void hsw_ddi_pll_disable(struct drm_i915_private *dev_priv,
  1555. struct intel_shared_dpll *pll)
  1556. {
  1557. uint32_t val;
  1558. val = I915_READ(WRPLL_CTL(pll->id));
  1559. I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
  1560. POSTING_READ(WRPLL_CTL(pll->id));
  1561. }
  1562. static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
  1563. struct intel_shared_dpll *pll,
  1564. struct intel_dpll_hw_state *hw_state)
  1565. {
  1566. uint32_t val;
  1567. if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
  1568. return false;
  1569. val = I915_READ(WRPLL_CTL(pll->id));
  1570. hw_state->wrpll = val;
  1571. return val & WRPLL_PLL_ENABLE;
  1572. }
  1573. static const char * const hsw_ddi_pll_names[] = {
  1574. "WRPLL 1",
  1575. "WRPLL 2",
  1576. };
  1577. static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
  1578. {
  1579. int i;
  1580. dev_priv->num_shared_dpll = 2;
  1581. for (i = 0; i < dev_priv->num_shared_dpll; i++) {
  1582. dev_priv->shared_dplls[i].id = i;
  1583. dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
  1584. dev_priv->shared_dplls[i].disable = hsw_ddi_pll_disable;
  1585. dev_priv->shared_dplls[i].enable = hsw_ddi_pll_enable;
  1586. dev_priv->shared_dplls[i].get_hw_state =
  1587. hsw_ddi_pll_get_hw_state;
  1588. }
  1589. }
  1590. static const char * const skl_ddi_pll_names[] = {
  1591. "DPLL 1",
  1592. "DPLL 2",
  1593. "DPLL 3",
  1594. };
  1595. struct skl_dpll_regs {
  1596. u32 ctl, cfgcr1, cfgcr2;
  1597. };
  1598. /* this array is indexed by the *shared* pll id */
  1599. static const struct skl_dpll_regs skl_dpll_regs[3] = {
  1600. {
  1601. /* DPLL 1 */
  1602. .ctl = LCPLL2_CTL,
  1603. .cfgcr1 = DPLL1_CFGCR1,
  1604. .cfgcr2 = DPLL1_CFGCR2,
  1605. },
  1606. {
  1607. /* DPLL 2 */
  1608. .ctl = WRPLL_CTL1,
  1609. .cfgcr1 = DPLL2_CFGCR1,
  1610. .cfgcr2 = DPLL2_CFGCR2,
  1611. },
  1612. {
  1613. /* DPLL 3 */
  1614. .ctl = WRPLL_CTL2,
  1615. .cfgcr1 = DPLL3_CFGCR1,
  1616. .cfgcr2 = DPLL3_CFGCR2,
  1617. },
  1618. };
  1619. static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
  1620. struct intel_shared_dpll *pll)
  1621. {
  1622. uint32_t val;
  1623. unsigned int dpll;
  1624. const struct skl_dpll_regs *regs = skl_dpll_regs;
  1625. /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
  1626. dpll = pll->id + 1;
  1627. val = I915_READ(DPLL_CTRL1);
  1628. val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | DPLL_CTRL1_SSC(dpll) |
  1629. DPLL_CRTL1_LINK_RATE_MASK(dpll));
  1630. val |= pll->config.hw_state.ctrl1 << (dpll * 6);
  1631. I915_WRITE(DPLL_CTRL1, val);
  1632. POSTING_READ(DPLL_CTRL1);
  1633. I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
  1634. I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
  1635. POSTING_READ(regs[pll->id].cfgcr1);
  1636. POSTING_READ(regs[pll->id].cfgcr2);
  1637. /* the enable bit is always bit 31 */
  1638. I915_WRITE(regs[pll->id].ctl,
  1639. I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
  1640. if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(dpll), 5))
  1641. DRM_ERROR("DPLL %d not locked\n", dpll);
  1642. }
  1643. static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
  1644. struct intel_shared_dpll *pll)
  1645. {
  1646. const struct skl_dpll_regs *regs = skl_dpll_regs;
  1647. /* the enable bit is always bit 31 */
  1648. I915_WRITE(regs[pll->id].ctl,
  1649. I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
  1650. POSTING_READ(regs[pll->id].ctl);
  1651. }
  1652. static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
  1653. struct intel_shared_dpll *pll,
  1654. struct intel_dpll_hw_state *hw_state)
  1655. {
  1656. uint32_t val;
  1657. unsigned int dpll;
  1658. const struct skl_dpll_regs *regs = skl_dpll_regs;
  1659. if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
  1660. return false;
  1661. /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
  1662. dpll = pll->id + 1;
  1663. val = I915_READ(regs[pll->id].ctl);
  1664. if (!(val & LCPLL_PLL_ENABLE))
  1665. return false;
  1666. val = I915_READ(DPLL_CTRL1);
  1667. hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
  1668. /* avoid reading back stale values if HDMI mode is not enabled */
  1669. if (val & DPLL_CTRL1_HDMI_MODE(dpll)) {
  1670. hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
  1671. hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
  1672. }
  1673. return true;
  1674. }
  1675. static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
  1676. {
  1677. int i;
  1678. dev_priv->num_shared_dpll = 3;
  1679. for (i = 0; i < dev_priv->num_shared_dpll; i++) {
  1680. dev_priv->shared_dplls[i].id = i;
  1681. dev_priv->shared_dplls[i].name = skl_ddi_pll_names[i];
  1682. dev_priv->shared_dplls[i].disable = skl_ddi_pll_disable;
  1683. dev_priv->shared_dplls[i].enable = skl_ddi_pll_enable;
  1684. dev_priv->shared_dplls[i].get_hw_state =
  1685. skl_ddi_pll_get_hw_state;
  1686. }
  1687. }
  1688. void intel_ddi_pll_init(struct drm_device *dev)
  1689. {
  1690. struct drm_i915_private *dev_priv = dev->dev_private;
  1691. uint32_t val = I915_READ(LCPLL_CTL);
  1692. if (IS_SKYLAKE(dev))
  1693. skl_shared_dplls_init(dev_priv);
  1694. else
  1695. hsw_shared_dplls_init(dev_priv);
  1696. DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
  1697. intel_ddi_get_cdclk_freq(dev_priv));
  1698. if (IS_SKYLAKE(dev)) {
  1699. if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
  1700. DRM_ERROR("LCPLL1 is disabled\n");
  1701. } else {
  1702. /*
  1703. * The LCPLL register should be turned on by the BIOS. For now
  1704. * let's just check its state and print errors in case
  1705. * something is wrong. Don't even try to turn it on.
  1706. */
  1707. if (val & LCPLL_CD_SOURCE_FCLK)
  1708. DRM_ERROR("CDCLK source is not LCPLL\n");
  1709. if (val & LCPLL_PLL_DISABLE)
  1710. DRM_ERROR("LCPLL is disabled\n");
  1711. }
  1712. }
  1713. void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
  1714. {
  1715. struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
  1716. struct intel_dp *intel_dp = &intel_dig_port->dp;
  1717. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  1718. enum port port = intel_dig_port->port;
  1719. uint32_t val;
  1720. bool wait = false;
  1721. if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
  1722. val = I915_READ(DDI_BUF_CTL(port));
  1723. if (val & DDI_BUF_CTL_ENABLE) {
  1724. val &= ~DDI_BUF_CTL_ENABLE;
  1725. I915_WRITE(DDI_BUF_CTL(port), val);
  1726. wait = true;
  1727. }
  1728. val = I915_READ(DP_TP_CTL(port));
  1729. val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
  1730. val |= DP_TP_CTL_LINK_TRAIN_PAT1;
  1731. I915_WRITE(DP_TP_CTL(port), val);
  1732. POSTING_READ(DP_TP_CTL(port));
  1733. if (wait)
  1734. intel_wait_ddi_buf_idle(dev_priv, port);
  1735. }
  1736. val = DP_TP_CTL_ENABLE |
  1737. DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
  1738. if (intel_dp->is_mst)
  1739. val |= DP_TP_CTL_MODE_MST;
  1740. else {
  1741. val |= DP_TP_CTL_MODE_SST;
  1742. if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
  1743. val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
  1744. }
  1745. I915_WRITE(DP_TP_CTL(port), val);
  1746. POSTING_READ(DP_TP_CTL(port));
  1747. intel_dp->DP |= DDI_BUF_CTL_ENABLE;
  1748. I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
  1749. POSTING_READ(DDI_BUF_CTL(port));
  1750. udelay(600);
  1751. }
  1752. void intel_ddi_fdi_disable(struct drm_crtc *crtc)
  1753. {
  1754. struct drm_i915_private *dev_priv = crtc->dev->dev_private;
  1755. struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
  1756. uint32_t val;
  1757. intel_ddi_post_disable(intel_encoder);
  1758. val = I915_READ(_FDI_RXA_CTL);
  1759. val &= ~FDI_RX_ENABLE;
  1760. I915_WRITE(_FDI_RXA_CTL, val);
  1761. val = I915_READ(_FDI_RXA_MISC);
  1762. val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
  1763. val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
  1764. I915_WRITE(_FDI_RXA_MISC, val);
  1765. val = I915_READ(_FDI_RXA_CTL);
  1766. val &= ~FDI_PCDCLK;
  1767. I915_WRITE(_FDI_RXA_CTL, val);
  1768. val = I915_READ(_FDI_RXA_CTL);
  1769. val &= ~FDI_RX_PLL_ENABLE;
  1770. I915_WRITE(_FDI_RXA_CTL, val);
  1771. }
  1772. static void intel_ddi_hot_plug(struct intel_encoder *intel_encoder)
  1773. {
  1774. struct intel_digital_port *intel_dig_port = enc_to_dig_port(&intel_encoder->base);
  1775. int type = intel_dig_port->base.type;
  1776. if (type != INTEL_OUTPUT_DISPLAYPORT &&
  1777. type != INTEL_OUTPUT_EDP &&
  1778. type != INTEL_OUTPUT_UNKNOWN) {
  1779. return;
  1780. }
  1781. intel_dp_hot_plug(intel_encoder);
  1782. }
  1783. void intel_ddi_get_config(struct intel_encoder *encoder,
  1784. struct intel_crtc_state *pipe_config)
  1785. {
  1786. struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
  1787. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
  1788. enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
  1789. struct intel_hdmi *intel_hdmi;
  1790. u32 temp, flags = 0;
  1791. temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
  1792. if (temp & TRANS_DDI_PHSYNC)
  1793. flags |= DRM_MODE_FLAG_PHSYNC;
  1794. else
  1795. flags |= DRM_MODE_FLAG_NHSYNC;
  1796. if (temp & TRANS_DDI_PVSYNC)
  1797. flags |= DRM_MODE_FLAG_PVSYNC;
  1798. else
  1799. flags |= DRM_MODE_FLAG_NVSYNC;
  1800. pipe_config->base.adjusted_mode.flags |= flags;
  1801. switch (temp & TRANS_DDI_BPC_MASK) {
  1802. case TRANS_DDI_BPC_6:
  1803. pipe_config->pipe_bpp = 18;
  1804. break;
  1805. case TRANS_DDI_BPC_8:
  1806. pipe_config->pipe_bpp = 24;
  1807. break;
  1808. case TRANS_DDI_BPC_10:
  1809. pipe_config->pipe_bpp = 30;
  1810. break;
  1811. case TRANS_DDI_BPC_12:
  1812. pipe_config->pipe_bpp = 36;
  1813. break;
  1814. default:
  1815. break;
  1816. }
  1817. switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
  1818. case TRANS_DDI_MODE_SELECT_HDMI:
  1819. pipe_config->has_hdmi_sink = true;
  1820. intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  1821. if (intel_hdmi->infoframe_enabled(&encoder->base))
  1822. pipe_config->has_infoframe = true;
  1823. break;
  1824. case TRANS_DDI_MODE_SELECT_DVI:
  1825. case TRANS_DDI_MODE_SELECT_FDI:
  1826. break;
  1827. case TRANS_DDI_MODE_SELECT_DP_SST:
  1828. case TRANS_DDI_MODE_SELECT_DP_MST:
  1829. pipe_config->has_dp_encoder = true;
  1830. intel_dp_get_m_n(intel_crtc, pipe_config);
  1831. break;
  1832. default:
  1833. break;
  1834. }
  1835. if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
  1836. temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
  1837. if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
  1838. pipe_config->has_audio = true;
  1839. }
  1840. if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
  1841. pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
  1842. /*
  1843. * This is a big fat ugly hack.
  1844. *
  1845. * Some machines in UEFI boot mode provide us a VBT that has 18
  1846. * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
  1847. * unknown we fail to light up. Yet the same BIOS boots up with
  1848. * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
  1849. * max, not what it tells us to use.
  1850. *
  1851. * Note: This will still be broken if the eDP panel is not lit
  1852. * up by the BIOS, and thus we can't get the mode at module
  1853. * load.
  1854. */
  1855. DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
  1856. pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
  1857. dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
  1858. }
  1859. intel_ddi_clock_get(encoder, pipe_config);
  1860. }
  1861. static void intel_ddi_destroy(struct drm_encoder *encoder)
  1862. {
  1863. /* HDMI has nothing special to destroy, so we can go with this. */
  1864. intel_dp_encoder_destroy(encoder);
  1865. }
  1866. static bool intel_ddi_compute_config(struct intel_encoder *encoder,
  1867. struct intel_crtc_state *pipe_config)
  1868. {
  1869. int type = encoder->type;
  1870. int port = intel_ddi_get_encoder_port(encoder);
  1871. WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
  1872. if (port == PORT_A)
  1873. pipe_config->cpu_transcoder = TRANSCODER_EDP;
  1874. if (type == INTEL_OUTPUT_HDMI)
  1875. return intel_hdmi_compute_config(encoder, pipe_config);
  1876. else
  1877. return intel_dp_compute_config(encoder, pipe_config);
  1878. }
  1879. static const struct drm_encoder_funcs intel_ddi_funcs = {
  1880. .destroy = intel_ddi_destroy,
  1881. };
  1882. static struct intel_connector *
  1883. intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
  1884. {
  1885. struct intel_connector *connector;
  1886. enum port port = intel_dig_port->port;
  1887. connector = intel_connector_alloc();
  1888. if (!connector)
  1889. return NULL;
  1890. intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
  1891. if (!intel_dp_init_connector(intel_dig_port, connector)) {
  1892. kfree(connector);
  1893. return NULL;
  1894. }
  1895. return connector;
  1896. }
  1897. static struct intel_connector *
  1898. intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
  1899. {
  1900. struct intel_connector *connector;
  1901. enum port port = intel_dig_port->port;
  1902. connector = intel_connector_alloc();
  1903. if (!connector)
  1904. return NULL;
  1905. intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
  1906. intel_hdmi_init_connector(intel_dig_port, connector);
  1907. return connector;
  1908. }
  1909. void intel_ddi_init(struct drm_device *dev, enum port port)
  1910. {
  1911. struct drm_i915_private *dev_priv = dev->dev_private;
  1912. struct intel_digital_port *intel_dig_port;
  1913. struct intel_encoder *intel_encoder;
  1914. struct drm_encoder *encoder;
  1915. bool init_hdmi, init_dp;
  1916. init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
  1917. dev_priv->vbt.ddi_port_info[port].supports_hdmi);
  1918. init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
  1919. if (!init_dp && !init_hdmi) {
  1920. DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, assuming it is\n",
  1921. port_name(port));
  1922. init_hdmi = true;
  1923. init_dp = true;
  1924. }
  1925. intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
  1926. if (!intel_dig_port)
  1927. return;
  1928. intel_encoder = &intel_dig_port->base;
  1929. encoder = &intel_encoder->base;
  1930. drm_encoder_init(dev, encoder, &intel_ddi_funcs,
  1931. DRM_MODE_ENCODER_TMDS);
  1932. intel_encoder->compute_config = intel_ddi_compute_config;
  1933. intel_encoder->enable = intel_enable_ddi;
  1934. intel_encoder->pre_enable = intel_ddi_pre_enable;
  1935. intel_encoder->disable = intel_disable_ddi;
  1936. intel_encoder->post_disable = intel_ddi_post_disable;
  1937. intel_encoder->get_hw_state = intel_ddi_get_hw_state;
  1938. intel_encoder->get_config = intel_ddi_get_config;
  1939. intel_dig_port->port = port;
  1940. intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
  1941. (DDI_BUF_PORT_REVERSAL |
  1942. DDI_A_4_LANES);
  1943. intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
  1944. intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
  1945. intel_encoder->cloneable = 0;
  1946. intel_encoder->hot_plug = intel_ddi_hot_plug;
  1947. if (init_dp) {
  1948. if (!intel_ddi_init_dp_connector(intel_dig_port))
  1949. goto err;
  1950. intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
  1951. dev_priv->hpd_irq_port[port] = intel_dig_port;
  1952. }
  1953. /* In theory we don't need the encoder->type check, but leave it just in
  1954. * case we have some really bad VBTs... */
  1955. if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
  1956. if (!intel_ddi_init_hdmi_connector(intel_dig_port))
  1957. goto err;
  1958. }
  1959. return;
  1960. err:
  1961. drm_encoder_cleanup(encoder);
  1962. kfree(intel_dig_port);
  1963. }