linux/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_link_encoder.h
<<
>>
Prefs
   1/*
   2 * Copyright 2012-15 Advanced Micro Devices, Inc.
   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 shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: AMD
  23 *
  24 */
  25
  26#ifndef __DC_LINK_ENCODER__DCN10_H__
  27#define __DC_LINK_ENCODER__DCN10_H__
  28
  29#include "link_encoder.h"
  30
  31#define TO_DCN10_LINK_ENC(link_encoder)\
  32        container_of(link_encoder, struct dcn10_link_encoder, base)
  33
  34#define AUX_REG_LIST(id)\
  35        SRI(AUX_CONTROL, DP_AUX, id), \
  36        SRI(AUX_DPHY_RX_CONTROL0, DP_AUX, id), \
  37        SRI(AUX_DPHY_RX_CONTROL1, DP_AUX, id)
  38
  39#define HPD_REG_LIST(id)\
  40        SRI(DC_HPD_CONTROL, HPD, id)
  41
  42#define LE_DCN_COMMON_REG_LIST(id) \
  43        SRI(DIG_BE_CNTL, DIG, id), \
  44        SRI(DIG_BE_EN_CNTL, DIG, id), \
  45        SRI(DIG_CLOCK_PATTERN, DIG, id), \
  46        SRI(TMDS_CTL_BITS, DIG, id), \
  47        SRI(DP_CONFIG, DP, id), \
  48        SRI(DP_DPHY_CNTL, DP, id), \
  49        SRI(DP_DPHY_PRBS_CNTL, DP, id), \
  50        SRI(DP_DPHY_SCRAM_CNTL, DP, id),\
  51        SRI(DP_DPHY_SYM0, DP, id), \
  52        SRI(DP_DPHY_SYM1, DP, id), \
  53        SRI(DP_DPHY_SYM2, DP, id), \
  54        SRI(DP_DPHY_TRAINING_PATTERN_SEL, DP, id), \
  55        SRI(DP_LINK_CNTL, DP, id), \
  56        SRI(DP_LINK_FRAMING_CNTL, DP, id), \
  57        SRI(DP_MSE_SAT0, DP, id), \
  58        SRI(DP_MSE_SAT1, DP, id), \
  59        SRI(DP_MSE_SAT2, DP, id), \
  60        SRI(DP_MSE_SAT_UPDATE, DP, id), \
  61        SRI(DP_SEC_CNTL, DP, id), \
  62        SRI(DP_VID_STREAM_CNTL, DP, id), \
  63        SRI(DP_DPHY_FAST_TRAINING, DP, id), \
  64        SRI(DP_SEC_CNTL1, DP, id), \
  65        SRI(DP_DPHY_BS_SR_SWAP_CNTL, DP, id), \
  66        SRI(DP_DPHY_HBR2_PATTERN_CONTROL, DP, id)
  67
  68
  69#define LE_DCN10_REG_LIST(id)\
  70        SRI(DP_DPHY_INTERNAL_CTRL, DP, id), \
  71        LE_DCN_COMMON_REG_LIST(id)
  72
  73struct dcn10_link_enc_aux_registers {
  74        uint32_t AUX_CONTROL;
  75        uint32_t AUX_DPHY_RX_CONTROL0;
  76        uint32_t AUX_DPHY_TX_CONTROL;
  77        uint32_t AUX_DPHY_RX_CONTROL1;
  78};
  79
  80struct dcn10_link_enc_hpd_registers {
  81        uint32_t DC_HPD_CONTROL;
  82};
  83
  84struct dcn10_link_enc_registers {
  85        uint32_t DIG_BE_CNTL;
  86        uint32_t DIG_BE_EN_CNTL;
  87        uint32_t DIG_CLOCK_PATTERN;
  88        uint32_t DP_CONFIG;
  89        uint32_t DP_DPHY_CNTL;
  90        uint32_t DP_DPHY_INTERNAL_CTRL;
  91        uint32_t DP_DPHY_PRBS_CNTL;
  92        uint32_t DP_DPHY_SCRAM_CNTL;
  93        uint32_t DP_DPHY_SYM0;
  94        uint32_t DP_DPHY_SYM1;
  95        uint32_t DP_DPHY_SYM2;
  96        uint32_t DP_DPHY_TRAINING_PATTERN_SEL;
  97        uint32_t DP_LINK_CNTL;
  98        uint32_t DP_LINK_FRAMING_CNTL;
  99        uint32_t DP_MSE_SAT0;
 100        uint32_t DP_MSE_SAT1;
 101        uint32_t DP_MSE_SAT2;
 102        uint32_t DP_MSE_SAT_UPDATE;
 103        uint32_t DP_SEC_CNTL;
 104        uint32_t DP_VID_STREAM_CNTL;
 105        uint32_t DP_DPHY_FAST_TRAINING;
 106        uint32_t DP_DPHY_BS_SR_SWAP_CNTL;
 107        uint32_t DP_DPHY_HBR2_PATTERN_CONTROL;
 108        uint32_t DP_SEC_CNTL1;
 109        uint32_t TMDS_CTL_BITS;
 110        /* DCCG  */
 111        uint32_t CLOCK_ENABLE;
 112        /* DIG */
 113        uint32_t DIG_LANE_ENABLE;
 114        /* UNIPHY */
 115        uint32_t CHANNEL_XBAR_CNTL;
 116        /* DPCS */
 117        uint32_t RDPCSTX_PHY_CNTL3;
 118        uint32_t RDPCSTX_PHY_CNTL4;
 119        uint32_t RDPCSTX_PHY_CNTL5;
 120        uint32_t RDPCSTX_PHY_CNTL6;
 121        uint32_t RDPCSPIPE_PHY_CNTL6;
 122        uint32_t RDPCSTX_PHY_CNTL7;
 123        uint32_t RDPCSTX_PHY_CNTL8;
 124        uint32_t RDPCSTX_PHY_CNTL9;
 125        uint32_t RDPCSTX_PHY_CNTL10;
 126        uint32_t RDPCSTX_PHY_CNTL11;
 127        uint32_t RDPCSTX_PHY_CNTL12;
 128        uint32_t RDPCSTX_PHY_CNTL13;
 129        uint32_t RDPCSTX_PHY_CNTL14;
 130        uint32_t RDPCSTX_PHY_CNTL15;
 131        uint32_t RDPCSTX_CNTL;
 132        uint32_t RDPCSTX_CLOCK_CNTL;
 133        uint32_t RDPCSTX_PHY_CNTL0;
 134        uint32_t RDPCSTX_PHY_CNTL2;
 135        uint32_t RDPCSTX_PLL_UPDATE_DATA;
 136        uint32_t RDPCS_TX_CR_ADDR;
 137        uint32_t RDPCS_TX_CR_DATA;
 138        uint32_t DPCSTX_TX_CLOCK_CNTL;
 139        uint32_t DPCSTX_TX_CNTL;
 140        uint32_t RDPCSTX_INTERRUPT_CONTROL;
 141        uint32_t RDPCSTX_PHY_FUSE0;
 142        uint32_t RDPCSTX_PHY_FUSE1;
 143        uint32_t RDPCSTX_PHY_FUSE2;
 144        uint32_t RDPCSTX_PHY_FUSE3;
 145        uint32_t RDPCSTX_PHY_RX_LD_VAL;
 146        uint32_t DPCSTX_DEBUG_CONFIG;
 147        uint32_t RDPCSTX_DEBUG_CONFIG;
 148        uint32_t RDPCSTX0_RDPCSTX_SCRATCH;
 149        uint32_t RDPCSTX_DMCU_DPALT_DIS_BLOCK_REG;
 150        uint32_t DCIO_SOFT_RESET;
 151        /* indirect registers */
 152        uint32_t RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_2;
 153        uint32_t RAWLANE0_DIG_PCS_XF_RX_OVRD_IN_3;
 154        uint32_t RAWLANE1_DIG_PCS_XF_RX_OVRD_IN_2;
 155        uint32_t RAWLANE1_DIG_PCS_XF_RX_OVRD_IN_3;
 156        uint32_t RAWLANE2_DIG_PCS_XF_RX_OVRD_IN_2;
 157        uint32_t RAWLANE2_DIG_PCS_XF_RX_OVRD_IN_3;
 158        uint32_t RAWLANE3_DIG_PCS_XF_RX_OVRD_IN_2;
 159        uint32_t RAWLANE3_DIG_PCS_XF_RX_OVRD_IN_3;
 160        uint32_t TMDS_DCBALANCER_CONTROL;
 161        uint32_t PHYA_LINK_CNTL2;
 162        uint32_t PHYB_LINK_CNTL2;
 163        uint32_t PHYC_LINK_CNTL2;
 164        uint32_t DIO_LINKA_CNTL;
 165        uint32_t DIO_LINKB_CNTL;
 166        uint32_t DIO_LINKC_CNTL;
 167        uint32_t DIO_LINKD_CNTL;
 168        uint32_t DIO_LINKE_CNTL;
 169        uint32_t DIO_LINKF_CNTL;
 170};
 171
 172#define LE_SF(reg_name, field_name, post_fix)\
 173        .field_name = reg_name ## __ ## field_name ## post_fix
 174
 175#define LINK_ENCODER_MASK_SH_LIST_DCN10(mask_sh)\
 176        LE_SF(DIG0_DIG_BE_EN_CNTL, DIG_ENABLE, mask_sh),\
 177        LE_SF(DIG0_DIG_BE_CNTL, DIG_HPD_SELECT, mask_sh),\
 178        LE_SF(DIG0_DIG_BE_CNTL, DIG_MODE, mask_sh),\
 179        LE_SF(DIG0_DIG_BE_CNTL, DIG_FE_SOURCE_SELECT, mask_sh),\
 180        LE_SF(DIG0_DIG_CLOCK_PATTERN, DIG_CLOCK_PATTERN, mask_sh),\
 181        LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
 182        LE_SF(DP0_DP_DPHY_CNTL, DPHY_BYPASS, mask_sh),\
 183        LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE0, mask_sh),\
 184        LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE1, mask_sh),\
 185        LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE2, mask_sh),\
 186        LE_SF(DP0_DP_DPHY_CNTL, DPHY_ATEST_SEL_LANE3, mask_sh),\
 187        LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_EN, mask_sh),\
 188        LE_SF(DP0_DP_DPHY_PRBS_CNTL, DPHY_PRBS_SEL, mask_sh),\
 189        LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM1, mask_sh),\
 190        LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM2, mask_sh),\
 191        LE_SF(DP0_DP_DPHY_SYM0, DPHY_SYM3, mask_sh),\
 192        LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM4, mask_sh),\
 193        LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM5, mask_sh),\
 194        LE_SF(DP0_DP_DPHY_SYM1, DPHY_SYM6, mask_sh),\
 195        LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM7, mask_sh),\
 196        LE_SF(DP0_DP_DPHY_SYM2, DPHY_SYM8, mask_sh),\
 197        LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_BS_COUNT, mask_sh),\
 198        LE_SF(DP0_DP_DPHY_SCRAM_CNTL, DPHY_SCRAMBLER_ADVANCE, mask_sh),\
 199        LE_SF(DP0_DP_DPHY_FAST_TRAINING, DPHY_RX_FAST_TRAINING_CAPABLE, mask_sh),\
 200        LE_SF(DP0_DP_DPHY_BS_SR_SWAP_CNTL, DPHY_LOAD_BS_COUNT, mask_sh),\
 201        LE_SF(DP0_DP_DPHY_TRAINING_PATTERN_SEL, DPHY_TRAINING_PATTERN_SEL, mask_sh),\
 202        LE_SF(DP0_DP_DPHY_HBR2_PATTERN_CONTROL, DP_DPHY_HBR2_PATTERN_CONTROL, mask_sh),\
 203        LE_SF(DP0_DP_LINK_CNTL, DP_LINK_TRAINING_COMPLETE, mask_sh),\
 204        LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_IDLE_BS_INTERVAL, mask_sh),\
 205        LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VBID_DISABLE, mask_sh),\
 206        LE_SF(DP0_DP_LINK_FRAMING_CNTL, DP_VID_ENHANCED_FRAME_MODE, mask_sh),\
 207        LE_SF(DP0_DP_VID_STREAM_CNTL, DP_VID_STREAM_ENABLE, mask_sh),\
 208        LE_SF(DP0_DP_CONFIG, DP_UDI_LANES, mask_sh),\
 209        LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_LINE_NUM, mask_sh),\
 210        LE_SF(DP0_DP_SEC_CNTL1, DP_SEC_GSP0_PRIORITY, mask_sh),\
 211        LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC0, mask_sh),\
 212        LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SRC1, mask_sh),\
 213        LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT0, mask_sh),\
 214        LE_SF(DP0_DP_MSE_SAT0, DP_MSE_SAT_SLOT_COUNT1, mask_sh),\
 215        LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC2, mask_sh),\
 216        LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SRC3, mask_sh),\
 217        LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT2, mask_sh),\
 218        LE_SF(DP0_DP_MSE_SAT1, DP_MSE_SAT_SLOT_COUNT3, mask_sh),\
 219        LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_SAT_UPDATE, mask_sh),\
 220        LE_SF(DP0_DP_MSE_SAT_UPDATE, DP_MSE_16_MTP_KEEPOUT, mask_sh),\
 221        LE_SF(DP_AUX0_AUX_CONTROL, AUX_HPD_SEL, mask_sh),\
 222        LE_SF(DP_AUX0_AUX_CONTROL, AUX_LS_READ_EN, mask_sh),\
 223        LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_RECEIVE_WINDOW, mask_sh),\
 224        LE_SF(HPD0_DC_HPD_CONTROL, DC_HPD_EN, mask_sh)
 225
 226#define DCN_LINK_ENCODER_REG_FIELD_LIST(type) \
 227        type DIG_ENABLE;\
 228        type DIG_HPD_SELECT;\
 229        type DIG_MODE;\
 230        type DIG_FE_SOURCE_SELECT;\
 231        type DIG_CLOCK_PATTERN;\
 232        type DPHY_BYPASS;\
 233        type DPHY_ATEST_SEL_LANE0;\
 234        type DPHY_ATEST_SEL_LANE1;\
 235        type DPHY_ATEST_SEL_LANE2;\
 236        type DPHY_ATEST_SEL_LANE3;\
 237        type DPHY_PRBS_EN;\
 238        type DPHY_PRBS_SEL;\
 239        type DPHY_SYM1;\
 240        type DPHY_SYM2;\
 241        type DPHY_SYM3;\
 242        type DPHY_SYM4;\
 243        type DPHY_SYM5;\
 244        type DPHY_SYM6;\
 245        type DPHY_SYM7;\
 246        type DPHY_SYM8;\
 247        type DPHY_SCRAMBLER_BS_COUNT;\
 248        type DPHY_SCRAMBLER_ADVANCE;\
 249        type DPHY_RX_FAST_TRAINING_CAPABLE;\
 250        type DPHY_LOAD_BS_COUNT;\
 251        type DPHY_TRAINING_PATTERN_SEL;\
 252        type DP_DPHY_HBR2_PATTERN_CONTROL;\
 253        type DP_LINK_TRAINING_COMPLETE;\
 254        type DP_IDLE_BS_INTERVAL;\
 255        type DP_VBID_DISABLE;\
 256        type DP_VID_ENHANCED_FRAME_MODE;\
 257        type DP_VID_STREAM_ENABLE;\
 258        type DP_UDI_LANES;\
 259        type DP_SEC_GSP0_LINE_NUM;\
 260        type DP_SEC_GSP0_PRIORITY;\
 261        type DP_MSE_SAT_SRC0;\
 262        type DP_MSE_SAT_SRC1;\
 263        type DP_MSE_SAT_SRC2;\
 264        type DP_MSE_SAT_SRC3;\
 265        type DP_MSE_SAT_SLOT_COUNT0;\
 266        type DP_MSE_SAT_SLOT_COUNT1;\
 267        type DP_MSE_SAT_SLOT_COUNT2;\
 268        type DP_MSE_SAT_SLOT_COUNT3;\
 269        type DP_MSE_SAT_UPDATE;\
 270        type DP_MSE_16_MTP_KEEPOUT;\
 271        type DC_HPD_EN;\
 272        type TMDS_CTL0;\
 273        type AUX_HPD_SEL;\
 274        type AUX_LS_READ_EN;\
 275        type AUX_RX_RECEIVE_WINDOW
 276
 277
 278#define DCN20_LINK_ENCODER_DPCS_REG_FIELD_LIST(type) \
 279                type RDPCS_PHY_DP_TX0_DATA_EN;\
 280                type RDPCS_PHY_DP_TX1_DATA_EN;\
 281                type RDPCS_PHY_DP_TX2_DATA_EN;\
 282                type RDPCS_PHY_DP_TX3_DATA_EN;\
 283                type RDPCS_PHY_DP_TX0_PSTATE;\
 284                type RDPCS_PHY_DP_TX1_PSTATE;\
 285                type RDPCS_PHY_DP_TX2_PSTATE;\
 286                type RDPCS_PHY_DP_TX3_PSTATE;\
 287                type RDPCS_PHY_DP_TX0_MPLL_EN;\
 288                type RDPCS_PHY_DP_TX1_MPLL_EN;\
 289                type RDPCS_PHY_DP_TX2_MPLL_EN;\
 290                type RDPCS_PHY_DP_TX3_MPLL_EN;\
 291                type RDPCS_TX_FIFO_LANE0_EN;\
 292                type RDPCS_TX_FIFO_LANE1_EN;\
 293                type RDPCS_TX_FIFO_LANE2_EN;\
 294                type RDPCS_TX_FIFO_LANE3_EN;\
 295                type RDPCS_EXT_REFCLK_EN;\
 296                type RDPCS_TX_FIFO_EN;\
 297                type UNIPHY_LINK_ENABLE;\
 298                type UNIPHY_CHANNEL0_XBAR_SOURCE;\
 299                type UNIPHY_CHANNEL1_XBAR_SOURCE;\
 300                type UNIPHY_CHANNEL2_XBAR_SOURCE;\
 301                type UNIPHY_CHANNEL3_XBAR_SOURCE;\
 302                type UNIPHY_CHANNEL0_INVERT;\
 303                type UNIPHY_CHANNEL1_INVERT;\
 304                type UNIPHY_CHANNEL2_INVERT;\
 305                type UNIPHY_CHANNEL3_INVERT;\
 306                type UNIPHY_LINK_ENABLE_HPD_MASK;\
 307                type UNIPHY_LANE_STAGGER_DELAY;\
 308                type RDPCS_SRAMCLK_BYPASS;\
 309                type RDPCS_SRAMCLK_EN;\
 310                type RDPCS_SRAMCLK_CLOCK_ON;\
 311                type DPCS_TX_FIFO_EN;\
 312                type RDPCS_PHY_DP_TX0_DISABLE;\
 313                type RDPCS_PHY_DP_TX1_DISABLE;\
 314                type RDPCS_PHY_DP_TX2_DISABLE;\
 315                type RDPCS_PHY_DP_TX3_DISABLE;\
 316                type RDPCS_PHY_DP_TX0_CLK_RDY;\
 317                type RDPCS_PHY_DP_TX1_CLK_RDY;\
 318                type RDPCS_PHY_DP_TX2_CLK_RDY;\
 319                type RDPCS_PHY_DP_TX3_CLK_RDY;\
 320                type RDPCS_PHY_DP_TX0_REQ;\
 321                type RDPCS_PHY_DP_TX1_REQ;\
 322                type RDPCS_PHY_DP_TX2_REQ;\
 323                type RDPCS_PHY_DP_TX3_REQ;\
 324                type RDPCS_PHY_DP_TX0_ACK;\
 325                type RDPCS_PHY_DP_TX1_ACK;\
 326                type RDPCS_PHY_DP_TX2_ACK;\
 327                type RDPCS_PHY_DP_TX3_ACK;\
 328                type RDPCS_PHY_DP_TX0_RESET;\
 329                type RDPCS_PHY_DP_TX1_RESET;\
 330                type RDPCS_PHY_DP_TX2_RESET;\
 331                type RDPCS_PHY_DP_TX3_RESET;\
 332                type RDPCS_PHY_RESET;\
 333                type RDPCS_PHY_CR_MUX_SEL;\
 334                type RDPCS_PHY_REF_RANGE;\
 335                type RDPCS_PHY_DP4_POR;\
 336                type RDPCS_SRAM_BYPASS;\
 337                type RDPCS_SRAM_EXT_LD_DONE;\
 338                type RDPCS_PHY_DP_TX0_TERM_CTRL;\
 339                type RDPCS_PHY_DP_TX1_TERM_CTRL;\
 340                type RDPCS_PHY_DP_TX2_TERM_CTRL;\
 341                type RDPCS_PHY_DP_TX3_TERM_CTRL;\
 342                type RDPCS_PHY_DP_REF_CLK_MPLLB_DIV;\
 343                type RDPCS_PHY_DP_MPLLB_MULTIPLIER;\
 344                type RDPCS_PHY_DP_MPLLB_SSC_EN;\
 345                type RDPCS_PHY_DP_MPLLB_DIV5_CLK_EN;\
 346                type RDPCS_PHY_DP_MPLLB_TX_CLK_DIV;\
 347                type RDPCS_PHY_DP_MPLLB_WORD_DIV2_EN;\
 348                type RDPCS_PHY_DP_MPLLB_FRACN_EN;\
 349                type RDPCS_PHY_DP_MPLLB_PMIX_EN;\
 350                type RDPCS_PHY_DP_MPLLB_FRACN_QUOT;\
 351                type RDPCS_PHY_DP_MPLLB_FRACN_DEN;\
 352                type RDPCS_PHY_DP_MPLLB_FRACN_REM;\
 353                type RDPCS_PHY_DP_MPLLB_SSC_UP_SPREAD;\
 354                type RDPCS_PHY_DP_MPLLB_SSC_STEPSIZE;\
 355                type RDPCS_PHY_DP_MPLLB_SSC_PEAK;\
 356                type RDPCS_PHY_DP_MPLLB_DIV_CLK_EN;\
 357                type RDPCS_PHY_DP_MPLLB_DIV_MULTIPLIER;\
 358                type RDPCS_PHY_TX_VBOOST_LVL;\
 359                type RDPCS_PHY_HDMIMODE_ENABLE;\
 360                type RDPCS_PHY_DP_REF_CLK_EN;\
 361                type RDPCS_PLL_UPDATE_DATA;\
 362                type RDPCS_SRAM_INIT_DONE;\
 363                type RDPCS_TX_CR_ADDR;\
 364                type RDPCS_TX_CR_DATA;\
 365                type RDPCS_PHY_HDMI_MPLLB_HDMI_DIV;\
 366                type RDPCS_PHY_DP_MPLLB_STATE;\
 367                type RDPCS_PHY_DP_TX0_WIDTH;\
 368                type RDPCS_PHY_DP_TX0_RATE;\
 369                type RDPCS_PHY_DP_TX1_WIDTH;\
 370                type RDPCS_PHY_DP_TX1_RATE;\
 371                type RDPCS_PHY_DP_TX2_WIDTH;\
 372                type RDPCS_PHY_DP_TX2_RATE;\
 373                type RDPCS_PHY_DP_TX3_WIDTH;\
 374                type RDPCS_PHY_DP_TX3_RATE;\
 375                type DPCS_SYMCLK_CLOCK_ON;\
 376                type DPCS_SYMCLK_GATE_DIS;\
 377                type DPCS_SYMCLK_EN;\
 378                type RDPCS_SYMCLK_DIV2_CLOCK_ON;\
 379                type RDPCS_SYMCLK_DIV2_GATE_DIS;\
 380                type RDPCS_SYMCLK_DIV2_EN;\
 381                type DPCS_TX_DATA_SWAP;\
 382                type DPCS_TX_DATA_ORDER_INVERT;\
 383                type DPCS_TX_FIFO_RD_START_DELAY;\
 384                type RDPCS_TX_FIFO_RD_START_DELAY;\
 385                type RDPCS_REG_FIFO_ERROR_MASK;\
 386                type RDPCS_TX_FIFO_ERROR_MASK;\
 387                type RDPCS_DPALT_DISABLE_TOGGLE_MASK;\
 388                type RDPCS_DPALT_4LANE_TOGGLE_MASK;\
 389                type RDPCS_PHY_DPALT_DP4;\
 390                type RDPCS_PHY_DPALT_DISABLE;\
 391                type RDPCS_PHY_DPALT_DISABLE_ACK;\
 392                type RDPCS_PHY_DP_MPLLB_V2I;\
 393                type RDPCS_PHY_DP_MPLLB_FREQ_VCO;\
 394                type RDPCS_PHY_DP_MPLLB_CP_INT_GS;\
 395                type RDPCS_PHY_RX_VREF_CTRL;\
 396                type RDPCS_PHY_DP_MPLLB_CP_INT;\
 397                type RDPCS_PHY_DP_MPLLB_CP_PROP;\
 398                type RDPCS_PHY_RX_REF_LD_VAL;\
 399                type RDPCS_PHY_RX_VCO_LD_VAL;\
 400                type DPCSTX_DEBUG_CONFIG; \
 401                type RDPCSTX_DEBUG_CONFIG; \
 402                type RDPCS_PHY_DP_TX0_EQ_MAIN;\
 403                type RDPCS_PHY_DP_TX0_EQ_PRE;\
 404                type RDPCS_PHY_DP_TX0_EQ_POST;\
 405                type RDPCS_PHY_DP_TX1_EQ_MAIN;\
 406                type RDPCS_PHY_DP_TX1_EQ_PRE;\
 407                type RDPCS_PHY_DP_TX1_EQ_POST;\
 408                type RDPCS_PHY_DP_TX2_EQ_MAIN;\
 409                type RDPCS_PHY_DP_MPLLB_CP_PROP_GS;\
 410                type RDPCS_PHY_DP_TX2_EQ_PRE;\
 411                type RDPCS_PHY_DP_TX2_EQ_POST;\
 412                type RDPCS_PHY_DP_TX3_EQ_MAIN;\
 413                type RDPCS_PHY_DCO_RANGE;\
 414                type RDPCS_PHY_DCO_FINETUNE;\
 415                type RDPCS_PHY_DP_TX3_EQ_PRE;\
 416                type RDPCS_PHY_DP_TX3_EQ_POST;\
 417                type RDPCS_PHY_SUP_PRE_HP;\
 418                type RDPCS_PHY_DP_TX0_VREGDRV_BYP;\
 419                type RDPCS_PHY_DP_TX1_VREGDRV_BYP;\
 420                type RDPCS_PHY_DP_TX2_VREGDRV_BYP;\
 421                type RDPCS_PHY_DP_TX3_VREGDRV_BYP;\
 422                type RDPCS_DMCU_DPALT_DIS_BLOCK_REG;\
 423                type UNIPHYA_SOFT_RESET;\
 424                type UNIPHYB_SOFT_RESET;\
 425                type UNIPHYC_SOFT_RESET;\
 426                type UNIPHYD_SOFT_RESET;\
 427                type UNIPHYE_SOFT_RESET;\
 428                type UNIPHYF_SOFT_RESET
 429
 430#define DCN20_LINK_ENCODER_REG_FIELD_LIST(type) \
 431        type DIG_LANE0EN;\
 432        type DIG_LANE1EN;\
 433        type DIG_LANE2EN;\
 434        type DIG_LANE3EN;\
 435        type DIG_CLK_EN;\
 436        type SYMCLKA_CLOCK_ENABLE;\
 437        type DPHY_FEC_EN;\
 438        type DPHY_FEC_READY_SHADOW;\
 439        type DPHY_FEC_ACTIVE_STATUS;\
 440        DCN20_LINK_ENCODER_DPCS_REG_FIELD_LIST(type);\
 441        type VCO_LD_VAL_OVRD;\
 442        type VCO_LD_VAL_OVRD_EN;\
 443        type REF_LD_VAL_OVRD;\
 444        type REF_LD_VAL_OVRD_EN;\
 445        type AUX_RX_START_WINDOW; \
 446        type AUX_RX_HALF_SYM_DETECT_LEN; \
 447        type AUX_RX_TRANSITION_FILTER_EN; \
 448        type AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT; \
 449        type AUX_RX_ALLOW_BELOW_THRESHOLD_START; \
 450        type AUX_RX_ALLOW_BELOW_THRESHOLD_STOP; \
 451        type AUX_RX_PHASE_DETECT_LEN; \
 452        type AUX_RX_DETECTION_THRESHOLD; \
 453        type AUX_TX_PRECHARGE_LEN; \
 454        type AUX_TX_PRECHARGE_SYMBOLS; \
 455        type AUX_MODE_DET_CHECK_DELAY;\
 456        type DPCS_DBG_CBUS_DIS;\
 457        type AUX_RX_PRECHARGE_SKIP;\
 458        type AUX_RX_TIMEOUT_LEN;\
 459        type AUX_RX_TIMEOUT_LEN_MUL
 460
 461#define DCN30_LINK_ENCODER_REG_FIELD_LIST(type) \
 462        type TMDS_SYNC_DCBAL_EN;\
 463        type PHY_HPO_DIG_SRC_SEL;\
 464        type PHY_HPO_ENC_SRC_SEL;\
 465        type DPCS_TX_HDMI_FRL_MODE;\
 466        type DPCS_TX_DATA_SWAP_10_BIT;\
 467        type DPCS_TX_DATA_ORDER_INVERT_18_BIT;\
 468        type RDPCS_TX_CLK_EN
 469
 470#define DCN31_LINK_ENCODER_REG_FIELD_LIST(type) \
 471        type ENC_TYPE_SEL;\
 472        type HPO_DP_ENC_SEL;\
 473        type HPO_HDMI_ENC_SEL
 474
 475struct dcn10_link_enc_shift {
 476        DCN_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
 477        DCN20_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
 478        DCN30_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
 479        DCN31_LINK_ENCODER_REG_FIELD_LIST(uint8_t);
 480};
 481
 482struct dcn10_link_enc_mask {
 483        DCN_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
 484        DCN20_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
 485        DCN30_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
 486        DCN31_LINK_ENCODER_REG_FIELD_LIST(uint32_t);
 487};
 488
 489struct dcn10_link_encoder {
 490        struct link_encoder base;
 491        const struct dcn10_link_enc_registers *link_regs;
 492        const struct dcn10_link_enc_aux_registers *aux_regs;
 493        const struct dcn10_link_enc_hpd_registers *hpd_regs;
 494        const struct dcn10_link_enc_shift *link_shift;
 495        const struct dcn10_link_enc_mask *link_mask;
 496};
 497
 498
 499void dcn10_link_encoder_construct(
 500        struct dcn10_link_encoder *enc10,
 501        const struct encoder_init_data *init_data,
 502        const struct encoder_feature_support *enc_features,
 503        const struct dcn10_link_enc_registers *link_regs,
 504        const struct dcn10_link_enc_aux_registers *aux_regs,
 505        const struct dcn10_link_enc_hpd_registers *hpd_regs,
 506        const struct dcn10_link_enc_shift *link_shift,
 507        const struct dcn10_link_enc_mask *link_mask);
 508
 509bool dcn10_link_encoder_validate_dvi_output(
 510        const struct dcn10_link_encoder *enc10,
 511        enum signal_type connector_signal,
 512        enum signal_type signal,
 513        const struct dc_crtc_timing *crtc_timing);
 514
 515bool dcn10_link_encoder_validate_rgb_output(
 516        const struct dcn10_link_encoder *enc10,
 517        const struct dc_crtc_timing *crtc_timing);
 518
 519bool dcn10_link_encoder_validate_dp_output(
 520        const struct dcn10_link_encoder *enc10,
 521        const struct dc_crtc_timing *crtc_timing);
 522
 523bool dcn10_link_encoder_validate_wireless_output(
 524        const struct dcn10_link_encoder *enc10,
 525        const struct dc_crtc_timing *crtc_timing);
 526
 527bool dcn10_link_encoder_validate_output_with_stream(
 528        struct link_encoder *enc,
 529        const struct dc_stream_state *stream);
 530
 531/****************** HW programming ************************/
 532
 533/* initialize HW */  /* why do we initialze aux in here? */
 534void dcn10_link_encoder_hw_init(struct link_encoder *enc);
 535
 536void dcn10_link_encoder_destroy(struct link_encoder **enc);
 537
 538/* program DIG_MODE in DIG_BE */
 539/* TODO can this be combined with enable_output? */
 540void dcn10_link_encoder_setup(
 541        struct link_encoder *enc,
 542        enum signal_type signal);
 543
 544void enc1_configure_encoder(
 545        struct dcn10_link_encoder *enc10,
 546        const struct dc_link_settings *link_settings);
 547
 548/* enables TMDS PHY output */
 549/* TODO: still need depth or just pass in adjusted pixel clock? */
 550void dcn10_link_encoder_enable_tmds_output(
 551        struct link_encoder *enc,
 552        enum clock_source_id clock_source,
 553        enum dc_color_depth color_depth,
 554        enum signal_type signal,
 555        uint32_t pixel_clock);
 556
 557void dcn10_link_encoder_enable_tmds_output_with_clk_pattern_wa(
 558        struct link_encoder *enc,
 559        enum clock_source_id clock_source,
 560        enum dc_color_depth color_depth,
 561        enum signal_type signal,
 562        uint32_t pixel_clock);
 563
 564/* enables DP PHY output */
 565void dcn10_link_encoder_enable_dp_output(
 566        struct link_encoder *enc,
 567        const struct dc_link_settings *link_settings,
 568        enum clock_source_id clock_source);
 569
 570/* enables DP PHY output in MST mode */
 571void dcn10_link_encoder_enable_dp_mst_output(
 572        struct link_encoder *enc,
 573        const struct dc_link_settings *link_settings,
 574        enum clock_source_id clock_source);
 575
 576/* disable PHY output */
 577void dcn10_link_encoder_disable_output(
 578        struct link_encoder *enc,
 579        enum signal_type signal);
 580
 581/* set DP lane settings */
 582void dcn10_link_encoder_dp_set_lane_settings(
 583        struct link_encoder *enc,
 584        const struct link_training_settings *link_settings);
 585
 586void dcn10_link_encoder_dp_set_phy_pattern(
 587        struct link_encoder *enc,
 588        const struct encoder_set_dp_phy_pattern_param *param);
 589
 590/* programs DP MST VC payload allocation */
 591void dcn10_link_encoder_update_mst_stream_allocation_table(
 592        struct link_encoder *enc,
 593        const struct link_mst_stream_allocation_table *table);
 594
 595void dcn10_link_encoder_connect_dig_be_to_fe(
 596        struct link_encoder *enc,
 597        enum engine_id engine,
 598        bool connect);
 599
 600void dcn10_link_encoder_set_dp_phy_pattern_training_pattern(
 601        struct link_encoder *enc,
 602        uint32_t index);
 603
 604void dcn10_link_encoder_enable_hpd(struct link_encoder *enc);
 605
 606void dcn10_link_encoder_disable_hpd(struct link_encoder *enc);
 607
 608void dcn10_psr_program_dp_dphy_fast_training(struct link_encoder *enc,
 609                        bool exit_link_training_required);
 610
 611void dcn10_psr_program_secondary_packet(struct link_encoder *enc,
 612                        unsigned int sdp_transmit_line_num_deadline);
 613
 614bool dcn10_is_dig_enabled(struct link_encoder *enc);
 615
 616unsigned int dcn10_get_dig_frontend(struct link_encoder *enc);
 617
 618void dcn10_aux_initialize(struct dcn10_link_encoder *enc10);
 619
 620enum signal_type dcn10_get_dig_mode(
 621        struct link_encoder *enc);
 622
 623void dcn10_link_encoder_get_max_link_cap(struct link_encoder *enc,
 624        struct dc_link_settings *link_settings);
 625#endif /* __DC_LINK_ENCODER__DCN10_H__ */
 626