Message ID | 1522763873-23041-25-git-send-email-ramalingam.c@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Ramalingam, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on drm-intel/for-linux-next] [also build test WARNING on next-20180403] [cannot apply to v4.16] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Ramalingam-C/drm-i915-Implement-HDCP2-2/20180404-031743 base: git://anongit.freedesktop.org/drm-intel for-linux-next reproduce: # apt-get install sparse make ARCH=x86_64 allmodconfig make C=1 CF=-D__CHECK_ENDIAN__ sparse warnings: (new ones prefixed by >>) >> drivers/gpu/drm/i915/intel_hdcp.c:1182:30: sparse: incorrect type in assignment (different base types) @@ expected restricted __be16 [assigned] [usertype] k @@ got e] k @@ drivers/gpu/drm/i915/intel_hdcp.c:1182:30: expected restricted __be16 [assigned] [usertype] k drivers/gpu/drm/i915/intel_hdcp.c:1182:30: got int drivers/gpu/drm/i915/intel_hdcp.c:1277:12: warning: 'hdcp2_authenticate_sink' defined but not used [-Wunused-function] static int hdcp2_authenticate_sink(struct intel_connector *connector) ^~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/gpu/drm/i915/intel_hdcp.c:13:0: include/linux/mei_hdcp.h:148:12: warning: 'mei_cldev_unregister_notify' defined but not used [-Wunused-function] static int mei_cldev_unregister_notify(struct notifier_block *nb) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ include/linux/mei_hdcp.h:144:12: warning: 'mei_cldev_register_notify' defined but not used [-Wunused-function] static int mei_cldev_register_notify(struct notifier_block *nb) ^~~~~~~~~~~~~~~~~~~~~~~~~ vim +1182 drivers/gpu/drm/i915/intel_hdcp.c 1163 1164 static 1165 int hdcp2_propagate_stream_management_info(struct intel_connector *connector) 1166 { 1167 struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); 1168 struct intel_hdcp *hdcp = &connector->hdcp; 1169 union { 1170 struct hdcp2_rep_stream_manage stream_manage; 1171 struct hdcp2_rep_stream_ready stream_ready; 1172 } msgs; 1173 const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; 1174 int ret; 1175 1176 /* Prepare RepeaterAuth_Stream_Manage msg */ 1177 msgs.stream_manage.msg_id = HDCP_2_2_REP_STREAM_MANAGE; 1178 reverse_endianness(msgs.stream_manage.seq_num_m, HDCP_2_2_SEQ_NUM_LEN, 1179 (u8 *)&hdcp->seq_num_m); 1180 1181 /* K no of streams is fixed as 1. Stored as big-endian. */ > 1182 msgs.stream_manage.k = __swab16(1); 1183 1184 /* For HDMI this is forced to be 0x0. For DP SST also this is 0x0. */ 1185 msgs.stream_manage.streams[0].stream_id = 0; 1186 msgs.stream_manage.streams[0].stream_type = hdcp->content_type; 1187 1188 /* Send it to Repeater */ 1189 ret = shim->write_2_2_msg(intel_dig_port, &msgs.stream_manage, 1190 sizeof(msgs.stream_manage)); 1191 if (ret < 0) 1192 return ret; 1193 1194 ret = shim->read_2_2_msg(intel_dig_port, HDCP_2_2_REP_STREAM_READY, 1195 &msgs.stream_ready, sizeof(msgs.stream_ready)); 1196 if (ret < 0) 1197 return ret; 1198 1199 hdcp->mei_data.seq_num_m = hdcp->seq_num_m; 1200 hdcp->mei_data.streams[0].stream_type = hdcp->content_type; 1201 1202 ret = hdcp2_verify_mprime(hdcp, &msgs.stream_ready); 1203 if (ret < 0) 1204 return ret; 1205 1206 hdcp->seq_num_m++; 1207 1208 if (hdcp->seq_num_m > HDCP_2_2_SEQ_NUM_MAX) { 1209 DRM_DEBUG_KMS("seq_num_m roll over.\n"); 1210 return -1; 1211 } 1212 return 0; 1213 } 1214 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
>-----Original Message----- >From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of >Ramalingam C >Sent: Tuesday, April 3, 2018 7:28 PM >To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; >seanpaul@chromium.org; daniel@ffwll.ch; chris@chris-wilson.co.uk; >jani.nikula@linux.intel.com; Winkler, Tomas <tomas.winkler@intel.com>; >Usyskin, Alexander <alexander.usyskin@intel.com> >Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >Subject: [Intel-gfx] [PATCH v3 24/40] drm/i915: Implement HDCP2.2 repeater >authentication > >Implements the HDCP2.2 repeaters authentication steps such as verifying the >downstream topology and sending stream management information. > >v2: > Rebased. >v3: > No Changes. > >Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >--- > drivers/gpu/drm/i915/intel_hdcp.c | 135 >++++++++++++++++++++++++++++++++++++++ > 1 file changed, 135 insertions(+) > >diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >b/drivers/gpu/drm/i915/intel_hdcp.c >index ee9b7519fe73..d70320da85e4 100644 >--- a/drivers/gpu/drm/i915/intel_hdcp.c >+++ b/drivers/gpu/drm/i915/intel_hdcp.c >@@ -1145,6 +1145,135 @@ static int hdcp2_session_key_exchange(struct >intel_connector *connector) > return 0; > } > >+/* >+ * Lib endianness functions are aligned for 16/32/64 bits. Since here >+sequence >+ * num is 24bits developed a small conversion function. >+ */ >+static inline void reverse_endianness(u8 *dest, size_t dst_sz, u8 *src) This function is already defined and used in mei layer. Define this in some common header file and use instead of duplicating it here. May be in below file: <drm/drm_connector.h> >+{ >+ u32 index; >+ >+ if (dest != NULL && dst_sz != 0) { >+ for (index = 0; index < dst_sz && index < sizeof(u32); >+ index++) { >+ dest[dst_sz - index - 1] = src[index]; >+ } >+ } >+} >+ >+static >+int hdcp2_propagate_stream_management_info(struct intel_connector >+*connector) { >+ struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >+ struct intel_hdcp *hdcp = &connector->hdcp; >+ union { >+ struct hdcp2_rep_stream_manage stream_manage; >+ struct hdcp2_rep_stream_ready stream_ready; >+ } msgs; >+ const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; >+ int ret; >+ >+ /* Prepare RepeaterAuth_Stream_Manage msg */ >+ msgs.stream_manage.msg_id = HDCP_2_2_REP_STREAM_MANAGE; >+ reverse_endianness(msgs.stream_manage.seq_num_m, >HDCP_2_2_SEQ_NUM_LEN, >+ (u8 *)&hdcp->seq_num_m); >+ >+ /* K no of streams is fixed as 1. Stored as big-endian. */ >+ msgs.stream_manage.k = __swab16(1); >+ >+ /* For HDMI this is forced to be 0x0. For DP SST also this is 0x0. */ >+ msgs.stream_manage.streams[0].stream_id = 0; >+ msgs.stream_manage.streams[0].stream_type = hdcp->content_type; >+ >+ /* Send it to Repeater */ >+ ret = shim->write_2_2_msg(intel_dig_port, &msgs.stream_manage, >+ sizeof(msgs.stream_manage)); >+ if (ret < 0) >+ return ret; >+ >+ ret = shim->read_2_2_msg(intel_dig_port, >HDCP_2_2_REP_STREAM_READY, >+ &msgs.stream_ready, >sizeof(msgs.stream_ready)); >+ if (ret < 0) >+ return ret; >+ >+ hdcp->mei_data.seq_num_m = hdcp->seq_num_m; >+ hdcp->mei_data.streams[0].stream_type = hdcp->content_type; >+ >+ ret = hdcp2_verify_mprime(hdcp, &msgs.stream_ready); >+ if (ret < 0) >+ return ret; >+ >+ hdcp->seq_num_m++; >+ >+ if (hdcp->seq_num_m > HDCP_2_2_SEQ_NUM_MAX) { >+ DRM_DEBUG_KMS("seq_num_m roll over.\n"); >+ return -1; >+ } Leave a blank line. >+ return 0; >+} >+ >+static >+int hdcp2_authenticate_repeater_topology(struct intel_connector >+*connector) { >+ struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >+ struct intel_hdcp *hdcp = &connector->hdcp; >+ union { >+ struct hdcp2_rep_send_receiverid_list recvid_list; >+ struct hdcp2_rep_send_ack rep_ack; >+ } msgs; >+ const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; >+ uint8_t *rx_info; >+ uint32_t seq_num_v; >+ int ret; >+ >+ ret = shim->read_2_2_msg(intel_dig_port, >HDCP_2_2_REP_SEND_RECVID_LIST, >+ &msgs.recvid_list, sizeof(msgs.recvid_list)); >+ if (ret < 0) >+ return ret; >+ >+ rx_info = msgs.recvid_list.rx_info; >+ >+ if (HDCP_2_2_MAX_CASCADE_EXCEEDED(rx_info[1]) || >+ HDCP_2_2_MAX_DEVS_EXCEEDED(rx_info[1])) { >+ DRM_DEBUG_KMS("Topology Max Size Exceeded\n"); >+ return -1; >+ } >+ >+ /* Converting and Storing the seq_num_v to local variable as DWORD */ >+ reverse_endianness((u8 *)&seq_num_v, HDCP_2_2_SEQ_NUM_LEN, >+ msgs.recvid_list.seq_num_v); >+ >+ if (seq_num_v < hdcp->seq_num_v) { >+ /* Roll over of the seq_num_v from repeater. Reauthenticate. */ >+ DRM_DEBUG_KMS("Seq_num_v roll over.\n"); >+ return -1; >+ } >+ >+ ret = hdcp2_verify_rep_topology_prepare_ack(hdcp, &msgs.recvid_list, >+ &msgs.rep_ack); >+ if (ret < 0) >+ return ret; >+ >+ hdcp->seq_num_v = seq_num_v; >+ ret = shim->write_2_2_msg(intel_dig_port, &msgs.rep_ack, >+ sizeof(msgs.rep_ack)); >+ if (ret < 0) >+ return ret; >+ >+ return 0; >+} >+ >+static int hdcp2_authenticate_repeater(struct intel_connector >+*connector) { >+ int ret; >+ >+ ret = hdcp2_authenticate_repeater_topology(connector); >+ if (ret < 0) >+ return ret; >+ >+ return hdcp2_propagate_stream_management_info(connector); >+} >+ > static int hdcp2_authenticate_sink(struct intel_connector *connector) { > struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >@@ -1186,6 +1315,12 @@ static int hdcp2_authenticate_sink(struct >intel_connector *connector) > sizeof(stream_type_msg)); > if (ret < 0) > return ret; >+ } else if (hdcp->is_repeater) { >+ ret = hdcp2_authenticate_repeater(connector); >+ if (ret < 0) { >+ DRM_DEBUG_KMS("Repeater Auth Failed. Err: %d\n", >ret); >+ return ret; >+ } > } > > hdcp->mei_data.streams[0].stream_type = hdcp->content_type; >-- >2.7.4 > >_______________________________________________ >Intel-gfx mailing list >Intel-gfx@lists.freedesktop.org >https://lists.freedesktop.org/mailman/listinfo/intel-gfx
On Monday 14 May 2018 02:38 PM, Shankar, Uma wrote: > >> -----Original Message----- >> From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On Behalf Of >> Ramalingam C >> Sent: Tuesday, April 3, 2018 7:28 PM >> To: intel-gfx@lists.freedesktop.org; dri-devel@lists.freedesktop.org; >> seanpaul@chromium.org; daniel@ffwll.ch; chris@chris-wilson.co.uk; >> jani.nikula@linux.intel.com; Winkler, Tomas <tomas.winkler@intel.com>; >> Usyskin, Alexander <alexander.usyskin@intel.com> >> Cc: Vivi, Rodrigo <rodrigo.vivi@intel.com> >> Subject: [Intel-gfx] [PATCH v3 24/40] drm/i915: Implement HDCP2.2 repeater >> authentication >> >> Implements the HDCP2.2 repeaters authentication steps such as verifying the >> downstream topology and sending stream management information. >> >> v2: >> Rebased. >> v3: >> No Changes. >> >> Signed-off-by: Ramalingam C <ramalingam.c@intel.com> >> --- >> drivers/gpu/drm/i915/intel_hdcp.c | 135 >> ++++++++++++++++++++++++++++++++++++++ >> 1 file changed, 135 insertions(+) >> >> diff --git a/drivers/gpu/drm/i915/intel_hdcp.c >> b/drivers/gpu/drm/i915/intel_hdcp.c >> index ee9b7519fe73..d70320da85e4 100644 >> --- a/drivers/gpu/drm/i915/intel_hdcp.c >> +++ b/drivers/gpu/drm/i915/intel_hdcp.c >> @@ -1145,6 +1145,135 @@ static int hdcp2_session_key_exchange(struct >> intel_connector *connector) >> return 0; >> } >> >> +/* >> + * Lib endianness functions are aligned for 16/32/64 bits. Since here >> +sequence >> + * num is 24bits developed a small conversion function. >> + */ >> +static inline void reverse_endianness(u8 *dest, size_t dst_sz, u8 *src) > This function is already defined and used in mei layer. Define this in some > common header file and use instead of duplicating it here. May be in below file: > <drm/drm_connector.h> Sure. --Ram >> +{ >> + u32 index; >> + >> + if (dest != NULL && dst_sz != 0) { >> + for (index = 0; index < dst_sz && index < sizeof(u32); >> + index++) { >> + dest[dst_sz - index - 1] = src[index]; >> + } >> + } >> +} >> + >> +static >> +int hdcp2_propagate_stream_management_info(struct intel_connector >> +*connector) { >> + struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >> + struct intel_hdcp *hdcp = &connector->hdcp; >> + union { >> + struct hdcp2_rep_stream_manage stream_manage; >> + struct hdcp2_rep_stream_ready stream_ready; >> + } msgs; >> + const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; >> + int ret; >> + >> + /* Prepare RepeaterAuth_Stream_Manage msg */ >> + msgs.stream_manage.msg_id = HDCP_2_2_REP_STREAM_MANAGE; >> + reverse_endianness(msgs.stream_manage.seq_num_m, >> HDCP_2_2_SEQ_NUM_LEN, >> + (u8 *)&hdcp->seq_num_m); >> + >> + /* K no of streams is fixed as 1. Stored as big-endian. */ >> + msgs.stream_manage.k = __swab16(1); >> + >> + /* For HDMI this is forced to be 0x0. For DP SST also this is 0x0. */ >> + msgs.stream_manage.streams[0].stream_id = 0; >> + msgs.stream_manage.streams[0].stream_type = hdcp->content_type; >> + >> + /* Send it to Repeater */ >> + ret = shim->write_2_2_msg(intel_dig_port, &msgs.stream_manage, >> + sizeof(msgs.stream_manage)); >> + if (ret < 0) >> + return ret; >> + >> + ret = shim->read_2_2_msg(intel_dig_port, >> HDCP_2_2_REP_STREAM_READY, >> + &msgs.stream_ready, >> sizeof(msgs.stream_ready)); >> + if (ret < 0) >> + return ret; >> + >> + hdcp->mei_data.seq_num_m = hdcp->seq_num_m; >> + hdcp->mei_data.streams[0].stream_type = hdcp->content_type; >> + >> + ret = hdcp2_verify_mprime(hdcp, &msgs.stream_ready); >> + if (ret < 0) >> + return ret; >> + >> + hdcp->seq_num_m++; >> + >> + if (hdcp->seq_num_m > HDCP_2_2_SEQ_NUM_MAX) { >> + DRM_DEBUG_KMS("seq_num_m roll over.\n"); >> + return -1; >> + } > Leave a blank line. > >> + return 0; >> +} >> + >> +static >> +int hdcp2_authenticate_repeater_topology(struct intel_connector >> +*connector) { >> + struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >> + struct intel_hdcp *hdcp = &connector->hdcp; >> + union { >> + struct hdcp2_rep_send_receiverid_list recvid_list; >> + struct hdcp2_rep_send_ack rep_ack; >> + } msgs; >> + const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; >> + uint8_t *rx_info; >> + uint32_t seq_num_v; >> + int ret; >> + >> + ret = shim->read_2_2_msg(intel_dig_port, >> HDCP_2_2_REP_SEND_RECVID_LIST, >> + &msgs.recvid_list, sizeof(msgs.recvid_list)); >> + if (ret < 0) >> + return ret; >> + >> + rx_info = msgs.recvid_list.rx_info; >> + >> + if (HDCP_2_2_MAX_CASCADE_EXCEEDED(rx_info[1]) || >> + HDCP_2_2_MAX_DEVS_EXCEEDED(rx_info[1])) { >> + DRM_DEBUG_KMS("Topology Max Size Exceeded\n"); >> + return -1; >> + } >> + >> + /* Converting and Storing the seq_num_v to local variable as DWORD */ >> + reverse_endianness((u8 *)&seq_num_v, HDCP_2_2_SEQ_NUM_LEN, >> + msgs.recvid_list.seq_num_v); >> + >> + if (seq_num_v < hdcp->seq_num_v) { >> + /* Roll over of the seq_num_v from repeater. Reauthenticate. */ >> + DRM_DEBUG_KMS("Seq_num_v roll over.\n"); >> + return -1; >> + } >> + >> + ret = hdcp2_verify_rep_topology_prepare_ack(hdcp, &msgs.recvid_list, >> + &msgs.rep_ack); >> + if (ret < 0) >> + return ret; >> + >> + hdcp->seq_num_v = seq_num_v; >> + ret = shim->write_2_2_msg(intel_dig_port, &msgs.rep_ack, >> + sizeof(msgs.rep_ack)); >> + if (ret < 0) >> + return ret; >> + >> + return 0; >> +} >> + >> +static int hdcp2_authenticate_repeater(struct intel_connector >> +*connector) { >> + int ret; >> + >> + ret = hdcp2_authenticate_repeater_topology(connector); >> + if (ret < 0) >> + return ret; >> + >> + return hdcp2_propagate_stream_management_info(connector); >> +} >> + >> static int hdcp2_authenticate_sink(struct intel_connector *connector) { >> struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); >> @@ -1186,6 +1315,12 @@ static int hdcp2_authenticate_sink(struct >> intel_connector *connector) >> sizeof(stream_type_msg)); >> if (ret < 0) >> return ret; >> + } else if (hdcp->is_repeater) { >> + ret = hdcp2_authenticate_repeater(connector); >> + if (ret < 0) { >> + DRM_DEBUG_KMS("Repeater Auth Failed. Err: %d\n", >> ret); >> + return ret; >> + } >> } >> >> hdcp->mei_data.streams[0].stream_type = hdcp->content_type; >> -- >> 2.7.4 >> >> _______________________________________________ >> Intel-gfx mailing list >> Intel-gfx@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/i915/intel_hdcp.c b/drivers/gpu/drm/i915/intel_hdcp.c index ee9b7519fe73..d70320da85e4 100644 --- a/drivers/gpu/drm/i915/intel_hdcp.c +++ b/drivers/gpu/drm/i915/intel_hdcp.c @@ -1145,6 +1145,135 @@ static int hdcp2_session_key_exchange(struct intel_connector *connector) return 0; } +/* + * Lib endianness functions are aligned for 16/32/64 bits. Since here sequence + * num is 24bits developed a small conversion function. + */ +static inline void reverse_endianness(u8 *dest, size_t dst_sz, u8 *src) +{ + u32 index; + + if (dest != NULL && dst_sz != 0) { + for (index = 0; index < dst_sz && index < sizeof(u32); + index++) { + dest[dst_sz - index - 1] = src[index]; + } + } +} + +static +int hdcp2_propagate_stream_management_info(struct intel_connector *connector) +{ + struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); + struct intel_hdcp *hdcp = &connector->hdcp; + union { + struct hdcp2_rep_stream_manage stream_manage; + struct hdcp2_rep_stream_ready stream_ready; + } msgs; + const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; + int ret; + + /* Prepare RepeaterAuth_Stream_Manage msg */ + msgs.stream_manage.msg_id = HDCP_2_2_REP_STREAM_MANAGE; + reverse_endianness(msgs.stream_manage.seq_num_m, HDCP_2_2_SEQ_NUM_LEN, + (u8 *)&hdcp->seq_num_m); + + /* K no of streams is fixed as 1. Stored as big-endian. */ + msgs.stream_manage.k = __swab16(1); + + /* For HDMI this is forced to be 0x0. For DP SST also this is 0x0. */ + msgs.stream_manage.streams[0].stream_id = 0; + msgs.stream_manage.streams[0].stream_type = hdcp->content_type; + + /* Send it to Repeater */ + ret = shim->write_2_2_msg(intel_dig_port, &msgs.stream_manage, + sizeof(msgs.stream_manage)); + if (ret < 0) + return ret; + + ret = shim->read_2_2_msg(intel_dig_port, HDCP_2_2_REP_STREAM_READY, + &msgs.stream_ready, sizeof(msgs.stream_ready)); + if (ret < 0) + return ret; + + hdcp->mei_data.seq_num_m = hdcp->seq_num_m; + hdcp->mei_data.streams[0].stream_type = hdcp->content_type; + + ret = hdcp2_verify_mprime(hdcp, &msgs.stream_ready); + if (ret < 0) + return ret; + + hdcp->seq_num_m++; + + if (hdcp->seq_num_m > HDCP_2_2_SEQ_NUM_MAX) { + DRM_DEBUG_KMS("seq_num_m roll over.\n"); + return -1; + } + return 0; +} + +static +int hdcp2_authenticate_repeater_topology(struct intel_connector *connector) +{ + struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); + struct intel_hdcp *hdcp = &connector->hdcp; + union { + struct hdcp2_rep_send_receiverid_list recvid_list; + struct hdcp2_rep_send_ack rep_ack; + } msgs; + const struct intel_hdcp_shim *shim = hdcp->hdcp_shim; + uint8_t *rx_info; + uint32_t seq_num_v; + int ret; + + ret = shim->read_2_2_msg(intel_dig_port, HDCP_2_2_REP_SEND_RECVID_LIST, + &msgs.recvid_list, sizeof(msgs.recvid_list)); + if (ret < 0) + return ret; + + rx_info = msgs.recvid_list.rx_info; + + if (HDCP_2_2_MAX_CASCADE_EXCEEDED(rx_info[1]) || + HDCP_2_2_MAX_DEVS_EXCEEDED(rx_info[1])) { + DRM_DEBUG_KMS("Topology Max Size Exceeded\n"); + return -1; + } + + /* Converting and Storing the seq_num_v to local variable as DWORD */ + reverse_endianness((u8 *)&seq_num_v, HDCP_2_2_SEQ_NUM_LEN, + msgs.recvid_list.seq_num_v); + + if (seq_num_v < hdcp->seq_num_v) { + /* Roll over of the seq_num_v from repeater. Reauthenticate. */ + DRM_DEBUG_KMS("Seq_num_v roll over.\n"); + return -1; + } + + ret = hdcp2_verify_rep_topology_prepare_ack(hdcp, &msgs.recvid_list, + &msgs.rep_ack); + if (ret < 0) + return ret; + + hdcp->seq_num_v = seq_num_v; + ret = shim->write_2_2_msg(intel_dig_port, &msgs.rep_ack, + sizeof(msgs.rep_ack)); + if (ret < 0) + return ret; + + return 0; +} + +static int hdcp2_authenticate_repeater(struct intel_connector *connector) +{ + int ret; + + ret = hdcp2_authenticate_repeater_topology(connector); + if (ret < 0) + return ret; + + return hdcp2_propagate_stream_management_info(connector); +} + static int hdcp2_authenticate_sink(struct intel_connector *connector) { struct intel_digital_port *intel_dig_port = conn_to_dig_port(connector); @@ -1186,6 +1315,12 @@ static int hdcp2_authenticate_sink(struct intel_connector *connector) sizeof(stream_type_msg)); if (ret < 0) return ret; + } else if (hdcp->is_repeater) { + ret = hdcp2_authenticate_repeater(connector); + if (ret < 0) { + DRM_DEBUG_KMS("Repeater Auth Failed. Err: %d\n", ret); + return ret; + } } hdcp->mei_data.streams[0].stream_type = hdcp->content_type;
Implements the HDCP2.2 repeaters authentication steps such as verifying the downstream topology and sending stream management information. v2: Rebased. v3: No Changes. Signed-off-by: Ramalingam C <ramalingam.c@intel.com> --- drivers/gpu/drm/i915/intel_hdcp.c | 135 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+)