[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(®s->desc, 0, sizeof(regs->desc));
}
+ ret = drm_dp_dual_mode_read(adaptor, DP_DUAL_MODE_MAX_TMDS_CLOCK,
+ ®s->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