[PATCH 4/6] drm: Cache DP dual mode adaptor max TMDS clock value

Imre Deak imre.deak at intel.com
Wed Nov 16 20:44:08 UTC 2016


The max TMDS clock value is a property of any adaptor (whether
explicitly stored in a DDC registers or implied by us), so store it in
the new dual mode adaptor object.

Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Cc: dri-devel at lists.freedesktop.org
Suggested-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
 drivers/gpu/drm/drm_dp_dual_mode_helper.c | 37 +++++++++++++++++++++----------
 drivers/gpu/drm/i915/intel_drv.h          |  3 ---
 drivers/gpu/drm/i915/intel_hdmi.c         | 10 +++------
 include/drm/drm_dp_dual_mode_helper.h     |  4 +++-
 4 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/drm_dp_dual_mode_helper.c b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
index 4e4ba945..d0e0fa0 100644
--- a/drivers/gpu/drm/drm_dp_dual_mode_helper.c
+++ b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
@@ -195,20 +195,33 @@ static int drm_dp_dual_mode_read_regs(struct drm_dp_dual_mode_adaptor *adaptor)
 		memset(&regs->desc, 0, sizeof(regs->desc));
 	}
 
+	ret = drm_dp_dual_mode_read(adaptor, DP_DUAL_MODE_MAX_TMDS_CLOCK,
+				    &regs->max_tmds_clock,
+				    sizeof(regs->max_tmds_clock));
+	if (ret) {
+		DRM_DEBUG_KMS("Reading TMDS clock failed (%zd)\n", ret);
+		regs->max_tmds_clock = 0;
+	}
+
 	dev_id_len = strnlen(regs->desc.device_id,
 			     sizeof(regs->desc.device_id));
 	DRM_DEBUG_KMS("DP dual-mode: HDMI-ID %*pE adaptor-ID %#02x\n"
-		      "OUI %*phD dev-ID %*pE HW-rev %d.%d SW-rev %d.%d\n",
+		      "OUI %*phD dev-ID %*pE HW-rev %d.%d SW-rev %d.%d\n"
+		      "TMDS-clock %d\n",
 		      (int)sizeof(regs->hdmi_id), regs->hdmi_id,
 		      regs->adaptor_id,
 		      (int)sizeof(regs->desc.oui), regs->desc.oui,
 		      dev_id_len, regs->desc.device_id,
 		      regs->desc.hw_rev >> 4, regs->desc.hw_rev & 0xf,
-		      regs->desc.sw_major_rev, regs->desc.sw_minor_rev);
+		      regs->desc.sw_major_rev, regs->desc.sw_minor_rev,
+		      regs->max_tmds_clock);
 
 	return 0;
 }
 
+static int
+drm_dp_dual_mode_max_tmds_clock(struct drm_dp_dual_mode_adaptor *adaptor);
+
 /**
  * drm_dp_dual_mode_detect - Identify the DP dual mode adaptor
  * @adaptor: DP dual mode adaptor
@@ -285,6 +298,8 @@ void drm_dp_dual_mode_detect(struct drm_dp_dual_mode_adaptor *adaptor,
 		else
 			adaptor->type = DRM_DP_DUAL_MODE_TYPE1_DVI;
 	}
+
+	adaptor->max_tmds_clock = drm_dp_dual_mode_max_tmds_clock(adaptor);
 }
 EXPORT_SYMBOL(drm_dp_dual_mode_detect);
 
@@ -309,6 +324,8 @@ void drm_dp_dual_mode_set_type(struct drm_dp_dual_mode_adaptor *adaptor,
 	/* Setting a type other than NONE is only valid after a detect call. */
 	WARN_ON(adaptor->type == DRM_DP_DUAL_MODE_NONE);
 	adaptor->type = type;
+
+	adaptor->max_tmds_clock = drm_dp_dual_mode_max_tmds_clock(adaptor);
 }
 EXPORT_SYMBOL(drm_dp_dual_mode_set_type);
 
@@ -326,11 +343,9 @@ EXPORT_SYMBOL(drm_dp_dual_mode_set_type);
  * Returns:
  * Maximum supported TMDS clock rate for the DP dual mode adaptor in kHz.
  */
