intel_hdmi.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059
  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 "drmP.h"
  32. #include "drm.h"
  33. #include "drm_crtc.h"
  34. #include "drm_edid.h"
  35. #include "intel_drv.h"
  36. #include "i915_drm.h"
  37. #include "i915_drv.h"
  38. static void
  39. assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
  40. {
  41. struct drm_device *dev = intel_hdmi->base.base.dev;
  42. struct drm_i915_private *dev_priv = dev->dev_private;
  43. uint32_t enabled_bits;
  44. enabled_bits = IS_HASWELL(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
  45. WARN(I915_READ(intel_hdmi->sdvox_reg) & enabled_bits,
  46. "HDMI port enabled, expecting disabled\n");
  47. }
  48. struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
  49. {
  50. return container_of(encoder, struct intel_hdmi, base.base);
  51. }
  52. static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
  53. {
  54. return container_of(intel_attached_encoder(connector),
  55. struct intel_hdmi, base);
  56. }
  57. void intel_dip_infoframe_csum(struct dip_infoframe *frame)
  58. {
  59. uint8_t *data = (uint8_t *)frame;
  60. uint8_t sum = 0;
  61. unsigned i;
  62. frame->checksum = 0;
  63. frame->ecc = 0;
  64. for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++)
  65. sum += data[i];
  66. frame->checksum = 0x100 - sum;
  67. }
  68. static u32 g4x_infoframe_index(struct dip_infoframe *frame)
  69. {
  70. switch (frame->type) {
  71. case DIP_TYPE_AVI:
  72. return VIDEO_DIP_SELECT_AVI;
  73. case DIP_TYPE_SPD:
  74. return VIDEO_DIP_SELECT_SPD;
  75. default:
  76. DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
  77. return 0;
  78. }
  79. }
  80. static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
  81. {
  82. switch (frame->type) {
  83. case DIP_TYPE_AVI:
  84. return VIDEO_DIP_ENABLE_AVI;
  85. case DIP_TYPE_SPD:
  86. return VIDEO_DIP_ENABLE_SPD;
  87. default:
  88. DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
  89. return 0;
  90. }
  91. }
  92. static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
  93. {
  94. switch (frame->type) {
  95. case DIP_TYPE_AVI:
  96. return VIDEO_DIP_ENABLE_AVI_HSW;
  97. case DIP_TYPE_SPD:
  98. return VIDEO_DIP_ENABLE_SPD_HSW;
  99. default:
  100. DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
  101. return 0;
  102. }
  103. }
  104. static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame, enum pipe pipe)
  105. {
  106. switch (frame->type) {
  107. case DIP_TYPE_AVI:
  108. return HSW_TVIDEO_DIP_AVI_DATA(pipe);
  109. case DIP_TYPE_SPD:
  110. return HSW_TVIDEO_DIP_SPD_DATA(pipe);
  111. default:
  112. DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
  113. return 0;
  114. }
  115. }
  116. static void g4x_write_infoframe(struct drm_encoder *encoder,
  117. struct dip_infoframe *frame)
  118. {
  119. uint32_t *data = (uint32_t *)frame;
  120. struct drm_device *dev = encoder->dev;
  121. struct drm_i915_private *dev_priv = dev->dev_private;
  122. u32 val = I915_READ(VIDEO_DIP_CTL);
  123. unsigned i, len = DIP_HEADER_SIZE + frame->len;
  124. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  125. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  126. val |= g4x_infoframe_index(frame);
  127. val &= ~g4x_infoframe_enable(frame);
  128. I915_WRITE(VIDEO_DIP_CTL, val);
  129. mmiowb();
  130. for (i = 0; i < len; i += 4) {
  131. I915_WRITE(VIDEO_DIP_DATA, *data);
  132. data++;
  133. }
  134. /* Write every possible data byte to force correct ECC calculation. */
  135. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  136. I915_WRITE(VIDEO_DIP_DATA, 0);
  137. mmiowb();
  138. val |= g4x_infoframe_enable(frame);
  139. val &= ~VIDEO_DIP_FREQ_MASK;
  140. val |= VIDEO_DIP_FREQ_VSYNC;
  141. I915_WRITE(VIDEO_DIP_CTL, val);
  142. POSTING_READ(VIDEO_DIP_CTL);
  143. }
  144. static void ibx_write_infoframe(struct drm_encoder *encoder,
  145. struct dip_infoframe *frame)
  146. {
  147. uint32_t *data = (uint32_t *)frame;
  148. struct drm_device *dev = encoder->dev;
  149. struct drm_i915_private *dev_priv = dev->dev_private;
  150. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  151. int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  152. unsigned i, len = DIP_HEADER_SIZE + frame->len;
  153. u32 val = I915_READ(reg);
  154. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  155. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  156. val |= g4x_infoframe_index(frame);
  157. val &= ~g4x_infoframe_enable(frame);
  158. I915_WRITE(reg, val);
  159. mmiowb();
  160. for (i = 0; i < len; i += 4) {
  161. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
  162. data++;
  163. }
  164. /* Write every possible data byte to force correct ECC calculation. */
  165. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  166. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
  167. mmiowb();
  168. val |= g4x_infoframe_enable(frame);
  169. val &= ~VIDEO_DIP_FREQ_MASK;
  170. val |= VIDEO_DIP_FREQ_VSYNC;
  171. I915_WRITE(reg, val);
  172. POSTING_READ(reg);
  173. }
  174. static void cpt_write_infoframe(struct drm_encoder *encoder,
  175. struct dip_infoframe *frame)
  176. {
  177. uint32_t *data = (uint32_t *)frame;
  178. struct drm_device *dev = encoder->dev;
  179. struct drm_i915_private *dev_priv = dev->dev_private;
  180. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  181. int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  182. unsigned i, len = DIP_HEADER_SIZE + frame->len;
  183. u32 val = I915_READ(reg);
  184. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  185. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  186. val |= g4x_infoframe_index(frame);
  187. /* The DIP control register spec says that we need to update the AVI
  188. * infoframe without clearing its enable bit */
  189. if (frame->type != DIP_TYPE_AVI)
  190. val &= ~g4x_infoframe_enable(frame);
  191. I915_WRITE(reg, val);
  192. mmiowb();
  193. for (i = 0; i < len; i += 4) {
  194. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
  195. data++;
  196. }
  197. /* Write every possible data byte to force correct ECC calculation. */
  198. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  199. I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
  200. mmiowb();
  201. val |= g4x_infoframe_enable(frame);
  202. val &= ~VIDEO_DIP_FREQ_MASK;
  203. val |= VIDEO_DIP_FREQ_VSYNC;
  204. I915_WRITE(reg, val);
  205. POSTING_READ(reg);
  206. }
  207. static void vlv_write_infoframe(struct drm_encoder *encoder,
  208. struct dip_infoframe *frame)
  209. {
  210. uint32_t *data = (uint32_t *)frame;
  211. struct drm_device *dev = encoder->dev;
  212. struct drm_i915_private *dev_priv = dev->dev_private;
  213. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  214. int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
  215. unsigned i, len = DIP_HEADER_SIZE + frame->len;
  216. u32 val = I915_READ(reg);
  217. WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
  218. val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
  219. val |= g4x_infoframe_index(frame);
  220. val &= ~g4x_infoframe_enable(frame);
  221. I915_WRITE(reg, val);
  222. mmiowb();
  223. for (i = 0; i < len; i += 4) {
  224. I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
  225. data++;
  226. }
  227. /* Write every possible data byte to force correct ECC calculation. */
  228. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  229. I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
  230. mmiowb();
  231. val |= g4x_infoframe_enable(frame);
  232. val &= ~VIDEO_DIP_FREQ_MASK;
  233. val |= VIDEO_DIP_FREQ_VSYNC;
  234. I915_WRITE(reg, val);
  235. POSTING_READ(reg);
  236. }
  237. static void hsw_write_infoframe(struct drm_encoder *encoder,
  238. struct dip_infoframe *frame)
  239. {
  240. uint32_t *data = (uint32_t *)frame;
  241. struct drm_device *dev = encoder->dev;
  242. struct drm_i915_private *dev_priv = dev->dev_private;
  243. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  244. u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
  245. u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->pipe);
  246. unsigned int i, len = DIP_HEADER_SIZE + frame->len;
  247. u32 val = I915_READ(ctl_reg);
  248. if (data_reg == 0)
  249. return;
  250. val &= ~hsw_infoframe_enable(frame);
  251. I915_WRITE(ctl_reg, val);
  252. mmiowb();
  253. for (i = 0; i < len; i += 4) {
  254. I915_WRITE(data_reg + i, *data);
  255. data++;
  256. }
  257. /* Write every possible data byte to force correct ECC calculation. */
  258. for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
  259. I915_WRITE(data_reg + i, 0);
  260. mmiowb();
  261. val |= hsw_infoframe_enable(frame);
  262. I915_WRITE(ctl_reg, val);
  263. POSTING_READ(ctl_reg);
  264. }
  265. static void intel_set_infoframe(struct drm_encoder *encoder,
  266. struct dip_infoframe *frame)
  267. {
  268. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  269. intel_dip_infoframe_csum(frame);
  270. intel_hdmi->write_infoframe(encoder, frame);
  271. }
  272. static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
  273. struct drm_display_mode *adjusted_mode)
  274. {
  275. struct dip_infoframe avi_if = {
  276. .type = DIP_TYPE_AVI,
  277. .ver = DIP_VERSION_AVI,
  278. .len = DIP_LEN_AVI,
  279. };
  280. if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
  281. avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
  282. intel_set_infoframe(encoder, &avi_if);
  283. }
  284. static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
  285. {
  286. struct dip_infoframe spd_if;
  287. memset(&spd_if, 0, sizeof(spd_if));
  288. spd_if.type = DIP_TYPE_SPD;
  289. spd_if.ver = DIP_VERSION_SPD;
  290. spd_if.len = DIP_LEN_SPD;
  291. strcpy(spd_if.body.spd.vn, "Intel");
  292. strcpy(spd_if.body.spd.pd, "Integrated gfx");
  293. spd_if.body.spd.sdi = DIP_SPD_PC;
  294. intel_set_infoframe(encoder, &spd_if);
  295. }
  296. static void g4x_set_infoframes(struct drm_encoder *encoder,
  297. struct drm_display_mode *adjusted_mode)
  298. {
  299. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  300. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  301. u32 reg = VIDEO_DIP_CTL;
  302. u32 val = I915_READ(reg);
  303. u32 port;
  304. assert_hdmi_port_disabled(intel_hdmi);
  305. /* If the registers were not initialized yet, they might be zeroes,
  306. * which means we're selecting the AVI DIP and we're setting its
  307. * frequency to once. This seems to really confuse the HW and make
  308. * things stop working (the register spec says the AVI always needs to
  309. * be sent every VSync). So here we avoid writing to the register more
  310. * than we need and also explicitly select the AVI DIP and explicitly
  311. * set its frequency to every VSync. Avoiding to write it twice seems to
  312. * be enough to solve the problem, but being defensive shouldn't hurt us
  313. * either. */
  314. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  315. if (!intel_hdmi->has_hdmi_sink) {
  316. if (!(val & VIDEO_DIP_ENABLE))
  317. return;
  318. val &= ~VIDEO_DIP_ENABLE;
  319. I915_WRITE(reg, val);
  320. POSTING_READ(reg);
  321. return;
  322. }
  323. switch (intel_hdmi->sdvox_reg) {
  324. case SDVOB:
  325. port = VIDEO_DIP_PORT_B;
  326. break;
  327. case SDVOC:
  328. port = VIDEO_DIP_PORT_C;
  329. break;
  330. default:
  331. BUG();
  332. return;
  333. }
  334. if (port != (val & VIDEO_DIP_PORT_MASK)) {
  335. if (val & VIDEO_DIP_ENABLE) {
  336. val &= ~VIDEO_DIP_ENABLE;
  337. I915_WRITE(reg, val);
  338. POSTING_READ(reg);
  339. }
  340. val &= ~VIDEO_DIP_PORT_MASK;
  341. val |= port;
  342. }
  343. val |= VIDEO_DIP_ENABLE;
  344. val &= ~VIDEO_DIP_ENABLE_VENDOR;
  345. I915_WRITE(reg, val);
  346. POSTING_READ(reg);
  347. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  348. intel_hdmi_set_spd_infoframe(encoder);
  349. }
  350. static void ibx_set_infoframes(struct drm_encoder *encoder,
  351. struct drm_display_mode *adjusted_mode)
  352. {
  353. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  354. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  355. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  356. u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  357. u32 val = I915_READ(reg);
  358. u32 port;
  359. assert_hdmi_port_disabled(intel_hdmi);
  360. /* See the big comment in g4x_set_infoframes() */
  361. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  362. if (!intel_hdmi->has_hdmi_sink) {
  363. if (!(val & VIDEO_DIP_ENABLE))
  364. return;
  365. val &= ~VIDEO_DIP_ENABLE;
  366. I915_WRITE(reg, val);
  367. POSTING_READ(reg);
  368. return;
  369. }
  370. switch (intel_hdmi->sdvox_reg) {
  371. case HDMIB:
  372. port = VIDEO_DIP_PORT_B;
  373. break;
  374. case HDMIC:
  375. port = VIDEO_DIP_PORT_C;
  376. break;
  377. case HDMID:
  378. port = VIDEO_DIP_PORT_D;
  379. break;
  380. default:
  381. BUG();
  382. return;
  383. }
  384. if (port != (val & VIDEO_DIP_PORT_MASK)) {
  385. if (val & VIDEO_DIP_ENABLE) {
  386. val &= ~VIDEO_DIP_ENABLE;
  387. I915_WRITE(reg, val);
  388. POSTING_READ(reg);
  389. }
  390. val &= ~VIDEO_DIP_PORT_MASK;
  391. val |= port;
  392. }
  393. val |= VIDEO_DIP_ENABLE;
  394. val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
  395. VIDEO_DIP_ENABLE_GCP);
  396. I915_WRITE(reg, val);
  397. POSTING_READ(reg);
  398. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  399. intel_hdmi_set_spd_infoframe(encoder);
  400. }
  401. static void cpt_set_infoframes(struct drm_encoder *encoder,
  402. struct drm_display_mode *adjusted_mode)
  403. {
  404. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  405. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  406. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  407. u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
  408. u32 val = I915_READ(reg);
  409. assert_hdmi_port_disabled(intel_hdmi);
  410. /* See the big comment in g4x_set_infoframes() */
  411. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  412. if (!intel_hdmi->has_hdmi_sink) {
  413. if (!(val & VIDEO_DIP_ENABLE))
  414. return;
  415. val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
  416. I915_WRITE(reg, val);
  417. POSTING_READ(reg);
  418. return;
  419. }
  420. /* Set both together, unset both together: see the spec. */
  421. val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
  422. val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
  423. VIDEO_DIP_ENABLE_GCP);
  424. I915_WRITE(reg, val);
  425. POSTING_READ(reg);
  426. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  427. intel_hdmi_set_spd_infoframe(encoder);
  428. }
  429. static void vlv_set_infoframes(struct drm_encoder *encoder,
  430. struct drm_display_mode *adjusted_mode)
  431. {
  432. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  433. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  434. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  435. u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
  436. u32 val = I915_READ(reg);
  437. assert_hdmi_port_disabled(intel_hdmi);
  438. /* See the big comment in g4x_set_infoframes() */
  439. val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
  440. if (!intel_hdmi->has_hdmi_sink) {
  441. if (!(val & VIDEO_DIP_ENABLE))
  442. return;
  443. val &= ~VIDEO_DIP_ENABLE;
  444. I915_WRITE(reg, val);
  445. POSTING_READ(reg);
  446. return;
  447. }
  448. val |= VIDEO_DIP_ENABLE;
  449. val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
  450. VIDEO_DIP_ENABLE_GCP);
  451. I915_WRITE(reg, val);
  452. POSTING_READ(reg);
  453. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  454. intel_hdmi_set_spd_infoframe(encoder);
  455. }
  456. static void hsw_set_infoframes(struct drm_encoder *encoder,
  457. struct drm_display_mode *adjusted_mode)
  458. {
  459. struct drm_i915_private *dev_priv = encoder->dev->dev_private;
  460. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  461. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  462. u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
  463. u32 val = I915_READ(reg);
  464. assert_hdmi_port_disabled(intel_hdmi);
  465. if (!intel_hdmi->has_hdmi_sink) {
  466. I915_WRITE(reg, 0);
  467. POSTING_READ(reg);
  468. return;
  469. }
  470. val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
  471. VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);
  472. I915_WRITE(reg, val);
  473. POSTING_READ(reg);
  474. intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
  475. intel_hdmi_set_spd_infoframe(encoder);
  476. }
  477. static void intel_hdmi_mode_set(struct drm_encoder *encoder,
  478. struct drm_display_mode *mode,
  479. struct drm_display_mode *adjusted_mode)
  480. {
  481. struct drm_device *dev = encoder->dev;
  482. struct drm_i915_private *dev_priv = dev->dev_private;
  483. struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
  484. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
  485. u32 sdvox;
  486. sdvox = SDVO_ENCODING_HDMI;
  487. if (!HAS_PCH_SPLIT(dev))
  488. sdvox |= intel_hdmi->color_range;
  489. if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
  490. sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
  491. if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
  492. sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
  493. if (intel_crtc->bpp > 24)
  494. sdvox |= COLOR_FORMAT_12bpc;
  495. else
  496. sdvox |= COLOR_FORMAT_8bpc;
  497. /* Required on CPT */
  498. if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
  499. sdvox |= HDMI_MODE_SELECT;
  500. if (intel_hdmi->has_audio) {
  501. DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
  502. pipe_name(intel_crtc->pipe));
  503. sdvox |= SDVO_AUDIO_ENABLE;
  504. sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
  505. intel_write_eld(encoder, adjusted_mode);
  506. }
  507. if (HAS_PCH_CPT(dev))
  508. sdvox |= PORT_TRANS_SEL_CPT(intel_crtc->pipe);
  509. else if (intel_crtc->pipe == PIPE_B)
  510. sdvox |= SDVO_PIPE_B_SELECT;
  511. I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
  512. POSTING_READ(intel_hdmi->sdvox_reg);
  513. intel_hdmi->set_infoframes(encoder, adjusted_mode);
  514. }
  515. static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
  516. enum pipe *pipe)
  517. {
  518. struct drm_device *dev = encoder->base.dev;
  519. struct drm_i915_private *dev_priv = dev->dev_private;
  520. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  521. u32 tmp;
  522. tmp = I915_READ(intel_hdmi->sdvox_reg);
  523. if (!(tmp & SDVO_ENABLE))
  524. return false;
  525. if (HAS_PCH_CPT(dev))
  526. *pipe = PORT_TO_PIPE_CPT(tmp);
  527. else
  528. *pipe = PORT_TO_PIPE(tmp);
  529. return true;
  530. }
  531. static void intel_enable_hdmi(struct intel_encoder *encoder)
  532. {
  533. struct drm_device *dev = encoder->base.dev;
  534. struct drm_i915_private *dev_priv = dev->dev_private;
  535. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  536. u32 temp;
  537. u32 enable_bits = SDVO_ENABLE;
  538. if (intel_hdmi->has_audio)
  539. enable_bits |= SDVO_AUDIO_ENABLE;
  540. temp = I915_READ(intel_hdmi->sdvox_reg);
  541. /* HW workaround for IBX, we need to move the port to transcoder A
  542. * before disabling it. */
  543. if (HAS_PCH_IBX(dev)) {
  544. struct drm_crtc *crtc = encoder->base.crtc;
  545. int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
  546. /* Restore the transcoder select bit. */
  547. if (pipe == PIPE_B)
  548. enable_bits |= SDVO_PIPE_B_SELECT;
  549. }
  550. /* HW workaround, need to toggle enable bit off and on for 12bpc, but
  551. * we do this anyway which shows more stable in testing.
  552. */
  553. if (HAS_PCH_SPLIT(dev)) {
  554. I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
  555. POSTING_READ(intel_hdmi->sdvox_reg);
  556. }
  557. temp |= enable_bits;
  558. I915_WRITE(intel_hdmi->sdvox_reg, temp);
  559. POSTING_READ(intel_hdmi->sdvox_reg);
  560. /* HW workaround, need to write this twice for issue that may result
  561. * in first write getting masked.
  562. */
  563. if (HAS_PCH_SPLIT(dev)) {
  564. I915_WRITE(intel_hdmi->sdvox_reg, temp);
  565. POSTING_READ(intel_hdmi->sdvox_reg);
  566. }
  567. }
  568. static void intel_disable_hdmi(struct intel_encoder *encoder)
  569. {
  570. struct drm_device *dev = encoder->base.dev;
  571. struct drm_i915_private *dev_priv = dev->dev_private;
  572. struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
  573. u32 temp;
  574. u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
  575. temp = I915_READ(intel_hdmi->sdvox_reg);
  576. /* HW workaround for IBX, we need to move the port to transcoder A
  577. * before disabling it. */
  578. if (HAS_PCH_IBX(dev)) {
  579. struct drm_crtc *crtc = encoder->base.crtc;
  580. int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
  581. if (temp & SDVO_PIPE_B_SELECT) {
  582. temp &= ~SDVO_PIPE_B_SELECT;
  583. I915_WRITE(intel_hdmi->sdvox_reg, temp);
  584. POSTING_READ(intel_hdmi->sdvox_reg);
  585. /* Again we need to write this twice. */
  586. I915_WRITE(intel_hdmi->sdvox_reg, temp);
  587. POSTING_READ(intel_hdmi->sdvox_reg);
  588. /* Transcoder selection bits only update
  589. * effectively on vblank. */
  590. if (crtc)
  591. intel_wait_for_vblank(dev, pipe);
  592. else
  593. msleep(50);
  594. }
  595. }
  596. /* HW workaround, need to toggle enable bit off and on for 12bpc, but
  597. * we do this anyway which shows more stable in testing.
  598. */
  599. if (HAS_PCH_SPLIT(dev)) {
  600. I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
  601. POSTING_READ(intel_hdmi->sdvox_reg);
  602. }
  603. temp &= ~enable_bits;
  604. I915_WRITE(intel_hdmi->sdvox_reg, temp);
  605. POSTING_READ(intel_hdmi->sdvox_reg);
  606. /* HW workaround, need to write this twice for issue that may result
  607. * in first write getting masked.
  608. */
  609. if (HAS_PCH_SPLIT(dev)) {
  610. I915_WRITE(intel_hdmi->sdvox_reg, temp);
  611. POSTING_READ(intel_hdmi->sdvox_reg);
  612. }
  613. }
  614. static int intel_hdmi_mode_valid(struct drm_connector *connector,
  615. struct drm_display_mode *mode)
  616. {
  617. if (mode->clock > 165000)
  618. return MODE_CLOCK_HIGH;
  619. if (mode->clock < 20000)
  620. return MODE_CLOCK_LOW;
  621. if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
  622. return MODE_NO_DBLESCAN;
  623. return MODE_OK;
  624. }
  625. static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
  626. const struct drm_display_mode *mode,
  627. struct drm_display_mode *adjusted_mode)
  628. {
  629. return true;
  630. }
  631. static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
  632. {
  633. struct drm_device *dev = intel_hdmi->base.base.dev;
  634. struct drm_i915_private *dev_priv = dev->dev_private;
  635. uint32_t bit;
  636. switch (intel_hdmi->sdvox_reg) {
  637. case SDVOB:
  638. bit = HDMIB_HOTPLUG_LIVE_STATUS;
  639. break;
  640. case SDVOC:
  641. bit = HDMIC_HOTPLUG_LIVE_STATUS;
  642. break;
  643. default:
  644. bit = 0;
  645. break;
  646. }
  647. return I915_READ(PORT_HOTPLUG_STAT) & bit;
  648. }
  649. static enum drm_connector_status
  650. intel_hdmi_detect(struct drm_connector *connector, bool force)
  651. {
  652. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  653. struct drm_i915_private *dev_priv = connector->dev->dev_private;
  654. struct edid *edid;
  655. enum drm_connector_status status = connector_status_disconnected;
  656. if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
  657. return status;
  658. intel_hdmi->has_hdmi_sink = false;
  659. intel_hdmi->has_audio = false;
  660. edid = drm_get_edid(connector,
  661. intel_gmbus_get_adapter(dev_priv,
  662. intel_hdmi->ddc_bus));
  663. if (edid) {
  664. if (edid->input & DRM_EDID_INPUT_DIGITAL) {
  665. status = connector_status_connected;
  666. if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
  667. intel_hdmi->has_hdmi_sink =
  668. drm_detect_hdmi_monitor(edid);
  669. intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
  670. }
  671. kfree(edid);
  672. }
  673. if (status == connector_status_connected) {
  674. if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
  675. intel_hdmi->has_audio =
  676. (intel_hdmi->force_audio == HDMI_AUDIO_ON);
  677. }
  678. return status;
  679. }
  680. static int intel_hdmi_get_modes(struct drm_connector *connector)
  681. {
  682. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  683. struct drm_i915_private *dev_priv = connector->dev->dev_private;
  684. /* We should parse the EDID data and find out if it's an HDMI sink so
  685. * we can send audio to it.
  686. */
  687. return intel_ddc_get_modes(connector,
  688. intel_gmbus_get_adapter(dev_priv,
  689. intel_hdmi->ddc_bus));
  690. }
  691. static bool
  692. intel_hdmi_detect_audio(struct drm_connector *connector)
  693. {
  694. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  695. struct drm_i915_private *dev_priv = connector->dev->dev_private;
  696. struct edid *edid;
  697. bool has_audio = false;
  698. edid = drm_get_edid(connector,
  699. intel_gmbus_get_adapter(dev_priv,
  700. intel_hdmi->ddc_bus));
  701. if (edid) {
  702. if (edid->input & DRM_EDID_INPUT_DIGITAL)
  703. has_audio = drm_detect_monitor_audio(edid);
  704. kfree(edid);
  705. }
  706. return has_audio;
  707. }
  708. static int
  709. intel_hdmi_set_property(struct drm_connector *connector,
  710. struct drm_property *property,
  711. uint64_t val)
  712. {
  713. struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
  714. struct drm_i915_private *dev_priv = connector->dev->dev_private;
  715. int ret;
  716. ret = drm_connector_property_set_value(connector, property, val);
  717. if (ret)
  718. return ret;
  719. if (property == dev_priv->force_audio_property) {
  720. enum hdmi_force_audio i = val;
  721. bool has_audio;
  722. if (i == intel_hdmi->force_audio)
  723. return 0;
  724. intel_hdmi->force_audio = i;
  725. if (i == HDMI_AUDIO_AUTO)
  726. has_audio = intel_hdmi_detect_audio(connector);
  727. else
  728. has_audio = (i == HDMI_AUDIO_ON);
  729. if (i == HDMI_AUDIO_OFF_DVI)
  730. intel_hdmi->has_hdmi_sink = 0;
  731. intel_hdmi->has_audio = has_audio;
  732. goto done;
  733. }
  734. if (property == dev_priv->broadcast_rgb_property) {
  735. if (val == !!intel_hdmi->color_range)
  736. return 0;
  737. intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
  738. goto done;
  739. }
  740. return -EINVAL;
  741. done:
  742. if (intel_hdmi->base.base.crtc) {
  743. struct drm_crtc *crtc = intel_hdmi->base.base.crtc;
  744. intel_set_mode(crtc, &crtc->mode,
  745. crtc->x, crtc->y, crtc->fb);
  746. }
  747. return 0;
  748. }
  749. static void intel_hdmi_destroy(struct drm_connector *connector)
  750. {
  751. drm_sysfs_connector_remove(connector);
  752. drm_connector_cleanup(connector);
  753. kfree(connector);
  754. }
  755. static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs_hsw = {
  756. .mode_fixup = intel_hdmi_mode_fixup,
  757. .mode_set = intel_ddi_mode_set,
  758. .disable = intel_encoder_noop,
  759. };
  760. static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
  761. .mode_fixup = intel_hdmi_mode_fixup,
  762. .mode_set = intel_hdmi_mode_set,
  763. .disable = intel_encoder_noop,
  764. };
  765. static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
  766. .dpms = intel_connector_dpms,
  767. .detect = intel_hdmi_detect,
  768. .fill_modes = drm_helper_probe_single_connector_modes,
  769. .set_property = intel_hdmi_set_property,
  770. .destroy = intel_hdmi_destroy,
  771. };
  772. static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
  773. .get_modes = intel_hdmi_get_modes,
  774. .mode_valid = intel_hdmi_mode_valid,
  775. .best_encoder = intel_best_encoder,
  776. };
  777. static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
  778. .destroy = intel_encoder_destroy,
  779. };
  780. static void
  781. intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
  782. {
  783. intel_attach_force_audio_property(connector);
  784. intel_attach_broadcast_rgb_property(connector);
  785. }
  786. void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
  787. {
  788. struct drm_i915_private *dev_priv = dev->dev_private;
  789. struct drm_connector *connector;
  790. struct intel_encoder *intel_encoder;
  791. struct intel_connector *intel_connector;
  792. struct intel_hdmi *intel_hdmi;
  793. intel_hdmi = kzalloc(sizeof(struct intel_hdmi), GFP_KERNEL);
  794. if (!intel_hdmi)
  795. return;
  796. intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
  797. if (!intel_connector) {
  798. kfree(intel_hdmi);
  799. return;
  800. }
  801. intel_encoder = &intel_hdmi->base;
  802. drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
  803. DRM_MODE_ENCODER_TMDS);
  804. connector = &intel_connector->base;
  805. drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
  806. DRM_MODE_CONNECTOR_HDMIA);
  807. drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
  808. intel_encoder->type = INTEL_OUTPUT_HDMI;
  809. connector->polled = DRM_CONNECTOR_POLL_HPD;
  810. connector->interlace_allowed = 1;
  811. connector->doublescan_allowed = 0;
  812. intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
  813. intel_encoder->cloneable = false;
  814. intel_hdmi->ddi_port = port;
  815. switch (port) {
  816. case PORT_B:
  817. intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
  818. dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
  819. break;
  820. case PORT_C:
  821. intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
  822. dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
  823. break;
  824. case PORT_D:
  825. intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
  826. dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
  827. break;
  828. case PORT_A:
  829. /* Internal port only for eDP. */
  830. default:
  831. BUG();
  832. }
  833. intel_hdmi->sdvox_reg = sdvox_reg;
  834. if (!HAS_PCH_SPLIT(dev)) {
  835. intel_hdmi->write_infoframe = g4x_write_infoframe;
  836. intel_hdmi->set_infoframes = g4x_set_infoframes;
  837. } else if (IS_VALLEYVIEW(dev)) {
  838. intel_hdmi->write_infoframe = vlv_write_infoframe;
  839. intel_hdmi->set_infoframes = vlv_set_infoframes;
  840. } else if (IS_HASWELL(dev)) {
  841. intel_hdmi->write_infoframe = hsw_write_infoframe;
  842. intel_hdmi->set_infoframes = hsw_set_infoframes;
  843. } else if (HAS_PCH_IBX(dev)) {
  844. intel_hdmi->write_infoframe = ibx_write_infoframe;
  845. intel_hdmi->set_infoframes = ibx_set_infoframes;
  846. } else {
  847. intel_hdmi->write_infoframe = cpt_write_infoframe;
  848. intel_hdmi->set_infoframes = cpt_set_infoframes;
  849. }
  850. if (IS_HASWELL(dev)) {
  851. intel_encoder->enable = intel_enable_ddi;
  852. intel_encoder->disable = intel_disable_ddi;
  853. intel_encoder->get_hw_state = intel_ddi_get_hw_state;
  854. drm_encoder_helper_add(&intel_encoder->base,
  855. &intel_hdmi_helper_funcs_hsw);
  856. } else {
  857. intel_encoder->enable = intel_enable_hdmi;
  858. intel_encoder->disable = intel_disable_hdmi;
  859. intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
  860. drm_encoder_helper_add(&intel_encoder->base,
  861. &intel_hdmi_helper_funcs);
  862. }
  863. intel_connector->get_hw_state = intel_connector_get_hw_state;
  864. intel_hdmi_add_properties(intel_hdmi, connector);
  865. intel_connector_attach_encoder(intel_connector, intel_encoder);
  866. drm_sysfs_connector_add(connector);
  867. /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
  868. * 0xd. Failure to do so will result in spurious interrupts being
  869. * generated on the port when a cable is not attached.
  870. */
  871. if (IS_G4X(dev) && !IS_GM45(dev)) {
  872. u32 temp = I915_READ(PEG_BAND_GAP_DATA);
  873. I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
  874. }
  875. }