Commit 610d7bc2 authored by Suraj Kandpal's avatar Suraj Kandpal Committed by Ankit Nautiyal
Browse files

drm/i915/hdcp: Read Rxcaps for robustibility



We see some monitors and docks report incorrect hdcp version
and capability in first few reads so we read rx_caps three times
before we conclude the monitor's or docks HDCP capability

--v2
-Add comment to justify the 3 time read loop for hdcp capability[Ankit]

Signed-off-by: default avatarSuraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Signed-off-by: default avatarAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240226063051.1685326-7-suraj.kandpal@intel.com
parent 66bd6924
Loading
Loading
Loading
Loading
+20 −9
Original line number Diff line number Diff line
@@ -644,9 +644,17 @@ int _intel_dp_hdcp2_get_capability(struct drm_dp_aux *aux,
				   bool *capable)
{
	u8 rx_caps[3];
	int ret;
	int ret, i;

	*capable = false;

	/*
	 * Some HDCP monitors act really shady by not giving the correct hdcp
	 * capability on the first rx_caps read and usually take an extra read
	 * to give the capability. We read rx_caps three times before we
	 * declare a monitor not capable of HDCP 2.2.
	 */
	for (i = 0; i < 3; i++) {
		ret = drm_dp_dpcd_read(aux,
				       DP_HDCP_2_2_REG_RX_CAPS_OFFSET,
				       rx_caps, HDCP_2_2_RXCAPS_LEN);
@@ -654,8 +662,11 @@ int _intel_dp_hdcp2_get_capability(struct drm_dp_aux *aux,
			return ret >= 0 ? -EIO : ret;

		if (rx_caps[0] == HDCP_2_2_RX_CAPS_VERSION_VAL &&
	    HDCP_2_2_DP_HDCP_CAPABLE(rx_caps[2]))
		    HDCP_2_2_DP_HDCP_CAPABLE(rx_caps[2])) {
			*capable = true;
			break;
		}
	}

	return 0;
}