Lines Matching full:hdcp

26 #include "hdcp.h"
28 static void push_error_status(struct mod_hdcp *hdcp, in push_error_status() argument
31 struct mod_hdcp_trace *trace = &hdcp->connection.trace; in push_error_status()
35 trace->errors[trace->error_count].state_id = hdcp->state.id; in push_error_status()
37 HDCP_ERROR_TRACE(hdcp, status); in push_error_status()
40 if (is_hdcp1(hdcp)) { in push_error_status()
41 hdcp->connection.hdcp1_retry_count++; in push_error_status()
42 } else if (is_hdcp2(hdcp)) { in push_error_status()
43 hdcp->connection.hdcp2_retry_count++; in push_error_status()
47 static uint8_t is_cp_desired_hdcp1(struct mod_hdcp *hdcp) in is_cp_desired_hdcp1() argument
52 * hdcp is not desired in is_cp_desired_hdcp1()
55 if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_INACTIVE && in is_cp_desired_hdcp1()
56 !hdcp->displays[i].adjust.disable) { in is_cp_desired_hdcp1()
62 return (hdcp->connection.hdcp1_retry_count < MAX_NUM_OF_ATTEMPTS) && in is_cp_desired_hdcp1()
64 !hdcp->connection.link.adjust.hdcp1.disable && in is_cp_desired_hdcp1()
65 !hdcp->connection.is_hdcp1_revoked; in is_cp_desired_hdcp1()
68 static uint8_t is_cp_desired_hdcp2(struct mod_hdcp *hdcp) in is_cp_desired_hdcp2() argument
73 * hdcp is not desired in is_cp_desired_hdcp2()
76 if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_INACTIVE && in is_cp_desired_hdcp2()
77 !hdcp->displays[i].adjust.disable) { in is_cp_desired_hdcp2()
83 return (hdcp->connection.hdcp2_retry_count < MAX_NUM_OF_ATTEMPTS) && in is_cp_desired_hdcp2()
85 !hdcp->connection.link.adjust.hdcp2.disable && in is_cp_desired_hdcp2()
86 !hdcp->connection.is_hdcp2_revoked; in is_cp_desired_hdcp2()
89 static enum mod_hdcp_status execution(struct mod_hdcp *hdcp, in execution() argument
95 if (is_in_initialized_state(hdcp)) { in execution()
102 } else if (is_in_cp_not_desired_state(hdcp)) { in execution()
107 } else if (is_in_hdcp1_states(hdcp)) { in execution()
108 status = mod_hdcp_hdcp1_execution(hdcp, event_ctx, &input->hdcp1); in execution()
109 } else if (is_in_hdcp1_dp_states(hdcp)) { in execution()
110 status = mod_hdcp_hdcp1_dp_execution(hdcp, in execution()
112 } else if (is_in_hdcp2_states(hdcp)) { in execution()
113 status = mod_hdcp_hdcp2_execution(hdcp, event_ctx, &input->hdcp2); in execution()
114 } else if (is_in_hdcp2_dp_states(hdcp)) { in execution()
115 status = mod_hdcp_hdcp2_dp_execution(hdcp, in execution()
125 static enum mod_hdcp_status transition(struct mod_hdcp *hdcp, in transition() argument
135 if (is_in_initialized_state(hdcp)) { in transition()
136 if (is_dp_hdcp(hdcp)) in transition()
137 if (is_cp_desired_hdcp2(hdcp)) { in transition()
139 set_state_id(hdcp, output, D2_A0_DETERMINE_RX_HDCP_CAPABLE); in transition()
140 } else if (is_cp_desired_hdcp1(hdcp)) { in transition()
142 set_state_id(hdcp, output, D1_A0_DETERMINE_RX_HDCP_CAPABLE); in transition()
145 set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED); in transition()
147 else if (is_hdmi_dvi_sl_hdcp(hdcp)) in transition()
148 if (is_cp_desired_hdcp2(hdcp)) { in transition()
150 set_state_id(hdcp, output, H2_A0_KNOWN_HDCP2_CAPABLE_RX); in transition()
151 } else if (is_cp_desired_hdcp1(hdcp)) { in transition()
153 set_state_id(hdcp, output, H1_A0_WAIT_FOR_ACTIVE_RX); in transition()
156 set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED); in transition()
160 set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED); in transition()
162 } else if (is_in_cp_not_desired_state(hdcp)) { in transition()
163 increment_stay_counter(hdcp); in transition()
164 } else if (is_in_hdcp1_states(hdcp)) { in transition()
165 status = mod_hdcp_hdcp1_transition(hdcp, in transition()
167 } else if (is_in_hdcp1_dp_states(hdcp)) { in transition()
168 status = mod_hdcp_hdcp1_dp_transition(hdcp, in transition()
170 } else if (is_in_hdcp2_states(hdcp)) { in transition()
171 status = mod_hdcp_hdcp2_transition(hdcp, in transition()
173 } else if (is_in_hdcp2_dp_states(hdcp)) { in transition()
174 status = mod_hdcp_hdcp2_dp_transition(hdcp, in transition()
183 static enum mod_hdcp_status reset_authentication(struct mod_hdcp *hdcp, in reset_authentication() argument
188 if (is_hdcp1(hdcp)) { in reset_authentication()
189 if (hdcp->auth.trans_input.hdcp1.create_session != UNKNOWN) { in reset_authentication()
193 mod_hdcp_hdcp1_destroy_session(hdcp); in reset_authentication()
197 HDCP_TOP_RESET_AUTH_TRACE(hdcp); in reset_authentication()
198 memset(&hdcp->auth, 0, sizeof(struct mod_hdcp_authentication)); in reset_authentication()
199 memset(&hdcp->state, 0, sizeof(struct mod_hdcp_state)); in reset_authentication()
200 set_state_id(hdcp, output, HDCP_INITIALIZED); in reset_authentication()
201 } else if (is_hdcp2(hdcp)) { in reset_authentication()
202 if (hdcp->auth.trans_input.hdcp2.create_session == PASS) { in reset_authentication()
203 status = mod_hdcp_hdcp2_destroy_session(hdcp); in reset_authentication()
211 HDCP_TOP_RESET_AUTH_TRACE(hdcp); in reset_authentication()
212 memset(&hdcp->auth, 0, sizeof(struct mod_hdcp_authentication)); in reset_authentication()
213 memset(&hdcp->state, 0, sizeof(struct mod_hdcp_state)); in reset_authentication()
214 set_state_id(hdcp, output, HDCP_INITIALIZED); in reset_authentication()
215 } else if (is_in_cp_not_desired_state(hdcp)) { in reset_authentication()
216 HDCP_TOP_RESET_AUTH_TRACE(hdcp); in reset_authentication()
217 memset(&hdcp->auth, 0, sizeof(struct mod_hdcp_authentication)); in reset_authentication()
218 memset(&hdcp->state, 0, sizeof(struct mod_hdcp_state)); in reset_authentication()
219 set_state_id(hdcp, output, HDCP_INITIALIZED); in reset_authentication()
229 static enum mod_hdcp_status reset_connection(struct mod_hdcp *hdcp, in reset_connection() argument
236 status = reset_authentication(hdcp, output); in reset_connection()
240 if (current_state(hdcp) != HDCP_UNINITIALIZED) { in reset_connection()
241 HDCP_TOP_RESET_CONN_TRACE(hdcp); in reset_connection()
242 set_state_id(hdcp, output, HDCP_UNINITIALIZED); in reset_connection()
244 memset(&hdcp->connection, 0, sizeof(hdcp->connection)); in reset_connection()
257 enum mod_hdcp_status mod_hdcp_setup(struct mod_hdcp *hdcp, in mod_hdcp_setup() argument
263 memset(hdcp, 0, sizeof(struct mod_hdcp)); in mod_hdcp_setup()
265 hdcp->config = *config; in mod_hdcp_setup()
266 HDCP_TOP_INTERFACE_TRACE(hdcp); in mod_hdcp_setup()
267 status = reset_connection(hdcp, &output); in mod_hdcp_setup()
269 push_error_status(hdcp, status); in mod_hdcp_setup()
273 enum mod_hdcp_status mod_hdcp_teardown(struct mod_hdcp *hdcp) in mod_hdcp_teardown() argument
278 HDCP_TOP_INTERFACE_TRACE(hdcp); in mod_hdcp_teardown()
280 status = reset_connection(hdcp, &output); in mod_hdcp_teardown()
282 memset(hdcp, 0, sizeof(struct mod_hdcp)); in mod_hdcp_teardown()
284 push_error_status(hdcp, status); in mod_hdcp_teardown()
288 enum mod_hdcp_status mod_hdcp_add_display(struct mod_hdcp *hdcp, in mod_hdcp_add_display() argument
295 HDCP_TOP_INTERFACE_TRACE_WITH_INDEX(hdcp, display->index); in mod_hdcp_add_display()
305 if (get_active_display_at_index(hdcp, display->index)) { in mod_hdcp_add_display()
311 display_container = get_empty_display_container(hdcp); in mod_hdcp_add_display()
318 status = reset_authentication(hdcp, output); in mod_hdcp_add_display()
323 reset_retry_counts(hdcp); in mod_hdcp_add_display()
326 memset(&hdcp->connection.trace, 0, sizeof(hdcp->connection.trace)); in mod_hdcp_add_display()
329 hdcp->connection.link = *link; in mod_hdcp_add_display()
331 status = mod_hdcp_add_display_to_topology(hdcp, display_container); in mod_hdcp_add_display()
337 if (current_state(hdcp) != HDCP_INITIALIZED) in mod_hdcp_add_display()
338 set_state_id(hdcp, output, HDCP_INITIALIZED); in mod_hdcp_add_display()
339 callback_in_ms(hdcp->connection.link.adjust.auth_delay * 1000, output); in mod_hdcp_add_display()
342 push_error_status(hdcp, status); in mod_hdcp_add_display()
347 enum mod_hdcp_status mod_hdcp_remove_display(struct mod_hdcp *hdcp, in mod_hdcp_remove_display() argument
353 HDCP_TOP_INTERFACE_TRACE_WITH_INDEX(hdcp, index); in mod_hdcp_remove_display()
357 display = get_active_display_at_index(hdcp, index); in mod_hdcp_remove_display()
364 status = reset_authentication(hdcp, output); in mod_hdcp_remove_display()
369 reset_retry_counts(hdcp); in mod_hdcp_remove_display()
372 memset(&hdcp->connection.trace, 0, sizeof(hdcp->connection.trace)); in mod_hdcp_remove_display()
375 status = mod_hdcp_remove_display_from_topology(hdcp, index); in mod_hdcp_remove_display()
381 if (current_state(hdcp) != HDCP_UNINITIALIZED) in mod_hdcp_remove_display()
382 callback_in_ms(hdcp->connection.link.adjust.auth_delay * 1000, in mod_hdcp_remove_display()
386 push_error_status(hdcp, status); in mod_hdcp_remove_display()
390 enum mod_hdcp_status mod_hdcp_query_display(struct mod_hdcp *hdcp, in mod_hdcp_query_display() argument
397 display = get_active_display_at_index(hdcp, index); in mod_hdcp_query_display()
404 query->link = &hdcp->connection.link; in mod_hdcp_query_display()
406 query->trace = &hdcp->connection.trace; in mod_hdcp_query_display()
410 if (is_hdcp1(hdcp)) { in mod_hdcp_query_display()
412 } else if (is_hdcp2(hdcp)) { in mod_hdcp_query_display()
428 enum mod_hdcp_status mod_hdcp_reset_connection(struct mod_hdcp *hdcp, in mod_hdcp_reset_connection() argument
433 HDCP_TOP_INTERFACE_TRACE(hdcp); in mod_hdcp_reset_connection()
434 status = reset_connection(hdcp, output); in mod_hdcp_reset_connection()
436 push_error_status(hdcp, status); in mod_hdcp_reset_connection()
441 enum mod_hdcp_status mod_hdcp_process_event(struct mod_hdcp *hdcp, in mod_hdcp_process_event() argument
447 HDCP_EVENT_TRACE(hdcp, event); in mod_hdcp_process_event()
453 exec_status = execution(hdcp, &event_ctx, &hdcp->auth.trans_input); in mod_hdcp_process_event()
455 hdcp, &event_ctx, &hdcp->auth.trans_input, output); in mod_hdcp_process_event()
460 push_error_status(hdcp, status); in mod_hdcp_process_event()
463 push_error_status(hdcp, status); in mod_hdcp_process_event()
468 HDCP_FULL_DDC_TRACE(hdcp); in mod_hdcp_process_event()
469 reset_status = reset_authentication(hdcp, output); in mod_hdcp_process_event()
471 push_error_status(hdcp, reset_status); in mod_hdcp_process_event()
476 status = mod_hdcp_clear_cp_irq_status(hdcp); in mod_hdcp_process_event()
478 push_error_status(hdcp, status); in mod_hdcp_process_event()