[PATCH 3/6] drm: Read out DP dual mode adaptor descriptor

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


To apply workarounds on buggy adaptors and for better diagnostics read
out the OUI,device-id and SW/HW revision registers from the dual mode
DDC address space.

Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Cc: dri-devel at lists.freedesktop.org
Signed-off-by: Imre Deak <imre.deak at intel.com>
---
 drivers/gpu/drm/drm_dp_dual_mode_helper.c | 19 +++++++++++++++++--
 include/drm/drm_dp_dual_mode_helper.h     |  7 +++++++
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/drm_dp_dual_mode_helper.c b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
index 1cb6c15..4e4ba945 100644
--- a/drivers/gpu/drm/drm_dp_dual_mode_helper.c
+++ b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
@@ -164,6 +164,7 @@ static bool is_lspcon_adaptor(const char hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN],
 static int drm_dp_dual_mode_read_regs(struct drm_dp_dual_mode_adaptor *adaptor)
 {
 	struct drm_dp_dual_mode_regs *regs = &adaptor->regs;
+	int dev_id_len;
 	ssize_t ret;
 
 	ret = drm_dp_dual_mode_read(adaptor, DP_DUAL_MODE_HDMI_ID,
@@ -187,9 +188,23 @@ static int drm_dp_dual_mode_read_regs(struct drm_dp_dual_mode_adaptor *adaptor)
 		regs->adaptor_id = 0;
 	}
 
-	DRM_DEBUG_KMS("DP dual-mode: HDMI-ID %*pE adaptor-ID %#02x\n",
+	ret = drm_dp_dual_mode_read(adaptor, DP_DUAL_MODE_IEEE_OUI,
+				    &regs->desc, sizeof(regs->desc));
+	if (ret) {
+		DRM_DEBUG_KMS("Reading descriptor failed (%zd)\n", ret);
+		memset(&regs->desc, 0, sizeof(regs->desc));
+	}
+
+	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",
 		      (int)sizeof(regs->hdmi_id), regs->hdmi_id,
-		      regs->adaptor_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);
 
 	return 0;
 }
diff --git a/include/drm/drm_dp_dual_mode_helper.h b/include/drm/drm_dp_dual_mode_helper.h
index 1436067..cb65584 100644
--- a/include/drm/drm_dp_dual_mode_helper.h
+++ b/include/drm/drm_dp_dual_mode_helper.h
@@ -105,6 +105,13 @@ struct drm_dp_dual_mode_adaptor {
 	struct drm_dp_dual_mode_regs {
 		uint8_t hdmi_id[16];
 		uint8_t adaptor_id;
+		struct drm_dp_dual_mode_desc {
+			uint8_t oui[3];
+			uint8_t device_id[6];
+			uint8_t hw_rev;
+			uint8_t sw_major_rev;
+			uint8_t sw_minor_rev;
+		} __packed desc;
 	} regs;
 };
 
-- 
2.5.0



More information about the Intel-gfx-trybot mailing list