Commit 85f720f7 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-next-fixes-2024-11-21' of...

Merge tag 'drm-intel-next-fixes-2024-11-21' of https://gitlab.freedesktop.org/drm/i915/kernel

 into drm-next

- Fix when the first read and write are retried [hdcp] (Suraj Kandpal)

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Tvrtko Ursulin <tursulin@igalia.com>
Link: https://patchwork.freedesktop.org/patch/msgid/Zz7xWbodMn9zZD_C@linux
parents a163b895 376a33c4
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -1503,6 +1503,8 @@ static int hdcp2_deauthenticate_port(struct intel_connector *connector)
static int hdcp2_authentication_key_exchange(struct intel_connector *connector)
{
	struct intel_display *display = to_intel_display(connector);
	struct intel_digital_port *dig_port =
		intel_attached_dig_port(connector);
	struct intel_hdcp *hdcp = &connector->hdcp;
	union {
		struct hdcp2_ake_init ake_init;
@@ -1513,30 +1515,36 @@ static int hdcp2_authentication_key_exchange(struct intel_connector *connector)
	} msgs;
	const struct intel_hdcp_shim *shim = hdcp->shim;
	size_t size;
	int ret, i;
	int ret, i, max_retries;

	/* Init for seq_num */
	hdcp->seq_num_v = 0;
	hdcp->seq_num_m = 0;

	if (intel_encoder_is_dp(&dig_port->base) ||
	    intel_encoder_is_mst(&dig_port->base))
		max_retries = 10;
	else
		max_retries = 1;

	ret = hdcp2_prepare_ake_init(connector, &msgs.ake_init);
	if (ret < 0)
		return ret;

	/*
	 * Retry the first read and write to downstream at least 10 times
	 * with a 50ms delay if not hdcp2 capable(dock decides to stop advertising
	 * hdcp2 capability for some reason). The reason being that
	 * during suspend resume dock usually keeps the HDCP2 registers inaccesible
	 * causing AUX error. This wouldn't be a big problem if the userspace
	 * just kept retrying with some delay while it continues to play low
	 * value content but most userpace applications end up throwing an error
	 * when it receives one from KMD. This makes sure we give the dock
	 * and the sink devices to complete its power cycle and then try HDCP
	 * authentication. The values of 10 and delay of 50ms was decided based
	 * on multiple trial and errors.
	 * with a 50ms delay if not hdcp2 capable for DP/DPMST encoders
	 * (dock decides to stop advertising hdcp2 capability for some reason).
	 * The reason being that during suspend resume dock usually keeps the
	 * HDCP2 registers inaccesible causing AUX error. This wouldn't be a
	 * big problem if the userspace just kept retrying with some delay while
	 * it continues to play low value content but most userpace applications
	 * end up throwing an error when it receives one from KMD. This makes
	 * sure we give the dock and the sink devices to complete its power cycle
	 * and then try HDCP authentication. The values of 10 and delay of 50ms
	 * was decided based on multiple trial and errors.
	 */
	for (i = 0; i < 10; i++) {
	for (i = 0; i < max_retries; i++) {
		if (!intel_hdcp2_get_capability(connector)) {
			msleep(50);
			continue;