xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/i915/display/intel_hdcp.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: MIT */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2017 Google, Inc.
4*4882a593Smuzhiyun  * Copyright _ 2017-2019, Intel Corporation.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Authors:
7*4882a593Smuzhiyun  * Sean Paul <seanpaul@chromium.org>
8*4882a593Smuzhiyun  * Ramalingam C <ramalingam.c@intel.com>
9*4882a593Smuzhiyun  */
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun #include <linux/component.h>
12*4882a593Smuzhiyun #include <linux/i2c.h>
13*4882a593Smuzhiyun #include <linux/random.h>
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #include <drm/drm_hdcp.h>
16*4882a593Smuzhiyun #include <drm/i915_component.h>
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #include "i915_reg.h"
19*4882a593Smuzhiyun #include "intel_display_power.h"
20*4882a593Smuzhiyun #include "intel_display_types.h"
21*4882a593Smuzhiyun #include "intel_hdcp.h"
22*4882a593Smuzhiyun #include "intel_sideband.h"
23*4882a593Smuzhiyun #include "intel_connector.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun #define KEY_LOAD_TRIES	5
26*4882a593Smuzhiyun #define ENCRYPT_STATUS_CHANGE_TIMEOUT_MS	50
27*4882a593Smuzhiyun #define HDCP2_LC_RETRY_CNT			3
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun static
intel_hdcp_is_ksv_valid(u8 * ksv)30*4882a593Smuzhiyun bool intel_hdcp_is_ksv_valid(u8 *ksv)
31*4882a593Smuzhiyun {
32*4882a593Smuzhiyun 	int i, ones = 0;
33*4882a593Smuzhiyun 	/* KSV has 20 1's and 20 0's */
34*4882a593Smuzhiyun 	for (i = 0; i < DRM_HDCP_KSV_LEN; i++)
35*4882a593Smuzhiyun 		ones += hweight8(ksv[i]);
36*4882a593Smuzhiyun 	if (ones != 20)
37*4882a593Smuzhiyun 		return false;
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun 	return true;
40*4882a593Smuzhiyun }
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun static
intel_hdcp_read_valid_bksv(struct intel_digital_port * dig_port,const struct intel_hdcp_shim * shim,u8 * bksv)43*4882a593Smuzhiyun int intel_hdcp_read_valid_bksv(struct intel_digital_port *dig_port,
44*4882a593Smuzhiyun 			       const struct intel_hdcp_shim *shim, u8 *bksv)
45*4882a593Smuzhiyun {
46*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
47*4882a593Smuzhiyun 	int ret, i, tries = 2;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun 	/* HDCP spec states that we must retry the bksv if it is invalid */
50*4882a593Smuzhiyun 	for (i = 0; i < tries; i++) {
51*4882a593Smuzhiyun 		ret = shim->read_bksv(dig_port, bksv);
52*4882a593Smuzhiyun 		if (ret)
53*4882a593Smuzhiyun 			return ret;
54*4882a593Smuzhiyun 		if (intel_hdcp_is_ksv_valid(bksv))
55*4882a593Smuzhiyun 			break;
56*4882a593Smuzhiyun 	}
57*4882a593Smuzhiyun 	if (i == tries) {
58*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "Bksv is invalid\n");
59*4882a593Smuzhiyun 		return -ENODEV;
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	return 0;
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /* Is HDCP1.4 capable on Platform and Sink */
intel_hdcp_capable(struct intel_connector * connector)66*4882a593Smuzhiyun bool intel_hdcp_capable(struct intel_connector *connector)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
69*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = connector->hdcp.shim;
70*4882a593Smuzhiyun 	bool capable = false;
71*4882a593Smuzhiyun 	u8 bksv[5];
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	if (!shim)
74*4882a593Smuzhiyun 		return capable;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	if (shim->hdcp_capable) {
77*4882a593Smuzhiyun 		shim->hdcp_capable(dig_port, &capable);
78*4882a593Smuzhiyun 	} else {
79*4882a593Smuzhiyun 		if (!intel_hdcp_read_valid_bksv(dig_port, shim, bksv))
80*4882a593Smuzhiyun 			capable = true;
81*4882a593Smuzhiyun 	}
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	return capable;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun /* Is HDCP2.2 capable on Platform and Sink */
intel_hdcp2_capable(struct intel_connector * connector)87*4882a593Smuzhiyun bool intel_hdcp2_capable(struct intel_connector *connector)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
90*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
91*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
92*4882a593Smuzhiyun 	bool capable = false;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	/* I915 support for HDCP2.2 */
95*4882a593Smuzhiyun 	if (!hdcp->hdcp2_supported)
96*4882a593Smuzhiyun 		return false;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	/* MEI interface is solid */
99*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
100*4882a593Smuzhiyun 	if (!dev_priv->hdcp_comp_added ||  !dev_priv->hdcp_master) {
101*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
102*4882a593Smuzhiyun 		return false;
103*4882a593Smuzhiyun 	}
104*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun 	/* Sink's capability for HDCP2.2 */
107*4882a593Smuzhiyun 	hdcp->shim->hdcp_2_2_capable(dig_port, &capable);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	return capable;
110*4882a593Smuzhiyun }
111*4882a593Smuzhiyun 
intel_hdcp_in_use(struct drm_i915_private * dev_priv,enum transcoder cpu_transcoder,enum port port)112*4882a593Smuzhiyun static bool intel_hdcp_in_use(struct drm_i915_private *dev_priv,
113*4882a593Smuzhiyun 			      enum transcoder cpu_transcoder, enum port port)
114*4882a593Smuzhiyun {
115*4882a593Smuzhiyun 	return intel_de_read(dev_priv,
116*4882a593Smuzhiyun 	                     HDCP_STATUS(dev_priv, cpu_transcoder, port)) &
117*4882a593Smuzhiyun 	       HDCP_STATUS_ENC;
118*4882a593Smuzhiyun }
119*4882a593Smuzhiyun 
intel_hdcp2_in_use(struct drm_i915_private * dev_priv,enum transcoder cpu_transcoder,enum port port)120*4882a593Smuzhiyun static bool intel_hdcp2_in_use(struct drm_i915_private *dev_priv,
121*4882a593Smuzhiyun 			       enum transcoder cpu_transcoder, enum port port)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun 	return intel_de_read(dev_priv,
124*4882a593Smuzhiyun 	                     HDCP2_STATUS(dev_priv, cpu_transcoder, port)) &
125*4882a593Smuzhiyun 	       LINK_ENCRYPTION_STATUS;
126*4882a593Smuzhiyun }
127*4882a593Smuzhiyun 
intel_hdcp_poll_ksv_fifo(struct intel_digital_port * dig_port,const struct intel_hdcp_shim * shim)128*4882a593Smuzhiyun static int intel_hdcp_poll_ksv_fifo(struct intel_digital_port *dig_port,
129*4882a593Smuzhiyun 				    const struct intel_hdcp_shim *shim)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	int ret, read_ret;
132*4882a593Smuzhiyun 	bool ksv_ready;
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	/* Poll for ksv list ready (spec says max time allowed is 5s) */
135*4882a593Smuzhiyun 	ret = __wait_for(read_ret = shim->read_ksv_ready(dig_port,
136*4882a593Smuzhiyun 							 &ksv_ready),
137*4882a593Smuzhiyun 			 read_ret || ksv_ready, 5 * 1000 * 1000, 1000,
138*4882a593Smuzhiyun 			 100 * 1000);
139*4882a593Smuzhiyun 	if (ret)
140*4882a593Smuzhiyun 		return ret;
141*4882a593Smuzhiyun 	if (read_ret)
142*4882a593Smuzhiyun 		return read_ret;
143*4882a593Smuzhiyun 	if (!ksv_ready)
144*4882a593Smuzhiyun 		return -ETIMEDOUT;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 	return 0;
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun 
hdcp_key_loadable(struct drm_i915_private * dev_priv)149*4882a593Smuzhiyun static bool hdcp_key_loadable(struct drm_i915_private *dev_priv)
150*4882a593Smuzhiyun {
151*4882a593Smuzhiyun 	enum i915_power_well_id id;
152*4882a593Smuzhiyun 	intel_wakeref_t wakeref;
153*4882a593Smuzhiyun 	bool enabled = false;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	/*
156*4882a593Smuzhiyun 	 * On HSW and BDW, Display HW loads the Key as soon as Display resumes.
157*4882a593Smuzhiyun 	 * On all BXT+, SW can load the keys only when the PW#1 is turned on.
158*4882a593Smuzhiyun 	 */
159*4882a593Smuzhiyun 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
160*4882a593Smuzhiyun 		id = HSW_DISP_PW_GLOBAL;
161*4882a593Smuzhiyun 	else
162*4882a593Smuzhiyun 		id = SKL_DISP_PW_1;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	/* PG1 (power well #1) needs to be enabled */
165*4882a593Smuzhiyun 	with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref)
166*4882a593Smuzhiyun 		enabled = intel_display_power_well_is_enabled(dev_priv, id);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	/*
169*4882a593Smuzhiyun 	 * Another req for hdcp key loadability is enabled state of pll for
170*4882a593Smuzhiyun 	 * cdclk. Without active crtc we wont land here. So we are assuming that
171*4882a593Smuzhiyun 	 * cdclk is already on.
172*4882a593Smuzhiyun 	 */
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	return enabled;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun 
intel_hdcp_clear_keys(struct drm_i915_private * dev_priv)177*4882a593Smuzhiyun static void intel_hdcp_clear_keys(struct drm_i915_private *dev_priv)
178*4882a593Smuzhiyun {
179*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_KEY_CONF, HDCP_CLEAR_KEYS_TRIGGER);
180*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_KEY_STATUS,
181*4882a593Smuzhiyun 		       HDCP_KEY_LOAD_DONE | HDCP_KEY_LOAD_STATUS | HDCP_FUSE_IN_PROGRESS | HDCP_FUSE_ERROR | HDCP_FUSE_DONE);
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun 
intel_hdcp_load_keys(struct drm_i915_private * dev_priv)184*4882a593Smuzhiyun static int intel_hdcp_load_keys(struct drm_i915_private *dev_priv)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun 	int ret;
187*4882a593Smuzhiyun 	u32 val;
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	val = intel_de_read(dev_priv, HDCP_KEY_STATUS);
190*4882a593Smuzhiyun 	if ((val & HDCP_KEY_LOAD_DONE) && (val & HDCP_KEY_LOAD_STATUS))
191*4882a593Smuzhiyun 		return 0;
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun 	/*
194*4882a593Smuzhiyun 	 * On HSW and BDW HW loads the HDCP1.4 Key when Display comes
195*4882a593Smuzhiyun 	 * out of reset. So if Key is not already loaded, its an error state.
196*4882a593Smuzhiyun 	 */
197*4882a593Smuzhiyun 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
198*4882a593Smuzhiyun 		if (!(intel_de_read(dev_priv, HDCP_KEY_STATUS) & HDCP_KEY_LOAD_DONE))
199*4882a593Smuzhiyun 			return -ENXIO;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun 	/*
202*4882a593Smuzhiyun 	 * Initiate loading the HDCP key from fuses.
203*4882a593Smuzhiyun 	 *
204*4882a593Smuzhiyun 	 * BXT+ platforms, HDCP key needs to be loaded by SW. Only Gen 9
205*4882a593Smuzhiyun 	 * platforms except BXT and GLK, differ in the key load trigger process
206*4882a593Smuzhiyun 	 * from other platforms. So GEN9_BC uses the GT Driver Mailbox i/f.
207*4882a593Smuzhiyun 	 */
208*4882a593Smuzhiyun 	if (IS_GEN9_BC(dev_priv)) {
209*4882a593Smuzhiyun 		ret = sandybridge_pcode_write(dev_priv,
210*4882a593Smuzhiyun 					      SKL_PCODE_LOAD_HDCP_KEYS, 1);
211*4882a593Smuzhiyun 		if (ret) {
212*4882a593Smuzhiyun 			drm_err(&dev_priv->drm,
213*4882a593Smuzhiyun 				"Failed to initiate HDCP key load (%d)\n",
214*4882a593Smuzhiyun 				ret);
215*4882a593Smuzhiyun 			return ret;
216*4882a593Smuzhiyun 		}
217*4882a593Smuzhiyun 	} else {
218*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_KEY_CONF, HDCP_KEY_LOAD_TRIGGER);
219*4882a593Smuzhiyun 	}
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun 	/* Wait for the keys to load (500us) */
222*4882a593Smuzhiyun 	ret = __intel_wait_for_register(&dev_priv->uncore, HDCP_KEY_STATUS,
223*4882a593Smuzhiyun 					HDCP_KEY_LOAD_DONE, HDCP_KEY_LOAD_DONE,
224*4882a593Smuzhiyun 					10, 1, &val);
225*4882a593Smuzhiyun 	if (ret)
226*4882a593Smuzhiyun 		return ret;
227*4882a593Smuzhiyun 	else if (!(val & HDCP_KEY_LOAD_STATUS))
228*4882a593Smuzhiyun 		return -ENXIO;
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun 	/* Send Aksv over to PCH display for use in authentication */
231*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_KEY_CONF, HDCP_AKSV_SEND_TRIGGER);
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun 	return 0;
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /* Returns updated SHA-1 index */
intel_write_sha_text(struct drm_i915_private * dev_priv,u32 sha_text)237*4882a593Smuzhiyun static int intel_write_sha_text(struct drm_i915_private *dev_priv, u32 sha_text)
238*4882a593Smuzhiyun {
239*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_SHA_TEXT, sha_text);
240*4882a593Smuzhiyun 	if (intel_de_wait_for_set(dev_priv, HDCP_REP_CTL, HDCP_SHA1_READY, 1)) {
241*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Timed out waiting for SHA1 ready\n");
242*4882a593Smuzhiyun 		return -ETIMEDOUT;
243*4882a593Smuzhiyun 	}
244*4882a593Smuzhiyun 	return 0;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun static
intel_hdcp_get_repeater_ctl(struct drm_i915_private * dev_priv,enum transcoder cpu_transcoder,enum port port)248*4882a593Smuzhiyun u32 intel_hdcp_get_repeater_ctl(struct drm_i915_private *dev_priv,
249*4882a593Smuzhiyun 				enum transcoder cpu_transcoder, enum port port)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun 	if (INTEL_GEN(dev_priv) >= 12) {
252*4882a593Smuzhiyun 		switch (cpu_transcoder) {
253*4882a593Smuzhiyun 		case TRANSCODER_A:
254*4882a593Smuzhiyun 			return HDCP_TRANSA_REP_PRESENT |
255*4882a593Smuzhiyun 			       HDCP_TRANSA_SHA1_M0;
256*4882a593Smuzhiyun 		case TRANSCODER_B:
257*4882a593Smuzhiyun 			return HDCP_TRANSB_REP_PRESENT |
258*4882a593Smuzhiyun 			       HDCP_TRANSB_SHA1_M0;
259*4882a593Smuzhiyun 		case TRANSCODER_C:
260*4882a593Smuzhiyun 			return HDCP_TRANSC_REP_PRESENT |
261*4882a593Smuzhiyun 			       HDCP_TRANSC_SHA1_M0;
262*4882a593Smuzhiyun 		case TRANSCODER_D:
263*4882a593Smuzhiyun 			return HDCP_TRANSD_REP_PRESENT |
264*4882a593Smuzhiyun 			       HDCP_TRANSD_SHA1_M0;
265*4882a593Smuzhiyun 		default:
266*4882a593Smuzhiyun 			drm_err(&dev_priv->drm, "Unknown transcoder %d\n",
267*4882a593Smuzhiyun 				cpu_transcoder);
268*4882a593Smuzhiyun 			return -EINVAL;
269*4882a593Smuzhiyun 		}
270*4882a593Smuzhiyun 	}
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun 	switch (port) {
273*4882a593Smuzhiyun 	case PORT_A:
274*4882a593Smuzhiyun 		return HDCP_DDIA_REP_PRESENT | HDCP_DDIA_SHA1_M0;
275*4882a593Smuzhiyun 	case PORT_B:
276*4882a593Smuzhiyun 		return HDCP_DDIB_REP_PRESENT | HDCP_DDIB_SHA1_M0;
277*4882a593Smuzhiyun 	case PORT_C:
278*4882a593Smuzhiyun 		return HDCP_DDIC_REP_PRESENT | HDCP_DDIC_SHA1_M0;
279*4882a593Smuzhiyun 	case PORT_D:
280*4882a593Smuzhiyun 		return HDCP_DDID_REP_PRESENT | HDCP_DDID_SHA1_M0;
281*4882a593Smuzhiyun 	case PORT_E:
282*4882a593Smuzhiyun 		return HDCP_DDIE_REP_PRESENT | HDCP_DDIE_SHA1_M0;
283*4882a593Smuzhiyun 	default:
284*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Unknown port %d\n", port);
285*4882a593Smuzhiyun 		return -EINVAL;
286*4882a593Smuzhiyun 	}
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun static
intel_hdcp_validate_v_prime(struct intel_connector * connector,const struct intel_hdcp_shim * shim,u8 * ksv_fifo,u8 num_downstream,u8 * bstatus)290*4882a593Smuzhiyun int intel_hdcp_validate_v_prime(struct intel_connector *connector,
291*4882a593Smuzhiyun 				const struct intel_hdcp_shim *shim,
292*4882a593Smuzhiyun 				u8 *ksv_fifo, u8 num_downstream, u8 *bstatus)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
295*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
296*4882a593Smuzhiyun 	enum transcoder cpu_transcoder = connector->hdcp.cpu_transcoder;
297*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
298*4882a593Smuzhiyun 	u32 vprime, sha_text, sha_leftovers, rep_ctl;
299*4882a593Smuzhiyun 	int ret, i, j, sha_idx;
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun 	/* Process V' values from the receiver */
302*4882a593Smuzhiyun 	for (i = 0; i < DRM_HDCP_V_PRIME_NUM_PARTS; i++) {
303*4882a593Smuzhiyun 		ret = shim->read_v_prime_part(dig_port, i, &vprime);
304*4882a593Smuzhiyun 		if (ret)
305*4882a593Smuzhiyun 			return ret;
306*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_SHA_V_PRIME(i), vprime);
307*4882a593Smuzhiyun 	}
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 	/*
310*4882a593Smuzhiyun 	 * We need to write the concatenation of all device KSVs, BINFO (DP) ||
311*4882a593Smuzhiyun 	 * BSTATUS (HDMI), and M0 (which is added via HDCP_REP_CTL). This byte
312*4882a593Smuzhiyun 	 * stream is written via the HDCP_SHA_TEXT register in 32-bit
313*4882a593Smuzhiyun 	 * increments. Every 64 bytes, we need to write HDCP_REP_CTL again. This
314*4882a593Smuzhiyun 	 * index will keep track of our progress through the 64 bytes as well as
315*4882a593Smuzhiyun 	 * helping us work the 40-bit KSVs through our 32-bit register.
316*4882a593Smuzhiyun 	 *
317*4882a593Smuzhiyun 	 * NOTE: data passed via HDCP_SHA_TEXT should be big-endian
318*4882a593Smuzhiyun 	 */
319*4882a593Smuzhiyun 	sha_idx = 0;
320*4882a593Smuzhiyun 	sha_text = 0;
321*4882a593Smuzhiyun 	sha_leftovers = 0;
322*4882a593Smuzhiyun 	rep_ctl = intel_hdcp_get_repeater_ctl(dev_priv, cpu_transcoder, port);
323*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_REP_CTL, rep_ctl | HDCP_SHA1_TEXT_32);
324*4882a593Smuzhiyun 	for (i = 0; i < num_downstream; i++) {
325*4882a593Smuzhiyun 		unsigned int sha_empty;
326*4882a593Smuzhiyun 		u8 *ksv = &ksv_fifo[i * DRM_HDCP_KSV_LEN];
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 		/* Fill up the empty slots in sha_text and write it out */
329*4882a593Smuzhiyun 		sha_empty = sizeof(sha_text) - sha_leftovers;
330*4882a593Smuzhiyun 		for (j = 0; j < sha_empty; j++) {
331*4882a593Smuzhiyun 			u8 off = ((sizeof(sha_text) - j - 1 - sha_leftovers) * 8);
332*4882a593Smuzhiyun 			sha_text |= ksv[j] << off;
333*4882a593Smuzhiyun 		}
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, sha_text);
336*4882a593Smuzhiyun 		if (ret < 0)
337*4882a593Smuzhiyun 			return ret;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 		/* Programming guide writes this every 64 bytes */
340*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
341*4882a593Smuzhiyun 		if (!(sha_idx % 64))
342*4882a593Smuzhiyun 			intel_de_write(dev_priv, HDCP_REP_CTL,
343*4882a593Smuzhiyun 				       rep_ctl | HDCP_SHA1_TEXT_32);
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun 		/* Store the leftover bytes from the ksv in sha_text */
346*4882a593Smuzhiyun 		sha_leftovers = DRM_HDCP_KSV_LEN - sha_empty;
347*4882a593Smuzhiyun 		sha_text = 0;
348*4882a593Smuzhiyun 		for (j = 0; j < sha_leftovers; j++)
349*4882a593Smuzhiyun 			sha_text |= ksv[sha_empty + j] <<
350*4882a593Smuzhiyun 					((sizeof(sha_text) - j - 1) * 8);
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 		/*
353*4882a593Smuzhiyun 		 * If we still have room in sha_text for more data, continue.
354*4882a593Smuzhiyun 		 * Otherwise, write it out immediately.
355*4882a593Smuzhiyun 		 */
356*4882a593Smuzhiyun 		if (sizeof(sha_text) > sha_leftovers)
357*4882a593Smuzhiyun 			continue;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, sha_text);
360*4882a593Smuzhiyun 		if (ret < 0)
361*4882a593Smuzhiyun 			return ret;
362*4882a593Smuzhiyun 		sha_leftovers = 0;
363*4882a593Smuzhiyun 		sha_text = 0;
364*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
365*4882a593Smuzhiyun 	}
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	/*
368*4882a593Smuzhiyun 	 * We need to write BINFO/BSTATUS, and M0 now. Depending on how many
369*4882a593Smuzhiyun 	 * bytes are leftover from the last ksv, we might be able to fit them
370*4882a593Smuzhiyun 	 * all in sha_text (first 2 cases), or we might need to split them up
371*4882a593Smuzhiyun 	 * into 2 writes (last 2 cases).
372*4882a593Smuzhiyun 	 */
373*4882a593Smuzhiyun 	if (sha_leftovers == 0) {
374*4882a593Smuzhiyun 		/* Write 16 bits of text, 16 bits of M0 */
375*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
376*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_16);
377*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv,
378*4882a593Smuzhiyun 					   bstatus[0] << 8 | bstatus[1]);
379*4882a593Smuzhiyun 		if (ret < 0)
380*4882a593Smuzhiyun 			return ret;
381*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 		/* Write 32 bits of M0 */
384*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
385*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_0);
386*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
387*4882a593Smuzhiyun 		if (ret < 0)
388*4882a593Smuzhiyun 			return ret;
389*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 		/* Write 16 bits of M0 */
392*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
393*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_16);
394*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
395*4882a593Smuzhiyun 		if (ret < 0)
396*4882a593Smuzhiyun 			return ret;
397*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun 	} else if (sha_leftovers == 1) {
400*4882a593Smuzhiyun 		/* Write 24 bits of text, 8 bits of M0 */
401*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
402*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_24);
403*4882a593Smuzhiyun 		sha_text |= bstatus[0] << 16 | bstatus[1] << 8;
404*4882a593Smuzhiyun 		/* Only 24-bits of data, must be in the LSB */
405*4882a593Smuzhiyun 		sha_text = (sha_text & 0xffffff00) >> 8;
406*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, sha_text);
407*4882a593Smuzhiyun 		if (ret < 0)
408*4882a593Smuzhiyun 			return ret;
409*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun 		/* Write 32 bits of M0 */
412*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
413*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_0);
414*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
415*4882a593Smuzhiyun 		if (ret < 0)
416*4882a593Smuzhiyun 			return ret;
417*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun 		/* Write 24 bits of M0 */
420*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
421*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_8);
422*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
423*4882a593Smuzhiyun 		if (ret < 0)
424*4882a593Smuzhiyun 			return ret;
425*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun 	} else if (sha_leftovers == 2) {
428*4882a593Smuzhiyun 		/* Write 32 bits of text */
429*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
430*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_32);
431*4882a593Smuzhiyun 		sha_text |= bstatus[0] << 8 | bstatus[1];
432*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, sha_text);
433*4882a593Smuzhiyun 		if (ret < 0)
434*4882a593Smuzhiyun 			return ret;
435*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
436*4882a593Smuzhiyun 
437*4882a593Smuzhiyun 		/* Write 64 bits of M0 */
438*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
439*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_0);
440*4882a593Smuzhiyun 		for (i = 0; i < 2; i++) {
441*4882a593Smuzhiyun 			ret = intel_write_sha_text(dev_priv, 0);
442*4882a593Smuzhiyun 			if (ret < 0)
443*4882a593Smuzhiyun 				return ret;
444*4882a593Smuzhiyun 			sha_idx += sizeof(sha_text);
445*4882a593Smuzhiyun 		}
446*4882a593Smuzhiyun 
447*4882a593Smuzhiyun 		/*
448*4882a593Smuzhiyun 		 * Terminate the SHA-1 stream by hand. For the other leftover
449*4882a593Smuzhiyun 		 * cases this is appended by the hardware.
450*4882a593Smuzhiyun 		 */
451*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
452*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_32);
453*4882a593Smuzhiyun 		sha_text = DRM_HDCP_SHA1_TERMINATOR << 24;
454*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, sha_text);
455*4882a593Smuzhiyun 		if (ret < 0)
456*4882a593Smuzhiyun 			return ret;
457*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
458*4882a593Smuzhiyun 	} else if (sha_leftovers == 3) {
459*4882a593Smuzhiyun 		/* Write 32 bits of text (filled from LSB) */
460*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
461*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_32);
462*4882a593Smuzhiyun 		sha_text |= bstatus[0];
463*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, sha_text);
464*4882a593Smuzhiyun 		if (ret < 0)
465*4882a593Smuzhiyun 			return ret;
466*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 		/* Write 8 bits of text (filled from LSB), 24 bits of M0 */
469*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
470*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_8);
471*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, bstatus[1]);
472*4882a593Smuzhiyun 		if (ret < 0)
473*4882a593Smuzhiyun 			return ret;
474*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun 		/* Write 32 bits of M0 */
477*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
478*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_0);
479*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
480*4882a593Smuzhiyun 		if (ret < 0)
481*4882a593Smuzhiyun 			return ret;
482*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
483*4882a593Smuzhiyun 
484*4882a593Smuzhiyun 		/* Write 8 bits of M0 */
485*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
486*4882a593Smuzhiyun 			       rep_ctl | HDCP_SHA1_TEXT_24);
487*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
488*4882a593Smuzhiyun 		if (ret < 0)
489*4882a593Smuzhiyun 			return ret;
490*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
491*4882a593Smuzhiyun 	} else {
492*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Invalid number of leftovers %d\n",
493*4882a593Smuzhiyun 			    sha_leftovers);
494*4882a593Smuzhiyun 		return -EINVAL;
495*4882a593Smuzhiyun 	}
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_REP_CTL, rep_ctl | HDCP_SHA1_TEXT_32);
498*4882a593Smuzhiyun 	/* Fill up to 64-4 bytes with zeros (leave the last write for length) */
499*4882a593Smuzhiyun 	while ((sha_idx % 64) < (64 - sizeof(sha_text))) {
500*4882a593Smuzhiyun 		ret = intel_write_sha_text(dev_priv, 0);
501*4882a593Smuzhiyun 		if (ret < 0)
502*4882a593Smuzhiyun 			return ret;
503*4882a593Smuzhiyun 		sha_idx += sizeof(sha_text);
504*4882a593Smuzhiyun 	}
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	/*
507*4882a593Smuzhiyun 	 * Last write gets the length of the concatenation in bits. That is:
508*4882a593Smuzhiyun 	 *  - 5 bytes per device
509*4882a593Smuzhiyun 	 *  - 10 bytes for BINFO/BSTATUS(2), M0(8)
510*4882a593Smuzhiyun 	 */
511*4882a593Smuzhiyun 	sha_text = (num_downstream * 5 + 10) * 8;
512*4882a593Smuzhiyun 	ret = intel_write_sha_text(dev_priv, sha_text);
513*4882a593Smuzhiyun 	if (ret < 0)
514*4882a593Smuzhiyun 		return ret;
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun 	/* Tell the HW we're done with the hash and wait for it to ACK */
517*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_REP_CTL,
518*4882a593Smuzhiyun 		       rep_ctl | HDCP_SHA1_COMPLETE_HASH);
519*4882a593Smuzhiyun 	if (intel_de_wait_for_set(dev_priv, HDCP_REP_CTL,
520*4882a593Smuzhiyun 				  HDCP_SHA1_COMPLETE, 1)) {
521*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Timed out waiting for SHA1 complete\n");
522*4882a593Smuzhiyun 		return -ETIMEDOUT;
523*4882a593Smuzhiyun 	}
524*4882a593Smuzhiyun 	if (!(intel_de_read(dev_priv, HDCP_REP_CTL) & HDCP_SHA1_V_MATCH)) {
525*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "SHA-1 mismatch, HDCP failed\n");
526*4882a593Smuzhiyun 		return -ENXIO;
527*4882a593Smuzhiyun 	}
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun 	return 0;
530*4882a593Smuzhiyun }
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun /* Implements Part 2 of the HDCP authorization procedure */
533*4882a593Smuzhiyun static
intel_hdcp_auth_downstream(struct intel_connector * connector)534*4882a593Smuzhiyun int intel_hdcp_auth_downstream(struct intel_connector *connector)
535*4882a593Smuzhiyun {
536*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
537*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
538*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = connector->hdcp.shim;
539*4882a593Smuzhiyun 	u8 bstatus[2], num_downstream, *ksv_fifo;
540*4882a593Smuzhiyun 	int ret, i, tries = 3;
541*4882a593Smuzhiyun 
542*4882a593Smuzhiyun 	ret = intel_hdcp_poll_ksv_fifo(dig_port, shim);
543*4882a593Smuzhiyun 	if (ret) {
544*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
545*4882a593Smuzhiyun 			    "KSV list failed to become ready (%d)\n", ret);
546*4882a593Smuzhiyun 		return ret;
547*4882a593Smuzhiyun 	}
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	ret = shim->read_bstatus(dig_port, bstatus);
550*4882a593Smuzhiyun 	if (ret)
551*4882a593Smuzhiyun 		return ret;
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	if (DRM_HDCP_MAX_DEVICE_EXCEEDED(bstatus[0]) ||
554*4882a593Smuzhiyun 	    DRM_HDCP_MAX_CASCADE_EXCEEDED(bstatus[1])) {
555*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Max Topology Limit Exceeded\n");
556*4882a593Smuzhiyun 		return -EPERM;
557*4882a593Smuzhiyun 	}
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun 	/*
560*4882a593Smuzhiyun 	 * When repeater reports 0 device count, HDCP1.4 spec allows disabling
561*4882a593Smuzhiyun 	 * the HDCP encryption. That implies that repeater can't have its own
562*4882a593Smuzhiyun 	 * display. As there is no consumption of encrypted content in the
563*4882a593Smuzhiyun 	 * repeater with 0 downstream devices, we are failing the
564*4882a593Smuzhiyun 	 * authentication.
565*4882a593Smuzhiyun 	 */
566*4882a593Smuzhiyun 	num_downstream = DRM_HDCP_NUM_DOWNSTREAM(bstatus[0]);
567*4882a593Smuzhiyun 	if (num_downstream == 0) {
568*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
569*4882a593Smuzhiyun 			    "Repeater with zero downstream devices\n");
570*4882a593Smuzhiyun 		return -EINVAL;
571*4882a593Smuzhiyun 	}
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	ksv_fifo = kcalloc(DRM_HDCP_KSV_LEN, num_downstream, GFP_KERNEL);
574*4882a593Smuzhiyun 	if (!ksv_fifo) {
575*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Out of mem: ksv_fifo\n");
576*4882a593Smuzhiyun 		return -ENOMEM;
577*4882a593Smuzhiyun 	}
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun 	ret = shim->read_ksv_fifo(dig_port, num_downstream, ksv_fifo);
580*4882a593Smuzhiyun 	if (ret)
581*4882a593Smuzhiyun 		goto err;
582*4882a593Smuzhiyun 
583*4882a593Smuzhiyun 	if (drm_hdcp_check_ksvs_revoked(&dev_priv->drm, ksv_fifo,
584*4882a593Smuzhiyun 					num_downstream) > 0) {
585*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Revoked Ksv(s) in ksv_fifo\n");
586*4882a593Smuzhiyun 		ret = -EPERM;
587*4882a593Smuzhiyun 		goto err;
588*4882a593Smuzhiyun 	}
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun 	/*
591*4882a593Smuzhiyun 	 * When V prime mismatches, DP Spec mandates re-read of
592*4882a593Smuzhiyun 	 * V prime atleast twice.
593*4882a593Smuzhiyun 	 */
594*4882a593Smuzhiyun 	for (i = 0; i < tries; i++) {
595*4882a593Smuzhiyun 		ret = intel_hdcp_validate_v_prime(connector, shim,
596*4882a593Smuzhiyun 						  ksv_fifo, num_downstream,
597*4882a593Smuzhiyun 						  bstatus);
598*4882a593Smuzhiyun 		if (!ret)
599*4882a593Smuzhiyun 			break;
600*4882a593Smuzhiyun 	}
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun 	if (i == tries) {
603*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
604*4882a593Smuzhiyun 			    "V Prime validation failed.(%d)\n", ret);
605*4882a593Smuzhiyun 		goto err;
606*4882a593Smuzhiyun 	}
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm, "HDCP is enabled (%d downstream devices)\n",
609*4882a593Smuzhiyun 		    num_downstream);
610*4882a593Smuzhiyun 	ret = 0;
611*4882a593Smuzhiyun err:
612*4882a593Smuzhiyun 	kfree(ksv_fifo);
613*4882a593Smuzhiyun 	return ret;
614*4882a593Smuzhiyun }
615*4882a593Smuzhiyun 
616*4882a593Smuzhiyun /* Implements Part 1 of the HDCP authorization procedure */
intel_hdcp_auth(struct intel_connector * connector)617*4882a593Smuzhiyun static int intel_hdcp_auth(struct intel_connector *connector)
618*4882a593Smuzhiyun {
619*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
620*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
621*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
622*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = hdcp->shim;
623*4882a593Smuzhiyun 	enum transcoder cpu_transcoder = connector->hdcp.cpu_transcoder;
624*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
625*4882a593Smuzhiyun 	unsigned long r0_prime_gen_start;
626*4882a593Smuzhiyun 	int ret, i, tries = 2;
627*4882a593Smuzhiyun 	union {
628*4882a593Smuzhiyun 		u32 reg[2];
629*4882a593Smuzhiyun 		u8 shim[DRM_HDCP_AN_LEN];
630*4882a593Smuzhiyun 	} an;
631*4882a593Smuzhiyun 	union {
632*4882a593Smuzhiyun 		u32 reg[2];
633*4882a593Smuzhiyun 		u8 shim[DRM_HDCP_KSV_LEN];
634*4882a593Smuzhiyun 	} bksv;
635*4882a593Smuzhiyun 	union {
636*4882a593Smuzhiyun 		u32 reg;
637*4882a593Smuzhiyun 		u8 shim[DRM_HDCP_RI_LEN];
638*4882a593Smuzhiyun 	} ri;
639*4882a593Smuzhiyun 	bool repeater_present, hdcp_capable;
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun 	/*
642*4882a593Smuzhiyun 	 * Detects whether the display is HDCP capable. Although we check for
643*4882a593Smuzhiyun 	 * valid Bksv below, the HDCP over DP spec requires that we check
644*4882a593Smuzhiyun 	 * whether the display supports HDCP before we write An. For HDMI
645*4882a593Smuzhiyun 	 * displays, this is not necessary.
646*4882a593Smuzhiyun 	 */
647*4882a593Smuzhiyun 	if (shim->hdcp_capable) {
648*4882a593Smuzhiyun 		ret = shim->hdcp_capable(dig_port, &hdcp_capable);
649*4882a593Smuzhiyun 		if (ret)
650*4882a593Smuzhiyun 			return ret;
651*4882a593Smuzhiyun 		if (!hdcp_capable) {
652*4882a593Smuzhiyun 			drm_dbg_kms(&dev_priv->drm,
653*4882a593Smuzhiyun 				    "Panel is not HDCP capable\n");
654*4882a593Smuzhiyun 			return -EINVAL;
655*4882a593Smuzhiyun 		}
656*4882a593Smuzhiyun 	}
657*4882a593Smuzhiyun 
658*4882a593Smuzhiyun 	/* Initialize An with 2 random values and acquire it */
659*4882a593Smuzhiyun 	for (i = 0; i < 2; i++)
660*4882a593Smuzhiyun 		intel_de_write(dev_priv,
661*4882a593Smuzhiyun 			       HDCP_ANINIT(dev_priv, cpu_transcoder, port),
662*4882a593Smuzhiyun 			       get_random_u32());
663*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_CONF(dev_priv, cpu_transcoder, port),
664*4882a593Smuzhiyun 		       HDCP_CONF_CAPTURE_AN);
665*4882a593Smuzhiyun 
666*4882a593Smuzhiyun 	/* Wait for An to be acquired */
667*4882a593Smuzhiyun 	if (intel_de_wait_for_set(dev_priv,
668*4882a593Smuzhiyun 				  HDCP_STATUS(dev_priv, cpu_transcoder, port),
669*4882a593Smuzhiyun 				  HDCP_STATUS_AN_READY, 1)) {
670*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Timed out waiting for An\n");
671*4882a593Smuzhiyun 		return -ETIMEDOUT;
672*4882a593Smuzhiyun 	}
673*4882a593Smuzhiyun 
674*4882a593Smuzhiyun 	an.reg[0] = intel_de_read(dev_priv,
675*4882a593Smuzhiyun 				  HDCP_ANLO(dev_priv, cpu_transcoder, port));
676*4882a593Smuzhiyun 	an.reg[1] = intel_de_read(dev_priv,
677*4882a593Smuzhiyun 				  HDCP_ANHI(dev_priv, cpu_transcoder, port));
678*4882a593Smuzhiyun 	ret = shim->write_an_aksv(dig_port, an.shim);
679*4882a593Smuzhiyun 	if (ret)
680*4882a593Smuzhiyun 		return ret;
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	r0_prime_gen_start = jiffies;
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun 	memset(&bksv, 0, sizeof(bksv));
685*4882a593Smuzhiyun 
686*4882a593Smuzhiyun 	ret = intel_hdcp_read_valid_bksv(dig_port, shim, bksv.shim);
687*4882a593Smuzhiyun 	if (ret < 0)
688*4882a593Smuzhiyun 		return ret;
689*4882a593Smuzhiyun 
690*4882a593Smuzhiyun 	if (drm_hdcp_check_ksvs_revoked(&dev_priv->drm, bksv.shim, 1) > 0) {
691*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "BKSV is revoked\n");
692*4882a593Smuzhiyun 		return -EPERM;
693*4882a593Smuzhiyun 	}
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_BKSVLO(dev_priv, cpu_transcoder, port),
696*4882a593Smuzhiyun 		       bksv.reg[0]);
697*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_BKSVHI(dev_priv, cpu_transcoder, port),
698*4882a593Smuzhiyun 		       bksv.reg[1]);
699*4882a593Smuzhiyun 
700*4882a593Smuzhiyun 	ret = shim->repeater_present(dig_port, &repeater_present);
701*4882a593Smuzhiyun 	if (ret)
702*4882a593Smuzhiyun 		return ret;
703*4882a593Smuzhiyun 	if (repeater_present)
704*4882a593Smuzhiyun 		intel_de_write(dev_priv, HDCP_REP_CTL,
705*4882a593Smuzhiyun 			       intel_hdcp_get_repeater_ctl(dev_priv, cpu_transcoder, port));
706*4882a593Smuzhiyun 
707*4882a593Smuzhiyun 	ret = shim->toggle_signalling(dig_port, cpu_transcoder, true);
708*4882a593Smuzhiyun 	if (ret)
709*4882a593Smuzhiyun 		return ret;
710*4882a593Smuzhiyun 
711*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_CONF(dev_priv, cpu_transcoder, port),
712*4882a593Smuzhiyun 		       HDCP_CONF_AUTH_AND_ENC);
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun 	/* Wait for R0 ready */
715*4882a593Smuzhiyun 	if (wait_for(intel_de_read(dev_priv, HDCP_STATUS(dev_priv, cpu_transcoder, port)) &
716*4882a593Smuzhiyun 		     (HDCP_STATUS_R0_READY | HDCP_STATUS_ENC), 1)) {
717*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Timed out waiting for R0 ready\n");
718*4882a593Smuzhiyun 		return -ETIMEDOUT;
719*4882a593Smuzhiyun 	}
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun 	/*
722*4882a593Smuzhiyun 	 * Wait for R0' to become available. The spec says 100ms from Aksv, but
723*4882a593Smuzhiyun 	 * some monitors can take longer than this. We'll set the timeout at
724*4882a593Smuzhiyun 	 * 300ms just to be sure.
725*4882a593Smuzhiyun 	 *
726*4882a593Smuzhiyun 	 * On DP, there's an R0_READY bit available but no such bit
727*4882a593Smuzhiyun 	 * exists on HDMI. Since the upper-bound is the same, we'll just do
728*4882a593Smuzhiyun 	 * the stupid thing instead of polling on one and not the other.
729*4882a593Smuzhiyun 	 */
730*4882a593Smuzhiyun 	wait_remaining_ms_from_jiffies(r0_prime_gen_start, 300);
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun 	tries = 3;
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun 	/*
735*4882a593Smuzhiyun 	 * DP HDCP Spec mandates the two more reattempt to read R0, incase
736*4882a593Smuzhiyun 	 * of R0 mismatch.
737*4882a593Smuzhiyun 	 */
738*4882a593Smuzhiyun 	for (i = 0; i < tries; i++) {
739*4882a593Smuzhiyun 		ri.reg = 0;
740*4882a593Smuzhiyun 		ret = shim->read_ri_prime(dig_port, ri.shim);
741*4882a593Smuzhiyun 		if (ret)
742*4882a593Smuzhiyun 			return ret;
743*4882a593Smuzhiyun 		intel_de_write(dev_priv,
744*4882a593Smuzhiyun 			       HDCP_RPRIME(dev_priv, cpu_transcoder, port),
745*4882a593Smuzhiyun 			       ri.reg);
746*4882a593Smuzhiyun 
747*4882a593Smuzhiyun 		/* Wait for Ri prime match */
748*4882a593Smuzhiyun 		if (!wait_for(intel_de_read(dev_priv, HDCP_STATUS(dev_priv, cpu_transcoder, port)) &
749*4882a593Smuzhiyun 			      (HDCP_STATUS_RI_MATCH | HDCP_STATUS_ENC), 1))
750*4882a593Smuzhiyun 			break;
751*4882a593Smuzhiyun 	}
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	if (i == tries) {
754*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
755*4882a593Smuzhiyun 			    "Timed out waiting for Ri prime match (%x)\n",
756*4882a593Smuzhiyun 			    intel_de_read(dev_priv, HDCP_STATUS(dev_priv,
757*4882a593Smuzhiyun 					  cpu_transcoder, port)));
758*4882a593Smuzhiyun 		return -ETIMEDOUT;
759*4882a593Smuzhiyun 	}
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun 	/* Wait for encryption confirmation */
762*4882a593Smuzhiyun 	if (intel_de_wait_for_set(dev_priv,
763*4882a593Smuzhiyun 				  HDCP_STATUS(dev_priv, cpu_transcoder, port),
764*4882a593Smuzhiyun 				  HDCP_STATUS_ENC,
765*4882a593Smuzhiyun 				  ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
766*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Timed out waiting for encryption\n");
767*4882a593Smuzhiyun 		return -ETIMEDOUT;
768*4882a593Smuzhiyun 	}
769*4882a593Smuzhiyun 
770*4882a593Smuzhiyun 	/*
771*4882a593Smuzhiyun 	 * XXX: If we have MST-connected devices, we need to enable encryption
772*4882a593Smuzhiyun 	 * on those as well.
773*4882a593Smuzhiyun 	 */
774*4882a593Smuzhiyun 
775*4882a593Smuzhiyun 	if (repeater_present)
776*4882a593Smuzhiyun 		return intel_hdcp_auth_downstream(connector);
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm, "HDCP is enabled (no repeater present)\n");
779*4882a593Smuzhiyun 	return 0;
780*4882a593Smuzhiyun }
781*4882a593Smuzhiyun 
_intel_hdcp_disable(struct intel_connector * connector)782*4882a593Smuzhiyun static int _intel_hdcp_disable(struct intel_connector *connector)
783*4882a593Smuzhiyun {
784*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
785*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
786*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
787*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
788*4882a593Smuzhiyun 	enum transcoder cpu_transcoder = hdcp->cpu_transcoder;
789*4882a593Smuzhiyun 	u32 repeater_ctl;
790*4882a593Smuzhiyun 	int ret;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP is being disabled...\n",
793*4882a593Smuzhiyun 		    connector->base.name, connector->base.base.id);
794*4882a593Smuzhiyun 
795*4882a593Smuzhiyun 	/*
796*4882a593Smuzhiyun 	 * If there are other connectors on this port using HDCP, don't disable
797*4882a593Smuzhiyun 	 * it. Instead, toggle the HDCP signalling off on that particular
798*4882a593Smuzhiyun 	 * connector/pipe and exit.
799*4882a593Smuzhiyun 	 */
800*4882a593Smuzhiyun 	if (dig_port->num_hdcp_streams > 0) {
801*4882a593Smuzhiyun 		ret = hdcp->shim->toggle_signalling(dig_port,
802*4882a593Smuzhiyun 						    cpu_transcoder, false);
803*4882a593Smuzhiyun 		if (ret)
804*4882a593Smuzhiyun 			DRM_ERROR("Failed to disable HDCP signalling\n");
805*4882a593Smuzhiyun 		return ret;
806*4882a593Smuzhiyun 	}
807*4882a593Smuzhiyun 
808*4882a593Smuzhiyun 	hdcp->hdcp_encrypted = false;
809*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_CONF(dev_priv, cpu_transcoder, port), 0);
810*4882a593Smuzhiyun 	if (intel_de_wait_for_clear(dev_priv,
811*4882a593Smuzhiyun 				    HDCP_STATUS(dev_priv, cpu_transcoder, port),
812*4882a593Smuzhiyun 				    ~0, ENCRYPT_STATUS_CHANGE_TIMEOUT_MS)) {
813*4882a593Smuzhiyun 		drm_err(&dev_priv->drm,
814*4882a593Smuzhiyun 			"Failed to disable HDCP, timeout clearing status\n");
815*4882a593Smuzhiyun 		return -ETIMEDOUT;
816*4882a593Smuzhiyun 	}
817*4882a593Smuzhiyun 
818*4882a593Smuzhiyun 	repeater_ctl = intel_hdcp_get_repeater_ctl(dev_priv, cpu_transcoder,
819*4882a593Smuzhiyun 						   port);
820*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP_REP_CTL,
821*4882a593Smuzhiyun 		       intel_de_read(dev_priv, HDCP_REP_CTL) & ~repeater_ctl);
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun 	ret = hdcp->shim->toggle_signalling(dig_port, cpu_transcoder, false);
824*4882a593Smuzhiyun 	if (ret) {
825*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Failed to disable HDCP signalling\n");
826*4882a593Smuzhiyun 		return ret;
827*4882a593Smuzhiyun 	}
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm, "HDCP is disabled\n");
830*4882a593Smuzhiyun 	return 0;
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun 
_intel_hdcp_enable(struct intel_connector * connector)833*4882a593Smuzhiyun static int _intel_hdcp_enable(struct intel_connector *connector)
834*4882a593Smuzhiyun {
835*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
836*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
837*4882a593Smuzhiyun 	int i, ret, tries = 3;
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP is being enabled...\n",
840*4882a593Smuzhiyun 		    connector->base.name, connector->base.base.id);
841*4882a593Smuzhiyun 
842*4882a593Smuzhiyun 	if (!hdcp_key_loadable(dev_priv)) {
843*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "HDCP key Load is not possible\n");
844*4882a593Smuzhiyun 		return -ENXIO;
845*4882a593Smuzhiyun 	}
846*4882a593Smuzhiyun 
847*4882a593Smuzhiyun 	for (i = 0; i < KEY_LOAD_TRIES; i++) {
848*4882a593Smuzhiyun 		ret = intel_hdcp_load_keys(dev_priv);
849*4882a593Smuzhiyun 		if (!ret)
850*4882a593Smuzhiyun 			break;
851*4882a593Smuzhiyun 		intel_hdcp_clear_keys(dev_priv);
852*4882a593Smuzhiyun 	}
853*4882a593Smuzhiyun 	if (ret) {
854*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Could not load HDCP keys, (%d)\n",
855*4882a593Smuzhiyun 			ret);
856*4882a593Smuzhiyun 		return ret;
857*4882a593Smuzhiyun 	}
858*4882a593Smuzhiyun 
859*4882a593Smuzhiyun 	/* Incase of authentication failures, HDCP spec expects reauth. */
860*4882a593Smuzhiyun 	for (i = 0; i < tries; i++) {
861*4882a593Smuzhiyun 		ret = intel_hdcp_auth(connector);
862*4882a593Smuzhiyun 		if (!ret) {
863*4882a593Smuzhiyun 			hdcp->hdcp_encrypted = true;
864*4882a593Smuzhiyun 			return 0;
865*4882a593Smuzhiyun 		}
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "HDCP Auth failure (%d)\n", ret);
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun 		/* Ensuring HDCP encryption and signalling are stopped. */
870*4882a593Smuzhiyun 		_intel_hdcp_disable(connector);
871*4882a593Smuzhiyun 	}
872*4882a593Smuzhiyun 
873*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm,
874*4882a593Smuzhiyun 		    "HDCP authentication failed (%d tries/%d)\n", tries, ret);
875*4882a593Smuzhiyun 	return ret;
876*4882a593Smuzhiyun }
877*4882a593Smuzhiyun 
intel_hdcp_to_connector(struct intel_hdcp * hdcp)878*4882a593Smuzhiyun static struct intel_connector *intel_hdcp_to_connector(struct intel_hdcp *hdcp)
879*4882a593Smuzhiyun {
880*4882a593Smuzhiyun 	return container_of(hdcp, struct intel_connector, hdcp);
881*4882a593Smuzhiyun }
882*4882a593Smuzhiyun 
intel_hdcp_update_value(struct intel_connector * connector,u64 value,bool update_property)883*4882a593Smuzhiyun static void intel_hdcp_update_value(struct intel_connector *connector,
884*4882a593Smuzhiyun 				    u64 value, bool update_property)
885*4882a593Smuzhiyun {
886*4882a593Smuzhiyun 	struct drm_device *dev = connector->base.dev;
887*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
888*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun 	drm_WARN_ON(connector->base.dev, !mutex_is_locked(&hdcp->mutex));
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun 	if (hdcp->value == value)
893*4882a593Smuzhiyun 		return;
894*4882a593Smuzhiyun 
895*4882a593Smuzhiyun 	drm_WARN_ON(dev, !mutex_is_locked(&dig_port->hdcp_mutex));
896*4882a593Smuzhiyun 
897*4882a593Smuzhiyun 	if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_ENABLED) {
898*4882a593Smuzhiyun 		if (!drm_WARN_ON(dev, dig_port->num_hdcp_streams == 0))
899*4882a593Smuzhiyun 			dig_port->num_hdcp_streams--;
900*4882a593Smuzhiyun 	} else if (value == DRM_MODE_CONTENT_PROTECTION_ENABLED) {
901*4882a593Smuzhiyun 		dig_port->num_hdcp_streams++;
902*4882a593Smuzhiyun 	}
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun 	hdcp->value = value;
905*4882a593Smuzhiyun 	if (update_property) {
906*4882a593Smuzhiyun 		drm_connector_get(&connector->base);
907*4882a593Smuzhiyun 		schedule_work(&hdcp->prop_work);
908*4882a593Smuzhiyun 	}
909*4882a593Smuzhiyun }
910*4882a593Smuzhiyun 
911*4882a593Smuzhiyun /* Implements Part 3 of the HDCP authorization procedure */
intel_hdcp_check_link(struct intel_connector * connector)912*4882a593Smuzhiyun static int intel_hdcp_check_link(struct intel_connector *connector)
913*4882a593Smuzhiyun {
914*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
915*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
916*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
917*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
918*4882a593Smuzhiyun 	enum transcoder cpu_transcoder;
919*4882a593Smuzhiyun 	int ret = 0;
920*4882a593Smuzhiyun 
921*4882a593Smuzhiyun 	mutex_lock(&hdcp->mutex);
922*4882a593Smuzhiyun 	mutex_lock(&dig_port->hdcp_mutex);
923*4882a593Smuzhiyun 
924*4882a593Smuzhiyun 	cpu_transcoder = hdcp->cpu_transcoder;
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun 	/* Check_link valid only when HDCP1.4 is enabled */
927*4882a593Smuzhiyun 	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
928*4882a593Smuzhiyun 	    !hdcp->hdcp_encrypted) {
929*4882a593Smuzhiyun 		ret = -EINVAL;
930*4882a593Smuzhiyun 		goto out;
931*4882a593Smuzhiyun 	}
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun 	if (drm_WARN_ON(&dev_priv->drm,
934*4882a593Smuzhiyun 			!intel_hdcp_in_use(dev_priv, cpu_transcoder, port))) {
935*4882a593Smuzhiyun 		drm_err(&dev_priv->drm,
936*4882a593Smuzhiyun 			"%s:%d HDCP link stopped encryption,%x\n",
937*4882a593Smuzhiyun 			connector->base.name, connector->base.base.id,
938*4882a593Smuzhiyun 			intel_de_read(dev_priv, HDCP_STATUS(dev_priv, cpu_transcoder, port)));
939*4882a593Smuzhiyun 		ret = -ENXIO;
940*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
941*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_DESIRED,
942*4882a593Smuzhiyun 					true);
943*4882a593Smuzhiyun 		goto out;
944*4882a593Smuzhiyun 	}
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun 	if (hdcp->shim->check_link(dig_port, connector)) {
947*4882a593Smuzhiyun 		if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
948*4882a593Smuzhiyun 			intel_hdcp_update_value(connector,
949*4882a593Smuzhiyun 				DRM_MODE_CONTENT_PROTECTION_ENABLED, true);
950*4882a593Smuzhiyun 		}
951*4882a593Smuzhiyun 		goto out;
952*4882a593Smuzhiyun 	}
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun 	drm_dbg_kms(&dev_priv->drm,
955*4882a593Smuzhiyun 		    "[%s:%d] HDCP link failed, retrying authentication\n",
956*4882a593Smuzhiyun 		    connector->base.name, connector->base.base.id);
957*4882a593Smuzhiyun 
958*4882a593Smuzhiyun 	ret = _intel_hdcp_disable(connector);
959*4882a593Smuzhiyun 	if (ret) {
960*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Failed to disable hdcp (%d)\n", ret);
961*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
962*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_DESIRED,
963*4882a593Smuzhiyun 					true);
964*4882a593Smuzhiyun 		goto out;
965*4882a593Smuzhiyun 	}
966*4882a593Smuzhiyun 
967*4882a593Smuzhiyun 	ret = _intel_hdcp_enable(connector);
968*4882a593Smuzhiyun 	if (ret) {
969*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Failed to enable hdcp (%d)\n", ret);
970*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
971*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_DESIRED,
972*4882a593Smuzhiyun 					true);
973*4882a593Smuzhiyun 		goto out;
974*4882a593Smuzhiyun 	}
975*4882a593Smuzhiyun 
976*4882a593Smuzhiyun out:
977*4882a593Smuzhiyun 	mutex_unlock(&dig_port->hdcp_mutex);
978*4882a593Smuzhiyun 	mutex_unlock(&hdcp->mutex);
979*4882a593Smuzhiyun 	return ret;
980*4882a593Smuzhiyun }
981*4882a593Smuzhiyun 
intel_hdcp_prop_work(struct work_struct * work)982*4882a593Smuzhiyun static void intel_hdcp_prop_work(struct work_struct *work)
983*4882a593Smuzhiyun {
984*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = container_of(work, struct intel_hdcp,
985*4882a593Smuzhiyun 					       prop_work);
986*4882a593Smuzhiyun 	struct intel_connector *connector = intel_hdcp_to_connector(hdcp);
987*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun 	drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex, NULL);
990*4882a593Smuzhiyun 	mutex_lock(&hdcp->mutex);
991*4882a593Smuzhiyun 
992*4882a593Smuzhiyun 	/*
993*4882a593Smuzhiyun 	 * This worker is only used to flip between ENABLED/DESIRED. Either of
994*4882a593Smuzhiyun 	 * those to UNDESIRED is handled by core. If value == UNDESIRED,
995*4882a593Smuzhiyun 	 * we're running just after hdcp has been disabled, so just exit
996*4882a593Smuzhiyun 	 */
997*4882a593Smuzhiyun 	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
998*4882a593Smuzhiyun 		drm_hdcp_update_content_protection(&connector->base,
999*4882a593Smuzhiyun 						   hdcp->value);
1000*4882a593Smuzhiyun 
1001*4882a593Smuzhiyun 	mutex_unlock(&hdcp->mutex);
1002*4882a593Smuzhiyun 	drm_modeset_unlock(&dev_priv->drm.mode_config.connection_mutex);
1003*4882a593Smuzhiyun 
1004*4882a593Smuzhiyun 	drm_connector_put(&connector->base);
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun 
is_hdcp_supported(struct drm_i915_private * dev_priv,enum port port)1007*4882a593Smuzhiyun bool is_hdcp_supported(struct drm_i915_private *dev_priv, enum port port)
1008*4882a593Smuzhiyun {
1009*4882a593Smuzhiyun 	return INTEL_INFO(dev_priv)->display.has_hdcp &&
1010*4882a593Smuzhiyun 			(INTEL_GEN(dev_priv) >= 12 || port < PORT_E);
1011*4882a593Smuzhiyun }
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun static int
hdcp2_prepare_ake_init(struct intel_connector * connector,struct hdcp2_ake_init * ake_data)1014*4882a593Smuzhiyun hdcp2_prepare_ake_init(struct intel_connector *connector,
1015*4882a593Smuzhiyun 		       struct hdcp2_ake_init *ake_data)
1016*4882a593Smuzhiyun {
1017*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1018*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1019*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1020*4882a593Smuzhiyun 	int ret;
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1023*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1024*4882a593Smuzhiyun 
1025*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1026*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1027*4882a593Smuzhiyun 		return -EINVAL;
1028*4882a593Smuzhiyun 	}
1029*4882a593Smuzhiyun 
1030*4882a593Smuzhiyun 	ret = comp->ops->initiate_hdcp2_session(comp->mei_dev, data, ake_data);
1031*4882a593Smuzhiyun 	if (ret)
1032*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Prepare_ake_init failed. %d\n",
1033*4882a593Smuzhiyun 			    ret);
1034*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1035*4882a593Smuzhiyun 
1036*4882a593Smuzhiyun 	return ret;
1037*4882a593Smuzhiyun }
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun static int
hdcp2_verify_rx_cert_prepare_km(struct intel_connector * connector,struct hdcp2_ake_send_cert * rx_cert,bool * paired,struct hdcp2_ake_no_stored_km * ek_pub_km,size_t * msg_sz)1040*4882a593Smuzhiyun hdcp2_verify_rx_cert_prepare_km(struct intel_connector *connector,
1041*4882a593Smuzhiyun 				struct hdcp2_ake_send_cert *rx_cert,
1042*4882a593Smuzhiyun 				bool *paired,
1043*4882a593Smuzhiyun 				struct hdcp2_ake_no_stored_km *ek_pub_km,
1044*4882a593Smuzhiyun 				size_t *msg_sz)
1045*4882a593Smuzhiyun {
1046*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1047*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1048*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1049*4882a593Smuzhiyun 	int ret;
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1052*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1053*4882a593Smuzhiyun 
1054*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1055*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1056*4882a593Smuzhiyun 		return -EINVAL;
1057*4882a593Smuzhiyun 	}
1058*4882a593Smuzhiyun 
1059*4882a593Smuzhiyun 	ret = comp->ops->verify_receiver_cert_prepare_km(comp->mei_dev, data,
1060*4882a593Smuzhiyun 							 rx_cert, paired,
1061*4882a593Smuzhiyun 							 ek_pub_km, msg_sz);
1062*4882a593Smuzhiyun 	if (ret < 0)
1063*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Verify rx_cert failed. %d\n",
1064*4882a593Smuzhiyun 			    ret);
1065*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1066*4882a593Smuzhiyun 
1067*4882a593Smuzhiyun 	return ret;
1068*4882a593Smuzhiyun }
1069*4882a593Smuzhiyun 
hdcp2_verify_hprime(struct intel_connector * connector,struct hdcp2_ake_send_hprime * rx_hprime)1070*4882a593Smuzhiyun static int hdcp2_verify_hprime(struct intel_connector *connector,
1071*4882a593Smuzhiyun 			       struct hdcp2_ake_send_hprime *rx_hprime)
1072*4882a593Smuzhiyun {
1073*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1074*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1075*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1076*4882a593Smuzhiyun 	int ret;
1077*4882a593Smuzhiyun 
1078*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1079*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1080*4882a593Smuzhiyun 
1081*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1082*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1083*4882a593Smuzhiyun 		return -EINVAL;
1084*4882a593Smuzhiyun 	}
1085*4882a593Smuzhiyun 
1086*4882a593Smuzhiyun 	ret = comp->ops->verify_hprime(comp->mei_dev, data, rx_hprime);
1087*4882a593Smuzhiyun 	if (ret < 0)
1088*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Verify hprime failed. %d\n", ret);
1089*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun 	return ret;
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun static int
hdcp2_store_pairing_info(struct intel_connector * connector,struct hdcp2_ake_send_pairing_info * pairing_info)1095*4882a593Smuzhiyun hdcp2_store_pairing_info(struct intel_connector *connector,
1096*4882a593Smuzhiyun 			 struct hdcp2_ake_send_pairing_info *pairing_info)
1097*4882a593Smuzhiyun {
1098*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1099*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1100*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1101*4882a593Smuzhiyun 	int ret;
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1104*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1105*4882a593Smuzhiyun 
1106*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1107*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1108*4882a593Smuzhiyun 		return -EINVAL;
1109*4882a593Smuzhiyun 	}
1110*4882a593Smuzhiyun 
1111*4882a593Smuzhiyun 	ret = comp->ops->store_pairing_info(comp->mei_dev, data, pairing_info);
1112*4882a593Smuzhiyun 	if (ret < 0)
1113*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Store pairing info failed. %d\n",
1114*4882a593Smuzhiyun 			    ret);
1115*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1116*4882a593Smuzhiyun 
1117*4882a593Smuzhiyun 	return ret;
1118*4882a593Smuzhiyun }
1119*4882a593Smuzhiyun 
1120*4882a593Smuzhiyun static int
hdcp2_prepare_lc_init(struct intel_connector * connector,struct hdcp2_lc_init * lc_init)1121*4882a593Smuzhiyun hdcp2_prepare_lc_init(struct intel_connector *connector,
1122*4882a593Smuzhiyun 		      struct hdcp2_lc_init *lc_init)
1123*4882a593Smuzhiyun {
1124*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1125*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1126*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1127*4882a593Smuzhiyun 	int ret;
1128*4882a593Smuzhiyun 
1129*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1130*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1131*4882a593Smuzhiyun 
1132*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1133*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1134*4882a593Smuzhiyun 		return -EINVAL;
1135*4882a593Smuzhiyun 	}
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun 	ret = comp->ops->initiate_locality_check(comp->mei_dev, data, lc_init);
1138*4882a593Smuzhiyun 	if (ret < 0)
1139*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Prepare lc_init failed. %d\n",
1140*4882a593Smuzhiyun 			    ret);
1141*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1142*4882a593Smuzhiyun 
1143*4882a593Smuzhiyun 	return ret;
1144*4882a593Smuzhiyun }
1145*4882a593Smuzhiyun 
1146*4882a593Smuzhiyun static int
hdcp2_verify_lprime(struct intel_connector * connector,struct hdcp2_lc_send_lprime * rx_lprime)1147*4882a593Smuzhiyun hdcp2_verify_lprime(struct intel_connector *connector,
1148*4882a593Smuzhiyun 		    struct hdcp2_lc_send_lprime *rx_lprime)
1149*4882a593Smuzhiyun {
1150*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1151*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1152*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1153*4882a593Smuzhiyun 	int ret;
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1156*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1157*4882a593Smuzhiyun 
1158*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1159*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1160*4882a593Smuzhiyun 		return -EINVAL;
1161*4882a593Smuzhiyun 	}
1162*4882a593Smuzhiyun 
1163*4882a593Smuzhiyun 	ret = comp->ops->verify_lprime(comp->mei_dev, data, rx_lprime);
1164*4882a593Smuzhiyun 	if (ret < 0)
1165*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Verify L_Prime failed. %d\n",
1166*4882a593Smuzhiyun 			    ret);
1167*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1168*4882a593Smuzhiyun 
1169*4882a593Smuzhiyun 	return ret;
1170*4882a593Smuzhiyun }
1171*4882a593Smuzhiyun 
hdcp2_prepare_skey(struct intel_connector * connector,struct hdcp2_ske_send_eks * ske_data)1172*4882a593Smuzhiyun static int hdcp2_prepare_skey(struct intel_connector *connector,
1173*4882a593Smuzhiyun 			      struct hdcp2_ske_send_eks *ske_data)
1174*4882a593Smuzhiyun {
1175*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1176*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1177*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1178*4882a593Smuzhiyun 	int ret;
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1181*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1184*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1185*4882a593Smuzhiyun 		return -EINVAL;
1186*4882a593Smuzhiyun 	}
1187*4882a593Smuzhiyun 
1188*4882a593Smuzhiyun 	ret = comp->ops->get_session_key(comp->mei_dev, data, ske_data);
1189*4882a593Smuzhiyun 	if (ret < 0)
1190*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Get session key failed. %d\n",
1191*4882a593Smuzhiyun 			    ret);
1192*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1193*4882a593Smuzhiyun 
1194*4882a593Smuzhiyun 	return ret;
1195*4882a593Smuzhiyun }
1196*4882a593Smuzhiyun 
1197*4882a593Smuzhiyun static int
hdcp2_verify_rep_topology_prepare_ack(struct intel_connector * connector,struct hdcp2_rep_send_receiverid_list * rep_topology,struct hdcp2_rep_send_ack * rep_send_ack)1198*4882a593Smuzhiyun hdcp2_verify_rep_topology_prepare_ack(struct intel_connector *connector,
1199*4882a593Smuzhiyun 				      struct hdcp2_rep_send_receiverid_list
1200*4882a593Smuzhiyun 								*rep_topology,
1201*4882a593Smuzhiyun 				      struct hdcp2_rep_send_ack *rep_send_ack)
1202*4882a593Smuzhiyun {
1203*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1204*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1205*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1206*4882a593Smuzhiyun 	int ret;
1207*4882a593Smuzhiyun 
1208*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1209*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1210*4882a593Smuzhiyun 
1211*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1212*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1213*4882a593Smuzhiyun 		return -EINVAL;
1214*4882a593Smuzhiyun 	}
1215*4882a593Smuzhiyun 
1216*4882a593Smuzhiyun 	ret = comp->ops->repeater_check_flow_prepare_ack(comp->mei_dev, data,
1217*4882a593Smuzhiyun 							 rep_topology,
1218*4882a593Smuzhiyun 							 rep_send_ack);
1219*4882a593Smuzhiyun 	if (ret < 0)
1220*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
1221*4882a593Smuzhiyun 			    "Verify rep topology failed. %d\n", ret);
1222*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1223*4882a593Smuzhiyun 
1224*4882a593Smuzhiyun 	return ret;
1225*4882a593Smuzhiyun }
1226*4882a593Smuzhiyun 
1227*4882a593Smuzhiyun static int
hdcp2_verify_mprime(struct intel_connector * connector,struct hdcp2_rep_stream_ready * stream_ready)1228*4882a593Smuzhiyun hdcp2_verify_mprime(struct intel_connector *connector,
1229*4882a593Smuzhiyun 		    struct hdcp2_rep_stream_ready *stream_ready)
1230*4882a593Smuzhiyun {
1231*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1232*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1233*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1234*4882a593Smuzhiyun 	int ret;
1235*4882a593Smuzhiyun 
1236*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1237*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1238*4882a593Smuzhiyun 
1239*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1240*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1241*4882a593Smuzhiyun 		return -EINVAL;
1242*4882a593Smuzhiyun 	}
1243*4882a593Smuzhiyun 
1244*4882a593Smuzhiyun 	ret = comp->ops->verify_mprime(comp->mei_dev, data, stream_ready);
1245*4882a593Smuzhiyun 	if (ret < 0)
1246*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Verify mprime failed. %d\n", ret);
1247*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun 	return ret;
1250*4882a593Smuzhiyun }
1251*4882a593Smuzhiyun 
hdcp2_authenticate_port(struct intel_connector * connector)1252*4882a593Smuzhiyun static int hdcp2_authenticate_port(struct intel_connector *connector)
1253*4882a593Smuzhiyun {
1254*4882a593Smuzhiyun 	struct hdcp_port_data *data = &connector->hdcp.port_data;
1255*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1256*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1257*4882a593Smuzhiyun 	int ret;
1258*4882a593Smuzhiyun 
1259*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1260*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1263*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1264*4882a593Smuzhiyun 		return -EINVAL;
1265*4882a593Smuzhiyun 	}
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun 	ret = comp->ops->enable_hdcp_authentication(comp->mei_dev, data);
1268*4882a593Smuzhiyun 	if (ret < 0)
1269*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Enable hdcp auth failed. %d\n",
1270*4882a593Smuzhiyun 			    ret);
1271*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun 	return ret;
1274*4882a593Smuzhiyun }
1275*4882a593Smuzhiyun 
hdcp2_close_mei_session(struct intel_connector * connector)1276*4882a593Smuzhiyun static int hdcp2_close_mei_session(struct intel_connector *connector)
1277*4882a593Smuzhiyun {
1278*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1279*4882a593Smuzhiyun 	struct i915_hdcp_comp_master *comp;
1280*4882a593Smuzhiyun 	int ret;
1281*4882a593Smuzhiyun 
1282*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1283*4882a593Smuzhiyun 	comp = dev_priv->hdcp_master;
1284*4882a593Smuzhiyun 
1285*4882a593Smuzhiyun 	if (!comp || !comp->ops) {
1286*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
1287*4882a593Smuzhiyun 		return -EINVAL;
1288*4882a593Smuzhiyun 	}
1289*4882a593Smuzhiyun 
1290*4882a593Smuzhiyun 	ret = comp->ops->close_hdcp_session(comp->mei_dev,
1291*4882a593Smuzhiyun 					     &connector->hdcp.port_data);
1292*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1293*4882a593Smuzhiyun 
1294*4882a593Smuzhiyun 	return ret;
1295*4882a593Smuzhiyun }
1296*4882a593Smuzhiyun 
hdcp2_deauthenticate_port(struct intel_connector * connector)1297*4882a593Smuzhiyun static int hdcp2_deauthenticate_port(struct intel_connector *connector)
1298*4882a593Smuzhiyun {
1299*4882a593Smuzhiyun 	return hdcp2_close_mei_session(connector);
1300*4882a593Smuzhiyun }
1301*4882a593Smuzhiyun 
1302*4882a593Smuzhiyun /* Authentication flow starts from here */
hdcp2_authentication_key_exchange(struct intel_connector * connector)1303*4882a593Smuzhiyun static int hdcp2_authentication_key_exchange(struct intel_connector *connector)
1304*4882a593Smuzhiyun {
1305*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1306*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1307*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1308*4882a593Smuzhiyun 	union {
1309*4882a593Smuzhiyun 		struct hdcp2_ake_init ake_init;
1310*4882a593Smuzhiyun 		struct hdcp2_ake_send_cert send_cert;
1311*4882a593Smuzhiyun 		struct hdcp2_ake_no_stored_km no_stored_km;
1312*4882a593Smuzhiyun 		struct hdcp2_ake_send_hprime send_hprime;
1313*4882a593Smuzhiyun 		struct hdcp2_ake_send_pairing_info pairing_info;
1314*4882a593Smuzhiyun 	} msgs;
1315*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = hdcp->shim;
1316*4882a593Smuzhiyun 	size_t size;
1317*4882a593Smuzhiyun 	int ret;
1318*4882a593Smuzhiyun 
1319*4882a593Smuzhiyun 	/* Init for seq_num */
1320*4882a593Smuzhiyun 	hdcp->seq_num_v = 0;
1321*4882a593Smuzhiyun 	hdcp->seq_num_m = 0;
1322*4882a593Smuzhiyun 
1323*4882a593Smuzhiyun 	ret = hdcp2_prepare_ake_init(connector, &msgs.ake_init);
1324*4882a593Smuzhiyun 	if (ret < 0)
1325*4882a593Smuzhiyun 		return ret;
1326*4882a593Smuzhiyun 
1327*4882a593Smuzhiyun 	ret = shim->write_2_2_msg(dig_port, &msgs.ake_init,
1328*4882a593Smuzhiyun 				  sizeof(msgs.ake_init));
1329*4882a593Smuzhiyun 	if (ret < 0)
1330*4882a593Smuzhiyun 		return ret;
1331*4882a593Smuzhiyun 
1332*4882a593Smuzhiyun 	ret = shim->read_2_2_msg(dig_port, HDCP_2_2_AKE_SEND_CERT,
1333*4882a593Smuzhiyun 				 &msgs.send_cert, sizeof(msgs.send_cert));
1334*4882a593Smuzhiyun 	if (ret < 0)
1335*4882a593Smuzhiyun 		return ret;
1336*4882a593Smuzhiyun 
1337*4882a593Smuzhiyun 	if (msgs.send_cert.rx_caps[0] != HDCP_2_2_RX_CAPS_VERSION_VAL) {
1338*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "cert.rx_caps dont claim HDCP2.2\n");
1339*4882a593Smuzhiyun 		return -EINVAL;
1340*4882a593Smuzhiyun 	}
1341*4882a593Smuzhiyun 
1342*4882a593Smuzhiyun 	hdcp->is_repeater = HDCP_2_2_RX_REPEATER(msgs.send_cert.rx_caps[2]);
1343*4882a593Smuzhiyun 
1344*4882a593Smuzhiyun 	if (drm_hdcp_check_ksvs_revoked(&dev_priv->drm,
1345*4882a593Smuzhiyun 					msgs.send_cert.cert_rx.receiver_id,
1346*4882a593Smuzhiyun 					1) > 0) {
1347*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Receiver ID is revoked\n");
1348*4882a593Smuzhiyun 		return -EPERM;
1349*4882a593Smuzhiyun 	}
1350*4882a593Smuzhiyun 
1351*4882a593Smuzhiyun 	/*
1352*4882a593Smuzhiyun 	 * Here msgs.no_stored_km will hold msgs corresponding to the km
1353*4882a593Smuzhiyun 	 * stored also.
1354*4882a593Smuzhiyun 	 */
1355*4882a593Smuzhiyun 	ret = hdcp2_verify_rx_cert_prepare_km(connector, &msgs.send_cert,
1356*4882a593Smuzhiyun 					      &hdcp->is_paired,
1357*4882a593Smuzhiyun 					      &msgs.no_stored_km, &size);
1358*4882a593Smuzhiyun 	if (ret < 0)
1359*4882a593Smuzhiyun 		return ret;
1360*4882a593Smuzhiyun 
1361*4882a593Smuzhiyun 	ret = shim->write_2_2_msg(dig_port, &msgs.no_stored_km, size);
1362*4882a593Smuzhiyun 	if (ret < 0)
1363*4882a593Smuzhiyun 		return ret;
1364*4882a593Smuzhiyun 
1365*4882a593Smuzhiyun 	ret = shim->read_2_2_msg(dig_port, HDCP_2_2_AKE_SEND_HPRIME,
1366*4882a593Smuzhiyun 				 &msgs.send_hprime, sizeof(msgs.send_hprime));
1367*4882a593Smuzhiyun 	if (ret < 0)
1368*4882a593Smuzhiyun 		return ret;
1369*4882a593Smuzhiyun 
1370*4882a593Smuzhiyun 	ret = hdcp2_verify_hprime(connector, &msgs.send_hprime);
1371*4882a593Smuzhiyun 	if (ret < 0)
1372*4882a593Smuzhiyun 		return ret;
1373*4882a593Smuzhiyun 
1374*4882a593Smuzhiyun 	if (!hdcp->is_paired) {
1375*4882a593Smuzhiyun 		/* Pairing is required */
1376*4882a593Smuzhiyun 		ret = shim->read_2_2_msg(dig_port,
1377*4882a593Smuzhiyun 					 HDCP_2_2_AKE_SEND_PAIRING_INFO,
1378*4882a593Smuzhiyun 					 &msgs.pairing_info,
1379*4882a593Smuzhiyun 					 sizeof(msgs.pairing_info));
1380*4882a593Smuzhiyun 		if (ret < 0)
1381*4882a593Smuzhiyun 			return ret;
1382*4882a593Smuzhiyun 
1383*4882a593Smuzhiyun 		ret = hdcp2_store_pairing_info(connector, &msgs.pairing_info);
1384*4882a593Smuzhiyun 		if (ret < 0)
1385*4882a593Smuzhiyun 			return ret;
1386*4882a593Smuzhiyun 		hdcp->is_paired = true;
1387*4882a593Smuzhiyun 	}
1388*4882a593Smuzhiyun 
1389*4882a593Smuzhiyun 	return 0;
1390*4882a593Smuzhiyun }
1391*4882a593Smuzhiyun 
hdcp2_locality_check(struct intel_connector * connector)1392*4882a593Smuzhiyun static int hdcp2_locality_check(struct intel_connector *connector)
1393*4882a593Smuzhiyun {
1394*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1395*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1396*4882a593Smuzhiyun 	union {
1397*4882a593Smuzhiyun 		struct hdcp2_lc_init lc_init;
1398*4882a593Smuzhiyun 		struct hdcp2_lc_send_lprime send_lprime;
1399*4882a593Smuzhiyun 	} msgs;
1400*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = hdcp->shim;
1401*4882a593Smuzhiyun 	int tries = HDCP2_LC_RETRY_CNT, ret, i;
1402*4882a593Smuzhiyun 
1403*4882a593Smuzhiyun 	for (i = 0; i < tries; i++) {
1404*4882a593Smuzhiyun 		ret = hdcp2_prepare_lc_init(connector, &msgs.lc_init);
1405*4882a593Smuzhiyun 		if (ret < 0)
1406*4882a593Smuzhiyun 			continue;
1407*4882a593Smuzhiyun 
1408*4882a593Smuzhiyun 		ret = shim->write_2_2_msg(dig_port, &msgs.lc_init,
1409*4882a593Smuzhiyun 				      sizeof(msgs.lc_init));
1410*4882a593Smuzhiyun 		if (ret < 0)
1411*4882a593Smuzhiyun 			continue;
1412*4882a593Smuzhiyun 
1413*4882a593Smuzhiyun 		ret = shim->read_2_2_msg(dig_port,
1414*4882a593Smuzhiyun 					 HDCP_2_2_LC_SEND_LPRIME,
1415*4882a593Smuzhiyun 					 &msgs.send_lprime,
1416*4882a593Smuzhiyun 					 sizeof(msgs.send_lprime));
1417*4882a593Smuzhiyun 		if (ret < 0)
1418*4882a593Smuzhiyun 			continue;
1419*4882a593Smuzhiyun 
1420*4882a593Smuzhiyun 		ret = hdcp2_verify_lprime(connector, &msgs.send_lprime);
1421*4882a593Smuzhiyun 		if (!ret)
1422*4882a593Smuzhiyun 			break;
1423*4882a593Smuzhiyun 	}
1424*4882a593Smuzhiyun 
1425*4882a593Smuzhiyun 	return ret;
1426*4882a593Smuzhiyun }
1427*4882a593Smuzhiyun 
hdcp2_session_key_exchange(struct intel_connector * connector)1428*4882a593Smuzhiyun static int hdcp2_session_key_exchange(struct intel_connector *connector)
1429*4882a593Smuzhiyun {
1430*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1431*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1432*4882a593Smuzhiyun 	struct hdcp2_ske_send_eks send_eks;
1433*4882a593Smuzhiyun 	int ret;
1434*4882a593Smuzhiyun 
1435*4882a593Smuzhiyun 	ret = hdcp2_prepare_skey(connector, &send_eks);
1436*4882a593Smuzhiyun 	if (ret < 0)
1437*4882a593Smuzhiyun 		return ret;
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun 	ret = hdcp->shim->write_2_2_msg(dig_port, &send_eks,
1440*4882a593Smuzhiyun 					sizeof(send_eks));
1441*4882a593Smuzhiyun 	if (ret < 0)
1442*4882a593Smuzhiyun 		return ret;
1443*4882a593Smuzhiyun 
1444*4882a593Smuzhiyun 	return 0;
1445*4882a593Smuzhiyun }
1446*4882a593Smuzhiyun 
1447*4882a593Smuzhiyun static
hdcp2_propagate_stream_management_info(struct intel_connector * connector)1448*4882a593Smuzhiyun int hdcp2_propagate_stream_management_info(struct intel_connector *connector)
1449*4882a593Smuzhiyun {
1450*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1451*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
1452*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1453*4882a593Smuzhiyun 	union {
1454*4882a593Smuzhiyun 		struct hdcp2_rep_stream_manage stream_manage;
1455*4882a593Smuzhiyun 		struct hdcp2_rep_stream_ready stream_ready;
1456*4882a593Smuzhiyun 	} msgs;
1457*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = hdcp->shim;
1458*4882a593Smuzhiyun 	int ret;
1459*4882a593Smuzhiyun 
1460*4882a593Smuzhiyun 	/* Prepare RepeaterAuth_Stream_Manage msg */
1461*4882a593Smuzhiyun 	msgs.stream_manage.msg_id = HDCP_2_2_REP_STREAM_MANAGE;
1462*4882a593Smuzhiyun 	drm_hdcp_cpu_to_be24(msgs.stream_manage.seq_num_m, hdcp->seq_num_m);
1463*4882a593Smuzhiyun 
1464*4882a593Smuzhiyun 	/* K no of streams is fixed as 1. Stored as big-endian. */
1465*4882a593Smuzhiyun 	msgs.stream_manage.k = cpu_to_be16(1);
1466*4882a593Smuzhiyun 
1467*4882a593Smuzhiyun 	/* For HDMI this is forced to be 0x0. For DP SST also this is 0x0. */
1468*4882a593Smuzhiyun 	msgs.stream_manage.streams[0].stream_id = 0;
1469*4882a593Smuzhiyun 	msgs.stream_manage.streams[0].stream_type = hdcp->content_type;
1470*4882a593Smuzhiyun 
1471*4882a593Smuzhiyun 	/* Send it to Repeater */
1472*4882a593Smuzhiyun 	ret = shim->write_2_2_msg(dig_port, &msgs.stream_manage,
1473*4882a593Smuzhiyun 				  sizeof(msgs.stream_manage));
1474*4882a593Smuzhiyun 	if (ret < 0)
1475*4882a593Smuzhiyun 		return ret;
1476*4882a593Smuzhiyun 
1477*4882a593Smuzhiyun 	ret = shim->read_2_2_msg(dig_port, HDCP_2_2_REP_STREAM_READY,
1478*4882a593Smuzhiyun 				 &msgs.stream_ready, sizeof(msgs.stream_ready));
1479*4882a593Smuzhiyun 	if (ret < 0)
1480*4882a593Smuzhiyun 		return ret;
1481*4882a593Smuzhiyun 
1482*4882a593Smuzhiyun 	hdcp->port_data.seq_num_m = hdcp->seq_num_m;
1483*4882a593Smuzhiyun 	hdcp->port_data.streams[0].stream_type = hdcp->content_type;
1484*4882a593Smuzhiyun 
1485*4882a593Smuzhiyun 	ret = hdcp2_verify_mprime(connector, &msgs.stream_ready);
1486*4882a593Smuzhiyun 	if (ret < 0)
1487*4882a593Smuzhiyun 		return ret;
1488*4882a593Smuzhiyun 
1489*4882a593Smuzhiyun 	hdcp->seq_num_m++;
1490*4882a593Smuzhiyun 
1491*4882a593Smuzhiyun 	if (hdcp->seq_num_m > HDCP_2_2_SEQ_NUM_MAX) {
1492*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "seq_num_m roll over.\n");
1493*4882a593Smuzhiyun 		return -1;
1494*4882a593Smuzhiyun 	}
1495*4882a593Smuzhiyun 
1496*4882a593Smuzhiyun 	return 0;
1497*4882a593Smuzhiyun }
1498*4882a593Smuzhiyun 
1499*4882a593Smuzhiyun static
hdcp2_authenticate_repeater_topology(struct intel_connector * connector)1500*4882a593Smuzhiyun int hdcp2_authenticate_repeater_topology(struct intel_connector *connector)
1501*4882a593Smuzhiyun {
1502*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1503*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1504*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1505*4882a593Smuzhiyun 	union {
1506*4882a593Smuzhiyun 		struct hdcp2_rep_send_receiverid_list recvid_list;
1507*4882a593Smuzhiyun 		struct hdcp2_rep_send_ack rep_ack;
1508*4882a593Smuzhiyun 	} msgs;
1509*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = hdcp->shim;
1510*4882a593Smuzhiyun 	u32 seq_num_v, device_cnt;
1511*4882a593Smuzhiyun 	u8 *rx_info;
1512*4882a593Smuzhiyun 	int ret;
1513*4882a593Smuzhiyun 
1514*4882a593Smuzhiyun 	ret = shim->read_2_2_msg(dig_port, HDCP_2_2_REP_SEND_RECVID_LIST,
1515*4882a593Smuzhiyun 				 &msgs.recvid_list, sizeof(msgs.recvid_list));
1516*4882a593Smuzhiyun 	if (ret < 0)
1517*4882a593Smuzhiyun 		return ret;
1518*4882a593Smuzhiyun 
1519*4882a593Smuzhiyun 	rx_info = msgs.recvid_list.rx_info;
1520*4882a593Smuzhiyun 
1521*4882a593Smuzhiyun 	if (HDCP_2_2_MAX_CASCADE_EXCEEDED(rx_info[1]) ||
1522*4882a593Smuzhiyun 	    HDCP_2_2_MAX_DEVS_EXCEEDED(rx_info[1])) {
1523*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Topology Max Size Exceeded\n");
1524*4882a593Smuzhiyun 		return -EINVAL;
1525*4882a593Smuzhiyun 	}
1526*4882a593Smuzhiyun 
1527*4882a593Smuzhiyun 	/* Converting and Storing the seq_num_v to local variable as DWORD */
1528*4882a593Smuzhiyun 	seq_num_v =
1529*4882a593Smuzhiyun 		drm_hdcp_be24_to_cpu((const u8 *)msgs.recvid_list.seq_num_v);
1530*4882a593Smuzhiyun 
1531*4882a593Smuzhiyun 	if (!hdcp->hdcp2_encrypted && seq_num_v) {
1532*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
1533*4882a593Smuzhiyun 			    "Non zero Seq_num_v at first RecvId_List msg\n");
1534*4882a593Smuzhiyun 		return -EINVAL;
1535*4882a593Smuzhiyun 	}
1536*4882a593Smuzhiyun 
1537*4882a593Smuzhiyun 	if (seq_num_v < hdcp->seq_num_v) {
1538*4882a593Smuzhiyun 		/* Roll over of the seq_num_v from repeater. Reauthenticate. */
1539*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Seq_num_v roll over.\n");
1540*4882a593Smuzhiyun 		return -EINVAL;
1541*4882a593Smuzhiyun 	}
1542*4882a593Smuzhiyun 
1543*4882a593Smuzhiyun 	device_cnt = (HDCP_2_2_DEV_COUNT_HI(rx_info[0]) << 4 |
1544*4882a593Smuzhiyun 		      HDCP_2_2_DEV_COUNT_LO(rx_info[1]));
1545*4882a593Smuzhiyun 	if (drm_hdcp_check_ksvs_revoked(&dev_priv->drm,
1546*4882a593Smuzhiyun 					msgs.recvid_list.receiver_ids,
1547*4882a593Smuzhiyun 					device_cnt) > 0) {
1548*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Revoked receiver ID(s) is in list\n");
1549*4882a593Smuzhiyun 		return -EPERM;
1550*4882a593Smuzhiyun 	}
1551*4882a593Smuzhiyun 
1552*4882a593Smuzhiyun 	ret = hdcp2_verify_rep_topology_prepare_ack(connector,
1553*4882a593Smuzhiyun 						    &msgs.recvid_list,
1554*4882a593Smuzhiyun 						    &msgs.rep_ack);
1555*4882a593Smuzhiyun 	if (ret < 0)
1556*4882a593Smuzhiyun 		return ret;
1557*4882a593Smuzhiyun 
1558*4882a593Smuzhiyun 	hdcp->seq_num_v = seq_num_v;
1559*4882a593Smuzhiyun 	ret = shim->write_2_2_msg(dig_port, &msgs.rep_ack,
1560*4882a593Smuzhiyun 				  sizeof(msgs.rep_ack));
1561*4882a593Smuzhiyun 	if (ret < 0)
1562*4882a593Smuzhiyun 		return ret;
1563*4882a593Smuzhiyun 
1564*4882a593Smuzhiyun 	return 0;
1565*4882a593Smuzhiyun }
1566*4882a593Smuzhiyun 
hdcp2_authenticate_repeater(struct intel_connector * connector)1567*4882a593Smuzhiyun static int hdcp2_authenticate_repeater(struct intel_connector *connector)
1568*4882a593Smuzhiyun {
1569*4882a593Smuzhiyun 	int ret;
1570*4882a593Smuzhiyun 
1571*4882a593Smuzhiyun 	ret = hdcp2_authenticate_repeater_topology(connector);
1572*4882a593Smuzhiyun 	if (ret < 0)
1573*4882a593Smuzhiyun 		return ret;
1574*4882a593Smuzhiyun 
1575*4882a593Smuzhiyun 	return hdcp2_propagate_stream_management_info(connector);
1576*4882a593Smuzhiyun }
1577*4882a593Smuzhiyun 
hdcp2_authenticate_sink(struct intel_connector * connector)1578*4882a593Smuzhiyun static int hdcp2_authenticate_sink(struct intel_connector *connector)
1579*4882a593Smuzhiyun {
1580*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1581*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
1582*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1583*4882a593Smuzhiyun 	const struct intel_hdcp_shim *shim = hdcp->shim;
1584*4882a593Smuzhiyun 	int ret;
1585*4882a593Smuzhiyun 
1586*4882a593Smuzhiyun 	ret = hdcp2_authentication_key_exchange(connector);
1587*4882a593Smuzhiyun 	if (ret < 0) {
1588*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "AKE Failed. Err : %d\n", ret);
1589*4882a593Smuzhiyun 		return ret;
1590*4882a593Smuzhiyun 	}
1591*4882a593Smuzhiyun 
1592*4882a593Smuzhiyun 	ret = hdcp2_locality_check(connector);
1593*4882a593Smuzhiyun 	if (ret < 0) {
1594*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm,
1595*4882a593Smuzhiyun 			    "Locality Check failed. Err : %d\n", ret);
1596*4882a593Smuzhiyun 		return ret;
1597*4882a593Smuzhiyun 	}
1598*4882a593Smuzhiyun 
1599*4882a593Smuzhiyun 	ret = hdcp2_session_key_exchange(connector);
1600*4882a593Smuzhiyun 	if (ret < 0) {
1601*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "SKE Failed. Err : %d\n", ret);
1602*4882a593Smuzhiyun 		return ret;
1603*4882a593Smuzhiyun 	}
1604*4882a593Smuzhiyun 
1605*4882a593Smuzhiyun 	if (shim->config_stream_type) {
1606*4882a593Smuzhiyun 		ret = shim->config_stream_type(dig_port,
1607*4882a593Smuzhiyun 					       hdcp->is_repeater,
1608*4882a593Smuzhiyun 					       hdcp->content_type);
1609*4882a593Smuzhiyun 		if (ret < 0)
1610*4882a593Smuzhiyun 			return ret;
1611*4882a593Smuzhiyun 	}
1612*4882a593Smuzhiyun 
1613*4882a593Smuzhiyun 	if (hdcp->is_repeater) {
1614*4882a593Smuzhiyun 		ret = hdcp2_authenticate_repeater(connector);
1615*4882a593Smuzhiyun 		if (ret < 0) {
1616*4882a593Smuzhiyun 			drm_dbg_kms(&i915->drm,
1617*4882a593Smuzhiyun 				    "Repeater Auth Failed. Err: %d\n", ret);
1618*4882a593Smuzhiyun 			return ret;
1619*4882a593Smuzhiyun 		}
1620*4882a593Smuzhiyun 	}
1621*4882a593Smuzhiyun 
1622*4882a593Smuzhiyun 	hdcp->port_data.streams[0].stream_type = hdcp->content_type;
1623*4882a593Smuzhiyun 	ret = hdcp2_authenticate_port(connector);
1624*4882a593Smuzhiyun 	if (ret < 0)
1625*4882a593Smuzhiyun 		return ret;
1626*4882a593Smuzhiyun 
1627*4882a593Smuzhiyun 	return ret;
1628*4882a593Smuzhiyun }
1629*4882a593Smuzhiyun 
hdcp2_enable_encryption(struct intel_connector * connector)1630*4882a593Smuzhiyun static int hdcp2_enable_encryption(struct intel_connector *connector)
1631*4882a593Smuzhiyun {
1632*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1633*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1634*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1635*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
1636*4882a593Smuzhiyun 	enum transcoder cpu_transcoder = hdcp->cpu_transcoder;
1637*4882a593Smuzhiyun 	int ret;
1638*4882a593Smuzhiyun 
1639*4882a593Smuzhiyun 	drm_WARN_ON(&dev_priv->drm,
1640*4882a593Smuzhiyun 		    intel_de_read(dev_priv, HDCP2_STATUS(dev_priv, cpu_transcoder, port)) &
1641*4882a593Smuzhiyun 		    LINK_ENCRYPTION_STATUS);
1642*4882a593Smuzhiyun 	if (hdcp->shim->toggle_signalling) {
1643*4882a593Smuzhiyun 		ret = hdcp->shim->toggle_signalling(dig_port, cpu_transcoder,
1644*4882a593Smuzhiyun 						    true);
1645*4882a593Smuzhiyun 		if (ret) {
1646*4882a593Smuzhiyun 			drm_err(&dev_priv->drm,
1647*4882a593Smuzhiyun 				"Failed to enable HDCP signalling. %d\n",
1648*4882a593Smuzhiyun 				ret);
1649*4882a593Smuzhiyun 			return ret;
1650*4882a593Smuzhiyun 		}
1651*4882a593Smuzhiyun 	}
1652*4882a593Smuzhiyun 
1653*4882a593Smuzhiyun 	if (intel_de_read(dev_priv, HDCP2_STATUS(dev_priv, cpu_transcoder, port)) &
1654*4882a593Smuzhiyun 	    LINK_AUTH_STATUS) {
1655*4882a593Smuzhiyun 		/* Link is Authenticated. Now set for Encryption */
1656*4882a593Smuzhiyun 		intel_de_write(dev_priv,
1657*4882a593Smuzhiyun 			       HDCP2_CTL(dev_priv, cpu_transcoder, port),
1658*4882a593Smuzhiyun 			       intel_de_read(dev_priv, HDCP2_CTL(dev_priv, cpu_transcoder, port)) | CTL_LINK_ENCRYPTION_REQ);
1659*4882a593Smuzhiyun 	}
1660*4882a593Smuzhiyun 
1661*4882a593Smuzhiyun 	ret = intel_de_wait_for_set(dev_priv,
1662*4882a593Smuzhiyun 				    HDCP2_STATUS(dev_priv, cpu_transcoder,
1663*4882a593Smuzhiyun 						 port),
1664*4882a593Smuzhiyun 				    LINK_ENCRYPTION_STATUS,
1665*4882a593Smuzhiyun 				    ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
1666*4882a593Smuzhiyun 
1667*4882a593Smuzhiyun 	return ret;
1668*4882a593Smuzhiyun }
1669*4882a593Smuzhiyun 
hdcp2_disable_encryption(struct intel_connector * connector)1670*4882a593Smuzhiyun static int hdcp2_disable_encryption(struct intel_connector *connector)
1671*4882a593Smuzhiyun {
1672*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1673*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1674*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1675*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
1676*4882a593Smuzhiyun 	enum transcoder cpu_transcoder = hdcp->cpu_transcoder;
1677*4882a593Smuzhiyun 	int ret;
1678*4882a593Smuzhiyun 
1679*4882a593Smuzhiyun 	drm_WARN_ON(&dev_priv->drm, !(intel_de_read(dev_priv, HDCP2_STATUS(dev_priv, cpu_transcoder, port)) &
1680*4882a593Smuzhiyun 				      LINK_ENCRYPTION_STATUS));
1681*4882a593Smuzhiyun 
1682*4882a593Smuzhiyun 	intel_de_write(dev_priv, HDCP2_CTL(dev_priv, cpu_transcoder, port),
1683*4882a593Smuzhiyun 		       intel_de_read(dev_priv, HDCP2_CTL(dev_priv, cpu_transcoder, port)) & ~CTL_LINK_ENCRYPTION_REQ);
1684*4882a593Smuzhiyun 
1685*4882a593Smuzhiyun 	ret = intel_de_wait_for_clear(dev_priv,
1686*4882a593Smuzhiyun 				      HDCP2_STATUS(dev_priv, cpu_transcoder,
1687*4882a593Smuzhiyun 						   port),
1688*4882a593Smuzhiyun 				      LINK_ENCRYPTION_STATUS,
1689*4882a593Smuzhiyun 				      ENCRYPT_STATUS_CHANGE_TIMEOUT_MS);
1690*4882a593Smuzhiyun 	if (ret == -ETIMEDOUT)
1691*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Disable Encryption Timedout");
1692*4882a593Smuzhiyun 
1693*4882a593Smuzhiyun 	if (hdcp->shim->toggle_signalling) {
1694*4882a593Smuzhiyun 		ret = hdcp->shim->toggle_signalling(dig_port, cpu_transcoder,
1695*4882a593Smuzhiyun 						    false);
1696*4882a593Smuzhiyun 		if (ret) {
1697*4882a593Smuzhiyun 			drm_err(&dev_priv->drm,
1698*4882a593Smuzhiyun 				"Failed to disable HDCP signalling. %d\n",
1699*4882a593Smuzhiyun 				ret);
1700*4882a593Smuzhiyun 			return ret;
1701*4882a593Smuzhiyun 		}
1702*4882a593Smuzhiyun 	}
1703*4882a593Smuzhiyun 
1704*4882a593Smuzhiyun 	return ret;
1705*4882a593Smuzhiyun }
1706*4882a593Smuzhiyun 
hdcp2_authenticate_and_encrypt(struct intel_connector * connector)1707*4882a593Smuzhiyun static int hdcp2_authenticate_and_encrypt(struct intel_connector *connector)
1708*4882a593Smuzhiyun {
1709*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
1710*4882a593Smuzhiyun 	int ret, i, tries = 3;
1711*4882a593Smuzhiyun 
1712*4882a593Smuzhiyun 	for (i = 0; i < tries; i++) {
1713*4882a593Smuzhiyun 		ret = hdcp2_authenticate_sink(connector);
1714*4882a593Smuzhiyun 		if (!ret)
1715*4882a593Smuzhiyun 			break;
1716*4882a593Smuzhiyun 
1717*4882a593Smuzhiyun 		/* Clearing the mei hdcp session */
1718*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "HDCP2.2 Auth %d of %d Failed.(%d)\n",
1719*4882a593Smuzhiyun 			    i + 1, tries, ret);
1720*4882a593Smuzhiyun 		if (hdcp2_deauthenticate_port(connector) < 0)
1721*4882a593Smuzhiyun 			drm_dbg_kms(&i915->drm, "Port deauth failed.\n");
1722*4882a593Smuzhiyun 	}
1723*4882a593Smuzhiyun 
1724*4882a593Smuzhiyun 	if (i != tries) {
1725*4882a593Smuzhiyun 		/*
1726*4882a593Smuzhiyun 		 * Ensuring the required 200mSec min time interval between
1727*4882a593Smuzhiyun 		 * Session Key Exchange and encryption.
1728*4882a593Smuzhiyun 		 */
1729*4882a593Smuzhiyun 		msleep(HDCP_2_2_DELAY_BEFORE_ENCRYPTION_EN);
1730*4882a593Smuzhiyun 		ret = hdcp2_enable_encryption(connector);
1731*4882a593Smuzhiyun 		if (ret < 0) {
1732*4882a593Smuzhiyun 			drm_dbg_kms(&i915->drm,
1733*4882a593Smuzhiyun 				    "Encryption Enable Failed.(%d)\n", ret);
1734*4882a593Smuzhiyun 			if (hdcp2_deauthenticate_port(connector) < 0)
1735*4882a593Smuzhiyun 				drm_dbg_kms(&i915->drm, "Port deauth failed.\n");
1736*4882a593Smuzhiyun 		}
1737*4882a593Smuzhiyun 	}
1738*4882a593Smuzhiyun 
1739*4882a593Smuzhiyun 	return ret;
1740*4882a593Smuzhiyun }
1741*4882a593Smuzhiyun 
_intel_hdcp2_enable(struct intel_connector * connector)1742*4882a593Smuzhiyun static int _intel_hdcp2_enable(struct intel_connector *connector)
1743*4882a593Smuzhiyun {
1744*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
1745*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1746*4882a593Smuzhiyun 	int ret;
1747*4882a593Smuzhiyun 
1748*4882a593Smuzhiyun 	drm_dbg_kms(&i915->drm, "[%s:%d] HDCP2.2 is being enabled. Type: %d\n",
1749*4882a593Smuzhiyun 		    connector->base.name, connector->base.base.id,
1750*4882a593Smuzhiyun 		    hdcp->content_type);
1751*4882a593Smuzhiyun 
1752*4882a593Smuzhiyun 	ret = hdcp2_authenticate_and_encrypt(connector);
1753*4882a593Smuzhiyun 	if (ret) {
1754*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "HDCP2 Type%d  Enabling Failed. (%d)\n",
1755*4882a593Smuzhiyun 			    hdcp->content_type, ret);
1756*4882a593Smuzhiyun 		return ret;
1757*4882a593Smuzhiyun 	}
1758*4882a593Smuzhiyun 
1759*4882a593Smuzhiyun 	drm_dbg_kms(&i915->drm, "[%s:%d] HDCP2.2 is enabled. Type %d\n",
1760*4882a593Smuzhiyun 		    connector->base.name, connector->base.base.id,
1761*4882a593Smuzhiyun 		    hdcp->content_type);
1762*4882a593Smuzhiyun 
1763*4882a593Smuzhiyun 	hdcp->hdcp2_encrypted = true;
1764*4882a593Smuzhiyun 	return 0;
1765*4882a593Smuzhiyun }
1766*4882a593Smuzhiyun 
_intel_hdcp2_disable(struct intel_connector * connector)1767*4882a593Smuzhiyun static int _intel_hdcp2_disable(struct intel_connector *connector)
1768*4882a593Smuzhiyun {
1769*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
1770*4882a593Smuzhiyun 	int ret;
1771*4882a593Smuzhiyun 
1772*4882a593Smuzhiyun 	drm_dbg_kms(&i915->drm, "[%s:%d] HDCP2.2 is being Disabled\n",
1773*4882a593Smuzhiyun 		    connector->base.name, connector->base.base.id);
1774*4882a593Smuzhiyun 
1775*4882a593Smuzhiyun 	ret = hdcp2_disable_encryption(connector);
1776*4882a593Smuzhiyun 
1777*4882a593Smuzhiyun 	if (hdcp2_deauthenticate_port(connector) < 0)
1778*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "Port deauth failed.\n");
1779*4882a593Smuzhiyun 
1780*4882a593Smuzhiyun 	connector->hdcp.hdcp2_encrypted = false;
1781*4882a593Smuzhiyun 
1782*4882a593Smuzhiyun 	return ret;
1783*4882a593Smuzhiyun }
1784*4882a593Smuzhiyun 
1785*4882a593Smuzhiyun /* Implements the Link Integrity Check for HDCP2.2 */
intel_hdcp2_check_link(struct intel_connector * connector)1786*4882a593Smuzhiyun static int intel_hdcp2_check_link(struct intel_connector *connector)
1787*4882a593Smuzhiyun {
1788*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
1789*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1790*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1791*4882a593Smuzhiyun 	enum port port = dig_port->base.port;
1792*4882a593Smuzhiyun 	enum transcoder cpu_transcoder;
1793*4882a593Smuzhiyun 	int ret = 0;
1794*4882a593Smuzhiyun 
1795*4882a593Smuzhiyun 	mutex_lock(&hdcp->mutex);
1796*4882a593Smuzhiyun 	cpu_transcoder = hdcp->cpu_transcoder;
1797*4882a593Smuzhiyun 
1798*4882a593Smuzhiyun 	/* hdcp2_check_link is expected only when HDCP2.2 is Enabled */
1799*4882a593Smuzhiyun 	if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED ||
1800*4882a593Smuzhiyun 	    !hdcp->hdcp2_encrypted) {
1801*4882a593Smuzhiyun 		ret = -EINVAL;
1802*4882a593Smuzhiyun 		goto out;
1803*4882a593Smuzhiyun 	}
1804*4882a593Smuzhiyun 
1805*4882a593Smuzhiyun 	if (drm_WARN_ON(&dev_priv->drm,
1806*4882a593Smuzhiyun 			!intel_hdcp2_in_use(dev_priv, cpu_transcoder, port))) {
1807*4882a593Smuzhiyun 		drm_err(&dev_priv->drm,
1808*4882a593Smuzhiyun 			"HDCP2.2 link stopped the encryption, %x\n",
1809*4882a593Smuzhiyun 			intel_de_read(dev_priv, HDCP2_STATUS(dev_priv, cpu_transcoder, port)));
1810*4882a593Smuzhiyun 		ret = -ENXIO;
1811*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
1812*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_DESIRED,
1813*4882a593Smuzhiyun 					true);
1814*4882a593Smuzhiyun 		goto out;
1815*4882a593Smuzhiyun 	}
1816*4882a593Smuzhiyun 
1817*4882a593Smuzhiyun 	ret = hdcp->shim->check_2_2_link(dig_port);
1818*4882a593Smuzhiyun 	if (ret == HDCP_LINK_PROTECTED) {
1819*4882a593Smuzhiyun 		if (hdcp->value != DRM_MODE_CONTENT_PROTECTION_UNDESIRED) {
1820*4882a593Smuzhiyun 			intel_hdcp_update_value(connector,
1821*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_ENABLED,
1822*4882a593Smuzhiyun 					true);
1823*4882a593Smuzhiyun 		}
1824*4882a593Smuzhiyun 		goto out;
1825*4882a593Smuzhiyun 	}
1826*4882a593Smuzhiyun 
1827*4882a593Smuzhiyun 	if (ret == HDCP_TOPOLOGY_CHANGE) {
1828*4882a593Smuzhiyun 		if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
1829*4882a593Smuzhiyun 			goto out;
1830*4882a593Smuzhiyun 
1831*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
1832*4882a593Smuzhiyun 			    "HDCP2.2 Downstream topology change\n");
1833*4882a593Smuzhiyun 		ret = hdcp2_authenticate_repeater_topology(connector);
1834*4882a593Smuzhiyun 		if (!ret) {
1835*4882a593Smuzhiyun 			intel_hdcp_update_value(connector,
1836*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_ENABLED,
1837*4882a593Smuzhiyun 					true);
1838*4882a593Smuzhiyun 			goto out;
1839*4882a593Smuzhiyun 		}
1840*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
1841*4882a593Smuzhiyun 			    "[%s:%d] Repeater topology auth failed.(%d)\n",
1842*4882a593Smuzhiyun 			    connector->base.name, connector->base.base.id,
1843*4882a593Smuzhiyun 			    ret);
1844*4882a593Smuzhiyun 	} else {
1845*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
1846*4882a593Smuzhiyun 			    "[%s:%d] HDCP2.2 link failed, retrying auth\n",
1847*4882a593Smuzhiyun 			    connector->base.name, connector->base.base.id);
1848*4882a593Smuzhiyun 	}
1849*4882a593Smuzhiyun 
1850*4882a593Smuzhiyun 	ret = _intel_hdcp2_disable(connector);
1851*4882a593Smuzhiyun 	if (ret) {
1852*4882a593Smuzhiyun 		drm_err(&dev_priv->drm,
1853*4882a593Smuzhiyun 			"[%s:%d] Failed to disable hdcp2.2 (%d)\n",
1854*4882a593Smuzhiyun 			connector->base.name, connector->base.base.id, ret);
1855*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
1856*4882a593Smuzhiyun 				DRM_MODE_CONTENT_PROTECTION_DESIRED, true);
1857*4882a593Smuzhiyun 		goto out;
1858*4882a593Smuzhiyun 	}
1859*4882a593Smuzhiyun 
1860*4882a593Smuzhiyun 	ret = _intel_hdcp2_enable(connector);
1861*4882a593Smuzhiyun 	if (ret) {
1862*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm,
1863*4882a593Smuzhiyun 			    "[%s:%d] Failed to enable hdcp2.2 (%d)\n",
1864*4882a593Smuzhiyun 			    connector->base.name, connector->base.base.id,
1865*4882a593Smuzhiyun 			    ret);
1866*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
1867*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_DESIRED,
1868*4882a593Smuzhiyun 					true);
1869*4882a593Smuzhiyun 		goto out;
1870*4882a593Smuzhiyun 	}
1871*4882a593Smuzhiyun 
1872*4882a593Smuzhiyun out:
1873*4882a593Smuzhiyun 	mutex_unlock(&hdcp->mutex);
1874*4882a593Smuzhiyun 	return ret;
1875*4882a593Smuzhiyun }
1876*4882a593Smuzhiyun 
intel_hdcp_check_work(struct work_struct * work)1877*4882a593Smuzhiyun static void intel_hdcp_check_work(struct work_struct *work)
1878*4882a593Smuzhiyun {
1879*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = container_of(to_delayed_work(work),
1880*4882a593Smuzhiyun 					       struct intel_hdcp,
1881*4882a593Smuzhiyun 					       check_work);
1882*4882a593Smuzhiyun 	struct intel_connector *connector = intel_hdcp_to_connector(hdcp);
1883*4882a593Smuzhiyun 
1884*4882a593Smuzhiyun 	if (drm_connector_is_unregistered(&connector->base))
1885*4882a593Smuzhiyun 		return;
1886*4882a593Smuzhiyun 
1887*4882a593Smuzhiyun 	if (!intel_hdcp2_check_link(connector))
1888*4882a593Smuzhiyun 		schedule_delayed_work(&hdcp->check_work,
1889*4882a593Smuzhiyun 				      DRM_HDCP2_CHECK_PERIOD_MS);
1890*4882a593Smuzhiyun 	else if (!intel_hdcp_check_link(connector))
1891*4882a593Smuzhiyun 		schedule_delayed_work(&hdcp->check_work,
1892*4882a593Smuzhiyun 				      DRM_HDCP_CHECK_PERIOD_MS);
1893*4882a593Smuzhiyun }
1894*4882a593Smuzhiyun 
i915_hdcp_component_bind(struct device * i915_kdev,struct device * mei_kdev,void * data)1895*4882a593Smuzhiyun static int i915_hdcp_component_bind(struct device *i915_kdev,
1896*4882a593Smuzhiyun 				    struct device *mei_kdev, void *data)
1897*4882a593Smuzhiyun {
1898*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
1899*4882a593Smuzhiyun 
1900*4882a593Smuzhiyun 	drm_dbg(&dev_priv->drm, "I915 HDCP comp bind\n");
1901*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1902*4882a593Smuzhiyun 	dev_priv->hdcp_master = (struct i915_hdcp_comp_master *)data;
1903*4882a593Smuzhiyun 	dev_priv->hdcp_master->mei_dev = mei_kdev;
1904*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1905*4882a593Smuzhiyun 
1906*4882a593Smuzhiyun 	return 0;
1907*4882a593Smuzhiyun }
1908*4882a593Smuzhiyun 
i915_hdcp_component_unbind(struct device * i915_kdev,struct device * mei_kdev,void * data)1909*4882a593Smuzhiyun static void i915_hdcp_component_unbind(struct device *i915_kdev,
1910*4882a593Smuzhiyun 				       struct device *mei_kdev, void *data)
1911*4882a593Smuzhiyun {
1912*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = kdev_to_i915(i915_kdev);
1913*4882a593Smuzhiyun 
1914*4882a593Smuzhiyun 	drm_dbg(&dev_priv->drm, "I915 HDCP comp unbind\n");
1915*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
1916*4882a593Smuzhiyun 	dev_priv->hdcp_master = NULL;
1917*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
1918*4882a593Smuzhiyun }
1919*4882a593Smuzhiyun 
1920*4882a593Smuzhiyun static const struct component_ops i915_hdcp_component_ops = {
1921*4882a593Smuzhiyun 	.bind   = i915_hdcp_component_bind,
1922*4882a593Smuzhiyun 	.unbind = i915_hdcp_component_unbind,
1923*4882a593Smuzhiyun };
1924*4882a593Smuzhiyun 
intel_get_mei_fw_ddi_index(enum port port)1925*4882a593Smuzhiyun static enum mei_fw_ddi intel_get_mei_fw_ddi_index(enum port port)
1926*4882a593Smuzhiyun {
1927*4882a593Smuzhiyun 	switch (port) {
1928*4882a593Smuzhiyun 	case PORT_A:
1929*4882a593Smuzhiyun 		return MEI_DDI_A;
1930*4882a593Smuzhiyun 	case PORT_B ... PORT_F:
1931*4882a593Smuzhiyun 		return (enum mei_fw_ddi)port;
1932*4882a593Smuzhiyun 	default:
1933*4882a593Smuzhiyun 		return MEI_DDI_INVALID_PORT;
1934*4882a593Smuzhiyun 	}
1935*4882a593Smuzhiyun }
1936*4882a593Smuzhiyun 
intel_get_mei_fw_tc(enum transcoder cpu_transcoder)1937*4882a593Smuzhiyun static enum mei_fw_tc intel_get_mei_fw_tc(enum transcoder cpu_transcoder)
1938*4882a593Smuzhiyun {
1939*4882a593Smuzhiyun 	switch (cpu_transcoder) {
1940*4882a593Smuzhiyun 	case TRANSCODER_A ... TRANSCODER_D:
1941*4882a593Smuzhiyun 		return (enum mei_fw_tc)(cpu_transcoder | 0x10);
1942*4882a593Smuzhiyun 	default: /* eDP, DSI TRANSCODERS are non HDCP capable */
1943*4882a593Smuzhiyun 		return MEI_INVALID_TRANSCODER;
1944*4882a593Smuzhiyun 	}
1945*4882a593Smuzhiyun }
1946*4882a593Smuzhiyun 
initialize_hdcp_port_data(struct intel_connector * connector,enum port port,const struct intel_hdcp_shim * shim)1947*4882a593Smuzhiyun static int initialize_hdcp_port_data(struct intel_connector *connector,
1948*4882a593Smuzhiyun 				     enum port port,
1949*4882a593Smuzhiyun 				     const struct intel_hdcp_shim *shim)
1950*4882a593Smuzhiyun {
1951*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1952*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
1953*4882a593Smuzhiyun 	struct hdcp_port_data *data = &hdcp->port_data;
1954*4882a593Smuzhiyun 
1955*4882a593Smuzhiyun 	if (INTEL_GEN(dev_priv) < 12)
1956*4882a593Smuzhiyun 		data->fw_ddi = intel_get_mei_fw_ddi_index(port);
1957*4882a593Smuzhiyun 	else
1958*4882a593Smuzhiyun 		/*
1959*4882a593Smuzhiyun 		 * As per ME FW API expectation, for GEN 12+, fw_ddi is filled
1960*4882a593Smuzhiyun 		 * with zero(INVALID PORT index).
1961*4882a593Smuzhiyun 		 */
1962*4882a593Smuzhiyun 		data->fw_ddi = MEI_DDI_INVALID_PORT;
1963*4882a593Smuzhiyun 
1964*4882a593Smuzhiyun 	/*
1965*4882a593Smuzhiyun 	 * As associated transcoder is set and modified at modeset, here fw_tc
1966*4882a593Smuzhiyun 	 * is initialized to zero (invalid transcoder index). This will be
1967*4882a593Smuzhiyun 	 * retained for <Gen12 forever.
1968*4882a593Smuzhiyun 	 */
1969*4882a593Smuzhiyun 	data->fw_tc = MEI_INVALID_TRANSCODER;
1970*4882a593Smuzhiyun 
1971*4882a593Smuzhiyun 	data->port_type = (u8)HDCP_PORT_TYPE_INTEGRATED;
1972*4882a593Smuzhiyun 	data->protocol = (u8)shim->protocol;
1973*4882a593Smuzhiyun 
1974*4882a593Smuzhiyun 	data->k = 1;
1975*4882a593Smuzhiyun 	if (!data->streams)
1976*4882a593Smuzhiyun 		data->streams = kcalloc(data->k,
1977*4882a593Smuzhiyun 					sizeof(struct hdcp2_streamid_type),
1978*4882a593Smuzhiyun 					GFP_KERNEL);
1979*4882a593Smuzhiyun 	if (!data->streams) {
1980*4882a593Smuzhiyun 		drm_err(&dev_priv->drm, "Out of Memory\n");
1981*4882a593Smuzhiyun 		return -ENOMEM;
1982*4882a593Smuzhiyun 	}
1983*4882a593Smuzhiyun 
1984*4882a593Smuzhiyun 	data->streams[0].stream_id = 0;
1985*4882a593Smuzhiyun 	data->streams[0].stream_type = hdcp->content_type;
1986*4882a593Smuzhiyun 
1987*4882a593Smuzhiyun 	return 0;
1988*4882a593Smuzhiyun }
1989*4882a593Smuzhiyun 
is_hdcp2_supported(struct drm_i915_private * dev_priv)1990*4882a593Smuzhiyun static bool is_hdcp2_supported(struct drm_i915_private *dev_priv)
1991*4882a593Smuzhiyun {
1992*4882a593Smuzhiyun 	if (!IS_ENABLED(CONFIG_INTEL_MEI_HDCP))
1993*4882a593Smuzhiyun 		return false;
1994*4882a593Smuzhiyun 
1995*4882a593Smuzhiyun 	return (INTEL_GEN(dev_priv) >= 10 ||
1996*4882a593Smuzhiyun 		IS_GEMINILAKE(dev_priv) ||
1997*4882a593Smuzhiyun 		IS_KABYLAKE(dev_priv) ||
1998*4882a593Smuzhiyun 		IS_COFFEELAKE(dev_priv) ||
1999*4882a593Smuzhiyun 		IS_COMETLAKE(dev_priv));
2000*4882a593Smuzhiyun }
2001*4882a593Smuzhiyun 
intel_hdcp_component_init(struct drm_i915_private * dev_priv)2002*4882a593Smuzhiyun void intel_hdcp_component_init(struct drm_i915_private *dev_priv)
2003*4882a593Smuzhiyun {
2004*4882a593Smuzhiyun 	int ret;
2005*4882a593Smuzhiyun 
2006*4882a593Smuzhiyun 	if (!is_hdcp2_supported(dev_priv))
2007*4882a593Smuzhiyun 		return;
2008*4882a593Smuzhiyun 
2009*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
2010*4882a593Smuzhiyun 	drm_WARN_ON(&dev_priv->drm, dev_priv->hdcp_comp_added);
2011*4882a593Smuzhiyun 
2012*4882a593Smuzhiyun 	dev_priv->hdcp_comp_added = true;
2013*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
2014*4882a593Smuzhiyun 	ret = component_add_typed(dev_priv->drm.dev, &i915_hdcp_component_ops,
2015*4882a593Smuzhiyun 				  I915_COMPONENT_HDCP);
2016*4882a593Smuzhiyun 	if (ret < 0) {
2017*4882a593Smuzhiyun 		drm_dbg_kms(&dev_priv->drm, "Failed at component add(%d)\n",
2018*4882a593Smuzhiyun 			    ret);
2019*4882a593Smuzhiyun 		mutex_lock(&dev_priv->hdcp_comp_mutex);
2020*4882a593Smuzhiyun 		dev_priv->hdcp_comp_added = false;
2021*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
2022*4882a593Smuzhiyun 		return;
2023*4882a593Smuzhiyun 	}
2024*4882a593Smuzhiyun }
2025*4882a593Smuzhiyun 
intel_hdcp2_init(struct intel_connector * connector,enum port port,const struct intel_hdcp_shim * shim)2026*4882a593Smuzhiyun static void intel_hdcp2_init(struct intel_connector *connector, enum port port,
2027*4882a593Smuzhiyun 			     const struct intel_hdcp_shim *shim)
2028*4882a593Smuzhiyun {
2029*4882a593Smuzhiyun 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
2030*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2031*4882a593Smuzhiyun 	int ret;
2032*4882a593Smuzhiyun 
2033*4882a593Smuzhiyun 	ret = initialize_hdcp_port_data(connector, port, shim);
2034*4882a593Smuzhiyun 	if (ret) {
2035*4882a593Smuzhiyun 		drm_dbg_kms(&i915->drm, "Mei hdcp data init failed\n");
2036*4882a593Smuzhiyun 		return;
2037*4882a593Smuzhiyun 	}
2038*4882a593Smuzhiyun 
2039*4882a593Smuzhiyun 	hdcp->hdcp2_supported = true;
2040*4882a593Smuzhiyun }
2041*4882a593Smuzhiyun 
intel_hdcp_init(struct intel_connector * connector,enum port port,const struct intel_hdcp_shim * shim)2042*4882a593Smuzhiyun int intel_hdcp_init(struct intel_connector *connector,
2043*4882a593Smuzhiyun 		    enum port port,
2044*4882a593Smuzhiyun 		    const struct intel_hdcp_shim *shim)
2045*4882a593Smuzhiyun {
2046*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
2047*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2048*4882a593Smuzhiyun 	int ret;
2049*4882a593Smuzhiyun 
2050*4882a593Smuzhiyun 	if (!shim)
2051*4882a593Smuzhiyun 		return -EINVAL;
2052*4882a593Smuzhiyun 
2053*4882a593Smuzhiyun 	if (is_hdcp2_supported(dev_priv) && !connector->mst_port)
2054*4882a593Smuzhiyun 		intel_hdcp2_init(connector, port, shim);
2055*4882a593Smuzhiyun 
2056*4882a593Smuzhiyun 	ret =
2057*4882a593Smuzhiyun 	drm_connector_attach_content_protection_property(&connector->base,
2058*4882a593Smuzhiyun 							 hdcp->hdcp2_supported);
2059*4882a593Smuzhiyun 	if (ret) {
2060*4882a593Smuzhiyun 		hdcp->hdcp2_supported = false;
2061*4882a593Smuzhiyun 		kfree(hdcp->port_data.streams);
2062*4882a593Smuzhiyun 		return ret;
2063*4882a593Smuzhiyun 	}
2064*4882a593Smuzhiyun 
2065*4882a593Smuzhiyun 	hdcp->shim = shim;
2066*4882a593Smuzhiyun 	mutex_init(&hdcp->mutex);
2067*4882a593Smuzhiyun 	INIT_DELAYED_WORK(&hdcp->check_work, intel_hdcp_check_work);
2068*4882a593Smuzhiyun 	INIT_WORK(&hdcp->prop_work, intel_hdcp_prop_work);
2069*4882a593Smuzhiyun 	init_waitqueue_head(&hdcp->cp_irq_queue);
2070*4882a593Smuzhiyun 
2071*4882a593Smuzhiyun 	return 0;
2072*4882a593Smuzhiyun }
2073*4882a593Smuzhiyun 
intel_hdcp_enable(struct intel_connector * connector,enum transcoder cpu_transcoder,u8 content_type)2074*4882a593Smuzhiyun int intel_hdcp_enable(struct intel_connector *connector,
2075*4882a593Smuzhiyun 		      enum transcoder cpu_transcoder, u8 content_type)
2076*4882a593Smuzhiyun {
2077*4882a593Smuzhiyun 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
2078*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
2079*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2080*4882a593Smuzhiyun 	unsigned long check_link_interval = DRM_HDCP_CHECK_PERIOD_MS;
2081*4882a593Smuzhiyun 	int ret = -EINVAL;
2082*4882a593Smuzhiyun 
2083*4882a593Smuzhiyun 	if (!hdcp->shim)
2084*4882a593Smuzhiyun 		return -ENOENT;
2085*4882a593Smuzhiyun 
2086*4882a593Smuzhiyun 	mutex_lock(&hdcp->mutex);
2087*4882a593Smuzhiyun 	mutex_lock(&dig_port->hdcp_mutex);
2088*4882a593Smuzhiyun 	drm_WARN_ON(&dev_priv->drm,
2089*4882a593Smuzhiyun 		    hdcp->value == DRM_MODE_CONTENT_PROTECTION_ENABLED);
2090*4882a593Smuzhiyun 	hdcp->content_type = content_type;
2091*4882a593Smuzhiyun 	hdcp->cpu_transcoder = cpu_transcoder;
2092*4882a593Smuzhiyun 
2093*4882a593Smuzhiyun 	if (INTEL_GEN(dev_priv) >= 12)
2094*4882a593Smuzhiyun 		hdcp->port_data.fw_tc = intel_get_mei_fw_tc(cpu_transcoder);
2095*4882a593Smuzhiyun 
2096*4882a593Smuzhiyun 	/*
2097*4882a593Smuzhiyun 	 * Considering that HDCP2.2 is more secure than HDCP1.4, If the setup
2098*4882a593Smuzhiyun 	 * is capable of HDCP2.2, it is preferred to use HDCP2.2.
2099*4882a593Smuzhiyun 	 */
2100*4882a593Smuzhiyun 	if (intel_hdcp2_capable(connector)) {
2101*4882a593Smuzhiyun 		ret = _intel_hdcp2_enable(connector);
2102*4882a593Smuzhiyun 		if (!ret)
2103*4882a593Smuzhiyun 			check_link_interval = DRM_HDCP2_CHECK_PERIOD_MS;
2104*4882a593Smuzhiyun 	}
2105*4882a593Smuzhiyun 
2106*4882a593Smuzhiyun 	/*
2107*4882a593Smuzhiyun 	 * When HDCP2.2 fails and Content Type is not Type1, HDCP1.4 will
2108*4882a593Smuzhiyun 	 * be attempted.
2109*4882a593Smuzhiyun 	 */
2110*4882a593Smuzhiyun 	if (ret && intel_hdcp_capable(connector) &&
2111*4882a593Smuzhiyun 	    hdcp->content_type != DRM_MODE_HDCP_CONTENT_TYPE1) {
2112*4882a593Smuzhiyun 		ret = _intel_hdcp_enable(connector);
2113*4882a593Smuzhiyun 	}
2114*4882a593Smuzhiyun 
2115*4882a593Smuzhiyun 	if (!ret) {
2116*4882a593Smuzhiyun 		schedule_delayed_work(&hdcp->check_work, check_link_interval);
2117*4882a593Smuzhiyun 		intel_hdcp_update_value(connector,
2118*4882a593Smuzhiyun 					DRM_MODE_CONTENT_PROTECTION_ENABLED,
2119*4882a593Smuzhiyun 					true);
2120*4882a593Smuzhiyun 	}
2121*4882a593Smuzhiyun 
2122*4882a593Smuzhiyun 	mutex_unlock(&dig_port->hdcp_mutex);
2123*4882a593Smuzhiyun 	mutex_unlock(&hdcp->mutex);
2124*4882a593Smuzhiyun 	return ret;
2125*4882a593Smuzhiyun }
2126*4882a593Smuzhiyun 
intel_hdcp_disable(struct intel_connector * connector)2127*4882a593Smuzhiyun int intel_hdcp_disable(struct intel_connector *connector)
2128*4882a593Smuzhiyun {
2129*4882a593Smuzhiyun 	struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
2130*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2131*4882a593Smuzhiyun 	int ret = 0;
2132*4882a593Smuzhiyun 
2133*4882a593Smuzhiyun 	if (!hdcp->shim)
2134*4882a593Smuzhiyun 		return -ENOENT;
2135*4882a593Smuzhiyun 
2136*4882a593Smuzhiyun 	mutex_lock(&hdcp->mutex);
2137*4882a593Smuzhiyun 	mutex_lock(&dig_port->hdcp_mutex);
2138*4882a593Smuzhiyun 
2139*4882a593Smuzhiyun 	if (hdcp->value == DRM_MODE_CONTENT_PROTECTION_UNDESIRED)
2140*4882a593Smuzhiyun 		goto out;
2141*4882a593Smuzhiyun 
2142*4882a593Smuzhiyun 	intel_hdcp_update_value(connector,
2143*4882a593Smuzhiyun 				DRM_MODE_CONTENT_PROTECTION_UNDESIRED, false);
2144*4882a593Smuzhiyun 	if (hdcp->hdcp2_encrypted)
2145*4882a593Smuzhiyun 		ret = _intel_hdcp2_disable(connector);
2146*4882a593Smuzhiyun 	else if (hdcp->hdcp_encrypted)
2147*4882a593Smuzhiyun 		ret = _intel_hdcp_disable(connector);
2148*4882a593Smuzhiyun 
2149*4882a593Smuzhiyun out:
2150*4882a593Smuzhiyun 	mutex_unlock(&dig_port->hdcp_mutex);
2151*4882a593Smuzhiyun 	mutex_unlock(&hdcp->mutex);
2152*4882a593Smuzhiyun 	cancel_delayed_work_sync(&hdcp->check_work);
2153*4882a593Smuzhiyun 	return ret;
2154*4882a593Smuzhiyun }
2155*4882a593Smuzhiyun 
intel_hdcp_update_pipe(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)2156*4882a593Smuzhiyun void intel_hdcp_update_pipe(struct intel_atomic_state *state,
2157*4882a593Smuzhiyun 			    struct intel_encoder *encoder,
2158*4882a593Smuzhiyun 			    const struct intel_crtc_state *crtc_state,
2159*4882a593Smuzhiyun 			    const struct drm_connector_state *conn_state)
2160*4882a593Smuzhiyun {
2161*4882a593Smuzhiyun 	struct intel_connector *connector =
2162*4882a593Smuzhiyun 				to_intel_connector(conn_state->connector);
2163*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2164*4882a593Smuzhiyun 	bool content_protection_type_changed, desired_and_not_enabled = false;
2165*4882a593Smuzhiyun 
2166*4882a593Smuzhiyun 	if (!connector->hdcp.shim)
2167*4882a593Smuzhiyun 		return;
2168*4882a593Smuzhiyun 
2169*4882a593Smuzhiyun 	content_protection_type_changed =
2170*4882a593Smuzhiyun 		(conn_state->hdcp_content_type != hdcp->content_type &&
2171*4882a593Smuzhiyun 		 conn_state->content_protection !=
2172*4882a593Smuzhiyun 		 DRM_MODE_CONTENT_PROTECTION_UNDESIRED);
2173*4882a593Smuzhiyun 
2174*4882a593Smuzhiyun 	/*
2175*4882a593Smuzhiyun 	 * During the HDCP encryption session if Type change is requested,
2176*4882a593Smuzhiyun 	 * disable the HDCP and reenable it with new TYPE value.
2177*4882a593Smuzhiyun 	 */
2178*4882a593Smuzhiyun 	if (conn_state->content_protection ==
2179*4882a593Smuzhiyun 	    DRM_MODE_CONTENT_PROTECTION_UNDESIRED ||
2180*4882a593Smuzhiyun 	    content_protection_type_changed)
2181*4882a593Smuzhiyun 		intel_hdcp_disable(connector);
2182*4882a593Smuzhiyun 
2183*4882a593Smuzhiyun 	/*
2184*4882a593Smuzhiyun 	 * Mark the hdcp state as DESIRED after the hdcp disable of type
2185*4882a593Smuzhiyun 	 * change procedure.
2186*4882a593Smuzhiyun 	 */
2187*4882a593Smuzhiyun 	if (content_protection_type_changed) {
2188*4882a593Smuzhiyun 		mutex_lock(&hdcp->mutex);
2189*4882a593Smuzhiyun 		hdcp->value = DRM_MODE_CONTENT_PROTECTION_DESIRED;
2190*4882a593Smuzhiyun 		drm_connector_get(&connector->base);
2191*4882a593Smuzhiyun 		schedule_work(&hdcp->prop_work);
2192*4882a593Smuzhiyun 		mutex_unlock(&hdcp->mutex);
2193*4882a593Smuzhiyun 	}
2194*4882a593Smuzhiyun 
2195*4882a593Smuzhiyun 	if (conn_state->content_protection ==
2196*4882a593Smuzhiyun 	    DRM_MODE_CONTENT_PROTECTION_DESIRED) {
2197*4882a593Smuzhiyun 		mutex_lock(&hdcp->mutex);
2198*4882a593Smuzhiyun 		/* Avoid enabling hdcp, if it already ENABLED */
2199*4882a593Smuzhiyun 		desired_and_not_enabled =
2200*4882a593Smuzhiyun 			hdcp->value != DRM_MODE_CONTENT_PROTECTION_ENABLED;
2201*4882a593Smuzhiyun 		mutex_unlock(&hdcp->mutex);
2202*4882a593Smuzhiyun 		/*
2203*4882a593Smuzhiyun 		 * If HDCP already ENABLED and CP property is DESIRED, schedule
2204*4882a593Smuzhiyun 		 * prop_work to update correct CP property to user space.
2205*4882a593Smuzhiyun 		 */
2206*4882a593Smuzhiyun 		if (!desired_and_not_enabled && !content_protection_type_changed) {
2207*4882a593Smuzhiyun 			drm_connector_get(&connector->base);
2208*4882a593Smuzhiyun 			schedule_work(&hdcp->prop_work);
2209*4882a593Smuzhiyun 		}
2210*4882a593Smuzhiyun 	}
2211*4882a593Smuzhiyun 
2212*4882a593Smuzhiyun 	if (desired_and_not_enabled || content_protection_type_changed)
2213*4882a593Smuzhiyun 		intel_hdcp_enable(connector,
2214*4882a593Smuzhiyun 				  crtc_state->cpu_transcoder,
2215*4882a593Smuzhiyun 				  (u8)conn_state->hdcp_content_type);
2216*4882a593Smuzhiyun }
2217*4882a593Smuzhiyun 
intel_hdcp_component_fini(struct drm_i915_private * dev_priv)2218*4882a593Smuzhiyun void intel_hdcp_component_fini(struct drm_i915_private *dev_priv)
2219*4882a593Smuzhiyun {
2220*4882a593Smuzhiyun 	mutex_lock(&dev_priv->hdcp_comp_mutex);
2221*4882a593Smuzhiyun 	if (!dev_priv->hdcp_comp_added) {
2222*4882a593Smuzhiyun 		mutex_unlock(&dev_priv->hdcp_comp_mutex);
2223*4882a593Smuzhiyun 		return;
2224*4882a593Smuzhiyun 	}
2225*4882a593Smuzhiyun 
2226*4882a593Smuzhiyun 	dev_priv->hdcp_comp_added = false;
2227*4882a593Smuzhiyun 	mutex_unlock(&dev_priv->hdcp_comp_mutex);
2228*4882a593Smuzhiyun 
2229*4882a593Smuzhiyun 	component_del(dev_priv->drm.dev, &i915_hdcp_component_ops);
2230*4882a593Smuzhiyun }
2231*4882a593Smuzhiyun 
intel_hdcp_cleanup(struct intel_connector * connector)2232*4882a593Smuzhiyun void intel_hdcp_cleanup(struct intel_connector *connector)
2233*4882a593Smuzhiyun {
2234*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2235*4882a593Smuzhiyun 
2236*4882a593Smuzhiyun 	if (!hdcp->shim)
2237*4882a593Smuzhiyun 		return;
2238*4882a593Smuzhiyun 
2239*4882a593Smuzhiyun 	/*
2240*4882a593Smuzhiyun 	 * If the connector is registered, it's possible userspace could kick
2241*4882a593Smuzhiyun 	 * off another HDCP enable, which would re-spawn the workers.
2242*4882a593Smuzhiyun 	 */
2243*4882a593Smuzhiyun 	drm_WARN_ON(connector->base.dev,
2244*4882a593Smuzhiyun 		connector->base.registration_state == DRM_CONNECTOR_REGISTERED);
2245*4882a593Smuzhiyun 
2246*4882a593Smuzhiyun 	/*
2247*4882a593Smuzhiyun 	 * Now that the connector is not registered, check_work won't be run,
2248*4882a593Smuzhiyun 	 * but cancel any outstanding instances of it
2249*4882a593Smuzhiyun 	 */
2250*4882a593Smuzhiyun 	cancel_delayed_work_sync(&hdcp->check_work);
2251*4882a593Smuzhiyun 
2252*4882a593Smuzhiyun 	/*
2253*4882a593Smuzhiyun 	 * We don't cancel prop_work in the same way as check_work since it
2254*4882a593Smuzhiyun 	 * requires connection_mutex which could be held while calling this
2255*4882a593Smuzhiyun 	 * function. Instead, we rely on the connector references grabbed before
2256*4882a593Smuzhiyun 	 * scheduling prop_work to ensure the connector is alive when prop_work
2257*4882a593Smuzhiyun 	 * is run. So if we're in the destroy path (which is where this
2258*4882a593Smuzhiyun 	 * function should be called), we're "guaranteed" that prop_work is not
2259*4882a593Smuzhiyun 	 * active (tl;dr This Should Never Happen).
2260*4882a593Smuzhiyun 	 */
2261*4882a593Smuzhiyun 	drm_WARN_ON(connector->base.dev, work_pending(&hdcp->prop_work));
2262*4882a593Smuzhiyun 
2263*4882a593Smuzhiyun 	mutex_lock(&hdcp->mutex);
2264*4882a593Smuzhiyun 	kfree(hdcp->port_data.streams);
2265*4882a593Smuzhiyun 	hdcp->shim = NULL;
2266*4882a593Smuzhiyun 	mutex_unlock(&hdcp->mutex);
2267*4882a593Smuzhiyun }
2268*4882a593Smuzhiyun 
intel_hdcp_atomic_check(struct drm_connector * connector,struct drm_connector_state * old_state,struct drm_connector_state * new_state)2269*4882a593Smuzhiyun void intel_hdcp_atomic_check(struct drm_connector *connector,
2270*4882a593Smuzhiyun 			     struct drm_connector_state *old_state,
2271*4882a593Smuzhiyun 			     struct drm_connector_state *new_state)
2272*4882a593Smuzhiyun {
2273*4882a593Smuzhiyun 	u64 old_cp = old_state->content_protection;
2274*4882a593Smuzhiyun 	u64 new_cp = new_state->content_protection;
2275*4882a593Smuzhiyun 	struct drm_crtc_state *crtc_state;
2276*4882a593Smuzhiyun 
2277*4882a593Smuzhiyun 	if (!new_state->crtc) {
2278*4882a593Smuzhiyun 		/*
2279*4882a593Smuzhiyun 		 * If the connector is being disabled with CP enabled, mark it
2280*4882a593Smuzhiyun 		 * desired so it's re-enabled when the connector is brought back
2281*4882a593Smuzhiyun 		 */
2282*4882a593Smuzhiyun 		if (old_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED)
2283*4882a593Smuzhiyun 			new_state->content_protection =
2284*4882a593Smuzhiyun 				DRM_MODE_CONTENT_PROTECTION_DESIRED;
2285*4882a593Smuzhiyun 		return;
2286*4882a593Smuzhiyun 	}
2287*4882a593Smuzhiyun 
2288*4882a593Smuzhiyun 	crtc_state = drm_atomic_get_new_crtc_state(new_state->state,
2289*4882a593Smuzhiyun 						   new_state->crtc);
2290*4882a593Smuzhiyun 	/*
2291*4882a593Smuzhiyun 	 * Fix the HDCP uapi content protection state in case of modeset.
2292*4882a593Smuzhiyun 	 * FIXME: As per HDCP content protection property uapi doc, an uevent()
2293*4882a593Smuzhiyun 	 * need to be sent if there is transition from ENABLED->DESIRED.
2294*4882a593Smuzhiyun 	 */
2295*4882a593Smuzhiyun 	if (drm_atomic_crtc_needs_modeset(crtc_state) &&
2296*4882a593Smuzhiyun 	    (old_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED &&
2297*4882a593Smuzhiyun 	    new_cp != DRM_MODE_CONTENT_PROTECTION_UNDESIRED))
2298*4882a593Smuzhiyun 		new_state->content_protection =
2299*4882a593Smuzhiyun 			DRM_MODE_CONTENT_PROTECTION_DESIRED;
2300*4882a593Smuzhiyun 
2301*4882a593Smuzhiyun 	/*
2302*4882a593Smuzhiyun 	 * Nothing to do if the state didn't change, or HDCP was activated since
2303*4882a593Smuzhiyun 	 * the last commit. And also no change in hdcp content type.
2304*4882a593Smuzhiyun 	 */
2305*4882a593Smuzhiyun 	if (old_cp == new_cp ||
2306*4882a593Smuzhiyun 	    (old_cp == DRM_MODE_CONTENT_PROTECTION_DESIRED &&
2307*4882a593Smuzhiyun 	     new_cp == DRM_MODE_CONTENT_PROTECTION_ENABLED)) {
2308*4882a593Smuzhiyun 		if (old_state->hdcp_content_type ==
2309*4882a593Smuzhiyun 				new_state->hdcp_content_type)
2310*4882a593Smuzhiyun 			return;
2311*4882a593Smuzhiyun 	}
2312*4882a593Smuzhiyun 
2313*4882a593Smuzhiyun 	crtc_state->mode_changed = true;
2314*4882a593Smuzhiyun }
2315*4882a593Smuzhiyun 
2316*4882a593Smuzhiyun /* Handles the CP_IRQ raised from the DP HDCP sink */
intel_hdcp_handle_cp_irq(struct intel_connector * connector)2317*4882a593Smuzhiyun void intel_hdcp_handle_cp_irq(struct intel_connector *connector)
2318*4882a593Smuzhiyun {
2319*4882a593Smuzhiyun 	struct intel_hdcp *hdcp = &connector->hdcp;
2320*4882a593Smuzhiyun 
2321*4882a593Smuzhiyun 	if (!hdcp->shim)
2322*4882a593Smuzhiyun 		return;
2323*4882a593Smuzhiyun 
2324*4882a593Smuzhiyun 	atomic_inc(&connector->hdcp.cp_irq_count);
2325*4882a593Smuzhiyun 	wake_up_all(&connector->hdcp.cp_irq_queue);
2326*4882a593Smuzhiyun 
2327*4882a593Smuzhiyun 	schedule_delayed_work(&hdcp->check_work, 0);
2328*4882a593Smuzhiyun }
2329