linux/drivers/gpu/drm/i915/intel_ddi.c
<<
>>
Prefs
   1/*
   2 * Copyright © 2012 Intel Corporation
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice (including the next
  12 * paragraph) shall be included in all copies or substantial portions of the
  13 * Software.
  14 *
  15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21 * IN THE SOFTWARE.
  22 *
  23 * Authors:
  24 *    Eugeni Dodonov <eugeni.dodonov@intel.com>
  25 *
  26 */
  27
  28#include "i915_drv.h"
  29#include "intel_drv.h"
  30
  31struct ddi_buf_trans {
  32        u32 trans1;     /* balance leg enable, de-emph level */
  33        u32 trans2;     /* vref sel, vswing */
  34        u8 i_boost;     /* SKL: I_boost; valid: 0x0, 0x1, 0x3, 0x7 */
  35};
  36
  37/* HDMI/DVI modes ignore everything but the last 2 items. So we share
  38 * them for both DP and FDI transports, allowing those ports to
  39 * automatically adapt to HDMI connections as well
  40 */
  41static const struct ddi_buf_trans hsw_ddi_translations_dp[] = {
  42        { 0x00FFFFFF, 0x0006000E, 0x0 },
  43        { 0x00D75FFF, 0x0005000A, 0x0 },
  44        { 0x00C30FFF, 0x00040006, 0x0 },
  45        { 0x80AAAFFF, 0x000B0000, 0x0 },
  46        { 0x00FFFFFF, 0x0005000A, 0x0 },
  47        { 0x00D75FFF, 0x000C0004, 0x0 },
  48        { 0x80C30FFF, 0x000B0000, 0x0 },
  49        { 0x00FFFFFF, 0x00040006, 0x0 },
  50        { 0x80D75FFF, 0x000B0000, 0x0 },
  51};
  52
  53static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = {
  54        { 0x00FFFFFF, 0x0007000E, 0x0 },
  55        { 0x00D75FFF, 0x000F000A, 0x0 },
  56        { 0x00C30FFF, 0x00060006, 0x0 },
  57        { 0x00AAAFFF, 0x001E0000, 0x0 },
  58        { 0x00FFFFFF, 0x000F000A, 0x0 },
  59        { 0x00D75FFF, 0x00160004, 0x0 },
  60        { 0x00C30FFF, 0x001E0000, 0x0 },
  61        { 0x00FFFFFF, 0x00060006, 0x0 },
  62        { 0x00D75FFF, 0x001E0000, 0x0 },
  63};
  64
  65static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = {
  66                                        /* Idx  NT mV d T mV d  db      */
  67        { 0x00FFFFFF, 0x0006000E, 0x0 },/* 0:   400     400     0       */
  68        { 0x00E79FFF, 0x000E000C, 0x0 },/* 1:   400     500     2       */
  69        { 0x00D75FFF, 0x0005000A, 0x0 },/* 2:   400     600     3.5     */
  70        { 0x00FFFFFF, 0x0005000A, 0x0 },/* 3:   600     600     0       */
  71        { 0x00E79FFF, 0x001D0007, 0x0 },/* 4:   600     750     2       */
  72        { 0x00D75FFF, 0x000C0004, 0x0 },/* 5:   600     900     3.5     */
  73        { 0x00FFFFFF, 0x00040006, 0x0 },/* 6:   800     800     0       */
  74        { 0x80E79FFF, 0x00030002, 0x0 },/* 7:   800     1000    2       */
  75        { 0x00FFFFFF, 0x00140005, 0x0 },/* 8:   850     850     0       */
  76        { 0x00FFFFFF, 0x000C0004, 0x0 },/* 9:   900     900     0       */
  77        { 0x00FFFFFF, 0x001C0003, 0x0 },/* 10:  950     950     0       */
  78        { 0x80FFFFFF, 0x00030002, 0x0 },/* 11:  1000    1000    0       */
  79};
  80
  81static const struct ddi_buf_trans bdw_ddi_translations_edp[] = {
  82        { 0x00FFFFFF, 0x00000012, 0x0 },
  83        { 0x00EBAFFF, 0x00020011, 0x0 },
  84        { 0x00C71FFF, 0x0006000F, 0x0 },
  85        { 0x00AAAFFF, 0x000E000A, 0x0 },
  86        { 0x00FFFFFF, 0x00020011, 0x0 },
  87        { 0x00DB6FFF, 0x0005000F, 0x0 },
  88        { 0x00BEEFFF, 0x000A000C, 0x0 },
  89        { 0x00FFFFFF, 0x0005000F, 0x0 },
  90        { 0x00DB6FFF, 0x000A000C, 0x0 },
  91};
  92
  93static const struct ddi_buf_trans bdw_ddi_translations_dp[] = {
  94        { 0x00FFFFFF, 0x0007000E, 0x0 },
  95        { 0x00D75FFF, 0x000E000A, 0x0 },
  96        { 0x00BEFFFF, 0x00140006, 0x0 },
  97        { 0x80B2CFFF, 0x001B0002, 0x0 },
  98        { 0x00FFFFFF, 0x000E000A, 0x0 },
  99        { 0x00DB6FFF, 0x00160005, 0x0 },
 100        { 0x80C71FFF, 0x001A0002, 0x0 },
 101        { 0x00F7DFFF, 0x00180004, 0x0 },
 102        { 0x80D75FFF, 0x001B0002, 0x0 },
 103};
 104
 105static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = {
 106        { 0x00FFFFFF, 0x0001000E, 0x0 },
 107        { 0x00D75FFF, 0x0004000A, 0x0 },
 108        { 0x00C30FFF, 0x00070006, 0x0 },
 109        { 0x00AAAFFF, 0x000C0000, 0x0 },
 110        { 0x00FFFFFF, 0x0004000A, 0x0 },
 111        { 0x00D75FFF, 0x00090004, 0x0 },
 112        { 0x00C30FFF, 0x000C0000, 0x0 },
 113        { 0x00FFFFFF, 0x00070006, 0x0 },
 114        { 0x00D75FFF, 0x000C0000, 0x0 },
 115};
 116
 117static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = {
 118                                        /* Idx  NT mV d T mV df db      */
 119        { 0x00FFFFFF, 0x0007000E, 0x0 },/* 0:   400     400     0       */
 120        { 0x00D75FFF, 0x000E000A, 0x0 },/* 1:   400     600     3.5     */
 121        { 0x00BEFFFF, 0x00140006, 0x0 },/* 2:   400     800     6       */
 122        { 0x00FFFFFF, 0x0009000D, 0x0 },/* 3:   450     450     0       */
 123        { 0x00FFFFFF, 0x000E000A, 0x0 },/* 4:   600     600     0       */
 124        { 0x00D7FFFF, 0x00140006, 0x0 },/* 5:   600     800     2.5     */
 125        { 0x80CB2FFF, 0x001B0002, 0x0 },/* 6:   600     1000    4.5     */
 126        { 0x00FFFFFF, 0x00140006, 0x0 },/* 7:   800     800     0       */
 127        { 0x80E79FFF, 0x001B0002, 0x0 },/* 8:   800     1000    2       */
 128        { 0x80FFFFFF, 0x001B0002, 0x0 },/* 9:   1000    1000    0       */
 129};
 130
 131/* Skylake H and S */
 132static const struct ddi_buf_trans skl_ddi_translations_dp[] = {
 133        { 0x00002016, 0x000000A0, 0x0 },
 134        { 0x00005012, 0x0000009B, 0x0 },
 135        { 0x00007011, 0x00000088, 0x0 },
 136        { 0x00009010, 0x000000C7, 0x0 },
 137        { 0x00002016, 0x0000009B, 0x0 },
 138        { 0x00005012, 0x00000088, 0x0 },
 139        { 0x00007011, 0x000000C7, 0x0 },
 140        { 0x00002016, 0x000000DF, 0x0 },
 141        { 0x00005012, 0x000000C7, 0x0 },
 142};
 143
 144/* Skylake U */
 145static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = {
 146        { 0x0000201B, 0x000000A2, 0x0 },
 147        { 0x00005012, 0x00000088, 0x0 },
 148        { 0x00007011, 0x00000087, 0x0 },
 149        { 0x80009010, 0x000000C7, 0x1 },        /* Uses I_boost level 0x1 */
 150        { 0x0000201B, 0x0000009D, 0x0 },
 151        { 0x00005012, 0x000000C7, 0x0 },
 152        { 0x00007011, 0x000000C7, 0x0 },
 153        { 0x00002016, 0x00000088, 0x0 },
 154        { 0x00005012, 0x000000C7, 0x0 },
 155};
 156
 157/* Skylake Y */
 158static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = {
 159        { 0x00000018, 0x000000A2, 0x0 },
 160        { 0x00005012, 0x00000088, 0x0 },
 161        { 0x00007011, 0x00000087, 0x0 },
 162        { 0x80009010, 0x000000C7, 0x3 },        /* Uses I_boost level 0x3 */
 163        { 0x00000018, 0x0000009D, 0x0 },
 164        { 0x00005012, 0x000000C7, 0x0 },
 165        { 0x00007011, 0x000000C7, 0x0 },
 166        { 0x00000018, 0x00000088, 0x0 },
 167        { 0x00005012, 0x000000C7, 0x0 },
 168};
 169
 170/*
 171 * Skylake H and S
 172 * eDP 1.4 low vswing translation parameters
 173 */
 174static const struct ddi_buf_trans skl_ddi_translations_edp[] = {
 175        { 0x00000018, 0x000000A8, 0x0 },
 176        { 0x00004013, 0x000000A9, 0x0 },
 177        { 0x00007011, 0x000000A2, 0x0 },
 178        { 0x00009010, 0x0000009C, 0x0 },
 179        { 0x00000018, 0x000000A9, 0x0 },
 180        { 0x00006013, 0x000000A2, 0x0 },
 181        { 0x00007011, 0x000000A6, 0x0 },
 182        { 0x00000018, 0x000000AB, 0x0 },
 183        { 0x00007013, 0x0000009F, 0x0 },
 184        { 0x00000018, 0x000000DF, 0x0 },
 185};
 186
 187/*
 188 * Skylake U
 189 * eDP 1.4 low vswing translation parameters
 190 */
 191static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = {
 192        { 0x00000018, 0x000000A8, 0x0 },
 193        { 0x00004013, 0x000000A9, 0x0 },
 194        { 0x00007011, 0x000000A2, 0x0 },
 195        { 0x00009010, 0x0000009C, 0x0 },
 196        { 0x00000018, 0x000000A9, 0x0 },
 197        { 0x00006013, 0x000000A2, 0x0 },
 198        { 0x00007011, 0x000000A6, 0x0 },
 199        { 0x00002016, 0x000000AB, 0x0 },
 200        { 0x00005013, 0x0000009F, 0x0 },
 201        { 0x00000018, 0x000000DF, 0x0 },
 202};
 203
 204/*
 205 * Skylake Y
 206 * eDP 1.4 low vswing translation parameters
 207 */
 208static const struct ddi_buf_trans skl_y_ddi_translations_edp[] = {
 209        { 0x00000018, 0x000000A8, 0x0 },
 210        { 0x00004013, 0x000000AB, 0x0 },
 211        { 0x00007011, 0x000000A4, 0x0 },
 212        { 0x00009010, 0x000000DF, 0x0 },
 213        { 0x00000018, 0x000000AA, 0x0 },
 214        { 0x00006013, 0x000000A4, 0x0 },
 215        { 0x00007011, 0x0000009D, 0x0 },
 216        { 0x00000018, 0x000000A0, 0x0 },
 217        { 0x00006012, 0x000000DF, 0x0 },
 218        { 0x00000018, 0x0000008A, 0x0 },
 219};
 220
 221/* Skylake U, H and S */
 222static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = {
 223        { 0x00000018, 0x000000AC, 0x0 },
 224        { 0x00005012, 0x0000009D, 0x0 },
 225        { 0x00007011, 0x00000088, 0x0 },
 226        { 0x00000018, 0x000000A1, 0x0 },
 227        { 0x00000018, 0x00000098, 0x0 },
 228        { 0x00004013, 0x00000088, 0x0 },
 229        { 0x00006012, 0x00000087, 0x0 },
 230        { 0x00000018, 0x000000DF, 0x0 },
 231        { 0x00003015, 0x00000087, 0x0 },        /* Default */
 232        { 0x00003015, 0x000000C7, 0x0 },
 233        { 0x00000018, 0x000000C7, 0x0 },
 234};
 235
 236/* Skylake Y */
 237static const struct ddi_buf_trans skl_y_ddi_translations_hdmi[] = {
 238        { 0x00000018, 0x000000A1, 0x0 },
 239        { 0x00005012, 0x000000DF, 0x0 },
 240        { 0x00007011, 0x00000084, 0x0 },
 241        { 0x00000018, 0x000000A4, 0x0 },
 242        { 0x00000018, 0x0000009D, 0x0 },
 243        { 0x00004013, 0x00000080, 0x0 },
 244        { 0x00006013, 0x000000C7, 0x0 },
 245        { 0x00000018, 0x0000008A, 0x0 },
 246        { 0x00003015, 0x000000C7, 0x0 },        /* Default */
 247        { 0x80003015, 0x000000C7, 0x7 },        /* Uses I_boost level 0x7 */
 248        { 0x00000018, 0x000000C7, 0x0 },
 249};
 250
 251struct bxt_ddi_buf_trans {
 252        u32 margin;     /* swing value */
 253        u32 scale;      /* scale value */
 254        u32 enable;     /* scale enable */
 255        u32 deemphasis;
 256        bool default_index; /* true if the entry represents default value */
 257};
 258
 259static const struct bxt_ddi_buf_trans bxt_ddi_translations_dp[] = {
 260                                        /* Idx  NT mV diff      db  */
 261        { 52,  0x9A, 0, 128, true  },   /* 0:   400             0   */
 262        { 78,  0x9A, 0, 85,  false },   /* 1:   400             3.5 */
 263        { 104, 0x9A, 0, 64,  false },   /* 2:   400             6   */
 264        { 154, 0x9A, 0, 43,  false },   /* 3:   400             9.5 */
 265        { 77,  0x9A, 0, 128, false },   /* 4:   600             0   */
 266        { 116, 0x9A, 0, 85,  false },   /* 5:   600             3.5 */
 267        { 154, 0x9A, 0, 64,  false },   /* 6:   600             6   */
 268        { 102, 0x9A, 0, 128, false },   /* 7:   800             0   */
 269        { 154, 0x9A, 0, 85,  false },   /* 8:   800             3.5 */
 270        { 154, 0x9A, 1, 128, false },   /* 9:   1200            0   */
 271};
 272
 273static const struct bxt_ddi_buf_trans bxt_ddi_translations_edp[] = {
 274                                        /* Idx  NT mV diff      db  */
 275        { 26, 0, 0, 128, false },       /* 0:   200             0   */
 276        { 38, 0, 0, 112, false },       /* 1:   200             1.5 */
 277        { 48, 0, 0, 96,  false },       /* 2:   200             4   */
 278        { 54, 0, 0, 69,  false },       /* 3:   200             6   */
 279        { 32, 0, 0, 128, false },       /* 4:   250             0   */
 280        { 48, 0, 0, 104, false },       /* 5:   250             1.5 */
 281        { 54, 0, 0, 85,  false },       /* 6:   250             4   */
 282        { 43, 0, 0, 128, false },       /* 7:   300             0   */
 283        { 54, 0, 0, 101, false },       /* 8:   300             1.5 */
 284        { 48, 0, 0, 128, false },       /* 9:   300             0   */
 285};
 286
 287/* BSpec has 2 recommended values - entries 0 and 8.
 288 * Using the entry with higher vswing.
 289 */
 290static const struct bxt_ddi_buf_trans bxt_ddi_translations_hdmi[] = {
 291                                        /* Idx  NT mV diff      db  */
 292        { 52,  0x9A, 0, 128, false },   /* 0:   400             0   */
 293        { 52,  0x9A, 0, 85,  false },   /* 1:   400             3.5 */
 294        { 52,  0x9A, 0, 64,  false },   /* 2:   400             6   */
 295        { 42,  0x9A, 0, 43,  false },   /* 3:   400             9.5 */
 296        { 77,  0x9A, 0, 128, false },   /* 4:   600             0   */
 297        { 77,  0x9A, 0, 85,  false },   /* 5:   600             3.5 */
 298        { 77,  0x9A, 0, 64,  false },   /* 6:   600             6   */
 299        { 102, 0x9A, 0, 128, false },   /* 7:   800             0   */
 300        { 102, 0x9A, 0, 85,  false },   /* 8:   800             3.5 */
 301        { 154, 0x9A, 1, 128, true },    /* 9:   1200            0   */
 302};
 303
 304static void bxt_ddi_vswing_sequence(struct drm_device *dev, u32 level,
 305                                    enum port port, int type);
 306
 307static void ddi_get_encoder_port(struct intel_encoder *intel_encoder,
 308                                 struct intel_digital_port **dig_port,
 309                                 enum port *port)
 310{
 311        struct drm_encoder *encoder = &intel_encoder->base;
 312
 313        switch (intel_encoder->type) {
 314        case INTEL_OUTPUT_DP_MST:
 315                *dig_port = enc_to_mst(encoder)->primary;
 316                *port = (*dig_port)->port;
 317                break;
 318        case INTEL_OUTPUT_DISPLAYPORT:
 319        case INTEL_OUTPUT_EDP:
 320        case INTEL_OUTPUT_HDMI:
 321        case INTEL_OUTPUT_UNKNOWN:
 322                *dig_port = enc_to_dig_port(encoder);
 323                *port = (*dig_port)->port;
 324                break;
 325        case INTEL_OUTPUT_ANALOG:
 326                *dig_port = NULL;
 327                *port = PORT_E;
 328                break;
 329        default:
 330                WARN(1, "Invalid DDI encoder type %d\n", intel_encoder->type);
 331                break;
 332        }
 333}
 334
 335enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder)
 336{
 337        struct intel_digital_port *dig_port;
 338        enum port port;
 339
 340        ddi_get_encoder_port(intel_encoder, &dig_port, &port);
 341
 342        return port;
 343}
 344
 345static bool
 346intel_dig_port_supports_hdmi(const struct intel_digital_port *intel_dig_port)
 347{
 348        return intel_dig_port->hdmi.hdmi_reg;
 349}
 350
 351static const struct ddi_buf_trans *skl_get_buf_trans_dp(struct drm_device *dev,
 352                                                        int *n_entries)
 353{
 354        const struct ddi_buf_trans *ddi_translations;
 355
 356        if (IS_SKL_ULX(dev)) {
 357                ddi_translations = skl_y_ddi_translations_dp;
 358                *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp);
 359        } else if (IS_SKL_ULT(dev)) {
 360                ddi_translations = skl_u_ddi_translations_dp;
 361                *n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp);
 362        } else {
 363                ddi_translations = skl_ddi_translations_dp;
 364                *n_entries = ARRAY_SIZE(skl_ddi_translations_dp);
 365        }
 366
 367        return ddi_translations;
 368}
 369
 370static const struct ddi_buf_trans *skl_get_buf_trans_edp(struct drm_device *dev,
 371                                                         int *n_entries)
 372{
 373        struct drm_i915_private *dev_priv = dev->dev_private;
 374        const struct ddi_buf_trans *ddi_translations;
 375
 376        if (IS_SKL_ULX(dev)) {
 377                if (dev_priv->edp_low_vswing) {
 378                        ddi_translations = skl_y_ddi_translations_edp;
 379                        *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp);
 380                } else {
 381                        ddi_translations = skl_y_ddi_translations_dp;
 382                        *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp);
 383                }
 384        } else if (IS_SKL_ULT(dev)) {
 385                if (dev_priv->edp_low_vswing) {
 386                        ddi_translations = skl_u_ddi_translations_edp;
 387                        *n_entries = ARRAY_SIZE(skl_u_ddi_translations_edp);
 388                } else {
 389                        ddi_translations = skl_u_ddi_translations_dp;
 390                        *n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp);
 391                }
 392        } else {
 393                if (dev_priv->edp_low_vswing) {
 394                        ddi_translations = skl_ddi_translations_edp;
 395                        *n_entries = ARRAY_SIZE(skl_ddi_translations_edp);
 396                } else {
 397                        ddi_translations = skl_ddi_translations_dp;
 398                        *n_entries = ARRAY_SIZE(skl_ddi_translations_dp);
 399                }
 400        }
 401
 402        return ddi_translations;
 403}
 404
 405static const struct ddi_buf_trans *
 406skl_get_buf_trans_hdmi(struct drm_device *dev,
 407                       int *n_entries)
 408{
 409        const struct ddi_buf_trans *ddi_translations;
 410
 411        if (IS_SKL_ULX(dev)) {
 412                ddi_translations = skl_y_ddi_translations_hdmi;
 413                *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi);
 414        } else {
 415                ddi_translations = skl_ddi_translations_hdmi;
 416                *n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi);
 417        }
 418
 419        return ddi_translations;
 420}
 421
 422/*
 423 * Starting with Haswell, DDI port buffers must be programmed with correct
 424 * values in advance. The buffer values are different for FDI and DP modes,
 425 * but the HDMI/DVI fields are shared among those. So we program the DDI
 426 * in either FDI or DP modes only, as HDMI connections will work with both
 427 * of those
 428 */
 429static void intel_prepare_ddi_buffers(struct drm_device *dev, enum port port,
 430                                      bool supports_hdmi)
 431{
 432        struct drm_i915_private *dev_priv = dev->dev_private;
 433        u32 iboost_bit = 0;
 434        int i, n_hdmi_entries, n_dp_entries, n_edp_entries, hdmi_default_entry,
 435            size;
 436        int hdmi_level = dev_priv->vbt.ddi_port_info[port].hdmi_level_shift;
 437        const struct ddi_buf_trans *ddi_translations_fdi;
 438        const struct ddi_buf_trans *ddi_translations_dp;
 439        const struct ddi_buf_trans *ddi_translations_edp;
 440        const struct ddi_buf_trans *ddi_translations_hdmi;
 441        const struct ddi_buf_trans *ddi_translations;
 442
 443        if (IS_BROXTON(dev)) {
 444                if (!supports_hdmi)
 445                        return;
 446
 447                /* Vswing programming for HDMI */
 448                bxt_ddi_vswing_sequence(dev, hdmi_level, port,
 449                                        INTEL_OUTPUT_HDMI);
 450                return;
 451        } else if (IS_SKYLAKE(dev)) {
 452                ddi_translations_fdi = NULL;
 453                ddi_translations_dp =
 454                                skl_get_buf_trans_dp(dev, &n_dp_entries);
 455                ddi_translations_edp =
 456                                skl_get_buf_trans_edp(dev, &n_edp_entries);
 457                ddi_translations_hdmi =
 458                                skl_get_buf_trans_hdmi(dev, &n_hdmi_entries);
 459                hdmi_default_entry = 8;
 460                /* If we're boosting the current, set bit 31 of trans1 */
 461                if (dev_priv->vbt.ddi_port_info[port].hdmi_boost_level ||
 462                    dev_priv->vbt.ddi_port_info[port].dp_boost_level)
 463                        iboost_bit = 1<<31;
 464        } else if (IS_BROADWELL(dev)) {
 465                ddi_translations_fdi = bdw_ddi_translations_fdi;
 466                ddi_translations_dp = bdw_ddi_translations_dp;
 467                ddi_translations_edp = bdw_ddi_translations_edp;
 468                ddi_translations_hdmi = bdw_ddi_translations_hdmi;
 469                n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
 470                n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
 471                n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
 472                hdmi_default_entry = 7;
 473        } else if (IS_HASWELL(dev)) {
 474                ddi_translations_fdi = hsw_ddi_translations_fdi;
 475                ddi_translations_dp = hsw_ddi_translations_dp;
 476                ddi_translations_edp = hsw_ddi_translations_dp;
 477                ddi_translations_hdmi = hsw_ddi_translations_hdmi;
 478                n_dp_entries = n_edp_entries = ARRAY_SIZE(hsw_ddi_translations_dp);
 479                n_hdmi_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi);
 480                hdmi_default_entry = 6;
 481        } else {
 482                WARN(1, "ddi translation table missing\n");
 483                ddi_translations_edp = bdw_ddi_translations_dp;
 484                ddi_translations_fdi = bdw_ddi_translations_fdi;
 485                ddi_translations_dp = bdw_ddi_translations_dp;
 486                ddi_translations_hdmi = bdw_ddi_translations_hdmi;
 487                n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
 488                n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
 489                n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
 490                hdmi_default_entry = 7;
 491        }
 492
 493        switch (port) {
 494        case PORT_A:
 495                ddi_translations = ddi_translations_edp;
 496                size = n_edp_entries;
 497                break;
 498        case PORT_B:
 499        case PORT_C:
 500                ddi_translations = ddi_translations_dp;
 501                size = n_dp_entries;
 502                break;
 503        case PORT_D:
 504                if (intel_dp_is_edp(dev, PORT_D)) {
 505                        ddi_translations = ddi_translations_edp;
 506                        size = n_edp_entries;
 507                } else {
 508                        ddi_translations = ddi_translations_dp;
 509                        size = n_dp_entries;
 510                }
 511                break;
 512        case PORT_E:
 513                if (ddi_translations_fdi)
 514                        ddi_translations = ddi_translations_fdi;
 515                else
 516                        ddi_translations = ddi_translations_dp;
 517                size = n_dp_entries;
 518                break;
 519        default:
 520                BUG();
 521        }
 522
 523        for (i = 0; i < size; i++) {
 524                I915_WRITE(DDI_BUF_TRANS_LO(port, i),
 525                           ddi_translations[i].trans1 | iboost_bit);
 526                I915_WRITE(DDI_BUF_TRANS_HI(port, i),
 527                           ddi_translations[i].trans2);
 528        }
 529
 530        if (!supports_hdmi)
 531                return;
 532
 533        /* Choose a good default if VBT is badly populated */
 534        if (hdmi_level == HDMI_LEVEL_SHIFT_UNKNOWN ||
 535            hdmi_level >= n_hdmi_entries)
 536                hdmi_level = hdmi_default_entry;
 537
 538        /* Entry 9 is for HDMI: */
 539        I915_WRITE(DDI_BUF_TRANS_LO(port, i),
 540                   ddi_translations_hdmi[hdmi_level].trans1 | iboost_bit);
 541        I915_WRITE(DDI_BUF_TRANS_HI(port, i),
 542                   ddi_translations_hdmi[hdmi_level].trans2);
 543}
 544
 545/* Program DDI buffers translations for DP. By default, program ports A-D in DP
 546 * mode and port E for FDI.
 547 */
 548void intel_prepare_ddi(struct drm_device *dev)
 549{
 550        struct intel_encoder *intel_encoder;
 551        bool visited[I915_MAX_PORTS] = { 0, };
 552
 553        if (!HAS_DDI(dev))
 554                return;
 555
 556        for_each_intel_encoder(dev, intel_encoder) {
 557                struct intel_digital_port *intel_dig_port;
 558                enum port port;
 559                bool supports_hdmi;
 560
 561                if (intel_encoder->type == INTEL_OUTPUT_DSI)
 562                        continue;
 563
 564                ddi_get_encoder_port(intel_encoder, &intel_dig_port, &port);
 565                if (visited[port])
 566                        continue;
 567
 568                supports_hdmi = intel_dig_port &&
 569                                intel_dig_port_supports_hdmi(intel_dig_port);
 570
 571                intel_prepare_ddi_buffers(dev, port, supports_hdmi);
 572                visited[port] = true;
 573        }
 574}
 575
 576static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv,
 577                                    enum port port)
 578{
 579        uint32_t reg = DDI_BUF_CTL(port);
 580        int i;
 581
 582        for (i = 0; i < 16; i++) {
 583                udelay(1);
 584                if (I915_READ(reg) & DDI_BUF_IS_IDLE)
 585                        return;
 586        }
 587        DRM_ERROR("Timeout waiting for DDI BUF %c idle bit\n", port_name(port));
 588}
 589
 590/* Starting with Haswell, different DDI ports can work in FDI mode for
 591 * connection to the PCH-located connectors. For this, it is necessary to train
 592 * both the DDI port and PCH receiver for the desired DDI buffer settings.
 593 *
 594 * The recommended port to work in FDI mode is DDI E, which we use here. Also,
 595 * please note that when FDI mode is active on DDI E, it shares 2 lines with
 596 * DDI A (which is used for eDP)
 597 */
 598
 599void hsw_fdi_link_train(struct drm_crtc *crtc)
 600{
 601        struct drm_device *dev = crtc->dev;
 602        struct drm_i915_private *dev_priv = dev->dev_private;
 603        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 604        u32 temp, i, rx_ctl_val;
 605
 606        /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the
 607         * mode set "sequence for CRT port" document:
 608         * - TP1 to TP2 time with the default value
 609         * - FDI delay to 90h
 610         *
 611         * WaFDIAutoLinkSetTimingOverrride:hsw
 612         */
 613        I915_WRITE(FDI_RX_MISC(PIPE_A), FDI_RX_PWRDN_LANE1_VAL(2) |
 614                                  FDI_RX_PWRDN_LANE0_VAL(2) |
 615                                  FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90);
 616
 617        /* Enable the PCH Receiver FDI PLL */
 618        rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE |
 619                     FDI_RX_PLL_ENABLE |
 620                     FDI_DP_PORT_WIDTH(intel_crtc->config->fdi_lanes);
 621        I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
 622        POSTING_READ(FDI_RX_CTL(PIPE_A));
 623        udelay(220);
 624
 625        /* Switch from Rawclk to PCDclk */
 626        rx_ctl_val |= FDI_PCDCLK;
 627        I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
 628
 629        /* Configure Port Clock Select */
 630        I915_WRITE(PORT_CLK_SEL(PORT_E), intel_crtc->config->ddi_pll_sel);
 631        WARN_ON(intel_crtc->config->ddi_pll_sel != PORT_CLK_SEL_SPLL);
 632
 633        /* Start the training iterating through available voltages and emphasis,
 634         * testing each value twice. */
 635        for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) {
 636                /* Configure DP_TP_CTL with auto-training */
 637                I915_WRITE(DP_TP_CTL(PORT_E),
 638                                        DP_TP_CTL_FDI_AUTOTRAIN |
 639                                        DP_TP_CTL_ENHANCED_FRAME_ENABLE |
 640                                        DP_TP_CTL_LINK_TRAIN_PAT1 |
 641                                        DP_TP_CTL_ENABLE);
 642
 643                /* Configure and enable DDI_BUF_CTL for DDI E with next voltage.
 644                 * DDI E does not support port reversal, the functionality is
 645                 * achieved on the PCH side in FDI_RX_CTL, so no need to set the
 646                 * port reversal bit */
 647                I915_WRITE(DDI_BUF_CTL(PORT_E),
 648                           DDI_BUF_CTL_ENABLE |
 649                           ((intel_crtc->config->fdi_lanes - 1) << 1) |
 650                           DDI_BUF_TRANS_SELECT(i / 2));
 651                POSTING_READ(DDI_BUF_CTL(PORT_E));
 652
 653                udelay(600);
 654
 655                /* Program PCH FDI Receiver TU */
 656                I915_WRITE(FDI_RX_TUSIZE1(PIPE_A), TU_SIZE(64));
 657
 658                /* Enable PCH FDI Receiver with auto-training */
 659                rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO;
 660                I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
 661                POSTING_READ(FDI_RX_CTL(PIPE_A));
 662
 663                /* Wait for FDI receiver lane calibration */
 664                udelay(30);
 665
 666                /* Unset FDI_RX_MISC pwrdn lanes */
 667                temp = I915_READ(FDI_RX_MISC(PIPE_A));
 668                temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
 669                I915_WRITE(FDI_RX_MISC(PIPE_A), temp);
 670                POSTING_READ(FDI_RX_MISC(PIPE_A));
 671
 672                /* Wait for FDI auto training time */
 673                udelay(5);
 674
 675                temp = I915_READ(DP_TP_STATUS(PORT_E));
 676                if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) {
 677                        DRM_DEBUG_KMS("FDI link training done on step %d\n", i);
 678
 679                        /* Enable normal pixel sending for FDI */
 680                        I915_WRITE(DP_TP_CTL(PORT_E),
 681                                   DP_TP_CTL_FDI_AUTOTRAIN |
 682                                   DP_TP_CTL_LINK_TRAIN_NORMAL |
 683                                   DP_TP_CTL_ENHANCED_FRAME_ENABLE |
 684                                   DP_TP_CTL_ENABLE);
 685
 686                        return;
 687                }
 688
 689                temp = I915_READ(DDI_BUF_CTL(PORT_E));
 690                temp &= ~DDI_BUF_CTL_ENABLE;
 691                I915_WRITE(DDI_BUF_CTL(PORT_E), temp);
 692                POSTING_READ(DDI_BUF_CTL(PORT_E));
 693
 694                /* Disable DP_TP_CTL and FDI_RX_CTL and retry */
 695                temp = I915_READ(DP_TP_CTL(PORT_E));
 696                temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
 697                temp |= DP_TP_CTL_LINK_TRAIN_PAT1;
 698                I915_WRITE(DP_TP_CTL(PORT_E), temp);
 699                POSTING_READ(DP_TP_CTL(PORT_E));
 700
 701                intel_wait_ddi_buf_idle(dev_priv, PORT_E);
 702
 703                rx_ctl_val &= ~FDI_RX_ENABLE;
 704                I915_WRITE(FDI_RX_CTL(PIPE_A), rx_ctl_val);
 705                POSTING_READ(FDI_RX_CTL(PIPE_A));
 706
 707                /* Reset FDI_RX_MISC pwrdn lanes */
 708                temp = I915_READ(FDI_RX_MISC(PIPE_A));
 709                temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
 710                temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
 711                I915_WRITE(FDI_RX_MISC(PIPE_A), temp);
 712                POSTING_READ(FDI_RX_MISC(PIPE_A));
 713        }
 714
 715        DRM_ERROR("FDI link training failed!\n");
 716}
 717
 718void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder)
 719{
 720        struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
 721        struct intel_digital_port *intel_dig_port =
 722                enc_to_dig_port(&encoder->base);
 723
 724        intel_dp->DP = intel_dig_port->saved_port_bits |
 725                DDI_BUF_CTL_ENABLE | DDI_BUF_TRANS_SELECT(0);
 726        intel_dp->DP |= DDI_PORT_WIDTH(intel_dp->lane_count);
 727}
 728
 729static struct intel_encoder *
 730intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
 731{
 732        struct drm_device *dev = crtc->dev;
 733        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 734        struct intel_encoder *intel_encoder, *ret = NULL;
 735        int num_encoders = 0;
 736
 737        for_each_encoder_on_crtc(dev, crtc, intel_encoder) {
 738                ret = intel_encoder;
 739                num_encoders++;
 740        }
 741
 742        if (num_encoders != 1)
 743                WARN(1, "%d encoders on crtc for pipe %c\n", num_encoders,
 744                     pipe_name(intel_crtc->pipe));
 745
 746        BUG_ON(ret == NULL);
 747        return ret;
 748}
 749
 750struct intel_encoder *
 751intel_ddi_get_crtc_new_encoder(struct intel_crtc_state *crtc_state)
 752{
 753        struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc);
 754        struct intel_encoder *ret = NULL;
 755        struct drm_atomic_state *state;
 756        struct drm_connector *connector;
 757        struct drm_connector_state *connector_state;
 758        int num_encoders = 0;
 759        int i;
 760
 761        state = crtc_state->base.state;
 762
 763        for_each_connector_in_state(state, connector, connector_state, i) {
 764                if (connector_state->crtc != crtc_state->base.crtc)
 765                        continue;
 766
 767                ret = to_intel_encoder(connector_state->best_encoder);
 768                num_encoders++;
 769        }
 770
 771        WARN(num_encoders != 1, "%d encoders on crtc for pipe %c\n", num_encoders,
 772             pipe_name(crtc->pipe));
 773
 774        BUG_ON(ret == NULL);
 775        return ret;
 776}
 777
 778#define LC_FREQ 2700
 779#define LC_FREQ_2K U64_C(LC_FREQ * 2000)
 780
 781#define P_MIN 2
 782#define P_MAX 64
 783#define P_INC 2
 784
 785/* Constraints for PLL good behavior */
 786#define REF_MIN 48
 787#define REF_MAX 400
 788#define VCO_MIN 2400
 789#define VCO_MAX 4800
 790
 791#define abs_diff(a, b) ({                       \
 792        typeof(a) __a = (a);                    \
 793        typeof(b) __b = (b);                    \
 794        (void) (&__a == &__b);                  \
 795        __a > __b ? (__a - __b) : (__b - __a); })
 796
 797struct hsw_wrpll_rnp {
 798        unsigned p, n2, r2;
 799};
 800
 801static unsigned hsw_wrpll_get_budget_for_freq(int clock)
 802{
 803        unsigned budget;
 804
 805        switch (clock) {
 806        case 25175000:
 807        case 25200000:
 808        case 27000000:
 809        case 27027000:
 810        case 37762500:
 811        case 37800000:
 812        case 40500000:
 813        case 40541000:
 814        case 54000000:
 815        case 54054000:
 816        case 59341000:
 817        case 59400000:
 818        case 72000000:
 819        case 74176000:
 820        case 74250000:
 821        case 81000000:
 822        case 81081000:
 823        case 89012000:
 824        case 89100000:
 825        case 108000000:
 826        case 108108000:
 827        case 111264000:
 828        case 111375000:
 829        case 148352000:
 830        case 148500000:
 831        case 162000000:
 832        case 162162000:
 833        case 222525000:
 834        case 222750000:
 835        case 296703000:
 836        case 297000000:
 837                budget = 0;
 838                break;
 839        case 233500000:
 840        case 245250000:
 841        case 247750000:
 842        case 253250000:
 843        case 298000000:
 844                budget = 1500;
 845                break;
 846        case 169128000:
 847        case 169500000:
 848        case 179500000:
 849        case 202000000:
 850                budget = 2000;
 851                break;
 852        case 256250000:
 853        case 262500000:
 854        case 270000000:
 855        case 272500000:
 856        case 273750000:
 857        case 280750000:
 858        case 281250000:
 859        case 286000000:
 860        case 291750000:
 861                budget = 4000;
 862                break;
 863        case 267250000:
 864        case 268500000:
 865                budget = 5000;
 866                break;
 867        default:
 868                budget = 1000;
 869                break;
 870        }
 871
 872        return budget;
 873}
 874
 875static void hsw_wrpll_update_rnp(uint64_t freq2k, unsigned budget,
 876                                 unsigned r2, unsigned n2, unsigned p,
 877                                 struct hsw_wrpll_rnp *best)
 878{
 879        uint64_t a, b, c, d, diff, diff_best;
 880
 881        /* No best (r,n,p) yet */
 882        if (best->p == 0) {
 883                best->p = p;
 884                best->n2 = n2;
 885                best->r2 = r2;
 886                return;
 887        }
 888
 889        /*
 890         * Output clock is (LC_FREQ_2K / 2000) * N / (P * R), which compares to
 891         * freq2k.
 892         *
 893         * delta = 1e6 *
 894         *         abs(freq2k - (LC_FREQ_2K * n2/(p * r2))) /
 895         *         freq2k;
 896         *
 897         * and we would like delta <= budget.
 898         *
 899         * If the discrepancy is above the PPM-based budget, always prefer to
 900         * improve upon the previous solution.  However, if you're within the
 901         * budget, try to maximize Ref * VCO, that is N / (P * R^2).
 902         */
 903        a = freq2k * budget * p * r2;
 904        b = freq2k * budget * best->p * best->r2;
 905        diff = abs_diff(freq2k * p * r2, LC_FREQ_2K * n2);
 906        diff_best = abs_diff(freq2k * best->p * best->r2,
 907                             LC_FREQ_2K * best->n2);
 908        c = 1000000 * diff;
 909        d = 1000000 * diff_best;
 910
 911        if (a < c && b < d) {
 912                /* If both are above the budget, pick the closer */
 913                if (best->p * best->r2 * diff < p * r2 * diff_best) {
 914                        best->p = p;
 915                        best->n2 = n2;
 916                        best->r2 = r2;
 917                }
 918        } else if (a >= c && b < d) {
 919                /* If A is below the threshold but B is above it?  Update. */
 920                best->p = p;
 921                best->n2 = n2;
 922                best->r2 = r2;
 923        } else if (a >= c && b >= d) {
 924                /* Both are below the limit, so pick the higher n2/(r2*r2) */
 925                if (n2 * best->r2 * best->r2 > best->n2 * r2 * r2) {
 926                        best->p = p;
 927                        best->n2 = n2;
 928                        best->r2 = r2;
 929                }
 930        }
 931        /* Otherwise a < c && b >= d, do nothing */
 932}
 933
 934static int hsw_ddi_calc_wrpll_link(struct drm_i915_private *dev_priv, int reg)
 935{
 936        int refclk = LC_FREQ;
 937        int n, p, r;
 938        u32 wrpll;
 939
 940        wrpll = I915_READ(reg);
 941        switch (wrpll & WRPLL_PLL_REF_MASK) {
 942        case WRPLL_PLL_SSC:
 943        case WRPLL_PLL_NON_SSC:
 944                /*
 945                 * We could calculate spread here, but our checking
 946                 * code only cares about 5% accuracy, and spread is a max of
 947                 * 0.5% downspread.
 948                 */
 949                refclk = 135;
 950                break;
 951        case WRPLL_PLL_LCPLL:
 952                refclk = LC_FREQ;
 953                break;
 954        default:
 955                WARN(1, "bad wrpll refclk\n");
 956                return 0;
 957        }
 958
 959        r = wrpll & WRPLL_DIVIDER_REF_MASK;
 960        p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT;
 961        n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT;
 962
 963        /* Convert to KHz, p & r have a fixed point portion */
 964        return (refclk * n * 100) / (p * r);
 965}
 966
 967static int skl_calc_wrpll_link(struct drm_i915_private *dev_priv,
 968                               uint32_t dpll)
 969{
 970        uint32_t cfgcr1_reg, cfgcr2_reg;
 971        uint32_t cfgcr1_val, cfgcr2_val;
 972        uint32_t p0, p1, p2, dco_freq;
 973
 974        cfgcr1_reg = DPLL_CFGCR1(dpll);
 975        cfgcr2_reg = DPLL_CFGCR2(dpll);
 976
 977        cfgcr1_val = I915_READ(cfgcr1_reg);
 978        cfgcr2_val = I915_READ(cfgcr2_reg);
 979
 980        p0 = cfgcr2_val & DPLL_CFGCR2_PDIV_MASK;
 981        p2 = cfgcr2_val & DPLL_CFGCR2_KDIV_MASK;
 982
 983        if (cfgcr2_val &  DPLL_CFGCR2_QDIV_MODE(1))
 984                p1 = (cfgcr2_val & DPLL_CFGCR2_QDIV_RATIO_MASK) >> 8;
 985        else
 986                p1 = 1;
 987
 988
 989        switch (p0) {
 990        case DPLL_CFGCR2_PDIV_1:
 991                p0 = 1;
 992                break;
 993        case DPLL_CFGCR2_PDIV_2:
 994                p0 = 2;
 995                break;
 996        case DPLL_CFGCR2_PDIV_3:
 997                p0 = 3;
 998                break;
 999        case DPLL_CFGCR2_PDIV_7:
1000                p0 = 7;
1001                break;
1002        }
1003
1004        switch (p2) {
1005        case DPLL_CFGCR2_KDIV_5:
1006                p2 = 5;
1007                break;
1008        case DPLL_CFGCR2_KDIV_2:
1009                p2 = 2;
1010                break;
1011        case DPLL_CFGCR2_KDIV_3:
1012                p2 = 3;
1013                break;
1014        case DPLL_CFGCR2_KDIV_1:
1015                p2 = 1;
1016                break;
1017        }
1018
1019        dco_freq = (cfgcr1_val & DPLL_CFGCR1_DCO_INTEGER_MASK) * 24 * 1000;
1020
1021        dco_freq += (((cfgcr1_val & DPLL_CFGCR1_DCO_FRACTION_MASK) >> 9) * 24 *
1022                1000) / 0x8000;
1023
1024        return dco_freq / (p0 * p1 * p2 * 5);
1025}
1026
1027static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)
1028{
1029        int dotclock;
1030
1031        if (pipe_config->has_pch_encoder)
1032                dotclock = intel_dotclock_calculate(pipe_config->port_clock,
1033                                                    &pipe_config->fdi_m_n);
1034        else if (pipe_config->has_dp_encoder)
1035                dotclock = intel_dotclock_calculate(pipe_config->port_clock,
1036                                                    &pipe_config->dp_m_n);
1037        else if (pipe_config->has_hdmi_sink && pipe_config->pipe_bpp == 36)
1038                dotclock = pipe_config->port_clock * 2 / 3;
1039        else
1040                dotclock = pipe_config->port_clock;
1041
1042        if (pipe_config->pixel_multiplier)
1043                dotclock /= pipe_config->pixel_multiplier;
1044
1045        pipe_config->base.adjusted_mode.crtc_clock = dotclock;
1046}
1047
1048static void skl_ddi_clock_get(struct intel_encoder *encoder,
1049                                struct intel_crtc_state *pipe_config)
1050{
1051        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1052        int link_clock = 0;
1053        uint32_t dpll_ctl1, dpll;
1054
1055        dpll = pipe_config->ddi_pll_sel;
1056
1057        dpll_ctl1 = I915_READ(DPLL_CTRL1);
1058
1059        if (dpll_ctl1 & DPLL_CTRL1_HDMI_MODE(dpll)) {
1060                link_clock = skl_calc_wrpll_link(dev_priv, dpll);
1061        } else {
1062                link_clock = dpll_ctl1 & DPLL_CTRL1_LINK_RATE_MASK(dpll);
1063                link_clock >>= DPLL_CTRL1_LINK_RATE_SHIFT(dpll);
1064
1065                switch (link_clock) {
1066                case DPLL_CTRL1_LINK_RATE_810:
1067                        link_clock = 81000;
1068                        break;
1069                case DPLL_CTRL1_LINK_RATE_1080:
1070                        link_clock = 108000;
1071                        break;
1072                case DPLL_CTRL1_LINK_RATE_1350:
1073                        link_clock = 135000;
1074                        break;
1075                case DPLL_CTRL1_LINK_RATE_1620:
1076                        link_clock = 162000;
1077                        break;
1078                case DPLL_CTRL1_LINK_RATE_2160:
1079                        link_clock = 216000;
1080                        break;
1081                case DPLL_CTRL1_LINK_RATE_2700:
1082                        link_clock = 270000;
1083                        break;
1084                default:
1085                        WARN(1, "Unsupported link rate\n");
1086                        break;
1087                }
1088                link_clock *= 2;
1089        }
1090
1091        pipe_config->port_clock = link_clock;
1092
1093        ddi_dotclock_get(pipe_config);
1094}
1095
1096static void hsw_ddi_clock_get(struct intel_encoder *encoder,
1097                              struct intel_crtc_state *pipe_config)
1098{
1099        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1100        int link_clock = 0;
1101        u32 val, pll;
1102
1103        val = pipe_config->ddi_pll_sel;
1104        switch (val & PORT_CLK_SEL_MASK) {
1105        case PORT_CLK_SEL_LCPLL_810:
1106                link_clock = 81000;
1107                break;
1108        case PORT_CLK_SEL_LCPLL_1350:
1109                link_clock = 135000;
1110                break;
1111        case PORT_CLK_SEL_LCPLL_2700:
1112                link_clock = 270000;
1113                break;
1114        case PORT_CLK_SEL_WRPLL1:
1115                link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL1);
1116                break;
1117        case PORT_CLK_SEL_WRPLL2:
1118                link_clock = hsw_ddi_calc_wrpll_link(dev_priv, WRPLL_CTL2);
1119                break;
1120        case PORT_CLK_SEL_SPLL:
1121                pll = I915_READ(SPLL_CTL) & SPLL_PLL_FREQ_MASK;
1122                if (pll == SPLL_PLL_FREQ_810MHz)
1123                        link_clock = 81000;
1124                else if (pll == SPLL_PLL_FREQ_1350MHz)
1125                        link_clock = 135000;
1126                else if (pll == SPLL_PLL_FREQ_2700MHz)
1127                        link_clock = 270000;
1128                else {
1129                        WARN(1, "bad spll freq\n");
1130                        return;
1131                }
1132                break;
1133        default:
1134                WARN(1, "bad port clock sel\n");
1135                return;
1136        }
1137
1138        pipe_config->port_clock = link_clock * 2;
1139
1140        ddi_dotclock_get(pipe_config);
1141}
1142
1143static int bxt_calc_pll_link(struct drm_i915_private *dev_priv,
1144                                enum intel_dpll_id dpll)
1145{
1146        struct intel_shared_dpll *pll;
1147        struct intel_dpll_hw_state *state;
1148        intel_clock_t clock;
1149
1150        /* For DDI ports we always use a shared PLL. */
1151        if (WARN_ON(dpll == DPLL_ID_PRIVATE))
1152                return 0;
1153
1154        pll = &dev_priv->shared_dplls[dpll];
1155        state = &pll->config.hw_state;
1156
1157        clock.m1 = 2;
1158        clock.m2 = (state->pll0 & PORT_PLL_M2_MASK) << 22;
1159        if (state->pll3 & PORT_PLL_M2_FRAC_ENABLE)
1160                clock.m2 |= state->pll2 & PORT_PLL_M2_FRAC_MASK;
1161        clock.n = (state->pll1 & PORT_PLL_N_MASK) >> PORT_PLL_N_SHIFT;
1162        clock.p1 = (state->ebb0 & PORT_PLL_P1_MASK) >> PORT_PLL_P1_SHIFT;
1163        clock.p2 = (state->ebb0 & PORT_PLL_P2_MASK) >> PORT_PLL_P2_SHIFT;
1164
1165        return chv_calc_dpll_params(100000, &clock);
1166}
1167
1168static void bxt_ddi_clock_get(struct intel_encoder *encoder,
1169                                struct intel_crtc_state *pipe_config)
1170{
1171        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1172        enum port port = intel_ddi_get_encoder_port(encoder);
1173        uint32_t dpll = port;
1174
1175        pipe_config->port_clock = bxt_calc_pll_link(dev_priv, dpll);
1176
1177        ddi_dotclock_get(pipe_config);
1178}
1179
1180void intel_ddi_clock_get(struct intel_encoder *encoder,
1181                         struct intel_crtc_state *pipe_config)
1182{
1183        struct drm_device *dev = encoder->base.dev;
1184
1185        if (INTEL_INFO(dev)->gen <= 8)
1186                hsw_ddi_clock_get(encoder, pipe_config);
1187        else if (IS_SKYLAKE(dev))
1188                skl_ddi_clock_get(encoder, pipe_config);
1189        else if (IS_BROXTON(dev))
1190                bxt_ddi_clock_get(encoder, pipe_config);
1191}
1192
1193static void
1194hsw_ddi_calculate_wrpll(int clock /* in Hz */,
1195                        unsigned *r2_out, unsigned *n2_out, unsigned *p_out)
1196{
1197        uint64_t freq2k;
1198        unsigned p, n2, r2;
1199        struct hsw_wrpll_rnp best = { 0, 0, 0 };
1200        unsigned budget;
1201
1202        freq2k = clock / 100;
1203
1204        budget = hsw_wrpll_get_budget_for_freq(clock);
1205
1206        /* Special case handling for 540 pixel clock: bypass WR PLL entirely
1207         * and directly pass the LC PLL to it. */
1208        if (freq2k == 5400000) {
1209                *n2_out = 2;
1210                *p_out = 1;
1211                *r2_out = 2;
1212                return;
1213        }
1214
1215        /*
1216         * Ref = LC_FREQ / R, where Ref is the actual reference input seen by
1217         * the WR PLL.
1218         *
1219         * We want R so that REF_MIN <= Ref <= REF_MAX.
1220         * Injecting R2 = 2 * R gives:
1221         *   REF_MAX * r2 > LC_FREQ * 2 and
1222         *   REF_MIN * r2 < LC_FREQ * 2
1223         *
1224         * Which means the desired boundaries for r2 are:
1225         *  LC_FREQ * 2 / REF_MAX < r2 < LC_FREQ * 2 / REF_MIN
1226         *
1227         */
1228        for (r2 = LC_FREQ * 2 / REF_MAX + 1;
1229             r2 <= LC_FREQ * 2 / REF_MIN;
1230             r2++) {
1231
1232                /*
1233                 * VCO = N * Ref, that is: VCO = N * LC_FREQ / R
1234                 *
1235                 * Once again we want VCO_MIN <= VCO <= VCO_MAX.
1236                 * Injecting R2 = 2 * R and N2 = 2 * N, we get:
1237                 *   VCO_MAX * r2 > n2 * LC_FREQ and
1238                 *   VCO_MIN * r2 < n2 * LC_FREQ)
1239                 *
1240                 * Which means the desired boundaries for n2 are:
1241                 * VCO_MIN * r2 / LC_FREQ < n2 < VCO_MAX * r2 / LC_FREQ
1242                 */
1243                for (n2 = VCO_MIN * r2 / LC_FREQ + 1;
1244                     n2 <= VCO_MAX * r2 / LC_FREQ;
1245                     n2++) {
1246
1247                        for (p = P_MIN; p <= P_MAX; p += P_INC)
1248                                hsw_wrpll_update_rnp(freq2k, budget,
1249                                                     r2, n2, p, &best);
1250                }
1251        }
1252
1253        *n2_out = best.n2;
1254        *p_out = best.p;
1255        *r2_out = best.r2;
1256}
1257
1258static bool
1259hsw_ddi_pll_select(struct intel_crtc *intel_crtc,
1260                   struct intel_crtc_state *crtc_state,
1261                   struct intel_encoder *intel_encoder)
1262{
1263        int clock = crtc_state->port_clock;
1264
1265        if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1266                struct intel_shared_dpll *pll;
1267                uint32_t val;
1268                unsigned p, n2, r2;
1269
1270                hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
1271
1272                val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
1273                      WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
1274                      WRPLL_DIVIDER_POST(p);
1275
1276                memset(&crtc_state->dpll_hw_state, 0,
1277                       sizeof(crtc_state->dpll_hw_state));
1278
1279                crtc_state->dpll_hw_state.wrpll = val;
1280
1281                pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1282                if (pll == NULL) {
1283                        DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1284                                         pipe_name(intel_crtc->pipe));
1285                        return false;
1286                }
1287
1288                crtc_state->ddi_pll_sel = PORT_CLK_SEL_WRPLL(pll->id);
1289        } else if (crtc_state->ddi_pll_sel == PORT_CLK_SEL_SPLL) {
1290                struct drm_atomic_state *state = crtc_state->base.state;
1291                struct intel_shared_dpll_config *spll =
1292                        &intel_atomic_get_shared_dpll_state(state)[DPLL_ID_SPLL];
1293
1294                if (spll->crtc_mask &&
1295                    WARN_ON(spll->hw_state.spll != crtc_state->dpll_hw_state.spll))
1296                        return false;
1297
1298                crtc_state->shared_dpll = DPLL_ID_SPLL;
1299                spll->hw_state.spll = crtc_state->dpll_hw_state.spll;
1300                spll->crtc_mask |= 1 << intel_crtc->pipe;
1301        }
1302
1303        return true;
1304}
1305
1306struct skl_wrpll_context {
1307        uint64_t min_deviation;         /* current minimal deviation */
1308        uint64_t central_freq;          /* chosen central freq */
1309        uint64_t dco_freq;              /* chosen dco freq */
1310        unsigned int p;                 /* chosen divider */
1311};
1312
1313static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
1314{
1315        memset(ctx, 0, sizeof(*ctx));
1316
1317        ctx->min_deviation = U64_MAX;
1318}
1319
1320/* DCO freq must be within +1%/-6%  of the DCO central freq */
1321#define SKL_DCO_MAX_PDEVIATION  100
1322#define SKL_DCO_MAX_NDEVIATION  600
1323
1324static void skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
1325                                  uint64_t central_freq,
1326                                  uint64_t dco_freq,
1327                                  unsigned int divider)
1328{
1329        uint64_t deviation;
1330
1331        deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
1332                              central_freq);
1333
1334        /* positive deviation */
1335        if (dco_freq >= central_freq) {
1336                if (deviation < SKL_DCO_MAX_PDEVIATION &&
1337                    deviation < ctx->min_deviation) {
1338                        ctx->min_deviation = deviation;
1339                        ctx->central_freq = central_freq;
1340                        ctx->dco_freq = dco_freq;
1341                        ctx->p = divider;
1342                }
1343        /* negative deviation */
1344        } else if (deviation < SKL_DCO_MAX_NDEVIATION &&
1345                   deviation < ctx->min_deviation) {
1346                ctx->min_deviation = deviation;
1347                ctx->central_freq = central_freq;
1348                ctx->dco_freq = dco_freq;
1349                ctx->p = divider;
1350        }
1351}
1352
1353static void skl_wrpll_get_multipliers(unsigned int p,
1354                                      unsigned int *p0 /* out */,
1355                                      unsigned int *p1 /* out */,
1356                                      unsigned int *p2 /* out */)
1357{
1358        /* even dividers */
1359        if (p % 2 == 0) {
1360                unsigned int half = p / 2;
1361
1362                if (half == 1 || half == 2 || half == 3 || half == 5) {
1363                        *p0 = 2;
1364                        *p1 = 1;
1365                        *p2 = half;
1366                } else if (half % 2 == 0) {
1367                        *p0 = 2;
1368                        *p1 = half / 2;
1369                        *p2 = 2;
1370                } else if (half % 3 == 0) {
1371                        *p0 = 3;
1372                        *p1 = half / 3;
1373                        *p2 = 2;
1374                } else if (half % 7 == 0) {
1375                        *p0 = 7;
1376                        *p1 = half / 7;
1377                        *p2 = 2;
1378                }
1379        } else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
1380                *p0 = 3;
1381                *p1 = 1;
1382                *p2 = p / 3;
1383        } else if (p == 5 || p == 7) {
1384                *p0 = p;
1385                *p1 = 1;
1386                *p2 = 1;
1387        } else if (p == 15) {
1388                *p0 = 3;
1389                *p1 = 1;
1390                *p2 = 5;
1391        } else if (p == 21) {
1392                *p0 = 7;
1393                *p1 = 1;
1394                *p2 = 3;
1395        } else if (p == 35) {
1396                *p0 = 7;
1397                *p1 = 1;
1398                *p2 = 5;
1399        }
1400}
1401
1402struct skl_wrpll_params {
1403        uint32_t        dco_fraction;
1404        uint32_t        dco_integer;
1405        uint32_t        qdiv_ratio;
1406        uint32_t        qdiv_mode;
1407        uint32_t        kdiv;
1408        uint32_t        pdiv;
1409        uint32_t        central_freq;
1410};
1411
1412static void skl_wrpll_params_populate(struct skl_wrpll_params *params,
1413                                      uint64_t afe_clock,
1414                                      uint64_t central_freq,
1415                                      uint32_t p0, uint32_t p1, uint32_t p2)
1416{
1417        uint64_t dco_freq;
1418
1419        switch (central_freq) {
1420        case 9600000000ULL:
1421                params->central_freq = 0;
1422                break;
1423        case 9000000000ULL:
1424                params->central_freq = 1;
1425                break;
1426        case 8400000000ULL:
1427                params->central_freq = 3;
1428        }
1429
1430        switch (p0) {
1431        case 1:
1432                params->pdiv = 0;
1433                break;
1434        case 2:
1435                params->pdiv = 1;
1436                break;
1437        case 3:
1438                params->pdiv = 2;
1439                break;
1440        case 7:
1441                params->pdiv = 4;
1442                break;
1443        default:
1444                WARN(1, "Incorrect PDiv\n");
1445        }
1446
1447        switch (p2) {
1448        case 5:
1449                params->kdiv = 0;
1450                break;
1451        case 2:
1452                params->kdiv = 1;
1453                break;
1454        case 3:
1455                params->kdiv = 2;
1456                break;
1457        case 1:
1458                params->kdiv = 3;
1459                break;
1460        default:
1461                WARN(1, "Incorrect KDiv\n");
1462        }
1463
1464        params->qdiv_ratio = p1;
1465        params->qdiv_mode = (params->qdiv_ratio == 1) ? 0 : 1;
1466
1467        dco_freq = p0 * p1 * p2 * afe_clock;
1468
1469        /*
1470         * Intermediate values are in Hz.
1471         * Divide by MHz to match bsepc
1472         */
1473        params->dco_integer = div_u64(dco_freq, 24 * MHz(1));
1474        params->dco_fraction =
1475                div_u64((div_u64(dco_freq, 24) -
1476                         params->dco_integer * MHz(1)) * 0x8000, MHz(1));
1477}
1478
1479static bool
1480skl_ddi_calculate_wrpll(int clock /* in Hz */,
1481                        struct skl_wrpll_params *wrpll_params)
1482{
1483        uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
1484        uint64_t dco_central_freq[3] = {8400000000ULL,
1485                                        9000000000ULL,
1486                                        9600000000ULL};
1487        static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
1488                                             24, 28, 30, 32, 36, 40, 42, 44,
1489                                             48, 52, 54, 56, 60, 64, 66, 68,
1490                                             70, 72, 76, 78, 80, 84, 88, 90,
1491                                             92, 96, 98 };
1492        static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
1493        static const struct {
1494                const int *list;
1495                int n_dividers;
1496        } dividers[] = {
1497                { even_dividers, ARRAY_SIZE(even_dividers) },
1498                { odd_dividers, ARRAY_SIZE(odd_dividers) },
1499        };
1500        struct skl_wrpll_context ctx;
1501        unsigned int dco, d, i;
1502        unsigned int p0, p1, p2;
1503
1504        skl_wrpll_context_init(&ctx);
1505
1506        for (d = 0; d < ARRAY_SIZE(dividers); d++) {
1507                for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
1508                        for (i = 0; i < dividers[d].n_dividers; i++) {
1509                                unsigned int p = dividers[d].list[i];
1510                                uint64_t dco_freq = p * afe_clock;
1511
1512                                skl_wrpll_try_divider(&ctx,
1513                                                      dco_central_freq[dco],
1514                                                      dco_freq,
1515                                                      p);
1516                                /*
1517                                 * Skip the remaining dividers if we're sure to
1518                                 * have found the definitive divider, we can't
1519                                 * improve a 0 deviation.
1520                                 */
1521                                if (ctx.min_deviation == 0)
1522                                        goto skip_remaining_dividers;
1523                        }
1524                }
1525
1526skip_remaining_dividers:
1527                /*
1528                 * If a solution is found with an even divider, prefer
1529                 * this one.
1530                 */
1531                if (d == 0 && ctx.p)
1532                        break;
1533        }
1534
1535        if (!ctx.p) {
1536                DRM_DEBUG_DRIVER("No valid divider found for %dHz\n", clock);
1537                return false;
1538        }
1539
1540        /*
1541         * gcc incorrectly analyses that these can be used without being
1542         * initialized. To be fair, it's hard to guess.
1543         */
1544        p0 = p1 = p2 = 0;
1545        skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
1546        skl_wrpll_params_populate(wrpll_params, afe_clock, ctx.central_freq,
1547                                  p0, p1, p2);
1548
1549        return true;
1550}
1551
1552static bool
1553skl_ddi_pll_select(struct intel_crtc *intel_crtc,
1554                   struct intel_crtc_state *crtc_state,
1555                   struct intel_encoder *intel_encoder)
1556{
1557        struct intel_shared_dpll *pll;
1558        uint32_t ctrl1, cfgcr1, cfgcr2;
1559        int clock = crtc_state->port_clock;
1560
1561        /*
1562         * See comment in intel_dpll_hw_state to understand why we always use 0
1563         * as the DPLL id in this function.
1564         */
1565
1566        ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1567
1568        if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1569                struct skl_wrpll_params wrpll_params = { 0, };
1570
1571                ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1572
1573                if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1574                        return false;
1575
1576                cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1577                         DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1578                         wrpll_params.dco_integer;
1579
1580                cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1581                         DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1582                         DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1583                         DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1584                         wrpll_params.central_freq;
1585        } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT) {
1586                switch (crtc_state->port_clock / 2) {
1587                case 81000:
1588                        ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1589                        break;
1590                case 135000:
1591                        ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1592                        break;
1593                case 270000:
1594                        ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1595                        break;
1596                }
1597
1598                cfgcr1 = cfgcr2 = 0;
1599        } else /* eDP */
1600                return true;
1601
1602        memset(&crtc_state->dpll_hw_state, 0,
1603               sizeof(crtc_state->dpll_hw_state));
1604
1605        crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1606        crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1607        crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1608
1609        pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1610        if (pll == NULL) {
1611                DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1612                                 pipe_name(intel_crtc->pipe));
1613                return false;
1614        }
1615
1616        /* shared DPLL id 0 is DPLL 1 */
1617        crtc_state->ddi_pll_sel = pll->id + 1;
1618
1619        return true;
1620}
1621
1622/* bxt clock parameters */
1623struct bxt_clk_div {
1624        int clock;
1625        uint32_t p1;
1626        uint32_t p2;
1627        uint32_t m2_int;
1628        uint32_t m2_frac;
1629        bool m2_frac_en;
1630        uint32_t n;
1631};
1632
1633/* pre-calculated values for DP linkrates */
1634static const struct bxt_clk_div bxt_dp_clk_val[] = {
1635        {162000, 4, 2, 32, 1677722, 1, 1},
1636        {270000, 4, 1, 27,       0, 0, 1},
1637        {540000, 2, 1, 27,       0, 0, 1},
1638        {216000, 3, 2, 32, 1677722, 1, 1},
1639        {243000, 4, 1, 24, 1258291, 1, 1},
1640        {324000, 4, 1, 32, 1677722, 1, 1},
1641        {432000, 3, 1, 32, 1677722, 1, 1}
1642};
1643
1644static bool
1645bxt_ddi_pll_select(struct intel_crtc *intel_crtc,
1646                   struct intel_crtc_state *crtc_state,
1647                   struct intel_encoder *intel_encoder)
1648{
1649        struct intel_shared_dpll *pll;
1650        struct bxt_clk_div clk_div = {0};
1651        int vco = 0;
1652        uint32_t prop_coef, int_coef, gain_ctl, targ_cnt;
1653        uint32_t lanestagger;
1654        int clock = crtc_state->port_clock;
1655
1656        if (intel_encoder->type == INTEL_OUTPUT_HDMI) {
1657                intel_clock_t best_clock;
1658
1659                /* Calculate HDMI div */
1660                /*
1661                 * FIXME: tie the following calculation into
1662                 * i9xx_crtc_compute_clock
1663                 */
1664                if (!bxt_find_best_dpll(crtc_state, clock, &best_clock)) {
1665                        DRM_DEBUG_DRIVER("no PLL dividers found for clock %d pipe %c\n",
1666                                         clock, pipe_name(intel_crtc->pipe));
1667                        return false;
1668                }
1669
1670                clk_div.p1 = best_clock.p1;
1671                clk_div.p2 = best_clock.p2;
1672                WARN_ON(best_clock.m1 != 2);
1673                clk_div.n = best_clock.n;
1674                clk_div.m2_int = best_clock.m2 >> 22;
1675                clk_div.m2_frac = best_clock.m2 & ((1 << 22) - 1);
1676                clk_div.m2_frac_en = clk_div.m2_frac != 0;
1677
1678                vco = best_clock.vco;
1679        } else if (intel_encoder->type == INTEL_OUTPUT_DISPLAYPORT ||
1680                        intel_encoder->type == INTEL_OUTPUT_EDP) {
1681                int i;
1682
1683                clk_div = bxt_dp_clk_val[0];
1684                for (i = 0; i < ARRAY_SIZE(bxt_dp_clk_val); ++i) {
1685                        if (bxt_dp_clk_val[i].clock == clock) {
1686                                clk_div = bxt_dp_clk_val[i];
1687                                break;
1688                        }
1689                }
1690                vco = clock * 10 / 2 * clk_div.p1 * clk_div.p2;
1691        }
1692
1693        if (vco >= 6200000 && vco <= 6700000) {
1694                prop_coef = 4;
1695                int_coef = 9;
1696                gain_ctl = 3;
1697                targ_cnt = 8;
1698        } else if ((vco > 5400000 && vco < 6200000) ||
1699                        (vco >= 4800000 && vco < 5400000)) {
1700                prop_coef = 5;
1701                int_coef = 11;
1702                gain_ctl = 3;
1703                targ_cnt = 9;
1704        } else if (vco == 5400000) {
1705                prop_coef = 3;
1706                int_coef = 8;
1707                gain_ctl = 1;
1708                targ_cnt = 9;
1709        } else {
1710                DRM_ERROR("Invalid VCO\n");
1711                return false;
1712        }
1713
1714        memset(&crtc_state->dpll_hw_state, 0,
1715               sizeof(crtc_state->dpll_hw_state));
1716
1717        if (clock > 270000)
1718                lanestagger = 0x18;
1719        else if (clock > 135000)
1720                lanestagger = 0x0d;
1721        else if (clock > 67000)
1722                lanestagger = 0x07;
1723        else if (clock > 33000)
1724                lanestagger = 0x04;
1725        else
1726                lanestagger = 0x02;
1727
1728        crtc_state->dpll_hw_state.ebb0 =
1729                PORT_PLL_P1(clk_div.p1) | PORT_PLL_P2(clk_div.p2);
1730        crtc_state->dpll_hw_state.pll0 = clk_div.m2_int;
1731        crtc_state->dpll_hw_state.pll1 = PORT_PLL_N(clk_div.n);
1732        crtc_state->dpll_hw_state.pll2 = clk_div.m2_frac;
1733
1734        if (clk_div.m2_frac_en)
1735                crtc_state->dpll_hw_state.pll3 =
1736                        PORT_PLL_M2_FRAC_ENABLE;
1737
1738        crtc_state->dpll_hw_state.pll6 =
1739                prop_coef | PORT_PLL_INT_COEFF(int_coef);
1740        crtc_state->dpll_hw_state.pll6 |=
1741                PORT_PLL_GAIN_CTL(gain_ctl);
1742
1743        crtc_state->dpll_hw_state.pll8 = targ_cnt;
1744
1745        crtc_state->dpll_hw_state.pll9 = 5 << PORT_PLL_LOCK_THRESHOLD_SHIFT;
1746
1747        crtc_state->dpll_hw_state.pll10 =
1748                PORT_PLL_DCO_AMP(PORT_PLL_DCO_AMP_DEFAULT)
1749                | PORT_PLL_DCO_AMP_OVR_EN_H;
1750
1751        crtc_state->dpll_hw_state.ebb4 = PORT_PLL_10BIT_CLK_ENABLE;
1752
1753        crtc_state->dpll_hw_state.pcsdw12 =
1754                LANESTAGGER_STRAP_OVRD | lanestagger;
1755
1756        pll = intel_get_shared_dpll(intel_crtc, crtc_state);
1757        if (pll == NULL) {
1758                DRM_DEBUG_DRIVER("failed to find PLL for pipe %c\n",
1759                        pipe_name(intel_crtc->pipe));
1760                return false;
1761        }
1762
1763        /* shared DPLL id 0 is DPLL A */
1764        crtc_state->ddi_pll_sel = pll->id;
1765
1766        return true;
1767}
1768
1769/*
1770 * Tries to find a *shared* PLL for the CRTC and store it in
1771 * intel_crtc->ddi_pll_sel.
1772 *
1773 * For private DPLLs, compute_config() should do the selection for us. This
1774 * function should be folded into compute_config() eventually.
1775 */
1776bool intel_ddi_pll_select(struct intel_crtc *intel_crtc,
1777                          struct intel_crtc_state *crtc_state)
1778{
1779        struct drm_device *dev = intel_crtc->base.dev;
1780        struct intel_encoder *intel_encoder =
1781                intel_ddi_get_crtc_new_encoder(crtc_state);
1782
1783        if (IS_SKYLAKE(dev))
1784                return skl_ddi_pll_select(intel_crtc, crtc_state,
1785                                          intel_encoder);
1786        else if (IS_BROXTON(dev))
1787                return bxt_ddi_pll_select(intel_crtc, crtc_state,
1788                                          intel_encoder);
1789        else
1790                return hsw_ddi_pll_select(intel_crtc, crtc_state,
1791                                          intel_encoder);
1792}
1793
1794void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
1795{
1796        struct drm_i915_private *dev_priv = crtc->dev->dev_private;
1797        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1798        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1799        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1800        int type = intel_encoder->type;
1801        uint32_t temp;
1802
1803        if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP || type == INTEL_OUTPUT_DP_MST) {
1804                temp = TRANS_MSA_SYNC_CLK;
1805                switch (intel_crtc->config->pipe_bpp) {
1806                case 18:
1807                        temp |= TRANS_MSA_6_BPC;
1808                        break;
1809                case 24:
1810                        temp |= TRANS_MSA_8_BPC;
1811                        break;
1812                case 30:
1813                        temp |= TRANS_MSA_10_BPC;
1814                        break;
1815                case 36:
1816                        temp |= TRANS_MSA_12_BPC;
1817                        break;
1818                default:
1819                        BUG();
1820                }
1821                I915_WRITE(TRANS_MSA_MISC(cpu_transcoder), temp);
1822        }
1823}
1824
1825void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state)
1826{
1827        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1828        struct drm_device *dev = crtc->dev;
1829        struct drm_i915_private *dev_priv = dev->dev_private;
1830        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1831        uint32_t temp;
1832        temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1833        if (state == true)
1834                temp |= TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
1835        else
1836                temp &= ~TRANS_DDI_DP_VC_PAYLOAD_ALLOC;
1837        I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
1838}
1839
1840void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
1841{
1842        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1843        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
1844        struct drm_encoder *encoder = &intel_encoder->base;
1845        struct drm_device *dev = crtc->dev;
1846        struct drm_i915_private *dev_priv = dev->dev_private;
1847        enum pipe pipe = intel_crtc->pipe;
1848        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
1849        enum port port = intel_ddi_get_encoder_port(intel_encoder);
1850        int type = intel_encoder->type;
1851        uint32_t temp;
1852
1853        /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
1854        temp = TRANS_DDI_FUNC_ENABLE;
1855        temp |= TRANS_DDI_SELECT_PORT(port);
1856
1857        switch (intel_crtc->config->pipe_bpp) {
1858        case 18:
1859                temp |= TRANS_DDI_BPC_6;
1860                break;
1861        case 24:
1862                temp |= TRANS_DDI_BPC_8;
1863                break;
1864        case 30:
1865                temp |= TRANS_DDI_BPC_10;
1866                break;
1867        case 36:
1868                temp |= TRANS_DDI_BPC_12;
1869                break;
1870        default:
1871                BUG();
1872        }
1873
1874        if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PVSYNC)
1875                temp |= TRANS_DDI_PVSYNC;
1876        if (intel_crtc->config->base.adjusted_mode.flags & DRM_MODE_FLAG_PHSYNC)
1877                temp |= TRANS_DDI_PHSYNC;
1878
1879        if (cpu_transcoder == TRANSCODER_EDP) {
1880                switch (pipe) {
1881                case PIPE_A:
1882                        /* On Haswell, can only use the always-on power well for
1883                         * eDP when not using the panel fitter, and when not
1884                         * using motion blur mitigation (which we don't
1885                         * support). */
1886                        if (IS_HASWELL(dev) &&
1887                            (intel_crtc->config->pch_pfit.enabled ||
1888                             intel_crtc->config->pch_pfit.force_thru))
1889                                temp |= TRANS_DDI_EDP_INPUT_A_ONOFF;
1890                        else
1891                                temp |= TRANS_DDI_EDP_INPUT_A_ON;
1892                        break;
1893                case PIPE_B:
1894                        temp |= TRANS_DDI_EDP_INPUT_B_ONOFF;
1895                        break;
1896                case PIPE_C:
1897                        temp |= TRANS_DDI_EDP_INPUT_C_ONOFF;
1898                        break;
1899                default:
1900                        BUG();
1901                        break;
1902                }
1903        }
1904
1905        if (type == INTEL_OUTPUT_HDMI) {
1906                if (intel_crtc->config->has_hdmi_sink)
1907                        temp |= TRANS_DDI_MODE_SELECT_HDMI;
1908                else
1909                        temp |= TRANS_DDI_MODE_SELECT_DVI;
1910
1911        } else if (type == INTEL_OUTPUT_ANALOG) {
1912                temp |= TRANS_DDI_MODE_SELECT_FDI;
1913                temp |= (intel_crtc->config->fdi_lanes - 1) << 1;
1914
1915        } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
1916                   type == INTEL_OUTPUT_EDP) {
1917                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1918
1919                if (intel_dp->is_mst) {
1920                        temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1921                } else
1922                        temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1923
1924                temp |= DDI_PORT_WIDTH(intel_crtc->config->lane_count);
1925        } else if (type == INTEL_OUTPUT_DP_MST) {
1926                struct intel_dp *intel_dp = &enc_to_mst(encoder)->primary->dp;
1927
1928                if (intel_dp->is_mst) {
1929                        temp |= TRANS_DDI_MODE_SELECT_DP_MST;
1930                } else
1931                        temp |= TRANS_DDI_MODE_SELECT_DP_SST;
1932
1933                temp |= DDI_PORT_WIDTH(intel_crtc->config->lane_count);
1934        } else {
1935                WARN(1, "Invalid encoder type %d for pipe %c\n",
1936                     intel_encoder->type, pipe_name(pipe));
1937        }
1938
1939        I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
1940}
1941
1942void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
1943                                       enum transcoder cpu_transcoder)
1944{
1945        uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
1946        uint32_t val = I915_READ(reg);
1947
1948        val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK | TRANS_DDI_DP_VC_PAYLOAD_ALLOC);
1949        val |= TRANS_DDI_PORT_NONE;
1950        I915_WRITE(reg, val);
1951}
1952
1953bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector)
1954{
1955        struct drm_device *dev = intel_connector->base.dev;
1956        struct drm_i915_private *dev_priv = dev->dev_private;
1957        struct intel_encoder *intel_encoder = intel_connector->encoder;
1958        int type = intel_connector->base.connector_type;
1959        enum port port = intel_ddi_get_encoder_port(intel_encoder);
1960        enum pipe pipe = 0;
1961        enum transcoder cpu_transcoder;
1962        enum intel_display_power_domain power_domain;
1963        uint32_t tmp;
1964
1965        power_domain = intel_display_port_power_domain(intel_encoder);
1966        if (!intel_display_power_is_enabled(dev_priv, power_domain))
1967                return false;
1968
1969        if (!intel_encoder->get_hw_state(intel_encoder, &pipe))
1970                return false;
1971
1972        if (port == PORT_A)
1973                cpu_transcoder = TRANSCODER_EDP;
1974        else
1975                cpu_transcoder = (enum transcoder) pipe;
1976
1977        tmp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1978
1979        switch (tmp & TRANS_DDI_MODE_SELECT_MASK) {
1980        case TRANS_DDI_MODE_SELECT_HDMI:
1981        case TRANS_DDI_MODE_SELECT_DVI:
1982                return (type == DRM_MODE_CONNECTOR_HDMIA);
1983
1984        case TRANS_DDI_MODE_SELECT_DP_SST:
1985                if (type == DRM_MODE_CONNECTOR_eDP)
1986                        return true;
1987                return (type == DRM_MODE_CONNECTOR_DisplayPort);
1988        case TRANS_DDI_MODE_SELECT_DP_MST:
1989                /* if the transcoder is in MST state then
1990                 * connector isn't connected */
1991                return false;
1992
1993        case TRANS_DDI_MODE_SELECT_FDI:
1994                return (type == DRM_MODE_CONNECTOR_VGA);
1995
1996        default:
1997                return false;
1998        }
1999}
2000
2001bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
2002                            enum pipe *pipe)
2003{
2004        struct drm_device *dev = encoder->base.dev;
2005        struct drm_i915_private *dev_priv = dev->dev_private;
2006        enum port port = intel_ddi_get_encoder_port(encoder);
2007        enum intel_display_power_domain power_domain;
2008        u32 tmp;
2009        int i;
2010
2011        power_domain = intel_display_port_power_domain(encoder);
2012        if (!intel_display_power_is_enabled(dev_priv, power_domain))
2013                return false;
2014
2015        tmp = I915_READ(DDI_BUF_CTL(port));
2016
2017        if (!(tmp & DDI_BUF_CTL_ENABLE))
2018                return false;
2019
2020        if (port == PORT_A) {
2021                tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
2022
2023                switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
2024                case TRANS_DDI_EDP_INPUT_A_ON:
2025                case TRANS_DDI_EDP_INPUT_A_ONOFF:
2026                        *pipe = PIPE_A;
2027                        break;
2028                case TRANS_DDI_EDP_INPUT_B_ONOFF:
2029                        *pipe = PIPE_B;
2030                        break;
2031                case TRANS_DDI_EDP_INPUT_C_ONOFF:
2032                        *pipe = PIPE_C;
2033                        break;
2034                }
2035
2036                return true;
2037        } else {
2038                for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
2039                        tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
2040
2041                        if ((tmp & TRANS_DDI_PORT_MASK)
2042                            == TRANS_DDI_SELECT_PORT(port)) {
2043                                if ((tmp & TRANS_DDI_MODE_SELECT_MASK) == TRANS_DDI_MODE_SELECT_DP_MST)
2044                                        return false;
2045
2046                                *pipe = i;
2047                                return true;
2048                        }
2049                }
2050        }
2051
2052        DRM_DEBUG_KMS("No pipe for ddi port %c found\n", port_name(port));
2053
2054        return false;
2055}
2056
2057void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
2058{
2059        struct drm_crtc *crtc = &intel_crtc->base;
2060        struct drm_device *dev = crtc->dev;
2061        struct drm_i915_private *dev_priv = dev->dev_private;
2062        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
2063        enum port port = intel_ddi_get_encoder_port(intel_encoder);
2064        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
2065
2066        if (cpu_transcoder != TRANSCODER_EDP)
2067                I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
2068                           TRANS_CLK_SEL_PORT(port));
2069}
2070
2071void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
2072{
2073        struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
2074        enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
2075
2076        if (cpu_transcoder != TRANSCODER_EDP)
2077                I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
2078                           TRANS_CLK_SEL_DISABLED);
2079}
2080
2081static void skl_ddi_set_iboost(struct drm_device *dev, u32 level,
2082                               enum port port, int type)
2083{
2084        struct drm_i915_private *dev_priv = dev->dev_private;
2085        const struct ddi_buf_trans *ddi_translations;
2086        uint8_t iboost;
2087        uint8_t dp_iboost, hdmi_iboost;
2088        int n_entries;
2089        u32 reg;
2090
2091        /* VBT may override standard boost values */
2092        dp_iboost = dev_priv->vbt.ddi_port_info[port].dp_boost_level;
2093        hdmi_iboost = dev_priv->vbt.ddi_port_info[port].hdmi_boost_level;
2094
2095        if (type == INTEL_OUTPUT_DISPLAYPORT) {
2096                if (dp_iboost) {
2097                        iboost = dp_iboost;
2098                } else {
2099                        ddi_translations = skl_get_buf_trans_dp(dev, &n_entries);
2100                        iboost = ddi_translations[port].i_boost;
2101                }
2102        } else if (type == INTEL_OUTPUT_EDP) {
2103                if (dp_iboost) {
2104                        iboost = dp_iboost;
2105                } else {
2106                        ddi_translations = skl_get_buf_trans_edp(dev, &n_entries);
2107                        iboost = ddi_translations[port].i_boost;
2108                }
2109        } else if (type == INTEL_OUTPUT_HDMI) {
2110                if (hdmi_iboost) {
2111                        iboost = hdmi_iboost;
2112                } else {
2113                        ddi_translations = skl_get_buf_trans_hdmi(dev, &n_entries);
2114                        iboost = ddi_translations[port].i_boost;
2115                }
2116        } else {
2117                return;
2118        }
2119
2120        /* Make sure that the requested I_boost is valid */
2121        if (iboost && iboost != 0x1 && iboost != 0x3 && iboost != 0x7) {
2122                DRM_ERROR("Invalid I_boost value %u\n", iboost);
2123                return;
2124        }
2125
2126        reg = I915_READ(DISPIO_CR_TX_BMU_CR0);
2127        reg &= ~BALANCE_LEG_MASK(port);
2128        reg &= ~(1 << (BALANCE_LEG_DISABLE_SHIFT + port));
2129
2130        if (iboost)
2131                reg |= iboost << BALANCE_LEG_SHIFT(port);
2132        else
2133                reg |= 1 << (BALANCE_LEG_DISABLE_SHIFT + port);
2134
2135        I915_WRITE(DISPIO_CR_TX_BMU_CR0, reg);
2136}
2137
2138static void bxt_ddi_vswing_sequence(struct drm_device *dev, u32 level,
2139                                    enum port port, int type)
2140{
2141        struct drm_i915_private *dev_priv = dev->dev_private;
2142        const struct bxt_ddi_buf_trans *ddi_translations;
2143        u32 n_entries, i;
2144        uint32_t val;
2145
2146        if (type == INTEL_OUTPUT_EDP && dev_priv->edp_low_vswing) {
2147                n_entries = ARRAY_SIZE(bxt_ddi_translations_edp);
2148                ddi_translations = bxt_ddi_translations_edp;
2149        } else if (type == INTEL_OUTPUT_DISPLAYPORT
2150                        || type == INTEL_OUTPUT_EDP) {
2151                n_entries = ARRAY_SIZE(bxt_ddi_translations_dp);
2152                ddi_translations = bxt_ddi_translations_dp;
2153        } else if (type == INTEL_OUTPUT_HDMI) {
2154                n_entries = ARRAY_SIZE(bxt_ddi_translations_hdmi);
2155                ddi_translations = bxt_ddi_translations_hdmi;
2156        } else {
2157                DRM_DEBUG_KMS("Vswing programming not done for encoder %d\n",
2158                                type);
2159                return;
2160        }
2161
2162        /* Check if default value has to be used */
2163        if (level >= n_entries ||
2164            (type == INTEL_OUTPUT_HDMI && level == HDMI_LEVEL_SHIFT_UNKNOWN)) {
2165                for (i = 0; i < n_entries; i++) {
2166                        if (ddi_translations[i].default_index) {
2167                                level = i;
2168                                break;
2169                        }
2170                }
2171        }
2172
2173        /*
2174         * While we write to the group register to program all lanes at once we
2175         * can read only lane registers and we pick lanes 0/1 for that.
2176         */
2177        val = I915_READ(BXT_PORT_PCS_DW10_LN01(port));
2178        val &= ~(TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT);
2179        I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val);
2180
2181        val = I915_READ(BXT_PORT_TX_DW2_LN0(port));
2182        val &= ~(MARGIN_000 | UNIQ_TRANS_SCALE);
2183        val |= ddi_translations[level].margin << MARGIN_000_SHIFT |
2184               ddi_translations[level].scale << UNIQ_TRANS_SCALE_SHIFT;
2185        I915_WRITE(BXT_PORT_TX_DW2_GRP(port), val);
2186
2187        val = I915_READ(BXT_PORT_TX_DW3_LN0(port));
2188        val &= ~SCALE_DCOMP_METHOD;
2189        if (ddi_translations[level].enable)
2190                val |= SCALE_DCOMP_METHOD;
2191
2192        if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
2193                DRM_ERROR("Disabled scaling while ouniqetrangenmethod was set");
2194
2195        I915_WRITE(BXT_PORT_TX_DW3_GRP(port), val);
2196
2197        val = I915_READ(BXT_PORT_TX_DW4_LN0(port));
2198        val &= ~DE_EMPHASIS;
2199        val |= ddi_translations[level].deemphasis << DEEMPH_SHIFT;
2200        I915_WRITE(BXT_PORT_TX_DW4_GRP(port), val);
2201
2202        val = I915_READ(BXT_PORT_PCS_DW10_LN01(port));
2203        val |= TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT;
2204        I915_WRITE(BXT_PORT_PCS_DW10_GRP(port), val);
2205}
2206
2207static uint32_t translate_signal_level(int signal_levels)
2208{
2209        uint32_t level;
2210
2211        switch (signal_levels) {
2212        default:
2213                DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level: 0x%x\n",
2214                              signal_levels);
2215        case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2216                level = 0;
2217                break;
2218        case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
2219                level = 1;
2220                break;
2221        case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
2222                level = 2;
2223                break;
2224        case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
2225                level = 3;
2226                break;
2227
2228        case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2229                level = 4;
2230                break;
2231        case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
2232                level = 5;
2233                break;
2234        case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
2235                level = 6;
2236                break;
2237
2238        case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2239                level = 7;
2240                break;
2241        case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
2242                level = 8;
2243                break;
2244
2245        case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
2246                level = 9;
2247                break;
2248        }
2249
2250        return level;
2251}
2252
2253uint32_t ddi_signal_levels(struct intel_dp *intel_dp)
2254{
2255        struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
2256        struct drm_device *dev = dport->base.base.dev;
2257        struct intel_encoder *encoder = &dport->base;
2258        uint8_t train_set = intel_dp->train_set[0];
2259        int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
2260                                         DP_TRAIN_PRE_EMPHASIS_MASK);
2261        enum port port = dport->port;
2262        uint32_t level;
2263
2264        level = translate_signal_level(signal_levels);
2265
2266        if (IS_SKYLAKE(dev))
2267                skl_ddi_set_iboost(dev, level, port, encoder->type);
2268        else if (IS_BROXTON(dev))
2269                bxt_ddi_vswing_sequence(dev, level, port, encoder->type);
2270
2271        return DDI_BUF_TRANS_SELECT(level);
2272}
2273
2274static void intel_ddi_pre_enable(struct intel_encoder *intel_encoder)
2275{
2276        struct drm_encoder *encoder = &intel_encoder->base;
2277        struct drm_device *dev = encoder->dev;
2278        struct drm_i915_private *dev_priv = dev->dev_private;
2279        struct intel_crtc *crtc = to_intel_crtc(encoder->crtc);
2280        enum port port = intel_ddi_get_encoder_port(intel_encoder);
2281        int type = intel_encoder->type;
2282        int hdmi_level;
2283
2284        if (type == INTEL_OUTPUT_EDP) {
2285                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2286                intel_edp_panel_on(intel_dp);
2287        }
2288
2289        if (IS_SKYLAKE(dev)) {
2290                uint32_t dpll = crtc->config->ddi_pll_sel;
2291                uint32_t val;
2292
2293                /*
2294                 * DPLL0 is used for eDP and is the only "private" DPLL (as
2295                 * opposed to shared) on SKL
2296                 */
2297                if (type == INTEL_OUTPUT_EDP) {
2298                        WARN_ON(dpll != SKL_DPLL0);
2299
2300                        val = I915_READ(DPLL_CTRL1);
2301
2302                        val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) |
2303                                 DPLL_CTRL1_SSC(dpll) |
2304                                 DPLL_CTRL1_LINK_RATE_MASK(dpll));
2305                        val |= crtc->config->dpll_hw_state.ctrl1 << (dpll * 6);
2306
2307                        I915_WRITE(DPLL_CTRL1, val);
2308                        POSTING_READ(DPLL_CTRL1);
2309                }
2310
2311                /* DDI -> PLL mapping  */
2312                val = I915_READ(DPLL_CTRL2);
2313
2314                val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) |
2315                        DPLL_CTRL2_DDI_CLK_SEL_MASK(port));
2316                val |= (DPLL_CTRL2_DDI_CLK_SEL(dpll, port) |
2317                        DPLL_CTRL2_DDI_SEL_OVERRIDE(port));
2318
2319                I915_WRITE(DPLL_CTRL2, val);
2320
2321        } else if (INTEL_INFO(dev)->gen < 9) {
2322                WARN_ON(crtc->config->ddi_pll_sel == PORT_CLK_SEL_NONE);
2323                I915_WRITE(PORT_CLK_SEL(port), crtc->config->ddi_pll_sel);
2324        }
2325
2326        if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
2327                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2328
2329                intel_dp_set_link_params(intel_dp, crtc->config);
2330
2331                intel_ddi_init_dp_buf_reg(intel_encoder);
2332
2333                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_ON);
2334                intel_dp_start_link_train(intel_dp);
2335                if (port != PORT_A || INTEL_INFO(dev)->gen >= 9)
2336                        intel_dp_stop_link_train(intel_dp);
2337        } else if (type == INTEL_OUTPUT_HDMI) {
2338                struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
2339
2340                if (IS_BROXTON(dev)) {
2341                        hdmi_level = dev_priv->vbt.
2342                                ddi_port_info[port].hdmi_level_shift;
2343                        bxt_ddi_vswing_sequence(dev, hdmi_level, port,
2344                                        INTEL_OUTPUT_HDMI);
2345                }
2346                intel_hdmi->set_infoframes(encoder,
2347                                           crtc->config->has_hdmi_sink,
2348                                           &crtc->config->base.adjusted_mode);
2349        }
2350}
2351
2352static void intel_ddi_post_disable(struct intel_encoder *intel_encoder)
2353{
2354        struct drm_encoder *encoder = &intel_encoder->base;
2355        struct drm_device *dev = encoder->dev;
2356        struct drm_i915_private *dev_priv = dev->dev_private;
2357        enum port port = intel_ddi_get_encoder_port(intel_encoder);
2358        int type = intel_encoder->type;
2359        uint32_t val;
2360        bool wait = false;
2361
2362        val = I915_READ(DDI_BUF_CTL(port));
2363        if (val & DDI_BUF_CTL_ENABLE) {
2364                val &= ~DDI_BUF_CTL_ENABLE;
2365                I915_WRITE(DDI_BUF_CTL(port), val);
2366                wait = true;
2367        }
2368
2369        val = I915_READ(DP_TP_CTL(port));
2370        val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
2371        val |= DP_TP_CTL_LINK_TRAIN_PAT1;
2372        I915_WRITE(DP_TP_CTL(port), val);
2373
2374        if (wait)
2375                intel_wait_ddi_buf_idle(dev_priv, port);
2376
2377        if (type == INTEL_OUTPUT_DISPLAYPORT || type == INTEL_OUTPUT_EDP) {
2378                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2379                intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
2380                intel_edp_panel_vdd_on(intel_dp);
2381                intel_edp_panel_off(intel_dp);
2382        }
2383
2384        if (IS_SKYLAKE(dev))
2385                I915_WRITE(DPLL_CTRL2, (I915_READ(DPLL_CTRL2) |
2386                                        DPLL_CTRL2_DDI_CLK_OFF(port)));
2387        else if (INTEL_INFO(dev)->gen < 9)
2388                I915_WRITE(PORT_CLK_SEL(port), PORT_CLK_SEL_NONE);
2389}
2390
2391static void intel_enable_ddi(struct intel_encoder *intel_encoder)
2392{
2393        struct drm_encoder *encoder = &intel_encoder->base;
2394        struct drm_crtc *crtc = encoder->crtc;
2395        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2396        struct drm_device *dev = encoder->dev;
2397        struct drm_i915_private *dev_priv = dev->dev_private;
2398        enum port port = intel_ddi_get_encoder_port(intel_encoder);
2399        int type = intel_encoder->type;
2400
2401        if (type == INTEL_OUTPUT_HDMI) {
2402                struct intel_digital_port *intel_dig_port =
2403                        enc_to_dig_port(encoder);
2404
2405                /* In HDMI/DVI mode, the port width, and swing/emphasis values
2406                 * are ignored so nothing special needs to be done besides
2407                 * enabling the port.
2408                 */
2409                I915_WRITE(DDI_BUF_CTL(port),
2410                           intel_dig_port->saved_port_bits |
2411                           DDI_BUF_CTL_ENABLE);
2412        } else if (type == INTEL_OUTPUT_EDP) {
2413                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2414
2415                if (port == PORT_A && INTEL_INFO(dev)->gen < 9)
2416                        intel_dp_stop_link_train(intel_dp);
2417
2418                intel_edp_backlight_on(intel_dp);
2419                intel_psr_enable(intel_dp);
2420                intel_edp_drrs_enable(intel_dp);
2421        }
2422
2423        if (intel_crtc->config->has_audio) {
2424                intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
2425                intel_audio_codec_enable(intel_encoder);
2426        }
2427}
2428
2429static void intel_disable_ddi(struct intel_encoder *intel_encoder)
2430{
2431        struct drm_encoder *encoder = &intel_encoder->base;
2432        struct drm_crtc *crtc = encoder->crtc;
2433        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
2434        int type = intel_encoder->type;
2435        struct drm_device *dev = encoder->dev;
2436        struct drm_i915_private *dev_priv = dev->dev_private;
2437
2438        if (intel_crtc->config->has_audio) {
2439                intel_audio_codec_disable(intel_encoder);
2440                intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
2441        }
2442
2443        if (type == INTEL_OUTPUT_EDP) {
2444                struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
2445
2446                intel_edp_drrs_disable(intel_dp);
2447                intel_psr_disable(intel_dp);
2448                intel_edp_backlight_off(intel_dp);
2449        }
2450}
2451
2452static void hsw_ddi_wrpll_enable(struct drm_i915_private *dev_priv,
2453                               struct intel_shared_dpll *pll)
2454{
2455        I915_WRITE(WRPLL_CTL(pll->id), pll->config.hw_state.wrpll);
2456        POSTING_READ(WRPLL_CTL(pll->id));
2457        udelay(20);
2458}
2459
2460static void hsw_ddi_spll_enable(struct drm_i915_private *dev_priv,
2461                                struct intel_shared_dpll *pll)
2462{
2463        I915_WRITE(SPLL_CTL, pll->config.hw_state.spll);
2464        POSTING_READ(SPLL_CTL);
2465        udelay(20);
2466}
2467
2468static void hsw_ddi_wrpll_disable(struct drm_i915_private *dev_priv,
2469                                  struct intel_shared_dpll *pll)
2470{
2471        uint32_t val;
2472
2473        val = I915_READ(WRPLL_CTL(pll->id));
2474        I915_WRITE(WRPLL_CTL(pll->id), val & ~WRPLL_PLL_ENABLE);
2475        POSTING_READ(WRPLL_CTL(pll->id));
2476}
2477
2478static void hsw_ddi_spll_disable(struct drm_i915_private *dev_priv,
2479                                 struct intel_shared_dpll *pll)
2480{
2481        uint32_t val;
2482
2483        val = I915_READ(SPLL_CTL);
2484        I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
2485        POSTING_READ(SPLL_CTL);
2486}
2487
2488static bool hsw_ddi_wrpll_get_hw_state(struct drm_i915_private *dev_priv,
2489                                       struct intel_shared_dpll *pll,
2490                                       struct intel_dpll_hw_state *hw_state)
2491{
2492        uint32_t val;
2493
2494        if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2495                return false;
2496
2497        val = I915_READ(WRPLL_CTL(pll->id));
2498        hw_state->wrpll = val;
2499
2500        return val & WRPLL_PLL_ENABLE;
2501}
2502
2503static bool hsw_ddi_spll_get_hw_state(struct drm_i915_private *dev_priv,
2504                                      struct intel_shared_dpll *pll,
2505                                      struct intel_dpll_hw_state *hw_state)
2506{
2507        uint32_t val;
2508
2509        if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2510                return false;
2511
2512        val = I915_READ(SPLL_CTL);
2513        hw_state->spll = val;
2514
2515        return val & SPLL_PLL_ENABLE;
2516}
2517
2518
2519static const char * const hsw_ddi_pll_names[] = {
2520        "WRPLL 1",
2521        "WRPLL 2",
2522        "SPLL"
2523};
2524
2525static void hsw_shared_dplls_init(struct drm_i915_private *dev_priv)
2526{
2527        int i;
2528
2529        dev_priv->num_shared_dpll = 3;
2530
2531        for (i = 0; i < 2; i++) {
2532                dev_priv->shared_dplls[i].id = i;
2533                dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
2534                dev_priv->shared_dplls[i].disable = hsw_ddi_wrpll_disable;
2535                dev_priv->shared_dplls[i].enable = hsw_ddi_wrpll_enable;
2536                dev_priv->shared_dplls[i].get_hw_state =
2537                        hsw_ddi_wrpll_get_hw_state;
2538        }
2539
2540        /* SPLL is special, but needs to be initialized anyway.. */
2541        dev_priv->shared_dplls[i].id = i;
2542        dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
2543        dev_priv->shared_dplls[i].disable = hsw_ddi_spll_disable;
2544        dev_priv->shared_dplls[i].enable = hsw_ddi_spll_enable;
2545        dev_priv->shared_dplls[i].get_hw_state = hsw_ddi_spll_get_hw_state;
2546
2547}
2548
2549static const char * const skl_ddi_pll_names[] = {
2550        "DPLL 1",
2551        "DPLL 2",
2552        "DPLL 3",
2553};
2554
2555struct skl_dpll_regs {
2556        u32 ctl, cfgcr1, cfgcr2;
2557};
2558
2559/* this array is indexed by the *shared* pll id */
2560static const struct skl_dpll_regs skl_dpll_regs[3] = {
2561        {
2562                /* DPLL 1 */
2563                .ctl = LCPLL2_CTL,
2564                .cfgcr1 = DPLL_CFGCR1(SKL_DPLL1),
2565                .cfgcr2 = DPLL_CFGCR2(SKL_DPLL1),
2566        },
2567        {
2568                /* DPLL 2 */
2569                .ctl = WRPLL_CTL1,
2570                .cfgcr1 = DPLL_CFGCR1(SKL_DPLL2),
2571                .cfgcr2 = DPLL_CFGCR2(SKL_DPLL2),
2572        },
2573        {
2574                /* DPLL 3 */
2575                .ctl = WRPLL_CTL2,
2576                .cfgcr1 = DPLL_CFGCR1(SKL_DPLL3),
2577                .cfgcr2 = DPLL_CFGCR2(SKL_DPLL3),
2578        },
2579};
2580
2581static void skl_ddi_pll_enable(struct drm_i915_private *dev_priv,
2582                               struct intel_shared_dpll *pll)
2583{
2584        uint32_t val;
2585        unsigned int dpll;
2586        const struct skl_dpll_regs *regs = skl_dpll_regs;
2587
2588        /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
2589        dpll = pll->id + 1;
2590
2591        val = I915_READ(DPLL_CTRL1);
2592
2593        val &= ~(DPLL_CTRL1_HDMI_MODE(dpll) | DPLL_CTRL1_SSC(dpll) |
2594                 DPLL_CTRL1_LINK_RATE_MASK(dpll));
2595        val |= pll->config.hw_state.ctrl1 << (dpll * 6);
2596
2597        I915_WRITE(DPLL_CTRL1, val);
2598        POSTING_READ(DPLL_CTRL1);
2599
2600        I915_WRITE(regs[pll->id].cfgcr1, pll->config.hw_state.cfgcr1);
2601        I915_WRITE(regs[pll->id].cfgcr2, pll->config.hw_state.cfgcr2);
2602        POSTING_READ(regs[pll->id].cfgcr1);
2603        POSTING_READ(regs[pll->id].cfgcr2);
2604
2605        /* the enable bit is always bit 31 */
2606        I915_WRITE(regs[pll->id].ctl,
2607                   I915_READ(regs[pll->id].ctl) | LCPLL_PLL_ENABLE);
2608
2609        if (wait_for(I915_READ(DPLL_STATUS) & DPLL_LOCK(dpll), 5))
2610                DRM_ERROR("DPLL %d not locked\n", dpll);
2611}
2612
2613static void skl_ddi_pll_disable(struct drm_i915_private *dev_priv,
2614                                struct intel_shared_dpll *pll)
2615{
2616        const struct skl_dpll_regs *regs = skl_dpll_regs;
2617
2618        /* the enable bit is always bit 31 */
2619        I915_WRITE(regs[pll->id].ctl,
2620                   I915_READ(regs[pll->id].ctl) & ~LCPLL_PLL_ENABLE);
2621        POSTING_READ(regs[pll->id].ctl);
2622}
2623
2624static bool skl_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2625                                     struct intel_shared_dpll *pll,
2626                                     struct intel_dpll_hw_state *hw_state)
2627{
2628        uint32_t val;
2629        unsigned int dpll;
2630        const struct skl_dpll_regs *regs = skl_dpll_regs;
2631
2632        if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2633                return false;
2634
2635        /* DPLL0 is not part of the shared DPLLs, so pll->id is 0 for DPLL1 */
2636        dpll = pll->id + 1;
2637
2638        val = I915_READ(regs[pll->id].ctl);
2639        if (!(val & LCPLL_PLL_ENABLE))
2640                return false;
2641
2642        val = I915_READ(DPLL_CTRL1);
2643        hw_state->ctrl1 = (val >> (dpll * 6)) & 0x3f;
2644
2645        /* avoid reading back stale values if HDMI mode is not enabled */
2646        if (val & DPLL_CTRL1_HDMI_MODE(dpll)) {
2647                hw_state->cfgcr1 = I915_READ(regs[pll->id].cfgcr1);
2648                hw_state->cfgcr2 = I915_READ(regs[pll->id].cfgcr2);
2649        }
2650
2651        return true;
2652}
2653
2654static void skl_shared_dplls_init(struct drm_i915_private *dev_priv)
2655{
2656        int i;
2657
2658        dev_priv->num_shared_dpll = 3;
2659
2660        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
2661                dev_priv->shared_dplls[i].id = i;
2662                dev_priv->shared_dplls[i].name = skl_ddi_pll_names[i];
2663                dev_priv->shared_dplls[i].disable = skl_ddi_pll_disable;
2664                dev_priv->shared_dplls[i].enable = skl_ddi_pll_enable;
2665                dev_priv->shared_dplls[i].get_hw_state =
2666                        skl_ddi_pll_get_hw_state;
2667        }
2668}
2669
2670static void broxton_phy_init(struct drm_i915_private *dev_priv,
2671                             enum dpio_phy phy)
2672{
2673        enum port port;
2674        uint32_t val;
2675
2676        val = I915_READ(BXT_P_CR_GT_DISP_PWRON);
2677        val |= GT_DISPLAY_POWER_ON(phy);
2678        I915_WRITE(BXT_P_CR_GT_DISP_PWRON, val);
2679
2680        /* Considering 10ms timeout until BSpec is updated */
2681        if (wait_for(I915_READ(BXT_PORT_CL1CM_DW0(phy)) & PHY_POWER_GOOD, 10))
2682                DRM_ERROR("timeout during PHY%d power on\n", phy);
2683
2684        for (port =  (phy == DPIO_PHY0 ? PORT_B : PORT_A);
2685             port <= (phy == DPIO_PHY0 ? PORT_C : PORT_A); port++) {
2686                int lane;
2687
2688                for (lane = 0; lane < 4; lane++) {
2689                        val = I915_READ(BXT_PORT_TX_DW14_LN(port, lane));
2690                        /*
2691                         * Note that on CHV this flag is called UPAR, but has
2692                         * the same function.
2693                         */
2694                        val &= ~LATENCY_OPTIM;
2695                        if (lane != 1)
2696                                val |= LATENCY_OPTIM;
2697
2698                        I915_WRITE(BXT_PORT_TX_DW14_LN(port, lane), val);
2699                }
2700        }
2701
2702        /* Program PLL Rcomp code offset */
2703        val = I915_READ(BXT_PORT_CL1CM_DW9(phy));
2704        val &= ~IREF0RC_OFFSET_MASK;
2705        val |= 0xE4 << IREF0RC_OFFSET_SHIFT;
2706        I915_WRITE(BXT_PORT_CL1CM_DW9(phy), val);
2707
2708        val = I915_READ(BXT_PORT_CL1CM_DW10(phy));
2709        val &= ~IREF1RC_OFFSET_MASK;
2710        val |= 0xE4 << IREF1RC_OFFSET_SHIFT;
2711        I915_WRITE(BXT_PORT_CL1CM_DW10(phy), val);
2712
2713        /* Program power gating */
2714        val = I915_READ(BXT_PORT_CL1CM_DW28(phy));
2715        val |= OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN |
2716                SUS_CLK_CONFIG;
2717        I915_WRITE(BXT_PORT_CL1CM_DW28(phy), val);
2718
2719        if (phy == DPIO_PHY0) {
2720                val = I915_READ(BXT_PORT_CL2CM_DW6_BC);
2721                val |= DW6_OLDO_DYN_PWR_DOWN_EN;
2722                I915_WRITE(BXT_PORT_CL2CM_DW6_BC, val);
2723        }
2724
2725        val = I915_READ(BXT_PORT_CL1CM_DW30(phy));
2726        val &= ~OCL2_LDOFUSE_PWR_DIS;
2727        /*
2728         * On PHY1 disable power on the second channel, since no port is
2729         * connected there. On PHY0 both channels have a port, so leave it
2730         * enabled.
2731         * TODO: port C is only connected on BXT-P, so on BXT0/1 we should
2732         * power down the second channel on PHY0 as well.
2733         */
2734        if (phy == DPIO_PHY1)
2735                val |= OCL2_LDOFUSE_PWR_DIS;
2736        I915_WRITE(BXT_PORT_CL1CM_DW30(phy), val);
2737
2738        if (phy == DPIO_PHY0) {
2739                uint32_t grc_code;
2740                /*
2741                 * PHY0 isn't connected to an RCOMP resistor so copy over
2742                 * the corresponding calibrated value from PHY1, and disable
2743                 * the automatic calibration on PHY0.
2744                 */
2745                if (wait_for(I915_READ(BXT_PORT_REF_DW3(DPIO_PHY1)) & GRC_DONE,
2746                             10))
2747                        DRM_ERROR("timeout waiting for PHY1 GRC\n");
2748
2749                val = I915_READ(BXT_PORT_REF_DW6(DPIO_PHY1));
2750                val = (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
2751                grc_code = val << GRC_CODE_FAST_SHIFT |
2752                           val << GRC_CODE_SLOW_SHIFT |
2753                           val;
2754                I915_WRITE(BXT_PORT_REF_DW6(DPIO_PHY0), grc_code);
2755
2756                val = I915_READ(BXT_PORT_REF_DW8(DPIO_PHY0));
2757                val |= GRC_DIS | GRC_RDY_OVRD;
2758                I915_WRITE(BXT_PORT_REF_DW8(DPIO_PHY0), val);
2759        }
2760
2761        val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
2762        val |= COMMON_RESET_DIS;
2763        I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
2764}
2765
2766void broxton_ddi_phy_init(struct drm_device *dev)
2767{
2768        /* Enable PHY1 first since it provides Rcomp for PHY0 */
2769        broxton_phy_init(dev->dev_private, DPIO_PHY1);
2770        broxton_phy_init(dev->dev_private, DPIO_PHY0);
2771}
2772
2773static void broxton_phy_uninit(struct drm_i915_private *dev_priv,
2774                               enum dpio_phy phy)
2775{
2776        uint32_t val;
2777
2778        val = I915_READ(BXT_PHY_CTL_FAMILY(phy));
2779        val &= ~COMMON_RESET_DIS;
2780        I915_WRITE(BXT_PHY_CTL_FAMILY(phy), val);
2781}
2782
2783void broxton_ddi_phy_uninit(struct drm_device *dev)
2784{
2785        struct drm_i915_private *dev_priv = dev->dev_private;
2786
2787        broxton_phy_uninit(dev_priv, DPIO_PHY1);
2788        broxton_phy_uninit(dev_priv, DPIO_PHY0);
2789
2790        /* FIXME: do this in broxton_phy_uninit per phy */
2791        I915_WRITE(BXT_P_CR_GT_DISP_PWRON, 0);
2792}
2793
2794static const char * const bxt_ddi_pll_names[] = {
2795        "PORT PLL A",
2796        "PORT PLL B",
2797        "PORT PLL C",
2798};
2799
2800static void bxt_ddi_pll_enable(struct drm_i915_private *dev_priv,
2801                                struct intel_shared_dpll *pll)
2802{
2803        uint32_t temp;
2804        enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
2805
2806        temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2807        temp &= ~PORT_PLL_REF_SEL;
2808        /* Non-SSC reference */
2809        I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2810
2811        /* Disable 10 bit clock */
2812        temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
2813        temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
2814        I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2815
2816        /* Write P1 & P2 */
2817        temp = I915_READ(BXT_PORT_PLL_EBB_0(port));
2818        temp &= ~(PORT_PLL_P1_MASK | PORT_PLL_P2_MASK);
2819        temp |= pll->config.hw_state.ebb0;
2820        I915_WRITE(BXT_PORT_PLL_EBB_0(port), temp);
2821
2822        /* Write M2 integer */
2823        temp = I915_READ(BXT_PORT_PLL(port, 0));
2824        temp &= ~PORT_PLL_M2_MASK;
2825        temp |= pll->config.hw_state.pll0;
2826        I915_WRITE(BXT_PORT_PLL(port, 0), temp);
2827
2828        /* Write N */
2829        temp = I915_READ(BXT_PORT_PLL(port, 1));
2830        temp &= ~PORT_PLL_N_MASK;
2831        temp |= pll->config.hw_state.pll1;
2832        I915_WRITE(BXT_PORT_PLL(port, 1), temp);
2833
2834        /* Write M2 fraction */
2835        temp = I915_READ(BXT_PORT_PLL(port, 2));
2836        temp &= ~PORT_PLL_M2_FRAC_MASK;
2837        temp |= pll->config.hw_state.pll2;
2838        I915_WRITE(BXT_PORT_PLL(port, 2), temp);
2839
2840        /* Write M2 fraction enable */
2841        temp = I915_READ(BXT_PORT_PLL(port, 3));
2842        temp &= ~PORT_PLL_M2_FRAC_ENABLE;
2843        temp |= pll->config.hw_state.pll3;
2844        I915_WRITE(BXT_PORT_PLL(port, 3), temp);
2845
2846        /* Write coeff */
2847        temp = I915_READ(BXT_PORT_PLL(port, 6));
2848        temp &= ~PORT_PLL_PROP_COEFF_MASK;
2849        temp &= ~PORT_PLL_INT_COEFF_MASK;
2850        temp &= ~PORT_PLL_GAIN_CTL_MASK;
2851        temp |= pll->config.hw_state.pll6;
2852        I915_WRITE(BXT_PORT_PLL(port, 6), temp);
2853
2854        /* Write calibration val */
2855        temp = I915_READ(BXT_PORT_PLL(port, 8));
2856        temp &= ~PORT_PLL_TARGET_CNT_MASK;
2857        temp |= pll->config.hw_state.pll8;
2858        I915_WRITE(BXT_PORT_PLL(port, 8), temp);
2859
2860        temp = I915_READ(BXT_PORT_PLL(port, 9));
2861        temp &= ~PORT_PLL_LOCK_THRESHOLD_MASK;
2862        temp |= pll->config.hw_state.pll9;
2863        I915_WRITE(BXT_PORT_PLL(port, 9), temp);
2864
2865        temp = I915_READ(BXT_PORT_PLL(port, 10));
2866        temp &= ~PORT_PLL_DCO_AMP_OVR_EN_H;
2867        temp &= ~PORT_PLL_DCO_AMP_MASK;
2868        temp |= pll->config.hw_state.pll10;
2869        I915_WRITE(BXT_PORT_PLL(port, 10), temp);
2870
2871        /* Recalibrate with new settings */
2872        temp = I915_READ(BXT_PORT_PLL_EBB_4(port));
2873        temp |= PORT_PLL_RECALIBRATE;
2874        I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2875        temp &= ~PORT_PLL_10BIT_CLK_ENABLE;
2876        temp |= pll->config.hw_state.ebb4;
2877        I915_WRITE(BXT_PORT_PLL_EBB_4(port), temp);
2878
2879        /* Enable PLL */
2880        temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2881        temp |= PORT_PLL_ENABLE;
2882        I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2883        POSTING_READ(BXT_PORT_PLL_ENABLE(port));
2884
2885        if (wait_for_atomic_us((I915_READ(BXT_PORT_PLL_ENABLE(port)) &
2886                        PORT_PLL_LOCK), 200))
2887                DRM_ERROR("PLL %d not locked\n", port);
2888
2889        /*
2890         * While we write to the group register to program all lanes at once we
2891         * can read only lane registers and we pick lanes 0/1 for that.
2892         */
2893        temp = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
2894        temp &= ~LANE_STAGGER_MASK;
2895        temp &= ~LANESTAGGER_STRAP_OVRD;
2896        temp |= pll->config.hw_state.pcsdw12;
2897        I915_WRITE(BXT_PORT_PCS_DW12_GRP(port), temp);
2898}
2899
2900static void bxt_ddi_pll_disable(struct drm_i915_private *dev_priv,
2901                                        struct intel_shared_dpll *pll)
2902{
2903        enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
2904        uint32_t temp;
2905
2906        temp = I915_READ(BXT_PORT_PLL_ENABLE(port));
2907        temp &= ~PORT_PLL_ENABLE;
2908        I915_WRITE(BXT_PORT_PLL_ENABLE(port), temp);
2909        POSTING_READ(BXT_PORT_PLL_ENABLE(port));
2910}
2911
2912static bool bxt_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
2913                                        struct intel_shared_dpll *pll,
2914                                        struct intel_dpll_hw_state *hw_state)
2915{
2916        enum port port = (enum port)pll->id;    /* 1:1 port->PLL mapping */
2917        uint32_t val;
2918
2919        if (!intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_PLLS))
2920                return false;
2921
2922        val = I915_READ(BXT_PORT_PLL_ENABLE(port));
2923        if (!(val & PORT_PLL_ENABLE))
2924                return false;
2925
2926        hw_state->ebb0 = I915_READ(BXT_PORT_PLL_EBB_0(port));
2927        hw_state->ebb0 &= PORT_PLL_P1_MASK | PORT_PLL_P2_MASK;
2928
2929        hw_state->ebb4 = I915_READ(BXT_PORT_PLL_EBB_4(port));
2930        hw_state->ebb4 &= PORT_PLL_10BIT_CLK_ENABLE;
2931
2932        hw_state->pll0 = I915_READ(BXT_PORT_PLL(port, 0));
2933        hw_state->pll0 &= PORT_PLL_M2_MASK;
2934
2935        hw_state->pll1 = I915_READ(BXT_PORT_PLL(port, 1));
2936        hw_state->pll1 &= PORT_PLL_N_MASK;
2937
2938        hw_state->pll2 = I915_READ(BXT_PORT_PLL(port, 2));
2939        hw_state->pll2 &= PORT_PLL_M2_FRAC_MASK;
2940
2941        hw_state->pll3 = I915_READ(BXT_PORT_PLL(port, 3));
2942        hw_state->pll3 &= PORT_PLL_M2_FRAC_ENABLE;
2943
2944        hw_state->pll6 = I915_READ(BXT_PORT_PLL(port, 6));
2945        hw_state->pll6 &= PORT_PLL_PROP_COEFF_MASK |
2946                          PORT_PLL_INT_COEFF_MASK |
2947                          PORT_PLL_GAIN_CTL_MASK;
2948
2949        hw_state->pll8 = I915_READ(BXT_PORT_PLL(port, 8));
2950        hw_state->pll8 &= PORT_PLL_TARGET_CNT_MASK;
2951
2952        hw_state->pll9 = I915_READ(BXT_PORT_PLL(port, 9));
2953        hw_state->pll9 &= PORT_PLL_LOCK_THRESHOLD_MASK;
2954
2955        hw_state->pll10 = I915_READ(BXT_PORT_PLL(port, 10));
2956        hw_state->pll10 &= PORT_PLL_DCO_AMP_OVR_EN_H |
2957                           PORT_PLL_DCO_AMP_MASK;
2958
2959        /*
2960         * While we write to the group register to program all lanes at once we
2961         * can read only lane registers. We configure all lanes the same way, so
2962         * here just read out lanes 0/1 and output a note if lanes 2/3 differ.
2963         */
2964        hw_state->pcsdw12 = I915_READ(BXT_PORT_PCS_DW12_LN01(port));
2965        if (I915_READ(BXT_PORT_PCS_DW12_LN23(port)) != hw_state->pcsdw12)
2966                DRM_DEBUG_DRIVER("lane stagger config different for lane 01 (%08x) and 23 (%08x)\n",
2967                                 hw_state->pcsdw12,
2968                                 I915_READ(BXT_PORT_PCS_DW12_LN23(port)));
2969        hw_state->pcsdw12 &= LANE_STAGGER_MASK | LANESTAGGER_STRAP_OVRD;
2970
2971        return true;
2972}
2973
2974static void bxt_shared_dplls_init(struct drm_i915_private *dev_priv)
2975{
2976        int i;
2977
2978        dev_priv->num_shared_dpll = 3;
2979
2980        for (i = 0; i < dev_priv->num_shared_dpll; i++) {
2981                dev_priv->shared_dplls[i].id = i;
2982                dev_priv->shared_dplls[i].name = bxt_ddi_pll_names[i];
2983                dev_priv->shared_dplls[i].disable = bxt_ddi_pll_disable;
2984                dev_priv->shared_dplls[i].enable = bxt_ddi_pll_enable;
2985                dev_priv->shared_dplls[i].get_hw_state =
2986                        bxt_ddi_pll_get_hw_state;
2987        }
2988}
2989
2990void intel_ddi_pll_init(struct drm_device *dev)
2991{
2992        struct drm_i915_private *dev_priv = dev->dev_private;
2993        uint32_t val = I915_READ(LCPLL_CTL);
2994
2995        if (IS_SKYLAKE(dev))
2996                skl_shared_dplls_init(dev_priv);
2997        else if (IS_BROXTON(dev))
2998                bxt_shared_dplls_init(dev_priv);
2999        else
3000                hsw_shared_dplls_init(dev_priv);
3001
3002        if (IS_SKYLAKE(dev)) {
3003                int cdclk_freq;
3004
3005                cdclk_freq = dev_priv->display.get_display_clock_speed(dev);
3006                dev_priv->skl_boot_cdclk = cdclk_freq;
3007                if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
3008                        DRM_ERROR("LCPLL1 is disabled\n");
3009                else
3010                        intel_display_power_get(dev_priv, POWER_DOMAIN_PLLS);
3011        } else if (IS_BROXTON(dev)) {
3012                broxton_init_cdclk(dev);
3013                broxton_ddi_phy_init(dev);
3014        } else {
3015                /*
3016                 * The LCPLL register should be turned on by the BIOS. For now
3017                 * let's just check its state and print errors in case
3018                 * something is wrong.  Don't even try to turn it on.
3019                 */
3020
3021                if (val & LCPLL_CD_SOURCE_FCLK)
3022                        DRM_ERROR("CDCLK source is not LCPLL\n");
3023
3024                if (val & LCPLL_PLL_DISABLE)
3025                        DRM_ERROR("LCPLL is disabled\n");
3026        }
3027}
3028
3029void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder)
3030{
3031        struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
3032        struct intel_dp *intel_dp = &intel_dig_port->dp;
3033        struct drm_i915_private *dev_priv = encoder->dev->dev_private;
3034        enum port port = intel_dig_port->port;
3035        uint32_t val;
3036        bool wait = false;
3037
3038        if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
3039                val = I915_READ(DDI_BUF_CTL(port));
3040                if (val & DDI_BUF_CTL_ENABLE) {
3041                        val &= ~DDI_BUF_CTL_ENABLE;
3042                        I915_WRITE(DDI_BUF_CTL(port), val);
3043                        wait = true;
3044                }
3045
3046                val = I915_READ(DP_TP_CTL(port));
3047                val &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK);
3048                val |= DP_TP_CTL_LINK_TRAIN_PAT1;
3049                I915_WRITE(DP_TP_CTL(port), val);
3050                POSTING_READ(DP_TP_CTL(port));
3051
3052                if (wait)
3053                        intel_wait_ddi_buf_idle(dev_priv, port);
3054        }
3055
3056        val = DP_TP_CTL_ENABLE |
3057              DP_TP_CTL_LINK_TRAIN_PAT1 | DP_TP_CTL_SCRAMBLE_DISABLE;
3058        if (intel_dp->is_mst)
3059                val |= DP_TP_CTL_MODE_MST;
3060        else {
3061                val |= DP_TP_CTL_MODE_SST;
3062                if (drm_dp_enhanced_frame_cap(intel_dp->dpcd))
3063                        val |= DP_TP_CTL_ENHANCED_FRAME_ENABLE;
3064        }
3065        I915_WRITE(DP_TP_CTL(port), val);
3066        POSTING_READ(DP_TP_CTL(port));
3067
3068        intel_dp->DP |= DDI_BUF_CTL_ENABLE;
3069        I915_WRITE(DDI_BUF_CTL(port), intel_dp->DP);
3070        POSTING_READ(DDI_BUF_CTL(port));
3071
3072        udelay(600);
3073}
3074
3075void intel_ddi_fdi_disable(struct drm_crtc *crtc)
3076{
3077        struct drm_i915_private *dev_priv = crtc->dev->dev_private;
3078        struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
3079        uint32_t val;
3080
3081        intel_ddi_post_disable(intel_encoder);
3082
3083        val = I915_READ(FDI_RX_CTL(PIPE_A));
3084        val &= ~FDI_RX_ENABLE;
3085        I915_WRITE(FDI_RX_CTL(PIPE_A), val);
3086
3087        val = I915_READ(FDI_RX_MISC(PIPE_A));
3088        val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK);
3089        val |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2);
3090        I915_WRITE(FDI_RX_MISC(PIPE_A), val);
3091
3092        val = I915_READ(FDI_RX_CTL(PIPE_A));
3093        val &= ~FDI_PCDCLK;
3094        I915_WRITE(FDI_RX_CTL(PIPE_A), val);
3095
3096        val = I915_READ(FDI_RX_CTL(PIPE_A));
3097        val &= ~FDI_RX_PLL_ENABLE;
3098        I915_WRITE(FDI_RX_CTL(PIPE_A), val);
3099}
3100
3101void intel_ddi_get_config(struct intel_encoder *encoder,
3102                          struct intel_crtc_state *pipe_config)
3103{
3104        struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
3105        struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
3106        enum transcoder cpu_transcoder = pipe_config->cpu_transcoder;
3107        struct intel_hdmi *intel_hdmi;
3108        u32 temp, flags = 0;
3109
3110        temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
3111        if (temp & TRANS_DDI_PHSYNC)
3112                flags |= DRM_MODE_FLAG_PHSYNC;
3113        else
3114                flags |= DRM_MODE_FLAG_NHSYNC;
3115        if (temp & TRANS_DDI_PVSYNC)
3116                flags |= DRM_MODE_FLAG_PVSYNC;
3117        else
3118                flags |= DRM_MODE_FLAG_NVSYNC;
3119
3120        pipe_config->base.adjusted_mode.flags |= flags;
3121
3122        switch (temp & TRANS_DDI_BPC_MASK) {
3123        case TRANS_DDI_BPC_6:
3124                pipe_config->pipe_bpp = 18;
3125                break;
3126        case TRANS_DDI_BPC_8:
3127                pipe_config->pipe_bpp = 24;
3128                break;
3129        case TRANS_DDI_BPC_10:
3130                pipe_config->pipe_bpp = 30;
3131                break;
3132        case TRANS_DDI_BPC_12:
3133                pipe_config->pipe_bpp = 36;
3134                break;
3135        default:
3136                break;
3137        }
3138
3139        switch (temp & TRANS_DDI_MODE_SELECT_MASK) {
3140        case TRANS_DDI_MODE_SELECT_HDMI:
3141                pipe_config->has_hdmi_sink = true;
3142                intel_hdmi = enc_to_intel_hdmi(&encoder->base);
3143
3144                if (intel_hdmi->infoframe_enabled(&encoder->base))
3145                        pipe_config->has_infoframe = true;
3146                break;
3147        case TRANS_DDI_MODE_SELECT_DVI:
3148        case TRANS_DDI_MODE_SELECT_FDI:
3149                break;
3150        case TRANS_DDI_MODE_SELECT_DP_SST:
3151        case TRANS_DDI_MODE_SELECT_DP_MST:
3152                pipe_config->has_dp_encoder = true;
3153                pipe_config->lane_count =
3154                        ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;
3155                intel_dp_get_m_n(intel_crtc, pipe_config);
3156                break;
3157        default:
3158                break;
3159        }
3160
3161        if (intel_display_power_is_enabled(dev_priv, POWER_DOMAIN_AUDIO)) {
3162                temp = I915_READ(HSW_AUD_PIN_ELD_CP_VLD);
3163                if (temp & AUDIO_OUTPUT_ENABLE(intel_crtc->pipe))
3164                        pipe_config->has_audio = true;
3165        }
3166
3167        if (encoder->type == INTEL_OUTPUT_EDP && dev_priv->vbt.edp_bpp &&
3168            pipe_config->pipe_bpp > dev_priv->vbt.edp_bpp) {
3169                /*
3170                 * This is a big fat ugly hack.
3171                 *
3172                 * Some machines in UEFI boot mode provide us a VBT that has 18
3173                 * bpp and 1.62 GHz link bandwidth for eDP, which for reasons
3174                 * unknown we fail to light up. Yet the same BIOS boots up with
3175                 * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as
3176                 * max, not what it tells us to use.
3177                 *
3178                 * Note: This will still be broken if the eDP panel is not lit
3179                 * up by the BIOS, and thus we can't get the mode at module
3180                 * load.
3181                 */
3182                DRM_DEBUG_KMS("pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n",
3183                              pipe_config->pipe_bpp, dev_priv->vbt.edp_bpp);
3184                dev_priv->vbt.edp_bpp = pipe_config->pipe_bpp;
3185        }
3186
3187        intel_ddi_clock_get(encoder, pipe_config);
3188}
3189
3190static void intel_ddi_destroy(struct drm_encoder *encoder)
3191{
3192        /* HDMI has nothing special to destroy, so we can go with this. */
3193        intel_dp_encoder_destroy(encoder);
3194}
3195
3196static bool intel_ddi_compute_config(struct intel_encoder *encoder,
3197                                     struct intel_crtc_state *pipe_config)
3198{
3199        int type = encoder->type;
3200        int port = intel_ddi_get_encoder_port(encoder);
3201
3202        WARN(type == INTEL_OUTPUT_UNKNOWN, "compute_config() on unknown output!\n");
3203
3204        if (port == PORT_A)
3205                pipe_config->cpu_transcoder = TRANSCODER_EDP;
3206
3207        if (type == INTEL_OUTPUT_HDMI)
3208                return intel_hdmi_compute_config(encoder, pipe_config);
3209        else
3210                return intel_dp_compute_config(encoder, pipe_config);
3211}
3212
3213static const struct drm_encoder_funcs intel_ddi_funcs = {
3214        .destroy = intel_ddi_destroy,
3215};
3216
3217static struct intel_connector *
3218intel_ddi_init_dp_connector(struct intel_digital_port *intel_dig_port)
3219{
3220        struct intel_connector *connector;
3221        enum port port = intel_dig_port->port;
3222
3223        connector = intel_connector_alloc();
3224        if (!connector)
3225                return NULL;
3226
3227        intel_dig_port->dp.output_reg = DDI_BUF_CTL(port);
3228        if (!intel_dp_init_connector(intel_dig_port, connector)) {
3229                kfree(connector);
3230                return NULL;
3231        }
3232
3233        return connector;
3234}
3235
3236static struct intel_connector *
3237intel_ddi_init_hdmi_connector(struct intel_digital_port *intel_dig_port)
3238{
3239        struct intel_connector *connector;
3240        enum port port = intel_dig_port->port;
3241
3242        connector = intel_connector_alloc();
3243        if (!connector)
3244                return NULL;
3245
3246        intel_dig_port->hdmi.hdmi_reg = DDI_BUF_CTL(port);
3247        intel_hdmi_init_connector(intel_dig_port, connector);
3248
3249        return connector;
3250}
3251
3252void intel_ddi_init(struct drm_device *dev, enum port port)
3253{
3254        struct drm_i915_private *dev_priv = dev->dev_private;
3255        struct intel_digital_port *intel_dig_port;
3256        struct intel_encoder *intel_encoder;
3257        struct drm_encoder *encoder;
3258        bool init_hdmi, init_dp;
3259
3260        init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
3261                     dev_priv->vbt.ddi_port_info[port].supports_hdmi);
3262        init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
3263        if (!init_dp && !init_hdmi) {
3264                DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, respect it\n",
3265                              port_name(port));
3266                return;
3267        }
3268
3269        intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
3270        if (!intel_dig_port)
3271                return;
3272
3273        intel_encoder = &intel_dig_port->base;
3274        encoder = &intel_encoder->base;
3275
3276        drm_encoder_init(dev, encoder, &intel_ddi_funcs,
3277                         DRM_MODE_ENCODER_TMDS);
3278
3279        intel_encoder->compute_config = intel_ddi_compute_config;
3280        intel_encoder->enable = intel_enable_ddi;
3281        intel_encoder->pre_enable = intel_ddi_pre_enable;
3282        intel_encoder->disable = intel_disable_ddi;
3283        intel_encoder->post_disable = intel_ddi_post_disable;
3284        intel_encoder->get_hw_state = intel_ddi_get_hw_state;
3285        intel_encoder->get_config = intel_ddi_get_config;
3286
3287        intel_dig_port->port = port;
3288        intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
3289                                          (DDI_BUF_PORT_REVERSAL |
3290                                           DDI_A_4_LANES);
3291
3292        intel_encoder->type = INTEL_OUTPUT_UNKNOWN;
3293        intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
3294        intel_encoder->cloneable = 0;
3295
3296        if (init_dp) {
3297                if (!intel_ddi_init_dp_connector(intel_dig_port))
3298                        goto err;
3299
3300                intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
3301                /*
3302                 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
3303                 * interrupts to check the external panel connection.
3304                 */
3305                if (IS_BROXTON(dev_priv) && (INTEL_REVID(dev) < BXT_REVID_B0)
3306                                         && port == PORT_B)
3307                        dev_priv->hotplug.irq_port[PORT_A] = intel_dig_port;
3308                else
3309                        dev_priv->hotplug.irq_port[port] = intel_dig_port;
3310        }
3311
3312        /* In theory we don't need the encoder->type check, but leave it just in
3313         * case we have some really bad VBTs... */
3314        if (intel_encoder->type != INTEL_OUTPUT_EDP && init_hdmi) {
3315                if (!intel_ddi_init_hdmi_connector(intel_dig_port))
3316                        goto err;
3317        }
3318
3319        return;
3320
3321err:
3322        drm_encoder_cleanup(encoder);
3323        kfree(intel_dig_port);
3324}
3325