From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Mon, 11 Dec 2023 08:20:59 +0000
Subject: [PATCH] kernel_5.10 no rt

---
 kernel/drivers/gpu/drm/rockchip/cdn-dp-link-training.c |   76 +++++++++++++++++++++-----------------
 1 files changed, 42 insertions(+), 34 deletions(-)

diff --git a/kernel/drivers/gpu/drm/rockchip/cdn-dp-link-training.c b/kernel/drivers/gpu/drm/rockchip/cdn-dp-link-training.c
index 08962e9..ec2f001 100644
--- a/kernel/drivers/gpu/drm/rockchip/cdn-dp-link-training.c
+++ b/kernel/drivers/gpu/drm/rockchip/cdn-dp-link-training.c
@@ -14,14 +14,24 @@
 static void cdn_dp_set_signal_levels(struct cdn_dp_device *dp)
 {
 	struct cdn_dp_port *port = dp->port[dp->active_port];
-	int rate = drm_dp_bw_code_to_link_rate(dp->link.rate);
+	union phy_configure_opts phy_cfg = {0};
 	u8 swing = (dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) >>
 		   DP_TRAIN_VOLTAGE_SWING_SHIFT;
 	u8 pre_emphasis = (dp->train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK)
 			  >> DP_TRAIN_PRE_EMPHASIS_SHIFT;
+	unsigned int lane;
 
-	tcphy_dp_set_phy_config(port->phy, rate, dp->link.num_lanes,
-				swing, pre_emphasis);
+	for (lane = 0; lane < dp->max_lanes; lane++) {
+		phy_cfg.dp.voltage[lane] = swing;
+		phy_cfg.dp.pre[lane] = pre_emphasis;
+	}
+
+	phy_cfg.dp.lanes = dp->max_lanes;
+	phy_cfg.dp.link_rate = drm_dp_bw_code_to_link_rate(dp->max_rate) / 100;
+	phy_cfg.dp.set_lanes = false;
+	phy_cfg.dp.set_rate = false;
+	phy_cfg.dp.set_voltages = true;
+	phy_configure(port->phy, &phy_cfg);
 }
 
 static int cdn_dp_set_pattern(struct cdn_dp_device *dp, uint8_t dp_train_pat)
@@ -30,7 +40,7 @@
 	int ret;
 	uint8_t pattern = dp_train_pat & DP_TRAINING_PATTERN_MASK;
 
-	global_config = NUM_LANES(dp->link.num_lanes - 1) | SST_MODE |
+	global_config = NUM_LANES(dp->max_lanes - 1) | SST_MODE |
 			GLOBAL_EN | RG_EN | ENC_RST_DIS | WR_VHSYNC_FALL;
 
 	phy_config = DP_TX_PHY_ENCODER_BYPASS(0) |
@@ -63,7 +73,7 @@
 		return ret;
 	}
 
-	ret = cdn_dp_reg_write(dp, DPTX_LANE_EN, BIT(dp->link.num_lanes) - 1);
+	ret = cdn_dp_reg_write(dp, DPTX_LANE_EN, BIT(dp->max_lanes) - 1);
 	if (ret) {
 		DRM_ERROR("fail to set DPTX_LANE_EN, error: %d\n", ret);
 		return ret;
@@ -106,7 +116,7 @@
 	uint8_t v = 0, p = 0;
 	uint8_t preemph_max;
 
-	for (i = 0; i < dp->link.num_lanes; i++) {
+	for (i = 0; i < dp->max_lanes; i++) {
 		v = max(v, drm_dp_get_adjust_request_voltage(link_status, i));
 		p = max(p, drm_dp_get_adjust_request_pre_emphasis(link_status,
 								  i));
@@ -119,7 +129,7 @@
 	if (p >= preemph_max)
 		p = preemph_max | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED;
 
-	for (i = 0; i < dp->link.num_lanes; i++)
+	for (i = 0; i < dp->max_lanes; i++)
 		dp->train_set[i] = v | p;
 }
 
@@ -149,7 +159,7 @@
 {
 	int lane;
 
-	for (lane = 0; lane < dp->link.num_lanes; lane++)
+	for (lane = 0; lane < dp->max_lanes; lane++)
 		if ((dp->train_set[lane] & DP_TRAIN_MAX_SWING_REACHED) == 0)
 			return false;
 
@@ -163,8 +173,8 @@
 	cdn_dp_set_signal_levels(dp);
 
 	ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_LANE0_SET,
-				dp->train_set, dp->link.num_lanes);
-	if (ret != dp->link.num_lanes)
+				dp->train_set, dp->max_lanes);
+	if (ret != dp->max_lanes)
 		return -EINVAL;
 
 	return 0;
@@ -183,8 +193,8 @@
 		len = 1;
 	} else {
 		/* DP_TRAINING_LANEx_SET follow DP_TRAINING_PATTERN_SET */
-		memcpy(buf + 1, dp->train_set, dp->link.num_lanes);
-		len = dp->link.num_lanes + 1;
+		memcpy(buf + 1, dp->train_set, dp->max_lanes);
+		len = dp->max_lanes + 1;
 	}
 
 	ret = drm_dp_dpcd_write(&dp->aux, DP_TRAINING_PATTERN_SET,
@@ -237,7 +247,7 @@
 			return -EINVAL;
 		}
 
