0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <drm/display/drm_dp_helper.h>
0013 #include <drm/drm_atomic_helper.h>
0014 #include <drm/drm_connector.h>
0015 #include <drm/drm_crtc.h>
0016 #include <drm/drm_device.h>
0017 #include <drm/drm_edid.h>
0018 #include <drm/drm_encoder.h>
0019 #include <drm/drm_managed.h>
0020 #include <drm/drm_modes.h>
0021 #include <drm/drm_of.h>
0022 #include <drm/drm_probe_helper.h>
0023 #include <drm/drm_simple_kms_helper.h>
0024
0025 #include <linux/clk.h>
0026 #include <linux/delay.h>
0027 #include <linux/device.h>
0028 #include <linux/io.h>
0029 #include <linux/module.h>
0030 #include <linux/platform_device.h>
0031 #include <linux/pm_runtime.h>
0032 #include <linux/phy/phy.h>
0033 #include <linux/reset.h>
0034
0035 #include "zynqmp_disp.h"
0036 #include "zynqmp_dp.h"
0037 #include "zynqmp_dpsub.h"
0038
0039 static uint zynqmp_dp_aux_timeout_ms = 50;
0040 module_param_named(aux_timeout_ms, zynqmp_dp_aux_timeout_ms, uint, 0444);
0041 MODULE_PARM_DESC(aux_timeout_ms, "DP aux timeout value in msec (default: 50)");
0042
0043
0044
0045
0046 static uint zynqmp_dp_power_on_delay_ms = 4;
0047 module_param_named(power_on_delay_ms, zynqmp_dp_power_on_delay_ms, uint, 0444);
0048 MODULE_PARM_DESC(power_on_delay_ms, "DP power on delay in msec (default: 4)");
0049
0050
0051 #define ZYNQMP_DP_LINK_BW_SET 0x0
0052 #define ZYNQMP_DP_LANE_COUNT_SET 0x4
0053 #define ZYNQMP_DP_ENHANCED_FRAME_EN 0x8
0054 #define ZYNQMP_DP_TRAINING_PATTERN_SET 0xc
0055 #define ZYNQMP_DP_SCRAMBLING_DISABLE 0x14
0056 #define ZYNQMP_DP_DOWNSPREAD_CTL 0x18
0057 #define ZYNQMP_DP_SOFTWARE_RESET 0x1c
0058 #define ZYNQMP_DP_SOFTWARE_RESET_STREAM1 BIT(0)
0059 #define ZYNQMP_DP_SOFTWARE_RESET_STREAM2 BIT(1)
0060 #define ZYNQMP_DP_SOFTWARE_RESET_STREAM3 BIT(2)
0061 #define ZYNQMP_DP_SOFTWARE_RESET_STREAM4 BIT(3)
0062 #define ZYNQMP_DP_SOFTWARE_RESET_AUX BIT(7)
0063 #define ZYNQMP_DP_SOFTWARE_RESET_ALL (ZYNQMP_DP_SOFTWARE_RESET_STREAM1 | \
0064 ZYNQMP_DP_SOFTWARE_RESET_STREAM2 | \
0065 ZYNQMP_DP_SOFTWARE_RESET_STREAM3 | \
0066 ZYNQMP_DP_SOFTWARE_RESET_STREAM4 | \
0067 ZYNQMP_DP_SOFTWARE_RESET_AUX)
0068
0069
0070 #define ZYNQMP_DP_TRANSMITTER_ENABLE 0x80
0071 #define ZYNQMP_DP_MAIN_STREAM_ENABLE 0x84
0072 #define ZYNQMP_DP_FORCE_SCRAMBLER_RESET 0xc0
0073 #define ZYNQMP_DP_VERSION 0xf8
0074 #define ZYNQMP_DP_VERSION_MAJOR_MASK GENMASK(31, 24)
0075 #define ZYNQMP_DP_VERSION_MAJOR_SHIFT 24
0076 #define ZYNQMP_DP_VERSION_MINOR_MASK GENMASK(23, 16)
0077 #define ZYNQMP_DP_VERSION_MINOR_SHIFT 16
0078 #define ZYNQMP_DP_VERSION_REVISION_MASK GENMASK(15, 12)
0079 #define ZYNQMP_DP_VERSION_REVISION_SHIFT 12
0080 #define ZYNQMP_DP_VERSION_PATCH_MASK GENMASK(11, 8)
0081 #define ZYNQMP_DP_VERSION_PATCH_SHIFT 8
0082 #define ZYNQMP_DP_VERSION_INTERNAL_MASK GENMASK(7, 0)
0083 #define ZYNQMP_DP_VERSION_INTERNAL_SHIFT 0
0084
0085
0086 #define ZYNQMP_DP_CORE_ID 0xfc
0087 #define ZYNQMP_DP_CORE_ID_MAJOR_MASK GENMASK(31, 24)
0088 #define ZYNQMP_DP_CORE_ID_MAJOR_SHIFT 24
0089 #define ZYNQMP_DP_CORE_ID_MINOR_MASK GENMASK(23, 16)
0090 #define ZYNQMP_DP_CORE_ID_MINOR_SHIFT 16
0091 #define ZYNQMP_DP_CORE_ID_REVISION_MASK GENMASK(15, 8)
0092 #define ZYNQMP_DP_CORE_ID_REVISION_SHIFT 8
0093 #define ZYNQMP_DP_CORE_ID_DIRECTION GENMASK(1)
0094
0095
0096 #define ZYNQMP_DP_AUX_COMMAND 0x100
0097 #define ZYNQMP_DP_AUX_COMMAND_CMD_SHIFT 8
0098 #define ZYNQMP_DP_AUX_COMMAND_ADDRESS_ONLY BIT(12)
0099 #define ZYNQMP_DP_AUX_COMMAND_BYTES_SHIFT 0
0100 #define ZYNQMP_DP_AUX_WRITE_FIFO 0x104
0101 #define ZYNQMP_DP_AUX_ADDRESS 0x108
0102 #define ZYNQMP_DP_AUX_CLK_DIVIDER 0x10c
0103 #define ZYNQMP_DP_AUX_CLK_DIVIDER_AUX_FILTER_SHIFT 8
0104 #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE 0x130
0105 #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_HPD BIT(0)
0106 #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REQUEST BIT(1)
0107 #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY BIT(2)
0108 #define ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY_TIMEOUT BIT(3)
0109 #define ZYNQMP_DP_AUX_REPLY_DATA 0x134
0110 #define ZYNQMP_DP_AUX_REPLY_CODE 0x138
0111 #define ZYNQMP_DP_AUX_REPLY_CODE_AUX_ACK (0)
0112 #define ZYNQMP_DP_AUX_REPLY_CODE_AUX_NACK BIT(0)
0113 #define ZYNQMP_DP_AUX_REPLY_CODE_AUX_DEFER BIT(1)
0114 #define ZYNQMP_DP_AUX_REPLY_CODE_I2C_ACK (0)
0115 #define ZYNQMP_DP_AUX_REPLY_CODE_I2C_NACK BIT(2)
0116 #define ZYNQMP_DP_AUX_REPLY_CODE_I2C_DEFER BIT(3)
0117 #define ZYNQMP_DP_AUX_REPLY_COUNT 0x13c
0118 #define ZYNQMP_DP_REPLY_DATA_COUNT 0x148
0119 #define ZYNQMP_DP_REPLY_DATA_COUNT_MASK 0xff
0120 #define ZYNQMP_DP_INT_STATUS 0x3a0
0121 #define ZYNQMP_DP_INT_MASK 0x3a4
0122 #define ZYNQMP_DP_INT_EN 0x3a8
0123 #define ZYNQMP_DP_INT_DS 0x3ac
0124 #define ZYNQMP_DP_INT_HPD_IRQ BIT(0)
0125 #define ZYNQMP_DP_INT_HPD_EVENT BIT(1)
0126 #define ZYNQMP_DP_INT_REPLY_RECEIVED BIT(2)
0127 #define ZYNQMP_DP_INT_REPLY_TIMEOUT BIT(3)
0128 #define ZYNQMP_DP_INT_HPD_PULSE_DET BIT(4)
0129 #define ZYNQMP_DP_INT_EXT_PKT_TXD BIT(5)
0130 #define ZYNQMP_DP_INT_LIV_ABUF_UNDRFLW BIT(12)
0131 #define ZYNQMP_DP_INT_VBLANK_START BIT(13)
0132 #define ZYNQMP_DP_INT_PIXEL1_MATCH BIT(14)
0133 #define ZYNQMP_DP_INT_PIXEL0_MATCH BIT(15)
0134 #define ZYNQMP_DP_INT_CHBUF_UNDERFLW_MASK 0x3f0000
0135 #define ZYNQMP_DP_INT_CHBUF_OVERFLW_MASK 0xfc00000
0136 #define ZYNQMP_DP_INT_CUST_TS_2 BIT(28)
0137 #define ZYNQMP_DP_INT_CUST_TS BIT(29)
0138 #define ZYNQMP_DP_INT_EXT_VSYNC_TS BIT(30)
0139 #define ZYNQMP_DP_INT_VSYNC_TS BIT(31)
0140 #define ZYNQMP_DP_INT_ALL (ZYNQMP_DP_INT_HPD_IRQ | \
0141 ZYNQMP_DP_INT_HPD_EVENT | \
0142 ZYNQMP_DP_INT_CHBUF_UNDERFLW_MASK | \
0143 ZYNQMP_DP_INT_CHBUF_OVERFLW_MASK)
0144
0145
0146 #define ZYNQMP_DP_MAIN_STREAM_HTOTAL 0x180
0147 #define ZYNQMP_DP_MAIN_STREAM_VTOTAL 0x184
0148 #define ZYNQMP_DP_MAIN_STREAM_POLARITY 0x188
0149 #define ZYNQMP_DP_MAIN_STREAM_POLARITY_HSYNC_SHIFT 0
0150 #define ZYNQMP_DP_MAIN_STREAM_POLARITY_VSYNC_SHIFT 1
0151 #define ZYNQMP_DP_MAIN_STREAM_HSWIDTH 0x18c
0152 #define ZYNQMP_DP_MAIN_STREAM_VSWIDTH 0x190
0153 #define ZYNQMP_DP_MAIN_STREAM_HRES 0x194
0154 #define ZYNQMP_DP_MAIN_STREAM_VRES 0x198
0155 #define ZYNQMP_DP_MAIN_STREAM_HSTART 0x19c
0156 #define ZYNQMP_DP_MAIN_STREAM_VSTART 0x1a0
0157 #define ZYNQMP_DP_MAIN_STREAM_MISC0 0x1a4
0158 #define ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK BIT(0)
0159 #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_RGB (0 << 1)
0160 #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_422 (5 << 1)
0161 #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_444 (6 << 1)
0162 #define ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_MASK (7 << 1)
0163 #define ZYNQMP_DP_MAIN_STREAM_MISC0_DYNAMIC_RANGE BIT(3)
0164 #define ZYNQMP_DP_MAIN_STREAM_MISC0_YCBCR_COLR BIT(4)
0165 #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_6 (0 << 5)
0166 #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_8 (1 << 5)
0167 #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_10 (2 << 5)
0168 #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_12 (3 << 5)
0169 #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_16 (4 << 5)
0170 #define ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_MASK (7 << 5)
0171 #define ZYNQMP_DP_MAIN_STREAM_MISC1 0x1a8
0172 #define ZYNQMP_DP_MAIN_STREAM_MISC1_Y_ONLY_EN BIT(7)
0173 #define ZYNQMP_DP_MAIN_STREAM_M_VID 0x1ac
0174 #define ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE 0x1b0
0175 #define ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE_TU_SIZE_DEF 64
0176 #define ZYNQMP_DP_MAIN_STREAM_N_VID 0x1b4
0177 #define ZYNQMP_DP_USER_PIX_WIDTH 0x1b8
0178 #define ZYNQMP_DP_USER_DATA_COUNT_PER_LANE 0x1bc
0179 #define ZYNQMP_DP_MIN_BYTES_PER_TU 0x1c4
0180 #define ZYNQMP_DP_FRAC_BYTES_PER_TU 0x1c8
0181 #define ZYNQMP_DP_INIT_WAIT 0x1cc
0182
0183
0184 #define ZYNQMP_DP_PHY_RESET 0x200
0185 #define ZYNQMP_DP_PHY_RESET_PHY_RESET BIT(0)
0186 #define ZYNQMP_DP_PHY_RESET_GTTX_RESET BIT(1)
0187 #define ZYNQMP_DP_PHY_RESET_PHY_PMA_RESET BIT(8)
0188 #define ZYNQMP_DP_PHY_RESET_PHY_PCS_RESET BIT(9)
0189 #define ZYNQMP_DP_PHY_RESET_ALL_RESET (ZYNQMP_DP_PHY_RESET_PHY_RESET | \
0190 ZYNQMP_DP_PHY_RESET_GTTX_RESET | \
0191 ZYNQMP_DP_PHY_RESET_PHY_PMA_RESET | \
0192 ZYNQMP_DP_PHY_RESET_PHY_PCS_RESET)
0193 #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_0 0x210
0194 #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_1 0x214
0195 #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_2 0x218
0196 #define ZYNQMP_DP_PHY_PREEMPHASIS_LANE_3 0x21c
0197 #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_0 0x220
0198 #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_1 0x224
0199 #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_2 0x228
0200 #define ZYNQMP_DP_PHY_VOLTAGE_DIFF_LANE_3 0x22c
0201 #define ZYNQMP_DP_PHY_CLOCK_SELECT 0x234
0202 #define ZYNQMP_DP_PHY_CLOCK_SELECT_1_62G 0x1
0203 #define ZYNQMP_DP_PHY_CLOCK_SELECT_2_70G 0x3
0204 #define ZYNQMP_DP_PHY_CLOCK_SELECT_5_40G 0x5
0205 #define ZYNQMP_DP_TX_PHY_POWER_DOWN 0x238
0206 #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_0 BIT(0)
0207 #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_1 BIT(1)
0208 #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_2 BIT(2)
0209 #define ZYNQMP_DP_TX_PHY_POWER_DOWN_LANE_3 BIT(3)
0210 #define ZYNQMP_DP_TX_PHY_POWER_DOWN_ALL 0xf
0211 #define ZYNQMP_DP_PHY_PRECURSOR_LANE_0 0x23c
0212 #define ZYNQMP_DP_PHY_PRECURSOR_LANE_1 0x240
0213 #define ZYNQMP_DP_PHY_PRECURSOR_LANE_2 0x244
0214 #define ZYNQMP_DP_PHY_PRECURSOR_LANE_3 0x248
0215 #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_0 0x24c
0216 #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_1 0x250
0217 #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_2 0x254
0218 #define ZYNQMP_DP_PHY_POSTCURSOR_LANE_3 0x258
0219 #define ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_0 0x24c
0220 #define ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_1 0x250
0221 #define ZYNQMP_DP_PHY_STATUS 0x280
0222 #define ZYNQMP_DP_PHY_STATUS_PLL_LOCKED_SHIFT 4
0223 #define ZYNQMP_DP_PHY_STATUS_FPGA_PLL_LOCKED BIT(6)
0224
0225
0226 #define ZYNQMP_DP_TX_AUDIO_CONTROL 0x300
0227 #define ZYNQMP_DP_TX_AUDIO_CHANNELS 0x304
0228 #define ZYNQMP_DP_TX_AUDIO_INFO_DATA 0x308
0229 #define ZYNQMP_DP_TX_M_AUD 0x328
0230 #define ZYNQMP_DP_TX_N_AUD 0x32c
0231 #define ZYNQMP_DP_TX_AUDIO_EXT_DATA 0x330
0232
0233 #define ZYNQMP_DP_MAX_LANES 2
0234 #define ZYNQMP_MAX_FREQ 3000000
0235
0236 #define DP_REDUCED_BIT_RATE 162000
0237 #define DP_HIGH_BIT_RATE 270000
0238 #define DP_HIGH_BIT_RATE2 540000
0239 #define DP_MAX_TRAINING_TRIES 5
0240 #define DP_V1_2 0x12
0241
0242
0243
0244
0245
0246
0247 struct zynqmp_dp_link_config {
0248 int max_rate;
0249 u8 max_lanes;
0250 };
0251
0252
0253
0254
0255
0256
0257
0258
0259 struct zynqmp_dp_mode {
0260 u8 bw_code;
0261 u8 lane_cnt;
0262 int pclock;
0263 const char *fmt;
0264 };
0265
0266
0267
0268
0269
0270
0271
0272 struct zynqmp_dp_config {
0273 u8 misc0;
0274 u8 misc1;
0275 u8 bpp;
0276 };
0277
0278
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300 struct zynqmp_dp {
0301 struct drm_encoder encoder;
0302 struct drm_connector connector;
0303 struct device *dev;
0304 struct zynqmp_dpsub *dpsub;
0305 struct drm_device *drm;
0306 void __iomem *iomem;
0307 struct reset_control *reset;
0308 int irq;
0309
0310 struct zynqmp_dp_config config;
0311 struct drm_dp_aux aux;
0312 struct phy *phy[ZYNQMP_DP_MAX_LANES];
0313 u8 num_lanes;
0314 struct delayed_work hpd_work;
0315 enum drm_connector_status status;
0316 bool enabled;
0317
0318 u8 dpcd[DP_RECEIVER_CAP_SIZE];
0319 struct zynqmp_dp_link_config link_config;
0320 struct zynqmp_dp_mode mode;
0321 u8 train_set[ZYNQMP_DP_MAX_LANES];
0322 };
0323
0324 static inline struct zynqmp_dp *encoder_to_dp(struct drm_encoder *encoder)
0325 {
0326 return container_of(encoder, struct zynqmp_dp, encoder);
0327 }
0328
0329 static inline struct zynqmp_dp *connector_to_dp(struct drm_connector *connector)
0330 {
0331 return container_of(connector, struct zynqmp_dp, connector);
0332 }
0333
0334 static void zynqmp_dp_write(struct zynqmp_dp *dp, int offset, u32 val)
0335 {
0336 writel(val, dp->iomem + offset);
0337 }
0338
0339 static u32 zynqmp_dp_read(struct zynqmp_dp *dp, int offset)
0340 {
0341 return readl(dp->iomem + offset);
0342 }
0343
0344 static void zynqmp_dp_clr(struct zynqmp_dp *dp, int offset, u32 clr)
0345 {
0346 zynqmp_dp_write(dp, offset, zynqmp_dp_read(dp, offset) & ~clr);
0347 }
0348
0349 static void zynqmp_dp_set(struct zynqmp_dp *dp, int offset, u32 set)
0350 {
0351 zynqmp_dp_write(dp, offset, zynqmp_dp_read(dp, offset) | set);
0352 }
0353
0354
0355
0356
0357
0358 #define RST_TIMEOUT_MS 1000
0359
0360 static int zynqmp_dp_reset(struct zynqmp_dp *dp, bool assert)
0361 {
0362 unsigned long timeout;
0363
0364 if (assert)
0365 reset_control_assert(dp->reset);
0366 else
0367 reset_control_deassert(dp->reset);
0368
0369
0370 timeout = jiffies + msecs_to_jiffies(RST_TIMEOUT_MS);
0371 while (!time_after_eq(jiffies, timeout)) {
0372 bool status = !!reset_control_status(dp->reset);
0373
0374 if (assert == status)
0375 return 0;
0376
0377 cpu_relax();
0378 }
0379
0380 dev_err(dp->dev, "reset %s timeout\n", assert ? "assert" : "deassert");
0381 return -ETIMEDOUT;
0382 }
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393 static int zynqmp_dp_phy_init(struct zynqmp_dp *dp)
0394 {
0395 int ret;
0396 int i;
0397
0398 for (i = 0; i < dp->num_lanes; i++) {
0399 ret = phy_init(dp->phy[i]);
0400 if (ret) {
0401 dev_err(dp->dev, "failed to init phy lane %d\n", i);
0402 return ret;
0403 }
0404 }
0405
0406 zynqmp_dp_clr(dp, ZYNQMP_DP_PHY_RESET, ZYNQMP_DP_PHY_RESET_ALL_RESET);
0407
0408
0409
0410
0411
0412 for (i = dp->num_lanes - 1; i >= 0; i--) {
0413 ret = phy_power_on(dp->phy[i]);
0414 if (ret) {
0415 dev_err(dp->dev, "failed to power on phy lane %d\n", i);
0416 return ret;
0417 }
0418 }
0419
0420 return 0;
0421 }
0422
0423
0424
0425
0426
0427
0428
0429 static void zynqmp_dp_phy_exit(struct zynqmp_dp *dp)
0430 {
0431 unsigned int i;
0432 int ret;
0433
0434 for (i = 0; i < dp->num_lanes; i++) {
0435 ret = phy_power_off(dp->phy[i]);
0436 if (ret)
0437 dev_err(dp->dev, "failed to power off phy(%d) %d\n", i,
0438 ret);
0439 }
0440
0441 for (i = 0; i < dp->num_lanes; i++) {
0442 ret = phy_exit(dp->phy[i]);
0443 if (ret)
0444 dev_err(dp->dev, "failed to exit phy(%d) %d\n", i, ret);
0445 }
0446 }
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461
0462 static int zynqmp_dp_phy_probe(struct zynqmp_dp *dp)
0463 {
0464 unsigned int i;
0465
0466 for (i = 0; i < ZYNQMP_DP_MAX_LANES; i++) {
0467 char phy_name[16];
0468 struct phy *phy;
0469
0470 snprintf(phy_name, sizeof(phy_name), "dp-phy%d", i);
0471 phy = devm_phy_get(dp->dev, phy_name);
0472
0473 if (IS_ERR(phy)) {
0474 switch (PTR_ERR(phy)) {
0475 case -ENODEV:
0476 if (dp->num_lanes)
0477 return 0;
0478
0479 dev_err(dp->dev, "no PHY found\n");
0480 return -ENXIO;
0481
0482 case -EPROBE_DEFER:
0483 return -EPROBE_DEFER;
0484
0485 default:
0486 dev_err(dp->dev, "failed to get PHY lane %u\n",
0487 i);
0488 return PTR_ERR(phy);
0489 }
0490 }
0491
0492 dp->phy[i] = phy;
0493 dp->num_lanes++;
0494 }
0495
0496 return 0;
0497 }
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508 static int zynqmp_dp_phy_ready(struct zynqmp_dp *dp)
0509 {
0510 u32 i, reg, ready;
0511
0512 ready = (1 << dp->num_lanes) - 1;
0513
0514
0515 for (i = 0; ; i++) {
0516 reg = zynqmp_dp_read(dp, ZYNQMP_DP_PHY_STATUS);
0517 if ((reg & ready) == ready)
0518 return 0;
0519
0520 if (i == 100) {
0521 dev_err(dp->dev, "PHY isn't ready\n");
0522 return -ENODEV;
0523 }
0524
0525 usleep_range(1000, 1100);
0526 }
0527
0528 return 0;
0529 }
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543 static inline int zynqmp_dp_max_rate(int link_rate, u8 lane_num, u8 bpp)
0544 {
0545 return link_rate * lane_num * 8 / bpp;
0546 }
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561 static int zynqmp_dp_mode_configure(struct zynqmp_dp *dp, int pclock,
0562 u8 current_bw)
0563 {
0564 int max_rate = dp->link_config.max_rate;
0565 u8 bw_code;
0566 u8 max_lanes = dp->link_config.max_lanes;
0567 u8 max_link_rate_code = drm_dp_link_rate_to_bw_code(max_rate);
0568 u8 bpp = dp->config.bpp;
0569 u8 lane_cnt;
0570
0571
0572 switch (current_bw) {
0573 case DP_LINK_BW_5_4:
0574 bw_code = DP_LINK_BW_2_7;
0575 break;
0576 case DP_LINK_BW_2_7:
0577 bw_code = DP_LINK_BW_1_62;
0578 break;
0579 case DP_LINK_BW_1_62:
0580 dev_err(dp->dev, "can't downshift. already lowest link rate\n");
0581 return -EINVAL;
0582 default:
0583
0584 bw_code = max_link_rate_code;
0585 break;
0586 }
0587
0588 for (lane_cnt = 1; lane_cnt <= max_lanes; lane_cnt <<= 1) {
0589 int bw;
0590 u32 rate;
0591
0592 bw = drm_dp_bw_code_to_link_rate(bw_code);
0593 rate = zynqmp_dp_max_rate(bw, lane_cnt, bpp);
0594 if (pclock <= rate) {
0595 dp->mode.bw_code = bw_code;
0596 dp->mode.lane_cnt = lane_cnt;
0597 dp->mode.pclock = pclock;
0598 return dp->mode.bw_code;
0599 }
0600 }
0601
0602 dev_err(dp->dev, "failed to configure link values\n");
0603
0604 return -EINVAL;
0605 }
0606
0607
0608
0609
0610
0611
0612 static void zynqmp_dp_adjust_train(struct zynqmp_dp *dp,
0613 u8 link_status[DP_LINK_STATUS_SIZE])
0614 {
0615 u8 *train_set = dp->train_set;
0616 u8 voltage = 0, preemphasis = 0;
0617 u8 i;
0618
0619 for (i = 0; i < dp->mode.lane_cnt; i++) {
0620 u8 v = drm_dp_get_adjust_request_voltage(link_status, i);
0621 u8 p = drm_dp_get_adjust_request_pre_emphasis(link_status, i);
0622
0623 if (v > voltage)
0624 voltage = v;
0625
0626 if (p > preemphasis)
0627 preemphasis = p;
0628 }
0629
0630 if (voltage >= DP_TRAIN_VOLTAGE_SWING_LEVEL_3)
0631 voltage |= DP_TRAIN_MAX_SWING_REACHED;
0632
0633 if (preemphasis >= DP_TRAIN_PRE_EMPH_LEVEL_2)
0634 preemphasis |= DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
0635
0636 for (i = 0; i < dp->mode.lane_cnt; i++)
0637 train_set[i] = voltage | preemphasis;
0638 }
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650 static int zynqmp_dp_update_vs_emph(struct zynqmp_dp *dp)
0651 {
0652 unsigned int i;
0653 int ret;
0654
0655 ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET, dp->train_set,
0656 dp->mode.lane_cnt);
0657 if (ret < 0)
0658 return ret;
0659
0660 for (i = 0; i < dp->mode.lane_cnt; i++) {
0661 u32 reg = ZYNQMP_DP_SUB_TX_PHY_PRECURSOR_LANE_0 + i * 4;
0662 union phy_configure_opts opts = { 0 };
0663 u8 train = dp->train_set[i];
0664
0665 opts.dp.voltage[0] = (train & DP_TRAIN_VOLTAGE_SWING_MASK)
0666 >> DP_TRAIN_VOLTAGE_SWING_SHIFT;
0667 opts.dp.pre[0] = (train & DP_TRAIN_PRE_EMPHASIS_MASK)
0668 >> DP_TRAIN_PRE_EMPHASIS_SHIFT;
0669
0670 phy_configure(dp->phy[i], &opts);
0671
0672 zynqmp_dp_write(dp, reg, 0x2);
0673 }
0674
0675 return 0;
0676 }
0677
0678
0679
0680
0681
0682
0683
0684
0685 static int zynqmp_dp_link_train_cr(struct zynqmp_dp *dp)
0686 {
0687 u8 link_status[DP_LINK_STATUS_SIZE];
0688 u8 lane_cnt = dp->mode.lane_cnt;
0689 u8 vs = 0, tries = 0;
0690 u16 max_tries, i;
0691 bool cr_done;
0692 int ret;
0693
0694 zynqmp_dp_write(dp, ZYNQMP_DP_TRAINING_PATTERN_SET,
0695 DP_TRAINING_PATTERN_1);
0696 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0697 DP_TRAINING_PATTERN_1 |
0698 DP_LINK_SCRAMBLING_DISABLE);
0699 if (ret < 0)
0700 return ret;
0701
0702
0703
0704
0705
0706 for (max_tries = 0; max_tries < 512; max_tries++) {
0707 ret = zynqmp_dp_update_vs_emph(dp);
0708 if (ret)
0709 return ret;
0710
0711 drm_dp_link_train_clock_recovery_delay(&dp->aux, dp->dpcd);
0712 ret = drm_dp_dpcd_read_link_status(&dp->aux, link_status);
0713 if (ret < 0)
0714 return ret;
0715
0716 cr_done = drm_dp_clock_recovery_ok(link_status, lane_cnt);
0717 if (cr_done)
0718 break;
0719
0720 for (i = 0; i < lane_cnt; i++)
0721 if (!(dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED))
0722 break;
0723 if (i == lane_cnt)
0724 break;
0725
0726 if ((dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == vs)
0727 tries++;
0728 else
0729 tries = 0;
0730
0731 if (tries == DP_MAX_TRAINING_TRIES)
0732 break;
0733
0734 vs = dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;
0735 zynqmp_dp_adjust_train(dp, link_status);
0736 }
0737
0738 if (!cr_done)
0739 return -EIO;
0740
0741 return 0;
0742 }
0743
0744
0745
0746
0747
0748
0749
0750
0751 static int zynqmp_dp_link_train_ce(struct zynqmp_dp *dp)
0752 {
0753 u8 link_status[DP_LINK_STATUS_SIZE];
0754 u8 lane_cnt = dp->mode.lane_cnt;
0755 u32 pat, tries;
0756 int ret;
0757 bool ce_done;
0758
0759 if (dp->dpcd[DP_DPCD_REV] >= DP_V1_2 &&
0760 dp->dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED)
0761 pat = DP_TRAINING_PATTERN_3;
0762 else
0763 pat = DP_TRAINING_PATTERN_2;
0764
0765 zynqmp_dp_write(dp, ZYNQMP_DP_TRAINING_PATTERN_SET, pat);
0766 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0767 pat | DP_LINK_SCRAMBLING_DISABLE);
0768 if (ret < 0)
0769 return ret;
0770
0771 for (tries = 0; tries < DP_MAX_TRAINING_TRIES; tries++) {
0772 ret = zynqmp_dp_update_vs_emph(dp);
0773 if (ret)
0774 return ret;
0775
0776 drm_dp_link_train_channel_eq_delay(&dp->aux, dp->dpcd);
0777 ret = drm_dp_dpcd_read_link_status(&dp->aux, link_status);
0778 if (ret < 0)
0779 return ret;
0780
0781 ce_done = drm_dp_channel_eq_ok(link_status, lane_cnt);
0782 if (ce_done)
0783 break;
0784
0785 zynqmp_dp_adjust_train(dp, link_status);
0786 }
0787
0788 if (!ce_done)
0789 return -EIO;
0790
0791 return 0;
0792 }
0793
0794
0795
0796
0797
0798
0799
0800 static int zynqmp_dp_train(struct zynqmp_dp *dp)
0801 {
0802 u32 reg;
0803 u8 bw_code = dp->mode.bw_code;
0804 u8 lane_cnt = dp->mode.lane_cnt;
0805 u8 aux_lane_cnt = lane_cnt;
0806 bool enhanced;
0807 int ret;
0808
0809 zynqmp_dp_write(dp, ZYNQMP_DP_LANE_COUNT_SET, lane_cnt);
0810 enhanced = drm_dp_enhanced_frame_cap(dp->dpcd);
0811 if (enhanced) {
0812 zynqmp_dp_write(dp, ZYNQMP_DP_ENHANCED_FRAME_EN, 1);
0813 aux_lane_cnt |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
0814 }
0815
0816 if (dp->dpcd[3] & 0x1) {
0817 zynqmp_dp_write(dp, ZYNQMP_DP_DOWNSPREAD_CTL, 1);
0818 drm_dp_dpcd_writeb(&dp->aux, DP_DOWNSPREAD_CTRL,
0819 DP_SPREAD_AMP_0_5);
0820 } else {
0821 zynqmp_dp_write(dp, ZYNQMP_DP_DOWNSPREAD_CTL, 0);
0822 drm_dp_dpcd_writeb(&dp->aux, DP_DOWNSPREAD_CTRL, 0);
0823 }
0824
0825 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LANE_COUNT_SET, aux_lane_cnt);
0826 if (ret < 0) {
0827 dev_err(dp->dev, "failed to set lane count\n");
0828 return ret;
0829 }
0830
0831 ret = drm_dp_dpcd_writeb(&dp->aux, DP_MAIN_LINK_CHANNEL_CODING_SET,
0832 DP_SET_ANSI_8B10B);
0833 if (ret < 0) {
0834 dev_err(dp->dev, "failed to set ANSI 8B/10B encoding\n");
0835 return ret;
0836 }
0837
0838 ret = drm_dp_dpcd_writeb(&dp->aux, DP_LINK_BW_SET, bw_code);
0839 if (ret < 0) {
0840 dev_err(dp->dev, "failed to set DP bandwidth\n");
0841 return ret;
0842 }
0843
0844 zynqmp_dp_write(dp, ZYNQMP_DP_LINK_BW_SET, bw_code);
0845 switch (bw_code) {
0846 case DP_LINK_BW_1_62:
0847 reg = ZYNQMP_DP_PHY_CLOCK_SELECT_1_62G;
0848 break;
0849 case DP_LINK_BW_2_7:
0850 reg = ZYNQMP_DP_PHY_CLOCK_SELECT_2_70G;
0851 break;
0852 case DP_LINK_BW_5_4:
0853 default:
0854 reg = ZYNQMP_DP_PHY_CLOCK_SELECT_5_40G;
0855 break;
0856 }
0857
0858 zynqmp_dp_write(dp, ZYNQMP_DP_PHY_CLOCK_SELECT, reg);
0859 ret = zynqmp_dp_phy_ready(dp);
0860 if (ret < 0)
0861 return ret;
0862
0863 zynqmp_dp_write(dp, ZYNQMP_DP_SCRAMBLING_DISABLE, 1);
0864 memset(dp->train_set, 0, sizeof(dp->train_set));
0865 ret = zynqmp_dp_link_train_cr(dp);
0866 if (ret)
0867 return ret;
0868
0869 ret = zynqmp_dp_link_train_ce(dp);
0870 if (ret)
0871 return ret;
0872
0873 ret = drm_dp_dpcd_writeb(&dp->aux, DP_TRAINING_PATTERN_SET,
0874 DP_TRAINING_PATTERN_DISABLE);
0875 if (ret < 0) {
0876 dev_err(dp->dev, "failed to disable training pattern\n");
0877 return ret;
0878 }
0879 zynqmp_dp_write(dp, ZYNQMP_DP_TRAINING_PATTERN_SET,
0880 DP_TRAINING_PATTERN_DISABLE);
0881
0882 zynqmp_dp_write(dp, ZYNQMP_DP_SCRAMBLING_DISABLE, 0);
0883
0884 return 0;
0885 }
0886
0887
0888
0889
0890
0891
0892
0893 static void zynqmp_dp_train_loop(struct zynqmp_dp *dp)
0894 {
0895 struct zynqmp_dp_mode *mode = &dp->mode;
0896 u8 bw = mode->bw_code;
0897 int ret;
0898
0899 do {
0900 if (dp->status == connector_status_disconnected ||
0901 !dp->enabled)
0902 return;
0903
0904 ret = zynqmp_dp_train(dp);
0905 if (!ret)
0906 return;
0907
0908 ret = zynqmp_dp_mode_configure(dp, mode->pclock, bw);
0909 if (ret < 0)
0910 goto err_out;
0911
0912 bw = ret;
0913 } while (bw >= DP_LINK_BW_1_62);
0914
0915 err_out:
0916 dev_err(dp->dev, "failed to train the DP link\n");
0917 }
0918
0919
0920
0921
0922
0923 #define AUX_READ_BIT 0x1
0924
0925
0926
0927
0928
0929
0930
0931
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947 static int zynqmp_dp_aux_cmd_submit(struct zynqmp_dp *dp, u32 cmd, u16 addr,
0948 u8 *buf, u8 bytes, u8 *reply)
0949 {
0950 bool is_read = (cmd & AUX_READ_BIT) ? true : false;
0951 u32 reg, i;
0952
0953 reg = zynqmp_dp_read(dp, ZYNQMP_DP_INTERRUPT_SIGNAL_STATE);
0954 if (reg & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REQUEST)
0955 return -EBUSY;
0956
0957 zynqmp_dp_write(dp, ZYNQMP_DP_AUX_ADDRESS, addr);
0958 if (!is_read)
0959 for (i = 0; i < bytes; i++)
0960 zynqmp_dp_write(dp, ZYNQMP_DP_AUX_WRITE_FIFO,
0961 buf[i]);
0962
0963 reg = cmd << ZYNQMP_DP_AUX_COMMAND_CMD_SHIFT;
0964 if (!buf || !bytes)
0965 reg |= ZYNQMP_DP_AUX_COMMAND_ADDRESS_ONLY;
0966 else
0967 reg |= (bytes - 1) << ZYNQMP_DP_AUX_COMMAND_BYTES_SHIFT;
0968 zynqmp_dp_write(dp, ZYNQMP_DP_AUX_COMMAND, reg);
0969
0970
0971 for (i = 0; ; i++) {
0972 reg = zynqmp_dp_read(dp, ZYNQMP_DP_INTERRUPT_SIGNAL_STATE);
0973 if (reg & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY)
0974 break;
0975
0976 if (reg & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_REPLY_TIMEOUT ||
0977 i == 2)
0978 return -ETIMEDOUT;
0979
0980 usleep_range(1000, 1100);
0981 }
0982
0983 reg = zynqmp_dp_read(dp, ZYNQMP_DP_AUX_REPLY_CODE);
0984 if (reply)
0985 *reply = reg;
0986
0987 if (is_read &&
0988 (reg == ZYNQMP_DP_AUX_REPLY_CODE_AUX_ACK ||
0989 reg == ZYNQMP_DP_AUX_REPLY_CODE_I2C_ACK)) {
0990 reg = zynqmp_dp_read(dp, ZYNQMP_DP_REPLY_DATA_COUNT);
0991 if ((reg & ZYNQMP_DP_REPLY_DATA_COUNT_MASK) != bytes)
0992 return -EIO;
0993
0994 for (i = 0; i < bytes; i++)
0995 buf[i] = zynqmp_dp_read(dp, ZYNQMP_DP_AUX_REPLY_DATA);
0996 }
0997
0998 return 0;
0999 }
1000
1001 static ssize_t
1002 zynqmp_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
1003 {
1004 struct zynqmp_dp *dp = container_of(aux, struct zynqmp_dp, aux);
1005 int ret;
1006 unsigned int i, iter;
1007
1008
1009 iter = zynqmp_dp_aux_timeout_ms * 1000 / 400;
1010 iter = iter ? iter : 1;
1011
1012 for (i = 0; i < iter; i++) {
1013 ret = zynqmp_dp_aux_cmd_submit(dp, msg->request, msg->address,
1014 msg->buffer, msg->size,
1015 &msg->reply);
1016 if (!ret) {
1017 dev_dbg(dp->dev, "aux %d retries\n", i);
1018 return msg->size;
1019 }
1020
1021 if (dp->status == connector_status_disconnected) {
1022 dev_dbg(dp->dev, "no connected aux device\n");
1023 return -ENODEV;
1024 }
1025
1026 usleep_range(400, 500);
1027 }
1028
1029 dev_dbg(dp->dev, "failed to do aux transfer (%d)\n", ret);
1030
1031 return ret;
1032 }
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042 static int zynqmp_dp_aux_init(struct zynqmp_dp *dp)
1043 {
1044 unsigned long rate;
1045 unsigned int w;
1046
1047
1048
1049
1050
1051
1052
1053
1054 rate = clk_get_rate(dp->dpsub->apb_clk);
1055 w = DIV_ROUND_UP(4 * rate, 1000 * 1000 * 10 * 8) * 8;
1056 if (w > 6 * rate / (1000 * 1000 * 10) || w > 48) {
1057 dev_err(dp->dev, "aclk frequency too high\n");
1058 return -EINVAL;
1059 }
1060
1061 zynqmp_dp_write(dp, ZYNQMP_DP_AUX_CLK_DIVIDER,
1062 (w << ZYNQMP_DP_AUX_CLK_DIVIDER_AUX_FILTER_SHIFT) |
1063 (rate / (1000 * 1000)));
1064
1065 dp->aux.name = "ZynqMP DP AUX";
1066 dp->aux.dev = dp->dev;
1067 dp->aux.drm_dev = dp->drm;
1068 dp->aux.transfer = zynqmp_dp_aux_transfer;
1069
1070 return drm_dp_aux_register(&dp->aux);
1071 }
1072
1073
1074
1075
1076
1077
1078
1079 static void zynqmp_dp_aux_cleanup(struct zynqmp_dp *dp)
1080 {
1081 drm_dp_aux_unregister(&dp->aux);
1082 }
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095 static void zynqmp_dp_update_misc(struct zynqmp_dp *dp)
1096 {
1097 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_MISC0, dp->config.misc0);
1098 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_MISC1, dp->config.misc1);
1099 }
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111 static int zynqmp_dp_set_format(struct zynqmp_dp *dp,
1112 enum zynqmp_dpsub_format format,
1113 unsigned int bpc)
1114 {
1115 static const struct drm_display_info *display;
1116 struct zynqmp_dp_config *config = &dp->config;
1117 unsigned int num_colors;
1118
1119 config->misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_MASK;
1120 config->misc1 &= ~ZYNQMP_DP_MAIN_STREAM_MISC1_Y_ONLY_EN;
1121
1122 switch (format) {
1123 case ZYNQMP_DPSUB_FORMAT_RGB:
1124 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_RGB;
1125 num_colors = 3;
1126 break;
1127
1128 case ZYNQMP_DPSUB_FORMAT_YCRCB444:
1129 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_444;
1130 num_colors = 3;
1131 break;
1132
1133 case ZYNQMP_DPSUB_FORMAT_YCRCB422:
1134 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_COMP_FORMAT_YCRCB_422;
1135 num_colors = 2;
1136 break;
1137
1138 case ZYNQMP_DPSUB_FORMAT_YONLY:
1139 config->misc1 |= ZYNQMP_DP_MAIN_STREAM_MISC1_Y_ONLY_EN;
1140 num_colors = 1;
1141 break;
1142
1143 default:
1144 dev_err(dp->dev, "Invalid colormetry in DT\n");
1145 return -EINVAL;
1146 }
1147
1148 display = &dp->connector.display_info;
1149 if (display->bpc && bpc > display->bpc) {
1150 dev_warn(dp->dev,
1151 "downgrading requested %ubpc to display limit %ubpc\n",
1152 bpc, display->bpc);
1153 bpc = display->bpc;
1154 }
1155
1156 config->misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_MASK;
1157
1158 switch (bpc) {
1159 case 6:
1160 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_6;
1161 break;
1162 case 8:
1163 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_8;
1164 break;
1165 case 10:
1166 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_10;
1167 break;
1168 case 12:
1169 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_12;
1170 break;
1171 case 16:
1172 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_16;
1173 break;
1174 default:
1175 dev_warn(dp->dev, "Not supported bpc (%u). fall back to 8bpc\n",
1176 bpc);
1177 config->misc0 |= ZYNQMP_DP_MAIN_STREAM_MISC0_BPC_8;
1178 bpc = 8;
1179 break;
1180 }
1181
1182
1183 config->bpp = bpc * num_colors;
1184
1185 return 0;
1186 }
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196 static void
1197 zynqmp_dp_encoder_mode_set_transfer_unit(struct zynqmp_dp *dp,
1198 struct drm_display_mode *mode)
1199 {
1200 u32 tu = ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE_TU_SIZE_DEF;
1201 u32 bw, vid_kbytes, avg_bytes_per_tu, init_wait;
1202
1203
1204 zynqmp_dp_write(dp, ZYNQMP_DP_MSA_TRANSFER_UNIT_SIZE, tu);
1205
1206 vid_kbytes = mode->clock * (dp->config.bpp / 8);
1207 bw = drm_dp_bw_code_to_link_rate(dp->mode.bw_code);
1208 avg_bytes_per_tu = vid_kbytes * tu / (dp->mode.lane_cnt * bw / 1000);
1209 zynqmp_dp_write(dp, ZYNQMP_DP_MIN_BYTES_PER_TU,
1210 avg_bytes_per_tu / 1000);
1211 zynqmp_dp_write(dp, ZYNQMP_DP_FRAC_BYTES_PER_TU,
1212 avg_bytes_per_tu % 1000);
1213
1214
1215 if (tu < (avg_bytes_per_tu / 1000))
1216 init_wait = 0;
1217 else if ((avg_bytes_per_tu / 1000) <= 4)
1218 init_wait = tu;
1219 else
1220 init_wait = tu - avg_bytes_per_tu / 1000;
1221
1222 zynqmp_dp_write(dp, ZYNQMP_DP_INIT_WAIT, init_wait);
1223 }
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233 static void zynqmp_dp_encoder_mode_set_stream(struct zynqmp_dp *dp,
1234 const struct drm_display_mode *mode)
1235 {
1236 u8 lane_cnt = dp->mode.lane_cnt;
1237 u32 reg, wpl;
1238 unsigned int rate;
1239
1240 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HTOTAL, mode->htotal);
1241 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VTOTAL, mode->vtotal);
1242 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_POLARITY,
1243 (!!(mode->flags & DRM_MODE_FLAG_PVSYNC) <<
1244 ZYNQMP_DP_MAIN_STREAM_POLARITY_VSYNC_SHIFT) |
1245 (!!(mode->flags & DRM_MODE_FLAG_PHSYNC) <<
1246 ZYNQMP_DP_MAIN_STREAM_POLARITY_HSYNC_SHIFT));
1247 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HSWIDTH,
1248 mode->hsync_end - mode->hsync_start);
1249 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VSWIDTH,
1250 mode->vsync_end - mode->vsync_start);
1251 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HRES, mode->hdisplay);
1252 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VRES, mode->vdisplay);
1253 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_HSTART,
1254 mode->htotal - mode->hsync_start);
1255 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_VSTART,
1256 mode->vtotal - mode->vsync_start);
1257
1258
1259 if (dp->config.misc0 & ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK) {
1260 reg = drm_dp_bw_code_to_link_rate(dp->mode.bw_code);
1261 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_N_VID, reg);
1262 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_M_VID, mode->clock);
1263 rate = zynqmp_disp_get_audio_clk_rate(dp->dpsub->disp);
1264 if (rate) {
1265 dev_dbg(dp->dev, "Audio rate: %d\n", rate / 512);
1266 zynqmp_dp_write(dp, ZYNQMP_DP_TX_N_AUD, reg);
1267 zynqmp_dp_write(dp, ZYNQMP_DP_TX_M_AUD, rate / 1000);
1268 }
1269 }
1270
1271
1272 if (zynqmp_disp_audio_enabled(dp->dpsub->disp))
1273 zynqmp_dp_write(dp, ZYNQMP_DP_TX_AUDIO_CHANNELS, 1);
1274
1275 zynqmp_dp_write(dp, ZYNQMP_DP_USER_PIX_WIDTH, 1);
1276
1277
1278 wpl = (mode->hdisplay * dp->config.bpp + 15) / 16;
1279 reg = wpl + wpl % lane_cnt - lane_cnt;
1280 zynqmp_dp_write(dp, ZYNQMP_DP_USER_DATA_COUNT_PER_LANE, reg);
1281 }
1282
1283
1284
1285
1286
1287 static enum drm_connector_status
1288 zynqmp_dp_connector_detect(struct drm_connector *connector, bool force)
1289 {
1290 struct zynqmp_dp *dp = connector_to_dp(connector);
1291 struct zynqmp_dp_link_config *link_config = &dp->link_config;
1292 u32 state, i;
1293 int ret;
1294
1295
1296
1297
1298
1299 for (i = 0; i < 10; i++) {
1300 state = zynqmp_dp_read(dp, ZYNQMP_DP_INTERRUPT_SIGNAL_STATE);
1301 if (state & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_HPD)
1302 break;
1303 msleep(100);
1304 }
1305
1306 if (state & ZYNQMP_DP_INTERRUPT_SIGNAL_STATE_HPD) {
1307 ret = drm_dp_dpcd_read(&dp->aux, 0x0, dp->dpcd,
1308 sizeof(dp->dpcd));
1309 if (ret < 0) {
1310 dev_dbg(dp->dev, "DPCD read failed");
1311 goto disconnected;
1312 }
1313
1314 link_config->max_rate = min_t(int,
1315 drm_dp_max_link_rate(dp->dpcd),
1316 DP_HIGH_BIT_RATE2);
1317 link_config->max_lanes = min_t(u8,
1318 drm_dp_max_lane_count(dp->dpcd),
1319 dp->num_lanes);
1320
1321 dp->status = connector_status_connected;
1322 return connector_status_connected;
1323 }
1324
1325 disconnected:
1326 dp->status = connector_status_disconnected;
1327 return connector_status_disconnected;
1328 }
1329
1330 static int zynqmp_dp_connector_get_modes(struct drm_connector *connector)
1331 {
1332 struct zynqmp_dp *dp = connector_to_dp(connector);
1333 struct edid *edid;
1334 int ret;
1335
1336 edid = drm_get_edid(connector, &dp->aux.ddc);
1337 if (!edid)
1338 return 0;
1339
1340 drm_connector_update_edid_property(connector, edid);
1341 ret = drm_add_edid_modes(connector, edid);
1342 kfree(edid);
1343
1344 return ret;
1345 }
1346
1347 static struct drm_encoder *
1348 zynqmp_dp_connector_best_encoder(struct drm_connector *connector)
1349 {
1350 struct zynqmp_dp *dp = connector_to_dp(connector);
1351
1352 return &dp->encoder;
1353 }
1354
1355 static int zynqmp_dp_connector_mode_valid(struct drm_connector *connector,
1356 struct drm_display_mode *mode)
1357 {
1358 struct zynqmp_dp *dp = connector_to_dp(connector);
1359 u8 max_lanes = dp->link_config.max_lanes;
1360 u8 bpp = dp->config.bpp;
1361 int max_rate = dp->link_config.max_rate;
1362 int rate;
1363
1364 if (mode->clock > ZYNQMP_MAX_FREQ) {
1365 dev_dbg(dp->dev, "filtered the mode, %s,for high pixel rate\n",
1366 mode->name);
1367 drm_mode_debug_printmodeline(mode);
1368 return MODE_CLOCK_HIGH;
1369 }
1370
1371
1372 rate = zynqmp_dp_max_rate(max_rate, max_lanes, bpp);
1373 if (mode->clock > rate) {
1374 dev_dbg(dp->dev, "filtered the mode, %s,for high pixel rate\n",
1375 mode->name);
1376 drm_mode_debug_printmodeline(mode);
1377 return MODE_CLOCK_HIGH;
1378 }
1379
1380 return MODE_OK;
1381 }
1382
1383 static const struct drm_connector_funcs zynqmp_dp_connector_funcs = {
1384 .detect = zynqmp_dp_connector_detect,
1385 .fill_modes = drm_helper_probe_single_connector_modes,
1386 .destroy = drm_connector_cleanup,
1387 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1388 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1389 .reset = drm_atomic_helper_connector_reset,
1390 };
1391
1392 static const struct drm_connector_helper_funcs
1393 zynqmp_dp_connector_helper_funcs = {
1394 .get_modes = zynqmp_dp_connector_get_modes,
1395 .best_encoder = zynqmp_dp_connector_best_encoder,
1396 .mode_valid = zynqmp_dp_connector_mode_valid,
1397 };
1398
1399
1400
1401
1402
1403 static void zynqmp_dp_encoder_enable(struct drm_encoder *encoder)
1404 {
1405 struct zynqmp_dp *dp = encoder_to_dp(encoder);
1406 unsigned int i;
1407 int ret = 0;
1408
1409 pm_runtime_get_sync(dp->dev);
1410 dp->enabled = true;
1411 zynqmp_dp_update_misc(dp);
1412 if (zynqmp_disp_audio_enabled(dp->dpsub->disp))
1413 zynqmp_dp_write(dp, ZYNQMP_DP_TX_AUDIO_CONTROL, 1);
1414 zynqmp_dp_write(dp, ZYNQMP_DP_TX_PHY_POWER_DOWN, 0);
1415 if (dp->status == connector_status_connected) {
1416 for (i = 0; i < 3; i++) {
1417 ret = drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER,
1418 DP_SET_POWER_D0);
1419 if (ret == 1)
1420 break;
1421 usleep_range(300, 500);
1422 }
1423
1424 msleep(zynqmp_dp_power_on_delay_ms);
1425 }
1426 if (ret != 1)
1427 dev_dbg(dp->dev, "DP aux failed\n");
1428 else
1429 zynqmp_dp_train_loop(dp);
1430 zynqmp_dp_write(dp, ZYNQMP_DP_SOFTWARE_RESET,
1431 ZYNQMP_DP_SOFTWARE_RESET_ALL);
1432 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_ENABLE, 1);
1433 }
1434
1435 static void zynqmp_dp_encoder_disable(struct drm_encoder *encoder)
1436 {
1437 struct zynqmp_dp *dp = encoder_to_dp(encoder);
1438
1439 dp->enabled = false;
1440 cancel_delayed_work(&dp->hpd_work);
1441 zynqmp_dp_write(dp, ZYNQMP_DP_MAIN_STREAM_ENABLE, 0);
1442 drm_dp_dpcd_writeb(&dp->aux, DP_SET_POWER, DP_SET_POWER_D3);
1443 zynqmp_dp_write(dp, ZYNQMP_DP_TX_PHY_POWER_DOWN,
1444 ZYNQMP_DP_TX_PHY_POWER_DOWN_ALL);
1445 if (zynqmp_disp_audio_enabled(dp->dpsub->disp))
1446 zynqmp_dp_write(dp, ZYNQMP_DP_TX_AUDIO_CONTROL, 0);
1447 pm_runtime_put_sync(dp->dev);
1448 }
1449
1450 static void
1451 zynqmp_dp_encoder_atomic_mode_set(struct drm_encoder *encoder,
1452 struct drm_crtc_state *crtc_state,
1453 struct drm_connector_state *connector_state)
1454 {
1455 struct zynqmp_dp *dp = encoder_to_dp(encoder);
1456 struct drm_display_mode *mode = &crtc_state->mode;
1457 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
1458 u8 max_lanes = dp->link_config.max_lanes;
1459 u8 bpp = dp->config.bpp;
1460 int rate, max_rate = dp->link_config.max_rate;
1461 int ret;
1462
1463 zynqmp_dp_set_format(dp, ZYNQMP_DPSUB_FORMAT_RGB, 8);
1464
1465
1466 rate = zynqmp_dp_max_rate(max_rate, max_lanes, bpp);
1467 if (mode->clock > rate) {
1468 dev_err(dp->dev, "the mode, %s,has too high pixel rate\n",
1469 mode->name);
1470 drm_mode_debug_printmodeline(mode);
1471 }
1472
1473 ret = zynqmp_dp_mode_configure(dp, adjusted_mode->clock, 0);
1474 if (ret < 0)
1475 return;
1476
1477 zynqmp_dp_encoder_mode_set_transfer_unit(dp, adjusted_mode);
1478 zynqmp_dp_encoder_mode_set_stream(dp, adjusted_mode);
1479 }
1480
1481 #define ZYNQMP_DP_MIN_H_BACKPORCH 20
1482
1483 static int
1484 zynqmp_dp_encoder_atomic_check(struct drm_encoder *encoder,
1485 struct drm_crtc_state *crtc_state,
1486 struct drm_connector_state *conn_state)
1487 {
1488 struct drm_display_mode *mode = &crtc_state->mode;
1489 struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
1490 int diff = mode->htotal - mode->hsync_end;
1491
1492
1493
1494
1495
1496 if (diff < ZYNQMP_DP_MIN_H_BACKPORCH) {
1497 int vrefresh = (adjusted_mode->clock * 1000) /
1498 (adjusted_mode->vtotal * adjusted_mode->htotal);
1499
1500 dev_dbg(encoder->dev->dev, "hbackporch adjusted: %d to %d",
1501 diff, ZYNQMP_DP_MIN_H_BACKPORCH - diff);
1502 diff = ZYNQMP_DP_MIN_H_BACKPORCH - diff;
1503 adjusted_mode->htotal += diff;
1504 adjusted_mode->clock = adjusted_mode->vtotal *
1505 adjusted_mode->htotal * vrefresh / 1000;
1506 }
1507
1508 return 0;
1509 }
1510
1511 static const struct drm_encoder_helper_funcs zynqmp_dp_encoder_helper_funcs = {
1512 .enable = zynqmp_dp_encoder_enable,
1513 .disable = zynqmp_dp_encoder_disable,
1514 .atomic_mode_set = zynqmp_dp_encoder_atomic_mode_set,
1515 .atomic_check = zynqmp_dp_encoder_atomic_check,
1516 };
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528 void zynqmp_dp_enable_vblank(struct zynqmp_dp *dp)
1529 {
1530 zynqmp_dp_write(dp, ZYNQMP_DP_INT_EN, ZYNQMP_DP_INT_VBLANK_START);
1531 }
1532
1533
1534
1535
1536
1537
1538
1539 void zynqmp_dp_disable_vblank(struct zynqmp_dp *dp)
1540 {
1541 zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, ZYNQMP_DP_INT_VBLANK_START);
1542 }
1543
1544 static void zynqmp_dp_hpd_work_func(struct work_struct *work)
1545 {
1546 struct zynqmp_dp *dp;
1547
1548 dp = container_of(work, struct zynqmp_dp, hpd_work.work);
1549
1550 if (dp->drm)
1551 drm_helper_hpd_irq_event(dp->drm);
1552 }
1553
1554 static irqreturn_t zynqmp_dp_irq_handler(int irq, void *data)
1555 {
1556 struct zynqmp_dp *dp = (struct zynqmp_dp *)data;
1557 u32 status, mask;
1558
1559 status = zynqmp_dp_read(dp, ZYNQMP_DP_INT_STATUS);
1560 mask = zynqmp_dp_read(dp, ZYNQMP_DP_INT_MASK);
1561 if (!(status & ~mask))
1562 return IRQ_NONE;
1563
1564
1565 if (status & ZYNQMP_DP_INT_CHBUF_UNDERFLW_MASK)
1566 dev_dbg_ratelimited(dp->dev, "underflow interrupt\n");
1567 if (status & ZYNQMP_DP_INT_CHBUF_OVERFLW_MASK)
1568 dev_dbg_ratelimited(dp->dev, "overflow interrupt\n");
1569
1570 zynqmp_dp_write(dp, ZYNQMP_DP_INT_STATUS, status);
1571
1572 if (status & ZYNQMP_DP_INT_VBLANK_START)
1573 zynqmp_disp_handle_vblank(dp->dpsub->disp);
1574
1575 if (status & ZYNQMP_DP_INT_HPD_EVENT)
1576 schedule_delayed_work(&dp->hpd_work, 0);
1577
1578 if (status & ZYNQMP_DP_INT_HPD_IRQ) {
1579 int ret;
1580 u8 status[DP_LINK_STATUS_SIZE + 2];
1581
1582 ret = drm_dp_dpcd_read(&dp->aux, DP_SINK_COUNT, status,
1583 DP_LINK_STATUS_SIZE + 2);
1584 if (ret < 0)
1585 goto handled;
1586
1587 if (status[4] & DP_LINK_STATUS_UPDATED ||
1588 !drm_dp_clock_recovery_ok(&status[2], dp->mode.lane_cnt) ||
1589 !drm_dp_channel_eq_ok(&status[2], dp->mode.lane_cnt)) {
1590 zynqmp_dp_train_loop(dp);
1591 }
1592 }
1593
1594 handled:
1595 return IRQ_HANDLED;
1596 }
1597
1598
1599
1600
1601
1602 int zynqmp_dp_drm_init(struct zynqmp_dpsub *dpsub)
1603 {
1604 struct zynqmp_dp *dp = dpsub->dp;
1605 struct drm_encoder *encoder = &dp->encoder;
1606 struct drm_connector *connector = &dp->connector;
1607 int ret;
1608
1609 dp->config.misc0 &= ~ZYNQMP_DP_MAIN_STREAM_MISC0_SYNC_LOCK;
1610 zynqmp_dp_set_format(dp, ZYNQMP_DPSUB_FORMAT_RGB, 8);
1611
1612
1613 encoder->possible_crtcs |= zynqmp_disp_get_crtc_mask(dpsub->disp);
1614 drm_simple_encoder_init(dp->drm, encoder, DRM_MODE_ENCODER_TMDS);
1615 drm_encoder_helper_add(encoder, &zynqmp_dp_encoder_helper_funcs);
1616
1617 connector->polled = DRM_CONNECTOR_POLL_HPD;
1618 ret = drm_connector_init(encoder->dev, connector,
1619 &zynqmp_dp_connector_funcs,
1620 DRM_MODE_CONNECTOR_DisplayPort);
1621 if (ret) {
1622 dev_err(dp->dev, "failed to create the DRM connector\n");
1623 return ret;
1624 }
1625
1626 drm_connector_helper_add(connector, &zynqmp_dp_connector_helper_funcs);
1627 drm_connector_register(connector);
1628 drm_connector_attach_encoder(connector, encoder);
1629
1630
1631 ret = zynqmp_dp_aux_init(dp);
1632 if (ret) {
1633 dev_err(dp->dev, "failed to initialize DP aux\n");
1634 return ret;
1635 }
1636
1637
1638 zynqmp_dp_write(dp, ZYNQMP_DP_INT_EN, ZYNQMP_DP_INT_ALL);
1639
1640 return 0;
1641 }
1642
1643 int zynqmp_dp_probe(struct zynqmp_dpsub *dpsub, struct drm_device *drm)
1644 {
1645 struct platform_device *pdev = to_platform_device(dpsub->dev);
1646 struct zynqmp_dp *dp;
1647 struct resource *res;
1648 int ret;
1649
1650 dp = drmm_kzalloc(drm, sizeof(*dp), GFP_KERNEL);
1651 if (!dp)
1652 return -ENOMEM;
1653
1654 dp->dev = &pdev->dev;
1655 dp->dpsub = dpsub;
1656 dp->status = connector_status_disconnected;
1657 dp->drm = drm;
1658
1659 INIT_DELAYED_WORK(&dp->hpd_work, zynqmp_dp_hpd_work_func);
1660
1661 dpsub->dp = dp;
1662
1663
1664 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dp");
1665 dp->iomem = devm_ioremap_resource(dp->dev, res);
1666 if (IS_ERR(dp->iomem))
1667 return PTR_ERR(dp->iomem);
1668
1669 dp->irq = platform_get_irq(pdev, 0);
1670 if (dp->irq < 0)
1671 return dp->irq;
1672
1673 dp->reset = devm_reset_control_get(dp->dev, NULL);
1674 if (IS_ERR(dp->reset)) {
1675 if (PTR_ERR(dp->reset) != -EPROBE_DEFER)
1676 dev_err(dp->dev, "failed to get reset: %ld\n",
1677 PTR_ERR(dp->reset));
1678 return PTR_ERR(dp->reset);
1679 }
1680
1681 ret = zynqmp_dp_reset(dp, false);
1682 if (ret < 0)
1683 return ret;
1684
1685 ret = zynqmp_dp_phy_probe(dp);
1686 if (ret)
1687 goto err_reset;
1688
1689
1690 zynqmp_dp_write(dp, ZYNQMP_DP_TX_PHY_POWER_DOWN,
1691 ZYNQMP_DP_TX_PHY_POWER_DOWN_ALL);
1692 zynqmp_dp_set(dp, ZYNQMP_DP_PHY_RESET, ZYNQMP_DP_PHY_RESET_ALL_RESET);
1693 zynqmp_dp_write(dp, ZYNQMP_DP_FORCE_SCRAMBLER_RESET, 1);
1694 zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 0);
1695 zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, 0xffffffff);
1696
1697 ret = zynqmp_dp_phy_init(dp);
1698 if (ret)
1699 goto err_reset;
1700
1701 zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 1);
1702
1703
1704
1705
1706
1707 ret = devm_request_threaded_irq(dp->dev, dp->irq, NULL,
1708 zynqmp_dp_irq_handler, IRQF_ONESHOT,
1709 dev_name(dp->dev), dp);
1710 if (ret < 0)
1711 goto err_phy_exit;
1712
1713 dev_dbg(dp->dev, "ZynqMP DisplayPort Tx probed with %u lanes\n",
1714 dp->num_lanes);
1715
1716 return 0;
1717
1718 err_phy_exit:
1719 zynqmp_dp_phy_exit(dp);
1720 err_reset:
1721 zynqmp_dp_reset(dp, true);
1722
1723 return ret;
1724 }
1725
1726 void zynqmp_dp_remove(struct zynqmp_dpsub *dpsub)
1727 {
1728 struct zynqmp_dp *dp = dpsub->dp;
1729
1730 zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, ZYNQMP_DP_INT_ALL);
1731 disable_irq(dp->irq);
1732
1733 cancel_delayed_work_sync(&dp->hpd_work);
1734 zynqmp_dp_aux_cleanup(dp);
1735
1736 zynqmp_dp_write(dp, ZYNQMP_DP_TRANSMITTER_ENABLE, 0);
1737 zynqmp_dp_write(dp, ZYNQMP_DP_INT_DS, 0xffffffff);
1738
1739 zynqmp_dp_phy_exit(dp);
1740 zynqmp_dp_reset(dp, true);
1741 }