Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright 2006 Dave Airlie <airlied@linux.ie>
0003  * Copyright © 2006-2009 Intel Corporation
0004  *
0005  * Permission is hereby granted, free of charge, to any person obtaining a
0006  * copy of this software and associated documentation files (the "Software"),
0007  * to deal in the Software without restriction, including without limitation
0008  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0009  * and/or sell copies of the Software, and to permit persons to whom the
0010  * Software is furnished to do so, subject to the following conditions:
0011  *
0012  * The above copyright notice and this permission notice (including the next
0013  * paragraph) shall be included in all copies or substantial portions of the
0014  * Software.
0015  *
0016  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0017  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0018  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0019  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0020  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0021  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
0022  * DEALINGS IN THE SOFTWARE.
0023  *
0024  * Authors:
0025  *  Eric Anholt <eric@anholt.net>
0026  *  Jesse Barnes <jesse.barnes@intel.com>
0027  */
0028 
0029 #include <linux/delay.h>
0030 #include <linux/hdmi.h>
0031 #include <linux/i2c.h>
0032 #include <linux/slab.h>
0033 #include <linux/string_helpers.h>
0034 
0035 #include <drm/display/drm_hdcp_helper.h>
0036 #include <drm/display/drm_hdmi_helper.h>
0037 #include <drm/display/drm_scdc_helper.h>
0038 #include <drm/drm_atomic_helper.h>
0039 #include <drm/drm_crtc.h>
0040 #include <drm/drm_edid.h>
0041 #include <drm/intel_lpe_audio.h>
0042 
0043 #include "i915_debugfs.h"
0044 #include "i915_drv.h"
0045 #include "intel_atomic.h"
0046 #include "intel_connector.h"
0047 #include "intel_ddi.h"
0048 #include "intel_de.h"
0049 #include "intel_display_types.h"
0050 #include "intel_dp.h"
0051 #include "intel_gmbus.h"
0052 #include "intel_hdcp.h"
0053 #include "intel_hdmi.h"
0054 #include "intel_lspcon.h"
0055 #include "intel_panel.h"
0056 #include "intel_snps_phy.h"
0057 
0058 static struct drm_i915_private *intel_hdmi_to_i915(struct intel_hdmi *intel_hdmi)
0059 {
0060     return to_i915(hdmi_to_dig_port(intel_hdmi)->base.base.dev);
0061 }
0062 
0063 static void
0064 assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
0065 {
0066     struct drm_i915_private *dev_priv = intel_hdmi_to_i915(intel_hdmi);
0067     u32 enabled_bits;
0068 
0069     enabled_bits = HAS_DDI(dev_priv) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
0070 
0071     drm_WARN(&dev_priv->drm,
0072          intel_de_read(dev_priv, intel_hdmi->hdmi_reg) & enabled_bits,
0073          "HDMI port enabled, expecting disabled\n");
0074 }
0075 
0076 static void
0077 assert_hdmi_transcoder_func_disabled(struct drm_i915_private *dev_priv,
0078                      enum transcoder cpu_transcoder)
0079 {
0080     drm_WARN(&dev_priv->drm,
0081          intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder)) &
0082          TRANS_DDI_FUNC_ENABLE,
0083          "HDMI transcoder function enabled, expecting disabled\n");
0084 }
0085 
0086 static u32 g4x_infoframe_index(unsigned int type)
0087 {
0088     switch (type) {
0089     case HDMI_PACKET_TYPE_GAMUT_METADATA:
0090         return VIDEO_DIP_SELECT_GAMUT;
0091     case HDMI_INFOFRAME_TYPE_AVI:
0092         return VIDEO_DIP_SELECT_AVI;
0093     case HDMI_INFOFRAME_TYPE_SPD:
0094         return VIDEO_DIP_SELECT_SPD;
0095     case HDMI_INFOFRAME_TYPE_VENDOR:
0096         return VIDEO_DIP_SELECT_VENDOR;
0097     default:
0098         MISSING_CASE(type);
0099         return 0;
0100     }
0101 }
0102 
0103 static u32 g4x_infoframe_enable(unsigned int type)
0104 {
0105     switch (type) {
0106     case HDMI_PACKET_TYPE_GENERAL_CONTROL:
0107         return VIDEO_DIP_ENABLE_GCP;
0108     case HDMI_PACKET_TYPE_GAMUT_METADATA:
0109         return VIDEO_DIP_ENABLE_GAMUT;
0110     case DP_SDP_VSC:
0111         return 0;
0112     case HDMI_INFOFRAME_TYPE_AVI:
0113         return VIDEO_DIP_ENABLE_AVI;
0114     case HDMI_INFOFRAME_TYPE_SPD:
0115         return VIDEO_DIP_ENABLE_SPD;
0116     case HDMI_INFOFRAME_TYPE_VENDOR:
0117         return VIDEO_DIP_ENABLE_VENDOR;
0118     case HDMI_INFOFRAME_TYPE_DRM:
0119         return 0;
0120     default:
0121         MISSING_CASE(type);
0122         return 0;
0123     }
0124 }
0125 
0126 static u32 hsw_infoframe_enable(unsigned int type)
0127 {
0128     switch (type) {
0129     case HDMI_PACKET_TYPE_GENERAL_CONTROL:
0130         return VIDEO_DIP_ENABLE_GCP_HSW;
0131     case HDMI_PACKET_TYPE_GAMUT_METADATA:
0132         return VIDEO_DIP_ENABLE_GMP_HSW;
0133     case DP_SDP_VSC:
0134         return VIDEO_DIP_ENABLE_VSC_HSW;
0135     case DP_SDP_PPS:
0136         return VDIP_ENABLE_PPS;
0137     case HDMI_INFOFRAME_TYPE_AVI:
0138         return VIDEO_DIP_ENABLE_AVI_HSW;
0139     case HDMI_INFOFRAME_TYPE_SPD:
0140         return VIDEO_DIP_ENABLE_SPD_HSW;
0141     case HDMI_INFOFRAME_TYPE_VENDOR:
0142         return VIDEO_DIP_ENABLE_VS_HSW;
0143     case HDMI_INFOFRAME_TYPE_DRM:
0144         return VIDEO_DIP_ENABLE_DRM_GLK;
0145     default:
0146         MISSING_CASE(type);
0147         return 0;
0148     }
0149 }
0150 
0151 static i915_reg_t
0152 hsw_dip_data_reg(struct drm_i915_private *dev_priv,
0153          enum transcoder cpu_transcoder,
0154          unsigned int type,
0155          int i)
0156 {
0157     switch (type) {
0158     case HDMI_PACKET_TYPE_GAMUT_METADATA:
0159         return HSW_TVIDEO_DIP_GMP_DATA(cpu_transcoder, i);
0160     case DP_SDP_VSC:
0161         return HSW_TVIDEO_DIP_VSC_DATA(cpu_transcoder, i);
0162     case DP_SDP_PPS:
0163         return ICL_VIDEO_DIP_PPS_DATA(cpu_transcoder, i);
0164     case HDMI_INFOFRAME_TYPE_AVI:
0165         return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder, i);
0166     case HDMI_INFOFRAME_TYPE_SPD:
0167         return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder, i);
0168     case HDMI_INFOFRAME_TYPE_VENDOR:
0169         return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder, i);
0170     case HDMI_INFOFRAME_TYPE_DRM:
0171         return GLK_TVIDEO_DIP_DRM_DATA(cpu_transcoder, i);
0172     default:
0173         MISSING_CASE(type);
0174         return INVALID_MMIO_REG;
0175     }
0176 }
0177 
0178 static int hsw_dip_data_size(struct drm_i915_private *dev_priv,
0179                  unsigned int type)
0180 {
0181     switch (type) {
0182     case DP_SDP_VSC:
0183         return VIDEO_DIP_VSC_DATA_SIZE;
0184     case DP_SDP_PPS:
0185         return VIDEO_DIP_PPS_DATA_SIZE;
0186     case HDMI_PACKET_TYPE_GAMUT_METADATA:
0187         if (DISPLAY_VER(dev_priv) >= 11)
0188             return VIDEO_DIP_GMP_DATA_SIZE;
0189         else
0190             return VIDEO_DIP_DATA_SIZE;
0191     default:
0192         return VIDEO_DIP_DATA_SIZE;
0193     }
0194 }
0195 
0196 static void g4x_write_infoframe(struct intel_encoder *encoder,
0197                 const struct intel_crtc_state *crtc_state,
0198                 unsigned int type,
0199                 const void *frame, ssize_t len)
0200 {
0201     const u32 *data = frame;
0202     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0203     u32 val = intel_de_read(dev_priv, VIDEO_DIP_CTL);
0204     int i;
0205 
0206     drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0207          "Writing DIP with CTL reg disabled\n");
0208 
0209     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0210     val |= g4x_infoframe_index(type);
0211 
0212     val &= ~g4x_infoframe_enable(type);
0213 
0214     intel_de_write(dev_priv, VIDEO_DIP_CTL, val);
0215 
0216     for (i = 0; i < len; i += 4) {
0217         intel_de_write(dev_priv, VIDEO_DIP_DATA, *data);
0218         data++;
0219     }
0220     /* Write every possible data byte to force correct ECC calculation. */
0221     for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0222         intel_de_write(dev_priv, VIDEO_DIP_DATA, 0);
0223 
0224     val |= g4x_infoframe_enable(type);
0225     val &= ~VIDEO_DIP_FREQ_MASK;
0226     val |= VIDEO_DIP_FREQ_VSYNC;
0227 
0228     intel_de_write(dev_priv, VIDEO_DIP_CTL, val);
0229     intel_de_posting_read(dev_priv, VIDEO_DIP_CTL);
0230 }
0231 
0232 static void g4x_read_infoframe(struct intel_encoder *encoder,
0233                    const struct intel_crtc_state *crtc_state,
0234                    unsigned int type,
0235                    void *frame, ssize_t len)
0236 {
0237     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0238     u32 val, *data = frame;
0239     int i;
0240 
0241     val = intel_de_read(dev_priv, VIDEO_DIP_CTL);
0242 
0243     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0244     val |= g4x_infoframe_index(type);
0245 
0246     intel_de_write(dev_priv, VIDEO_DIP_CTL, val);
0247 
0248     for (i = 0; i < len; i += 4)
0249         *data++ = intel_de_read(dev_priv, VIDEO_DIP_DATA);
0250 }
0251 
0252 static u32 g4x_infoframes_enabled(struct intel_encoder *encoder,
0253                   const struct intel_crtc_state *pipe_config)
0254 {
0255     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0256     u32 val = intel_de_read(dev_priv, VIDEO_DIP_CTL);
0257 
0258     if ((val & VIDEO_DIP_ENABLE) == 0)
0259         return 0;
0260 
0261     if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
0262         return 0;
0263 
0264     return val & (VIDEO_DIP_ENABLE_AVI |
0265               VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0266 }
0267 
0268 static void ibx_write_infoframe(struct intel_encoder *encoder,
0269                 const struct intel_crtc_state *crtc_state,
0270                 unsigned int type,
0271                 const void *frame, ssize_t len)
0272 {
0273     const u32 *data = frame;
0274     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0275     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0276     i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
0277     u32 val = intel_de_read(dev_priv, reg);
0278     int i;
0279 
0280     drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0281          "Writing DIP with CTL reg disabled\n");
0282 
0283     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0284     val |= g4x_infoframe_index(type);
0285 
0286     val &= ~g4x_infoframe_enable(type);
0287 
0288     intel_de_write(dev_priv, reg, val);
0289 
0290     for (i = 0; i < len; i += 4) {
0291         intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe),
0292                    *data);
0293         data++;
0294     }
0295     /* Write every possible data byte to force correct ECC calculation. */
0296     for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0297         intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 0);
0298 
0299     val |= g4x_infoframe_enable(type);
0300     val &= ~VIDEO_DIP_FREQ_MASK;
0301     val |= VIDEO_DIP_FREQ_VSYNC;
0302 
0303     intel_de_write(dev_priv, reg, val);
0304     intel_de_posting_read(dev_priv, reg);
0305 }
0306 
0307 static void ibx_read_infoframe(struct intel_encoder *encoder,
0308                    const struct intel_crtc_state *crtc_state,
0309                    unsigned int type,
0310                    void *frame, ssize_t len)
0311 {
0312     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0313     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0314     u32 val, *data = frame;
0315     int i;
0316 
0317     val = intel_de_read(dev_priv, TVIDEO_DIP_CTL(crtc->pipe));
0318 
0319     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0320     val |= g4x_infoframe_index(type);
0321 
0322     intel_de_write(dev_priv, TVIDEO_DIP_CTL(crtc->pipe), val);
0323 
0324     for (i = 0; i < len; i += 4)
0325         *data++ = intel_de_read(dev_priv, TVIDEO_DIP_DATA(crtc->pipe));
0326 }
0327 
0328 static u32 ibx_infoframes_enabled(struct intel_encoder *encoder,
0329                   const struct intel_crtc_state *pipe_config)
0330 {
0331     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0332     enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
0333     i915_reg_t reg = TVIDEO_DIP_CTL(pipe);
0334     u32 val = intel_de_read(dev_priv, reg);
0335 
0336     if ((val & VIDEO_DIP_ENABLE) == 0)
0337         return 0;
0338 
0339     if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
0340         return 0;
0341 
0342     return val & (VIDEO_DIP_ENABLE_AVI |
0343               VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0344               VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0345 }
0346 
0347 static void cpt_write_infoframe(struct intel_encoder *encoder,
0348                 const struct intel_crtc_state *crtc_state,
0349                 unsigned int type,
0350                 const void *frame, ssize_t len)
0351 {
0352     const u32 *data = frame;
0353     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0354     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0355     i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
0356     u32 val = intel_de_read(dev_priv, reg);
0357     int i;
0358 
0359     drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0360          "Writing DIP with CTL reg disabled\n");
0361 
0362     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0363     val |= g4x_infoframe_index(type);
0364 
0365     /* The DIP control register spec says that we need to update the AVI
0366      * infoframe without clearing its enable bit */
0367     if (type != HDMI_INFOFRAME_TYPE_AVI)
0368         val &= ~g4x_infoframe_enable(type);
0369 
0370     intel_de_write(dev_priv, reg, val);
0371 
0372     for (i = 0; i < len; i += 4) {
0373         intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe),
0374                    *data);
0375         data++;
0376     }
0377     /* Write every possible data byte to force correct ECC calculation. */
0378     for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0379         intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 0);
0380 
0381     val |= g4x_infoframe_enable(type);
0382     val &= ~VIDEO_DIP_FREQ_MASK;
0383     val |= VIDEO_DIP_FREQ_VSYNC;
0384 
0385     intel_de_write(dev_priv, reg, val);
0386     intel_de_posting_read(dev_priv, reg);
0387 }
0388 
0389 static void cpt_read_infoframe(struct intel_encoder *encoder,
0390                    const struct intel_crtc_state *crtc_state,
0391                    unsigned int type,
0392                    void *frame, ssize_t len)
0393 {
0394     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0395     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0396     u32 val, *data = frame;
0397     int i;
0398 
0399     val = intel_de_read(dev_priv, TVIDEO_DIP_CTL(crtc->pipe));
0400 
0401     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0402     val |= g4x_infoframe_index(type);
0403 
0404     intel_de_write(dev_priv, TVIDEO_DIP_CTL(crtc->pipe), val);
0405 
0406     for (i = 0; i < len; i += 4)
0407         *data++ = intel_de_read(dev_priv, TVIDEO_DIP_DATA(crtc->pipe));
0408 }
0409 
0410 static u32 cpt_infoframes_enabled(struct intel_encoder *encoder,
0411                   const struct intel_crtc_state *pipe_config)
0412 {
0413     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0414     enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
0415     u32 val = intel_de_read(dev_priv, TVIDEO_DIP_CTL(pipe));
0416 
0417     if ((val & VIDEO_DIP_ENABLE) == 0)
0418         return 0;
0419 
0420     return val & (VIDEO_DIP_ENABLE_AVI |
0421               VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0422               VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0423 }
0424 
0425 static void vlv_write_infoframe(struct intel_encoder *encoder,
0426                 const struct intel_crtc_state *crtc_state,
0427                 unsigned int type,
0428                 const void *frame, ssize_t len)
0429 {
0430     const u32 *data = frame;
0431     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0432     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0433     i915_reg_t reg = VLV_TVIDEO_DIP_CTL(crtc->pipe);
0434     u32 val = intel_de_read(dev_priv, reg);
0435     int i;
0436 
0437     drm_WARN(&dev_priv->drm, !(val & VIDEO_DIP_ENABLE),
0438          "Writing DIP with CTL reg disabled\n");
0439 
0440     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0441     val |= g4x_infoframe_index(type);
0442 
0443     val &= ~g4x_infoframe_enable(type);
0444 
0445     intel_de_write(dev_priv, reg, val);
0446 
0447     for (i = 0; i < len; i += 4) {
0448         intel_de_write(dev_priv,
0449                    VLV_TVIDEO_DIP_DATA(crtc->pipe), *data);
0450         data++;
0451     }
0452     /* Write every possible data byte to force correct ECC calculation. */
0453     for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
0454         intel_de_write(dev_priv,
0455                    VLV_TVIDEO_DIP_DATA(crtc->pipe), 0);
0456 
0457     val |= g4x_infoframe_enable(type);
0458     val &= ~VIDEO_DIP_FREQ_MASK;
0459     val |= VIDEO_DIP_FREQ_VSYNC;
0460 
0461     intel_de_write(dev_priv, reg, val);
0462     intel_de_posting_read(dev_priv, reg);
0463 }
0464 
0465 static void vlv_read_infoframe(struct intel_encoder *encoder,
0466                    const struct intel_crtc_state *crtc_state,
0467                    unsigned int type,
0468                    void *frame, ssize_t len)
0469 {
0470     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0471     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0472     u32 val, *data = frame;
0473     int i;
0474 
0475     val = intel_de_read(dev_priv, VLV_TVIDEO_DIP_CTL(crtc->pipe));
0476 
0477     val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
0478     val |= g4x_infoframe_index(type);
0479 
0480     intel_de_write(dev_priv, VLV_TVIDEO_DIP_CTL(crtc->pipe), val);
0481 
0482     for (i = 0; i < len; i += 4)
0483         *data++ = intel_de_read(dev_priv,
0484                         VLV_TVIDEO_DIP_DATA(crtc->pipe));
0485 }
0486 
0487 static u32 vlv_infoframes_enabled(struct intel_encoder *encoder,
0488                   const struct intel_crtc_state *pipe_config)
0489 {
0490     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0491     enum pipe pipe = to_intel_crtc(pipe_config->uapi.crtc)->pipe;
0492     u32 val = intel_de_read(dev_priv, VLV_TVIDEO_DIP_CTL(pipe));
0493 
0494     if ((val & VIDEO_DIP_ENABLE) == 0)
0495         return 0;
0496 
0497     if ((val & VIDEO_DIP_PORT_MASK) != VIDEO_DIP_PORT(encoder->port))
0498         return 0;
0499 
0500     return val & (VIDEO_DIP_ENABLE_AVI |
0501               VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
0502               VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
0503 }
0504 
0505 void hsw_write_infoframe(struct intel_encoder *encoder,
0506              const struct intel_crtc_state *crtc_state,
0507              unsigned int type,
0508              const void *frame, ssize_t len)
0509 {
0510     const u32 *data = frame;
0511     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0512     enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0513     i915_reg_t ctl_reg = HSW_TVIDEO_DIP_CTL(cpu_transcoder);
0514     int data_size;
0515     int i;
0516     u32 val = intel_de_read(dev_priv, ctl_reg);
0517 
0518     data_size = hsw_dip_data_size(dev_priv, type);
0519 
0520     drm_WARN_ON(&dev_priv->drm, len > data_size);
0521 
0522     val &= ~hsw_infoframe_enable(type);
0523     intel_de_write(dev_priv, ctl_reg, val);
0524 
0525     for (i = 0; i < len; i += 4) {
0526         intel_de_write(dev_priv,
0527                    hsw_dip_data_reg(dev_priv, cpu_transcoder, type, i >> 2),
0528                    *data);
0529         data++;
0530     }
0531     /* Write every possible data byte to force correct ECC calculation. */
0532     for (; i < data_size; i += 4)
0533         intel_de_write(dev_priv,
0534                    hsw_dip_data_reg(dev_priv, cpu_transcoder, type, i >> 2),
0535                    0);
0536 
0537     /* Wa_14013475917 */
0538     if (DISPLAY_VER(dev_priv) == 13 && crtc_state->has_psr &&
0539         type == DP_SDP_VSC)
0540         return;
0541 
0542     val |= hsw_infoframe_enable(type);
0543     intel_de_write(dev_priv, ctl_reg, val);
0544     intel_de_posting_read(dev_priv, ctl_reg);
0545 }
0546 
0547 void hsw_read_infoframe(struct intel_encoder *encoder,
0548             const struct intel_crtc_state *crtc_state,
0549             unsigned int type, void *frame, ssize_t len)
0550 {
0551     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0552     enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
0553     u32 *data = frame;
0554     int i;
0555 
0556     for (i = 0; i < len; i += 4)
0557         *data++ = intel_de_read(dev_priv,
0558                         hsw_dip_data_reg(dev_priv, cpu_transcoder, type, i >> 2));
0559 }
0560 
0561 static u32 hsw_infoframes_enabled(struct intel_encoder *encoder,
0562                   const struct intel_crtc_state *pipe_config)
0563 {
0564     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0565     u32 val = intel_de_read(dev_priv,
0566                 HSW_TVIDEO_DIP_CTL(pipe_config->cpu_transcoder));
0567     u32 mask;
0568 
0569     mask = (VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
0570         VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
0571         VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW);
0572 
0573     if (DISPLAY_VER(dev_priv) >= 10)
0574         mask |= VIDEO_DIP_ENABLE_DRM_GLK;
0575 
0576     return val & mask;
0577 }
0578 
0579 static const u8 infoframe_type_to_idx[] = {
0580     HDMI_PACKET_TYPE_GENERAL_CONTROL,
0581     HDMI_PACKET_TYPE_GAMUT_METADATA,
0582     DP_SDP_VSC,
0583     HDMI_INFOFRAME_TYPE_AVI,
0584     HDMI_INFOFRAME_TYPE_SPD,
0585     HDMI_INFOFRAME_TYPE_VENDOR,
0586     HDMI_INFOFRAME_TYPE_DRM,
0587 };
0588 
0589 u32 intel_hdmi_infoframe_enable(unsigned int type)
0590 {
0591     int i;
0592 
0593     for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
0594         if (infoframe_type_to_idx[i] == type)
0595             return BIT(i);
0596     }
0597 
0598     return 0;
0599 }
0600 
0601 u32 intel_hdmi_infoframes_enabled(struct intel_encoder *encoder,
0602                   const struct intel_crtc_state *crtc_state)
0603 {
0604     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0605     struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0606     u32 val, ret = 0;
0607     int i;
0608 
0609     val = dig_port->infoframes_enabled(encoder, crtc_state);
0610 
0611     /* map from hardware bits to dip idx */
0612     for (i = 0; i < ARRAY_SIZE(infoframe_type_to_idx); i++) {
0613         unsigned int type = infoframe_type_to_idx[i];
0614 
0615         if (HAS_DDI(dev_priv)) {
0616             if (val & hsw_infoframe_enable(type))
0617                 ret |= BIT(i);
0618         } else {
0619             if (val & g4x_infoframe_enable(type))
0620                 ret |= BIT(i);
0621         }
0622     }
0623 
0624     return ret;
0625 }
0626 
0627 /*
0628  * The data we write to the DIP data buffer registers is 1 byte bigger than the
0629  * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
0630  * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
0631  * used for both technologies.
0632  *
0633  * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
0634  * DW1:       DB3       | DB2 | DB1 | DB0
0635  * DW2:       DB7       | DB6 | DB5 | DB4
0636  * DW3: ...
0637  *
0638  * (HB is Header Byte, DB is Data Byte)
0639  *
0640  * The hdmi pack() functions don't know about that hardware specific hole so we
0641  * trick them by giving an offset into the buffer and moving back the header
0642  * bytes by one.
0643  */
0644 static void intel_write_infoframe(struct intel_encoder *encoder,
0645                   const struct intel_crtc_state *crtc_state,
0646                   enum hdmi_infoframe_type type,
0647                   const union hdmi_infoframe *frame)
0648 {
0649     struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0650     u8 buffer[VIDEO_DIP_DATA_SIZE];
0651     ssize_t len;
0652 
0653     if ((crtc_state->infoframes.enable &
0654          intel_hdmi_infoframe_enable(type)) == 0)
0655         return;
0656 
0657     if (drm_WARN_ON(encoder->base.dev, frame->any.type != type))
0658         return;
0659 
0660     /* see comment above for the reason for this offset */
0661     len = hdmi_infoframe_pack_only(frame, buffer + 1, sizeof(buffer) - 1);
0662     if (drm_WARN_ON(encoder->base.dev, len < 0))
0663         return;
0664 
0665     /* Insert the 'hole' (see big comment above) at position 3 */
0666     memmove(&buffer[0], &buffer[1], 3);
0667     buffer[3] = 0;
0668     len++;
0669 
0670     dig_port->write_infoframe(encoder, crtc_state, type, buffer, len);
0671 }
0672 
0673 void intel_read_infoframe(struct intel_encoder *encoder,
0674               const struct intel_crtc_state *crtc_state,
0675               enum hdmi_infoframe_type type,
0676               union hdmi_infoframe *frame)
0677 {
0678     struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0679     u8 buffer[VIDEO_DIP_DATA_SIZE];
0680     int ret;
0681 
0682     if ((crtc_state->infoframes.enable &
0683          intel_hdmi_infoframe_enable(type)) == 0)
0684         return;
0685 
0686     dig_port->read_infoframe(encoder, crtc_state,
0687                        type, buffer, sizeof(buffer));
0688 
0689     /* Fill the 'hole' (see big comment above) at position 3 */
0690     memmove(&buffer[1], &buffer[0], 3);
0691 
0692     /* see comment above for the reason for this offset */
0693     ret = hdmi_infoframe_unpack(frame, buffer + 1, sizeof(buffer) - 1);
0694     if (ret) {
0695         drm_dbg_kms(encoder->base.dev,
0696                 "Failed to unpack infoframe type 0x%02x\n", type);
0697         return;
0698     }
0699 
0700     if (frame->any.type != type)
0701         drm_dbg_kms(encoder->base.dev,
0702                 "Found the wrong infoframe type 0x%x (expected 0x%02x)\n",
0703                 frame->any.type, type);
0704 }
0705 
0706 static bool
0707 intel_hdmi_compute_avi_infoframe(struct intel_encoder *encoder,
0708                  struct intel_crtc_state *crtc_state,
0709                  struct drm_connector_state *conn_state)
0710 {
0711     struct hdmi_avi_infoframe *frame = &crtc_state->infoframes.avi.avi;
0712     const struct drm_display_mode *adjusted_mode =
0713         &crtc_state->hw.adjusted_mode;
0714     struct drm_connector *connector = conn_state->connector;
0715     int ret;
0716 
0717     if (!crtc_state->has_infoframe)
0718         return true;
0719 
0720     crtc_state->infoframes.enable |=
0721         intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_AVI);
0722 
0723     ret = drm_hdmi_avi_infoframe_from_display_mode(frame, connector,
0724                                adjusted_mode);
0725     if (ret)
0726         return false;
0727 
0728     if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420)
0729         frame->colorspace = HDMI_COLORSPACE_YUV420;
0730     else if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444)
0731         frame->colorspace = HDMI_COLORSPACE_YUV444;
0732     else
0733         frame->colorspace = HDMI_COLORSPACE_RGB;
0734 
0735     drm_hdmi_avi_infoframe_colorimetry(frame, conn_state);
0736 
0737     /* nonsense combination */
0738     drm_WARN_ON(encoder->base.dev, crtc_state->limited_color_range &&
0739             crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB);
0740 
0741     if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB) {
0742         drm_hdmi_avi_infoframe_quant_range(frame, connector,
0743                            adjusted_mode,
0744                            crtc_state->limited_color_range ?
0745                            HDMI_QUANTIZATION_RANGE_LIMITED :
0746                            HDMI_QUANTIZATION_RANGE_FULL);
0747     } else {
0748         frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT;
0749         frame->ycc_quantization_range = HDMI_YCC_QUANTIZATION_RANGE_LIMITED;
0750     }
0751 
0752     drm_hdmi_avi_infoframe_content_type(frame, conn_state);
0753 
0754     /* TODO: handle pixel repetition for YCBCR420 outputs */
0755 
0756     ret = hdmi_avi_infoframe_check(frame);
0757     if (drm_WARN_ON(encoder->base.dev, ret))
0758         return false;
0759 
0760     return true;
0761 }
0762 
0763 static bool
0764 intel_hdmi_compute_spd_infoframe(struct intel_encoder *encoder,
0765                  struct intel_crtc_state *crtc_state,
0766                  struct drm_connector_state *conn_state)
0767 {
0768     struct hdmi_spd_infoframe *frame = &crtc_state->infoframes.spd.spd;
0769     int ret;
0770 
0771     if (!crtc_state->has_infoframe)
0772         return true;
0773 
0774     crtc_state->infoframes.enable |=
0775         intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_SPD);
0776 
0777     ret = hdmi_spd_infoframe_init(frame, "Intel", "Integrated gfx");
0778     if (drm_WARN_ON(encoder->base.dev, ret))
0779         return false;
0780 
0781     frame->sdi = HDMI_SPD_SDI_PC;
0782 
0783     ret = hdmi_spd_infoframe_check(frame);
0784     if (drm_WARN_ON(encoder->base.dev, ret))
0785         return false;
0786 
0787     return true;
0788 }
0789 
0790 static bool
0791 intel_hdmi_compute_hdmi_infoframe(struct intel_encoder *encoder,
0792                   struct intel_crtc_state *crtc_state,
0793                   struct drm_connector_state *conn_state)
0794 {
0795     struct hdmi_vendor_infoframe *frame =
0796         &crtc_state->infoframes.hdmi.vendor.hdmi;
0797     const struct drm_display_info *info =
0798         &conn_state->connector->display_info;
0799     int ret;
0800 
0801     if (!crtc_state->has_infoframe || !info->has_hdmi_infoframe)
0802         return true;
0803 
0804     crtc_state->infoframes.enable |=
0805         intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_VENDOR);
0806 
0807     ret = drm_hdmi_vendor_infoframe_from_display_mode(frame,
0808                               conn_state->connector,
0809                               &crtc_state->hw.adjusted_mode);
0810     if (drm_WARN_ON(encoder->base.dev, ret))
0811         return false;
0812 
0813     ret = hdmi_vendor_infoframe_check(frame);
0814     if (drm_WARN_ON(encoder->base.dev, ret))
0815         return false;
0816 
0817     return true;
0818 }
0819 
0820 static bool
0821 intel_hdmi_compute_drm_infoframe(struct intel_encoder *encoder,
0822                  struct intel_crtc_state *crtc_state,
0823                  struct drm_connector_state *conn_state)
0824 {
0825     struct hdmi_drm_infoframe *frame = &crtc_state->infoframes.drm.drm;
0826     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0827     int ret;
0828 
0829     if (DISPLAY_VER(dev_priv) < 10)
0830         return true;
0831 
0832     if (!crtc_state->has_infoframe)
0833         return true;
0834 
0835     if (!conn_state->hdr_output_metadata)
0836         return true;
0837 
0838     crtc_state->infoframes.enable |=
0839         intel_hdmi_infoframe_enable(HDMI_INFOFRAME_TYPE_DRM);
0840 
0841     ret = drm_hdmi_infoframe_set_hdr_metadata(frame, conn_state);
0842     if (ret < 0) {
0843         drm_dbg_kms(&dev_priv->drm,
0844                 "couldn't set HDR metadata in infoframe\n");
0845         return false;
0846     }
0847 
0848     ret = hdmi_drm_infoframe_check(frame);
0849     if (drm_WARN_ON(&dev_priv->drm, ret))
0850         return false;
0851 
0852     return true;
0853 }
0854 
0855 static void g4x_set_infoframes(struct intel_encoder *encoder,
0856                    bool enable,
0857                    const struct intel_crtc_state *crtc_state,
0858                    const struct drm_connector_state *conn_state)
0859 {
0860     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0861     struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
0862     struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
0863     i915_reg_t reg = VIDEO_DIP_CTL;
0864     u32 val = intel_de_read(dev_priv, reg);
0865     u32 port = VIDEO_DIP_PORT(encoder->port);
0866 
0867     assert_hdmi_port_disabled(intel_hdmi);
0868 
0869     /* If the registers were not initialized yet, they might be zeroes,
0870      * which means we're selecting the AVI DIP and we're setting its
0871      * frequency to once. This seems to really confuse the HW and make
0872      * things stop working (the register spec says the AVI always needs to
0873      * be sent every VSync). So here we avoid writing to the register more
0874      * than we need and also explicitly select the AVI DIP and explicitly
0875      * set its frequency to every VSync. Avoiding to write it twice seems to
0876      * be enough to solve the problem, but being defensive shouldn't hurt us
0877      * either. */
0878     val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
0879 
0880     if (!enable) {
0881         if (!(val & VIDEO_DIP_ENABLE))
0882             return;
0883         if (port != (val & VIDEO_DIP_PORT_MASK)) {
0884             drm_dbg_kms(&dev_priv->drm,
0885                     "video DIP still enabled on port %c\n",
0886                     (val & VIDEO_DIP_PORT_MASK) >> 29);
0887             return;
0888         }
0889         val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
0890              VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0891         intel_de_write(dev_priv, reg, val);
0892         intel_de_posting_read(dev_priv, reg);
0893         return;
0894     }
0895 
0896     if (port != (val & VIDEO_DIP_PORT_MASK)) {
0897         if (val & VIDEO_DIP_ENABLE) {
0898             drm_dbg_kms(&dev_priv->drm,
0899                     "video DIP already enabled on port %c\n",
0900                     (val & VIDEO_DIP_PORT_MASK) >> 29);
0901             return;
0902         }
0903         val &= ~VIDEO_DIP_PORT_MASK;
0904         val |= port;
0905     }
0906 
0907     val |= VIDEO_DIP_ENABLE;
0908     val &= ~(VIDEO_DIP_ENABLE_AVI |
0909          VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_SPD);
0910 
0911     intel_de_write(dev_priv, reg, val);
0912     intel_de_posting_read(dev_priv, reg);
0913 
0914     intel_write_infoframe(encoder, crtc_state,
0915                   HDMI_INFOFRAME_TYPE_AVI,
0916                   &crtc_state->infoframes.avi);
0917     intel_write_infoframe(encoder, crtc_state,
0918                   HDMI_INFOFRAME_TYPE_SPD,
0919                   &crtc_state->infoframes.spd);
0920     intel_write_infoframe(encoder, crtc_state,
0921                   HDMI_INFOFRAME_TYPE_VENDOR,
0922                   &crtc_state->infoframes.hdmi);
0923 }
0924 
0925 /*
0926  * Determine if default_phase=1 can be indicated in the GCP infoframe.
0927  *
0928  * From HDMI specification 1.4a:
0929  * - The first pixel of each Video Data Period shall always have a pixel packing phase of 0
0930  * - The first pixel following each Video Data Period shall have a pixel packing phase of 0
0931  * - The PP bits shall be constant for all GCPs and will be equal to the last packing phase
0932  * - The first pixel following every transition of HSYNC or VSYNC shall have a pixel packing
0933  *   phase of 0
0934  */
0935 static bool gcp_default_phase_possible(int pipe_bpp,
0936                        const struct drm_display_mode *mode)
0937 {
0938     unsigned int pixels_per_group;
0939 
0940     switch (pipe_bpp) {
0941     case 30:
0942         /* 4 pixels in 5 clocks */
0943         pixels_per_group = 4;
0944         break;
0945     case 36:
0946         /* 2 pixels in 3 clocks */
0947         pixels_per_group = 2;
0948         break;
0949     case 48:
0950         /* 1 pixel in 2 clocks */
0951         pixels_per_group = 1;
0952         break;
0953     default:
0954         /* phase information not relevant for 8bpc */
0955         return false;
0956     }
0957 
0958     return mode->crtc_hdisplay % pixels_per_group == 0 &&
0959         mode->crtc_htotal % pixels_per_group == 0 &&
0960         mode->crtc_hblank_start % pixels_per_group == 0 &&
0961         mode->crtc_hblank_end % pixels_per_group == 0 &&
0962         mode->crtc_hsync_start % pixels_per_group == 0 &&
0963         mode->crtc_hsync_end % pixels_per_group == 0 &&
0964         ((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0 ||
0965          mode->crtc_htotal/2 % pixels_per_group == 0);
0966 }
0967 
0968 static bool intel_hdmi_set_gcp_infoframe(struct intel_encoder *encoder,
0969                      const struct intel_crtc_state *crtc_state,
0970                      const struct drm_connector_state *conn_state)
0971 {
0972     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0973     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0974     i915_reg_t reg;
0975 
0976     if ((crtc_state->infoframes.enable &
0977          intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
0978         return false;
0979 
0980     if (HAS_DDI(dev_priv))
0981         reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
0982     else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
0983         reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
0984     else if (HAS_PCH_SPLIT(dev_priv))
0985         reg = TVIDEO_DIP_GCP(crtc->pipe);
0986     else
0987         return false;
0988 
0989     intel_de_write(dev_priv, reg, crtc_state->infoframes.gcp);
0990 
0991     return true;
0992 }
0993 
0994 void intel_hdmi_read_gcp_infoframe(struct intel_encoder *encoder,
0995                    struct intel_crtc_state *crtc_state)
0996 {
0997     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
0998     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
0999     i915_reg_t reg;
1000 
1001     if ((crtc_state->infoframes.enable &
1002          intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL)) == 0)
1003         return;
1004 
1005     if (HAS_DDI(dev_priv))
1006         reg = HSW_TVIDEO_DIP_GCP(crtc_state->cpu_transcoder);
1007     else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
1008         reg = VLV_TVIDEO_DIP_GCP(crtc->pipe);
1009     else if (HAS_PCH_SPLIT(dev_priv))
1010         reg = TVIDEO_DIP_GCP(crtc->pipe);
1011     else
1012         return;
1013 
1014     crtc_state->infoframes.gcp = intel_de_read(dev_priv, reg);
1015 }
1016 
1017 static void intel_hdmi_compute_gcp_infoframe(struct intel_encoder *encoder,
1018                          struct intel_crtc_state *crtc_state,
1019                          struct drm_connector_state *conn_state)
1020 {
1021     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1022 
1023     if (IS_G4X(dev_priv) || !crtc_state->has_infoframe)
1024         return;
1025 
1026     crtc_state->infoframes.enable |=
1027         intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GENERAL_CONTROL);
1028 
1029     /* Indicate color indication for deep color mode */
1030     if (crtc_state->pipe_bpp > 24)
1031         crtc_state->infoframes.gcp |= GCP_COLOR_INDICATION;
1032 
1033     /* Enable default_phase whenever the display mode is suitably aligned */
1034     if (gcp_default_phase_possible(crtc_state->pipe_bpp,
1035                        &crtc_state->hw.adjusted_mode))
1036         crtc_state->infoframes.gcp |= GCP_DEFAULT_PHASE_ENABLE;
1037 }
1038 
1039 static void ibx_set_infoframes(struct intel_encoder *encoder,
1040                    bool enable,
1041                    const struct intel_crtc_state *crtc_state,
1042                    const struct drm_connector_state *conn_state)
1043 {
1044     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1045     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1046     struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
1047     struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
1048     i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
1049     u32 val = intel_de_read(dev_priv, reg);
1050     u32 port = VIDEO_DIP_PORT(encoder->port);
1051 
1052     assert_hdmi_port_disabled(intel_hdmi);
1053 
1054     /* See the big comment in g4x_set_infoframes() */
1055     val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1056 
1057     if (!enable) {
1058         if (!(val & VIDEO_DIP_ENABLE))
1059             return;
1060         val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1061              VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1062              VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1063         intel_de_write(dev_priv, reg, val);
1064         intel_de_posting_read(dev_priv, reg);
1065         return;
1066     }
1067 
1068     if (port != (val & VIDEO_DIP_PORT_MASK)) {
1069         drm_WARN(&dev_priv->drm, val & VIDEO_DIP_ENABLE,
1070              "DIP already enabled on port %c\n",
1071              (val & VIDEO_DIP_PORT_MASK) >> 29);
1072         val &= ~VIDEO_DIP_PORT_MASK;
1073         val |= port;
1074     }
1075 
1076     val |= VIDEO_DIP_ENABLE;
1077     val &= ~(VIDEO_DIP_ENABLE_AVI |
1078          VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1079          VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1080 
1081     if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1082         val |= VIDEO_DIP_ENABLE_GCP;
1083 
1084     intel_de_write(dev_priv, reg, val);
1085     intel_de_posting_read(dev_priv, reg);
1086 
1087     intel_write_infoframe(encoder, crtc_state,
1088                   HDMI_INFOFRAME_TYPE_AVI,
1089                   &crtc_state->infoframes.avi);
1090     intel_write_infoframe(encoder, crtc_state,
1091                   HDMI_INFOFRAME_TYPE_SPD,
1092                   &crtc_state->infoframes.spd);
1093     intel_write_infoframe(encoder, crtc_state,
1094                   HDMI_INFOFRAME_TYPE_VENDOR,
1095                   &crtc_state->infoframes.hdmi);
1096 }
1097 
1098 static void cpt_set_infoframes(struct intel_encoder *encoder,
1099                    bool enable,
1100                    const struct intel_crtc_state *crtc_state,
1101                    const struct drm_connector_state *conn_state)
1102 {
1103     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1104     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1105     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1106     i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe);
1107     u32 val = intel_de_read(dev_priv, reg);
1108 
1109     assert_hdmi_port_disabled(intel_hdmi);
1110 
1111     /* See the big comment in g4x_set_infoframes() */
1112     val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1113 
1114     if (!enable) {
1115         if (!(val & VIDEO_DIP_ENABLE))
1116             return;
1117         val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1118              VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1119              VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1120         intel_de_write(dev_priv, reg, val);
1121         intel_de_posting_read(dev_priv, reg);
1122         return;
1123     }
1124 
1125     /* Set both together, unset both together: see the spec. */
1126     val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
1127     val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1128          VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1129 
1130     if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1131         val |= VIDEO_DIP_ENABLE_GCP;
1132 
1133     intel_de_write(dev_priv, reg, val);
1134     intel_de_posting_read(dev_priv, reg);
1135 
1136     intel_write_infoframe(encoder, crtc_state,
1137                   HDMI_INFOFRAME_TYPE_AVI,
1138                   &crtc_state->infoframes.avi);
1139     intel_write_infoframe(encoder, crtc_state,
1140                   HDMI_INFOFRAME_TYPE_SPD,
1141                   &crtc_state->infoframes.spd);
1142     intel_write_infoframe(encoder, crtc_state,
1143                   HDMI_INFOFRAME_TYPE_VENDOR,
1144                   &crtc_state->infoframes.hdmi);
1145 }
1146 
1147 static void vlv_set_infoframes(struct intel_encoder *encoder,
1148                    bool enable,
1149                    const struct intel_crtc_state *crtc_state,
1150                    const struct drm_connector_state *conn_state)
1151 {
1152     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1153     struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1154     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
1155     i915_reg_t reg = VLV_TVIDEO_DIP_CTL(crtc->pipe);
1156     u32 val = intel_de_read(dev_priv, reg);
1157     u32 port = VIDEO_DIP_PORT(encoder->port);
1158 
1159     assert_hdmi_port_disabled(intel_hdmi);
1160 
1161     /* See the big comment in g4x_set_infoframes() */
1162     val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
1163 
1164     if (!enable) {
1165         if (!(val & VIDEO_DIP_ENABLE))
1166             return;
1167         val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI |
1168              VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1169              VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1170         intel_de_write(dev_priv, reg, val);
1171         intel_de_posting_read(dev_priv, reg);
1172         return;
1173     }
1174 
1175     if (port != (val & VIDEO_DIP_PORT_MASK)) {
1176         drm_WARN(&dev_priv->drm, val & VIDEO_DIP_ENABLE,
1177              "DIP already enabled on port %c\n",
1178              (val & VIDEO_DIP_PORT_MASK) >> 29);
1179         val &= ~VIDEO_DIP_PORT_MASK;
1180         val |= port;
1181     }
1182 
1183     val |= VIDEO_DIP_ENABLE;
1184     val &= ~(VIDEO_DIP_ENABLE_AVI |
1185          VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
1186          VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_ENABLE_GCP);
1187 
1188     if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1189         val |= VIDEO_DIP_ENABLE_GCP;
1190 
1191     intel_de_write(dev_priv, reg, val);
1192     intel_de_posting_read(dev_priv, reg);
1193 
1194     intel_write_infoframe(encoder, crtc_state,
1195                   HDMI_INFOFRAME_TYPE_AVI,
1196                   &crtc_state->infoframes.avi);
1197     intel_write_infoframe(encoder, crtc_state,
1198                   HDMI_INFOFRAME_TYPE_SPD,
1199                   &crtc_state->infoframes.spd);
1200     intel_write_infoframe(encoder, crtc_state,
1201                   HDMI_INFOFRAME_TYPE_VENDOR,
1202                   &crtc_state->infoframes.hdmi);
1203 }
1204 
1205 static void hsw_set_infoframes(struct intel_encoder *encoder,
1206                    bool enable,
1207                    const struct intel_crtc_state *crtc_state,
1208                    const struct drm_connector_state *conn_state)
1209 {
1210     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1211     i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder);
1212     u32 val = intel_de_read(dev_priv, reg);
1213 
1214     assert_hdmi_transcoder_func_disabled(dev_priv,
1215                          crtc_state->cpu_transcoder);
1216 
1217     val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_AVI_HSW |
1218          VIDEO_DIP_ENABLE_GCP_HSW | VIDEO_DIP_ENABLE_VS_HSW |
1219          VIDEO_DIP_ENABLE_GMP_HSW | VIDEO_DIP_ENABLE_SPD_HSW |
1220          VIDEO_DIP_ENABLE_DRM_GLK);
1221 
1222     if (!enable) {
1223         intel_de_write(dev_priv, reg, val);
1224         intel_de_posting_read(dev_priv, reg);
1225         return;
1226     }
1227 
1228     if (intel_hdmi_set_gcp_infoframe(encoder, crtc_state, conn_state))
1229         val |= VIDEO_DIP_ENABLE_GCP_HSW;
1230 
1231     intel_de_write(dev_priv, reg, val);
1232     intel_de_posting_read(dev_priv, reg);
1233 
1234     intel_write_infoframe(encoder, crtc_state,
1235                   HDMI_INFOFRAME_TYPE_AVI,
1236                   &crtc_state->infoframes.avi);
1237     intel_write_infoframe(encoder, crtc_state,
1238                   HDMI_INFOFRAME_TYPE_SPD,
1239                   &crtc_state->infoframes.spd);
1240     intel_write_infoframe(encoder, crtc_state,
1241                   HDMI_INFOFRAME_TYPE_VENDOR,
1242                   &crtc_state->infoframes.hdmi);
1243     intel_write_infoframe(encoder, crtc_state,
1244                   HDMI_INFOFRAME_TYPE_DRM,
1245                   &crtc_state->infoframes.drm);
1246 }
1247 
1248 void intel_dp_dual_mode_set_tmds_output(struct intel_hdmi *hdmi, bool enable)
1249 {
1250     struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi);
1251     struct i2c_adapter *adapter;
1252 
1253     if (hdmi->dp_dual_mode.type < DRM_DP_DUAL_MODE_TYPE2_DVI)
1254         return;
1255 
1256     adapter = intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
1257 
1258     drm_dbg_kms(&dev_priv->drm, "%s DP dual mode adaptor TMDS output\n",
1259             enable ? "Enabling" : "Disabling");
1260 
1261     drm_dp_dual_mode_set_tmds_output(&dev_priv->drm, hdmi->dp_dual_mode.type, adapter, enable);
1262 }
1263 
1264 static int intel_hdmi_hdcp_read(struct intel_digital_port *dig_port,
1265                 unsigned int offset, void *buffer, size_t size)
1266 {
1267     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1268     struct intel_hdmi *hdmi = &dig_port->hdmi;
1269     struct i2c_adapter *adapter = intel_gmbus_get_adapter(i915,
1270                                   hdmi->ddc_bus);
1271     int ret;
1272     u8 start = offset & 0xff;
1273     struct i2c_msg msgs[] = {
1274         {
1275             .addr = DRM_HDCP_DDC_ADDR,
1276             .flags = 0,
1277             .len = 1,
1278             .buf = &start,
1279         },
1280         {
1281             .addr = DRM_HDCP_DDC_ADDR,
1282             .flags = I2C_M_RD,
1283             .len = size,
1284             .buf = buffer
1285         }
1286     };
1287     ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
1288     if (ret == ARRAY_SIZE(msgs))
1289         return 0;
1290     return ret >= 0 ? -EIO : ret;
1291 }
1292 
1293 static int intel_hdmi_hdcp_write(struct intel_digital_port *dig_port,
1294                  unsigned int offset, void *buffer, size_t size)
1295 {
1296     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1297     struct intel_hdmi *hdmi = &dig_port->hdmi;
1298     struct i2c_adapter *adapter = intel_gmbus_get_adapter(i915,
1299                                   hdmi->ddc_bus);
1300     int ret;
1301     u8 *write_buf;
1302     struct i2c_msg msg;
1303 
1304     write_buf = kzalloc(size + 1, GFP_KERNEL);
1305     if (!write_buf)
1306         return -ENOMEM;
1307 
1308     write_buf[0] = offset & 0xff;
1309     memcpy(&write_buf[1], buffer, size);
1310 
1311     msg.addr = DRM_HDCP_DDC_ADDR;
1312     msg.flags = 0,
1313     msg.len = size + 1,
1314     msg.buf = write_buf;
1315 
1316     ret = i2c_transfer(adapter, &msg, 1);
1317     if (ret == 1)
1318         ret = 0;
1319     else if (ret >= 0)
1320         ret = -EIO;
1321 
1322     kfree(write_buf);
1323     return ret;
1324 }
1325 
1326 static
1327 int intel_hdmi_hdcp_write_an_aksv(struct intel_digital_port *dig_port,
1328                   u8 *an)
1329 {
1330     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1331     struct intel_hdmi *hdmi = &dig_port->hdmi;
1332     struct i2c_adapter *adapter = intel_gmbus_get_adapter(i915,
1333                                   hdmi->ddc_bus);
1334     int ret;
1335 
1336     ret = intel_hdmi_hdcp_write(dig_port, DRM_HDCP_DDC_AN, an,
1337                     DRM_HDCP_AN_LEN);
1338     if (ret) {
1339         drm_dbg_kms(&i915->drm, "Write An over DDC failed (%d)\n",
1340                 ret);
1341         return ret;
1342     }
1343 
1344     ret = intel_gmbus_output_aksv(adapter);
1345     if (ret < 0) {
1346         drm_dbg_kms(&i915->drm, "Failed to output aksv (%d)\n", ret);
1347         return ret;
1348     }
1349     return 0;
1350 }
1351 
1352 static int intel_hdmi_hdcp_read_bksv(struct intel_digital_port *dig_port,
1353                      u8 *bksv)
1354 {
1355     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1356 
1357     int ret;
1358     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BKSV, bksv,
1359                    DRM_HDCP_KSV_LEN);
1360     if (ret)
1361         drm_dbg_kms(&i915->drm, "Read Bksv over DDC failed (%d)\n",
1362                 ret);
1363     return ret;
1364 }
1365 
1366 static
1367 int intel_hdmi_hdcp_read_bstatus(struct intel_digital_port *dig_port,
1368                  u8 *bstatus)
1369 {
1370     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1371 
1372     int ret;
1373     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BSTATUS,
1374                    bstatus, DRM_HDCP_BSTATUS_LEN);
1375     if (ret)
1376         drm_dbg_kms(&i915->drm, "Read bstatus over DDC failed (%d)\n",
1377                 ret);
1378     return ret;
1379 }
1380 
1381 static
1382 int intel_hdmi_hdcp_repeater_present(struct intel_digital_port *dig_port,
1383                      bool *repeater_present)
1384 {
1385     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1386     int ret;
1387     u8 val;
1388 
1389     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1390     if (ret) {
1391         drm_dbg_kms(&i915->drm, "Read bcaps over DDC failed (%d)\n",
1392                 ret);
1393         return ret;
1394     }
1395     *repeater_present = val & DRM_HDCP_DDC_BCAPS_REPEATER_PRESENT;
1396     return 0;
1397 }
1398 
1399 static
1400 int intel_hdmi_hdcp_read_ri_prime(struct intel_digital_port *dig_port,
1401                   u8 *ri_prime)
1402 {
1403     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1404 
1405     int ret;
1406     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_RI_PRIME,
1407                    ri_prime, DRM_HDCP_RI_LEN);
1408     if (ret)
1409         drm_dbg_kms(&i915->drm, "Read Ri' over DDC failed (%d)\n",
1410                 ret);
1411     return ret;
1412 }
1413 
1414 static
1415 int intel_hdmi_hdcp_read_ksv_ready(struct intel_digital_port *dig_port,
1416                    bool *ksv_ready)
1417 {
1418     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1419     int ret;
1420     u8 val;
1421 
1422     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_BCAPS, &val, 1);
1423     if (ret) {
1424         drm_dbg_kms(&i915->drm, "Read bcaps over DDC failed (%d)\n",
1425                 ret);
1426         return ret;
1427     }
1428     *ksv_ready = val & DRM_HDCP_DDC_BCAPS_KSV_FIFO_READY;
1429     return 0;
1430 }
1431 
1432 static
1433 int intel_hdmi_hdcp_read_ksv_fifo(struct intel_digital_port *dig_port,
1434                   int num_downstream, u8 *ksv_fifo)
1435 {
1436     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1437     int ret;
1438     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_KSV_FIFO,
1439                    ksv_fifo, num_downstream * DRM_HDCP_KSV_LEN);
1440     if (ret) {
1441         drm_dbg_kms(&i915->drm,
1442                 "Read ksv fifo over DDC failed (%d)\n", ret);
1443         return ret;
1444     }
1445     return 0;
1446 }
1447 
1448 static
1449 int intel_hdmi_hdcp_read_v_prime_part(struct intel_digital_port *dig_port,
1450                       int i, u32 *part)
1451 {
1452     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1453     int ret;
1454 
1455     if (i >= DRM_HDCP_V_PRIME_NUM_PARTS)
1456         return -EINVAL;
1457 
1458     ret = intel_hdmi_hdcp_read(dig_port, DRM_HDCP_DDC_V_PRIME(i),
1459                    part, DRM_HDCP_V_PRIME_PART_LEN);
1460     if (ret)
1461         drm_dbg_kms(&i915->drm, "Read V'[%d] over DDC failed (%d)\n",
1462                 i, ret);
1463     return ret;
1464 }
1465 
1466 static int kbl_repositioning_enc_en_signal(struct intel_connector *connector,
1467                        enum transcoder cpu_transcoder)
1468 {
1469     struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1470     struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1471     struct intel_crtc *crtc = to_intel_crtc(connector->base.state->crtc);
1472     u32 scanline;
1473     int ret;
1474 
1475     for (;;) {
1476         scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe));
1477         if (scanline > 100 && scanline < 200)
1478             break;
1479         usleep_range(25, 50);
1480     }
1481 
1482     ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
1483                      false, TRANS_DDI_HDCP_SIGNALLING);
1484     if (ret) {
1485         drm_err(&dev_priv->drm,
1486             "Disable HDCP signalling failed (%d)\n", ret);
1487         return ret;
1488     }
1489 
1490     ret = intel_ddi_toggle_hdcp_bits(&dig_port->base, cpu_transcoder,
1491                      true, TRANS_DDI_HDCP_SIGNALLING);
1492     if (ret) {
1493         drm_err(&dev_priv->drm,
1494             "Enable HDCP signalling failed (%d)\n", ret);
1495         return ret;
1496     }
1497 
1498     return 0;
1499 }
1500 
1501 static
1502 int intel_hdmi_hdcp_toggle_signalling(struct intel_digital_port *dig_port,
1503                       enum transcoder cpu_transcoder,
1504                       bool enable)
1505 {
1506     struct intel_hdmi *hdmi = &dig_port->hdmi;
1507     struct intel_connector *connector = hdmi->attached_connector;
1508     struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1509     int ret;
1510 
1511     if (!enable)
1512         usleep_range(6, 60); /* Bspec says >= 6us */
1513 
1514     ret = intel_ddi_toggle_hdcp_bits(&dig_port->base,
1515                      cpu_transcoder, enable,
1516                      TRANS_DDI_HDCP_SIGNALLING);
1517     if (ret) {
1518         drm_err(&dev_priv->drm, "%s HDCP signalling failed (%d)\n",
1519             enable ? "Enable" : "Disable", ret);
1520         return ret;
1521     }
1522 
1523     /*
1524      * WA: To fix incorrect positioning of the window of
1525      * opportunity and enc_en signalling in KABYLAKE.
1526      */
1527     if (IS_KABYLAKE(dev_priv) && enable)
1528         return kbl_repositioning_enc_en_signal(connector,
1529                                cpu_transcoder);
1530 
1531     return 0;
1532 }
1533 
1534 static
1535 bool intel_hdmi_hdcp_check_link_once(struct intel_digital_port *dig_port,
1536                      struct intel_connector *connector)
1537 {
1538     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1539     enum port port = dig_port->base.port;
1540     enum transcoder cpu_transcoder = connector->hdcp.cpu_transcoder;
1541     int ret;
1542     union {
1543         u32 reg;
1544         u8 shim[DRM_HDCP_RI_LEN];
1545     } ri;
1546 
1547     ret = intel_hdmi_hdcp_read_ri_prime(dig_port, ri.shim);
1548     if (ret)
1549         return false;
1550 
1551     intel_de_write(i915, HDCP_RPRIME(i915, cpu_transcoder, port), ri.reg);
1552 
1553     /* Wait for Ri prime match */
1554     if (wait_for((intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder, port)) &
1555               (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC)) ==
1556              (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1)) {
1557         drm_dbg_kms(&i915->drm, "Ri' mismatch detected (%x)\n",
1558             intel_de_read(i915, HDCP_STATUS(i915, cpu_transcoder,
1559                             port)));
1560         return false;
1561     }
1562     return true;
1563 }
1564 
1565 static
1566 bool intel_hdmi_hdcp_check_link(struct intel_digital_port *dig_port,
1567                 struct intel_connector *connector)
1568 {
1569     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1570     int retry;
1571 
1572     for (retry = 0; retry < 3; retry++)
1573         if (intel_hdmi_hdcp_check_link_once(dig_port, connector))
1574             return true;
1575 
1576     drm_err(&i915->drm, "Link check failed\n");
1577     return false;
1578 }
1579 
1580 struct hdcp2_hdmi_msg_timeout {
1581     u8 msg_id;
1582     u16 timeout;
1583 };
1584 
1585 static const struct hdcp2_hdmi_msg_timeout hdcp2_msg_timeout[] = {
1586     { HDCP_2_2_AKE_SEND_CERT, HDCP_2_2_CERT_TIMEOUT_MS, },
1587     { HDCP_2_2_AKE_SEND_PAIRING_INFO, HDCP_2_2_PAIRING_TIMEOUT_MS, },
1588     { HDCP_2_2_LC_SEND_LPRIME, HDCP_2_2_HDMI_LPRIME_TIMEOUT_MS, },
1589     { HDCP_2_2_REP_SEND_RECVID_LIST, HDCP_2_2_RECVID_LIST_TIMEOUT_MS, },
1590     { HDCP_2_2_REP_STREAM_READY, HDCP_2_2_STREAM_READY_TIMEOUT_MS, },
1591 };
1592 
1593 static
1594 int intel_hdmi_hdcp2_read_rx_status(struct intel_digital_port *dig_port,
1595                     u8 *rx_status)
1596 {
1597     return intel_hdmi_hdcp_read(dig_port,
1598                     HDCP_2_2_HDMI_REG_RXSTATUS_OFFSET,
1599                     rx_status,
1600                     HDCP_2_2_HDMI_RXSTATUS_LEN);
1601 }
1602 
1603 static int get_hdcp2_msg_timeout(u8 msg_id, bool is_paired)
1604 {
1605     int i;
1606 
1607     if (msg_id == HDCP_2_2_AKE_SEND_HPRIME) {
1608         if (is_paired)
1609             return HDCP_2_2_HPRIME_PAIRED_TIMEOUT_MS;
1610         else
1611             return HDCP_2_2_HPRIME_NO_PAIRED_TIMEOUT_MS;
1612     }
1613 
1614     for (i = 0; i < ARRAY_SIZE(hdcp2_msg_timeout); i++) {
1615         if (hdcp2_msg_timeout[i].msg_id == msg_id)
1616             return hdcp2_msg_timeout[i].timeout;
1617     }
1618 
1619     return -EINVAL;
1620 }
1621 
1622 static int
1623 hdcp2_detect_msg_availability(struct intel_digital_port *dig_port,
1624                   u8 msg_id, bool *msg_ready,
1625                   ssize_t *msg_sz)
1626 {
1627     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1628     u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
1629     int ret;
1630 
1631     ret = intel_hdmi_hdcp2_read_rx_status(dig_port, rx_status);
1632     if (ret < 0) {
1633         drm_dbg_kms(&i915->drm, "rx_status read failed. Err %d\n",
1634                 ret);
1635         return ret;
1636     }
1637 
1638     *msg_sz = ((HDCP_2_2_HDMI_RXSTATUS_MSG_SZ_HI(rx_status[1]) << 8) |
1639           rx_status[0]);
1640 
1641     if (msg_id == HDCP_2_2_REP_SEND_RECVID_LIST)
1642         *msg_ready = (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]) &&
1643                  *msg_sz);
1644     else
1645         *msg_ready = *msg_sz;
1646 
1647     return 0;
1648 }
1649 
1650 static ssize_t
1651 intel_hdmi_hdcp2_wait_for_msg(struct intel_digital_port *dig_port,
1652                   u8 msg_id, bool paired)
1653 {
1654     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1655     bool msg_ready = false;
1656     int timeout, ret;
1657     ssize_t msg_sz = 0;
1658 
1659     timeout = get_hdcp2_msg_timeout(msg_id, paired);
1660     if (timeout < 0)
1661         return timeout;
1662 
1663     ret = __wait_for(ret = hdcp2_detect_msg_availability(dig_port,
1664                                  msg_id, &msg_ready,
1665                                  &msg_sz),
1666              !ret && msg_ready && msg_sz, timeout * 1000,
1667              1000, 5 * 1000);
1668     if (ret)
1669         drm_dbg_kms(&i915->drm, "msg_id: %d, ret: %d, timeout: %d\n",
1670                 msg_id, ret, timeout);
1671 
1672     return ret ? ret : msg_sz;
1673 }
1674 
1675 static
1676 int intel_hdmi_hdcp2_write_msg(struct intel_digital_port *dig_port,
1677                    void *buf, size_t size)
1678 {
1679     unsigned int offset;
1680 
1681     offset = HDCP_2_2_HDMI_REG_WR_MSG_OFFSET;
1682     return intel_hdmi_hdcp_write(dig_port, offset, buf, size);
1683 }
1684 
1685 static
1686 int intel_hdmi_hdcp2_read_msg(struct intel_digital_port *dig_port,
1687                   u8 msg_id, void *buf, size_t size)
1688 {
1689     struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
1690     struct intel_hdmi *hdmi = &dig_port->hdmi;
1691     struct intel_hdcp *hdcp = &hdmi->attached_connector->hdcp;
1692     unsigned int offset;
1693     ssize_t ret;
1694 
1695     ret = intel_hdmi_hdcp2_wait_for_msg(dig_port, msg_id,
1696                         hdcp->is_paired);
1697     if (ret < 0)
1698         return ret;
1699 
1700     /*
1701      * Available msg size should be equal to or lesser than the
1702      * available buffer.
1703      */
1704     if (ret > size) {
1705         drm_dbg_kms(&i915->drm,
1706                 "msg_sz(%zd) is more than exp size(%zu)\n",
1707                 ret, size);
1708         return -EINVAL;
1709     }
1710 
1711     offset = HDCP_2_2_HDMI_REG_RD_MSG_OFFSET;
1712     ret = intel_hdmi_hdcp_read(dig_port, offset, buf, ret);
1713     if (ret)
1714         drm_dbg_kms(&i915->drm, "Failed to read msg_id: %d(%zd)\n",
1715                 msg_id, ret);
1716 
1717     return ret;
1718 }
1719 
1720 static
1721 int intel_hdmi_hdcp2_check_link(struct intel_digital_port *dig_port,
1722                 struct intel_connector *connector)
1723 {
1724     u8 rx_status[HDCP_2_2_HDMI_RXSTATUS_LEN];
1725     int ret;
1726 
1727     ret = intel_hdmi_hdcp2_read_rx_status(dig_port, rx_status);
1728     if (ret)
1729         return ret;
1730 
1731     /*
1732      * Re-auth request and Link Integrity Failures are represented by
1733      * same bit. i.e reauth_req.
1734      */
1735     if (HDCP_2_2_HDMI_RXSTATUS_REAUTH_REQ(rx_status[1]))
1736         ret = HDCP_REAUTH_REQUEST;
1737     else if (HDCP_2_2_HDMI_RXSTATUS_READY(rx_status[1]))
1738         ret = HDCP_TOPOLOGY_CHANGE;
1739 
1740     return ret;
1741 }
1742 
1743 static
1744 int intel_hdmi_hdcp2_capable(struct intel_digital_port *dig_port,
1745                  bool *capable)
1746 {
1747     u8 hdcp2_version;
1748     int ret;
1749 
1750     *capable = false;
1751     ret = intel_hdmi_hdcp_read(dig_port, HDCP_2_2_HDMI_REG_VER_OFFSET,
1752                    &hdcp2_version, sizeof(hdcp2_version));
1753     if (!ret && hdcp2_version & HDCP_2_2_HDMI_SUPPORT_MASK)
1754         *capable = true;
1755 
1756     return ret;
1757 }
1758 
1759 static const struct intel_hdcp_shim intel_hdmi_hdcp_shim = {
1760     .write_an_aksv = intel_hdmi_hdcp_write_an_aksv,
1761     .read_bksv = intel_hdmi_hdcp_read_bksv,
1762     .read_bstatus = intel_hdmi_hdcp_read_bstatus,
1763     .repeater_present = intel_hdmi_hdcp_repeater_present,
1764     .read_ri_prime = intel_hdmi_hdcp_read_ri_prime,
1765     .read_ksv_ready = intel_hdmi_hdcp_read_ksv_ready,
1766     .read_ksv_fifo = intel_hdmi_hdcp_read_ksv_fifo,
1767     .read_v_prime_part = intel_hdmi_hdcp_read_v_prime_part,
1768     .toggle_signalling = intel_hdmi_hdcp_toggle_signalling,
1769     .check_link = intel_hdmi_hdcp_check_link,
1770     .write_2_2_msg = intel_hdmi_hdcp2_write_msg,
1771     .read_2_2_msg = intel_hdmi_hdcp2_read_msg,
1772     .check_2_2_link = intel_hdmi_hdcp2_check_link,
1773     .hdcp_2_2_capable = intel_hdmi_hdcp2_capable,
1774     .protocol = HDCP_PROTOCOL_HDMI,
1775 };
1776 
1777 static int intel_hdmi_source_max_tmds_clock(struct intel_encoder *encoder)
1778 {
1779     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1780     int max_tmds_clock, vbt_max_tmds_clock;
1781 
1782     if (DISPLAY_VER(dev_priv) >= 10)
1783         max_tmds_clock = 594000;
1784     else if (DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv))
1785         max_tmds_clock = 300000;
1786     else if (DISPLAY_VER(dev_priv) >= 5)
1787         max_tmds_clock = 225000;
1788     else
1789         max_tmds_clock = 165000;
1790 
1791     vbt_max_tmds_clock = intel_bios_max_tmds_clock(encoder);
1792     if (vbt_max_tmds_clock)
1793         max_tmds_clock = min(max_tmds_clock, vbt_max_tmds_clock);
1794 
1795     return max_tmds_clock;
1796 }
1797 
1798 static bool intel_has_hdmi_sink(struct intel_hdmi *hdmi,
1799                 const struct drm_connector_state *conn_state)
1800 {
1801     return hdmi->has_hdmi_sink &&
1802         READ_ONCE(to_intel_digital_connector_state(conn_state)->force_audio) != HDMI_AUDIO_OFF_DVI;
1803 }
1804 
1805 static bool intel_hdmi_is_ycbcr420(const struct intel_crtc_state *crtc_state)
1806 {
1807     return crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420;
1808 }
1809 
1810 static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
1811                  bool respect_downstream_limits,
1812                  bool has_hdmi_sink)
1813 {
1814     struct intel_encoder *encoder = &hdmi_to_dig_port(hdmi)->base;
1815     int max_tmds_clock = intel_hdmi_source_max_tmds_clock(encoder);
1816 
1817     if (respect_downstream_limits) {
1818         struct intel_connector *connector = hdmi->attached_connector;
1819         const struct drm_display_info *info = &connector->base.display_info;
1820 
1821         if (hdmi->dp_dual_mode.max_tmds_clock)
1822             max_tmds_clock = min(max_tmds_clock,
1823                          hdmi->dp_dual_mode.max_tmds_clock);
1824 
1825         if (info->max_tmds_clock)
1826             max_tmds_clock = min(max_tmds_clock,
1827                          info->max_tmds_clock);
1828         else if (!has_hdmi_sink)
1829             max_tmds_clock = min(max_tmds_clock, 165000);
1830     }
1831 
1832     return max_tmds_clock;
1833 }
1834 
1835 static enum drm_mode_status
1836 hdmi_port_clock_valid(struct intel_hdmi *hdmi,
1837               int clock, bool respect_downstream_limits,
1838               bool has_hdmi_sink)
1839 {
1840     struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi);
1841     enum phy phy = intel_port_to_phy(dev_priv, hdmi_to_dig_port(hdmi)->base.port);
1842 
1843     if (clock < 25000)
1844         return MODE_CLOCK_LOW;
1845     if (clock > hdmi_port_clock_limit(hdmi, respect_downstream_limits,
1846                       has_hdmi_sink))
1847         return MODE_CLOCK_HIGH;
1848 
1849     /* GLK DPLL can't generate 446-480 MHz */
1850     if (IS_GEMINILAKE(dev_priv) && clock > 446666 && clock < 480000)
1851         return MODE_CLOCK_RANGE;
1852 
1853     /* BXT/GLK DPLL can't generate 223-240 MHz */
1854     if ((IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) &&
1855         clock > 223333 && clock < 240000)
1856         return MODE_CLOCK_RANGE;
1857 
1858     /* CHV DPLL can't generate 216-240 MHz */
1859     if (IS_CHERRYVIEW(dev_priv) && clock > 216000 && clock < 240000)
1860         return MODE_CLOCK_RANGE;
1861 
1862     /* ICL+ combo PHY PLL can't generate 500-533.2 MHz */
1863     if (intel_phy_is_combo(dev_priv, phy) && clock > 500000 && clock < 533200)
1864         return MODE_CLOCK_RANGE;
1865 
1866     /* ICL+ TC PHY PLL can't generate 500-532.8 MHz */
1867     if (intel_phy_is_tc(dev_priv, phy) && clock > 500000 && clock < 532800)
1868         return MODE_CLOCK_RANGE;
1869 
1870     /*
1871      * SNPS PHYs' MPLLB table-based programming can only handle a fixed
1872      * set of link rates.
1873      *
1874      * FIXME: We will hopefully get an algorithmic way of programming
1875      * the MPLLB for HDMI in the future.
1876      */
1877     if (IS_DG2(dev_priv))
1878         return intel_snps_phy_check_hdmi_link_rate(clock);
1879 
1880     return MODE_OK;
1881 }
1882 
1883 int intel_hdmi_tmds_clock(int clock, int bpc, bool ycbcr420_output)
1884 {
1885     /* YCBCR420 TMDS rate requirement is half the pixel clock */
1886     if (ycbcr420_output)
1887         clock /= 2;
1888 
1889     /*
1890      * Need to adjust the port link by:
1891      *  1.5x for 12bpc
1892      *  1.25x for 10bpc
1893      */
1894     return clock * bpc / 8;
1895 }
1896 
1897 static bool intel_hdmi_source_bpc_possible(struct drm_i915_private *i915, int bpc)
1898 {
1899     switch (bpc) {
1900     case 12:
1901         return !HAS_GMCH(i915);
1902     case 10:
1903         return DISPLAY_VER(i915) >= 11;
1904     case 8:
1905         return true;
1906     default:
1907         MISSING_CASE(bpc);
1908         return false;
1909     }
1910 }
1911 
1912 static bool intel_hdmi_sink_bpc_possible(struct drm_connector *connector,
1913                      int bpc, bool has_hdmi_sink, bool ycbcr420_output)
1914 {
1915     const struct drm_display_info *info = &connector->display_info;
1916     const struct drm_hdmi_info *hdmi = &info->hdmi;
1917 
1918     switch (bpc) {
1919     case 12:
1920         if (!has_hdmi_sink)
1921             return false;
1922 
1923         if (ycbcr420_output)
1924             return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_36;
1925         else
1926             return info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_36;
1927     case 10:
1928         if (!has_hdmi_sink)
1929             return false;
1930 
1931         if (ycbcr420_output)
1932             return hdmi->y420_dc_modes & DRM_EDID_YCBCR420_DC_30;
1933         else
1934             return info->edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30;
1935     case 8:
1936         return true;
1937     default:
1938         MISSING_CASE(bpc);
1939         return false;
1940     }
1941 }
1942 
1943 static enum drm_mode_status
1944 intel_hdmi_mode_clock_valid(struct drm_connector *connector, int clock,
1945                 bool has_hdmi_sink, bool ycbcr420_output)
1946 {
1947     struct drm_i915_private *i915 = to_i915(connector->dev);
1948     struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
1949     enum drm_mode_status status = MODE_OK;
1950     int bpc;
1951 
1952     /*
1953      * Try all color depths since valid port clock range
1954      * can have holes. Any mode that can be used with at
1955      * least one color depth is accepted.
1956      */
1957     for (bpc = 12; bpc >= 8; bpc -= 2) {
1958         int tmds_clock = intel_hdmi_tmds_clock(clock, bpc, ycbcr420_output);
1959 
1960         if (!intel_hdmi_source_bpc_possible(i915, bpc))
1961             continue;
1962 
1963         if (!intel_hdmi_sink_bpc_possible(connector, bpc, has_hdmi_sink, ycbcr420_output))
1964             continue;
1965 
1966         status = hdmi_port_clock_valid(hdmi, tmds_clock, true, has_hdmi_sink);
1967         if (status == MODE_OK)
1968             return MODE_OK;
1969     }
1970 
1971     /* can never happen */
1972     drm_WARN_ON(&i915->drm, status == MODE_OK);
1973 
1974     return status;
1975 }
1976 
1977 static enum drm_mode_status
1978 intel_hdmi_mode_valid(struct drm_connector *connector,
1979               struct drm_display_mode *mode)
1980 {
1981     struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
1982     struct drm_i915_private *dev_priv = intel_hdmi_to_i915(hdmi);
1983     enum drm_mode_status status;
1984     int clock = mode->clock;
1985     int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
1986     bool has_hdmi_sink = intel_has_hdmi_sink(hdmi, connector->state);
1987     bool ycbcr_420_only;
1988 
1989     if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
1990         return MODE_NO_DBLESCAN;
1991 
1992     if ((mode->flags & DRM_MODE_FLAG_3D_MASK) == DRM_MODE_FLAG_3D_FRAME_PACKING)
1993         clock *= 2;
1994 
1995     if (clock > max_dotclk)
1996         return MODE_CLOCK_HIGH;
1997 
1998     if (mode->flags & DRM_MODE_FLAG_DBLCLK) {
1999         if (!has_hdmi_sink)
2000             return MODE_CLOCK_LOW;
2001         clock *= 2;
2002     }
2003 
2004     ycbcr_420_only = drm_mode_is_420_only(&connector->display_info, mode);
2005 
2006     status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, ycbcr_420_only);
2007     if (status != MODE_OK) {
2008         if (ycbcr_420_only ||
2009             !connector->ycbcr_420_allowed ||
2010             !drm_mode_is_420_also(&connector->display_info, mode))
2011             return status;
2012 
2013         status = intel_hdmi_mode_clock_valid(connector, clock, has_hdmi_sink, true);
2014         if (status != MODE_OK)
2015             return status;
2016     }
2017 
2018     return intel_mode_valid_max_plane_size(dev_priv, mode, false);
2019 }
2020 
2021 bool intel_hdmi_bpc_possible(const struct intel_crtc_state *crtc_state,
2022                  int bpc, bool has_hdmi_sink, bool ycbcr420_output)
2023 {
2024     struct drm_atomic_state *state = crtc_state->uapi.state;
2025     struct drm_connector_state *connector_state;
2026     struct drm_connector *connector;
2027     int i;
2028 
2029     for_each_new_connector_in_state(state, connector, connector_state, i) {
2030         if (connector_state->crtc != crtc_state->uapi.crtc)
2031             continue;
2032 
2033         if (!intel_hdmi_sink_bpc_possible(connector, bpc, has_hdmi_sink, ycbcr420_output))
2034             return false;
2035     }
2036 
2037     return true;
2038 }
2039 
2040 static bool hdmi_bpc_possible(const struct intel_crtc_state *crtc_state, int bpc)
2041 {
2042     struct drm_i915_private *dev_priv =
2043         to_i915(crtc_state->uapi.crtc->dev);
2044     const struct drm_display_mode *adjusted_mode =
2045         &crtc_state->hw.adjusted_mode;
2046 
2047     if (!intel_hdmi_source_bpc_possible(dev_priv, bpc))
2048         return false;
2049 
2050     /*
2051      * HDMI deep color affects the clocks, so it's only possible
2052      * when not cloning with other encoder types.
2053      */
2054     if (bpc > 8 && crtc_state->output_types != BIT(INTEL_OUTPUT_HDMI))
2055         return false;
2056 
2057     /* Display Wa_1405510057:icl,ehl */
2058     if (intel_hdmi_is_ycbcr420(crtc_state) &&
2059         bpc == 10 && DISPLAY_VER(dev_priv) == 11 &&
2060         (adjusted_mode->crtc_hblank_end -
2061          adjusted_mode->crtc_hblank_start) % 8 == 2)
2062         return false;
2063 
2064     return intel_hdmi_bpc_possible(crtc_state, bpc, crtc_state->has_hdmi_sink,
2065                        intel_hdmi_is_ycbcr420(crtc_state));
2066 }
2067 
2068 static int intel_hdmi_compute_bpc(struct intel_encoder *encoder,
2069                   struct intel_crtc_state *crtc_state,
2070                   int clock, bool respect_downstream_limits)
2071 {
2072     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2073     bool ycbcr420_output = intel_hdmi_is_ycbcr420(crtc_state);
2074     int bpc;
2075 
2076     /*
2077      * pipe_bpp could already be below 8bpc due to FDI
2078      * bandwidth constraints. HDMI minimum is 8bpc however.
2079      */
2080     bpc = max(crtc_state->pipe_bpp / 3, 8);
2081 
2082     /*
2083      * We will never exceed downstream TMDS clock limits while
2084      * attempting deep color. If the user insists on forcing an
2085      * out of spec mode they will have to be satisfied with 8bpc.
2086      */
2087     if (!respect_downstream_limits)
2088         bpc = 8;
2089 
2090     for (; bpc >= 8; bpc -= 2) {
2091         int tmds_clock = intel_hdmi_tmds_clock(clock, bpc, ycbcr420_output);
2092 
2093         if (hdmi_bpc_possible(crtc_state, bpc) &&
2094             hdmi_port_clock_valid(intel_hdmi, tmds_clock,
2095                       respect_downstream_limits,
2096                       crtc_state->has_hdmi_sink) == MODE_OK)
2097             return bpc;
2098     }
2099 
2100     return -EINVAL;
2101 }
2102 
2103 static int intel_hdmi_compute_clock(struct intel_encoder *encoder,
2104                     struct intel_crtc_state *crtc_state,
2105                     bool respect_downstream_limits)
2106 {
2107     struct drm_i915_private *i915 = to_i915(encoder->base.dev);
2108     const struct drm_display_mode *adjusted_mode =
2109         &crtc_state->hw.adjusted_mode;
2110     int bpc, clock = adjusted_mode->crtc_clock;
2111 
2112     if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
2113         clock *= 2;
2114 
2115     bpc = intel_hdmi_compute_bpc(encoder, crtc_state, clock,
2116                      respect_downstream_limits);
2117     if (bpc < 0)
2118         return bpc;
2119 
2120     crtc_state->port_clock =
2121         intel_hdmi_tmds_clock(clock, bpc, intel_hdmi_is_ycbcr420(crtc_state));
2122 
2123     /*
2124      * pipe_bpp could already be below 8bpc due to
2125      * FDI bandwidth constraints. We shouldn't bump it
2126      * back up to the HDMI minimum 8bpc in that case.
2127      */
2128     crtc_state->pipe_bpp = min(crtc_state->pipe_bpp, bpc * 3);
2129 
2130     drm_dbg_kms(&i915->drm,
2131             "picking %d bpc for HDMI output (pipe bpp: %d)\n",
2132             bpc, crtc_state->pipe_bpp);
2133 
2134     return 0;
2135 }
2136 
2137 bool intel_hdmi_limited_color_range(const struct intel_crtc_state *crtc_state,
2138                     const struct drm_connector_state *conn_state)
2139 {
2140     const struct intel_digital_connector_state *intel_conn_state =
2141         to_intel_digital_connector_state(conn_state);
2142     const struct drm_display_mode *adjusted_mode =
2143         &crtc_state->hw.adjusted_mode;
2144 
2145     /*
2146      * Our YCbCr output is always limited range.
2147      * crtc_state->limited_color_range only applies to RGB,
2148      * and it must never be set for YCbCr or we risk setting
2149      * some conflicting bits in PIPECONF which will mess up
2150      * the colors on the monitor.
2151      */
2152     if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB)
2153         return false;
2154 
2155     if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) {
2156         /* See CEA-861-E - 5.1 Default Encoding Parameters */
2157         return crtc_state->has_hdmi_sink &&
2158             drm_default_rgb_quant_range(adjusted_mode) ==
2159             HDMI_QUANTIZATION_RANGE_LIMITED;
2160     } else {
2161         return intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_LIMITED;
2162     }
2163 }
2164 
2165 static bool intel_hdmi_has_audio(struct intel_encoder *encoder,
2166                  const struct intel_crtc_state *crtc_state,
2167                  const struct drm_connector_state *conn_state)
2168 {
2169     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2170     const struct intel_digital_connector_state *intel_conn_state =
2171         to_intel_digital_connector_state(conn_state);
2172 
2173     if (!crtc_state->has_hdmi_sink)
2174         return false;
2175 
2176     if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO)
2177         return intel_hdmi->has_audio;
2178     else
2179         return intel_conn_state->force_audio == HDMI_AUDIO_ON;
2180 }
2181 
2182 static enum intel_output_format
2183 intel_hdmi_output_format(struct intel_connector *connector,
2184              bool ycbcr_420_output)
2185 {
2186     if (connector->base.ycbcr_420_allowed && ycbcr_420_output)
2187         return INTEL_OUTPUT_FORMAT_YCBCR420;
2188     else
2189         return INTEL_OUTPUT_FORMAT_RGB;
2190 }
2191 
2192 static int intel_hdmi_compute_output_format(struct intel_encoder *encoder,
2193                         struct intel_crtc_state *crtc_state,
2194                         const struct drm_connector_state *conn_state,
2195                         bool respect_downstream_limits)
2196 {
2197     struct intel_connector *connector = to_intel_connector(conn_state->connector);
2198     const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode;
2199     const struct drm_display_info *info = &connector->base.display_info;
2200     struct drm_i915_private *i915 = to_i915(connector->base.dev);
2201     bool ycbcr_420_only = drm_mode_is_420_only(info, adjusted_mode);
2202     int ret;
2203 
2204     crtc_state->output_format = intel_hdmi_output_format(connector, ycbcr_420_only);
2205 
2206     if (ycbcr_420_only && !intel_hdmi_is_ycbcr420(crtc_state)) {
2207         drm_dbg_kms(&i915->drm,
2208                 "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back to RGB.\n");
2209         crtc_state->output_format = INTEL_OUTPUT_FORMAT_RGB;
2210     }
2211 
2212     ret = intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream_limits);
2213     if (ret) {
2214         if (intel_hdmi_is_ycbcr420(crtc_state) ||
2215             !connector->base.ycbcr_420_allowed ||
2216             !drm_mode_is_420_also(info, adjusted_mode))
2217             return ret;
2218 
2219         crtc_state->output_format = intel_hdmi_output_format(connector, true);
2220         ret = intel_hdmi_compute_clock(encoder, crtc_state, respect_downstream_limits);
2221     }
2222 
2223     return ret;
2224 }
2225 
2226 int intel_hdmi_compute_config(struct intel_encoder *encoder,
2227                   struct intel_crtc_state *pipe_config,
2228                   struct drm_connector_state *conn_state)
2229 {
2230     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2231     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2232     struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode;
2233     struct drm_connector *connector = conn_state->connector;
2234     struct drm_scdc *scdc = &connector->display_info.hdmi.scdc;
2235     int ret;
2236 
2237     if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
2238         return -EINVAL;
2239 
2240     pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
2241     pipe_config->has_hdmi_sink = intel_has_hdmi_sink(intel_hdmi,
2242                              conn_state);
2243 
2244     if (pipe_config->has_hdmi_sink)
2245         pipe_config->has_infoframe = true;
2246 
2247     if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
2248         pipe_config->pixel_multiplier = 2;
2249 
2250     if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv))
2251         pipe_config->has_pch_encoder = true;
2252 
2253     pipe_config->has_audio =
2254         intel_hdmi_has_audio(encoder, pipe_config, conn_state);
2255 
2256     /*
2257      * Try to respect downstream TMDS clock limits first, if
2258      * that fails assume the user might know something we don't.
2259      */
2260     ret = intel_hdmi_compute_output_format(encoder, pipe_config, conn_state, true);
2261     if (ret)
2262         ret = intel_hdmi_compute_output_format(encoder, pipe_config, conn_state, false);
2263     if (ret) {
2264         drm_dbg_kms(&dev_priv->drm,
2265                 "unsupported HDMI clock (%d kHz), rejecting mode\n",
2266                 pipe_config->hw.adjusted_mode.crtc_clock);
2267         return ret;
2268     }
2269 
2270     if (intel_hdmi_is_ycbcr420(pipe_config)) {
2271         ret = intel_panel_fitting(pipe_config, conn_state);
2272         if (ret)
2273             return ret;
2274     }
2275 
2276     pipe_config->limited_color_range =
2277         intel_hdmi_limited_color_range(pipe_config, conn_state);
2278 
2279     if (conn_state->picture_aspect_ratio)
2280         adjusted_mode->picture_aspect_ratio =
2281             conn_state->picture_aspect_ratio;
2282 
2283     pipe_config->lane_count = 4;
2284 
2285     if (scdc->scrambling.supported && DISPLAY_VER(dev_priv) >= 10) {
2286         if (scdc->scrambling.low_rates)
2287             pipe_config->hdmi_scrambling = true;
2288 
2289         if (pipe_config->port_clock > 340000) {
2290             pipe_config->hdmi_scrambling = true;
2291             pipe_config->hdmi_high_tmds_clock_ratio = true;
2292         }
2293     }
2294 
2295     intel_hdmi_compute_gcp_infoframe(encoder, pipe_config,
2296                      conn_state);
2297 
2298     if (!intel_hdmi_compute_avi_infoframe(encoder, pipe_config, conn_state)) {
2299         drm_dbg_kms(&dev_priv->drm, "bad AVI infoframe\n");
2300         return -EINVAL;
2301     }
2302 
2303     if (!intel_hdmi_compute_spd_infoframe(encoder, pipe_config, conn_state)) {
2304         drm_dbg_kms(&dev_priv->drm, "bad SPD infoframe\n");
2305         return -EINVAL;
2306     }
2307 
2308     if (!intel_hdmi_compute_hdmi_infoframe(encoder, pipe_config, conn_state)) {
2309         drm_dbg_kms(&dev_priv->drm, "bad HDMI infoframe\n");
2310         return -EINVAL;
2311     }
2312 
2313     if (!intel_hdmi_compute_drm_infoframe(encoder, pipe_config, conn_state)) {
2314         drm_dbg_kms(&dev_priv->drm, "bad DRM infoframe\n");
2315         return -EINVAL;
2316     }
2317 
2318     return 0;
2319 }
2320 
2321 void intel_hdmi_encoder_shutdown(struct intel_encoder *encoder)
2322 {
2323     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2324 
2325     /*
2326      * Give a hand to buggy BIOSen which forget to turn
2327      * the TMDS output buffers back on after a reboot.
2328      */
2329     intel_dp_dual_mode_set_tmds_output(intel_hdmi, true);
2330 }
2331 
2332 static void
2333 intel_hdmi_unset_edid(struct drm_connector *connector)
2334 {
2335     struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2336 
2337     intel_hdmi->has_hdmi_sink = false;
2338     intel_hdmi->has_audio = false;
2339 
2340     intel_hdmi->dp_dual_mode.type = DRM_DP_DUAL_MODE_NONE;
2341     intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
2342 
2343     kfree(to_intel_connector(connector)->detect_edid);
2344     to_intel_connector(connector)->detect_edid = NULL;
2345 }
2346 
2347 static void
2348 intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
2349 {
2350     struct drm_i915_private *dev_priv = to_i915(connector->dev);
2351     struct intel_hdmi *hdmi = intel_attached_hdmi(to_intel_connector(connector));
2352     enum port port = hdmi_to_dig_port(hdmi)->base.port;
2353     struct i2c_adapter *adapter =
2354         intel_gmbus_get_adapter(dev_priv, hdmi->ddc_bus);
2355     enum drm_dp_dual_mode_type type = drm_dp_dual_mode_detect(&dev_priv->drm, adapter);
2356 
2357     /*
2358      * Type 1 DVI adaptors are not required to implement any
2359      * registers, so we can't always detect their presence.
2360      * Ideally we should be able to check the state of the
2361      * CONFIG1 pin, but no such luck on our hardware.
2362      *
2363      * The only method left to us is to check the VBT to see
2364      * if the port is a dual mode capable DP port. But let's
2365      * only do that when we sucesfully read the EDID, to avoid
2366      * confusing log messages about DP dual mode adaptors when
2367      * there's nothing connected to the port.
2368      */
2369     if (type == DRM_DP_DUAL_MODE_UNKNOWN) {
2370         /* An overridden EDID imply that we want this port for testing.
2371          * Make sure not to set limits for that port.
2372          */
2373         if (has_edid && !connector->override_edid &&
2374             intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
2375             drm_dbg_kms(&dev_priv->drm,
2376                     "Assuming DP dual mode adaptor presence based on VBT\n");
2377             type = DRM_DP_DUAL_MODE_TYPE1_DVI;
2378         } else {
2379             type = DRM_DP_DUAL_MODE_NONE;
2380         }
2381     }
2382 
2383     if (type == DRM_DP_DUAL_MODE_NONE)
2384         return;
2385 
2386     hdmi->dp_dual_mode.type = type;
2387     hdmi->dp_dual_mode.max_tmds_clock =
2388         drm_dp_dual_mode_max_tmds_clock(&dev_priv->drm, type, adapter);
2389 
2390     drm_dbg_kms(&dev_priv->drm,
2391             "DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
2392             drm_dp_get_dual_mode_type_name(type),
2393             hdmi->dp_dual_mode.max_tmds_clock);
2394 
2395     /* Older VBTs are often buggy and can't be trusted :( Play it safe. */
2396     if ((DISPLAY_VER(dev_priv) >= 8 || IS_HASWELL(dev_priv)) &&
2397         !intel_bios_is_port_dp_dual_mode(dev_priv, port)) {
2398         drm_dbg_kms(&dev_priv->drm,
2399                 "Ignoring DP dual mode adaptor max TMDS clock for native HDMI port\n");
2400         hdmi->dp_dual_mode.max_tmds_clock = 0;
2401     }
2402 }
2403 
2404 static bool
2405 intel_hdmi_set_edid(struct drm_connector *connector)
2406 {
2407     struct drm_i915_private *dev_priv = to_i915(connector->dev);
2408     struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2409     intel_wakeref_t wakeref;
2410     struct edid *edid;
2411     bool connected = false;
2412     struct i2c_adapter *i2c;
2413 
2414     wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
2415 
2416     i2c = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2417 
2418     edid = drm_get_edid(connector, i2c);
2419 
2420     if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
2421         drm_dbg_kms(&dev_priv->drm,
2422                 "HDMI GMBUS EDID read failed, retry using GPIO bit-banging\n");
2423         intel_gmbus_force_bit(i2c, true);
2424         edid = drm_get_edid(connector, i2c);
2425         intel_gmbus_force_bit(i2c, false);
2426     }
2427 
2428     intel_hdmi_dp_dual_mode_detect(connector, edid != NULL);
2429 
2430     intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
2431 
2432     to_intel_connector(connector)->detect_edid = edid;
2433     if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
2434         intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
2435         intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
2436 
2437         connected = true;
2438     }
2439 
2440     cec_notifier_set_phys_addr_from_edid(intel_hdmi->cec_notifier, edid);
2441 
2442     return connected;
2443 }
2444 
2445 static enum drm_connector_status
2446 intel_hdmi_detect(struct drm_connector *connector, bool force)
2447 {
2448     enum drm_connector_status status = connector_status_disconnected;
2449     struct drm_i915_private *dev_priv = to_i915(connector->dev);
2450     struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2451     struct intel_encoder *encoder = &hdmi_to_dig_port(intel_hdmi)->base;
2452     intel_wakeref_t wakeref;
2453 
2454     drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
2455             connector->base.id, connector->name);
2456 
2457     if (!INTEL_DISPLAY_ENABLED(dev_priv))
2458         return connector_status_disconnected;
2459 
2460     wakeref = intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS);
2461 
2462     if (DISPLAY_VER(dev_priv) >= 11 &&
2463         !intel_digital_port_connected(encoder))
2464         goto out;
2465 
2466     intel_hdmi_unset_edid(connector);
2467 
2468     if (intel_hdmi_set_edid(connector))
2469         status = connector_status_connected;
2470 
2471 out:
2472     intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
2473 
2474     if (status != connector_status_connected)
2475         cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier);
2476 
2477     /*
2478      * Make sure the refs for power wells enabled during detect are
2479      * dropped to avoid a new detect cycle triggered by HPD polling.
2480      */
2481     intel_display_power_flush_work(dev_priv);
2482 
2483     return status;
2484 }
2485 
2486 static void
2487 intel_hdmi_force(struct drm_connector *connector)
2488 {
2489     struct drm_i915_private *i915 = to_i915(connector->dev);
2490 
2491     drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s]\n",
2492             connector->base.id, connector->name);
2493 
2494     intel_hdmi_unset_edid(connector);
2495 
2496     if (connector->status != connector_status_connected)
2497         return;
2498 
2499     intel_hdmi_set_edid(connector);
2500 }
2501 
2502 static int intel_hdmi_get_modes(struct drm_connector *connector)
2503 {
2504     struct edid *edid;
2505 
2506     edid = to_intel_connector(connector)->detect_edid;
2507     if (edid == NULL)
2508         return 0;
2509 
2510     return intel_connector_update_modes(connector, edid);
2511 }
2512 
2513 static struct i2c_adapter *
2514 intel_hdmi_get_i2c_adapter(struct drm_connector *connector)
2515 {
2516     struct drm_i915_private *dev_priv = to_i915(connector->dev);
2517     struct intel_hdmi *intel_hdmi = intel_attached_hdmi(to_intel_connector(connector));
2518 
2519     return intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2520 }
2521 
2522 static void intel_hdmi_create_i2c_symlink(struct drm_connector *connector)
2523 {
2524     struct drm_i915_private *i915 = to_i915(connector->dev);
2525     struct i2c_adapter *adapter = intel_hdmi_get_i2c_adapter(connector);
2526     struct kobject *i2c_kobj = &adapter->dev.kobj;
2527     struct kobject *connector_kobj = &connector->kdev->kobj;
2528     int ret;
2529 
2530     ret = sysfs_create_link(connector_kobj, i2c_kobj, i2c_kobj->name);
2531     if (ret)
2532         drm_err(&i915->drm, "Failed to create i2c symlink (%d)\n", ret);
2533 }
2534 
2535 static void intel_hdmi_remove_i2c_symlink(struct drm_connector *connector)
2536 {
2537     struct i2c_adapter *adapter = intel_hdmi_get_i2c_adapter(connector);
2538     struct kobject *i2c_kobj = &adapter->dev.kobj;
2539     struct kobject *connector_kobj = &connector->kdev->kobj;
2540 
2541     sysfs_remove_link(connector_kobj, i2c_kobj->name);
2542 }
2543 
2544 static int
2545 intel_hdmi_connector_register(struct drm_connector *connector)
2546 {
2547     int ret;
2548 
2549     ret = intel_connector_register(connector);
2550     if (ret)
2551         return ret;
2552 
2553     intel_hdmi_create_i2c_symlink(connector);
2554 
2555     return ret;
2556 }
2557 
2558 static void intel_hdmi_connector_unregister(struct drm_connector *connector)
2559 {
2560     struct cec_notifier *n = intel_attached_hdmi(to_intel_connector(connector))->cec_notifier;
2561 
2562     cec_notifier_conn_unregister(n);
2563 
2564     intel_hdmi_remove_i2c_symlink(connector);
2565     intel_connector_unregister(connector);
2566 }
2567 
2568 static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
2569     .detect = intel_hdmi_detect,
2570     .force = intel_hdmi_force,
2571     .fill_modes = drm_helper_probe_single_connector_modes,
2572     .atomic_get_property = intel_digital_connector_atomic_get_property,
2573     .atomic_set_property = intel_digital_connector_atomic_set_property,
2574     .late_register = intel_hdmi_connector_register,
2575     .early_unregister = intel_hdmi_connector_unregister,
2576     .destroy = intel_connector_destroy,
2577     .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
2578     .atomic_duplicate_state = intel_digital_connector_duplicate_state,
2579 };
2580 
2581 static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
2582     .get_modes = intel_hdmi_get_modes,
2583     .mode_valid = intel_hdmi_mode_valid,
2584     .atomic_check = intel_digital_connector_atomic_check,
2585 };
2586 
2587 static void
2588 intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
2589 {
2590     struct drm_i915_private *dev_priv = to_i915(connector->dev);
2591 
2592     intel_attach_force_audio_property(connector);
2593     intel_attach_broadcast_rgb_property(connector);
2594     intel_attach_aspect_ratio_property(connector);
2595 
2596     intel_attach_hdmi_colorspace_property(connector);
2597     drm_connector_attach_content_type_property(connector);
2598 
2599     if (DISPLAY_VER(dev_priv) >= 10)
2600         drm_connector_attach_hdr_output_metadata_property(connector);
2601 
2602     if (!HAS_GMCH(dev_priv))
2603         drm_connector_attach_max_bpc_property(connector, 8, 12);
2604 }
2605 
2606 /*
2607  * intel_hdmi_handle_sink_scrambling: handle sink scrambling/clock ratio setup
2608  * @encoder: intel_encoder
2609  * @connector: drm_connector
2610  * @high_tmds_clock_ratio = bool to indicate if the function needs to set
2611  *  or reset the high tmds clock ratio for scrambling
2612  * @scrambling: bool to Indicate if the function needs to set or reset
2613  *  sink scrambling
2614  *
2615  * This function handles scrambling on HDMI 2.0 capable sinks.
2616  * If required clock rate is > 340 Mhz && scrambling is supported by sink
2617  * it enables scrambling. This should be called before enabling the HDMI
2618  * 2.0 port, as the sink can choose to disable the scrambling if it doesn't
2619  * detect a scrambled clock within 100 ms.
2620  *
2621  * Returns:
2622  * True on success, false on failure.
2623  */
2624 bool intel_hdmi_handle_sink_scrambling(struct intel_encoder *encoder,
2625                        struct drm_connector *connector,
2626                        bool high_tmds_clock_ratio,
2627                        bool scrambling)
2628 {
2629     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2630     struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2631     struct drm_scrambling *sink_scrambling =
2632         &connector->display_info.hdmi.scdc.scrambling;
2633     struct i2c_adapter *adapter =
2634         intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2635 
2636     if (!sink_scrambling->supported)
2637         return true;
2638 
2639     drm_dbg_kms(&dev_priv->drm,
2640             "[CONNECTOR:%d:%s] scrambling=%s, TMDS bit clock ratio=1/%d\n",
2641             connector->base.id, connector->name,
2642             str_yes_no(scrambling), high_tmds_clock_ratio ? 40 : 10);
2643 
2644     /* Set TMDS bit clock ratio to 1/40 or 1/10, and enable/disable scrambling */
2645     return drm_scdc_set_high_tmds_clock_ratio(adapter,
2646                           high_tmds_clock_ratio) &&
2647         drm_scdc_set_scrambling(adapter, scrambling);
2648 }
2649 
2650 static u8 chv_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2651 {
2652     u8 ddc_pin;
2653 
2654     switch (port) {
2655     case PORT_B:
2656         ddc_pin = GMBUS_PIN_DPB;
2657         break;
2658     case PORT_C:
2659         ddc_pin = GMBUS_PIN_DPC;
2660         break;
2661     case PORT_D:
2662         ddc_pin = GMBUS_PIN_DPD_CHV;
2663         break;
2664     default:
2665         MISSING_CASE(port);
2666         ddc_pin = GMBUS_PIN_DPB;
2667         break;
2668     }
2669     return ddc_pin;
2670 }
2671 
2672 static u8 bxt_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2673 {
2674     u8 ddc_pin;
2675 
2676     switch (port) {
2677     case PORT_B:
2678         ddc_pin = GMBUS_PIN_1_BXT;
2679         break;
2680     case PORT_C:
2681         ddc_pin = GMBUS_PIN_2_BXT;
2682         break;
2683     default:
2684         MISSING_CASE(port);
2685         ddc_pin = GMBUS_PIN_1_BXT;
2686         break;
2687     }
2688     return ddc_pin;
2689 }
2690 
2691 static u8 cnp_port_to_ddc_pin(struct drm_i915_private *dev_priv,
2692                   enum port port)
2693 {
2694     u8 ddc_pin;
2695 
2696     switch (port) {
2697     case PORT_B:
2698         ddc_pin = GMBUS_PIN_1_BXT;
2699         break;
2700     case PORT_C:
2701         ddc_pin = GMBUS_PIN_2_BXT;
2702         break;
2703     case PORT_D:
2704         ddc_pin = GMBUS_PIN_4_CNP;
2705         break;
2706     case PORT_F:
2707         ddc_pin = GMBUS_PIN_3_BXT;
2708         break;
2709     default:
2710         MISSING_CASE(port);
2711         ddc_pin = GMBUS_PIN_1_BXT;
2712         break;
2713     }
2714     return ddc_pin;
2715 }
2716 
2717 static u8 icl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2718 {
2719     enum phy phy = intel_port_to_phy(dev_priv, port);
2720 
2721     if (intel_phy_is_combo(dev_priv, phy))
2722         return GMBUS_PIN_1_BXT + port;
2723     else if (intel_phy_is_tc(dev_priv, phy))
2724         return GMBUS_PIN_9_TC1_ICP + intel_port_to_tc(dev_priv, port);
2725 
2726     drm_WARN(&dev_priv->drm, 1, "Unknown port:%c\n", port_name(port));
2727     return GMBUS_PIN_2_BXT;
2728 }
2729 
2730 static u8 mcc_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2731 {
2732     enum phy phy = intel_port_to_phy(dev_priv, port);
2733     u8 ddc_pin;
2734 
2735     switch (phy) {
2736     case PHY_A:
2737         ddc_pin = GMBUS_PIN_1_BXT;
2738         break;
2739     case PHY_B:
2740         ddc_pin = GMBUS_PIN_2_BXT;
2741         break;
2742     case PHY_C:
2743         ddc_pin = GMBUS_PIN_9_TC1_ICP;
2744         break;
2745     default:
2746         MISSING_CASE(phy);
2747         ddc_pin = GMBUS_PIN_1_BXT;
2748         break;
2749     }
2750     return ddc_pin;
2751 }
2752 
2753 static u8 rkl_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2754 {
2755     enum phy phy = intel_port_to_phy(dev_priv, port);
2756 
2757     WARN_ON(port == PORT_C);
2758 
2759     /*
2760      * Pin mapping for RKL depends on which PCH is present.  With TGP, the
2761      * final two outputs use type-c pins, even though they're actually
2762      * combo outputs.  With CMP, the traditional DDI A-D pins are used for
2763      * all outputs.
2764      */
2765     if (INTEL_PCH_TYPE(dev_priv) >= PCH_TGP && phy >= PHY_C)
2766         return GMBUS_PIN_9_TC1_ICP + phy - PHY_C;
2767 
2768     return GMBUS_PIN_1_BXT + phy;
2769 }
2770 
2771 static u8 gen9bc_tgp_port_to_ddc_pin(struct drm_i915_private *i915, enum port port)
2772 {
2773     enum phy phy = intel_port_to_phy(i915, port);
2774 
2775     drm_WARN_ON(&i915->drm, port == PORT_A);
2776 
2777     /*
2778      * Pin mapping for GEN9 BC depends on which PCH is present.  With TGP,
2779      * final two outputs use type-c pins, even though they're actually
2780      * combo outputs.  With CMP, the traditional DDI A-D pins are used for
2781      * all outputs.
2782      */
2783     if (INTEL_PCH_TYPE(i915) >= PCH_TGP && phy >= PHY_C)
2784         return GMBUS_PIN_9_TC1_ICP + phy - PHY_C;
2785 
2786     return GMBUS_PIN_1_BXT + phy;
2787 }
2788 
2789 static u8 dg1_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2790 {
2791     return intel_port_to_phy(dev_priv, port) + 1;
2792 }
2793 
2794 static u8 adls_port_to_ddc_pin(struct drm_i915_private *dev_priv, enum port port)
2795 {
2796     enum phy phy = intel_port_to_phy(dev_priv, port);
2797 
2798     WARN_ON(port == PORT_B || port == PORT_C);
2799 
2800     /*
2801      * Pin mapping for ADL-S requires TC pins for all combo phy outputs
2802      * except first combo output.
2803      */
2804     if (phy == PHY_A)
2805         return GMBUS_PIN_1_BXT;
2806 
2807     return GMBUS_PIN_9_TC1_ICP + phy - PHY_B;
2808 }
2809 
2810 static u8 g4x_port_to_ddc_pin(struct drm_i915_private *dev_priv,
2811                   enum port port)
2812 {
2813     u8 ddc_pin;
2814 
2815     switch (port) {
2816     case PORT_B:
2817         ddc_pin = GMBUS_PIN_DPB;
2818         break;
2819     case PORT_C:
2820         ddc_pin = GMBUS_PIN_DPC;
2821         break;
2822     case PORT_D:
2823         ddc_pin = GMBUS_PIN_DPD;
2824         break;
2825     default:
2826         MISSING_CASE(port);
2827         ddc_pin = GMBUS_PIN_DPB;
2828         break;
2829     }
2830     return ddc_pin;
2831 }
2832 
2833 static u8 intel_hdmi_ddc_pin(struct intel_encoder *encoder)
2834 {
2835     struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2836     enum port port = encoder->port;
2837     u8 ddc_pin;
2838 
2839     ddc_pin = intel_bios_alternate_ddc_pin(encoder);
2840     if (ddc_pin) {
2841         drm_dbg_kms(&dev_priv->drm,
2842                 "Using DDC pin 0x%x for port %c (VBT)\n",
2843                 ddc_pin, port_name(port));
2844         return ddc_pin;
2845     }
2846 
2847     if (IS_ALDERLAKE_S(dev_priv))
2848         ddc_pin = adls_port_to_ddc_pin(dev_priv, port);
2849     else if (INTEL_PCH_TYPE(dev_priv) >= PCH_DG1)
2850         ddc_pin = dg1_port_to_ddc_pin(dev_priv, port);
2851     else if (IS_ROCKETLAKE(dev_priv))
2852         ddc_pin = rkl_port_to_ddc_pin(dev_priv, port);
2853     else if (DISPLAY_VER(dev_priv) == 9 && HAS_PCH_TGP(dev_priv))
2854         ddc_pin = gen9bc_tgp_port_to_ddc_pin(dev_priv, port);
2855     else if (IS_JSL_EHL(dev_priv) && HAS_PCH_TGP(dev_priv))
2856         ddc_pin = mcc_port_to_ddc_pin(dev_priv, port);
2857     else if (INTEL_PCH_TYPE(dev_priv) >= PCH_ICP)
2858         ddc_pin = icl_port_to_ddc_pin(dev_priv, port);
2859     else if (HAS_PCH_CNP(dev_priv))
2860         ddc_pin = cnp_port_to_ddc_pin(dev_priv, port);
2861     else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
2862         ddc_pin = bxt_port_to_ddc_pin(dev_priv, port);
2863     else if (IS_CHERRYVIEW(dev_priv))
2864         ddc_pin = chv_port_to_ddc_pin(dev_priv, port);
2865     else
2866         ddc_pin = g4x_port_to_ddc_pin(dev_priv, port);
2867 
2868     drm_dbg_kms(&dev_priv->drm,
2869             "Using DDC pin 0x%x for port %c (platform default)\n",
2870             ddc_pin, port_name(port));
2871 
2872     return ddc_pin;
2873 }
2874 
2875 void intel_infoframe_init(struct intel_digital_port *dig_port)
2876 {
2877     struct drm_i915_private *dev_priv =
2878         to_i915(dig_port->base.base.dev);
2879 
2880     if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
2881         dig_port->write_infoframe = vlv_write_infoframe;
2882         dig_port->read_infoframe = vlv_read_infoframe;
2883         dig_port->set_infoframes = vlv_set_infoframes;
2884         dig_port->infoframes_enabled = vlv_infoframes_enabled;
2885     } else if (IS_G4X(dev_priv)) {
2886         dig_port->write_infoframe = g4x_write_infoframe;
2887         dig_port->read_infoframe = g4x_read_infoframe;
2888         dig_port->set_infoframes = g4x_set_infoframes;
2889         dig_port->infoframes_enabled = g4x_infoframes_enabled;
2890     } else if (HAS_DDI(dev_priv)) {
2891         if (intel_bios_is_lspcon_present(dev_priv, dig_port->base.port)) {
2892             dig_port->write_infoframe = lspcon_write_infoframe;
2893             dig_port->read_infoframe = lspcon_read_infoframe;
2894             dig_port->set_infoframes = lspcon_set_infoframes;
2895             dig_port->infoframes_enabled = lspcon_infoframes_enabled;
2896         } else {
2897             dig_port->write_infoframe = hsw_write_infoframe;
2898             dig_port->read_infoframe = hsw_read_infoframe;
2899             dig_port->set_infoframes = hsw_set_infoframes;
2900             dig_port->infoframes_enabled = hsw_infoframes_enabled;
2901         }
2902     } else if (HAS_PCH_IBX(dev_priv)) {
2903         dig_port->write_infoframe = ibx_write_infoframe;
2904         dig_port->read_infoframe = ibx_read_infoframe;
2905         dig_port->set_infoframes = ibx_set_infoframes;
2906         dig_port->infoframes_enabled = ibx_infoframes_enabled;
2907     } else {
2908         dig_port->write_infoframe = cpt_write_infoframe;
2909         dig_port->read_infoframe = cpt_read_infoframe;
2910         dig_port->set_infoframes = cpt_set_infoframes;
2911         dig_port->infoframes_enabled = cpt_infoframes_enabled;
2912     }
2913 }
2914 
2915 void intel_hdmi_init_connector(struct intel_digital_port *dig_port,
2916                    struct intel_connector *intel_connector)
2917 {
2918     struct drm_connector *connector = &intel_connector->base;
2919     struct intel_hdmi *intel_hdmi = &dig_port->hdmi;
2920     struct intel_encoder *intel_encoder = &dig_port->base;
2921     struct drm_device *dev = intel_encoder->base.dev;
2922     struct drm_i915_private *dev_priv = to_i915(dev);
2923     struct i2c_adapter *ddc;
2924     enum port port = intel_encoder->port;
2925     struct cec_connector_info conn_info;
2926 
2927     drm_dbg_kms(&dev_priv->drm,
2928             "Adding HDMI connector on [ENCODER:%d:%s]\n",
2929             intel_encoder->base.base.id, intel_encoder->base.name);
2930 
2931     if (DISPLAY_VER(dev_priv) < 12 && drm_WARN_ON(dev, port == PORT_A))
2932         return;
2933 
2934     if (drm_WARN(dev, dig_port->max_lanes < 4,
2935              "Not enough lanes (%d) for HDMI on [ENCODER:%d:%s]\n",
2936              dig_port->max_lanes, intel_encoder->base.base.id,
2937              intel_encoder->base.name))
2938         return;
2939 
2940     intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(intel_encoder);
2941     ddc = intel_gmbus_get_adapter(dev_priv, intel_hdmi->ddc_bus);
2942 
2943     drm_connector_init_with_ddc(dev, connector,
2944                     &intel_hdmi_connector_funcs,
2945                     DRM_MODE_CONNECTOR_HDMIA,
2946                     ddc);
2947     drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
2948 
2949     connector->interlace_allowed = 1;
2950     connector->doublescan_allowed = 0;
2951     connector->stereo_allowed = 1;
2952 
2953     if (DISPLAY_VER(dev_priv) >= 10)
2954         connector->ycbcr_420_allowed = true;
2955 
2956     intel_connector->polled = DRM_CONNECTOR_POLL_HPD;
2957 
2958     if (HAS_DDI(dev_priv))
2959         intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
2960     else
2961         intel_connector->get_hw_state = intel_connector_get_hw_state;
2962 
2963     intel_hdmi_add_properties(intel_hdmi, connector);
2964 
2965     intel_connector_attach_encoder(intel_connector, intel_encoder);
2966     intel_hdmi->attached_connector = intel_connector;
2967 
2968     if (is_hdcp_supported(dev_priv, port)) {
2969         int ret = intel_hdcp_init(intel_connector, dig_port,
2970                       &intel_hdmi_hdcp_shim);
2971         if (ret)
2972             drm_dbg_kms(&dev_priv->drm,
2973                     "HDCP init failed, skipping.\n");
2974     }
2975 
2976     /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
2977      * 0xd.  Failure to do so will result in spurious interrupts being
2978      * generated on the port when a cable is not attached.
2979      */
2980     if (IS_G45(dev_priv)) {
2981         u32 temp = intel_de_read(dev_priv, PEG_BAND_GAP_DATA);
2982         intel_de_write(dev_priv, PEG_BAND_GAP_DATA,
2983                        (temp & ~0xf) | 0xd);
2984     }
2985 
2986     cec_fill_conn_info_from_drm(&conn_info, connector);
2987 
2988     intel_hdmi->cec_notifier =
2989         cec_notifier_conn_register(dev->dev, port_identifier(port),
2990                        &conn_info);
2991     if (!intel_hdmi->cec_notifier)
2992         drm_dbg_kms(&dev_priv->drm, "CEC notifier get failed\n");
2993 }
2994 
2995 /*
2996  * intel_hdmi_dsc_get_slice_height - get the dsc slice_height
2997  * @vactive: Vactive of a display mode
2998  *
2999  * @return: appropriate dsc slice height for a given mode.
3000  */
3001 int intel_hdmi_dsc_get_slice_height(int vactive)
3002 {
3003     int slice_height;
3004 
3005     /*
3006      * Slice Height determination : HDMI2.1 Section 7.7.5.2
3007      * Select smallest slice height >=96, that results in a valid PPS and
3008      * requires minimum padding lines required for final slice.
3009      *
3010      * Assumption : Vactive is even.
3011      */
3012     for (slice_height = 96; slice_height <= vactive; slice_height += 2)
3013         if (vactive % slice_height == 0)
3014             return slice_height;
3015 
3016     return 0;
3017 }
3018 
3019 /*
3020  * intel_hdmi_dsc_get_num_slices - get no. of dsc slices based on dsc encoder
3021  * and dsc decoder capabilities
3022  *
3023  * @crtc_state: intel crtc_state
3024  * @src_max_slices: maximum slices supported by the DSC encoder
3025  * @src_max_slice_width: maximum slice width supported by DSC encoder
3026  * @hdmi_max_slices: maximum slices supported by sink DSC decoder
3027  * @hdmi_throughput: maximum clock per slice (MHz) supported by HDMI sink
3028  *
3029  * @return: num of dsc slices that can be supported by the dsc encoder
3030  * and decoder.
3031  */
3032 int
3033 intel_hdmi_dsc_get_num_slices(const struct intel_crtc_state *crtc_state,
3034                   int src_max_slices, int src_max_slice_width,
3035                   int hdmi_max_slices, int hdmi_throughput)
3036 {
3037 /* Pixel rates in KPixels/sec */
3038 #define HDMI_DSC_PEAK_PIXEL_RATE        2720000
3039 /*
3040  * Rates at which the source and sink are required to process pixels in each
3041  * slice, can be two levels: either atleast 340000KHz or atleast 40000KHz.
3042  */
3043 #define HDMI_DSC_MAX_ENC_THROUGHPUT_0       340000
3044 #define HDMI_DSC_MAX_ENC_THROUGHPUT_1       400000
3045 
3046 /* Spec limits the slice width to 2720 pixels */
3047 #define MAX_HDMI_SLICE_WIDTH            2720
3048     int kslice_adjust;
3049     int adjusted_clk_khz;
3050     int min_slices;
3051     int target_slices;
3052     int max_throughput; /* max clock freq. in khz per slice */
3053     int max_slice_width;
3054     int slice_width;
3055     int pixel_clock = crtc_state->hw.adjusted_mode.crtc_clock;
3056 
3057     if (!hdmi_throughput)
3058         return 0;
3059 
3060     /*
3061      * Slice Width determination : HDMI2.1 Section 7.7.5.1
3062      * kslice_adjust factor for 4:2:0, and 4:2:2 formats is 0.5, where as
3063      * for 4:4:4 is 1.0. Multiplying these factors by 10 and later
3064      * dividing adjusted clock value by 10.
3065      */
3066     if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
3067         crtc_state->output_format == INTEL_OUTPUT_FORMAT_RGB)
3068         kslice_adjust = 10;
3069     else
3070         kslice_adjust = 5;
3071 
3072     /*
3073      * As per spec, the rate at which the source and the sink process
3074      * the pixels per slice are at two levels: atleast 340Mhz or 400Mhz.
3075      * This depends upon the pixel clock rate and output formats
3076      * (kslice adjust).
3077      * If pixel clock * kslice adjust >= 2720MHz slices can be processed
3078      * at max 340MHz, otherwise they can be processed at max 400MHz.
3079      */
3080 
3081     adjusted_clk_khz = DIV_ROUND_UP(kslice_adjust * pixel_clock, 10);
3082 
3083     if (adjusted_clk_khz <= HDMI_DSC_PEAK_PIXEL_RATE)
3084         max_throughput = HDMI_DSC_MAX_ENC_THROUGHPUT_0;
3085     else
3086         max_throughput = HDMI_DSC_MAX_ENC_THROUGHPUT_1;
3087 
3088     /*
3089      * Taking into account the sink's capability for maximum
3090      * clock per slice (in MHz) as read from HF-VSDB.
3091      */
3092     max_throughput = min(max_throughput, hdmi_throughput * 1000);
3093 
3094     min_slices = DIV_ROUND_UP(adjusted_clk_khz, max_throughput);
3095     max_slice_width = min(MAX_HDMI_SLICE_WIDTH, src_max_slice_width);
3096 
3097     /*
3098      * Keep on increasing the num of slices/line, starting from min_slices
3099      * per line till we get such a number, for which the slice_width is
3100      * just less than max_slice_width. The slices/line selected should be
3101      * less than or equal to the max horizontal slices that the combination
3102      * of PCON encoder and HDMI decoder can support.
3103      */
3104     slice_width = max_slice_width;
3105 
3106     do {
3107         if (min_slices <= 1 && src_max_slices >= 1 && hdmi_max_slices >= 1)
3108             target_slices = 1;
3109         else if (min_slices <= 2 && src_max_slices >= 2 && hdmi_max_slices >= 2)
3110             target_slices = 2;
3111         else if (min_slices <= 4 && src_max_slices >= 4 && hdmi_max_slices >= 4)
3112             target_slices = 4;
3113         else if (min_slices <= 8 && src_max_slices >= 8 && hdmi_max_slices >= 8)
3114             target_slices = 8;
3115         else if (min_slices <= 12 && src_max_slices >= 12 && hdmi_max_slices >= 12)
3116             target_slices = 12;
3117         else if (min_slices <= 16 && src_max_slices >= 16 && hdmi_max_slices >= 16)
3118             target_slices = 16;
3119         else
3120             return 0;
3121 
3122         slice_width = DIV_ROUND_UP(crtc_state->hw.adjusted_mode.hdisplay, target_slices);
3123         if (slice_width >= max_slice_width)
3124             min_slices = target_slices + 1;
3125     } while (slice_width >= max_slice_width);
3126 
3127     return target_slices;
3128 }
3129 
3130 /*
3131  * intel_hdmi_dsc_get_bpp - get the appropriate compressed bits_per_pixel based on
3132  * source and sink capabilities.
3133  *
3134  * @src_fraction_bpp: fractional bpp supported by the source
3135  * @slice_width: dsc slice width supported by the source and sink
3136  * @num_slices: num of slices supported by the source and sink
3137  * @output_format: video output format
3138  * @hdmi_all_bpp: sink supports decoding of 1/16th bpp setting
3139  * @hdmi_max_chunk_bytes: max bytes in a line of chunks supported by sink
3140  *
3141  * @return: compressed bits_per_pixel in step of 1/16 of bits_per_pixel
3142  */
3143 int
3144 intel_hdmi_dsc_get_bpp(int src_fractional_bpp, int slice_width, int num_slices,
3145                int output_format, bool hdmi_all_bpp,
3146                int hdmi_max_chunk_bytes)
3147 {
3148     int max_dsc_bpp, min_dsc_bpp;
3149     int target_bytes;
3150     bool bpp_found = false;
3151     int bpp_decrement_x16;
3152     int bpp_target;
3153     int bpp_target_x16;
3154 
3155     /*
3156      * Get min bpp and max bpp as per Table 7.23, in HDMI2.1 spec
3157      * Start with the max bpp and keep on decrementing with
3158      * fractional bpp, if supported by PCON DSC encoder
3159      *
3160      * for each bpp we check if no of bytes can be supported by HDMI sink
3161      */
3162 
3163     /* Assuming: bpc as 8*/
3164     if (output_format == INTEL_OUTPUT_FORMAT_YCBCR420) {
3165         min_dsc_bpp = 6;
3166         max_dsc_bpp = 3 * 4; /* 3*bpc/2 */
3167     } else if (output_format == INTEL_OUTPUT_FORMAT_YCBCR444 ||
3168            output_format == INTEL_OUTPUT_FORMAT_RGB) {
3169         min_dsc_bpp = 8;
3170         max_dsc_bpp = 3 * 8; /* 3*bpc */
3171     } else {
3172         /* Assuming 4:2:2 encoding */
3173         min_dsc_bpp = 7;
3174         max_dsc_bpp = 2 * 8; /* 2*bpc */
3175     }
3176 
3177     /*
3178      * Taking into account if all dsc_all_bpp supported by HDMI2.1 sink
3179      * Section 7.7.34 : Source shall not enable compressed Video
3180      * Transport with bpp_target settings above 12 bpp unless
3181      * DSC_all_bpp is set to 1.
3182      */
3183     if (!hdmi_all_bpp)
3184         max_dsc_bpp = min(max_dsc_bpp, 12);
3185 
3186     /*
3187      * The Sink has a limit of compressed data in bytes for a scanline,
3188      * as described in max_chunk_bytes field in HFVSDB block of edid.
3189      * The no. of bytes depend on the target bits per pixel that the
3190      * source configures. So we start with the max_bpp and calculate
3191      * the target_chunk_bytes. We keep on decrementing the target_bpp,
3192      * till we get the target_chunk_bytes just less than what the sink's
3193      * max_chunk_bytes, or else till we reach the min_dsc_bpp.
3194      *
3195      * The decrement is according to the fractional support from PCON DSC
3196      * encoder. For fractional BPP we use bpp_target as a multiple of 16.
3197      *
3198      * bpp_target_x16 = bpp_target * 16
3199      * So we need to decrement by {1, 2, 4, 8, 16} for fractional bpps
3200      * {1/16, 1/8, 1/4, 1/2, 1} respectively.
3201      */
3202 
3203     bpp_target = max_dsc_bpp;
3204 
3205     /* src does not support fractional bpp implies decrement by 16 for bppx16 */
3206     if (!src_fractional_bpp)
3207         src_fractional_bpp = 1;
3208     bpp_decrement_x16 = DIV_ROUND_UP(16, src_fractional_bpp);
3209     bpp_target_x16 = (bpp_target * 16) - bpp_decrement_x16;
3210 
3211     while (bpp_target_x16 > (min_dsc_bpp * 16)) {
3212         int bpp;
3213 
3214         bpp = DIV_ROUND_UP(bpp_target_x16, 16);
3215         target_bytes = DIV_ROUND_UP((num_slices * slice_width * bpp), 8);
3216         if (target_bytes <= hdmi_max_chunk_bytes) {
3217             bpp_found = true;
3218             break;
3219         }
3220         bpp_target_x16 -= bpp_decrement_x16;
3221     }
3222     if (bpp_found)
3223         return bpp_target_x16;
3224 
3225     return 0;
3226 }