intel_hdmi.c 53 KB

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