intel_hdmi.c 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806
  1. /*
  2. * Copyright 2006 Dave Airlie <airlied@linux.ie>
  3. * Copyright © 2006-2009 Intel Corporation
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice (including the next
  13. * paragraph) shall be included in all copies or substantial portions of the
  14. * Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  21. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  22. * DEALINGS IN THE SOFTWARE.
  23. *
  24. * Authors:
  25. * Eric Anholt <eric@anholt.net>
  26. * Jesse Barnes <jesse.barnes@intel.com>
  27. */
  28. #include <linux/i2c.h>
  29. #include <linux/slab.h>
  30. #include <linux/delay.h>
  31. #include <linux/hdmi.h>
  32. #include <drm/drmP.h>
  33. #include <drm/drm_atomic_helper.h>
  34. #include <drm/drm_crtc.h>
  35. #include <drm/drm_edid.h>
  36. #include "intel_drv.h"
  37. #include <drm/i915_drm.h>
  38. #include "i915_drv.h"
  39. static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
  40. {
  41. return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
  42. }
  43. static void
  44. assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
  45. {
  46. struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
  47. struct drm_i915_private *dev_priv = dev->dev_private;
  48. uint32_t enabled_bits;
  49. enabled_bits = HAS_DDI(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
  50. WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
  51. "HDMI port enabled, expecting disabled\n");
  52. }
  53. struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
  54. {
  55. struct intel_digital_port *intel_dig_port =
  56. container_of(encoder, struct intel_digital_port, base.base);
  57. return &intel_dig_port->hdmi;
  58. }
  59. static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
  60. {
  61. return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
  62. }
  63. static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
  64. {
  65. switch (type) {
  66. case HDMI_INFOFRAME_TYPE_AVI:
  67. return VIDEO_DIP_SELECT_AVI;
  68. case HDMI_INFOFRAME_TYPE_SPD:
  69. return VIDEO_DIP_SELECT_SPD;
  70. case HDMI_INFOFRAME_TYPE_VENDOR:
  71. return VIDEO_DIP_SELECT_VENDOR;
  72. default:
  73. DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
  74. return 0;
  75. }
  76. }
  77. static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
  78. {
  79. switch (type) {
  80. case HDMI_INFOFRAME_TYPE_AVI:
  81. return VIDEO_DIP_ENABLE_AVI;
  82. case HDMI_INFOFRAME_TYPE_SPD:
  83. return VIDEO_DIP_ENABLE_SPD;
  84. case HDMI_INFOFRAME_TYPE_VENDOR:
  85. return VIDEO_DIP_ENABLE_VENDOR;
  86. default:
  87. DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
  88. return 0;
  89. }
  90. }
  91. static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
  92. {
  93. switch (type) {
  94. case HDMI_INFOFRAME_TYPE_AVI:
  95. return VIDEO_DIP_ENABLE_AVI_HSW;
  96. case HDMI_INFOFRAME_TYPE_SPD:
  97. return VIDEO_DIP_ENABLE_SPD_HSW;
  98. case HDMI_INFOFRAME_TYPE_VENDOR:
  99. return VIDEO_DIP_ENABLE_VS_HSW;
  100. default:
  101. DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
  102. return 0;
  103. }
  104. }
  105. static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type type,
  106. enum transcoder cpu_transcoder,
  107. struct drm_i915_private *dev_priv)
  108. {
  109. switch (type) {
  110. case HDMI_INFOFRAME_TYPE_AVI:
  111. return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
  112. case HDMI_INFOFRAME_TYPE_SPD:
  113. return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
  114. case HDMI_INFOFRAME_TYPE_VENDOR:
  115. return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
  116. default:
  117. DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
  118. return 0;
  119. }
  120. }
  121. static void g4x_write_infoframe(struct drm_encoder *encoder,
  122. enum hdmi_infoframe_type type,
  123. const void *frame, ssize_t len)
  124. {
  125. const uint32_t *data = frame;
  126. struct drm_device *dev = encoder->dev;
  127. struct drm_i915_private *dev_priv = dev->dev_private;
  128. u32 val = I915_READ(VIDEO_DIP_CTL);
  129. int i;
  130. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  131. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  132. val |= g4x_infoframe_index(type);
  133. val &= ~g4x_infoframe_enable(type);
  134. I915_WRITE(VIDEO_DIP_CTL, val);
  135. mmiowb();
  136. for (i = 0; i < len; i += 4) {
  137. I915_WRITE(VIDEO_DIP_DATA, *data);
  138. data++;
  139. }
  140. /* Write every possible data byte to force correct ECC calculation. */
  141. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  142. I915_WRITE(VIDEO_DIP_DATA, 0);
  143. mmiowb();
  144. val |= g4x_infoframe_enable(type);
  145. val &= ~VIDEO_DIP_FREQ_MASK;
  146. val |= VIDEO_DIP_FREQ_VSYNC;
  147. I915_WRITE(VIDEO_DIP_CTL, val);
  148. POSTING_READ(VIDEO_DIP_CTL);
  149. }
  150. static bool g4x_infoframe_enabled(struct drm_encoder *encoder)
  151. {
  152. struct drm_device *dev = encoder->dev;
  153. struct drm_i915_private *dev_priv = dev->dev_private;
  154. struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
  155. u32 val = I915_READ(VIDEO_DIP_CTL);
  156. if (VIDEO_DIP_PORT(intel_dig_port->port) == (val & VIDEO_DIP_PORT_MASK))
  157. return val & VIDEO_DIP_ENABLE;
  158. return false;
  159. }
  160. static void ibx_write_infoframe(struct drm_encoder *encoder,
  161. enum hdmi_infoframe_type type,
  162. const void *frame, ssize_t len)
  163. {
  164. const uint32_t *data = frame;
  165. struct drm_device *dev = encoder->dev;
  166. struct drm_i915_private *dev_priv = dev->dev_private;
  167. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  168. int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  169. u32 val = I915_READ(reg);
  170. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  171. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  172. val |= g4x_infoframe_index(type);
  173. val &= ~g4x_infoframe_enable(type);
  174. I915_WRITE(reg, val);
  175. mmiowb();
  176. for (i = 0; i < len; i += 4) {
  177. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
  178. data++;
  179. }
  180. /* Write every possible data byte to force correct ECC calculation. */
  181. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  182. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
  183. mmiowb();
  184. val |= g4x_infoframe_enable(type);
  185. val &= ~VIDEO_DIP_FREQ_MASK;
  186. val |= VIDEO_DIP_FREQ_VSYNC;
  187. I915_WRITE(reg, val);
  188. POSTING_READ(reg);
  189. }
  190. static bool ibx_infoframe_enabled(struct drm_encoder *encoder)
  191. {
  192. struct drm_device *dev = encoder->dev;
  193. struct drm_i915_private *dev_priv = dev->dev_private;
  194. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  195. int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  196. u32 val = I915_READ(reg);
  197. return val & VIDEO_DIP_ENABLE;
  198. }
  199. static void cpt_write_infoframe(struct drm_encoder *encoder,
  200. enum hdmi_infoframe_type type,
  201. const void *frame, ssize_t len)
  202. {
  203. const uint32_t *data = frame;
  204. struct drm_device *dev = encoder->dev;
  205. struct drm_i915_private *dev_priv = dev->dev_private;
  206. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  207. int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  208. u32 val = I915_READ(reg);
  209. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  210. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  211. val |= g4x_infoframe_index(type);
  212. /* The DIP control register spec says that we need to update the AVI
  213. * infoframe without clearing its enable bit */
  214. if (type != HDMI_INFOFRAME_TYPE_AVI)
  215. val &= ~g4x_infoframe_enable(type);
  216. I915_WRITE(reg, val);
  217. mmiowb();
  218. for (i = 0; i < len; i += 4) {
  219. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
  220. data++;
  221. }
  222. /* Write every possible data byte to force correct ECC calculation. */
  223. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  224. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
  225. mmiowb();
  226. val |= g4x_infoframe_enable(type);
  227. val &= ~VIDEO_DIP_FREQ_MASK;
  228. val |= VIDEO_DIP_FREQ_VSYNC;
  229. I915_WRITE(reg, val);
  230. POSTING_READ(reg);
  231. }
  232. static bool cpt_infoframe_enabled(struct drm_encoder *encoder)
  233. {
  234. struct drm_device *dev = encoder->dev;
  235. struct drm_i915_private *dev_priv = dev->dev_private;
  236. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  237. int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  238. u32 val = I915_READ(reg);
  239. return val & VIDEO_DIP_ENABLE;
  240. }
  241. static void vlv_write_infoframe(struct drm_encoder *encoder,
  242. enum hdmi_infoframe_type type,
  243. const void *frame, ssize_t len)
  244. {
  245. const uint32_t *data = frame;
  246. struct drm_device *dev = encoder->dev;
  247. struct drm_i915_private *dev_priv = dev->dev_private;
  248. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  249. int i, reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
  250. u32 val = I915_READ(reg);
  251. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  252. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  253. val |= g4x_infoframe_index(type);
  254. val &= ~g4x_infoframe_enable(type);
  255. I915_WRITE(reg, val);
  256. mmiowb();
  257. for (i = 0; i < len; i += 4) {
  258. I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
  259. data++;
  260. }
  261. /* Write every possible data byte to force correct ECC calculation. */
  262. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  263. I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
  264. mmiowb();
  265. val |= g4x_infoframe_enable(type);
  266. val &= ~VIDEO_DIP_FREQ_MASK;
  267. val |= VIDEO_DIP_FREQ_VSYNC;
  268. I915_WRITE(reg, val);
  269. POSTING_READ(reg);
  270. }
  271. static bool vlv_infoframe_enabled(struct drm_encoder *encoder)
  272. {
  273. struct drm_device *dev = encoder->dev;
  274. struct drm_i915_private *dev_priv = dev->dev_private;
  275. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  276. int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
  277. u32 val = I915_READ(reg);
  278. return val & VIDEO_DIP_ENABLE;
  279. }
  280. static void hsw_write_infoframe(struct drm_encoder *encoder,
  281. enum hdmi_infoframe_type type,
  282. const void *frame, ssize_t len)
  283. {
  284. const uint32_t *data = frame;
  285. struct drm_device *dev = encoder->dev;
  286. struct drm_i915_private *dev_priv = dev->dev_private;
  287. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  288. u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
  289. u32 data_reg;
  290. int i;
  291. u32 val = I915_READ(ctl_reg);
  292. data_reg = hsw_infoframe_data_reg(type,
  293. intel_crtc->config->cpu_transcoder,
  294. dev_priv);
  295. if (data_reg == 0)
  296. return;
  297. val &= ~hsw_infoframe_enable(type);
  298. I915_WRITE(ctl_reg, val);
  299. mmiowb();
  300. for (i = 0; i < len; i += 4) {
  301. I915_WRITE(data_reg + i, *data);
  302. data++;
  303. }
  304. /* Write every possible data byte to force correct ECC calculation. */
  305. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  306. I915_WRITE(data_reg + i, 0);
  307. mmiowb();
  308. val |= hsw_infoframe_enable(type);
  309. I915_WRITE(ctl_reg, val);
  310. POSTING_READ(ctl_reg);
  311. }
  312. static bool hsw_infoframe_enabled(struct drm_encoder *encoder)
  313. {
  314. struct drm_device *dev = encoder->dev;
  315. struct drm_i915_private *dev_priv = dev->dev_private;
  316. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  317. u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
  318. u32 val = I915_READ(ctl_reg);
  319. return val & (VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
  320. VIDEO_DIP_ENABLE_VS_HSW);
  321. }
  322. /*
  323. * The data we write to the DIP data buffer registers is 1 byte bigger than the
  324. * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
  325. * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
  326. * used for both technologies.
  327. *
  328. * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
  329. * DW1: DB3 | DB2 | DB1 | DB0
  330. * DW2: DB7 | DB6 | DB5 | DB4
  331. * DW3: ...
  332. *
  333. * (HB is Header Byte, DB is Data Byte)
  334. *
  335. * The hdmi pack() functions don't know about that hardware specific hole so we
  336. * trick them by giving an offset into the buffer and moving back the header
  337. * bytes by one.
  338. */
  339. static void intel_write_infoframe(struct drm_encoder *encoder,
  340. union hdmi_infoframe *frame)
  341. {
  342. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  343. uint8_t buffer[VIDEO_DIP_DATA_SIZE];
  344. ssize_t len;
  345. /* see comment above for the reason for this offset */
  346. len = hdmi_infoframe_pack(frame, buffer + 1, sizeof(buffer) - 1);
  347. if (len < 0)
  348. return;
  349. /* Insert the 'hole' (see big comment above) at position 3 */
  350. buffer[0] = buffer[1];
  351. buffer[1] = buffer[2];
  352. buffer[2] = buffer[3];
  353. buffer[3] = 0;
  354. len++;
  355. intel_hdmi->write_infoframe(encoder, frame->any.type, buffer, len);
  356. }
  357. static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
  358. struct drm_display_mode *adjusted_mode)
  359. {
  360. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  361. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  362. union hdmi_infoframe frame;
  363. int ret;
  364. /* Set user selected PAR to incoming mode's member */
  365. adjusted_mode->picture_aspect_ratio = intel_hdmi->aspect_ratio;
  366. ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
  367. adjusted_mode);
  368. if (ret < 0) {
  369. DRM_ERROR("couldn't fill AVI infoframe\n");
  370. return;
  371. }
  372. if (intel_hdmi->rgb_quant_range_selectable) {
  373. if (intel_crtc->config->limited_color_range)
  374. frame.avi.quantization_range =
  375. HDMI_QUANTIZATION_RANGE_LIMITED;
  376. else
  377. frame.avi.quantization_range =
  378. HDMI_QUANTIZATION_RANGE_FULL;
  379. }
  380. intel_write_infoframe(encoder, &frame);
  381. }
  382. static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
  383. {
  384. union hdmi_infoframe frame;
  385. int ret;
  386. ret = hdmi_spd_infoframe_init(&frame.spd, "Intel", "Integrated gfx");
  387. if (ret < 0) {
  388. DRM_ERROR("couldn't fill SPD infoframe\n");
  389. return;
  390. }
  391. frame.spd.sdi = HDMI_SPD_SDI_PC;
  392. intel_write_infoframe(encoder, &frame);
  393. }
  394. static void
  395. intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
  396. struct drm_display_mode *adjusted_mode)
  397. {
  398. union hdmi_infoframe frame;
  399. int ret;
  400. ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
  401. adjusted_mode);
  402. if (ret < 0)
  403. return;
  404. intel_write_infoframe(encoder, &frame);
  405. }
  406. static void g4x_set_infoframes(struct drm_encoder *encoder,
  407. bool enable,
  408. struct drm_display_mode *adjusted_mode)
  409. {
  410. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  411. struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
  412. struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
  413. u32 reg = VIDEO_DIP_CTL;
  414. u32 val = I915_READ(reg);
  415. u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
  416. assert_hdmi_port_disabled(intel_hdmi);
  417. /* If the registers were not initialized yet, they might be zeroes,
  418. * which means we're selecting the AVI DIP and we're setting its
  419. * frequency to once. This seems to really confuse the HW and make
  420. * things stop working (the register spec says the AVI always needs to
  421. * be sent every VSync). So here we avoid writing to the register more
  422. * than we need and also explicitly select the AVI DIP and explicitly
  423. * set its frequency to every VSync. Avoiding to write it twice seems to
  424. * be enough to solve the problem, but being defensive shouldn't hurt us
  425. * either. */
  426. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  427. if (!enable) {
  428. if (!(val & VIDEO_DIP_ENABLE))
  429. return;
  430. val &= ~VIDEO_DIP_ENABLE;
  431. I915_WRITE(reg, val);
  432. POSTING_READ(reg);
  433. return;
  434. }
  435. if (port != (val & VIDEO_DIP_PORT_MASK)) {
  436. if (val & VIDEO_DIP_ENABLE) {
  437. val &= ~VIDEO_DIP_ENABLE;
  438. I915_WRITE(reg, val);
  439. POSTING_READ(reg);
  440. }
  441. val &= ~VIDEO_DIP_PORT_MASK;
  442. val |= port;
  443. }
  444. val |= VIDEO_DIP_ENABLE;
  445. val &= ~VIDEO_DIP_ENABLE_VENDOR;
  446. I915_WRITE(reg, val);
  447. POSTING_READ(reg);
  448. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  449. intel_hdmi_set_spd_infoframe(encoder);
  450. intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
  451. }
  452. static void ibx_set_infoframes(struct drm_encoder *encoder,
  453. bool enable,
  454. struct drm_display_mode *adjusted_mode)
  455. {
  456. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  457. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  458. struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
  459. struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
  460. u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  461. u32 val = I915_READ(reg);
  462. u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
  463. assert_hdmi_port_disabled(intel_hdmi);
  464. /* See the big comment in g4x_set_infoframes() */
  465. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  466. if (!enable) {
  467. if (!(val & VIDEO_DIP_ENABLE))
  468. return;
  469. val &= ~VIDEO_DIP_ENABLE;
  470. I915_WRITE(reg, val);
  471. POSTING_READ(reg);
  472. return;
  473. }
  474. if (port != (val & VIDEO_DIP_PORT_MASK)) {
  475. if (val & VIDEO_DIP_ENABLE) {
  476. val &= ~VIDEO_DIP_ENABLE;
  477. I915_WRITE(reg, val);
  478. POSTING_READ(reg);
  479. }
  480. val &= ~VIDEO_DIP_PORT_MASK;
  481. val |= port;
  482. }
  483. val |= VIDEO_DIP_ENABLE;
  484. val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
  485. VIDEO_DIP_ENABLE_GCP);
  486. I915_WRITE(reg, val);
  487. POSTING_READ(reg);
  488. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  489. intel_hdmi_set_spd_infoframe(encoder);
  490. intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
  491. }
  492. static void cpt_set_infoframes(struct drm_encoder *encoder,
  493. bool enable,
  494. struct drm_display_mode *adjusted_mode)
  495. {
  496. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  497. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  498. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  499. u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  500. u32 val = I915_READ(reg);
  501. assert_hdmi_port_disabled(intel_hdmi);
  502. /* See the big comment in g4x_set_infoframes() */
  503. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  504. if (!enable) {
  505. if (!(val & VIDEO_DIP_ENABLE))
  506. return;
  507. val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
  508. I915_WRITE(reg, val);
  509. POSTING_READ(reg);
  510. return;
  511. }
  512. /* Set both together, unset both together: see the spec. */
  513. val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
  514. val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
  515. VIDEO_DIP_ENABLE_GCP);
  516. I915_WRITE(reg, val);
  517. POSTING_READ(reg);
  518. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  519. intel_hdmi_set_spd_infoframe(encoder);
  520. intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
  521. }
  522. static void vlv_set_infoframes(struct drm_encoder *encoder,
  523. bool enable,
  524. struct drm_display_mode *adjusted_mode)
  525. {
  526. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  527. struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
  528. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  529. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  530. u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
  531. u32 val = I915_READ(reg);
  532. u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
  533. assert_hdmi_port_disabled(intel_hdmi);
  534. /* See the big comment in g4x_set_infoframes() */
  535. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  536. if (!enable) {
  537. if (!(val & VIDEO_DIP_ENABLE))
  538. return;
  539. val &= ~VIDEO_DIP_ENABLE;
  540. I915_WRITE(reg, val);
  541. POSTING_READ(reg);
  542. return;
  543. }
  544. if (port != (val & VIDEO_DIP_PORT_MASK)) {
  545. if (val & VIDEO_DIP_ENABLE) {
  546. val &= ~VIDEO_DIP_ENABLE;
  547. I915_WRITE(reg, val);
  548. POSTING_READ(reg);
  549. }
  550. val &= ~VIDEO_DIP_PORT_MASK;
  551. val |= port;
  552. }
  553. val |= VIDEO_DIP_ENABLE;
  554. val &= ~(VIDEO_DIP_ENABLE_AVI | VIDEO_DIP_ENABLE_VENDOR |
  555. VIDEO_DIP_ENABLE_GAMUT | VIDEO_DIP_ENABLE_GCP);
  556. I915_WRITE(reg, val);
  557. POSTING_READ(reg);
  558. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  559. intel_hdmi_set_spd_infoframe(encoder);
  560. intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
  561. }
  562. static void hsw_set_infoframes(struct drm_encoder *encoder,
  563. bool enable,
  564. struct drm_display_mode *adjusted_mode)
  565. {
  566. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  567. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  568. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  569. u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config->cpu_transcoder);
  570. u32 val = I915_READ(reg);
  571. assert_hdmi_port_disabled(intel_hdmi);
  572. if (!enable) {
  573. I915_WRITE(reg, 0);
  574. POSTING_READ(reg);
  575. return;
  576. }
  577. val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
  578. VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);
  579. I915_WRITE(reg, val);
  580. POSTING_READ(reg);
  581. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  582. intel_hdmi_set_spd_infoframe(encoder);
  583. intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
  584. }
  585. static void intel_hdmi_prepare(struct intel_encoder *encoder)
  586. {
  587. struct drm_device *dev = encoder->base.dev;
  588. struct drm_i915_private *dev_priv = dev->dev_private;
  589. struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
  590. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  591. struct drm_display_mode *adjusted_mode = &crtc->config->base.adjusted_mode;
  592. u32 hdmi_val;
  593. hdmi_val = SDVO_ENCODING_HDMI;
  594. if (!HAS_PCH_SPLIT(dev))
  595. hdmi_val |= intel_hdmi->color_range;
  596. if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
  597. hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
  598. if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
  599. hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
  600. if (crtc->config->pipe_bpp > 24)
  601. hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
  602. else
  603. hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
  604. if (crtc->config->has_hdmi_sink)
  605. hdmi_val |= HDMI_MODE_SELECT_HDMI;
  606. if (HAS_PCH_CPT(dev))
  607. hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
  608. else if (IS_CHERRYVIEW(dev))
  609. hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
  610. else
  611. hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
  612. I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
  613. POSTING_READ(intel_hdmi->hdmi_reg);
  614. }
  615. static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
  616. enum pipe *pipe)
  617. {
  618. struct drm_device *dev = encoder->base.dev;
  619. struct drm_i915_private *dev_priv = dev->dev_private;
  620. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  621. enum intel_display_power_domain power_domain;
  622. u32 tmp;
  623. power_domain = intel_display_port_power_domain(encoder);
  624. if (!intel_display_power_is_enabled(dev_priv, power_domain))
  625. return false;
  626. tmp = I915_READ(intel_hdmi->hdmi_reg);
  627. if (!(tmp & SDVO_ENABLE))
  628. return false;
  629. if (HAS_PCH_CPT(dev))
  630. *pipe = PORT_TO_PIPE_CPT(tmp);
  631. else if (IS_CHERRYVIEW(dev))
  632. *pipe = SDVO_PORT_TO_PIPE_CHV(tmp);
  633. else
  634. *pipe = PORT_TO_PIPE(tmp);
  635. return true;
  636. }
  637. static void intel_hdmi_get_config(struct intel_encoder *encoder,
  638. struct intel_crtc_state *pipe_config)
  639. {
  640. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  641. struct drm_device *dev = encoder->base.dev;
  642. struct drm_i915_private *dev_priv = dev->dev_private;
  643. u32 tmp, flags = 0;
  644. int dotclock;
  645. tmp = I915_READ(intel_hdmi->hdmi_reg);
  646. if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
  647. flags |= DRM_MODE_FLAG_PHSYNC;
  648. else
  649. flags |= DRM_MODE_FLAG_NHSYNC;
  650. if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
  651. flags |= DRM_MODE_FLAG_PVSYNC;
  652. else
  653. flags |= DRM_MODE_FLAG_NVSYNC;
  654. if (tmp & HDMI_MODE_SELECT_HDMI)
  655. pipe_config->has_hdmi_sink = true;
  656. if (intel_hdmi->infoframe_enabled(&encoder->base))
  657. pipe_config->has_infoframe = true;
  658. if (tmp & SDVO_AUDIO_ENABLE)
  659. pipe_config->has_audio = true;
  660. if (!HAS_PCH_SPLIT(dev) &&
  661. tmp & HDMI_COLOR_RANGE_16_235)
  662. pipe_config->limited_color_range = true;
  663. pipe_config->base.adjusted_mode.flags |= flags;
  664. if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
  665. dotclock = pipe_config->port_clock * 2 / 3;
  666. else
  667. dotclock = pipe_config->port_clock;
  668. if (HAS_PCH_SPLIT(dev_priv->dev))
  669. ironlake_check_encoder_dotclock(pipe_config, dotclock);
  670. pipe_config->base.adjusted_mode.crtc_clock = dotclock;
  671. }
  672. static void intel_enable_hdmi(struct intel_encoder *encoder)
  673. {
  674. struct drm_device *dev = encoder->base.dev;
  675. struct drm_i915_private *dev_priv = dev->dev_private;
  676. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
  677. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  678. u32 temp;
  679. u32 enable_bits = SDVO_ENABLE;
  680. if (intel_crtc->config->has_audio)
  681. enable_bits |= SDVO_AUDIO_ENABLE;
  682. temp = I915_READ(intel_hdmi->hdmi_reg);
  683. /* HW workaround for IBX, we need to move the port to transcoder A
  684. * before disabling it, so restore the transcoder select bit here. */
  685. if (HAS_PCH_IBX(dev))
  686. enable_bits |= SDVO_PIPE_SEL(intel_crtc->pipe);
  687. /* HW workaround, need to toggle enable bit off and on for 12bpc, but
  688. * we do this anyway which shows more stable in testing.
  689. */
  690. if (HAS_PCH_SPLIT(dev)) {
  691. I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
  692. POSTING_READ(intel_hdmi->hdmi_reg);
  693. }
  694. temp |= enable_bits;
  695. I915_WRITE(intel_hdmi->hdmi_reg, temp);
  696. POSTING_READ(intel_hdmi->hdmi_reg);
  697. /* HW workaround, need to write this twice for issue that may result
  698. * in first write getting masked.
  699. */
  700. if (HAS_PCH_SPLIT(dev)) {
  701. I915_WRITE(intel_hdmi->hdmi_reg, temp);
  702. POSTING_READ(intel_hdmi->hdmi_reg);
  703. }
  704. if (intel_crtc->config->has_audio) {
  705. WARN_ON(!intel_crtc->config->has_hdmi_sink);
  706. DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
  707. pipe_name(intel_crtc->pipe));
  708. intel_audio_codec_enable(encoder);
  709. }
  710. }
  711. static void vlv_enable_hdmi(struct intel_encoder *encoder)
  712. {
  713. }
  714. static void intel_disable_hdmi(struct intel_encoder *encoder)
  715. {
  716. struct drm_device *dev = encoder->base.dev;
  717. struct drm_i915_private *dev_priv = dev->dev_private;
  718. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  719. struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
  720. u32 temp;
  721. u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
  722. if (crtc->config->has_audio)
  723. intel_audio_codec_disable(encoder);
  724. temp = I915_READ(intel_hdmi->hdmi_reg);
  725. /* HW workaround for IBX, we need to move the port to transcoder A
  726. * before disabling it. */
  727. if (HAS_PCH_IBX(dev)) {
  728. struct drm_crtc *crtc = encoder->base.crtc;
  729. int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
  730. if (temp & SDVO_PIPE_B_SELECT) {
  731. temp &= ~SDVO_PIPE_B_SELECT;
  732. I915_WRITE(intel_hdmi->hdmi_reg, temp);
  733. POSTING_READ(intel_hdmi->hdmi_reg);
  734. /* Again we need to write this twice. */
  735. I915_WRITE(intel_hdmi->hdmi_reg, temp);
  736. POSTING_READ(intel_hdmi->hdmi_reg);
  737. /* Transcoder selection bits only update
  738. * effectively on vblank. */
  739. if (crtc)
  740. intel_wait_for_vblank(dev, pipe);
  741. else
  742. msleep(50);
  743. }
  744. }
  745. /* HW workaround, need to toggle enable bit off and on for 12bpc, but
  746. * we do this anyway which shows more stable in testing.
  747. */
  748. if (HAS_PCH_SPLIT(dev)) {
  749. I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
  750. POSTING_READ(intel_hdmi->hdmi_reg);
  751. }
  752. temp &= ~enable_bits;
  753. I915_WRITE(intel_hdmi->hdmi_reg, temp);
  754. POSTING_READ(intel_hdmi->hdmi_reg);
  755. /* HW workaround, need to write this twice for issue that may result
  756. * in first write getting masked.
  757. */
  758. if (HAS_PCH_SPLIT(dev)) {
  759. I915_WRITE(intel_hdmi->hdmi_reg, temp);
  760. POSTING_READ(intel_hdmi->hdmi_reg);
  761. }
  762. }
  763. static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit)
  764. {
  765. struct drm_device *dev = intel_hdmi_to_dev(hdmi);
  766. if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev))
  767. return 165000;
  768. else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8)
  769. return 300000;
  770. else
  771. return 225000;
  772. }
  773. static enum drm_mode_status
  774. intel_hdmi_mode_valid(struct drm_connector *connector,
  775. struct drm_display_mode *mode)
  776. {
  777. int clock = mode->clock;
  778. if (mode->flags & DRM_MODE_FLAG_DBLCLK)
  779. clock *= 2;
  780. if (clock > hdmi_portclock_limit(intel_attached_hdmi(connector),
  781. true))
  782. return MODE_CLOCK_HIGH;
  783. if (clock < 20000)
  784. return MODE_CLOCK_LOW;
  785. if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
  786. return MODE_NO_DBLESCAN;
  787. return MODE_OK;
  788. }
  789. static bool hdmi_12bpc_possible(struct intel_crtc_state *crtc_state)
  790. {
  791. struct drm_device *dev = crtc_state->base.crtc->dev;
  792. struct drm_atomic_state *state;
  793. struct intel_encoder *encoder;
  794. struct drm_connector_state *connector_state;
  795. int count = 0, count_hdmi = 0;
  796. int i;
  797. if (HAS_GMCH_DISPLAY(dev))
  798. return false;
  799. state = crtc_state->base.state;
  800. for (i = 0; i < state->num_connector; i++) {
  801. if (!state->connectors[i])
  802. continue;
  803. connector_state = state->connector_states[i];
  804. if (connector_state->crtc != crtc_state->base.crtc)
  805. continue;
  806. encoder = to_intel_encoder(connector_state->best_encoder);
  807. count_hdmi += encoder->type == INTEL_OUTPUT_HDMI;
  808. count++;
  809. }
  810. /*
  811. * HDMI 12bpc affects the clocks, so it's only possible
  812. * when not cloning with other encoder types.
  813. */
  814. return count_hdmi > 0 && count_hdmi == count;
  815. }
  816. bool intel_hdmi_compute_config(struct intel_encoder *encoder,
  817. struct intel_crtc_state *pipe_config)
  818. {
  819. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  820. struct drm_device *dev = encoder->base.dev;
  821. struct drm_display_mode *adjusted_mode = &pipe_config->base.adjusted_mode;
  822. int clock_12bpc = pipe_config->base.adjusted_mode.crtc_clock * 3 / 2;
  823. int portclock_limit = hdmi_portclock_limit(intel_hdmi, false);
  824. int desired_bpp;
  825. pipe_config->has_hdmi_sink = intel_hdmi->has_hdmi_sink;
  826. if (pipe_config->has_hdmi_sink)
  827. pipe_config->has_infoframe = true;
  828. if (intel_hdmi->color_range_auto) {
  829. /* See CEA-861-E - 5.1 Default Encoding Parameters */
  830. if (pipe_config->has_hdmi_sink &&
  831. drm_match_cea_mode(adjusted_mode) > 1)
  832. intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
  833. else
  834. intel_hdmi->color_range = 0;
  835. }
  836. if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) {
  837. pipe_config->pixel_multiplier = 2;
  838. }
  839. if (intel_hdmi->color_range)
  840. pipe_config->limited_color_range = true;
  841. if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
  842. pipe_config->has_pch_encoder = true;
  843. if (pipe_config->has_hdmi_sink && intel_hdmi->has_audio)
  844. pipe_config->has_audio = true;
  845. /*
  846. * HDMI is either 12 or 8, so if the display lets 10bpc sneak
  847. * through, clamp it down. Note that g4x/vlv don't support 12bpc hdmi
  848. * outputs. We also need to check that the higher clock still fits
  849. * within limits.
  850. */
  851. if (pipe_config->pipe_bpp > 8*3 && pipe_config->has_hdmi_sink &&
  852. clock_12bpc <= portclock_limit &&
  853. hdmi_12bpc_possible(pipe_config)) {
  854. DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
  855. desired_bpp = 12*3;
  856. /* Need to adjust the port link by 1.5x for 12bpc. */
  857. pipe_config->port_clock = clock_12bpc;
  858. } else {
  859. DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
  860. desired_bpp = 8*3;
  861. }
  862. if (!pipe_config->bw_constrained) {
  863. DRM_DEBUG_KMS("forcing pipe bpc to %i for HDMI\n", desired_bpp);
  864. pipe_config->pipe_bpp = desired_bpp;
  865. }
  866. if (adjusted_mode->crtc_clock > portclock_limit) {
  867. DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
  868. return false;
  869. }
  870. return true;
  871. }
  872. static void
  873. intel_hdmi_unset_edid(struct drm_connector *connector)
  874. {
  875. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  876. intel_hdmi->has_hdmi_sink = false;
  877. intel_hdmi->has_audio = false;
  878. intel_hdmi->rgb_quant_range_selectable = false;
  879. kfree(to_intel_connector(connector)->detect_edid);
  880. to_intel_connector(connector)->detect_edid = NULL;
  881. }
  882. static bool
  883. intel_hdmi_set_edid(struct drm_connector *connector)
  884. {
  885. struct drm_i915_private *dev_priv = to_i915(connector->dev);
  886. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  887. struct intel_encoder *intel_encoder =
  888. &hdmi_to_dig_port(intel_hdmi)->base;
  889. enum intel_display_power_domain power_domain;
  890. struct edid *edid;
  891. bool connected = false;
  892. power_domain = intel_display_port_power_domain(intel_encoder);
  893. intel_display_power_get(dev_priv, power_domain);
  894. edid = drm_get_edid(connector,
  895. intel_gmbus_get_adapter(dev_priv,
  896. intel_hdmi->ddc_bus));
  897. intel_display_power_put(dev_priv, power_domain);
  898. to_intel_connector(connector)->detect_edid = edid;
  899. if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
  900. intel_hdmi->rgb_quant_range_selectable =
  901. drm_rgb_quant_range_selectable(edid);
  902. intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
  903. if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
  904. intel_hdmi->has_audio =
  905. intel_hdmi->force_audio == HDMI_AUDIO_ON;
  906. if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
  907. intel_hdmi->has_hdmi_sink =
  908. drm_detect_hdmi_monitor(edid);
  909. connected = true;
  910. }
  911. return connected;
  912. }
  913. static enum drm_connector_status
  914. intel_hdmi_detect(struct drm_connector *connector, bool force)
  915. {
  916. enum drm_connector_status status;
  917. DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
  918. connector->base.id, connector->name);
  919. intel_hdmi_unset_edid(connector);
  920. if (intel_hdmi_set_edid(connector)) {
  921. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  922. hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
  923. status = connector_status_connected;
  924. } else
  925. status = connector_status_disconnected;
  926. return status;
  927. }
  928. static void
  929. intel_hdmi_force(struct drm_connector *connector)
  930. {
  931. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  932. DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
  933. connector->base.id, connector->name);
  934. intel_hdmi_unset_edid(connector);
  935. if (connector->status != connector_status_connected)
  936. return;
  937. intel_hdmi_set_edid(connector);
  938. hdmi_to_dig_port(intel_hdmi)->base.type = INTEL_OUTPUT_HDMI;
  939. }
  940. static int intel_hdmi_get_modes(struct drm_connector *connector)
  941. {
  942. struct edid *edid;
  943. edid = to_intel_connector(connector)->detect_edid;
  944. if (edid == NULL)
  945. return 0;
  946. return intel_connector_update_modes(connector, edid);
  947. }
  948. static bool
  949. intel_hdmi_detect_audio(struct drm_connector *connector)
  950. {
  951. bool has_audio = false;
  952. struct edid *edid;
  953. edid = to_intel_connector(connector)->detect_edid;
  954. if (edid && edid->input & DRM_EDID_INPUT_DIGITAL)
  955. has_audio = drm_detect_monitor_audio(edid);
  956. return has_audio;
  957. }
  958. static int
  959. intel_hdmi_set_property(struct drm_connector *connector,
  960. struct drm_property *property,
  961. uint64_t val)
  962. {
  963. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  964. struct intel_digital_port *intel_dig_port =
  965. hdmi_to_dig_port(intel_hdmi);
  966. struct drm_i915_private *dev_priv = connector->dev->dev_private;
  967. int ret;
  968. ret = drm_object_property_set_value(&connector->base, property, val);
  969. if (ret)
  970. return ret;
  971. if (property == dev_priv->force_audio_property) {
  972. enum hdmi_force_audio i = val;
  973. bool has_audio;
  974. if (i == intel_hdmi->force_audio)
  975. return 0;
  976. intel_hdmi->force_audio = i;
  977. if (i == HDMI_AUDIO_AUTO)
  978. has_audio = intel_hdmi_detect_audio(connector);
  979. else
  980. has_audio = (i == HDMI_AUDIO_ON);
  981. if (i == HDMI_AUDIO_OFF_DVI)
  982. intel_hdmi->has_hdmi_sink = 0;
  983. intel_hdmi->has_audio = has_audio;
  984. goto done;
  985. }
  986. if (property == dev_priv->broadcast_rgb_property) {
  987. bool old_auto = intel_hdmi->color_range_auto;
  988. uint32_t old_range = intel_hdmi->color_range;
  989. switch (val) {
  990. case INTEL_BROADCAST_RGB_AUTO:
  991. intel_hdmi->color_range_auto = true;
  992. break;
  993. case INTEL_BROADCAST_RGB_FULL:
  994. intel_hdmi->color_range_auto = false;
  995. intel_hdmi->color_range = 0;
  996. break;
  997. case INTEL_BROADCAST_RGB_LIMITED:
  998. intel_hdmi->color_range_auto = false;
  999. intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
  1000. break;
  1001. default:
  1002. return -EINVAL;
  1003. }
  1004. if (old_auto == intel_hdmi->color_range_auto &&
  1005. old_range == intel_hdmi->color_range)
  1006. return 0;
  1007. goto done;
  1008. }
  1009. if (property == connector->dev->mode_config.aspect_ratio_property) {
  1010. switch (val) {
  1011. case DRM_MODE_PICTURE_ASPECT_NONE:
  1012. intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
  1013. break;
  1014. case DRM_MODE_PICTURE_ASPECT_4_3:
  1015. intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_4_3;
  1016. break;
  1017. case DRM_MODE_PICTURE_ASPECT_16_9:
  1018. intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_16_9;
  1019. break;
  1020. default:
  1021. return -EINVAL;
  1022. }
  1023. goto done;
  1024. }
  1025. return -EINVAL;
  1026. done:
  1027. if (intel_dig_port->base.base.crtc)
  1028. intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
  1029. return 0;
  1030. }
  1031. static void intel_hdmi_pre_enable(struct intel_encoder *encoder)
  1032. {
  1033. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  1034. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
  1035. struct drm_display_mode *adjusted_mode =
  1036. &intel_crtc->config->base.adjusted_mode;
  1037. intel_hdmi_prepare(encoder);
  1038. intel_hdmi->set_infoframes(&encoder->base,
  1039. intel_crtc->config->has_hdmi_sink,
  1040. adjusted_mode);
  1041. }
  1042. static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
  1043. {
  1044. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  1045. struct intel_hdmi *intel_hdmi = &dport->hdmi;
  1046. struct drm_device *dev = encoder->base.dev;
  1047. struct drm_i915_private *dev_priv = dev->dev_private;
  1048. struct intel_crtc *intel_crtc =
  1049. to_intel_crtc(encoder->base.crtc);
  1050. struct drm_display_mode *adjusted_mode =
  1051. &intel_crtc->config->base.adjusted_mode;
  1052. enum dpio_channel port = vlv_dport_to_channel(dport);
  1053. int pipe = intel_crtc->pipe;
  1054. u32 val;
  1055. /* Enable clock channels for this port */
  1056. mutex_lock(&dev_priv->dpio_lock);
  1057. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
  1058. val = 0;
  1059. if (pipe)
  1060. val |= (1<<21);
  1061. else
  1062. val &= ~(1<<21);
  1063. val |= 0x001000c4;
  1064. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
  1065. /* HDMI 1.0V-2dB */
  1066. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0);
  1067. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), 0x2b245f5f);
  1068. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port), 0x5578b83a);
  1069. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0c782040);
  1070. vlv_dpio_write(dev_priv, pipe, VLV_TX3_DW4(port), 0x2b247878);
  1071. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
  1072. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000);
  1073. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
  1074. /* Program lane clock */
  1075. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
  1076. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
  1077. mutex_unlock(&dev_priv->dpio_lock);
  1078. intel_hdmi->set_infoframes(&encoder->base,
  1079. intel_crtc->config->has_hdmi_sink,
  1080. adjusted_mode);
  1081. intel_enable_hdmi(encoder);
  1082. vlv_wait_port_ready(dev_priv, dport);
  1083. }
  1084. static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
  1085. {
  1086. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  1087. struct drm_device *dev = encoder->base.dev;
  1088. struct drm_i915_private *dev_priv = dev->dev_private;
  1089. struct intel_crtc *intel_crtc =
  1090. to_intel_crtc(encoder->base.crtc);
  1091. enum dpio_channel port = vlv_dport_to_channel(dport);
  1092. int pipe = intel_crtc->pipe;
  1093. intel_hdmi_prepare(encoder);
  1094. /* Program Tx lane resets to default */
  1095. mutex_lock(&dev_priv->dpio_lock);
  1096. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
  1097. DPIO_PCS_TX_LANE2_RESET |
  1098. DPIO_PCS_TX_LANE1_RESET);
  1099. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
  1100. DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
  1101. DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
  1102. (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
  1103. DPIO_PCS_CLK_SOFT_RESET);
  1104. /* Fix up inter-pair skew failure */
  1105. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
  1106. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
  1107. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);
  1108. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000);
  1109. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
  1110. mutex_unlock(&dev_priv->dpio_lock);
  1111. }
  1112. static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
  1113. {
  1114. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  1115. struct drm_device *dev = encoder->base.dev;
  1116. struct drm_i915_private *dev_priv = dev->dev_private;
  1117. struct intel_crtc *intel_crtc =
  1118. to_intel_crtc(encoder->base.crtc);
  1119. enum dpio_channel ch = vlv_dport_to_channel(dport);
  1120. enum pipe pipe = intel_crtc->pipe;
  1121. u32 val;
  1122. intel_hdmi_prepare(encoder);
  1123. mutex_lock(&dev_priv->dpio_lock);
  1124. /* program left/right clock distribution */
  1125. if (pipe != PIPE_B) {
  1126. val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
  1127. val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
  1128. if (ch == DPIO_CH0)
  1129. val |= CHV_BUFLEFTENA1_FORCE;
  1130. if (ch == DPIO_CH1)
  1131. val |= CHV_BUFRIGHTENA1_FORCE;
  1132. vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
  1133. } else {
  1134. val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
  1135. val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
  1136. if (ch == DPIO_CH0)
  1137. val |= CHV_BUFLEFTENA2_FORCE;
  1138. if (ch == DPIO_CH1)
  1139. val |= CHV_BUFRIGHTENA2_FORCE;
  1140. vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
  1141. }
  1142. /* program clock channel usage */
  1143. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
  1144. val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
  1145. if (pipe != PIPE_B)
  1146. val &= ~CHV_PCS_USEDCLKCHANNEL;
  1147. else
  1148. val |= CHV_PCS_USEDCLKCHANNEL;
  1149. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
  1150. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
  1151. val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
  1152. if (pipe != PIPE_B)
  1153. val &= ~CHV_PCS_USEDCLKCHANNEL;
  1154. else
  1155. val |= CHV_PCS_USEDCLKCHANNEL;
  1156. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
  1157. /*
  1158. * This a a bit weird since generally CL
  1159. * matches the pipe, but here we need to
  1160. * pick the CL based on the port.
  1161. */
  1162. val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
  1163. if (pipe != PIPE_B)
  1164. val &= ~CHV_CMN_USEDCLKCHANNEL;
  1165. else
  1166. val |= CHV_CMN_USEDCLKCHANNEL;
  1167. vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
  1168. mutex_unlock(&dev_priv->dpio_lock);
  1169. }
  1170. static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
  1171. {
  1172. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  1173. struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
  1174. struct intel_crtc *intel_crtc =
  1175. to_intel_crtc(encoder->base.crtc);
  1176. enum dpio_channel port = vlv_dport_to_channel(dport);
  1177. int pipe = intel_crtc->pipe;
  1178. /* Reset lanes to avoid HDMI flicker (VLV w/a) */
  1179. mutex_lock(&dev_priv->dpio_lock);
  1180. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
  1181. vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
  1182. mutex_unlock(&dev_priv->dpio_lock);
  1183. }
  1184. static void chv_hdmi_post_disable(struct intel_encoder *encoder)
  1185. {
  1186. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  1187. struct drm_device *dev = encoder->base.dev;
  1188. struct drm_i915_private *dev_priv = dev->dev_private;
  1189. struct intel_crtc *intel_crtc =
  1190. to_intel_crtc(encoder->base.crtc);
  1191. enum dpio_channel ch = vlv_dport_to_channel(dport);
  1192. enum pipe pipe = intel_crtc->pipe;
  1193. u32 val;
  1194. mutex_lock(&dev_priv->dpio_lock);
  1195. /* Propagate soft reset to data lane reset */
  1196. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
  1197. val |= CHV_PCS_REQ_SOFTRESET_EN;
  1198. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
  1199. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
  1200. val |= CHV_PCS_REQ_SOFTRESET_EN;
  1201. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
  1202. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
  1203. val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
  1204. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
  1205. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
  1206. val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
  1207. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
  1208. mutex_unlock(&dev_priv->dpio_lock);
  1209. }
  1210. static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
  1211. {
  1212. struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
  1213. struct intel_hdmi *intel_hdmi = &dport->hdmi;
  1214. struct drm_device *dev = encoder->base.dev;
  1215. struct drm_i915_private *dev_priv = dev->dev_private;
  1216. struct intel_crtc *intel_crtc =
  1217. to_intel_crtc(encoder->base.crtc);
  1218. struct drm_display_mode *adjusted_mode =
  1219. &intel_crtc->config->base.adjusted_mode;
  1220. enum dpio_channel ch = vlv_dport_to_channel(dport);
  1221. int pipe = intel_crtc->pipe;
  1222. int data, i;
  1223. u32 val;
  1224. mutex_lock(&dev_priv->dpio_lock);
  1225. /* allow hardware to manage TX FIFO reset source */
  1226. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
  1227. val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
  1228. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
  1229. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
  1230. val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
  1231. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
  1232. /* Deassert soft data lane reset*/
  1233. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
  1234. val |= CHV_PCS_REQ_SOFTRESET_EN;
  1235. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
  1236. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
  1237. val |= CHV_PCS_REQ_SOFTRESET_EN;
  1238. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
  1239. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
  1240. val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
  1241. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
  1242. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
  1243. val |= (DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
  1244. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
  1245. /* Program Tx latency optimal setting */
  1246. for (i = 0; i < 4; i++) {
  1247. /* Set the upar bit */
  1248. data = (i == 1) ? 0x0 : 0x1;
  1249. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
  1250. data << DPIO_UPAR_SHIFT);
  1251. }
  1252. /* Data lane stagger programming */
  1253. /* FIXME: Fix up value only after power analysis */
  1254. /* Clear calc init */
  1255. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
  1256. val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
  1257. val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
  1258. val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
  1259. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
  1260. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
  1261. val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
  1262. val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
  1263. val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
  1264. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
  1265. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
  1266. val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
  1267. val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
  1268. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
  1269. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
  1270. val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
  1271. val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
  1272. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
  1273. /* FIXME: Program the support xxx V-dB */
  1274. /* Use 800mV-0dB */
  1275. for (i = 0; i < 4; i++) {
  1276. val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
  1277. val &= ~DPIO_SWING_DEEMPH9P5_MASK;
  1278. val |= 128 << DPIO_SWING_DEEMPH9P5_SHIFT;
  1279. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val);
  1280. }
  1281. for (i = 0; i < 4; i++) {
  1282. val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
  1283. val &= ~DPIO_SWING_MARGIN000_MASK;
  1284. val |= 102 << DPIO_SWING_MARGIN000_SHIFT;
  1285. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
  1286. }
  1287. /* Disable unique transition scale */
  1288. for (i = 0; i < 4; i++) {
  1289. val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
  1290. val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN;
  1291. vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
  1292. }
  1293. /* Additional steps for 1200mV-0dB */
  1294. #if 0
  1295. val = vlv_dpio_read(dev_priv, pipe, VLV_TX_DW3(ch));
  1296. if (ch)
  1297. val |= DPIO_TX_UNIQ_TRANS_SCALE_CH1;
  1298. else
  1299. val |= DPIO_TX_UNIQ_TRANS_SCALE_CH0;
  1300. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(ch), val);
  1301. vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(ch),
  1302. vlv_dpio_read(dev_priv, pipe, VLV_TX_DW2(ch)) |
  1303. (0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT));
  1304. #endif
  1305. /* Start swing calculation */
  1306. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
  1307. val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
  1308. vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
  1309. val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
  1310. val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
  1311. vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
  1312. /* LRC Bypass */
  1313. val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);
  1314. val |= DPIO_LRC_BYPASS;
  1315. vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW30, val);
  1316. mutex_unlock(&dev_priv->dpio_lock);
  1317. intel_hdmi->set_infoframes(&encoder->base,
  1318. intel_crtc->config->has_hdmi_sink,
  1319. adjusted_mode);
  1320. intel_enable_hdmi(encoder);
  1321. vlv_wait_port_ready(dev_priv, dport);
  1322. }
  1323. static void intel_hdmi_destroy(struct drm_connector *connector)
  1324. {
  1325. kfree(to_intel_connector(connector)->detect_edid);
  1326. drm_connector_cleanup(connector);
  1327. kfree(connector);
  1328. }
  1329. static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
  1330. .dpms = intel_connector_dpms,
  1331. .detect = intel_hdmi_detect,
  1332. .force = intel_hdmi_force,
  1333. .fill_modes = drm_helper_probe_single_connector_modes,
  1334. .set_property = intel_hdmi_set_property,
  1335. .atomic_get_property = intel_connector_atomic_get_property,
  1336. .destroy = intel_hdmi_destroy,
  1337. .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
  1338. .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
  1339. };
  1340. static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
  1341. .get_modes = intel_hdmi_get_modes,
  1342. .mode_valid = intel_hdmi_mode_valid,
  1343. .best_encoder = intel_best_encoder,
  1344. };
  1345. static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
  1346. .destroy = intel_encoder_destroy,
  1347. };
  1348. static void
  1349. intel_attach_aspect_ratio_property(struct drm_connector *connector)
  1350. {
  1351. if (!drm_mode_create_aspect_ratio_property(connector->dev))
  1352. drm_object_attach_property(&connector->base,
  1353. connector->dev->mode_config.aspect_ratio_property,
  1354. DRM_MODE_PICTURE_ASPECT_NONE);
  1355. }
  1356. static void
  1357. intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
  1358. {
  1359. intel_attach_force_audio_property(connector);
  1360. intel_attach_broadcast_rgb_property(connector);
  1361. intel_hdmi->color_range_auto = true;
  1362. intel_attach_aspect_ratio_property(connector);
  1363. intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
  1364. }
  1365. void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
  1366. struct intel_connector *intel_connector)
  1367. {
  1368. struct drm_connector *connector = &intel_connector->base;
  1369. struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
  1370. struct intel_encoder *intel_encoder = &intel_dig_port->base;
  1371. struct drm_device *dev = intel_encoder->base.dev;
  1372. struct drm_i915_private *dev_priv = dev->dev_private;
  1373. enum port port = intel_dig_port->port;
  1374. drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
  1375. DRM_MODE_CONNECTOR_HDMIA);
  1376. drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
  1377. connector->interlace_allowed = 1;
  1378. connector->doublescan_allowed = 0;
  1379. connector->stereo_allowed = 1;
  1380. switch (port) {
  1381. case PORT_B:
  1382. intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
  1383. intel_encoder->hpd_pin = HPD_PORT_B;
  1384. break;
  1385. case PORT_C:
  1386. intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
  1387. intel_encoder->hpd_pin = HPD_PORT_C;
  1388. break;
  1389. case PORT_D:
  1390. if (IS_CHERRYVIEW(dev))
  1391. intel_hdmi->ddc_bus = GMBUS_PORT_DPD_CHV;
  1392. else
  1393. intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
  1394. intel_encoder->hpd_pin = HPD_PORT_D;
  1395. break;
  1396. case PORT_A:
  1397. intel_encoder->hpd_pin = HPD_PORT_A;
  1398. /* Internal port only for eDP. */
  1399. default:
  1400. BUG();
  1401. }
  1402. if (IS_VALLEYVIEW(dev)) {
  1403. intel_hdmi->write_infoframe = vlv_write_infoframe;
  1404. intel_hdmi->set_infoframes = vlv_set_infoframes;
  1405. intel_hdmi->infoframe_enabled = vlv_infoframe_enabled;
  1406. } else if (IS_G4X(dev)) {
  1407. intel_hdmi->write_infoframe = g4x_write_infoframe;
  1408. intel_hdmi->set_infoframes = g4x_set_infoframes;
  1409. intel_hdmi->infoframe_enabled = g4x_infoframe_enabled;
  1410. } else if (HAS_DDI(dev)) {
  1411. intel_hdmi->write_infoframe = hsw_write_infoframe;
  1412. intel_hdmi->set_infoframes = hsw_set_infoframes;
  1413. intel_hdmi->infoframe_enabled = hsw_infoframe_enabled;
  1414. } else if (HAS_PCH_IBX(dev)) {
  1415. intel_hdmi->write_infoframe = ibx_write_infoframe;
  1416. intel_hdmi->set_infoframes = ibx_set_infoframes;
  1417. intel_hdmi->infoframe_enabled = ibx_infoframe_enabled;
  1418. } else {
  1419. intel_hdmi->write_infoframe = cpt_write_infoframe;
  1420. intel_hdmi->set_infoframes = cpt_set_infoframes;
  1421. intel_hdmi->infoframe_enabled = cpt_infoframe_enabled;
  1422. }
  1423. if (HAS_DDI(dev))
  1424. intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
  1425. else
  1426. intel_connector->get_hw_state = intel_connector_get_hw_state;
  1427. intel_connector->unregister = intel_connector_unregister;
  1428. intel_hdmi_add_properties(intel_hdmi, connector);
  1429. intel_connector_attach_encoder(intel_connector, intel_encoder);
  1430. drm_connector_register(connector);
  1431. /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
  1432. * 0xd. Failure to do so will result in spurious interrupts being
  1433. * generated on the port when a cable is not attached.
  1434. */
  1435. if (IS_G4X(dev) && !IS_GM45(dev)) {
  1436. u32 temp = I915_READ(PEG_BAND_GAP_DATA);
  1437. I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
  1438. }
  1439. }
  1440. void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
  1441. {
  1442. struct intel_digital_port *intel_dig_port;
  1443. struct intel_encoder *intel_encoder;
  1444. struct intel_connector *intel_connector;
  1445. intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
  1446. if (!intel_dig_port)
  1447. return;
  1448. intel_connector = intel_connector_alloc();
  1449. if (!intel_connector) {
  1450. kfree(intel_dig_port);
  1451. return;
  1452. }
  1453. intel_encoder = &intel_dig_port->base;
  1454. drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
  1455. DRM_MODE_ENCODER_TMDS);
  1456. intel_encoder->compute_config = intel_hdmi_compute_config;
  1457. intel_encoder->disable = intel_disable_hdmi;
  1458. intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
  1459. intel_encoder->get_config = intel_hdmi_get_config;
  1460. if (IS_CHERRYVIEW(dev)) {
  1461. intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
  1462. intel_encoder->pre_enable = chv_hdmi_pre_enable;
  1463. intel_encoder->enable = vlv_enable_hdmi;
  1464. intel_encoder->post_disable = chv_hdmi_post_disable;
  1465. } else if (IS_VALLEYVIEW(dev)) {
  1466. intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
  1467. intel_encoder->pre_enable = vlv_hdmi_pre_enable;
  1468. intel_encoder->enable = vlv_enable_hdmi;
  1469. intel_encoder->post_disable = vlv_hdmi_post_disable;
  1470. } else {
  1471. intel_encoder->pre_enable = intel_hdmi_pre_enable;
  1472. intel_encoder->enable = intel_enable_hdmi;
  1473. }
  1474. intel_encoder->type = INTEL_OUTPUT_HDMI;
  1475. if (IS_CHERRYVIEW(dev)) {
  1476. if (port == PORT_D)
  1477. intel_encoder->crtc_mask = 1 << 2;
  1478. else
  1479. intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
  1480. } else {
  1481. intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
  1482. }
  1483. intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
  1484. /*
  1485. * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems
  1486. * to work on real hardware. And since g4x can send infoframes to
  1487. * only one port anyway, nothing is lost by allowing it.
  1488. */
  1489. if (IS_G4X(dev))
  1490. intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
  1491. intel_dig_port->port = port;
  1492. intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
  1493. intel_dig_port->dp.output_reg = 0;
  1494. intel_hdmi_init_connector(intel_dig_port, intel_connector);
  1495. }