Home | History | Annotate | Line # | Download | only in display
      1  1.5  riastrad /*	$NetBSD: intel_hdmi.c,v 1.5 2021/12/19 11:46:19 riastradh Exp $	*/
      2  1.1  riastrad 
      3  1.1  riastrad /*
      4  1.1  riastrad  * Copyright 2006 Dave Airlie <airlied (at) linux.ie>
      5  1.1  riastrad  * Copyright  2006-2009 Intel Corporation
      6  1.1  riastrad  *
      7  1.1  riastrad  * Permission is hereby granted, free of charge, to any person obtaining a
      8  1.1  riastrad  * copy of this software and associated documentation files (the "Software"),
      9  1.1  riastrad  * to deal in the Software without restriction, including without limitation
     10  1.1  riastrad  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  1.1  riastrad  * and/or sell copies of the Software, and to permit persons to whom the
     12  1.1  riastrad  * Software is furnished to do so, subject to the following conditions:
     13  1.1  riastrad  *
     14  1.1  riastrad  * The above copyright notice and this permission notice (including the next
     15  1.1  riastrad  * paragraph) shall be included in all copies or substantial portions of the
     16  1.1  riastrad  * Software.
     17  1.1  riastrad  *
     18  1.1  riastrad  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     19  1.1  riastrad  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  1.1  riastrad  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     21  1.1  riastrad  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     22  1.1  riastrad  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     23  1.1  riastrad  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     24  1.1  riastrad  * DEALINGS IN THE SOFTWARE.
     25  1.1  riastrad  *
     26  1.1  riastrad  * Authors:
     27  1.1  riastrad  *	Eric Anholt <eric (at) anholt.net>
     28  1.1  riastrad  *	Jesse Barnes <jesse.barnes (at) intel.com>
     29  1.1  riastrad  */
     30  1.1  riastrad 
     31  1.1  riastrad #include <sys/cdefs.h>
     32  1.5  riastrad __KERNEL_RCSID(0, "$NetBSD: intel_hdmi.c,v 1.5 2021/12/19 11:46:19 riastradh Exp $");
     33  1.1  riastrad 
     34  1.1  riastrad #include <linux/delay.h>
     35  1.1  riastrad #include <linux/hdmi.h>
     36  1.1  riastrad #include <linux/i2c.h>
     37  1.1  riastrad #include <linux/slab.h>
     38  1.1  riastrad 
     39  1.1  riastrad #include <drm/drm_atomic_helper.h>
     40  1.1  riastrad #include <drm/drm_crtc.h>
     41  1.1  riastrad #include <drm/drm_edid.h>
     42  1.1  riastrad #include <drm/drm_hdcp.h>
     43  1.1  riastrad #include <drm/drm_scdc_helper.h>
     44  1.1  riastrad #include <drm/i915_drm.h>
     45  1.1  riastrad #include <drm/intel_lpe_audio.h>
     46  1.1  riastrad 
     47  1.1  riastrad #include "i915_debugfs.h"
     48  1.1  riastrad #include "i915_drv.h"
     49  1.1  riastrad #include "intel_atomic.h"
     50  1.1  riastrad #include "intel_audio.h"
     51  1.1  riastrad #include "intel_connector.h"
     52  1.1  riastrad #include "intel_ddi.h"
     53  1.1  riastrad #include "intel_display_types.h"
     54  1.1  riastrad #include "intel_dp.h"
     55  1.1  riastrad #include "intel_dpio_phy.h"
     56  1.1  riastrad #include "intel_fifo_underrun.h"
     57  1.1  riastrad #include "intel_gmbus.h"
     58  1.1  riastrad #include "intel_hdcp.h"
     59  1.1  riastrad #include "intel_hdmi.h"
     60  1.1  riastrad #include "intel_hotplug.h"
     61  1.1  riastrad #include "intel_lspcon.h"
     62  1.1  riastrad #include "intel_panel.h"
     63  1.1  riastrad #include "intel_sdvo.h"
     64  1.1  riastrad #include "intel_sideband.h"
     65  1.1  riastrad 
     66  1.1  riastrad static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
     67  1.1  riastrad {
     68  1.1  riastrad 	return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
     69  1.1  riastrad }
     70  1.1  riastrad 
     71  1.1  riastrad static void
     72  1.1  riastrad assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
     73  1.1  riastrad {
     74  1.1  riastrad 	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
     75  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
     76  1.1  riastrad 	u32 enabled_bits;
     77  1.1  riastrad 
     78  1.1  riastrad 	enabled_bits = HAS_DDI(dev_priv) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
     79  1.1  riastrad 
     80  1.1  riastrad 	WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
     81  1.1  riastrad 	     "HDMI port enabled, expecting disabled\n");
     82  1.1  riastrad }
     83  1.1  riastrad 
     84  1.1  riastrad static void
     85  1.1  riastrad assert_hdmi_transcoder_func_disabled(struct drm_i915_private *dev_priv,
     86  1.1  riastrad 				     enum transcoder cpu_transcoder)
     87  1.1  riastrad {
     88  1.1  riastrad 	WARN(I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder)) &
     89  1.1  riastrad 	     TRANS_DDI_FUNC_ENABLE,
     90  1.1  riastrad 	     "HDMI transcoder function enabled, expecting disabled\n");
     91  1.1  riastrad }
     92  1.1  riastrad 
     93  1.1  riastrad struct intel_hdmi *enc_to_intel_hdmi(struct intel_encoder *encoder)
     94  1.1  riastrad {
     95  1.1  riastrad 	struct intel_digital_port *intel_dig_port =
     96  1.1  riastrad 		container_of(&encoder->base, struct intel_digital_port,
     97  1.1  riastrad 			     base.base);
     98  1.1  riastrad 	return &intel_dig_port->hdmi;
     99  1.1  riastrad }
    100  1.1  riastrad 
    101  1.1  riastrad static struct intel_hdmi *intel_attached_hdmi(struct intel_connector *connector)
    102  1.1  riastrad {
    103  1.1  riastrad 	return enc_to_intel_hdmi(intel_attached_encoder(connector));
    104  1.1  riastrad }
    105  1.1  riastrad 
    106  1.1  riastrad static u32 g4x_infoframe_index(unsigned int type)
    107  1.1  riastrad {
    108  1.1  riastrad 	switch (type) {
    109  1.1  riastrad 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
    110  1.1  riastrad 		return VIDEO_DIP_SELECT_GAMUT;
    111  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_AVI:
    112  1.1  riastrad 		return VIDEO_DIP_SELECT_AVI;
    113  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_SPD:
    114  1.1  riastrad 		return VIDEO_DIP_SELECT_SPD;
    115  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_VENDOR:
    116  1.1  riastrad 		return VIDEO_DIP_SELECT_VENDOR;
    117  1.1  riastrad 	default:
    118  1.1  riastrad 		MISSING_CASE(type);
    119  1.1  riastrad 		return 0;
    120  1.1  riastrad 	}
    121  1.1  riastrad }
    122  1.1  riastrad 
    123  1.1  riastrad static u32 g4x_infoframe_enable(unsigned int type)
    124  1.1  riastrad {
    125  1.1  riastrad 	switch (type) {
    126  1.1  riastrad 	case HDMI_PACKET_TYPE_GENERAL_CONTROL:
    127  1.1  riastrad 		return VIDEO_DIP_ENABLE_GCP;
    128  1.1  riastrad 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
    129  1.1  riastrad 		return VIDEO_DIP_ENABLE_GAMUT;
    130  1.1  riastrad 	case DP_SDP_VSC:
    131  1.1  riastrad 		return 0;
    132  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_AVI:
    133  1.1  riastrad 		return VIDEO_DIP_ENABLE_AVI;
    134  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_SPD:
    135  1.1  riastrad 		return VIDEO_DIP_ENABLE_SPD;
    136  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_VENDOR:
    137  1.1  riastrad 		return VIDEO_DIP_ENABLE_VENDOR;
    138  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_DRM:
    139  1.1  riastrad 		return 0;
    140  1.1  riastrad 	default:
    141  1.1  riastrad 		MISSING_CASE(type);
    142  1.1  riastrad 		return 0;
    143  1.1  riastrad 	}
    144  1.1  riastrad }
    145  1.1  riastrad 
    146  1.1  riastrad static u32 hsw_infoframe_enable(unsigned int type)
    147  1.1  riastrad {
    148  1.1  riastrad 	switch (type) {
    149  1.1  riastrad 	case HDMI_PACKET_TYPE_GENERAL_CONTROL:
    150  1.1  riastrad 		return VIDEO_DIP_ENABLE_GCP_HSW;
    151  1.1  riastrad 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
    152  1.1  riastrad 		return VIDEO_DIP_ENABLE_GMP_HSW;
    153  1.1  riastrad 	case DP_SDP_VSC:
    154  1.1  riastrad 		return VIDEO_DIP_ENABLE_VSC_HSW;
    155  1.1  riastrad 	case DP_SDP_PPS:
    156  1.1  riastrad 		return VDIP_ENABLE_PPS;
    157  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_AVI:
    158  1.1  riastrad 		return VIDEO_DIP_ENABLE_AVI_HSW;
    159  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_SPD:
    160  1.1  riastrad 		return VIDEO_DIP_ENABLE_SPD_HSW;
    161  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_VENDOR:
    162  1.1  riastrad 		return VIDEO_DIP_ENABLE_VS_HSW;
    163  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_DRM:
    164  1.1  riastrad 		return VIDEO_DIP_ENABLE_DRM_GLK;
    165  1.1  riastrad 	default:
    166  1.1  riastrad 		MISSING_CASE(type);
    167  1.1  riastrad 		return 0;
    168  1.1  riastrad 	}
    169  1.1  riastrad }
    170  1.1  riastrad 
    171  1.1  riastrad static i915_reg_t
    172  1.1  riastrad hsw_dip_data_reg(struct drm_i915_private *dev_priv,
    173  1.1  riastrad 		 enum transcoder cpu_transcoder,
    174  1.1  riastrad 		 unsigned int type,
    175  1.1  riastrad 		 int i)
    176  1.1  riastrad {
    177  1.1  riastrad 	switch (type) {
    178  1.1  riastrad 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
    179  1.1  riastrad 		return HSW_TVIDEO_DIP_GMP_DATA(cpu_transcoder, i);
    180  1.1  riastrad 	case DP_SDP_VSC:
    181  1.1  riastrad 		return HSW_TVIDEO_DIP_VSC_DATA(cpu_transcoder, i);
    182  1.1  riastrad 	case DP_SDP_PPS:
    183  1.1  riastrad 		return ICL_VIDEO_DIP_PPS_DATA(cpu_transcoder, i);
    184  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_AVI:
    185  1.1  riastrad 		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder, i);
    186  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_SPD:
    187  1.1  riastrad 		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
    188  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_VENDOR:
    189  1.1  riastrad 		return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
    190  1.1  riastrad 	case HDMI_INFOFRAME_TYPE_DRM:
    191  1.1  riastrad 		return GLK_TVIDEO_DIP_DRM_DATA(cpu_transcoder, i);
    192  1.1  riastrad 	default:
    193  1.1  riastrad 		MISSING_CASE(type);
    194  1.1  riastrad 		return INVALID_MMIO_REG;
    195  1.1  riastrad 	}
    196  1.1  riastrad }
    197  1.1  riastrad 
    198  1.1  riastrad static int hsw_dip_data_size(struct drm_i915_private *dev_priv,
    199  1.1  riastrad 			     unsigned int type)
    200  1.1  riastrad {
    201  1.1  riastrad 	switch (type) {
    202  1.1  riastrad 	case DP_SDP_VSC:
    203  1.1  riastrad 		return VIDEO_DIP_VSC_DATA_SIZE;
    204  1.1  riastrad 	case DP_SDP_PPS:
    205  1.1  riastrad 		return VIDEO_DIP_PPS_DATA_SIZE;
    206  1.1  riastrad 	case HDMI_PACKET_TYPE_GAMUT_METADATA:
    207  1.1  riastrad 		if (INTEL_GEN(dev_priv) >= 11)
    208  1.1  riastrad 			return VIDEO_DIP_GMP_DATA_SIZE;
    209  1.1  riastrad 		else
    210  1.1  riastrad 			return VIDEO_DIP_DATA_SIZE;
    211  1.1  riastrad 	default:
    212  1.1  riastrad 		return VIDEO_DIP_DATA_SIZE;
    213  1.1  riastrad 	}
    214  1.1  riastrad }
    215  1.1  riastrad 
    216  1.1  riastrad static void g4x_write_infoframe(struct intel_encoder *encoder,
    217  1.1  riastrad 				const struct intel_crtc_state *crtc_state,
    218  1.1  riastrad 				unsigned int type,
    219  1.1  riastrad 				const void *frame, ssize_t len)
    220  1.1  riastrad {
    221  1.1  riastrad 	const u32 *data = frame;
    222  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    223  1.1  riastrad 	u32 val = I915_READ(VIDEO_DIP_CTL);
    224  1.1  riastrad 	int i;
    225  1.1  riastrad 
    226  1.1  riastrad 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
    227  1.1  riastrad 
    228  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    229  1.1  riastrad 	val |= g4x_infoframe_index(type);
    230  1.1  riastrad 
    231  1.1  riastrad 	val &= ~g4x_infoframe_enable(type);
    232  1.1  riastrad 
    233  1.1  riastrad 	I915_WRITE(VIDEO_DIP_CTL, val);
    234  1.1  riastrad 
    235  1.1  riastrad 	for (i = 0; i < len; i += 4) {
    236  1.1  riastrad 		I915_WRITE(VIDEO_DIP_DATA, *data);
    237  1.1  riastrad 		data++;
    238  1.1  riastrad 	}
    239  1.1  riastrad 	/* Write every possible data byte to force correct ECC calculation. */
    240  1.1  riastrad 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
    241  1.1  riastrad 		I915_WRITE(VIDEO_DIP_DATA, 0);
    242  1.1  riastrad 
    243  1.1  riastrad 	val |= g4x_infoframe_enable(type);
    244  1.1  riastrad 	val &= ~VIDEO_DIP_FREQ_MASK;
    245  1.1  riastrad 	val |= VIDEO_DIP_FREQ_VSYNC;
    246  1.1  riastrad 
    247  1.1  riastrad 	I915_WRITE(VIDEO_DIP_CTL, val);
    248  1.1  riastrad 	POSTING_READ(VIDEO_DIP_CTL);
    249  1.1  riastrad }
    250  1.1  riastrad 
    251  1.1  riastrad static void g4x_read_infoframe(struct intel_encoder *encoder,
    252  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
    253  1.1  riastrad 			       unsigned int type,
    254  1.1  riastrad 			       void *frame, ssize_t len)
    255  1.1  riastrad {
    256  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    257  1.1  riastrad 	u32 val, *data = frame;
    258  1.1  riastrad 	int i;
    259  1.1  riastrad 
    260  1.1  riastrad 	val = I915_READ(VIDEO_DIP_CTL);
    261  1.1  riastrad 
    262  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    263  1.1  riastrad 	val |= g4x_infoframe_index(type);
    264  1.1  riastrad 
    265  1.1  riastrad 	I915_WRITE(VIDEO_DIP_CTL, val);
    266  1.1  riastrad 
    267  1.1  riastrad 	for (i = 0; i < len; i += 4)
    268  1.1  riastrad 		*data++ = I915_READ(VIDEO_DIP_DATA);
    269  1.1  riastrad }
    270  1.1  riastrad 
    271  1.1  riastrad static u32 g4x_infoframes_enabled(struct intel_encoder *encoder,
    272  1.1  riastrad 				  const struct intel_crtc_state *pipe_config)
    273  1.1  riastrad {
    274  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    275  1.1  riastrad 	u32 val = I915_READ(VIDEO_DIP_CTL);
    276  1.1  riastrad 
    277  1.1  riastrad 	if ((val & VIDEO_DIP_ENABLE) == 0)
    278  1.1  riastrad 		return 0;
    279  1.1  riastrad 
    280  1.1  riastrad 	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
    281  1.1  riastrad 		return 0;
    282  1.1  riastrad 
    283  1.1  riastrad 	return val & (VIDEO_DIP_ENABLE_AVI |
    284  1.1  riastrad 		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
    285  1.1  riastrad }
    286  1.1  riastrad 
    287  1.1  riastrad static void ibx_write_infoframe(struct intel_encoder *encoder,
    288  1.1  riastrad 				const struct intel_crtc_state *crtc_state,
    289  1.1  riastrad 				unsigned int type,
    290  1.1  riastrad 				const void *frame, ssize_t len)
    291  1.1  riastrad {
    292  1.1  riastrad 	const u32 *data = frame;
    293  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    294  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
    295  1.1  riastrad 	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
    296  1.1  riastrad 	u32 val = I915_READ(reg);
    297  1.1  riastrad 	int i;
    298  1.1  riastrad 
    299  1.1  riastrad 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
    300  1.1  riastrad 
    301  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    302  1.1  riastrad 	val |= g4x_infoframe_index(type);
    303  1.1  riastrad 
    304  1.1  riastrad 	val &= ~g4x_infoframe_enable(type);
    305  1.1  riastrad 
    306  1.1  riastrad 	I915_WRITE(reg, val);
    307  1.1  riastrad 
    308  1.1  riastrad 	for (i = 0; i < len; i += 4) {
    309  1.1  riastrad 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
    310  1.1  riastrad 		data++;
    311  1.1  riastrad 	}
    312  1.1  riastrad 	/* Write every possible data byte to force correct ECC calculation. */
    313  1.1  riastrad 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
    314  1.1  riastrad 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
    315  1.1  riastrad 
    316  1.1  riastrad 	val |= g4x_infoframe_enable(type);
    317  1.1  riastrad 	val &= ~VIDEO_DIP_FREQ_MASK;
    318  1.1  riastrad 	val |= VIDEO_DIP_FREQ_VSYNC;
    319  1.1  riastrad 
    320  1.1  riastrad 	I915_WRITE(reg, val);
    321  1.1  riastrad 	POSTING_READ(reg);
    322  1.1  riastrad }
    323  1.1  riastrad 
    324  1.1  riastrad static void ibx_read_infoframe(struct intel_encoder *encoder,
    325  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
    326  1.1  riastrad 			       unsigned int type,
    327  1.1  riastrad 			       void *frame, ssize_t len)
    328  1.1  riastrad {
    329  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    330  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    331  1.1  riastrad 	u32 val, *data = frame;
    332  1.1  riastrad 	int i;
    333  1.1  riastrad 
    334  1.1  riastrad 	val = I915_READ(TVIDEO_DIP_CTL(crtc->pipe));
    335  1.1  riastrad 
    336  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    337  1.1  riastrad 	val |= g4x_infoframe_index(type);
    338  1.1  riastrad 
    339  1.1  riastrad 	I915_WRITE(TVIDEO_DIP_CTL(crtc->pipe), val);
    340  1.1  riastrad 
    341  1.1  riastrad 	for (i = 0; i < len; i += 4)
    342  1.1  riastrad 		*data++ = I915_READ(TVIDEO_DIP_DATA(crtc->pipe));
    343  1.1  riastrad }
    344  1.1  riastrad 
    345  1.1  riastrad static u32 ibx_infoframes_enabled(struct intel_encoder *encoder,
    346  1.1  riastrad 				  const struct intel_crtc_state *pipe_config)
    347  1.1  riastrad {
    348  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    349  1.1  riastrad 	enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
    350  1.1  riastrad 	i915_reg_t reg = TVIDEO_DIP_CTL(pipe);
    351  1.1  riastrad 	u32 val = I915_READ(reg);
    352  1.1  riastrad 
    353  1.1  riastrad 	if ((val & VIDEO_DIP_ENABLE) == 0)
    354  1.1  riastrad 		return 0;
    355  1.1  riastrad 
    356  1.1  riastrad 	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
    357  1.1  riastrad 		return 0;
    358  1.1  riastrad 
    359  1.1  riastrad 	return val & (VIDEO_DIP_ENABLE_AVI |
    360  1.1  riastrad 		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
    361  1.1  riastrad 		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
    362  1.1  riastrad }
    363  1.1  riastrad 
    364  1.1  riastrad static void cpt_write_infoframe(struct intel_encoder *encoder,
    365  1.1  riastrad 				const struct intel_crtc_state *crtc_state,
    366  1.1  riastrad 				unsigned int type,
    367  1.1  riastrad 				const void *frame, ssize_t len)
    368  1.1  riastrad {
    369  1.1  riastrad 	const u32 *data = frame;
    370  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    371  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
    372  1.1  riastrad 	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
    373  1.1  riastrad 	u32 val = I915_READ(reg);
    374  1.1  riastrad 	int i;
    375  1.1  riastrad 
    376  1.1  riastrad 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
    377  1.1  riastrad 
    378  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    379  1.1  riastrad 	val |= g4x_infoframe_index(type);
    380  1.1  riastrad 
    381  1.1  riastrad 	/* The DIP control register spec says that we need to update the AVI
    382  1.1  riastrad 	 * infoframe without clearing its enable bit */
    383  1.1  riastrad 	if (type != HDMI_INFOFRAME_TYPE_AVI)
    384  1.1  riastrad 		val &= ~g4x_infoframe_enable(type);
    385  1.1  riastrad 
    386  1.1  riastrad 	I915_WRITE(reg, val);
    387  1.1  riastrad 
    388  1.1  riastrad 	for (i = 0; i < len; i += 4) {
    389  1.1  riastrad 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
    390  1.1  riastrad 		data++;
    391  1.1  riastrad 	}
    392  1.1  riastrad 	/* Write every possible data byte to force correct ECC calculation. */
    393  1.1  riastrad 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
    394  1.1  riastrad 		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
    395  1.1  riastrad 
    396  1.1  riastrad 	val |= g4x_infoframe_enable(type);
    397  1.1  riastrad 	val &= ~VIDEO_DIP_FREQ_MASK;
    398  1.1  riastrad 	val |= VIDEO_DIP_FREQ_VSYNC;
    399  1.1  riastrad 
    400  1.1  riastrad 	I915_WRITE(reg, val);
    401  1.1  riastrad 	POSTING_READ(reg);
    402  1.1  riastrad }
    403  1.1  riastrad 
    404  1.1  riastrad static void cpt_read_infoframe(struct intel_encoder *encoder,
    405  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
    406  1.1  riastrad 			       unsigned int type,
    407  1.1  riastrad 			       void *frame, ssize_t len)
    408  1.1  riastrad {
    409  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    410  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    411  1.1  riastrad 	u32 val, *data = frame;
    412  1.1  riastrad 	int i;
    413  1.1  riastrad 
    414  1.1  riastrad 	val = I915_READ(TVIDEO_DIP_CTL(crtc->pipe));
    415  1.1  riastrad 
    416  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    417  1.1  riastrad 	val |= g4x_infoframe_index(type);
    418  1.1  riastrad 
    419  1.1  riastrad 	I915_WRITE(TVIDEO_DIP_CTL(crtc->pipe), val);
    420  1.1  riastrad 
    421  1.1  riastrad 	for (i = 0; i < len; i += 4)
    422  1.1  riastrad 		*data++ = I915_READ(TVIDEO_DIP_DATA(crtc->pipe));
    423  1.1  riastrad }
    424  1.1  riastrad 
    425  1.1  riastrad static u32 cpt_infoframes_enabled(struct intel_encoder *encoder,
    426  1.1  riastrad 				  const struct intel_crtc_state *pipe_config)
    427  1.1  riastrad {
    428  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    429  1.1  riastrad 	enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
    430  1.1  riastrad 	u32 val = I915_READ(TVIDEO_DIP_CTL(pipe));
    431  1.1  riastrad 
    432  1.1  riastrad 	if ((val & VIDEO_DIP_ENABLE) == 0)
    433  1.1  riastrad 		return 0;
    434  1.1  riastrad 
    435  1.1  riastrad 	return val & (VIDEO_DIP_ENABLE_AVI |
    436  1.1  riastrad 		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
    437  1.1  riastrad 		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
    438  1.1  riastrad }
    439  1.1  riastrad 
    440  1.1  riastrad static void vlv_write_infoframe(struct intel_encoder *encoder,
    441  1.1  riastrad 				const struct intel_crtc_state *crtc_state,
    442  1.1  riastrad 				unsigned int type,
    443  1.1  riastrad 				const void *frame, ssize_t len)
    444  1.1  riastrad {
    445  1.1  riastrad 	const u32 *data = frame;
    446  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    447  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
    448  1.1  riastrad 	i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
    449  1.1  riastrad 	u32 val = I915_READ(reg);
    450  1.1  riastrad 	int i;
    451  1.1  riastrad 
    452  1.1  riastrad 	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
    453  1.1  riastrad 
    454  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    455  1.1  riastrad 	val |= g4x_infoframe_index(type);
    456  1.1  riastrad 
    457  1.1  riastrad 	val &= ~g4x_infoframe_enable(type);
    458  1.1  riastrad 
    459  1.1  riastrad 	I915_WRITE(reg, val);
    460  1.1  riastrad 
    461  1.1  riastrad 	for (i = 0; i < len; i += 4) {
    462  1.1  riastrad 		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
    463  1.1  riastrad 		data++;
    464  1.1  riastrad 	}
    465  1.1  riastrad 	/* Write every possible data byte to force correct ECC calculation. */
    466  1.1  riastrad 	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
    467  1.1  riastrad 		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
    468  1.1  riastrad 
    469  1.1  riastrad 	val |= g4x_infoframe_enable(type);
    470  1.1  riastrad 	val &= ~VIDEO_DIP_FREQ_MASK;
    471  1.1  riastrad 	val |= VIDEO_DIP_FREQ_VSYNC;
    472  1.1  riastrad 
    473  1.1  riastrad 	I915_WRITE(reg, val);
    474  1.1  riastrad 	POSTING_READ(reg);
    475  1.1  riastrad }
    476  1.1  riastrad 
    477  1.1  riastrad static void vlv_read_infoframe(struct intel_encoder *encoder,
    478  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
    479  1.1  riastrad 			       unsigned int type,
    480  1.1  riastrad 			       void *frame, ssize_t len)
    481  1.1  riastrad {
    482  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    483  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    484  1.1  riastrad 	u32 val, *data = frame;
    485  1.1  riastrad 	int i;
    486  1.1  riastrad 
    487  1.1  riastrad 	val = I915_READ(VLV_TVIDEO_DIP_CTL(crtc->pipe));
    488  1.1  riastrad 
    489  1.1  riastrad 	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
    490  1.1  riastrad 	val |= g4x_infoframe_index(type);
    491  1.1  riastrad 
    492  1.1  riastrad 	I915_WRITE(VLV_TVIDEO_DIP_CTL(crtc->pipe), val);
    493  1.1  riastrad 
    494  1.1  riastrad 	for (i = 0; i < len; i += 4)
    495  1.1  riastrad 		*data++ = I915_READ(VLV_TVIDEO_DIP_DATA(crtc->pipe));
    496  1.1  riastrad }
    497  1.1  riastrad 
    498  1.1  riastrad static u32 vlv_infoframes_enabled(struct intel_encoder *encoder,
    499  1.1  riastrad 				  const struct intel_crtc_state *pipe_config)
    500  1.1  riastrad {
    501  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    502  1.1  riastrad 	enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
    503  1.1  riastrad 	u32 val = I915_READ(VLV_TVIDEO_DIP_CTL(pipe));
    504  1.1  riastrad 
    505  1.1  riastrad 	if ((val & VIDEO_DIP_ENABLE) == 0)
    506  1.1  riastrad 		return 0;
    507  1.1  riastrad 
    508  1.1  riastrad 	if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
    509  1.1  riastrad 		return 0;
    510  1.1  riastrad 
    511  1.1  riastrad 	return val & (VIDEO_DIP_ENABLE_AVI |
    512  1.1  riastrad 		      VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
    513  1.1  riastrad 		      VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
    514  1.1  riastrad }
    515  1.1  riastrad 
    516  1.1  riastrad static void hsw_write_infoframe(struct intel_encoder *encoder,
    517  1.1  riastrad 				const struct intel_crtc_state *crtc_state,
    518  1.1  riastrad 				unsigned int type,
    519  1.1  riastrad 				const void *frame, ssize_t len)
    520  1.1  riastrad {
    521  1.1  riastrad 	const u32 *data = frame;
    522  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    523  1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    524  1.1  riastrad 	i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
    525  1.1  riastrad 	int data_size;
    526  1.1  riastrad 	int i;
    527  1.1  riastrad 	u32 val = I915_READ(ctl_reg);
    528  1.1  riastrad 
    529  1.1  riastrad 	data_size = hsw_dip_data_size(dev_priv, type);
    530  1.1  riastrad 
    531  1.1  riastrad 	WARN_ON(len > data_size);
    532  1.1  riastrad 
    533  1.1  riastrad 	val &= ~hsw_infoframe_enable(type);
    534  1.1  riastrad 	I915_WRITE(ctl_reg, val);
    535  1.1  riastrad 
    536  1.1  riastrad 	for (i = 0; i < len; i += 4) {
    537  1.1  riastrad 		I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
    538  1.1  riastrad 					    type, i >> 2), *data);
    539  1.1  riastrad 		data++;
    540  1.1  riastrad 	}
    541  1.1  riastrad 	/* Write every possible data byte to force correct ECC calculation. */
    542  1.1  riastrad 	for (; i < data_size; i += 4)
    543  1.1  riastrad 		I915_WRITE(hsw_dip_data_reg(dev_priv, cpu_transcoder,
    544  1.1  riastrad 					    type, i >> 2), 0);
    545  1.1  riastrad 
    546  1.1  riastrad 	val |= hsw_infoframe_enable(type);
    547  1.1  riastrad 	I915_WRITE(ctl_reg, val);
    548  1.1  riastrad 	POSTING_READ(ctl_reg);
    549  1.1  riastrad }
    550  1.1  riastrad 
    551  1.1  riastrad static void hsw_read_infoframe(struct intel_encoder *encoder,
    552  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
    553  1.1  riastrad 			       unsigned int type,
    554  1.1  riastrad 			       void *frame, ssize_t len)
    555  1.1  riastrad {
    556  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    557  1.1  riastrad 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
    558  1.3  riastrad 	u32 val __unused, *data = frame;
    559  1.1  riastrad 	int i;
    560  1.1  riastrad 
    561  1.1  riastrad 	val = I915_READ(HSW_TVIDEO_DIP_CTL(cpu_transcoder));
    562  1.1  riastrad 
    563  1.1  riastrad 	for (i = 0; i < len; i += 4)
    564  1.1  riastrad 		*data++ = I915_READ(hsw_dip_data_reg(dev_priv, cpu_transcoder,
    565  1.1  riastrad 						     type, i >> 2));
    566  1.1  riastrad }
    567  1.1  riastrad 
    568  1.1  riastrad static u32 hsw_infoframes_enabled(struct intel_encoder *encoder,
    569  1.1  riastrad 				  const struct intel_crtc_state *pipe_config)
    570  1.1  riastrad {
    571  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    572  1.1  riastrad 	u32 val = I915_READ(HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
    573  1.1  riastrad 	u32 mask;
    574  1.1  riastrad 
    575  1.1  riastrad 	mask = (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
    576  1.1  riastrad 		VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
    577  1.1  riastrad 		VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
    578  1.1  riastrad 
    579  1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
    580  1.1  riastrad 		mask |= VIDEO_DIP_ENABLE_DRM_GLK;
    581  1.1  riastrad 
    582  1.1  riastrad 	return val & mask;
    583  1.1  riastrad }
    584  1.1  riastrad 
    585  1.1  riastrad static const u8 infoframe_type_to_idx[] = {
    586  1.1  riastrad 	HDMI_PACKET_TYPE_GENERAL_CONTROL,
    587  1.1  riastrad 	HDMI_PACKET_TYPE_GAMUT_METADATA,
    588  1.1  riastrad 	DP_SDP_VSC,
    589  1.1  riastrad 	HDMI_INFOFRAME_TYPE_AVI,
    590  1.1  riastrad 	HDMI_INFOFRAME_TYPE_SPD,
    591  1.1  riastrad 	HDMI_INFOFRAME_TYPE_VENDOR,
    592  1.1  riastrad 	HDMI_INFOFRAME_TYPE_DRM,
    593  1.1  riastrad };
    594  1.1  riastrad 
    595  1.1  riastrad u32 intel_hdmi_infoframe_enable(unsigned int type)
    596  1.1  riastrad {
    597  1.1  riastrad 	int i;
    598  1.1  riastrad 
    599  1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
    600  1.1  riastrad 		if (infoframe_type_to_idx[i] == type)
    601  1.1  riastrad 			return BIT(i);
    602  1.1  riastrad 	}
    603  1.1  riastrad 
    604  1.1  riastrad 	return 0;
    605  1.1  riastrad }
    606  1.1  riastrad 
    607  1.1  riastrad u32 intel_hdmi_infoframes_enabled(struct intel_encoder *encoder,
    608  1.1  riastrad 				  const struct intel_crtc_state *crtc_state)
    609  1.1  riastrad {
    610  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    611  1.1  riastrad 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
    612  1.1  riastrad 	u32 val, ret = 0;
    613  1.1  riastrad 	int i;
    614  1.1  riastrad 
    615  1.1  riastrad 	val = dig_port->infoframes_enabled(encoder, crtc_state);
    616  1.1  riastrad 
    617  1.1  riastrad 	/* map from hardware bits to dip idx */
    618  1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
    619  1.1  riastrad 		unsigned int type = infoframe_type_to_idx[i];
    620  1.1  riastrad 
    621  1.1  riastrad 		if (HAS_DDI(dev_priv)) {
    622  1.1  riastrad 			if (val & hsw_infoframe_enable(type))
    623  1.1  riastrad 				ret |= BIT(i);
    624  1.1  riastrad 		} else {
    625  1.1  riastrad 			if (val & g4x_infoframe_enable(type))
    626  1.1  riastrad 				ret |= BIT(i);
    627  1.1  riastrad 		}
    628  1.1  riastrad 	}
    629  1.1  riastrad 
    630  1.1  riastrad 	return ret;
    631  1.1  riastrad }
    632  1.1  riastrad 
    633  1.1  riastrad /*
    634  1.1  riastrad  * The data we write to the DIP data buffer registers is 1 byte bigger than the
    635  1.1  riastrad  * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
    636  1.1  riastrad  * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
    637  1.1  riastrad  * used for both technologies.
    638  1.1  riastrad  *
    639  1.1  riastrad  * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
    640  1.1  riastrad  * DW1:       DB3       | DB2 | DB1 | DB0
    641  1.1  riastrad  * DW2:       DB7       | DB6 | DB5 | DB4
    642  1.1  riastrad  * DW3: ...
    643  1.1  riastrad  *
    644  1.1  riastrad  * (HB is Header Byte, DB is Data Byte)
    645  1.1  riastrad  *
    646  1.1  riastrad  * The hdmi pack() functions don't know about that hardware specific hole so we
    647  1.1  riastrad  * trick them by giving an offset into the buffer and moving back the header
    648  1.1  riastrad  * bytes by one.
    649  1.1  riastrad  */
    650  1.1  riastrad static void intel_write_infoframe(struct intel_encoder *encoder,
    651  1.1  riastrad 				  const struct intel_crtc_state *crtc_state,
    652  1.1  riastrad 				  enum hdmi_infoframe_type type,
    653  1.1  riastrad 				  const union hdmi_infoframe *frame)
    654  1.1  riastrad {
    655  1.1  riastrad 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
    656  1.1  riastrad 	u8 buffer[VIDEO_DIP_DATA_SIZE];
    657  1.1  riastrad 	ssize_t len;
    658  1.1  riastrad 
    659  1.1  riastrad 	if ((crtc_state->infoframes.enable &
    660  1.1  riastrad 	     intel_hdmi_infoframe_enable(type)) == 0)
    661  1.1  riastrad 		return;
    662  1.1  riastrad 
    663  1.1  riastrad 	if (WARN_ON(frame->any.type != type))
    664  1.1  riastrad 		return;
    665  1.1  riastrad 
    666  1.1  riastrad 	/* see comment above for the reason for this offset */
    667  1.1  riastrad 	len = hdmi_infoframe_pack_only(frame, buffer + 1, sizeof(buffer) - 1);
    668  1.1  riastrad 	if (WARN_ON(len < 0))
    669  1.1  riastrad 		return;
    670  1.1  riastrad 
    671  1.1  riastrad 	/* Insert the 'hole' (see big comment above) at position 3 */
    672  1.1  riastrad 	memmove(&buffer[0], &buffer[1], 3);
    673  1.1  riastrad 	buffer[3] = 0;
    674  1.1  riastrad 	len++;
    675  1.1  riastrad 
    676  1.1  riastrad 	intel_dig_port->write_infoframe(encoder, crtc_state, type, buffer, len);
    677  1.1  riastrad }
    678  1.1  riastrad 
    679  1.1  riastrad void intel_read_infoframe(struct intel_encoder *encoder,
    680  1.1  riastrad 			  const struct intel_crtc_state *crtc_state,
    681  1.1  riastrad 			  enum hdmi_infoframe_type type,
    682  1.1  riastrad 			  union hdmi_infoframe *frame)
    683  1.1  riastrad {
    684  1.1  riastrad 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
    685  1.1  riastrad 	u8 buffer[VIDEO_DIP_DATA_SIZE];
    686  1.1  riastrad 	int ret;
    687  1.1  riastrad 
    688  1.1  riastrad 	if ((crtc_state->infoframes.enable &
    689  1.1  riastrad 	     intel_hdmi_infoframe_enable(type)) == 0)
    690  1.1  riastrad 		return;
    691  1.1  riastrad 
    692  1.1  riastrad 	intel_dig_port->read_infoframe(encoder, crtc_state,
    693  1.1  riastrad 				       type, buffer, sizeof(buffer));
    694  1.1  riastrad 
    695  1.1  riastrad 	/* Fill the 'hole' (see big comment above) at position 3 */
    696  1.1  riastrad 	memmove(&buffer[1], &buffer[0], 3);
    697  1.1  riastrad 
    698  1.1  riastrad 	/* see comment above for the reason for this offset */
    699  1.1  riastrad 	ret = hdmi_infoframe_unpack(frame, buffer + 1, sizeof(buffer) - 1);
    700  1.1  riastrad 	if (ret) {
    701  1.1  riastrad 		DRM_DEBUG_KMS("Failed to unpack infoframe type 0x%02x\n", type);
    702  1.1  riastrad 		return;
    703  1.1  riastrad 	}
    704  1.1  riastrad 
    705  1.1  riastrad 	if (frame->any.type != type)
    706  1.1  riastrad 		DRM_DEBUG_KMS("Found the wrong infoframe type 0x%x (expected 0x%02x)\n",
    707  1.1  riastrad 			      frame->any.type, type);
    708  1.1  riastrad }
    709  1.1  riastrad 
    710  1.1  riastrad static bool
    711  1.1  riastrad intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
    712  1.1  riastrad 				 struct intel_crtc_state *crtc_state,
    713  1.1  riastrad 				 struct drm_connector_state *conn_state)
    714  1.1  riastrad {
    715  1.1  riastrad 	struct hdmi_avi_infoframe *frame = &crtc_state->infoframes.avi.avi;
    716  1.1  riastrad 	const struct drm_display_mode *adjusted_mode =
    717  1.1  riastrad 		&crtc_state->hw.adjusted_mode;
    718  1.1  riastrad 	struct drm_connector *connector = conn_state->connector;
    719  1.1  riastrad 	int ret;
    720  1.1  riastrad 
    721  1.1  riastrad 	if (!crtc_state->has_infoframe)
    722  1.1  riastrad 		return true;
    723  1.1  riastrad 
    724  1.1  riastrad 	crtc_state->infoframes.enable |=
    725  1.1  riastrad 		intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI);
    726  1.1  riastrad 
    727  1.1  riastrad 	ret = drm_hdmi_avi_infoframe_from_display_mode(frame, connector,
    728  1.1  riastrad 						       adjusted_mode);
    729  1.1  riastrad 	if (ret)
    730  1.1  riastrad 		return false;
    731  1.1  riastrad 
    732  1.1  riastrad 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
    733  1.1  riastrad 		frame->colorspace = HDMI_COLORSPACE_YUV420;
    734  1.1  riastrad 	else if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
    735  1.1  riastrad 		frame->colorspace = HDMI_COLORSPACE_YUV444;
    736  1.1  riastrad 	else
    737  1.1  riastrad 		frame->colorspace = HDMI_COLORSPACE_RGB;
    738  1.1  riastrad 
    739  1.1  riastrad 	drm_hdmi_avi_infoframe_colorspace(frame, conn_state);
    740  1.1  riastrad 
    741  1.1  riastrad 	/* nonsense combination */
    742  1.1  riastrad 	WARN_ON(crtc_state->limited_color_range &&
    743  1.1  riastrad 		crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB);
    744  1.1  riastrad 
    745  1.1  riastrad 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB) {
    746  1.1  riastrad 		drm_hdmi_avi_infoframe_quant_range(frame, connector,
    747  1.1  riastrad 						   adjusted_mode,
    748  1.1  riastrad 						   crtc_state->limited_color_range ?
    749  1.1  riastrad 						   HDMI_QUANTIZATION_RANGE_LIMITED :
    750  1.1  riastrad 						   HDMI_QUANTIZATION_RANGE_FULL);
    751  1.1  riastrad 	} else {
    752  1.1  riastrad 		frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
    753  1.1  riastrad 		frame->ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
    754  1.1  riastrad 	}
    755  1.1  riastrad 
    756  1.1  riastrad 	drm_hdmi_avi_infoframe_content_type(frame, conn_state);
    757  1.1  riastrad 
    758  1.1  riastrad 	/* TODO: handle pixel repetition for YCBCR420 outputs */
    759  1.1  riastrad 
    760  1.1  riastrad 	ret = hdmi_avi_infoframe_check(frame);
    761  1.1  riastrad 	if (WARN_ON(ret))
    762  1.1  riastrad 		return false;
    763  1.1  riastrad 
    764  1.1  riastrad 	return true;
    765  1.1  riastrad }
    766  1.1  riastrad 
    767  1.1  riastrad static bool
    768  1.1  riastrad intel_hdmi_compute_spd_infoframe(struct intel_encoder *encoder,
    769  1.1  riastrad 				 struct intel_crtc_state *crtc_state,
    770  1.1  riastrad 				 struct drm_connector_state *conn_state)
    771  1.1  riastrad {
    772  1.1  riastrad 	struct hdmi_spd_infoframe *frame = &crtc_state->infoframes.spd.spd;
    773  1.1  riastrad 	int ret;
    774  1.1  riastrad 
    775  1.1  riastrad 	if (!crtc_state->has_infoframe)
    776  1.1  riastrad 		return true;
    777  1.1  riastrad 
    778  1.1  riastrad 	crtc_state->infoframes.enable |=
    779  1.1  riastrad 		intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_SPD);
    780  1.1  riastrad 
    781  1.1  riastrad 	ret = hdmi_spd_infoframe_init(frame, "Intel", "Integrated gfx");
    782  1.1  riastrad 	if (WARN_ON(ret))
    783  1.1  riastrad 		return false;
    784  1.1  riastrad 
    785  1.1  riastrad 	frame->sdi = HDMI_SPD_SDI_PC;
    786  1.1  riastrad 
    787  1.1  riastrad 	ret = hdmi_spd_infoframe_check(frame);
    788  1.1  riastrad 	if (WARN_ON(ret))
    789  1.1  riastrad 		return false;
    790  1.1  riastrad 
    791  1.1  riastrad 	return true;
    792  1.1  riastrad }
    793  1.1  riastrad 
    794  1.1  riastrad static bool
    795  1.1  riastrad intel_hdmi_compute_hdmi_infoframe(struct intel_encoder *encoder,
    796  1.1  riastrad 				  struct intel_crtc_state *crtc_state,
    797  1.1  riastrad 				  struct drm_connector_state *conn_state)
    798  1.1  riastrad {
    799  1.1  riastrad 	struct hdmi_vendor_infoframe *frame =
    800  1.1  riastrad 		&crtc_state->infoframes.hdmi.vendor.hdmi;
    801  1.1  riastrad 	const struct drm_display_info *info =
    802  1.1  riastrad 		&conn_state->connector->display_info;
    803  1.1  riastrad 	int ret;
    804  1.1  riastrad 
    805  1.1  riastrad 	if (!crtc_state->has_infoframe || !info->has_hdmi_infoframe)
    806  1.1  riastrad 		return true;
    807  1.1  riastrad 
    808  1.1  riastrad 	crtc_state->infoframes.enable |=
    809  1.1  riastrad 		intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR);
    810  1.1  riastrad 
    811  1.1  riastrad 	ret = drm_hdmi_vendor_infoframe_from_display_mode(frame,
    812  1.1  riastrad 							  conn_state->connector,
    813  1.1  riastrad 							  &crtc_state->hw.adjusted_mode);
    814  1.1  riastrad 	if (WARN_ON(ret))
    815  1.1  riastrad 		return false;
    816  1.1  riastrad 
    817  1.1  riastrad 	ret = hdmi_vendor_infoframe_check(frame);
    818  1.1  riastrad 	if (WARN_ON(ret))
    819  1.1  riastrad 		return false;
    820  1.1  riastrad 
    821  1.1  riastrad 	return true;
    822  1.1  riastrad }
    823  1.1  riastrad 
    824  1.1  riastrad static bool
    825  1.1  riastrad intel_hdmi_compute_drm_infoframe(struct intel_encoder *encoder,
    826  1.1  riastrad 				 struct intel_crtc_state *crtc_state,
    827  1.1  riastrad 				 struct drm_connector_state *conn_state)
    828  1.1  riastrad {
    829  1.1  riastrad 	struct hdmi_drm_infoframe *frame = &crtc_state->infoframes.drm.drm;
    830  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    831  1.1  riastrad 	int ret;
    832  1.1  riastrad 
    833  1.1  riastrad 	if (!(INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv)))
    834  1.1  riastrad 		return true;
    835  1.1  riastrad 
    836  1.1  riastrad 	if (!crtc_state->has_infoframe)
    837  1.1  riastrad 		return true;
    838  1.1  riastrad 
    839  1.1  riastrad 	if (!conn_state->hdr_output_metadata)
    840  1.1  riastrad 		return true;
    841  1.1  riastrad 
    842  1.1  riastrad 	crtc_state->infoframes.enable |=
    843  1.1  riastrad 		intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM);
    844  1.1  riastrad 
    845  1.1  riastrad 	ret = drm_hdmi_infoframe_set_hdr_metadata(frame, conn_state);
    846  1.1  riastrad 	if (ret < 0) {
    847  1.1  riastrad 		DRM_DEBUG_KMS("couldn't set HDR metadata in infoframe\n");
    848  1.1  riastrad 		return false;
    849  1.1  riastrad 	}
    850  1.1  riastrad 
    851  1.1  riastrad 	ret = hdmi_drm_infoframe_check(frame);
    852  1.1  riastrad 	if (WARN_ON(ret))
    853  1.1  riastrad 		return false;
    854  1.1  riastrad 
    855  1.1  riastrad 	return true;
    856  1.1  riastrad }
    857  1.1  riastrad 
    858  1.1  riastrad static void g4x_set_infoframes(struct intel_encoder *encoder,
    859  1.1  riastrad 			       bool enable,
    860  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
    861  1.1  riastrad 			       const struct drm_connector_state *conn_state)
    862  1.1  riastrad {
    863  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    864  1.1  riastrad 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
    865  1.1  riastrad 	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
    866  1.1  riastrad 	i915_reg_t reg = VIDEO_DIP_CTL;
    867  1.1  riastrad 	u32 val = I915_READ(reg);
    868  1.1  riastrad 	u32 port = VIDEO_DIP_PORT(encoder->port);
    869  1.1  riastrad 
    870  1.1  riastrad 	assert_hdmi_port_disabled(intel_hdmi);
    871  1.1  riastrad 
    872  1.1  riastrad 	/* If the registers were not initialized yet, they might be zeroes,
    873  1.1  riastrad 	 * which means we're selecting the AVI DIP and we're setting its
    874  1.1  riastrad 	 * frequency to once. This seems to really confuse the HW and make
    875  1.1  riastrad 	 * things stop working (the register spec says the AVI always needs to
    876  1.1  riastrad 	 * be sent every VSync). So here we avoid writing to the register more
    877  1.1  riastrad 	 * than we need and also explicitly select the AVI DIP and explicitly
    878  1.1  riastrad 	 * set its frequency to every VSync. Avoiding to write it twice seems to
    879  1.1  riastrad 	 * be enough to solve the problem, but being defensive shouldn't hurt us
    880  1.1  riastrad 	 * either. */
    881  1.1  riastrad 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
    882  1.1  riastrad 
    883  1.1  riastrad 	if (!enable) {
    884  1.1  riastrad 		if (!(val & VIDEO_DIP_ENABLE))
    885  1.1  riastrad 			return;
    886  1.1  riastrad 		if (port != (val & VIDEO_DIP_PORT_MASK)) {
    887  1.1  riastrad 			DRM_DEBUG_KMS("video DIP still enabled on port %c\n",
    888  1.1  riastrad 				      (val & VIDEO_DIP_PORT_MASK) >> 29);
    889  1.1  riastrad 			return;
    890  1.1  riastrad 		}
    891  1.1  riastrad 		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
    892  1.1  riastrad 			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
    893  1.1  riastrad 		I915_WRITE(reg, val);
    894  1.1  riastrad 		POSTING_READ(reg);
    895  1.1  riastrad 		return;
    896  1.1  riastrad 	}
    897  1.1  riastrad 
    898  1.1  riastrad 	if (port != (val & VIDEO_DIP_PORT_MASK)) {
    899  1.1  riastrad 		if (val & VIDEO_DIP_ENABLE) {
    900  1.1  riastrad 			DRM_DEBUG_KMS("video DIP already enabled on port %c\n",
    901  1.1  riastrad 				      (val & VIDEO_DIP_PORT_MASK) >> 29);
    902  1.1  riastrad 			return;
    903  1.1  riastrad 		}
    904  1.1  riastrad 		val &= ~VIDEO_DIP_PORT_MASK;
    905  1.1  riastrad 		val |= port;
    906  1.1  riastrad 	}
    907  1.1  riastrad 
    908  1.1  riastrad 	val |= VIDEO_DIP_ENABLE;
    909  1.1  riastrad 	val &= ~(VIDEO_DIP_ENABLE_AVI |
    910  1.1  riastrad 		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
    911  1.1  riastrad 
    912  1.1  riastrad 	I915_WRITE(reg, val);
    913  1.1  riastrad 	POSTING_READ(reg);
    914  1.1  riastrad 
    915  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
    916  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_AVI,
    917  1.1  riastrad 			      &crtc_state->infoframes.avi);
    918  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
    919  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_SPD,
    920  1.1  riastrad 			      &crtc_state->infoframes.spd);
    921  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
    922  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_VENDOR,
    923  1.1  riastrad 			      &crtc_state->infoframes.hdmi);
    924  1.1  riastrad }
    925  1.1  riastrad 
    926  1.1  riastrad /*
    927  1.1  riastrad  * Determine if default_phase=1 can be indicated in the GCP infoframe.
    928  1.1  riastrad  *
    929  1.1  riastrad  * From HDMI specification 1.4a:
    930  1.1  riastrad  * - The first pixel of each Video Data Period shall always have a pixel packing phase of 0
    931  1.1  riastrad  * - The first pixel following each Video Data Period shall have a pixel packing phase of 0
    932  1.1  riastrad  * - The PP bits shall be constant for all GCPs and will be equal to the last packing phase
    933  1.1  riastrad  * - The first pixel following every transition of HSYNC or VSYNC shall have a pixel packing
    934  1.1  riastrad  *   phase of 0
    935  1.1  riastrad  */
    936  1.1  riastrad static bool gcp_default_phase_possible(int pipe_bpp,
    937  1.1  riastrad 				       const struct drm_display_mode *mode)
    938  1.1  riastrad {
    939  1.1  riastrad 	unsigned int pixels_per_group;
    940  1.1  riastrad 
    941  1.1  riastrad 	switch (pipe_bpp) {
    942  1.1  riastrad 	case 30:
    943  1.1  riastrad 		/* 4 pixels in 5 clocks */
    944  1.1  riastrad 		pixels_per_group = 4;
    945  1.1  riastrad 		break;
    946  1.1  riastrad 	case 36:
    947  1.1  riastrad 		/* 2 pixels in 3 clocks */
    948  1.1  riastrad 		pixels_per_group = 2;
    949  1.1  riastrad 		break;
    950  1.1  riastrad 	case 48:
    951  1.1  riastrad 		/* 1 pixel in 2 clocks */
    952  1.1  riastrad 		pixels_per_group = 1;
    953  1.1  riastrad 		break;
    954  1.1  riastrad 	default:
    955  1.1  riastrad 		/* phase information not relevant for 8bpc */
    956  1.1  riastrad 		return false;
    957  1.1  riastrad 	}
    958  1.1  riastrad 
    959  1.1  riastrad 	return mode->crtc_hdisplay % pixels_per_group == 0 &&
    960  1.1  riastrad 		mode->crtc_htotal % pixels_per_group == 0 &&
    961  1.1  riastrad 		mode->crtc_hblank_start % pixels_per_group == 0 &&
    962  1.1  riastrad 		mode->crtc_hblank_end % pixels_per_group == 0 &&
    963  1.1  riastrad 		mode->crtc_hsync_start % pixels_per_group == 0 &&
    964  1.1  riastrad 		mode->crtc_hsync_end % pixels_per_group == 0 &&
    965  1.1  riastrad 		((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0 ||
    966  1.1  riastrad 		 mode->crtc_htotal/2 % pixels_per_group == 0);
    967  1.1  riastrad }
    968  1.1  riastrad 
    969  1.1  riastrad static bool intel_hdmi_set_gcp_infoframe(struct intel_encoder *encoder,
    970  1.1  riastrad 					 const struct intel_crtc_state *crtc_state,
    971  1.1  riastrad 					 const struct drm_connector_state *conn_state)
    972  1.1  riastrad {
    973  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    974  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
    975  1.1  riastrad 	i915_reg_t reg;
    976  1.1  riastrad 
    977  1.1  riastrad 	if ((crtc_state->infoframes.enable &
    978  1.1  riastrad 	     intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
    979  1.1  riastrad 		return false;
    980  1.1  riastrad 
    981  1.1  riastrad 	if (HAS_DDI(dev_priv))
    982  1.1  riastrad 		reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
    983  1.1  riastrad 	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
    984  1.1  riastrad 		reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
    985  1.1  riastrad 	else if (HAS_PCH_SPLIT(dev_priv))
    986  1.1  riastrad 		reg = TVIDEO_DIP_GCP(crtc->pipe);
    987  1.1  riastrad 	else
    988  1.1  riastrad 		return false;
    989  1.1  riastrad 
    990  1.1  riastrad 	I915_WRITE(reg, crtc_state->infoframes.gcp);
    991  1.1  riastrad 
    992  1.1  riastrad 	return true;
    993  1.1  riastrad }
    994  1.1  riastrad 
    995  1.1  riastrad void intel_hdmi_read_gcp_infoframe(struct intel_encoder *encoder,
    996  1.1  riastrad 				   struct intel_crtc_state *crtc_state)
    997  1.1  riastrad {
    998  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    999  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1000  1.1  riastrad 	i915_reg_t reg;
   1001  1.1  riastrad 
   1002  1.1  riastrad 	if ((crtc_state->infoframes.enable &
   1003  1.1  riastrad 	     intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
   1004  1.1  riastrad 		return;
   1005  1.1  riastrad 
   1006  1.1  riastrad 	if (HAS_DDI(dev_priv))
   1007  1.1  riastrad 		reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
   1008  1.1  riastrad 	else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
   1009  1.1  riastrad 		reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
   1010  1.1  riastrad 	else if (HAS_PCH_SPLIT(dev_priv))
   1011  1.1  riastrad 		reg = TVIDEO_DIP_GCP(crtc->pipe);
   1012  1.1  riastrad 	else
   1013  1.1  riastrad 		return;
   1014  1.1  riastrad 
   1015  1.1  riastrad 	crtc_state->infoframes.gcp = I915_READ(reg);
   1016  1.1  riastrad }
   1017  1.1  riastrad 
   1018  1.1  riastrad static void intel_hdmi_compute_gcp_infoframe(struct intel_encoder *encoder,
   1019  1.1  riastrad 					     struct intel_crtc_state *crtc_state,
   1020  1.1  riastrad 					     struct drm_connector_state *conn_state)
   1021  1.1  riastrad {
   1022  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   1023  1.1  riastrad 
   1024  1.1  riastrad 	if (IS_G4X(dev_priv) || !crtc_state->has_infoframe)
   1025  1.1  riastrad 		return;
   1026  1.1  riastrad 
   1027  1.1  riastrad 	crtc_state->infoframes.enable |=
   1028  1.1  riastrad 		intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL);
   1029  1.1  riastrad 
   1030  1.1  riastrad 	/* Indicate color indication for deep color mode */
   1031  1.1  riastrad 	if (crtc_state->pipe_bpp > 24)
   1032  1.1  riastrad 		crtc_state->infoframes.gcp |= GCP_COLOR_INDICATION;
   1033  1.1  riastrad 
   1034  1.1  riastrad 	/* Enable default_phase whenever the display mode is suitably aligned */
   1035  1.1  riastrad 	if (gcp_default_phase_possible(crtc_state->pipe_bpp,
   1036  1.1  riastrad 				       &crtc_state->hw.adjusted_mode))
   1037  1.1  riastrad 		crtc_state->infoframes.gcp |= GCP_DEFAULT_PHASE_ENABLE;
   1038  1.1  riastrad }
   1039  1.1  riastrad 
   1040  1.1  riastrad static void ibx_set_infoframes(struct intel_encoder *encoder,
   1041  1.1  riastrad 			       bool enable,
   1042  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
   1043  1.1  riastrad 			       const struct drm_connector_state *conn_state)
   1044  1.1  riastrad {
   1045  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   1046  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1047  1.1  riastrad 	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
   1048  1.1  riastrad 	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
   1049  1.1  riastrad 	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
   1050  1.1  riastrad 	u32 val = I915_READ(reg);
   1051  1.1  riastrad 	u32 port = VIDEO_DIP_PORT(encoder->port);
   1052  1.1  riastrad 
   1053  1.1  riastrad 	assert_hdmi_port_disabled(intel_hdmi);
   1054  1.1  riastrad 
   1055  1.1  riastrad 	/* See the big comment in g4x_set_infoframes() */
   1056  1.1  riastrad 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
   1057  1.1  riastrad 
   1058  1.1  riastrad 	if (!enable) {
   1059  1.1  riastrad 		if (!(val & VIDEO_DIP_ENABLE))
   1060  1.1  riastrad 			return;
   1061  1.1  riastrad 		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
   1062  1.1  riastrad 			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
   1063  1.1  riastrad 			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
   1064  1.1  riastrad 		I915_WRITE(reg, val);
   1065  1.1  riastrad 		POSTING_READ(reg);
   1066  1.1  riastrad 		return;
   1067  1.1  riastrad 	}
   1068  1.1  riastrad 
   1069  1.1  riastrad 	if (port != (val & VIDEO_DIP_PORT_MASK)) {
   1070  1.1  riastrad 		WARN(val & VIDEO_DIP_ENABLE,
   1071  1.1  riastrad 		     "DIP already enabled on port %c\n",
   1072  1.1  riastrad 		     (val & VIDEO_DIP_PORT_MASK) >> 29);
   1073  1.1  riastrad 		val &= ~VIDEO_DIP_PORT_MASK;
   1074  1.1  riastrad 		val |= port;
   1075  1.1  riastrad 	}
   1076  1.1  riastrad 
   1077  1.1  riastrad 	val |= VIDEO_DIP_ENABLE;
   1078  1.1  riastrad 	val &= ~(VIDEO_DIP_ENABLE_AVI |
   1079  1.1  riastrad 		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
   1080  1.1  riastrad 		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
   1081  1.1  riastrad 
   1082  1.1  riastrad 	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
   1083  1.1  riastrad 		val |= VIDEO_DIP_ENABLE_GCP;
   1084  1.1  riastrad 
   1085  1.1  riastrad 	I915_WRITE(reg, val);
   1086  1.1  riastrad 	POSTING_READ(reg);
   1087  1.1  riastrad 
   1088  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1089  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_AVI,
   1090  1.1  riastrad 			      &crtc_state->infoframes.avi);
   1091  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1092  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_SPD,
   1093  1.1  riastrad 			      &crtc_state->infoframes.spd);
   1094  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1095  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_VENDOR,
   1096  1.1  riastrad 			      &crtc_state->infoframes.hdmi);
   1097  1.1  riastrad }
   1098  1.1  riastrad 
   1099  1.1  riastrad static void cpt_set_infoframes(struct intel_encoder *encoder,
   1100  1.1  riastrad 			       bool enable,
   1101  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
   1102  1.1  riastrad 			       const struct drm_connector_state *conn_state)
   1103  1.1  riastrad {
   1104  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   1105  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1106  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1107  1.1  riastrad 	i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
   1108  1.1  riastrad 	u32 val = I915_READ(reg);
   1109  1.1  riastrad 
   1110  1.1  riastrad 	assert_hdmi_port_disabled(intel_hdmi);
   1111  1.1  riastrad 
   1112  1.1  riastrad 	/* See the big comment in g4x_set_infoframes() */
   1113  1.1  riastrad 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
   1114  1.1  riastrad 
   1115  1.1  riastrad 	if (!enable) {
   1116  1.1  riastrad 		if (!(val & VIDEO_DIP_ENABLE))
   1117  1.1  riastrad 			return;
   1118  1.1  riastrad 		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
   1119  1.1  riastrad 			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
   1120  1.1  riastrad 			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
   1121  1.1  riastrad 		I915_WRITE(reg, val);
   1122  1.1  riastrad 		POSTING_READ(reg);
   1123  1.1  riastrad 		return;
   1124  1.1  riastrad 	}
   1125  1.1  riastrad 
   1126  1.1  riastrad 	/* Set both together, unset both together: see the spec. */
   1127  1.1  riastrad 	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
   1128  1.1  riastrad 	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
   1129  1.1  riastrad 		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
   1130  1.1  riastrad 
   1131  1.1  riastrad 	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
   1132  1.1  riastrad 		val |= VIDEO_DIP_ENABLE_GCP;
   1133  1.1  riastrad 
   1134  1.1  riastrad 	I915_WRITE(reg, val);
   1135  1.1  riastrad 	POSTING_READ(reg);
   1136  1.1  riastrad 
   1137  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1138  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_AVI,
   1139  1.1  riastrad 			      &crtc_state->infoframes.avi);
   1140  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1141  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_SPD,
   1142  1.1  riastrad 			      &crtc_state->infoframes.spd);
   1143  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1144  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_VENDOR,
   1145  1.1  riastrad 			      &crtc_state->infoframes.hdmi);
   1146  1.1  riastrad }
   1147  1.1  riastrad 
   1148  1.1  riastrad static void vlv_set_infoframes(struct intel_encoder *encoder,
   1149  1.1  riastrad 			       bool enable,
   1150  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
   1151  1.1  riastrad 			       const struct drm_connector_state *conn_state)
   1152  1.1  riastrad {
   1153  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   1154  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1155  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1156  1.1  riastrad 	i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
   1157  1.1  riastrad 	u32 val = I915_READ(reg);
   1158  1.1  riastrad 	u32 port = VIDEO_DIP_PORT(encoder->port);
   1159  1.1  riastrad 
   1160  1.1  riastrad 	assert_hdmi_port_disabled(intel_hdmi);
   1161  1.1  riastrad 
   1162  1.1  riastrad 	/* See the big comment in g4x_set_infoframes() */
   1163  1.1  riastrad 	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
   1164  1.1  riastrad 
   1165  1.1  riastrad 	if (!enable) {
   1166  1.1  riastrad 		if (!(val & VIDEO_DIP_ENABLE))
   1167  1.1  riastrad 			return;
   1168  1.1  riastrad 		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
   1169  1.1  riastrad 			 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
   1170  1.1  riastrad 			 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
   1171  1.1  riastrad 		I915_WRITE(reg, val);
   1172  1.1  riastrad 		POSTING_READ(reg);
   1173  1.1  riastrad 		return;
   1174  1.1  riastrad 	}
   1175  1.1  riastrad 
   1176  1.1  riastrad 	if (port != (val & VIDEO_DIP_PORT_MASK)) {
   1177  1.1  riastrad 		WARN(val & VIDEO_DIP_ENABLE,
   1178  1.1  riastrad 		     "DIP already enabled on port %c\n",
   1179  1.1  riastrad 		     (val & VIDEO_DIP_PORT_MASK) >> 29);
   1180  1.1  riastrad 		val &= ~VIDEO_DIP_PORT_MASK;
   1181  1.1  riastrad 		val |= port;
   1182  1.1  riastrad 	}
   1183  1.1  riastrad 
   1184  1.1  riastrad 	val |= VIDEO_DIP_ENABLE;
   1185  1.1  riastrad 	val &= ~(VIDEO_DIP_ENABLE_AVI |
   1186  1.1  riastrad 		 VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
   1187  1.1  riastrad 		 VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
   1188  1.1  riastrad 
   1189  1.1  riastrad 	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
   1190  1.1  riastrad 		val |= VIDEO_DIP_ENABLE_GCP;
   1191  1.1  riastrad 
   1192  1.1  riastrad 	I915_WRITE(reg, val);
   1193  1.1  riastrad 	POSTING_READ(reg);
   1194  1.1  riastrad 
   1195  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1196  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_AVI,
   1197  1.1  riastrad 			      &crtc_state->infoframes.avi);
   1198  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1199  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_SPD,
   1200  1.1  riastrad 			      &crtc_state->infoframes.spd);
   1201  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1202  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_VENDOR,
   1203  1.1  riastrad 			      &crtc_state->infoframes.hdmi);
   1204  1.1  riastrad }
   1205  1.1  riastrad 
   1206  1.1  riastrad static void hsw_set_infoframes(struct intel_encoder *encoder,
   1207  1.1  riastrad 			       bool enable,
   1208  1.1  riastrad 			       const struct intel_crtc_state *crtc_state,
   1209  1.1  riastrad 			       const struct drm_connector_state *conn_state)
   1210  1.1  riastrad {
   1211  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   1212  1.1  riastrad 	i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
   1213  1.1  riastrad 	u32 val = I915_READ(reg);
   1214  1.1  riastrad 
   1215  1.1  riastrad 	assert_hdmi_transcoder_func_disabled(dev_priv,
   1216  1.1  riastrad 					     crtc_state->cpu_transcoder);
   1217  1.1  riastrad 
   1218  1.1  riastrad 	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
   1219  1.1  riastrad 		 VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
   1220  1.1  riastrad 		 VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
   1221  1.1  riastrad 		 VIDEO_DIP_ENABLE_DRM_GLK);
   1222  1.1  riastrad 
   1223  1.1  riastrad 	if (!enable) {
   1224  1.1  riastrad 		I915_WRITE(reg, val);
   1225  1.1  riastrad 		POSTING_READ(reg);
   1226  1.1  riastrad 		return;
   1227  1.1  riastrad 	}
   1228  1.1  riastrad 
   1229  1.1  riastrad 	if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
   1230  1.1  riastrad 		val |= VIDEO_DIP_ENABLE_GCP_HSW;
   1231  1.1  riastrad 
   1232  1.1  riastrad 	I915_WRITE(reg, val);
   1233  1.1  riastrad 	POSTING_READ(reg);
   1234  1.1  riastrad 
   1235  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1236  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_AVI,
   1237  1.1  riastrad 			      &crtc_state->infoframes.avi);
   1238  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1239  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_SPD,
   1240  1.1  riastrad 			      &crtc_state->infoframes.spd);
   1241  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1242  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_VENDOR,
   1243  1.1  riastrad 			      &crtc_state->infoframes.hdmi);
   1244  1.1  riastrad 	intel_write_infoframe(encoder, crtc_state,
   1245  1.1  riastrad 			      HDMI_INFOFRAME_TYPE_DRM,
   1246  1.1  riastrad 			      &crtc_state->infoframes.drm);
   1247  1.1  riastrad }
   1248  1.1  riastrad 
   1249  1.1  riastrad void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
   1250  1.1  riastrad {
   1251  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
   1252  1.1  riastrad 	struct i2c_adapter *adapter =
   1253  1.1  riastrad 		intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
   1254  1.1  riastrad 
   1255  1.1  riastrad 	if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
   1256  1.1  riastrad 		return;
   1257  1.1  riastrad 
   1258  1.1  riastrad 	DRM_DEBUG_KMS("%s DP dual mode adaptor TMDS output\n",
   1259  1.1  riastrad 		      enable ? "Enabling" : "Disabling");
   1260  1.1  riastrad 
   1261  1.1  riastrad 	drm_dp_dual_mode_set_tmds_output(hdmi->dp_dual_mode.type,
   1262  1.1  riastrad 					 adapter, enable);
   1263  1.1  riastrad }
   1264  1.1  riastrad 
   1265  1.1  riastrad static int intel_hdmi_hdcp_read(struct intel_digital_port *intel_dig_port,
   1266  1.1  riastrad 				unsigned int offset, void *buffer, size_t size)
   1267  1.1  riastrad {
   1268  1.1  riastrad 	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
   1269  1.1  riastrad 	struct drm_i915_private *dev_priv =
   1270  1.1  riastrad 		intel_dig_port->base.base.dev->dev_private;
   1271  1.1  riastrad 	struct i2c_adapter *adapter = intel_gmbus_get_adapter(dev_priv,
   1272  1.1  riastrad 							      hdmi->ddc_bus);
   1273  1.1  riastrad 	int ret;
   1274  1.1  riastrad 	u8 start = offset & 0xff;
   1275  1.1  riastrad 	struct i2c_msg msgs[] = {
   1276  1.1  riastrad 		{
   1277  1.1  riastrad 			.addr = DRM_HDCP_DDC_ADDR,
   1278  1.1  riastrad 			.flags = 0,
   1279  1.1  riastrad 			.len = 1,
   1280  1.1  riastrad 			.buf = &start,
   1281  1.1  riastrad 		},
   1282  1.1  riastrad 		{
   1283  1.1  riastrad 			.addr = DRM_HDCP_DDC_ADDR,
   1284  1.1  riastrad 			.flags = I2C_M_RD,
   1285  1.1  riastrad 			.len = size,
   1286  1.1  riastrad 			.buf = buffer
   1287  1.1  riastrad 		}
   1288  1.1  riastrad 	};
   1289  1.1  riastrad 	ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
   1290  1.1  riastrad 	if (ret == ARRAY_SIZE(msgs))
   1291  1.1  riastrad 		return 0;
   1292  1.1  riastrad 	return ret >= 0 ? -EIO : ret;
   1293  1.1  riastrad }
   1294  1.1  riastrad 
   1295  1.1  riastrad static int intel_hdmi_hdcp_write(struct intel_digital_port *intel_dig_port,
   1296  1.1  riastrad 				 unsigned int offset, void *buffer, size_t size)
   1297  1.1  riastrad {
   1298  1.1  riastrad 	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
   1299  1.1  riastrad 	struct drm_i915_private *dev_priv =
   1300  1.1  riastrad 		intel_dig_port->base.base.dev->dev_private;
   1301  1.1  riastrad 	struct i2c_adapter *adapter = intel_gmbus_get_adapter(dev_priv,
   1302  1.1  riastrad 							      hdmi->ddc_bus);
   1303  1.1  riastrad 	int ret;
   1304  1.1  riastrad 	u8 *write_buf;
   1305  1.1  riastrad 	struct i2c_msg msg;
   1306  1.1  riastrad 
   1307  1.1  riastrad 	write_buf = kzalloc(size + 1, GFP_KERNEL);
   1308  1.1  riastrad 	if (!write_buf)
   1309  1.1  riastrad 		return -ENOMEM;
   1310  1.1  riastrad 
   1311  1.1  riastrad 	write_buf[0] = offset & 0xff;
   1312  1.1  riastrad 	memcpy(&write_buf[1], buffer, size);
   1313  1.1  riastrad 
   1314  1.1  riastrad 	msg.addr = DRM_HDCP_DDC_ADDR;
   1315  1.1  riastrad 	msg.flags = 0,
   1316  1.1  riastrad 	msg.len = size + 1,
   1317  1.1  riastrad 	msg.buf = write_buf;
   1318  1.1  riastrad 
   1319  1.1  riastrad 	ret = i2c_transfer(adapter, &msg, 1);
   1320  1.1  riastrad 	if (ret == 1)
   1321  1.1  riastrad 		ret = 0;
   1322  1.1  riastrad 	else if (ret >= 0)
   1323  1.1  riastrad 		ret = -EIO;
   1324  1.1  riastrad 
   1325  1.1  riastrad 	kfree(write_buf);
   1326  1.1  riastrad 	return ret;
   1327  1.1  riastrad }
   1328  1.1  riastrad 
   1329  1.1  riastrad static
   1330  1.1  riastrad int intel_hdmi_hdcp_write_an_aksv(struct intel_digital_port *intel_dig_port,
   1331  1.1  riastrad 				  u8 *an)
   1332  1.1  riastrad {
   1333  1.1  riastrad 	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
   1334  1.1  riastrad 	struct drm_i915_private *dev_priv =
   1335  1.1  riastrad 		intel_dig_port->base.base.dev->dev_private;
   1336  1.1  riastrad 	struct i2c_adapter *adapter = intel_gmbus_get_adapter(dev_priv,
   1337  1.1  riastrad 							      hdmi->ddc_bus);
   1338  1.1  riastrad 	int ret;
   1339  1.1  riastrad 
   1340  1.1  riastrad 	ret = intel_hdmi_hdcp_write(intel_dig_port, DRM_HDCP_DDC_AN, an,
   1341  1.1  riastrad 				    DRM_HDCP_AN_LEN);
   1342  1.1  riastrad 	if (ret) {
   1343  1.1  riastrad 		DRM_DEBUG_KMS("Write An over DDC failed (%d)\n", ret);
   1344  1.1  riastrad 		return ret;
   1345  1.1  riastrad 	}
   1346  1.1  riastrad 
   1347  1.1  riastrad 	ret = intel_gmbus_output_aksv(adapter);
   1348  1.1  riastrad 	if (ret < 0) {
   1349  1.1  riastrad 		DRM_DEBUG_KMS("Failed to output aksv (%d)\n", ret);
   1350  1.1  riastrad 		return ret;
   1351  1.1  riastrad 	}
   1352  1.1  riastrad 	return 0;
   1353  1.1  riastrad }
   1354  1.1  riastrad 
   1355  1.1  riastrad static int intel_hdmi_hdcp_read_bksv(struct intel_digital_port *intel_dig_port,
   1356  1.1  riastrad 				     u8 *bksv)
   1357  1.1  riastrad {
   1358  1.1  riastrad 	int ret;
   1359  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BKSV, bksv,
   1360  1.1  riastrad 				   DRM_HDCP_KSV_LEN);
   1361  1.1  riastrad 	if (ret)
   1362  1.1  riastrad 		DRM_DEBUG_KMS("Read Bksv over DDC failed (%d)\n", ret);
   1363  1.1  riastrad 	return ret;
   1364  1.1  riastrad }
   1365  1.1  riastrad 
   1366  1.1  riastrad static
   1367  1.1  riastrad int intel_hdmi_hdcp_read_bstatus(struct intel_digital_port *intel_dig_port,
   1368  1.1  riastrad 				 u8 *bstatus)
   1369  1.1  riastrad {
   1370  1.1  riastrad 	int ret;
   1371  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BSTATUS,
   1372  1.1  riastrad 				   bstatus, DRM_HDCP_BSTATUS_LEN);
   1373  1.1  riastrad 	if (ret)
   1374  1.1  riastrad 		DRM_DEBUG_KMS("Read bstatus over DDC failed (%d)\n", ret);
   1375  1.1  riastrad 	return ret;
   1376  1.1  riastrad }
   1377  1.1  riastrad 
   1378  1.1  riastrad static
   1379  1.1  riastrad int intel_hdmi_hdcp_repeater_present(struct intel_digital_port *intel_dig_port,
   1380  1.1  riastrad 				     bool *repeater_present)
   1381  1.1  riastrad {
   1382  1.1  riastrad 	int ret;
   1383  1.1  riastrad 	u8 val;
   1384  1.1  riastrad 
   1385  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
   1386  1.1  riastrad 	if (ret) {
   1387  1.1  riastrad 		DRM_DEBUG_KMS("Read bcaps over DDC failed (%d)\n", ret);
   1388  1.1  riastrad 		return ret;
   1389  1.1  riastrad 	}
   1390  1.1  riastrad 	*repeater_present = val & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT;
   1391  1.1  riastrad 	return 0;
   1392  1.1  riastrad }
   1393  1.1  riastrad 
   1394  1.1  riastrad static
   1395  1.1  riastrad int intel_hdmi_hdcp_read_ri_prime(struct intel_digital_port *intel_dig_port,
   1396  1.1  riastrad 				  u8 *ri_prime)
   1397  1.1  riastrad {
   1398  1.1  riastrad 	int ret;
   1399  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_RI_PRIME,
   1400  1.1  riastrad 				   ri_prime, DRM_HDCP_RI_LEN);
   1401  1.1  riastrad 	if (ret)
   1402  1.1  riastrad 		DRM_DEBUG_KMS("Read Ri' over DDC failed (%d)\n", ret);
   1403  1.1  riastrad 	return ret;
   1404  1.1  riastrad }
   1405  1.1  riastrad 
   1406  1.1  riastrad static
   1407  1.1  riastrad int intel_hdmi_hdcp_read_ksv_ready(struct intel_digital_port *intel_dig_port,
   1408  1.1  riastrad 				   bool *ksv_ready)
   1409  1.1  riastrad {
   1410  1.1  riastrad 	int ret;
   1411  1.1  riastrad 	u8 val;
   1412  1.1  riastrad 
   1413  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
   1414  1.1  riastrad 	if (ret) {
   1415  1.1  riastrad 		DRM_DEBUG_KMS("Read bcaps over DDC failed (%d)\n", ret);
   1416  1.1  riastrad 		return ret;
   1417  1.1  riastrad 	}
   1418  1.1  riastrad 	*ksv_ready = val & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY;
   1419  1.1  riastrad 	return 0;
   1420  1.1  riastrad }
   1421  1.1  riastrad 
   1422  1.1  riastrad static
   1423  1.1  riastrad int intel_hdmi_hdcp_read_ksv_fifo(struct intel_digital_port *intel_dig_port,
   1424  1.1  riastrad 				  int num_downstream, u8 *ksv_fifo)
   1425  1.1  riastrad {
   1426  1.1  riastrad 	int ret;
   1427  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_KSV_FIFO,
   1428  1.1  riastrad 				   ksv_fifo, num_downstream * DRM_HDCP_KSV_LEN);
   1429  1.1  riastrad 	if (ret) {
   1430  1.1  riastrad 		DRM_DEBUG_KMS("Read ksv fifo over DDC failed (%d)\n", ret);
   1431  1.1  riastrad 		return ret;
   1432  1.1  riastrad 	}
   1433  1.1  riastrad 	return 0;
   1434  1.1  riastrad }
   1435  1.1  riastrad 
   1436  1.1  riastrad static
   1437  1.1  riastrad int intel_hdmi_hdcp_read_v_prime_part(struct intel_digital_port *intel_dig_port,
   1438  1.1  riastrad 				      int i, u32 *part)
   1439  1.1  riastrad {
   1440  1.1  riastrad 	int ret;
   1441  1.1  riastrad 
   1442  1.1  riastrad 	if (i >= DRM_HDCP_V_PRIME_NUM_PARTS)
   1443  1.1  riastrad 		return -EINVAL;
   1444  1.1  riastrad 
   1445  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, DRM_HDCP_DDC_V_PRIME(i),
   1446  1.1  riastrad 				   part, DRM_HDCP_V_PRIME_PART_LEN);
   1447  1.1  riastrad 	if (ret)
   1448  1.1  riastrad 		DRM_DEBUG_KMS("Read V'[%d] over DDC failed (%d)\n", i, ret);
   1449  1.1  riastrad 	return ret;
   1450  1.1  riastrad }
   1451  1.1  riastrad 
   1452  1.1  riastrad static int kbl_repositioning_enc_en_signal(struct intel_connector *connector)
   1453  1.1  riastrad {
   1454  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
   1455  1.1  riastrad 	struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector);
   1456  1.1  riastrad 	struct drm_crtc *crtc = connector->base.state->crtc;
   1457  1.1  riastrad 	struct intel_crtc *intel_crtc = container_of(crtc,
   1458  1.1  riastrad 						     struct intel_crtc, base);
   1459  1.1  riastrad 	u32 scanline;
   1460  1.1  riastrad 	int ret;
   1461  1.1  riastrad 
   1462  1.1  riastrad 	for (;;) {
   1463  1.1  riastrad 		scanline = I915_READ(PIPEDSL(intel_crtc->pipe));
   1464  1.1  riastrad 		if (scanline > 100 && scanline < 200)
   1465  1.1  riastrad 			break;
   1466  1.1  riastrad 		usleep_range(25, 50);
   1467  1.1  riastrad 	}
   1468  1.1  riastrad 
   1469  1.1  riastrad 	ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, false);
   1470  1.1  riastrad 	if (ret) {
   1471  1.1  riastrad 		DRM_ERROR("Disable HDCP signalling failed (%d)\n", ret);
   1472  1.1  riastrad 		return ret;
   1473  1.1  riastrad 	}
   1474  1.1  riastrad 	ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, true);
   1475  1.1  riastrad 	if (ret) {
   1476  1.1  riastrad 		DRM_ERROR("Enable HDCP signalling failed (%d)\n", ret);
   1477  1.1  riastrad 		return ret;
   1478  1.1  riastrad 	}
   1479  1.1  riastrad 
   1480  1.1  riastrad 	return 0;
   1481  1.1  riastrad }
   1482  1.1  riastrad 
   1483  1.1  riastrad static
   1484  1.1  riastrad int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *intel_dig_port,
   1485  1.1  riastrad 				      bool enable)
   1486  1.1  riastrad {
   1487  1.1  riastrad 	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
   1488  1.1  riastrad 	struct intel_connector *connector = hdmi->attached_connector;
   1489  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
   1490  1.1  riastrad 	int ret;
   1491  1.1  riastrad 
   1492  1.1  riastrad 	if (!enable)
   1493  1.1  riastrad 		usleep_range(6, 60); /* Bspec says >= 6us */
   1494  1.1  riastrad 
   1495  1.1  riastrad 	ret = intel_ddi_toggle_hdcp_signalling(&intel_dig_port->base, enable);
   1496  1.1  riastrad 	if (ret) {
   1497  1.1  riastrad 		DRM_ERROR("%s HDCP signalling failed (%d)\n",
   1498  1.1  riastrad 			  enable ? "Enable" : "Disable", ret);
   1499  1.1  riastrad 		return ret;
   1500  1.1  riastrad 	}
   1501  1.1  riastrad 
   1502  1.1  riastrad 	/*
   1503  1.1  riastrad 	 * WA: To fix incorrect positioning of the window of
   1504  1.1  riastrad 	 * opportunity and enc_en signalling in KABYLAKE.
   1505  1.1  riastrad 	 */
   1506  1.1  riastrad 	if (IS_KABYLAKE(dev_priv) && enable)
   1507  1.1  riastrad 		return kbl_repositioning_enc_en_signal(connector);
   1508  1.1  riastrad 
   1509  1.1  riastrad 	return 0;
   1510  1.1  riastrad }
   1511  1.1  riastrad 
   1512  1.1  riastrad static
   1513  1.1  riastrad bool intel_hdmi_hdcp_check_link(struct intel_digital_port *intel_dig_port)
   1514  1.1  riastrad {
   1515  1.1  riastrad 	struct drm_i915_private *dev_priv =
   1516  1.1  riastrad 		intel_dig_port->base.base.dev->dev_private;
   1517  1.1  riastrad 	struct intel_connector *connector =
   1518  1.1  riastrad 		intel_dig_port->hdmi.attached_connector;
   1519  1.1  riastrad 	enum port port = intel_dig_port->base.port;
   1520  1.1  riastrad 	enum transcoder cpu_transcoder = connector->hdcp.cpu_transcoder;
   1521  1.1  riastrad 	int ret;
   1522  1.1  riastrad 	union {
   1523  1.1  riastrad 		u32 reg;
   1524  1.1  riastrad 		u8 shim[DRM_HDCP_RI_LEN];
   1525  1.1  riastrad 	} ri;
   1526  1.1  riastrad 
   1527  1.1  riastrad 	ret = intel_hdmi_hdcp_read_ri_prime(intel_dig_port, ri.shim);
   1528  1.1  riastrad 	if (ret)
   1529  1.1  riastrad 		return false;
   1530  1.1  riastrad 
   1531  1.1  riastrad 	I915_WRITE(HDCP_RPRIME(dev_priv, cpu_transcoder, port), ri.reg);
   1532  1.1  riastrad 
   1533  1.1  riastrad 	/* Wait for Ri prime match */
   1534  1.1  riastrad 	if (wait_for(I915_READ(HDCP_STATUS(dev_priv, cpu_transcoder, port)) &
   1535  1.1  riastrad 		     (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
   1536  1.1  riastrad 		DRM_ERROR("Ri' mismatch detected, link check failed (%x)\n",
   1537  1.1  riastrad 			  I915_READ(HDCP_STATUS(dev_priv, cpu_transcoder,
   1538  1.1  riastrad 						port)));
   1539  1.1  riastrad 		return false;
   1540  1.1  riastrad 	}
   1541  1.1  riastrad 	return true;
   1542  1.1  riastrad }
   1543  1.1  riastrad 
   1544  1.1  riastrad struct hdcp2_hdmi_msg_timeout {
   1545  1.1  riastrad 	u8 msg_id;
   1546  1.1  riastrad 	u16 timeout;
   1547  1.1  riastrad };
   1548  1.1  riastrad 
   1549  1.1  riastrad static const struct hdcp2_hdmi_msg_timeout hdcp2_msg_timeout[] = {
   1550  1.1  riastrad 	{ HDCP_2_2_AKE_SEND_CERT, HDCP_2_2_CERT_TIMEOUT_MS, },
   1551  1.1  riastrad 	{ HDCP_2_2_AKE_SEND_PAIRING_INFO, HDCP_2_2_PAIRING_TIMEOUT_MS, },
   1552  1.1  riastrad 	{ HDCP_2_2_LC_SEND_LPRIME, HDCP_2_2_HDMI_LPRIME_TIMEOUT_MS, },
   1553  1.1  riastrad 	{ HDCP_2_2_REP_SEND_RECVID_LIST, HDCP_2_2_RECVID_LIST_TIMEOUT_MS, },
   1554  1.1  riastrad 	{ HDCP_2_2_REP_STREAM_READY, HDCP_2_2_STREAM_READY_TIMEOUT_MS, },
   1555  1.1  riastrad };
   1556  1.1  riastrad 
   1557  1.1  riastrad static
   1558  1.1  riastrad int intel_hdmi_hdcp2_read_rx_status(struct intel_digital_port *intel_dig_port,
   1559  1.1  riastrad 				    u8 *rx_status)
   1560  1.1  riastrad {
   1561  1.1  riastrad 	return intel_hdmi_hdcp_read(intel_dig_port,
   1562  1.1  riastrad 				    HDCP_2_2_HDMI_REG_RXSTATUS_OFFSET,
   1563  1.1  riastrad 				    rx_status,
   1564  1.1  riastrad 				    HDCP_2_2_HDMI_RXSTATUS_LEN);
   1565  1.1  riastrad }
   1566  1.1  riastrad 
   1567  1.1  riastrad static int get_hdcp2_msg_timeout(u8 msg_id, bool is_paired)
   1568  1.1  riastrad {
   1569  1.1  riastrad 	int i;
   1570  1.1  riastrad 
   1571  1.1  riastrad 	if (msg_id == HDCP_2_2_AKE_SEND_HPRIME) {
   1572  1.1  riastrad 		if (is_paired)
   1573  1.1  riastrad 			return HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS;
   1574  1.1  riastrad 		else
   1575  1.1  riastrad 			return HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS;
   1576  1.1  riastrad 	}
   1577  1.1  riastrad 
   1578  1.1  riastrad 	for (i = 0; i < ARRAY_SIZE(hdcp2_msg_timeout); i++) {
   1579  1.1  riastrad 		if (hdcp2_msg_timeout[i].msg_id == msg_id)
   1580  1.1  riastrad 			return hdcp2_msg_timeout[i].timeout;
   1581  1.1  riastrad 	}
   1582  1.1  riastrad 
   1583  1.1  riastrad 	return -EINVAL;
   1584  1.1  riastrad }
   1585  1.1  riastrad 
   1586  1.1  riastrad static inline
   1587  1.1  riastrad int hdcp2_detect_msg_availability(struct intel_digital_port *intel_digital_port,
   1588  1.1  riastrad 				  u8 msg_id, bool *msg_ready,
   1589  1.1  riastrad 				  ssize_t *msg_sz)
   1590  1.1  riastrad {
   1591  1.1  riastrad 	u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
   1592  1.1  riastrad 	int ret;
   1593  1.1  riastrad 
   1594  1.1  riastrad 	ret = intel_hdmi_hdcp2_read_rx_status(intel_digital_port, rx_status);
   1595  1.1  riastrad 	if (ret < 0) {
   1596  1.1  riastrad 		DRM_DEBUG_KMS("rx_status read failed. Err %d\n", ret);
   1597  1.1  riastrad 		return ret;
   1598  1.1  riastrad 	}
   1599  1.1  riastrad 
   1600  1.1  riastrad 	*msg_sz = ((HDCP_2_2_HDMI_RXSTATUS_MSG_SZ_HI(rx_status[1]) << 8) |
   1601  1.1  riastrad 		  rx_status[0]);
   1602  1.1  riastrad 
   1603  1.1  riastrad 	if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST)
   1604  1.1  riastrad 		*msg_ready = (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]) &&
   1605  1.1  riastrad 			     *msg_sz);
   1606  1.1  riastrad 	else
   1607  1.1  riastrad 		*msg_ready = *msg_sz;
   1608  1.1  riastrad 
   1609  1.1  riastrad 	return 0;
   1610  1.1  riastrad }
   1611  1.1  riastrad 
   1612  1.1  riastrad static ssize_t
   1613  1.1  riastrad intel_hdmi_hdcp2_wait_for_msg(struct intel_digital_port *intel_dig_port,
   1614  1.1  riastrad 			      u8 msg_id, bool paired)
   1615  1.1  riastrad {
   1616  1.1  riastrad 	bool msg_ready = false;
   1617  1.1  riastrad 	int timeout, ret;
   1618  1.1  riastrad 	ssize_t msg_sz = 0;
   1619  1.1  riastrad 
   1620  1.1  riastrad 	timeout = get_hdcp2_msg_timeout(msg_id, paired);
   1621  1.1  riastrad 	if (timeout < 0)
   1622  1.1  riastrad 		return timeout;
   1623  1.1  riastrad 
   1624  1.1  riastrad 	ret = __wait_for(ret = hdcp2_detect_msg_availability(intel_dig_port,
   1625  1.1  riastrad 							     msg_id, &msg_ready,
   1626  1.1  riastrad 							     &msg_sz),
   1627  1.1  riastrad 			 !ret && msg_ready && msg_sz, timeout * 1000,
   1628  1.1  riastrad 			 1000, 5 * 1000);
   1629  1.1  riastrad 	if (ret)
   1630  1.1  riastrad 		DRM_DEBUG_KMS("msg_id: %d, ret: %d, timeout: %d\n",
   1631  1.1  riastrad 			      msg_id, ret, timeout);
   1632  1.1  riastrad 
   1633  1.1  riastrad 	return ret ? ret : msg_sz;
   1634  1.1  riastrad }
   1635  1.1  riastrad 
   1636  1.1  riastrad static
   1637  1.1  riastrad int intel_hdmi_hdcp2_write_msg(struct intel_digital_port *intel_dig_port,
   1638  1.1  riastrad 			       void *buf, size_t size)
   1639  1.1  riastrad {
   1640  1.1  riastrad 	unsigned int offset;
   1641  1.1  riastrad 
   1642  1.1  riastrad 	offset = HDCP_2_2_HDMI_REG_WR_MSG_OFFSET;
   1643  1.1  riastrad 	return intel_hdmi_hdcp_write(intel_dig_port, offset, buf, size);
   1644  1.1  riastrad }
   1645  1.1  riastrad 
   1646  1.1  riastrad static
   1647  1.1  riastrad int intel_hdmi_hdcp2_read_msg(struct intel_digital_port *intel_dig_port,
   1648  1.1  riastrad 			      u8 msg_id, void *buf, size_t size)
   1649  1.1  riastrad {
   1650  1.1  riastrad 	struct intel_hdmi *hdmi = &intel_dig_port->hdmi;
   1651  1.1  riastrad 	struct intel_hdcp *hdcp = &hdmi->attached_connector->hdcp;
   1652  1.1  riastrad 	unsigned int offset;
   1653  1.1  riastrad 	ssize_t ret;
   1654  1.1  riastrad 
   1655  1.1  riastrad 	ret = intel_hdmi_hdcp2_wait_for_msg(intel_dig_port, msg_id,
   1656  1.1  riastrad 					    hdcp->is_paired);
   1657  1.1  riastrad 	if (ret < 0)
   1658  1.1  riastrad 		return ret;
   1659  1.1  riastrad 
   1660  1.1  riastrad 	/*
   1661  1.1  riastrad 	 * Available msg size should be equal to or lesser than the
   1662  1.1  riastrad 	 * available buffer.
   1663  1.1  riastrad 	 */
   1664  1.1  riastrad 	if (ret > size) {
   1665  1.1  riastrad 		DRM_DEBUG_KMS("msg_sz(%zd) is more than exp size(%zu)\n",
   1666  1.1  riastrad 			      ret, size);
   1667  1.1  riastrad 		return -1;
   1668  1.1  riastrad 	}
   1669  1.1  riastrad 
   1670  1.1  riastrad 	offset = HDCP_2_2_HDMI_REG_RD_MSG_OFFSET;
   1671  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, offset, buf, ret);
   1672  1.1  riastrad 	if (ret)
   1673  1.1  riastrad 		DRM_DEBUG_KMS("Failed to read msg_id: %d(%zd)\n", msg_id, ret);
   1674  1.1  riastrad 
   1675  1.1  riastrad 	return ret;
   1676  1.1  riastrad }
   1677  1.1  riastrad 
   1678  1.1  riastrad static
   1679  1.1  riastrad int intel_hdmi_hdcp2_check_link(struct intel_digital_port *intel_dig_port)
   1680  1.1  riastrad {
   1681  1.1  riastrad 	u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
   1682  1.1  riastrad 	int ret;
   1683  1.1  riastrad 
   1684  1.1  riastrad 	ret = intel_hdmi_hdcp2_read_rx_status(intel_dig_port, rx_status);
   1685  1.1  riastrad 	if (ret)
   1686  1.1  riastrad 		return ret;
   1687  1.1  riastrad 
   1688  1.1  riastrad 	/*
   1689  1.1  riastrad 	 * Re-auth request and Link Integrity Failures are represented by
   1690  1.1  riastrad 	 * same bit. i.e reauth_req.
   1691  1.1  riastrad 	 */
   1692  1.1  riastrad 	if (HDCP_2_2_HDMI_RXSTATUS_REAUTH_REQ(rx_status[1]))
   1693  1.1  riastrad 		ret = HDCP_REAUTH_REQUEST;
   1694  1.1  riastrad 	else if (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]))
   1695  1.1  riastrad 		ret = HDCP_TOPOLOGY_CHANGE;
   1696  1.1  riastrad 
   1697  1.1  riastrad 	return ret;
   1698  1.1  riastrad }
   1699  1.1  riastrad 
   1700  1.1  riastrad static
   1701  1.1  riastrad int intel_hdmi_hdcp2_capable(struct intel_digital_port *intel_dig_port,
   1702  1.1  riastrad 			     bool *capable)
   1703  1.1  riastrad {
   1704  1.1  riastrad 	u8 hdcp2_version;
   1705  1.1  riastrad 	int ret;
   1706  1.1  riastrad 
   1707  1.1  riastrad 	*capable = false;
   1708  1.1  riastrad 	ret = intel_hdmi_hdcp_read(intel_dig_port, HDCP_2_2_HDMI_REG_VER_OFFSET,
   1709  1.1  riastrad 				   &hdcp2_version, sizeof(hdcp2_version));
   1710  1.1  riastrad 	if (!ret && hdcp2_version & HDCP_2_2_HDMI_SUPPORT_MASK)
   1711  1.1  riastrad 		*capable = true;
   1712  1.1  riastrad 
   1713  1.1  riastrad 	return ret;
   1714  1.1  riastrad }
   1715  1.1  riastrad 
   1716  1.1  riastrad static inline
   1717  1.1  riastrad enum hdcp_wired_protocol intel_hdmi_hdcp2_protocol(void)
   1718  1.1  riastrad {
   1719  1.1  riastrad 	return HDCP_PROTOCOL_HDMI;
   1720  1.1  riastrad }
   1721  1.1  riastrad 
   1722  1.1  riastrad static const struct intel_hdcp_shim intel_hdmi_hdcp_shim = {
   1723  1.1  riastrad 	.write_an_aksv = intel_hdmi_hdcp_write_an_aksv,
   1724  1.1  riastrad 	.read_bksv = intel_hdmi_hdcp_read_bksv,
   1725  1.1  riastrad 	.read_bstatus = intel_hdmi_hdcp_read_bstatus,
   1726  1.1  riastrad 	.repeater_present = intel_hdmi_hdcp_repeater_present,
   1727  1.1  riastrad 	.read_ri_prime = intel_hdmi_hdcp_read_ri_prime,
   1728  1.1  riastrad 	.read_ksv_ready = intel_hdmi_hdcp_read_ksv_ready,
   1729  1.1  riastrad 	.read_ksv_fifo = intel_hdmi_hdcp_read_ksv_fifo,
   1730  1.1  riastrad 	.read_v_prime_part = intel_hdmi_hdcp_read_v_prime_part,
   1731  1.1  riastrad 	.toggle_signalling = intel_hdmi_hdcp_toggle_signalling,
   1732  1.1  riastrad 	.check_link = intel_hdmi_hdcp_check_link,
   1733  1.1  riastrad 	.write_2_2_msg = intel_hdmi_hdcp2_write_msg,
   1734  1.1  riastrad 	.read_2_2_msg = intel_hdmi_hdcp2_read_msg,
   1735  1.1  riastrad 	.check_2_2_link	= intel_hdmi_hdcp2_check_link,
   1736  1.1  riastrad 	.hdcp_2_2_capable = intel_hdmi_hdcp2_capable,
   1737  1.1  riastrad 	.protocol = HDCP_PROTOCOL_HDMI,
   1738  1.1  riastrad };
   1739  1.1  riastrad 
   1740  1.1  riastrad static void intel_hdmi_prepare(struct intel_encoder *encoder,
   1741  1.1  riastrad 			       const struct intel_crtc_state *crtc_state)
   1742  1.1  riastrad {
   1743  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   1744  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   1745  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
   1746  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1747  1.1  riastrad 	const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
   1748  1.1  riastrad 	u32 hdmi_val;
   1749  1.1  riastrad 
   1750  1.1  riastrad 	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
   1751  1.1  riastrad 
   1752  1.1  riastrad 	hdmi_val = SDVO_ENCODING_HDMI;
   1753  1.1  riastrad 	if (!HAS_PCH_SPLIT(dev_priv) && crtc_state->limited_color_range)
   1754  1.1  riastrad 		hdmi_val |= HDMI_COLOR_RANGE_16_235;
   1755  1.1  riastrad 	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
   1756  1.1  riastrad 		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
   1757  1.1  riastrad 	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
   1758  1.1  riastrad 		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
   1759  1.1  riastrad 
   1760  1.1  riastrad 	if (crtc_state->pipe_bpp > 24)
   1761  1.1  riastrad 		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
   1762  1.1  riastrad 	else
   1763  1.1  riastrad 		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
   1764  1.1  riastrad 
   1765  1.1  riastrad 	if (crtc_state->has_hdmi_sink)
   1766  1.1  riastrad 		hdmi_val |= HDMI_MODE_SELECT_HDMI;
   1767  1.1  riastrad 
   1768  1.1  riastrad 	if (HAS_PCH_CPT(dev_priv))
   1769  1.1  riastrad 		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
   1770  1.1  riastrad 	else if (IS_CHERRYVIEW(dev_priv))
   1771  1.1  riastrad 		hdmi_val |= SDVO_PIPE_SEL_CHV(crtc->pipe);
   1772  1.1  riastrad 	else
   1773  1.1  riastrad 		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
   1774  1.1  riastrad 
   1775  1.1  riastrad 	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
   1776  1.1  riastrad 	POSTING_READ(intel_hdmi->hdmi_reg);
   1777  1.1  riastrad }
   1778  1.1  riastrad 
   1779  1.1  riastrad static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
   1780  1.1  riastrad 				    enum pipe *pipe)
   1781  1.1  riastrad {
   1782  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   1783  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1784  1.1  riastrad 	intel_wakeref_t wakeref;
   1785  1.1  riastrad 	bool ret;
   1786  1.1  riastrad 
   1787  1.1  riastrad 	wakeref = intel_display_power_get_if_enabled(dev_priv,
   1788  1.1  riastrad 						     encoder->power_domain);
   1789  1.1  riastrad 	if (!wakeref)
   1790  1.1  riastrad 		return false;
   1791  1.1  riastrad 
   1792  1.1  riastrad 	ret = intel_sdvo_port_enabled(dev_priv, intel_hdmi->hdmi_reg, pipe);
   1793  1.1  riastrad 
   1794  1.1  riastrad 	intel_display_power_put(dev_priv, encoder->power_domain, wakeref);
   1795  1.1  riastrad 
   1796  1.1  riastrad 	return ret;
   1797  1.1  riastrad }
   1798  1.1  riastrad 
   1799  1.1  riastrad static void intel_hdmi_get_config(struct intel_encoder *encoder,
   1800  1.1  riastrad 				  struct intel_crtc_state *pipe_config)
   1801  1.1  riastrad {
   1802  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1803  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   1804  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   1805  1.1  riastrad 	u32 tmp, flags = 0;
   1806  1.1  riastrad 	int dotclock;
   1807  1.1  riastrad 
   1808  1.1  riastrad 	pipe_config->output_types |= BIT(INTEL_OUTPUT_HDMI);
   1809  1.1  riastrad 
   1810  1.1  riastrad 	tmp = I915_READ(intel_hdmi->hdmi_reg);
   1811  1.1  riastrad 
   1812  1.1  riastrad 	if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
   1813  1.1  riastrad 		flags |= DRM_MODE_FLAG_PHSYNC;
   1814  1.1  riastrad 	else
   1815  1.1  riastrad 		flags |= DRM_MODE_FLAG_NHSYNC;
   1816  1.1  riastrad 
   1817  1.1  riastrad 	if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
   1818  1.1  riastrad 		flags |= DRM_MODE_FLAG_PVSYNC;
   1819  1.1  riastrad 	else
   1820  1.1  riastrad 		flags |= DRM_MODE_FLAG_NVSYNC;
   1821  1.1  riastrad 
   1822  1.1  riastrad 	if (tmp & HDMI_MODE_SELECT_HDMI)
   1823  1.1  riastrad 		pipe_config->has_hdmi_sink = true;
   1824  1.1  riastrad 
   1825  1.1  riastrad 	pipe_config->infoframes.enable |=
   1826  1.1  riastrad 		intel_hdmi_infoframes_enabled(encoder, pipe_config);
   1827  1.1  riastrad 
   1828  1.1  riastrad 	if (pipe_config->infoframes.enable)
   1829  1.1  riastrad 		pipe_config->has_infoframe = true;
   1830  1.1  riastrad 
   1831  1.1  riastrad 	if (tmp & HDMI_AUDIO_ENABLE)
   1832  1.1  riastrad 		pipe_config->has_audio = true;
   1833  1.1  riastrad 
   1834  1.1  riastrad 	if (!HAS_PCH_SPLIT(dev_priv) &&
   1835  1.1  riastrad 	    tmp & HDMI_COLOR_RANGE_16_235)
   1836  1.1  riastrad 		pipe_config->limited_color_range = true;
   1837  1.1  riastrad 
   1838  1.1  riastrad 	pipe_config->hw.adjusted_mode.flags |= flags;
   1839  1.1  riastrad 
   1840  1.1  riastrad 	if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
   1841  1.1  riastrad 		dotclock = pipe_config->port_clock * 2 / 3;
   1842  1.1  riastrad 	else
   1843  1.1  riastrad 		dotclock = pipe_config->port_clock;
   1844  1.1  riastrad 
   1845  1.1  riastrad 	if (pipe_config->pixel_multiplier)
   1846  1.1  riastrad 		dotclock /= pipe_config->pixel_multiplier;
   1847  1.1  riastrad 
   1848  1.1  riastrad 	pipe_config->hw.adjusted_mode.crtc_clock = dotclock;
   1849  1.1  riastrad 
   1850  1.1  riastrad 	pipe_config->lane_count = 4;
   1851  1.1  riastrad 
   1852  1.1  riastrad 	intel_hdmi_read_gcp_infoframe(encoder, pipe_config);
   1853  1.1  riastrad 
   1854  1.1  riastrad 	intel_read_infoframe(encoder, pipe_config,
   1855  1.1  riastrad 			     HDMI_INFOFRAME_TYPE_AVI,
   1856  1.1  riastrad 			     &pipe_config->infoframes.avi);
   1857  1.1  riastrad 	intel_read_infoframe(encoder, pipe_config,
   1858  1.1  riastrad 			     HDMI_INFOFRAME_TYPE_SPD,
   1859  1.1  riastrad 			     &pipe_config->infoframes.spd);
   1860  1.1  riastrad 	intel_read_infoframe(encoder, pipe_config,
   1861  1.1  riastrad 			     HDMI_INFOFRAME_TYPE_VENDOR,
   1862  1.1  riastrad 			     &pipe_config->infoframes.hdmi);
   1863  1.1  riastrad }
   1864  1.1  riastrad 
   1865  1.1  riastrad static void intel_enable_hdmi_audio(struct intel_encoder *encoder,
   1866  1.1  riastrad 				    const struct intel_crtc_state *pipe_config,
   1867  1.1  riastrad 				    const struct drm_connector_state *conn_state)
   1868  1.1  riastrad {
   1869  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
   1870  1.1  riastrad 
   1871  1.1  riastrad 	WARN_ON(!pipe_config->has_hdmi_sink);
   1872  1.1  riastrad 	DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
   1873  1.1  riastrad 			 pipe_name(crtc->pipe));
   1874  1.1  riastrad 	intel_audio_codec_enable(encoder, pipe_config, conn_state);
   1875  1.1  riastrad }
   1876  1.1  riastrad 
   1877  1.1  riastrad static void g4x_enable_hdmi(struct intel_encoder *encoder,
   1878  1.1  riastrad 			    const struct intel_crtc_state *pipe_config,
   1879  1.1  riastrad 			    const struct drm_connector_state *conn_state)
   1880  1.1  riastrad {
   1881  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   1882  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   1883  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1884  1.1  riastrad 	u32 temp;
   1885  1.1  riastrad 
   1886  1.1  riastrad 	temp = I915_READ(intel_hdmi->hdmi_reg);
   1887  1.1  riastrad 
   1888  1.1  riastrad 	temp |= SDVO_ENABLE;
   1889  1.1  riastrad 	if (pipe_config->has_audio)
   1890  1.1  riastrad 		temp |= HDMI_AUDIO_ENABLE;
   1891  1.1  riastrad 
   1892  1.1  riastrad 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1893  1.1  riastrad 	POSTING_READ(intel_hdmi->hdmi_reg);
   1894  1.1  riastrad 
   1895  1.1  riastrad 	if (pipe_config->has_audio)
   1896  1.1  riastrad 		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
   1897  1.1  riastrad }
   1898  1.1  riastrad 
   1899  1.1  riastrad static void ibx_enable_hdmi(struct intel_encoder *encoder,
   1900  1.1  riastrad 			    const struct intel_crtc_state *pipe_config,
   1901  1.1  riastrad 			    const struct drm_connector_state *conn_state)
   1902  1.1  riastrad {
   1903  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   1904  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   1905  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1906  1.1  riastrad 	u32 temp;
   1907  1.1  riastrad 
   1908  1.1  riastrad 	temp = I915_READ(intel_hdmi->hdmi_reg);
   1909  1.1  riastrad 
   1910  1.1  riastrad 	temp |= SDVO_ENABLE;
   1911  1.1  riastrad 	if (pipe_config->has_audio)
   1912  1.1  riastrad 		temp |= HDMI_AUDIO_ENABLE;
   1913  1.1  riastrad 
   1914  1.1  riastrad 	/*
   1915  1.1  riastrad 	 * HW workaround, need to write this twice for issue
   1916  1.1  riastrad 	 * that may result in first write getting masked.
   1917  1.1  riastrad 	 */
   1918  1.1  riastrad 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1919  1.1  riastrad 	POSTING_READ(intel_hdmi->hdmi_reg);
   1920  1.1  riastrad 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1921  1.1  riastrad 	POSTING_READ(intel_hdmi->hdmi_reg);
   1922  1.1  riastrad 
   1923  1.1  riastrad 	/*
   1924  1.1  riastrad 	 * HW workaround, need to toggle enable bit off and on
   1925  1.1  riastrad 	 * for 12bpc with pixel repeat.
   1926  1.1  riastrad 	 *
   1927  1.1  riastrad 	 * FIXME: BSpec says this should be done at the end of
   1928  1.1  riastrad 	 * of the modeset sequence, so not sure if this isn't too soon.
   1929  1.1  riastrad 	 */
   1930  1.1  riastrad 	if (pipe_config->pipe_bpp > 24 &&
   1931  1.1  riastrad 	    pipe_config->pixel_multiplier > 1) {
   1932  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
   1933  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   1934  1.1  riastrad 
   1935  1.1  riastrad 		/*
   1936  1.1  riastrad 		 * HW workaround, need to write this twice for issue
   1937  1.1  riastrad 		 * that may result in first write getting masked.
   1938  1.1  riastrad 		 */
   1939  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1940  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   1941  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1942  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   1943  1.1  riastrad 	}
   1944  1.1  riastrad 
   1945  1.1  riastrad 	if (pipe_config->has_audio)
   1946  1.1  riastrad 		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
   1947  1.1  riastrad }
   1948  1.1  riastrad 
   1949  1.1  riastrad static void cpt_enable_hdmi(struct intel_encoder *encoder,
   1950  1.1  riastrad 			    const struct intel_crtc_state *pipe_config,
   1951  1.1  riastrad 			    const struct drm_connector_state *conn_state)
   1952  1.1  riastrad {
   1953  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   1954  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   1955  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
   1956  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   1957  1.1  riastrad 	enum pipe pipe = crtc->pipe;
   1958  1.1  riastrad 	u32 temp;
   1959  1.1  riastrad 
   1960  1.1  riastrad 	temp = I915_READ(intel_hdmi->hdmi_reg);
   1961  1.1  riastrad 
   1962  1.1  riastrad 	temp |= SDVO_ENABLE;
   1963  1.1  riastrad 	if (pipe_config->has_audio)
   1964  1.1  riastrad 		temp |= HDMI_AUDIO_ENABLE;
   1965  1.1  riastrad 
   1966  1.1  riastrad 	/*
   1967  1.1  riastrad 	 * WaEnableHDMI8bpcBefore12bpc:snb,ivb
   1968  1.1  riastrad 	 *
   1969  1.1  riastrad 	 * The procedure for 12bpc is as follows:
   1970  1.1  riastrad 	 * 1. disable HDMI clock gating
   1971  1.1  riastrad 	 * 2. enable HDMI with 8bpc
   1972  1.1  riastrad 	 * 3. enable HDMI with 12bpc
   1973  1.1  riastrad 	 * 4. enable HDMI clock gating
   1974  1.1  riastrad 	 */
   1975  1.1  riastrad 
   1976  1.1  riastrad 	if (pipe_config->pipe_bpp > 24) {
   1977  1.1  riastrad 		I915_WRITE(TRANS_CHICKEN1(pipe),
   1978  1.1  riastrad 			   I915_READ(TRANS_CHICKEN1(pipe)) |
   1979  1.1  riastrad 			   TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);
   1980  1.1  riastrad 
   1981  1.1  riastrad 		temp &= ~SDVO_COLOR_FORMAT_MASK;
   1982  1.1  riastrad 		temp |= SDVO_COLOR_FORMAT_8bpc;
   1983  1.1  riastrad 	}
   1984  1.1  riastrad 
   1985  1.1  riastrad 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1986  1.1  riastrad 	POSTING_READ(intel_hdmi->hdmi_reg);
   1987  1.1  riastrad 
   1988  1.1  riastrad 	if (pipe_config->pipe_bpp > 24) {
   1989  1.1  riastrad 		temp &= ~SDVO_COLOR_FORMAT_MASK;
   1990  1.1  riastrad 		temp |= HDMI_COLOR_FORMAT_12bpc;
   1991  1.1  riastrad 
   1992  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
   1993  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   1994  1.1  riastrad 
   1995  1.1  riastrad 		I915_WRITE(TRANS_CHICKEN1(pipe),
   1996  1.1  riastrad 			   I915_READ(TRANS_CHICKEN1(pipe)) &
   1997  1.1  riastrad 			   ~TRANS_CHICKEN1_HDMIUNIT_GC_DISABLE);
   1998  1.1  riastrad 	}
   1999  1.1  riastrad 
   2000  1.1  riastrad 	if (pipe_config->has_audio)
   2001  1.1  riastrad 		intel_enable_hdmi_audio(encoder, pipe_config, conn_state);
   2002  1.1  riastrad }
   2003  1.1  riastrad 
   2004  1.1  riastrad static void vlv_enable_hdmi(struct intel_encoder *encoder,
   2005  1.1  riastrad 			    const struct intel_crtc_state *pipe_config,
   2006  1.1  riastrad 			    const struct drm_connector_state *conn_state)
   2007  1.1  riastrad {
   2008  1.1  riastrad }
   2009  1.1  riastrad 
   2010  1.1  riastrad static void intel_disable_hdmi(struct intel_encoder *encoder,
   2011  1.1  riastrad 			       const struct intel_crtc_state *old_crtc_state,
   2012  1.1  riastrad 			       const struct drm_connector_state *old_conn_state)
   2013  1.1  riastrad {
   2014  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   2015  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   2016  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   2017  1.1  riastrad 	struct intel_digital_port *intel_dig_port =
   2018  1.1  riastrad 		hdmi_to_dig_port(intel_hdmi);
   2019  1.1  riastrad 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
   2020  1.1  riastrad 	u32 temp;
   2021  1.1  riastrad 
   2022  1.1  riastrad 	temp = I915_READ(intel_hdmi->hdmi_reg);
   2023  1.1  riastrad 
   2024  1.1  riastrad 	temp &= ~(SDVO_ENABLE | HDMI_AUDIO_ENABLE);
   2025  1.1  riastrad 	I915_WRITE(intel_hdmi->hdmi_reg, temp);
   2026  1.1  riastrad 	POSTING_READ(intel_hdmi->hdmi_reg);
   2027  1.1  riastrad 
   2028  1.1  riastrad 	/*
   2029  1.1  riastrad 	 * HW workaround for IBX, we need to move the port
   2030  1.1  riastrad 	 * to transcoder A after disabling it to allow the
   2031  1.1  riastrad 	 * matching DP port to be enabled on transcoder A.
   2032  1.1  riastrad 	 */
   2033  1.1  riastrad 	if (HAS_PCH_IBX(dev_priv) && crtc->pipe == PIPE_B) {
   2034  1.1  riastrad 		/*
   2035  1.1  riastrad 		 * We get CPU/PCH FIFO underruns on the other pipe when
   2036  1.1  riastrad 		 * doing the workaround. Sweep them under the rug.
   2037  1.1  riastrad 		 */
   2038  1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, false);
   2039  1.1  riastrad 		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, false);
   2040  1.1  riastrad 
   2041  1.1  riastrad 		temp &= ~SDVO_PIPE_SEL_MASK;
   2042  1.1  riastrad 		temp |= SDVO_ENABLE | SDVO_PIPE_SEL(PIPE_A);
   2043  1.1  riastrad 		/*
   2044  1.1  riastrad 		 * HW workaround, need to write this twice for issue
   2045  1.1  riastrad 		 * that may result in first write getting masked.
   2046  1.1  riastrad 		 */
   2047  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
   2048  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   2049  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
   2050  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   2051  1.1  riastrad 
   2052  1.1  riastrad 		temp &= ~SDVO_ENABLE;
   2053  1.1  riastrad 		I915_WRITE(intel_hdmi->hdmi_reg, temp);
   2054  1.1  riastrad 		POSTING_READ(intel_hdmi->hdmi_reg);
   2055  1.1  riastrad 
   2056  1.1  riastrad 		intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
   2057  1.1  riastrad 		intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
   2058  1.1  riastrad 		intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A, true);
   2059  1.1  riastrad 	}
   2060  1.1  riastrad 
   2061  1.1  riastrad 	intel_dig_port->set_infoframes(encoder,
   2062  1.1  riastrad 				       false,
   2063  1.1  riastrad 				       old_crtc_state, old_conn_state);
   2064  1.1  riastrad 
   2065  1.1  riastrad 	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);
   2066  1.1  riastrad }
   2067  1.1  riastrad 
   2068  1.1  riastrad static void g4x_disable_hdmi(struct intel_encoder *encoder,
   2069  1.1  riastrad 			     const struct intel_crtc_state *old_crtc_state,
   2070  1.1  riastrad 			     const struct drm_connector_state *old_conn_state)
   2071  1.1  riastrad {
   2072  1.1  riastrad 	if (old_crtc_state->has_audio)
   2073  1.1  riastrad 		intel_audio_codec_disable(encoder,
   2074  1.1  riastrad 					  old_crtc_state, old_conn_state);
   2075  1.1  riastrad 
   2076  1.1  riastrad 	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
   2077  1.1  riastrad }
   2078  1.1  riastrad 
   2079  1.1  riastrad static void pch_disable_hdmi(struct intel_encoder *encoder,
   2080  1.1  riastrad 			     const struct intel_crtc_state *old_crtc_state,
   2081  1.1  riastrad 			     const struct drm_connector_state *old_conn_state)
   2082  1.1  riastrad {
   2083  1.1  riastrad 	if (old_crtc_state->has_audio)
   2084  1.1  riastrad 		intel_audio_codec_disable(encoder,
   2085  1.1  riastrad 					  old_crtc_state, old_conn_state);
   2086  1.1  riastrad }
   2087  1.1  riastrad 
   2088  1.1  riastrad static void pch_post_disable_hdmi(struct intel_encoder *encoder,
   2089  1.1  riastrad 				  const struct intel_crtc_state *old_crtc_state,
   2090  1.1  riastrad 				  const struct drm_connector_state *old_conn_state)
   2091  1.1  riastrad {
   2092  1.1  riastrad 	intel_disable_hdmi(encoder, old_crtc_state, old_conn_state);
   2093  1.1  riastrad }
   2094  1.1  riastrad 
   2095  1.1  riastrad static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
   2096  1.1  riastrad {
   2097  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   2098  1.1  riastrad 	const struct ddi_vbt_port_info *info =
   2099  1.1  riastrad 		&dev_priv->vbt.ddi_port_info[encoder->port];
   2100  1.1  riastrad 	int max_tmds_clock;
   2101  1.1  riastrad 
   2102  1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   2103  1.1  riastrad 		max_tmds_clock = 594000;
   2104  1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 8 || IS_HASWELL(dev_priv))
   2105  1.1  riastrad 		max_tmds_clock = 300000;
   2106  1.1  riastrad 	else if (INTEL_GEN(dev_priv) >= 5)
   2107  1.1  riastrad 		max_tmds_clock = 225000;
   2108  1.1  riastrad 	else
   2109  1.1  riastrad 		max_tmds_clock = 165000;
   2110  1.1  riastrad 
   2111  1.1  riastrad 	if (info->max_tmds_clock)
   2112  1.1  riastrad 		max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock);
   2113  1.1  riastrad 
   2114  1.1  riastrad 	return max_tmds_clock;
   2115  1.1  riastrad }
   2116  1.1  riastrad 
   2117  1.1  riastrad static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
   2118  1.1  riastrad 				 bool respect_downstream_limits,
   2119  1.1  riastrad 				 bool force_dvi)
   2120  1.1  riastrad {
   2121  1.1  riastrad 	struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
   2122  1.1  riastrad 	int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
   2123  1.1  riastrad 
   2124  1.1  riastrad 	if (respect_downstream_limits) {
   2125  1.1  riastrad 		struct intel_connector *connector = hdmi->attached_connector;
   2126  1.1  riastrad 		const struct drm_display_info *info = &connector->base.display_info;
   2127  1.1  riastrad 
   2128  1.1  riastrad 		if (hdmi->dp_dual_mode.max_tmds_clock)
   2129  1.1  riastrad 			max_tmds_clock = min(max_tmds_clock,
   2130  1.1  riastrad 					     hdmi->dp_dual_mode.max_tmds_clock);
   2131  1.1  riastrad 
   2132  1.1  riastrad 		if (info->max_tmds_clock)
   2133  1.1  riastrad 			max_tmds_clock = min(max_tmds_clock,
   2134  1.1  riastrad 					     info->max_tmds_clock);
   2135  1.1  riastrad 		else if (!hdmi->has_hdmi_sink || force_dvi)
   2136  1.1  riastrad 			max_tmds_clock = min(max_tmds_clock, 165000);
   2137  1.1  riastrad 	}
   2138  1.1  riastrad 
   2139  1.1  riastrad 	return max_tmds_clock;
   2140  1.1  riastrad }
   2141  1.1  riastrad 
   2142  1.1  riastrad static enum drm_mode_status
   2143  1.1  riastrad hdmi_port_clock_valid(struct intel_hdmi *hdmi,
   2144  1.1  riastrad 		      int clock, bool respect_downstream_limits,
   2145  1.1  riastrad 		      bool force_dvi)
   2146  1.1  riastrad {
   2147  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(intel_hdmi_to_dev(hdmi));
   2148  1.1  riastrad 
   2149  1.1  riastrad 	if (clock < 25000)
   2150  1.1  riastrad 		return MODE_CLOCK_LOW;
   2151  1.1  riastrad 	if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits, force_dvi))
   2152  1.1  riastrad 		return MODE_CLOCK_HIGH;
   2153  1.1  riastrad 
   2154  1.1  riastrad 	/* BXT DPLL can't generate 223-240 MHz */
   2155  1.1  riastrad 	if (IS_GEN9_LP(dev_priv) && clock > 223333 && clock < 240000)
   2156  1.1  riastrad 		return MODE_CLOCK_RANGE;
   2157  1.1  riastrad 
   2158  1.1  riastrad 	/* CHV DPLL can't generate 216-240 MHz */
   2159  1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
   2160  1.1  riastrad 		return MODE_CLOCK_RANGE;
   2161  1.1  riastrad 
   2162  1.1  riastrad 	return MODE_OK;
   2163  1.1  riastrad }
   2164  1.1  riastrad 
   2165  1.1  riastrad static enum drm_mode_status
   2166  1.1  riastrad intel_hdmi_mode_valid(struct drm_connector *connector,
   2167  1.1  riastrad 		      struct drm_display_mode *mode)
   2168  1.1  riastrad {
   2169  1.1  riastrad 	struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
   2170  1.1  riastrad 	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
   2171  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   2172  1.1  riastrad 	enum drm_mode_status status;
   2173  1.1  riastrad 	int clock;
   2174  1.1  riastrad 	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
   2175  1.1  riastrad 	bool force_dvi =
   2176  1.1  riastrad 		READ_ONCE(to_intel_digital_connector_state(connector->state)->force_audio) == HDMI_AUDIO_OFF_DVI;
   2177  1.1  riastrad 
   2178  1.1  riastrad 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
   2179  1.1  riastrad 		return MODE_NO_DBLESCAN;
   2180  1.1  riastrad 
   2181  1.1  riastrad 	clock = mode->clock;
   2182  1.1  riastrad 
   2183  1.1  riastrad 	if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
   2184  1.1  riastrad 		clock *= 2;
   2185  1.1  riastrad 
   2186  1.1  riastrad 	if (clock > max_dotclk)
   2187  1.1  riastrad 		return MODE_CLOCK_HIGH;
   2188  1.1  riastrad 
   2189  1.1  riastrad 	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
   2190  1.1  riastrad 		clock *= 2;
   2191  1.1  riastrad 
   2192  1.1  riastrad 	if (drm_mode_is_420_only(&connector->display_info, mode))
   2193  1.1  riastrad 		clock /= 2;
   2194  1.1  riastrad 
   2195  1.1  riastrad 	/* check if we can do 8bpc */
   2196  1.1  riastrad 	status = hdmi_port_clock_valid(hdmi, clock, true, force_dvi);
   2197  1.1  riastrad 
   2198  1.1  riastrad 	if (hdmi->has_hdmi_sink && !force_dvi) {
   2199  1.1  riastrad 		/* if we can't do 8bpc we may still be able to do 12bpc */
   2200  1.1  riastrad 		if (status != MODE_OK && !HAS_GMCH(dev_priv))
   2201  1.1  riastrad 			status = hdmi_port_clock_valid(hdmi, clock * 3 / 2,
   2202  1.1  riastrad 						       true, force_dvi);
   2203  1.1  riastrad 
   2204  1.1  riastrad 		/* if we can't do 8,12bpc we may still be able to do 10bpc */
   2205  1.1  riastrad 		if (status != MODE_OK && INTEL_GEN(dev_priv) >= 11)
   2206  1.1  riastrad 			status = hdmi_port_clock_valid(hdmi, clock * 5 / 4,
   2207  1.1  riastrad 						       true, force_dvi);
   2208  1.1  riastrad 	}
   2209  1.1  riastrad 	if (status != MODE_OK)
   2210  1.1  riastrad 		return status;
   2211  1.1  riastrad 
   2212  1.1  riastrad 	return intel_mode_valid_max_plane_size(dev_priv, mode);
   2213  1.1  riastrad }
   2214  1.1  riastrad 
   2215  1.1  riastrad static bool hdmi_deep_color_possible(const struct intel_crtc_state *crtc_state,
   2216  1.1  riastrad 				     int bpc)
   2217  1.1  riastrad {
   2218  1.1  riastrad 	struct drm_i915_private *dev_priv =
   2219  1.1  riastrad 		to_i915(crtc_state->uapi.crtc->dev);
   2220  1.1  riastrad 	struct drm_atomic_state *state = crtc_state->uapi.state;
   2221  1.1  riastrad 	struct drm_connector_state *connector_state;
   2222  1.1  riastrad 	struct drm_connector *connector;
   2223  1.1  riastrad 	const struct drm_display_mode *adjusted_mode =
   2224  1.1  riastrad 		&crtc_state->hw.adjusted_mode;
   2225  1.1  riastrad 	int i;
   2226  1.1  riastrad 
   2227  1.1  riastrad 	if (HAS_GMCH(dev_priv))
   2228  1.1  riastrad 		return false;
   2229  1.1  riastrad 
   2230  1.1  riastrad 	if (bpc == 10 && INTEL_GEN(dev_priv) < 11)
   2231  1.1  riastrad 		return false;
   2232  1.1  riastrad 
   2233  1.1  riastrad 	if (crtc_state->pipe_bpp < bpc * 3)
   2234  1.1  riastrad 		return false;
   2235  1.1  riastrad 
   2236  1.1  riastrad 	if (!crtc_state->has_hdmi_sink)
   2237  1.1  riastrad 		return false;
   2238  1.1  riastrad 
   2239  1.1  riastrad 	/*
   2240  1.1  riastrad 	 * HDMI deep color affects the clocks, so it's only possible
   2241  1.1  riastrad 	 * when not cloning with other encoder types.
   2242  1.1  riastrad 	 */
   2243  1.1  riastrad 	if (crtc_state->output_types != 1 << INTEL_OUTPUT_HDMI)
   2244  1.1  riastrad 		return false;
   2245  1.1  riastrad 
   2246  1.1  riastrad 	for_each_new_connector_in_state(state, connector, connector_state, i) {
   2247  1.1  riastrad 		const struct drm_display_info *info = &connector->display_info;
   2248  1.1  riastrad 
   2249  1.1  riastrad 		if (connector_state->crtc != crtc_state->uapi.crtc)
   2250  1.1  riastrad 			continue;
   2251  1.1  riastrad 
   2252  1.1  riastrad 		if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
   2253  1.1  riastrad 			const struct drm_hdmi_info *hdmi = &info->hdmi;
   2254  1.1  riastrad 
   2255  1.1  riastrad 			if (bpc == 12 && !(hdmi->y420_dc_modes &
   2256  1.1  riastrad 					   DRM_EDID_YCBCR420_DC_36))
   2257  1.1  riastrad 				return false;
   2258  1.1  riastrad 			else if (bpc == 10 && !(hdmi->y420_dc_modes &
   2259  1.1  riastrad 						DRM_EDID_YCBCR420_DC_30))
   2260  1.1  riastrad 				return false;
   2261  1.1  riastrad 		} else {
   2262  1.1  riastrad 			if (bpc == 12 && !(info->edid_hdmi_dc_modes &
   2263  1.1  riastrad 					   DRM_EDID_HDMI_DC_36))
   2264  1.1  riastrad 				return false;
   2265  1.1  riastrad 			else if (bpc == 10 && !(info->edid_hdmi_dc_modes &
   2266  1.1  riastrad 						DRM_EDID_HDMI_DC_30))
   2267  1.1  riastrad 				return false;
   2268  1.1  riastrad 		}
   2269  1.1  riastrad 	}
   2270  1.1  riastrad 
   2271  1.1  riastrad 	/* Display WA #1139: glk */
   2272  1.1  riastrad 	if (bpc == 12 && IS_GLK_REVID(dev_priv, 0, GLK_REVID_A1) &&
   2273  1.1  riastrad 	    adjusted_mode->htotal > 5460)
   2274  1.1  riastrad 		return false;
   2275  1.1  riastrad 
   2276  1.1  riastrad 	/* Display Wa_1405510057:icl */
   2277  1.1  riastrad 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420 &&
   2278  1.1  riastrad 	    bpc == 10 && INTEL_GEN(dev_priv) >= 11 &&
   2279  1.1  riastrad 	    (adjusted_mode->crtc_hblank_end -
   2280  1.1  riastrad 	     adjusted_mode->crtc_hblank_start) % 8 == 2)
   2281  1.1  riastrad 		return false;
   2282  1.1  riastrad 
   2283  1.1  riastrad 	return true;
   2284  1.1  riastrad }
   2285  1.1  riastrad 
   2286  1.1  riastrad static bool
   2287  1.1  riastrad intel_hdmi_ycbcr420_config(struct drm_connector *connector,
   2288  1.1  riastrad 			   struct intel_crtc_state *config)
   2289  1.1  riastrad {
   2290  1.1  riastrad 	struct intel_crtc *intel_crtc = to_intel_crtc(config->uapi.crtc);
   2291  1.1  riastrad 
   2292  1.1  riastrad 	if (!connector->ycbcr_420_allowed) {
   2293  1.1  riastrad 		DRM_ERROR("Platform doesn't support YCBCR420 output\n");
   2294  1.1  riastrad 		return false;
   2295  1.1  riastrad 	}
   2296  1.1  riastrad 
   2297  1.1  riastrad 	config->output_format = INTEL_OUTPUT_FORMAT_YCBCR420;
   2298  1.1  riastrad 
   2299  1.1  riastrad 	/* YCBCR 420 output conversion needs a scaler */
   2300  1.1  riastrad 	if (skl_update_scaler_crtc(config)) {
   2301  1.1  riastrad 		DRM_DEBUG_KMS("Scaler allocation for output failed\n");
   2302  1.1  riastrad 		return false;
   2303  1.1  riastrad 	}
   2304  1.1  riastrad 
   2305  1.1  riastrad 	intel_pch_panel_fitting(intel_crtc, config,
   2306  1.1  riastrad 				DRM_MODE_SCALE_FULLSCREEN);
   2307  1.1  riastrad 
   2308  1.1  riastrad 	return true;
   2309  1.1  riastrad }
   2310  1.1  riastrad 
   2311  1.1  riastrad static int intel_hdmi_port_clock(int clock, int bpc)
   2312  1.1  riastrad {
   2313  1.1  riastrad 	/*
   2314  1.1  riastrad 	 * Need to adjust the port link by:
   2315  1.1  riastrad 	 *  1.5x for 12bpc
   2316  1.1  riastrad 	 *  1.25x for 10bpc
   2317  1.1  riastrad 	 */
   2318  1.1  riastrad 	return clock * bpc / 8;
   2319  1.1  riastrad }
   2320  1.1  riastrad 
   2321  1.1  riastrad static int intel_hdmi_compute_bpc(struct intel_encoder *encoder,
   2322  1.1  riastrad 				  struct intel_crtc_state *crtc_state,
   2323  1.1  riastrad 				  int clock, bool force_dvi)
   2324  1.1  riastrad {
   2325  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   2326  1.1  riastrad 	int bpc;
   2327  1.1  riastrad 
   2328  1.1  riastrad 	for (bpc = 12; bpc >= 10; bpc -= 2) {
   2329  1.1  riastrad 		if (hdmi_deep_color_possible(crtc_state, bpc) &&
   2330  1.1  riastrad 		    hdmi_port_clock_valid(intel_hdmi,
   2331  1.1  riastrad 					  intel_hdmi_port_clock(clock, bpc),
   2332  1.1  riastrad 					  true, force_dvi) == MODE_OK)
   2333  1.1  riastrad 			return bpc;
   2334  1.1  riastrad 	}
   2335  1.1  riastrad 
   2336  1.1  riastrad 	return 8;
   2337  1.1  riastrad }
   2338  1.1  riastrad 
   2339  1.1  riastrad static int intel_hdmi_compute_clock(struct intel_encoder *encoder,
   2340  1.1  riastrad 				    struct intel_crtc_state *crtc_state,
   2341  1.1  riastrad 				    bool force_dvi)
   2342  1.1  riastrad {
   2343  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   2344  1.1  riastrad 	const struct drm_display_mode *adjusted_mode =
   2345  1.1  riastrad 		&crtc_state->hw.adjusted_mode;
   2346  1.1  riastrad 	int bpc, clock = adjusted_mode->crtc_clock;
   2347  1.1  riastrad 
   2348  1.1  riastrad 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
   2349  1.1  riastrad 		clock *= 2;
   2350  1.1  riastrad 
   2351  1.1  riastrad 	/* YCBCR420 TMDS rate requirement is half the pixel clock */
   2352  1.1  riastrad 	if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
   2353  1.1  riastrad 		clock /= 2;
   2354  1.1  riastrad 
   2355  1.1  riastrad 	bpc = intel_hdmi_compute_bpc(encoder, crtc_state,
   2356  1.1  riastrad 				     clock, force_dvi);
   2357  1.1  riastrad 
   2358  1.1  riastrad 	crtc_state->port_clock = intel_hdmi_port_clock(clock, bpc);
   2359  1.1  riastrad 
   2360  1.1  riastrad 	/*
   2361  1.1  riastrad 	 * pipe_bpp could already be below 8bpc due to
   2362  1.1  riastrad 	 * FDI bandwidth constraints. We shouldn't bump it
   2363  1.1  riastrad 	 * back up to 8bpc in that case.
   2364  1.1  riastrad 	 */
   2365  1.1  riastrad 	if (crtc_state->pipe_bpp > bpc * 3)
   2366  1.1  riastrad 		crtc_state->pipe_bpp = bpc * 3;
   2367  1.1  riastrad 
   2368  1.1  riastrad 	DRM_DEBUG_KMS("picking %d bpc for HDMI output (pipe bpp: %d)\n",
   2369  1.1  riastrad 		      bpc, crtc_state->pipe_bpp);
   2370  1.1  riastrad 
   2371  1.1  riastrad 	if (hdmi_port_clock_valid(intel_hdmi, crtc_state->port_clock,
   2372  1.1  riastrad 				  false, force_dvi) != MODE_OK) {
   2373  1.1  riastrad 		DRM_DEBUG_KMS("unsupported HDMI clock (%d kHz), rejecting mode\n",
   2374  1.1  riastrad 			      crtc_state->port_clock);
   2375  1.1  riastrad 		return -EINVAL;
   2376  1.1  riastrad 	}
   2377  1.1  riastrad 
   2378  1.1  riastrad 	return 0;
   2379  1.1  riastrad }
   2380  1.1  riastrad 
   2381  1.1  riastrad static bool intel_hdmi_limited_color_range(const struct intel_crtc_state *crtc_state,
   2382  1.1  riastrad 					   const struct drm_connector_state *conn_state)
   2383  1.1  riastrad {
   2384  1.1  riastrad 	const struct intel_digital_connector_state *intel_conn_state =
   2385  1.4  riastrad 		const_container_of(conn_state,
   2386  1.4  riastrad 		    struct intel_digital_connector_state, base);
   2387  1.1  riastrad 	const struct drm_display_mode *adjusted_mode =
   2388  1.1  riastrad 		&crtc_state->hw.adjusted_mode;
   2389  1.1  riastrad 
   2390  1.1  riastrad 	/*
   2391  1.1  riastrad 	 * Our YCbCr output is always limited range.
   2392  1.1  riastrad 	 * crtc_state->limited_color_range only applies to RGB,
   2393  1.1  riastrad 	 * and it must never be set for YCbCr or we risk setting
   2394  1.1  riastrad 	 * some conflicting bits in PIPECONF which will mess up
   2395  1.1  riastrad 	 * the colors on the monitor.
   2396  1.1  riastrad 	 */
   2397  1.1  riastrad 	if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
   2398  1.1  riastrad 		return false;
   2399  1.1  riastrad 
   2400  1.1  riastrad 	if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
   2401  1.1  riastrad 		/* See CEA-861-E - 5.1 Default Encoding Parameters */
   2402  1.1  riastrad 		return crtc_state->has_hdmi_sink &&
   2403  1.1  riastrad 			drm_default_rgb_quant_range(adjusted_mode) ==
   2404  1.1  riastrad 			HDMI_QUANTIZATION_RANGE_LIMITED;
   2405  1.1  riastrad 	} else {
   2406  1.1  riastrad 		return intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
   2407  1.1  riastrad 	}
   2408  1.1  riastrad }
   2409  1.1  riastrad 
   2410  1.1  riastrad int intel_hdmi_compute_config(struct intel_encoder *encoder,
   2411  1.1  riastrad 			      struct intel_crtc_state *pipe_config,
   2412  1.1  riastrad 			      struct drm_connector_state *conn_state)
   2413  1.1  riastrad {
   2414  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   2415  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   2416  1.1  riastrad 	struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
   2417  1.1  riastrad 	struct drm_connector *connector = conn_state->connector;
   2418  1.1  riastrad 	struct drm_scdc *scdc = &connector->display_info.hdmi.scdc;
   2419  1.1  riastrad 	struct intel_digital_connector_state *intel_conn_state =
   2420  1.1  riastrad 		to_intel_digital_connector_state(conn_state);
   2421  1.1  riastrad 	bool force_dvi = intel_conn_state->force_audio == HDMI_AUDIO_OFF_DVI;
   2422  1.1  riastrad 	int ret;
   2423  1.1  riastrad 
   2424  1.1  riastrad 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
   2425  1.1  riastrad 		return -EINVAL;
   2426  1.1  riastrad 
   2427  1.1  riastrad 	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
   2428  1.1  riastrad 	pipe_config->has_hdmi_sink = !force_dvi && intel_hdmi->has_hdmi_sink;
   2429  1.1  riastrad 
   2430  1.1  riastrad 	if (pipe_config->has_hdmi_sink)
   2431  1.1  riastrad 		pipe_config->has_infoframe = true;
   2432  1.1  riastrad 
   2433  1.1  riastrad 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
   2434  1.1  riastrad 		pipe_config->pixel_multiplier = 2;
   2435  1.1  riastrad 
   2436  1.1  riastrad 	if (drm_mode_is_420_only(&connector->display_info, adjusted_mode)) {
   2437  1.1  riastrad 		if (!intel_hdmi_ycbcr420_config(connector, pipe_config)) {
   2438  1.1  riastrad 			DRM_ERROR("Can't support YCBCR420 output\n");
   2439  1.1  riastrad 			return -EINVAL;
   2440  1.1  riastrad 		}
   2441  1.1  riastrad 	}
   2442  1.1  riastrad 
   2443  1.1  riastrad 	pipe_config->limited_color_range =
   2444  1.1  riastrad 		intel_hdmi_limited_color_range(pipe_config, conn_state);
   2445  1.1  riastrad 
   2446  1.1  riastrad 	if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
   2447  1.1  riastrad 		pipe_config->has_pch_encoder = true;
   2448  1.1  riastrad 
   2449  1.1  riastrad 	if (pipe_config->has_hdmi_sink) {
   2450  1.1  riastrad 		if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
   2451  1.1  riastrad 			pipe_config->has_audio = intel_hdmi->has_audio;
   2452  1.1  riastrad 		else
   2453  1.1  riastrad 			pipe_config->has_audio =
   2454  1.1  riastrad 				intel_conn_state->force_audio == HDMI_AUDIO_ON;
   2455  1.1  riastrad 	}
   2456  1.1  riastrad 
   2457  1.1  riastrad 	ret = intel_hdmi_compute_clock(encoder, pipe_config, force_dvi);
   2458  1.1  riastrad 	if (ret)
   2459  1.1  riastrad 		return ret;
   2460  1.1  riastrad 
   2461  1.1  riastrad 	if (conn_state->picture_aspect_ratio)
   2462  1.1  riastrad 		adjusted_mode->picture_aspect_ratio =
   2463  1.1  riastrad 			conn_state->picture_aspect_ratio;
   2464  1.1  riastrad 
   2465  1.1  riastrad 	pipe_config->lane_count = 4;
   2466  1.1  riastrad 
   2467  1.1  riastrad 	if (scdc->scrambling.supported && (INTEL_GEN(dev_priv) >= 10 ||
   2468  1.1  riastrad 					   IS_GEMINILAKE(dev_priv))) {
   2469  1.1  riastrad 		if (scdc->scrambling.low_rates)
   2470  1.1  riastrad 			pipe_config->hdmi_scrambling = true;
   2471  1.1  riastrad 
   2472  1.1  riastrad 		if (pipe_config->port_clock > 340000) {
   2473  1.1  riastrad 			pipe_config->hdmi_scrambling = true;
   2474  1.1  riastrad 			pipe_config->hdmi_high_tmds_clock_ratio = true;
   2475  1.1  riastrad 		}
   2476  1.1  riastrad 	}
   2477  1.1  riastrad 
   2478  1.1  riastrad 	intel_hdmi_compute_gcp_infoframe(encoder, pipe_config, conn_state);
   2479  1.1  riastrad 
   2480  1.1  riastrad 	if (!intel_hdmi_compute_avi_infoframe(encoder, pipe_config, conn_state)) {
   2481  1.1  riastrad 		DRM_DEBUG_KMS("bad AVI infoframe\n");
   2482  1.1  riastrad 		return -EINVAL;
   2483  1.1  riastrad 	}
   2484  1.1  riastrad 
   2485  1.1  riastrad 	if (!intel_hdmi_compute_spd_infoframe(encoder, pipe_config, conn_state)) {
   2486  1.1  riastrad 		DRM_DEBUG_KMS("bad SPD infoframe\n");
   2487  1.1  riastrad 		return -EINVAL;
   2488  1.1  riastrad 	}
   2489  1.1  riastrad 
   2490  1.1  riastrad 	if (!intel_hdmi_compute_hdmi_infoframe(encoder, pipe_config, conn_state)) {
   2491  1.1  riastrad 		DRM_DEBUG_KMS("bad HDMI infoframe\n");
   2492  1.1  riastrad 		return -EINVAL;
   2493  1.1  riastrad 	}
   2494  1.1  riastrad 
   2495  1.1  riastrad 	if (!intel_hdmi_compute_drm_infoframe(encoder, pipe_config, conn_state)) {
   2496  1.1  riastrad 		DRM_DEBUG_KMS("bad DRM infoframe\n");
   2497  1.1  riastrad 		return -EINVAL;
   2498  1.1  riastrad 	}
   2499  1.1  riastrad 
   2500  1.1  riastrad 	return 0;
   2501  1.1  riastrad }
   2502  1.1  riastrad 
   2503  1.1  riastrad static void
   2504  1.1  riastrad intel_hdmi_unset_edid(struct drm_connector *connector)
   2505  1.1  riastrad {
   2506  1.1  riastrad 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
   2507  1.1  riastrad 
   2508  1.1  riastrad 	intel_hdmi->has_hdmi_sink = false;
   2509  1.1  riastrad 	intel_hdmi->has_audio = false;
   2510  1.1  riastrad 
   2511  1.1  riastrad 	intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
   2512  1.1  riastrad 	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
   2513  1.1  riastrad 
   2514  1.1  riastrad 	kfree(to_intel_connector(connector)->detect_edid);
   2515  1.1  riastrad 	to_intel_connector(connector)->detect_edid = NULL;
   2516  1.1  riastrad }
   2517  1.1  riastrad 
   2518  1.1  riastrad static void
   2519  1.1  riastrad intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
   2520  1.1  riastrad {
   2521  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
   2522  1.1  riastrad 	struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
   2523  1.1  riastrad 	enum port port = hdmi_to_dig_port(hdmi)->base.port;
   2524  1.1  riastrad 	struct i2c_adapter *adapter =
   2525  1.1  riastrad 		intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
   2526  1.1  riastrad 	enum drm_dp_dual_mode_type type = drm_dp_dual_mode_detect(adapter);
   2527  1.1  riastrad 
   2528  1.1  riastrad 	/*
   2529  1.1  riastrad 	 * Type 1 DVI adaptors are not required to implement any
   2530  1.1  riastrad 	 * registers, so we can't always detect their presence.
   2531  1.1  riastrad 	 * Ideally we should be able to check the state of the
   2532  1.1  riastrad 	 * CONFIG1 pin, but no such luck on our hardware.
   2533  1.1  riastrad 	 *
   2534  1.1  riastrad 	 * The only method left to us is to check the VBT to see
   2535  1.1  riastrad 	 * if the port is a dual mode capable DP port. But let's
   2536  1.1  riastrad 	 * only do that when we sucesfully read the EDID, to avoid
   2537  1.1  riastrad 	 * confusing log messages about DP dual mode adaptors when
   2538  1.1  riastrad 	 * there's nothing connected to the port.
   2539  1.1  riastrad 	 */
   2540  1.1  riastrad 	if (type == DRM_DP_DUAL_MODE_UNKNOWN) {
   2541  1.1  riastrad 		/* An overridden EDID imply that we want this port for testing.
   2542  1.1  riastrad 		 * Make sure not to set limits for that port.
   2543  1.1  riastrad 		 */
   2544  1.1  riastrad 		if (has_edid && !connector->override_edid &&
   2545  1.1  riastrad 		    intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
   2546  1.1  riastrad 			DRM_DEBUG_KMS("Assuming DP dual mode adaptor presence based on VBT\n");
   2547  1.1  riastrad 			type = DRM_DP_DUAL_MODE_TYPE1_DVI;
   2548  1.1  riastrad 		} else {
   2549  1.1  riastrad 			type = DRM_DP_DUAL_MODE_NONE;
   2550  1.1  riastrad 		}
   2551  1.1  riastrad 	}
   2552  1.1  riastrad 
   2553  1.1  riastrad 	if (type == DRM_DP_DUAL_MODE_NONE)
   2554  1.1  riastrad 		return;
   2555  1.1  riastrad 
   2556  1.1  riastrad 	hdmi->dp_dual_mode.type = type;
   2557  1.1  riastrad 	hdmi->dp_dual_mode.max_tmds_clock =
   2558  1.1  riastrad 		drm_dp_dual_mode_max_tmds_clock(type, adapter);
   2559  1.1  riastrad 
   2560  1.1  riastrad 	DRM_DEBUG_KMS("DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
   2561  1.1  riastrad 		      drm_dp_get_dual_mode_type_name(type),
   2562  1.1  riastrad 		      hdmi->dp_dual_mode.max_tmds_clock);
   2563  1.1  riastrad }
   2564  1.1  riastrad 
   2565  1.1  riastrad static bool
   2566  1.1  riastrad intel_hdmi_set_edid(struct drm_connector *connector)
   2567  1.1  riastrad {
   2568  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
   2569  1.1  riastrad 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
   2570  1.1  riastrad 	intel_wakeref_t wakeref;
   2571  1.1  riastrad 	struct edid *edid;
   2572  1.1  riastrad 	bool connected = false;
   2573  1.1  riastrad 	struct i2c_adapter *i2c;
   2574  1.1  riastrad 
   2575  1.1  riastrad 	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
   2576  1.1  riastrad 
   2577  1.1  riastrad 	i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
   2578  1.1  riastrad 
   2579  1.1  riastrad 	edid = drm_get_edid(connector, i2c);
   2580  1.1  riastrad 
   2581  1.1  riastrad 	if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
   2582  1.1  riastrad 		DRM_DEBUG_KMS("HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
   2583  1.1  riastrad 		intel_gmbus_force_bit(i2c, true);
   2584  1.1  riastrad 		edid = drm_get_edid(connector, i2c);
   2585  1.1  riastrad 		intel_gmbus_force_bit(i2c, false);
   2586  1.1  riastrad 	}
   2587  1.1  riastrad 
   2588  1.1  riastrad 	intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
   2589  1.1  riastrad 
   2590  1.1  riastrad 	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
   2591  1.1  riastrad 
   2592  1.1  riastrad 	to_intel_connector(connector)->detect_edid = edid;
   2593  1.1  riastrad 	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
   2594  1.1  riastrad 		intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
   2595  1.1  riastrad 		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
   2596  1.1  riastrad 
   2597  1.1  riastrad 		connected = true;
   2598  1.1  riastrad 	}
   2599  1.1  riastrad 
   2600  1.1  riastrad 	cec_notifier_set_phys_addr_from_edid(intel_hdmi->cec_notifier, edid);
   2601  1.1  riastrad 
   2602  1.1  riastrad 	return connected;
   2603  1.1  riastrad }
   2604  1.1  riastrad 
   2605  1.1  riastrad static enum drm_connector_status
   2606  1.1  riastrad intel_hdmi_detect(struct drm_connector *connector, bool force)
   2607  1.1  riastrad {
   2608  1.1  riastrad 	enum drm_connector_status status = connector_status_disconnected;
   2609  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
   2610  1.1  riastrad 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
   2611  1.1  riastrad 	struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base;
   2612  1.1  riastrad 	intel_wakeref_t wakeref;
   2613  1.1  riastrad 
   2614  1.1  riastrad 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
   2615  1.1  riastrad 		      connector->base.id, connector->name);
   2616  1.1  riastrad 
   2617  1.1  riastrad 	wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
   2618  1.1  riastrad 
   2619  1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 11 &&
   2620  1.1  riastrad 	    !intel_digital_port_connected(encoder))
   2621  1.1  riastrad 		goto out;
   2622  1.1  riastrad 
   2623  1.1  riastrad 	intel_hdmi_unset_edid(connector);
   2624  1.1  riastrad 
   2625  1.1  riastrad 	if (intel_hdmi_set_edid(connector))
   2626  1.1  riastrad 		status = connector_status_connected;
   2627  1.1  riastrad 
   2628  1.1  riastrad out:
   2629  1.1  riastrad 	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
   2630  1.1  riastrad 
   2631  1.1  riastrad 	if (status != connector_status_connected)
   2632  1.1  riastrad 		cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier);
   2633  1.1  riastrad 
   2634  1.1  riastrad 	/*
   2635  1.1  riastrad 	 * Make sure the refs for power wells enabled during detect are
   2636  1.1  riastrad 	 * dropped to avoid a new detect cycle triggered by HPD polling.
   2637  1.1  riastrad 	 */
   2638  1.1  riastrad 	intel_display_power_flush_work(dev_priv);
   2639  1.1  riastrad 
   2640  1.1  riastrad 	return status;
   2641  1.1  riastrad }
   2642  1.1  riastrad 
   2643  1.1  riastrad static void
   2644  1.1  riastrad intel_hdmi_force(struct drm_connector *connector)
   2645  1.1  riastrad {
   2646  1.1  riastrad 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
   2647  1.1  riastrad 		      connector->base.id, connector->name);
   2648  1.1  riastrad 
   2649  1.1  riastrad 	intel_hdmi_unset_edid(connector);
   2650  1.1  riastrad 
   2651  1.1  riastrad 	if (connector->status != connector_status_connected)
   2652  1.1  riastrad 		return;
   2653  1.1  riastrad 
   2654  1.1  riastrad 	intel_hdmi_set_edid(connector);
   2655  1.1  riastrad }
   2656  1.1  riastrad 
   2657  1.1  riastrad static int intel_hdmi_get_modes(struct drm_connector *connector)
   2658  1.1  riastrad {
   2659  1.1  riastrad 	struct edid *edid;
   2660  1.1  riastrad 
   2661  1.1  riastrad 	edid = to_intel_connector(connector)->detect_edid;
   2662  1.1  riastrad 	if (edid == NULL)
   2663  1.1  riastrad 		return 0;
   2664  1.1  riastrad 
   2665  1.1  riastrad 	return intel_connector_update_modes(connector, edid);
   2666  1.1  riastrad }
   2667  1.1  riastrad 
   2668  1.1  riastrad static void intel_hdmi_pre_enable(struct intel_encoder *encoder,
   2669  1.1  riastrad 				  const struct intel_crtc_state *pipe_config,
   2670  1.1  riastrad 				  const struct drm_connector_state *conn_state)
   2671  1.1  riastrad {
   2672  1.1  riastrad 	struct intel_digital_port *intel_dig_port =
   2673  1.1  riastrad 		enc_to_dig_port(encoder);
   2674  1.1  riastrad 
   2675  1.1  riastrad 	intel_hdmi_prepare(encoder, pipe_config);
   2676  1.1  riastrad 
   2677  1.1  riastrad 	intel_dig_port->set_infoframes(encoder,
   2678  1.1  riastrad 				       pipe_config->has_infoframe,
   2679  1.1  riastrad 				       pipe_config, conn_state);
   2680  1.1  riastrad }
   2681  1.1  riastrad 
   2682  1.1  riastrad static void vlv_hdmi_pre_enable(struct intel_encoder *encoder,
   2683  1.1  riastrad 				const struct intel_crtc_state *pipe_config,
   2684  1.1  riastrad 				const struct drm_connector_state *conn_state)
   2685  1.1  riastrad {
   2686  1.1  riastrad 	struct intel_digital_port *dport = enc_to_dig_port(encoder);
   2687  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   2688  1.1  riastrad 
   2689  1.1  riastrad 	vlv_phy_pre_encoder_enable(encoder, pipe_config);
   2690  1.1  riastrad 
   2691  1.1  riastrad 	/* HDMI 1.0V-2dB */
   2692  1.1  riastrad 	vlv_set_phy_signal_level(encoder, 0x2b245f5f, 0x00002000, 0x5578b83a,
   2693  1.1  riastrad 				 0x2b247878);
   2694  1.1  riastrad 
   2695  1.1  riastrad 	dport->set_infoframes(encoder,
   2696  1.1  riastrad 			      pipe_config->has_infoframe,
   2697  1.1  riastrad 			      pipe_config, conn_state);
   2698  1.1  riastrad 
   2699  1.1  riastrad 	g4x_enable_hdmi(encoder, pipe_config, conn_state);
   2700  1.1  riastrad 
   2701  1.1  riastrad 	vlv_wait_port_ready(dev_priv, dport, 0x0);
   2702  1.1  riastrad }
   2703  1.1  riastrad 
   2704  1.1  riastrad static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
   2705  1.1  riastrad 				    const struct intel_crtc_state *pipe_config,
   2706  1.1  riastrad 				    const struct drm_connector_state *conn_state)
   2707  1.1  riastrad {
   2708  1.1  riastrad 	intel_hdmi_prepare(encoder, pipe_config);
   2709  1.1  riastrad 
   2710  1.1  riastrad 	vlv_phy_pre_pll_enable(encoder, pipe_config);
   2711  1.1  riastrad }
   2712  1.1  riastrad 
   2713  1.1  riastrad static void chv_hdmi_pre_pll_enable(struct intel_encoder *encoder,
   2714  1.1  riastrad 				    const struct intel_crtc_state *pipe_config,
   2715  1.1  riastrad 				    const struct drm_connector_state *conn_state)
   2716  1.1  riastrad {
   2717  1.1  riastrad 	intel_hdmi_prepare(encoder, pipe_config);
   2718  1.1  riastrad 
   2719  1.1  riastrad 	chv_phy_pre_pll_enable(encoder, pipe_config);
   2720  1.1  riastrad }
   2721  1.1  riastrad 
   2722  1.1  riastrad static void chv_hdmi_post_pll_disable(struct intel_encoder *encoder,
   2723  1.1  riastrad 				      const struct intel_crtc_state *old_crtc_state,
   2724  1.1  riastrad 				      const struct drm_connector_state *old_conn_state)
   2725  1.1  riastrad {
   2726  1.1  riastrad 	chv_phy_post_pll_disable(encoder, old_crtc_state);
   2727  1.1  riastrad }
   2728  1.1  riastrad 
   2729  1.1  riastrad static void vlv_hdmi_post_disable(struct intel_encoder *encoder,
   2730  1.1  riastrad 				  const struct intel_crtc_state *old_crtc_state,
   2731  1.1  riastrad 				  const struct drm_connector_state *old_conn_state)
   2732  1.1  riastrad {
   2733  1.1  riastrad 	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
   2734  1.1  riastrad 	vlv_phy_reset_lanes(encoder, old_crtc_state);
   2735  1.1  riastrad }
   2736  1.1  riastrad 
   2737  1.1  riastrad static void chv_hdmi_post_disable(struct intel_encoder *encoder,
   2738  1.1  riastrad 				  const struct intel_crtc_state *old_crtc_state,
   2739  1.1  riastrad 				  const struct drm_connector_state *old_conn_state)
   2740  1.1  riastrad {
   2741  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   2742  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   2743  1.1  riastrad 
   2744  1.1  riastrad 	vlv_dpio_get(dev_priv);
   2745  1.1  riastrad 
   2746  1.1  riastrad 	/* Assert data lane reset */
   2747  1.1  riastrad 	chv_data_lane_soft_reset(encoder, old_crtc_state, true);
   2748  1.1  riastrad 
   2749  1.1  riastrad 	vlv_dpio_put(dev_priv);
   2750  1.1  riastrad }
   2751  1.1  riastrad 
   2752  1.1  riastrad static void chv_hdmi_pre_enable(struct intel_encoder *encoder,
   2753  1.1  riastrad 				const struct intel_crtc_state *pipe_config,
   2754  1.1  riastrad 				const struct drm_connector_state *conn_state)
   2755  1.1  riastrad {
   2756  1.1  riastrad 	struct intel_digital_port *dport = enc_to_dig_port(encoder);
   2757  1.1  riastrad 	struct drm_device *dev = encoder->base.dev;
   2758  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   2759  1.1  riastrad 
   2760  1.1  riastrad 	chv_phy_pre_encoder_enable(encoder, pipe_config);
   2761  1.1  riastrad 
   2762  1.1  riastrad 	/* FIXME: Program the support xxx V-dB */
   2763  1.1  riastrad 	/* Use 800mV-0dB */
   2764  1.1  riastrad 	chv_set_phy_signal_level(encoder, 128, 102, false);
   2765  1.1  riastrad 
   2766  1.1  riastrad 	dport->set_infoframes(encoder,
   2767  1.1  riastrad 			      pipe_config->has_infoframe,
   2768  1.1  riastrad 			      pipe_config, conn_state);
   2769  1.1  riastrad 
   2770  1.1  riastrad 	g4x_enable_hdmi(encoder, pipe_config, conn_state);
   2771  1.1  riastrad 
   2772  1.1  riastrad 	vlv_wait_port_ready(dev_priv, dport, 0x0);
   2773  1.1  riastrad 
   2774  1.1  riastrad 	/* Second common lane will stay alive on its own now */
   2775  1.1  riastrad 	chv_phy_release_cl2_override(encoder);
   2776  1.1  riastrad }
   2777  1.1  riastrad 
   2778  1.5  riastrad #ifndef __NetBSD__
   2779  1.1  riastrad static struct i2c_adapter *
   2780  1.1  riastrad intel_hdmi_get_i2c_adapter(struct drm_connector *connector)
   2781  1.1  riastrad {
   2782  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
   2783  1.1  riastrad 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
   2784  1.1  riastrad 
   2785  1.1  riastrad 	return intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
   2786  1.1  riastrad }
   2787  1.5  riastrad #endif
   2788  1.1  riastrad 
   2789  1.1  riastrad static void intel_hdmi_create_i2c_symlink(struct drm_connector *connector)
   2790  1.1  riastrad {
   2791  1.5  riastrad #ifndef __NetBSD__ /* XXX i915 hdmi sysfs */
   2792  1.1  riastrad 	struct i2c_adapter *adapter = intel_hdmi_get_i2c_adapter(connector);
   2793  1.1  riastrad 	struct kobject *i2c_kobj = &adapter->dev.kobj;
   2794  1.1  riastrad 	struct kobject *connector_kobj = &connector->kdev->kobj;
   2795  1.1  riastrad 	int ret;
   2796  1.1  riastrad 
   2797  1.1  riastrad 	ret = sysfs_create_link(connector_kobj, i2c_kobj, i2c_kobj->name);
   2798  1.1  riastrad 	if (ret)
   2799  1.1  riastrad 		DRM_ERROR("Failed to create i2c symlink (%d)\n", ret);
   2800  1.5  riastrad #endif
   2801  1.1  riastrad }
   2802  1.1  riastrad 
   2803  1.1  riastrad static void intel_hdmi_remove_i2c_symlink(struct drm_connector *connector)
   2804  1.1  riastrad {
   2805  1.5  riastrad #ifndef __NetBSD__ /* XXX i915 hdmi sysfs */
   2806  1.1  riastrad 	struct i2c_adapter *adapter = intel_hdmi_get_i2c_adapter(connector);
   2807  1.1  riastrad 	struct kobject *i2c_kobj = &adapter->dev.kobj;
   2808  1.1  riastrad 	struct kobject *connector_kobj = &connector->kdev->kobj;
   2809  1.1  riastrad 
   2810  1.1  riastrad 	sysfs_remove_link(connector_kobj, i2c_kobj->name);
   2811  1.5  riastrad #endif
   2812  1.1  riastrad }
   2813  1.1  riastrad 
   2814  1.1  riastrad static int
   2815  1.1  riastrad intel_hdmi_connector_register(struct drm_connector *connector)
   2816  1.1  riastrad {
   2817  1.1  riastrad 	int ret;
   2818  1.1  riastrad 
   2819  1.1  riastrad 	ret = intel_connector_register(connector);
   2820  1.1  riastrad 	if (ret)
   2821  1.1  riastrad 		return ret;
   2822  1.1  riastrad 
   2823  1.1  riastrad 	i915_debugfs_connector_add(connector);
   2824  1.1  riastrad 
   2825  1.1  riastrad 	intel_hdmi_create_i2c_symlink(connector);
   2826  1.1  riastrad 
   2827  1.1  riastrad 	return ret;
   2828  1.1  riastrad }
   2829  1.1  riastrad 
   2830  1.1  riastrad static void intel_hdmi_destroy(struct drm_connector *connector)
   2831  1.1  riastrad {
   2832  1.1  riastrad 	struct cec_notifier *n = intel_attached_hdmi(to_intel_connector(connector))->cec_notifier;
   2833  1.1  riastrad 
   2834  1.1  riastrad 	cec_notifier_conn_unregister(n);
   2835  1.1  riastrad 
   2836  1.1  riastrad 	intel_connector_destroy(connector);
   2837  1.1  riastrad }
   2838  1.1  riastrad 
   2839  1.1  riastrad static void intel_hdmi_connector_unregister(struct drm_connector *connector)
   2840  1.1  riastrad {
   2841  1.1  riastrad 	intel_hdmi_remove_i2c_symlink(connector);
   2842  1.1  riastrad 
   2843  1.1  riastrad 	intel_connector_unregister(connector);
   2844  1.1  riastrad }
   2845  1.1  riastrad 
   2846  1.1  riastrad static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
   2847  1.1  riastrad 	.detect = intel_hdmi_detect,
   2848  1.1  riastrad 	.force = intel_hdmi_force,
   2849  1.1  riastrad 	.fill_modes = drm_helper_probe_single_connector_modes,
   2850  1.1  riastrad 	.atomic_get_property = intel_digital_connector_atomic_get_property,
   2851  1.1  riastrad 	.atomic_set_property = intel_digital_connector_atomic_set_property,
   2852  1.1  riastrad 	.late_register = intel_hdmi_connector_register,
   2853  1.1  riastrad 	.early_unregister = intel_hdmi_connector_unregister,
   2854  1.1  riastrad 	.destroy = intel_hdmi_destroy,
   2855  1.1  riastrad 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
   2856  1.1  riastrad 	.atomic_duplicate_state = intel_digital_connector_duplicate_state,
   2857  1.1  riastrad };
   2858  1.1  riastrad 
   2859  1.1  riastrad static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
   2860  1.1  riastrad 	.get_modes = intel_hdmi_get_modes,
   2861  1.1  riastrad 	.mode_valid = intel_hdmi_mode_valid,
   2862  1.1  riastrad 	.atomic_check = intel_digital_connector_atomic_check,
   2863  1.1  riastrad };
   2864  1.1  riastrad 
   2865  1.1  riastrad static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
   2866  1.1  riastrad 	.destroy = intel_encoder_destroy,
   2867  1.1  riastrad };
   2868  1.1  riastrad 
   2869  1.1  riastrad static void
   2870  1.1  riastrad intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
   2871  1.1  riastrad {
   2872  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
   2873  1.1  riastrad 	struct intel_digital_port *intel_dig_port =
   2874  1.1  riastrad 				hdmi_to_dig_port(intel_hdmi);
   2875  1.1  riastrad 
   2876  1.1  riastrad 	intel_attach_force_audio_property(connector);
   2877  1.1  riastrad 	intel_attach_broadcast_rgb_property(connector);
   2878  1.1  riastrad 	intel_attach_aspect_ratio_property(connector);
   2879  1.1  riastrad 
   2880  1.1  riastrad 	/*
   2881  1.1  riastrad 	 * Attach Colorspace property for Non LSPCON based device
   2882  1.1  riastrad 	 * ToDo: This needs to be extended for LSPCON implementation
   2883  1.1  riastrad 	 * as well. Will be implemented separately.
   2884  1.1  riastrad 	 */
   2885  1.1  riastrad 	if (!intel_dig_port->lspcon.active)
   2886  1.1  riastrad 		intel_attach_colorspace_property(connector);
   2887  1.1  riastrad 
   2888  1.1  riastrad 	drm_connector_attach_content_type_property(connector);
   2889  1.1  riastrad 
   2890  1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   2891  1.1  riastrad 		drm_object_attach_property(&connector->base,
   2892  1.1  riastrad 			connector->dev->mode_config.hdr_output_metadata_property, 0);
   2893  1.1  riastrad 
   2894  1.1  riastrad 	if (!HAS_GMCH(dev_priv))
   2895  1.1  riastrad 		drm_connector_attach_max_bpc_property(connector, 8, 12);
   2896  1.1  riastrad }
   2897  1.1  riastrad 
   2898  1.1  riastrad /*
   2899  1.1  riastrad  * intel_hdmi_handle_sink_scrambling: handle sink scrambling/clock ratio setup
   2900  1.1  riastrad  * @encoder: intel_encoder
   2901  1.1  riastrad  * @connector: drm_connector
   2902  1.1  riastrad  * @high_tmds_clock_ratio = bool to indicate if the function needs to set
   2903  1.1  riastrad  *  or reset the high tmds clock ratio for scrambling
   2904  1.1  riastrad  * @scrambling: bool to Indicate if the function needs to set or reset
   2905  1.1  riastrad  *  sink scrambling
   2906  1.1  riastrad  *
   2907  1.1  riastrad  * This function handles scrambling on HDMI 2.0 capable sinks.
   2908  1.1  riastrad  * If required clock rate is > 340 Mhz && scrambling is supported by sink
   2909  1.1  riastrad  * it enables scrambling. This should be called before enabling the HDMI
   2910  1.1  riastrad  * 2.0 port, as the sink can choose to disable the scrambling if it doesn't
   2911  1.1  riastrad  * detect a scrambled clock within 100 ms.
   2912  1.1  riastrad  *
   2913  1.1  riastrad  * Returns:
   2914  1.1  riastrad  * True on success, false on failure.
   2915  1.1  riastrad  */
   2916  1.1  riastrad bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
   2917  1.1  riastrad 				       struct drm_connector *connector,
   2918  1.1  riastrad 				       bool high_tmds_clock_ratio,
   2919  1.1  riastrad 				       bool scrambling)
   2920  1.1  riastrad {
   2921  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
   2922  1.1  riastrad 	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
   2923  1.1  riastrad 	struct drm_scrambling *sink_scrambling =
   2924  1.1  riastrad 		&connector->display_info.hdmi.scdc.scrambling;
   2925  1.1  riastrad 	struct i2c_adapter *adapter =
   2926  1.1  riastrad 		intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
   2927  1.1  riastrad 
   2928  1.1  riastrad 	if (!sink_scrambling->supported)
   2929  1.1  riastrad 		return true;
   2930  1.1  riastrad 
   2931  1.1  riastrad 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] scrambling=%s, TMDS bit clock ratio=1/%d\n",
   2932  1.1  riastrad 		      connector->base.id, connector->name,
   2933  1.1  riastrad 		      yesno(scrambling), high_tmds_clock_ratio ? 40 : 10);
   2934  1.1  riastrad 
   2935  1.1  riastrad 	/* Set TMDS bit clock ratio to 1/40 or 1/10, and enable/disable scrambling */
   2936  1.1  riastrad 	return drm_scdc_set_high_tmds_clock_ratio(adapter,
   2937  1.1  riastrad 						  high_tmds_clock_ratio) &&
   2938  1.1  riastrad 		drm_scdc_set_scrambling(adapter, scrambling);
   2939  1.1  riastrad }
   2940  1.1  riastrad 
   2941  1.1  riastrad static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
   2942  1.1  riastrad {
   2943  1.1  riastrad 	u8 ddc_pin;
   2944  1.1  riastrad 
   2945  1.1  riastrad 	switch (port) {
   2946  1.1  riastrad 	case PORT_B:
   2947  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPB;
   2948  1.1  riastrad 		break;
   2949  1.1  riastrad 	case PORT_C:
   2950  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPC;
   2951  1.1  riastrad 		break;
   2952  1.1  riastrad 	case PORT_D:
   2953  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPD_CHV;
   2954  1.1  riastrad 		break;
   2955  1.1  riastrad 	default:
   2956  1.1  riastrad 		MISSING_CASE(port);
   2957  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPB;
   2958  1.1  riastrad 		break;
   2959  1.1  riastrad 	}
   2960  1.1  riastrad 	return ddc_pin;
   2961  1.1  riastrad }
   2962  1.1  riastrad 
   2963  1.1  riastrad static u8 bxt_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
   2964  1.1  riastrad {
   2965  1.1  riastrad 	u8 ddc_pin;
   2966  1.1  riastrad 
   2967  1.1  riastrad 	switch (port) {
   2968  1.1  riastrad 	case PORT_B:
   2969  1.1  riastrad 		ddc_pin = GMBUS_PIN_1_BXT;
   2970  1.1  riastrad 		break;
   2971  1.1  riastrad 	case PORT_C:
   2972  1.1  riastrad 		ddc_pin = GMBUS_PIN_2_BXT;
   2973  1.1  riastrad 		break;
   2974  1.1  riastrad 	default:
   2975  1.1  riastrad 		MISSING_CASE(port);
   2976  1.1  riastrad 		ddc_pin = GMBUS_PIN_1_BXT;
   2977  1.1  riastrad 		break;
   2978  1.1  riastrad 	}
   2979  1.1  riastrad 	return ddc_pin;
   2980  1.1  riastrad }
   2981  1.1  riastrad 
   2982  1.1  riastrad static u8 cnp_port_to_ddc_pin(struct drm_i915_private *dev_priv,
   2983  1.1  riastrad 			      enum port port)
   2984  1.1  riastrad {
   2985  1.1  riastrad 	u8 ddc_pin;
   2986  1.1  riastrad 
   2987  1.1  riastrad 	switch (port) {
   2988  1.1  riastrad 	case PORT_B:
   2989  1.1  riastrad 		ddc_pin = GMBUS_PIN_1_BXT;
   2990  1.1  riastrad 		break;
   2991  1.1  riastrad 	case PORT_C:
   2992  1.1  riastrad 		ddc_pin = GMBUS_PIN_2_BXT;
   2993  1.1  riastrad 		break;
   2994  1.1  riastrad 	case PORT_D:
   2995  1.1  riastrad 		ddc_pin = GMBUS_PIN_4_CNP;
   2996  1.1  riastrad 		break;
   2997  1.1  riastrad 	case PORT_F:
   2998  1.1  riastrad 		ddc_pin = GMBUS_PIN_3_BXT;
   2999  1.1  riastrad 		break;
   3000  1.1  riastrad 	default:
   3001  1.1  riastrad 		MISSING_CASE(port);
   3002  1.1  riastrad 		ddc_pin = GMBUS_PIN_1_BXT;
   3003  1.1  riastrad 		break;
   3004  1.1  riastrad 	}
   3005  1.1  riastrad 	return ddc_pin;
   3006  1.1  riastrad }
   3007  1.1  riastrad 
   3008  1.1  riastrad static u8 icl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
   3009  1.1  riastrad {
   3010  1.1  riastrad 	enum phy phy = intel_port_to_phy(dev_priv, port);
   3011  1.1  riastrad 
   3012  1.1  riastrad 	if (intel_phy_is_combo(dev_priv, phy))
   3013  1.1  riastrad 		return GMBUS_PIN_1_BXT + port;
   3014  1.1  riastrad 	else if (intel_phy_is_tc(dev_priv, phy))
   3015  1.1  riastrad 		return GMBUS_PIN_9_TC1_ICP + intel_port_to_tc(dev_priv, port);
   3016  1.1  riastrad 
   3017  1.1  riastrad 	WARN(1, "Unknown port:%c\n", port_name(port));
   3018  1.1  riastrad 	return GMBUS_PIN_2_BXT;
   3019  1.1  riastrad }
   3020  1.1  riastrad 
   3021  1.1  riastrad static u8 mcc_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
   3022  1.1  riastrad {
   3023  1.1  riastrad 	enum phy phy = intel_port_to_phy(dev_priv, port);
   3024  1.1  riastrad 	u8 ddc_pin;
   3025  1.1  riastrad 
   3026  1.1  riastrad 	switch (phy) {
   3027  1.1  riastrad 	case PHY_A:
   3028  1.1  riastrad 		ddc_pin = GMBUS_PIN_1_BXT;
   3029  1.1  riastrad 		break;
   3030  1.1  riastrad 	case PHY_B:
   3031  1.1  riastrad 		ddc_pin = GMBUS_PIN_2_BXT;
   3032  1.1  riastrad 		break;
   3033  1.1  riastrad 	case PHY_C:
   3034  1.1  riastrad 		ddc_pin = GMBUS_PIN_9_TC1_ICP;
   3035  1.1  riastrad 		break;
   3036  1.1  riastrad 	default:
   3037  1.1  riastrad 		MISSING_CASE(phy);
   3038  1.1  riastrad 		ddc_pin = GMBUS_PIN_1_BXT;
   3039  1.1  riastrad 		break;
   3040  1.1  riastrad 	}
   3041  1.1  riastrad 	return ddc_pin;
   3042  1.1  riastrad }
   3043  1.1  riastrad 
   3044  1.1  riastrad static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
   3045  1.1  riastrad 			      enum port port)
   3046  1.1  riastrad {
   3047  1.1  riastrad 	u8 ddc_pin;
   3048  1.1  riastrad 
   3049  1.1  riastrad 	switch (port) {
   3050  1.1  riastrad 	case PORT_B:
   3051  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPB;
   3052  1.1  riastrad 		break;
   3053  1.1  riastrad 	case PORT_C:
   3054  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPC;
   3055  1.1  riastrad 		break;
   3056  1.1  riastrad 	case PORT_D:
   3057  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPD;
   3058  1.1  riastrad 		break;
   3059  1.1  riastrad 	default:
   3060  1.1  riastrad 		MISSING_CASE(port);
   3061  1.1  riastrad 		ddc_pin = GMBUS_PIN_DPB;
   3062  1.1  riastrad 		break;
   3063  1.1  riastrad 	}
   3064  1.1  riastrad 	return ddc_pin;
   3065  1.1  riastrad }
   3066  1.1  riastrad 
   3067  1.1  riastrad static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv,
   3068  1.1  riastrad 			     enum port port)
   3069  1.1  riastrad {
   3070  1.1  riastrad 	const struct ddi_vbt_port_info *info =
   3071  1.1  riastrad 		&dev_priv->vbt.ddi_port_info[port];
   3072  1.1  riastrad 	u8 ddc_pin;
   3073  1.1  riastrad 
   3074  1.1  riastrad 	if (info->alternate_ddc_pin) {
   3075  1.1  riastrad 		DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (VBT)\n",
   3076  1.1  riastrad 			      info->alternate_ddc_pin, port_name(port));
   3077  1.1  riastrad 		return info->alternate_ddc_pin;
   3078  1.1  riastrad 	}
   3079  1.1  riastrad 
   3080  1.1  riastrad 	if (HAS_PCH_MCC(dev_priv))
   3081  1.1  riastrad 		ddc_pin = mcc_port_to_ddc_pin(dev_priv, port);
   3082  1.1  riastrad 	else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
   3083  1.1  riastrad 		ddc_pin = icl_port_to_ddc_pin(dev_priv, port);
   3084  1.1  riastrad 	else if (HAS_PCH_CNP(dev_priv))
   3085  1.1  riastrad 		ddc_pin = cnp_port_to_ddc_pin(dev_priv, port);
   3086  1.1  riastrad 	else if (IS_GEN9_LP(dev_priv))
   3087  1.1  riastrad 		ddc_pin = bxt_port_to_ddc_pin(dev_priv, port);
   3088  1.1  riastrad 	else if (IS_CHERRYVIEW(dev_priv))
   3089  1.1  riastrad 		ddc_pin = chv_port_to_ddc_pin(dev_priv, port);
   3090  1.1  riastrad 	else
   3091  1.1  riastrad 		ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
   3092  1.1  riastrad 
   3093  1.1  riastrad 	DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (platform default)\n",
   3094  1.1  riastrad 		      ddc_pin, port_name(port));
   3095  1.1  riastrad 
   3096  1.1  riastrad 	return ddc_pin;
   3097  1.1  riastrad }
   3098  1.1  riastrad 
   3099  1.1  riastrad void intel_infoframe_init(struct intel_digital_port *intel_dig_port)
   3100  1.1  riastrad {
   3101  1.1  riastrad 	struct drm_i915_private *dev_priv =
   3102  1.1  riastrad 		to_i915(intel_dig_port->base.base.dev);
   3103  1.1  riastrad 
   3104  1.1  riastrad 	if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
   3105  1.1  riastrad 		intel_dig_port->write_infoframe = vlv_write_infoframe;
   3106  1.1  riastrad 		intel_dig_port->read_infoframe = vlv_read_infoframe;
   3107  1.1  riastrad 		intel_dig_port->set_infoframes = vlv_set_infoframes;
   3108  1.1  riastrad 		intel_dig_port->infoframes_enabled = vlv_infoframes_enabled;
   3109  1.1  riastrad 	} else if (IS_G4X(dev_priv)) {
   3110  1.1  riastrad 		intel_dig_port->write_infoframe = g4x_write_infoframe;
   3111  1.1  riastrad 		intel_dig_port->read_infoframe = g4x_read_infoframe;
   3112  1.1  riastrad 		intel_dig_port->set_infoframes = g4x_set_infoframes;
   3113  1.1  riastrad 		intel_dig_port->infoframes_enabled = g4x_infoframes_enabled;
   3114  1.1  riastrad 	} else if (HAS_DDI(dev_priv)) {
   3115  1.1  riastrad 		if (intel_dig_port->lspcon.active) {
   3116  1.1  riastrad 			intel_dig_port->write_infoframe = lspcon_write_infoframe;
   3117  1.1  riastrad 			intel_dig_port->read_infoframe = lspcon_read_infoframe;
   3118  1.1  riastrad 			intel_dig_port->set_infoframes = lspcon_set_infoframes;
   3119  1.1  riastrad 			intel_dig_port->infoframes_enabled = lspcon_infoframes_enabled;
   3120  1.1  riastrad 		} else {
   3121  1.1  riastrad 			intel_dig_port->write_infoframe = hsw_write_infoframe;
   3122  1.1  riastrad 			intel_dig_port->read_infoframe = hsw_read_infoframe;
   3123  1.1  riastrad 			intel_dig_port->set_infoframes = hsw_set_infoframes;
   3124  1.1  riastrad 			intel_dig_port->infoframes_enabled = hsw_infoframes_enabled;
   3125  1.1  riastrad 		}
   3126  1.1  riastrad 	} else if (HAS_PCH_IBX(dev_priv)) {
   3127  1.1  riastrad 		intel_dig_port->write_infoframe = ibx_write_infoframe;
   3128  1.1  riastrad 		intel_dig_port->read_infoframe = ibx_read_infoframe;
   3129  1.1  riastrad 		intel_dig_port->set_infoframes = ibx_set_infoframes;
   3130  1.1  riastrad 		intel_dig_port->infoframes_enabled = ibx_infoframes_enabled;
   3131  1.1  riastrad 	} else {
   3132  1.1  riastrad 		intel_dig_port->write_infoframe = cpt_write_infoframe;
   3133  1.1  riastrad 		intel_dig_port->read_infoframe = cpt_read_infoframe;
   3134  1.1  riastrad 		intel_dig_port->set_infoframes = cpt_set_infoframes;
   3135  1.1  riastrad 		intel_dig_port->infoframes_enabled = cpt_infoframes_enabled;
   3136  1.1  riastrad 	}
   3137  1.1  riastrad }
   3138  1.1  riastrad 
   3139  1.1  riastrad void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
   3140  1.1  riastrad 			       struct intel_connector *intel_connector)
   3141  1.1  riastrad {
   3142  1.1  riastrad 	struct drm_connector *connector = &intel_connector->base;
   3143  1.1  riastrad 	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
   3144  1.1  riastrad 	struct intel_encoder *intel_encoder = &intel_dig_port->base;
   3145  1.1  riastrad 	struct drm_device *dev = intel_encoder->base.dev;
   3146  1.1  riastrad 	struct drm_i915_private *dev_priv = to_i915(dev);
   3147  1.1  riastrad 	struct i2c_adapter *ddc;
   3148  1.1  riastrad 	enum port port = intel_encoder->port;
   3149  1.1  riastrad 	struct cec_connector_info conn_info;
   3150  1.1  riastrad 
   3151  1.1  riastrad 	DRM_DEBUG_KMS("Adding HDMI connector on [ENCODER:%d:%s]\n",
   3152  1.1  riastrad 		      intel_encoder->base.base.id, intel_encoder->base.name);
   3153  1.1  riastrad 
   3154  1.1  riastrad 	if (INTEL_GEN(dev_priv) < 12 && WARN_ON(port == PORT_A))
   3155  1.1  riastrad 		return;
   3156  1.1  riastrad 
   3157  1.1  riastrad 	if (WARN(intel_dig_port->max_lanes < 4,
   3158  1.1  riastrad 		 "Not enough lanes (%d) for HDMI on [ENCODER:%d:%s]\n",
   3159  1.1  riastrad 		 intel_dig_port->max_lanes, intel_encoder->base.base.id,
   3160  1.1  riastrad 		 intel_encoder->base.name))
   3161  1.1  riastrad 		return;
   3162  1.1  riastrad 
   3163  1.1  riastrad 	intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);
   3164  1.1  riastrad 	ddc = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
   3165  1.1  riastrad 
   3166  1.1  riastrad 	drm_connector_init_with_ddc(dev, connector,
   3167  1.1  riastrad 				    &intel_hdmi_connector_funcs,
   3168  1.1  riastrad 				    DRM_MODE_CONNECTOR_HDMIA,
   3169  1.1  riastrad 				    ddc);
   3170  1.1  riastrad 	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
   3171  1.1  riastrad 
   3172  1.1  riastrad 	connector->interlace_allowed = 1;
   3173  1.1  riastrad 	connector->doublescan_allowed = 0;
   3174  1.1  riastrad 	connector->stereo_allowed = 1;
   3175  1.1  riastrad 
   3176  1.1  riastrad 	if (INTEL_GEN(dev_priv) >= 10 || IS_GEMINILAKE(dev_priv))
   3177  1.1  riastrad 		connector->ycbcr_420_allowed = true;
   3178  1.1  riastrad 
   3179  1.1  riastrad 	intel_encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port);
   3180  1.1  riastrad 
   3181  1.1  riastrad 	if (HAS_DDI(dev_priv))
   3182  1.1  riastrad 		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
   3183  1.1  riastrad 	else
   3184  1.1  riastrad 		intel_connector->get_hw_state = intel_connector_get_hw_state;
   3185  1.1  riastrad 
   3186  1.1  riastrad 	intel_hdmi_add_properties(intel_hdmi, connector);
   3187  1.1  riastrad 
   3188  1.1  riastrad 	intel_connector_attach_encoder(intel_connector, intel_encoder);
   3189  1.1  riastrad 	intel_hdmi->attached_connector = intel_connector;
   3190  1.1  riastrad 
   3191  1.1  riastrad 	if (is_hdcp_supported(dev_priv, port)) {
   3192  1.1  riastrad 		int ret = intel_hdcp_init(intel_connector,
   3193  1.1  riastrad 					  &intel_hdmi_hdcp_shim);
   3194  1.1  riastrad 		if (ret)
   3195  1.1  riastrad 			DRM_DEBUG_KMS("HDCP init failed, skipping.\n");
   3196  1.1  riastrad 	}
   3197  1.1  riastrad 
   3198  1.1  riastrad 	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
   3199  1.1  riastrad 	 * 0xd.  Failure to do so will result in spurious interrupts being
   3200  1.1  riastrad 	 * generated on the port when a cable is not attached.
   3201  1.1  riastrad 	 */
   3202  1.1  riastrad 	if (IS_G45(dev_priv)) {
   3203  1.1  riastrad 		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
   3204  1.1  riastrad 		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
   3205  1.1  riastrad 	}
   3206  1.1  riastrad 
   3207  1.1  riastrad 	cec_fill_conn_info_from_drm(&conn_info, connector);
   3208  1.1  riastrad 
   3209  1.1  riastrad 	intel_hdmi->cec_notifier =
   3210  1.1  riastrad 		cec_notifier_conn_register(dev->dev, port_identifier(port),
   3211  1.1  riastrad 					   &conn_info);
   3212  1.1  riastrad 	if (!intel_hdmi->cec_notifier)
   3213  1.1  riastrad 		DRM_DEBUG_KMS("CEC notifier get failed\n");
   3214  1.1  riastrad }
   3215  1.1  riastrad 
   3216  1.1  riastrad static enum intel_hotplug_state
   3217  1.1  riastrad intel_hdmi_hotplug(struct intel_encoder *encoder,
   3218  1.1  riastrad 		   struct intel_connector *connector, bool irq_received)
   3219  1.1  riastrad {
   3220  1.1  riastrad 	enum intel_hotplug_state state;
   3221  1.1  riastrad 
   3222  1.1  riastrad 	state = intel_encoder_hotplug(encoder, connector, irq_received);
   3223  1.1  riastrad 
   3224  1.1  riastrad 	/*
   3225  1.1  riastrad 	 * On many platforms the HDMI live state signal is known to be
   3226  1.1  riastrad 	 * unreliable, so we can't use it to detect if a sink is connected or
   3227  1.1  riastrad 	 * not. Instead we detect if it's connected based on whether we can
   3228  1.1  riastrad 	 * read the EDID or not. That in turn has a problem during disconnect,
   3229  1.1  riastrad 	 * since the HPD interrupt may be raised before the DDC lines get
   3230  1.1  riastrad 	 * disconnected (due to how the required length of DDC vs. HPD
   3231  1.1  riastrad 	 * connector pins are specified) and so we'll still be able to get a
   3232  1.1  riastrad 	 * valid EDID. To solve this schedule another detection cycle if this
   3233  1.1  riastrad 	 * time around we didn't detect any change in the sink's connection
   3234  1.1  riastrad 	 * status.
   3235  1.1  riastrad 	 */
   3236  1.1  riastrad 	if (state == INTEL_HOTPLUG_UNCHANGED && irq_received)
   3237  1.1  riastrad 		state = INTEL_HOTPLUG_RETRY;
   3238  1.1  riastrad 
   3239  1.1  riastrad 	return state;
   3240  1.1  riastrad }
   3241  1.1  riastrad 
   3242  1.1  riastrad void intel_hdmi_init(struct drm_i915_private *dev_priv,
   3243  1.1  riastrad 		     i915_reg_t hdmi_reg, enum port port)
   3244  1.1  riastrad {
   3245  1.1  riastrad 	struct intel_digital_port *intel_dig_port;
   3246  1.1  riastrad 	struct intel_encoder *intel_encoder;
   3247  1.1  riastrad 	struct intel_connector *intel_connector;
   3248  1.1  riastrad 
   3249  1.1  riastrad 	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
   3250  1.1  riastrad 	if (!intel_dig_port)
   3251  1.1  riastrad 		return;
   3252  1.1  riastrad 
   3253  1.1  riastrad 	intel_connector = intel_connector_alloc();
   3254  1.1  riastrad 	if (!intel_connector) {
   3255  1.1  riastrad 		kfree(intel_dig_port);
   3256  1.1  riastrad 		return;
   3257  1.1  riastrad 	}
   3258  1.1  riastrad 
   3259  1.1  riastrad 	intel_encoder = &intel_dig_port->base;
   3260  1.1  riastrad 
   3261  1.1  riastrad 	drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
   3262  1.1  riastrad 			 &intel_hdmi_enc_funcs, DRM_MODE_ENCODER_TMDS,
   3263  1.1  riastrad 			 "HDMI %c", port_name(port));
   3264  1.1  riastrad 
   3265  1.1  riastrad 	intel_encoder->hotplug = intel_hdmi_hotplug;
   3266  1.1  riastrad 	intel_encoder->compute_config = intel_hdmi_compute_config;
   3267  1.1  riastrad 	if (HAS_PCH_SPLIT(dev_priv)) {
   3268  1.1  riastrad 		intel_encoder->disable = pch_disable_hdmi;
   3269  1.1  riastrad 		intel_encoder->post_disable = pch_post_disable_hdmi;
   3270  1.1  riastrad 	} else {
   3271  1.1  riastrad 		intel_encoder->disable = g4x_disable_hdmi;
   3272  1.1  riastrad 	}
   3273  1.1  riastrad 	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
   3274  1.1  riastrad 	intel_encoder->get_config = intel_hdmi_get_config;
   3275  1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv)) {
   3276  1.1  riastrad 		intel_encoder->pre_pll_enable = chv_hdmi_pre_pll_enable;
   3277  1.1  riastrad 		intel_encoder->pre_enable = chv_hdmi_pre_enable;
   3278  1.1  riastrad 		intel_encoder->enable = vlv_enable_hdmi;
   3279  1.1  riastrad 		intel_encoder->post_disable = chv_hdmi_post_disable;
   3280  1.1  riastrad 		intel_encoder->post_pll_disable = chv_hdmi_post_pll_disable;
   3281  1.1  riastrad 	} else if (IS_VALLEYVIEW(dev_priv)) {
   3282  1.1  riastrad 		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
   3283  1.1  riastrad 		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
   3284  1.1  riastrad 		intel_encoder->enable = vlv_enable_hdmi;
   3285  1.1  riastrad 		intel_encoder->post_disable = vlv_hdmi_post_disable;
   3286  1.1  riastrad 	} else {
   3287  1.1  riastrad 		intel_encoder->pre_enable = intel_hdmi_pre_enable;
   3288  1.1  riastrad 		if (HAS_PCH_CPT(dev_priv))
   3289  1.1  riastrad 			intel_encoder->enable = cpt_enable_hdmi;
   3290  1.1  riastrad 		else if (HAS_PCH_IBX(dev_priv))
   3291  1.1  riastrad 			intel_encoder->enable = ibx_enable_hdmi;
   3292  1.1  riastrad 		else
   3293  1.1  riastrad 			intel_encoder->enable = g4x_enable_hdmi;
   3294  1.1  riastrad 	}
   3295  1.1  riastrad 
   3296  1.1  riastrad 	intel_encoder->type = INTEL_OUTPUT_HDMI;
   3297  1.1  riastrad 	intel_encoder->power_domain = intel_port_to_power_domain(port);
   3298  1.1  riastrad 	intel_encoder->port = port;
   3299  1.1  riastrad 	if (IS_CHERRYVIEW(dev_priv)) {
   3300  1.1  riastrad 		if (port == PORT_D)
   3301  1.1  riastrad 			intel_encoder->pipe_mask = BIT(PIPE_C);
   3302  1.1  riastrad 		else
   3303  1.1  riastrad 			intel_encoder->pipe_mask = BIT(PIPE_A) | BIT(PIPE_B);
   3304  1.1  riastrad 	} else {
   3305  1.1  riastrad 		intel_encoder->pipe_mask = ~0;
   3306  1.1  riastrad 	}
   3307  1.1  riastrad 	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
   3308  1.1  riastrad 	/*
   3309  1.1  riastrad 	 * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems
   3310  1.1  riastrad 	 * to work on real hardware. And since g4x can send infoframes to
   3311  1.1  riastrad 	 * only one port anyway, nothing is lost by allowing it.
   3312  1.1  riastrad 	 */
   3313  1.1  riastrad 	if (IS_G4X(dev_priv))
   3314  1.1  riastrad 		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
   3315  1.1  riastrad 
   3316  1.1  riastrad 	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
   3317  1.1  riastrad 	intel_dig_port->dp.output_reg = INVALID_MMIO_REG;
   3318  1.1  riastrad 	intel_dig_port->max_lanes = 4;
   3319  1.1  riastrad 
   3320  1.1  riastrad 	intel_infoframe_init(intel_dig_port);
   3321  1.1  riastrad 
   3322  1.1  riastrad 	intel_dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);
   3323  1.1  riastrad 	intel_hdmi_init_connector(intel_dig_port, intel_connector);
   3324  1.1  riastrad }
   3325