-int drm_dp_dual_mode_max_tmds_clock(struct drm_dp_dual_mode_adaptor *adaptor)
+static int
+drm_dp_dual_mode_max_tmds_clock(struct drm_dp_dual_mode_adaptor *adaptor)
 {
-	uint8_t max_tmds_clock;
-	ssize_t ret;
-
 	/* native HDMI so no limit */
 	if (adaptor->type == DRM_DP_DUAL_MODE_NONE)
 		return 0;
@@ -342,16 +357,14 @@ int drm_dp_dual_mode_max_tmds_clock(struct drm_dp_dual_mode_adaptor *adaptor)
 	if (adaptor->type < DRM_DP_DUAL_MODE_TYPE2_DVI)
 		return 165000;
 
-	ret = drm_dp_dual_mode_read(adaptor, DP_DUAL_MODE_MAX_TMDS_CLOCK,
-				    &max_tmds_clock, sizeof(max_tmds_clock));
-	if (ret || max_tmds_clock == 0x00 || max_tmds_clock == 0xff) {
-		DRM_DEBUG_KMS("Failed to query max TMDS clock\n");
+	if (adaptor->regs.max_tmds_clock == 0x00 ||
+	    adaptor->regs.max_tmds_clock == 0xff) {
+		DRM_DEBUG_KMS("Unknown max TMDS clock\n");
 		return 165000;
 	}
 
-	return max_tmds_clock * 5000 / 2;
+	return adaptor->regs.max_tmds_clock * 5000 / 2;
 }
-EXPORT_SYMBOL(drm_dp_dual_mode_max_tmds_clock);
 
 /**
  * drm_dp_dual_mode_get_tmds_output - Get the state of the TMDS output buffers in the DP dual mode adaptor
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 9bdd635..8060ee5 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -828,9 +828,6 @@ struct intel_hdmi {
 	i915_reg_t hdmi_reg;
 	int ddc_bus;
 	struct drm_dp_dual_mode_adaptor dual_mode_adaptor;
-	struct {
-		int max_tmds_clock;
-	} dp_dual_mode;
 	bool limited_color_range;
 	bool color_range_auto;
 	bool has_hdmi_sink;
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index b6ee3a8..2d4d598 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1215,9 +1215,9 @@ static int hdmi_port_clock_limit(struct intel_hdmi *hdmi,
 		struct intel_connector *connector = hdmi->attached_connector;
 		const struct drm_display_info *info = &connector->base.display_info;
 
-		if (hdmi->dp_dual_mode.max_tmds_clock)
+		if (hdmi->dual_mode_adaptor.max_tmds_clock)
 			max_tmds_clock = min(max_tmds_clock,
-					     hdmi->dp_dual_mode.max_tmds_clock);
+					     hdmi->dual_mode_adaptor.max_tmds_clock);
 
 		if (info->max_tmds_clock)
 			max_tmds_clock = min(max_tmds_clock,
@@ -1389,7 +1389,6 @@ intel_hdmi_unset_edid(struct drm_connector *connector)
 
 	drm_dp_dual_mode_set_type(&intel_hdmi->dual_mode_adaptor,
 				  DRM_DP_DUAL_MODE_NONE);
-	intel_hdmi->dp_dual_mode.max_tmds_clock = 0;
 
 	kfree(to_intel_connector(connector)->detect_edid);
 	to_intel_connector(connector)->detect_edid = NULL;
@@ -1434,12 +1433,9 @@ intel_hdmi_dp_dual_mode_detect(struct drm_connector *connector, bool has_edid)
 	if (dual_mode_adaptor->type == DRM_DP_DUAL_MODE_NONE)
 		return;
 
-	hdmi->dp_dual_mode.max_tmds_clock =
-		drm_dp_dual_mode_max_tmds_clock(dual_mode_adaptor);
-
 	DRM_DEBUG_KMS("DP dual mode adaptor (%s) detected (max TMDS clock: %d kHz)\n",
 		      drm_dp_get_dual_mode_type_name(dual_mode_adaptor->type),
-		      hdmi->dp_dual_mode.max_tmds_clock);
+		      hdmi->dual_mode_adaptor.max_tmds_clock);
 }
 
 static bool
diff --git a/include/drm/drm_dp_dual_mode_helper.h b/include/drm/drm_dp_dual_mode_helper.h
index cb65584..6054013 100644
--- a/include/drm/drm_dp_dual_mode_helper.h
+++ b/include/drm/drm_dp_dual_mode_helper.h
@@ -112,7 +112,10 @@ struct drm_dp_dual_mode_adaptor {
 			uint8_t sw_major_rev;
 			uint8_t sw_minor_rev;
 		} __packed desc;
+		uint8_t max_tmds_clock;
 	} regs;
+
+	int max_tmds_clock;
 };
 
 void drm_dp_dual_mode_detect(struct drm_dp_dual_mode_adaptor *adaptor,
@@ -123,7 +126,6 @@ ssize_t drm_dp_dual_mode_read(struct drm_dp_dual_mode_adaptor *adaptor,
 			      u8 offset, void *buffer, size_t size);
 ssize_t drm_dp_dual_mode_write(struct drm_dp_dual_mode_adaptor *adaptor,
 			       u8 offset, const void *buffer, size_t size);
-int drm_dp_dual_mode_max_tmds_clock(struct drm_dp_dual_mode_adaptor *adaptor);
 int drm_dp_dual_mode_get_tmds_output(struct drm_dp_dual_mode_adaptor *adaptor,
 				     bool *enabled);
 int drm_dp_dual_mode_set_tmds_output(struct drm_dp_dual_mode_adaptor *adaptor,
-- 
2.5.0



More information about the Intel-gfx-trybot mailing list