From ee930fffee469d076998274a2ca55e13dc1efb67 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Fri, 10 May 2024 08:50:54 +0000
Subject: [PATCH] enable tun/tap/iptables

---
 u-boot/drivers/video/drm/dw-dp.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/u-boot/drivers/video/drm/dw-dp.c b/u-boot/drivers/video/drm/dw-dp.c
index e6e5b0b..2af2f82 100644
--- a/u-boot/drivers/video/drm/dw-dp.c
+++ b/u-boot/drivers/video/drm/dw-dp.c
@@ -231,6 +231,7 @@
 
 	bool force_hpd;
 	bool force_output;
+	u32 max_link_rate;
 };
 
 enum {
@@ -562,7 +563,7 @@
 		!!(dpcd & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED);
 
 	link->revision = link->dpcd[DP_DPCD_REV];
-	link->rate = min_t(u32, dp->phy.attrs.max_link_rate * 100,
+	link->rate = min_t(u32, min(dp->max_link_rate, dp->phy.attrs.max_link_rate * 100),
 			   drm_dp_max_link_rate(link->dpcd));
 	link->lanes = min_t(u8, dp->phy.attrs.bus_width,
 			    drm_dp_max_lane_count(link->dpcd));
@@ -1704,6 +1705,49 @@
 	return 0;
 }
 
+static u32 dw_dp_parse_link_frequencies(struct dw_dp *dp)
+{
+	struct udevice *dev = dp->dev;
+	const struct device_node *endpoint;
+	u64 frequency = 0;
+
+	endpoint = rockchip_of_graph_get_endpoint_by_regs(dev->node, 1, 0);
+	if (!endpoint)
+		return 0;
+
+	if (of_property_read_u64(endpoint, "link-frequencies", &frequency) < 0)
+		return 0;
+
+	if (!frequency)
+		return 0;
+
+	do_div(frequency, 10 * 1000);	/* symbol rate kbytes */
+
+	switch (frequency) {
+	case 162000:
+	case 270000:
+	case 540000:
+	case 810000:
+		break;
+	default:
+		dev_err(dev, "invalid link frequency value: %llu\n", frequency);
+		return 0;
+	}
+
+	return frequency;
+}
+
+static int dw_dp_parse_dt(struct dw_dp *dp)
+{
+	dp->force_hpd = dev_read_bool(dp->dev, "force-hpd");
+
+	dp->max_link_rate = dw_dp_parse_link_frequencies(dp);
+	if (!dp->max_link_rate)
+		dp->max_link_rate = 810000;
+
+	return 0;
+}
+
 static int dw_dp_probe(struct udevice *dev)
 {
 	struct dw_dp *dp = dev_get_priv(dev);
@@ -1723,8 +1767,6 @@
 		return ret;
 	}
 
-	dp->force_hpd = dev_read_bool(dev, "force-hpd");
-
 	ret = gpio_request_by_name(dev, "hpd-gpios", 0, &dp->hpd_gpio,
 				   GPIOD_IS_IN);
 	if (ret && ret != -ENOENT) {
@@ -1736,6 +1778,12 @@
 
 	dp->dev = dev;
 
+	ret = dw_dp_parse_dt(dp);
+	if (ret) {
+		dev_err(dev, "failed to parse DT\n");
+		return ret;
+	}
+
 	dw_dp_ddc_init(dp);
 
 	rockchip_connector_bind(&dp->connector, dev, dp->id, &dw_dp_connector_funcs, NULL,

--
Gitblit v1.6.2