-		if (drm_dp_clock_recovery_ok(link_status, dp->link.num_lanes)) {
+		if (drm_dp_clock_recovery_ok(link_status, dp->max_lanes)) {
 			DRM_DEBUG_KMS("clock recovery OK\n");
 			return 0;
 		}
@@ -301,12 +311,12 @@
 
 		/* Make sure clock is still ok */
 		if (!drm_dp_clock_recovery_ok(link_status,
-					      dp->link.num_lanes)) {
+					      dp->max_lanes)) {
 			DRM_DEBUG_KMS("Clock recovery check failed\n");
 			break;
 		}
 
-		if (drm_dp_channel_eq_ok(link_status,  dp->link.num_lanes)) {
+		if (drm_dp_channel_eq_ok(link_status,  dp->max_lanes)) {
 			DRM_DEBUG_KMS("Channel EQ done\n");
 			return 0;
 		}
@@ -338,17 +348,17 @@
 
 static int cdn_dp_get_lower_link_rate(struct cdn_dp_device *dp)
 {
-	switch (dp->link.rate) {
+	switch (dp->max_rate) {
 	case DP_LINK_BW_1_62:
 		return -EINVAL;
 	case DP_LINK_BW_2_7:
-		dp->link.rate = DP_LINK_BW_1_62;
+		dp->max_rate = DP_LINK_BW_1_62;
 		break;
 	case DP_LINK_BW_5_4:
-		dp->link.rate = DP_LINK_BW_2_7;
+		dp->max_rate = DP_LINK_BW_2_7;
 		break;
 	default:
-		dp->link.rate = DP_LINK_BW_5_4;
+		dp->max_rate = DP_LINK_BW_5_4;
 		break;
 	}
 
@@ -372,12 +382,12 @@
 
 	source_max = dp->lanes;
 	sink_max = drm_dp_max_lane_count(dp->dpcd);
-	dp->link.num_lanes = min(source_max, sink_max);
+	dp->max_lanes = min(source_max, sink_max);
 
 	source_max = drm_dp_bw_code_to_link_rate(CDN_DP_MAX_LINK_RATE);
 	sink_max = drm_dp_max_link_rate(dp->dpcd);
 	rate = min(source_max, sink_max);
-	dp->link.rate = drm_dp_link_rate_to_bw_code(rate);
+	dp->max_rate = drm_dp_link_rate_to_bw_code(rate);
 
 	ssc_on = !!(dp->dpcd[DP_MAX_DOWNSPREAD] & DP_MAX_DOWNSPREAD_0_5);
 	link_config[0] = ssc_on ? DP_SPREAD_AMP_0_5 : 0;
@@ -387,23 +397,21 @@
 	drm_dp_dpcd_write(&dp->aux, DP_DOWNSPREAD_CTRL, link_config, 2);
 
 	while (true) {
-		ret = tcphy_dp_set_link_rate(port->phy,
-				drm_dp_bw_code_to_link_rate(dp->link.rate),
-				ssc_on);
-		if (ret) {
-			DRM_ERROR("failed to set link rate: %d\n", ret);
-			return ret;
-		}
+		union phy_configure_opts phy_cfg = {0};
 
-		ret = tcphy_dp_set_lane_count(port->phy, dp->link.num_lanes);
-		if (ret) {
-			DRM_ERROR("failed to set lane count: %d\n", ret);
+		phy_cfg.dp.lanes = dp->max_lanes;
+		phy_cfg.dp.link_rate = drm_dp_bw_code_to_link_rate(dp->max_rate) / 100;
+		phy_cfg.dp.ssc = ssc_on;
+		phy_cfg.dp.set_lanes = true;
+		phy_cfg.dp.set_rate = true;
+		phy_cfg.dp.set_voltages = false;
+		ret = phy_configure(port->phy, &phy_cfg);
+		if (ret)
 			return ret;
-		}
 
 		/* Write the link configuration data */
-		link_config[0] = dp->link.rate;
-		link_config[1] = dp->link.num_lanes;
+		link_config[0] = dp->max_rate;
+		link_config[1] = dp->max_lanes;
 		if (drm_dp_enhanced_frame_cap(dp->dpcd))
 			link_config[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN;
 		drm_dp_dpcd_write(&dp->aux, DP_LINK_BW_SET, link_config, 2);

--
Gitblit v1.6.2