@@ -2058,7 +2058,7 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
2058
2058
{
2059
2059
struct device * dev = it6505 -> dev ;
2060
2060
u8 av [5 ][4 ], bv [5 ][4 ];
2061
- int i , err ;
2061
+ int i , err , retry ;
2062
2062
2063
2063
i = it6505_setup_sha1_input (it6505 , it6505 -> sha1_input );
2064
2064
if (i <= 0 ) {
@@ -2067,22 +2067,28 @@ static bool it6505_hdcp_part2_ksvlist_check(struct it6505 *it6505)
2067
2067
}
2068
2068
2069
2069
it6505_sha1_digest (it6505 , it6505 -> sha1_input , i , (u8 * )av );
2070
+ /*1B-05 V' must retry 3 times */
2071
+ for (retry = 0 ; retry < 3 ; retry ++ ) {
2072
+ err = it6505_get_dpcd (it6505 , DP_AUX_HDCP_V_PRIME (0 ), (u8 * )bv ,
2073
+ sizeof (bv ));
2070
2074
2071
- err = it6505_get_dpcd (it6505 , DP_AUX_HDCP_V_PRIME (0 ), (u8 * )bv ,
2072
- sizeof (bv ));
2075
+ if (err < 0 ) {
2076
+ dev_err (dev , "Read V' value Fail %d" , retry );
2077
+ continue ;
2078
+ }
2073
2079
2074
- if ( err < 0 ) {
2075
- dev_err ( dev , "Read V' value Fail" );
2076
- return false;
2077
- }
2080
+ for ( i = 0 ; i < 5 ; i ++ ) {
2081
+ if ( bv [ i ][ 3 ] != av [ i ][ 0 ] || bv [ i ][ 2 ] != av [ i ][ 1 ] ||
2082
+ av [ i ][ 1 ] != av [ i ][ 2 ] || bv [ i ][ 0 ] != av [ i ][ 3 ])
2083
+ break ;
2078
2084
2079
- for ( i = 0 ; i < 5 ; i ++ )
2080
- if ( bv [ i ][ 3 ] != av [ i ][ 0 ] || bv [ i ][ 2 ] != av [ i ][ 1 ] ||
2081
- bv [ i ][ 1 ] != av [ i ][ 2 ] || bv [ i ][ 0 ] != av [ i ][ 3 ])
2082
- return false;
2085
+ DRM_DEV_DEBUG_DRIVER ( dev , "V' all match!! %d, %d" , retry , i );
2086
+ return true;
2087
+ }
2088
+ }
2083
2089
2084
- DRM_DEV_DEBUG_DRIVER (dev , "V' all match!!" );
2085
- return true ;
2090
+ DRM_DEV_DEBUG_DRIVER (dev , "V' NOT match!! %d" , retry );
2091
+ return false ;
2086
2092
}
2087
2093
2088
2094
static void it6505_hdcp_wait_ksv_list (struct work_struct * work )
0 commit comments