Lines Matching refs:hdcp

26 #include "hdcp.h"
28 static void push_error_status(struct mod_hdcp *hdcp,
31 struct mod_hdcp_trace *trace = &hdcp->connection.trace;
35 trace->errors[trace->error_count].state_id = hdcp->state.id;
37 HDCP_ERROR_TRACE(hdcp, status);
40 if (is_hdcp1(hdcp)) {
41 hdcp->connection.hdcp1_retry_count++;
42 if (hdcp->connection.hdcp1_retry_count == MAX_NUM_OF_ATTEMPTS)
43 hdcp->connection.link.adjust.hdcp1.disable = 1;
44 } else if (is_hdcp2(hdcp)) {
45 hdcp->connection.hdcp2_retry_count++;
46 if (hdcp->connection.hdcp2_retry_count == MAX_NUM_OF_ATTEMPTS)
47 hdcp->connection.link.adjust.hdcp2.disable = 1;
51 static uint8_t is_cp_desired_hdcp1(struct mod_hdcp *hdcp)
56 * hdcp is not desired
59 if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_INACTIVE &&
60 hdcp->displays[i].adjust.disable != MOD_HDCP_DISPLAY_DISABLE_AUTHENTICATION) {
67 !hdcp->connection.link.adjust.hdcp1.disable &&
68 !hdcp->connection.is_hdcp1_revoked;
71 static uint8_t is_cp_desired_hdcp2(struct mod_hdcp *hdcp)
76 * hdcp is not desired
79 if (hdcp->displays[i].state != MOD_HDCP_DISPLAY_INACTIVE &&
80 hdcp->displays[i].adjust.disable != MOD_HDCP_DISPLAY_DISABLE_AUTHENTICATION) {
87 !hdcp->connection.link.adjust.hdcp2.disable &&
88 !hdcp->connection.is_hdcp2_revoked;
91 static enum mod_hdcp_status execution(struct mod_hdcp *hdcp,
97 if (is_in_initialized_state(hdcp)) {
104 } else if (is_in_cp_not_desired_state(hdcp)) {
109 } else if (is_in_hdcp1_states(hdcp)) {
110 status = mod_hdcp_hdcp1_execution(hdcp, event_ctx, &input->hdcp1);
111 } else if (is_in_hdcp1_dp_states(hdcp)) {
112 status = mod_hdcp_hdcp1_dp_execution(hdcp,
114 } else if (is_in_hdcp2_states(hdcp)) {
115 status = mod_hdcp_hdcp2_execution(hdcp, event_ctx, &input->hdcp2);
116 } else if (is_in_hdcp2_dp_states(hdcp)) {
117 status = mod_hdcp_hdcp2_dp_execution(hdcp,
127 static enum mod_hdcp_status transition(struct mod_hdcp *hdcp,
137 if (is_in_initialized_state(hdcp)) {
138 if (is_dp_hdcp(hdcp))
139 if (is_cp_desired_hdcp2(hdcp)) {
141 set_state_id(hdcp, output, D2_A0_DETERMINE_RX_HDCP_CAPABLE);
142 } else if (is_cp_desired_hdcp1(hdcp)) {
144 set_state_id(hdcp, output, D1_A0_DETERMINE_RX_HDCP_CAPABLE);
147 set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED);
148 set_auth_complete(hdcp, output);
150 else if (is_hdmi_dvi_sl_hdcp(hdcp))
151 if (is_cp_desired_hdcp2(hdcp)) {
153 set_state_id(hdcp, output, H2_A0_KNOWN_HDCP2_CAPABLE_RX);
154 } else if (is_cp_desired_hdcp1(hdcp)) {
156 set_state_id(hdcp, output, H1_A0_WAIT_FOR_ACTIVE_RX);
159 set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED);
160 set_auth_complete(hdcp, output);
164 set_state_id(hdcp, output, HDCP_CP_NOT_DESIRED);
165 set_auth_complete(hdcp, output);
167 } else if (is_in_cp_not_desired_state(hdcp)) {
168 increment_stay_counter(hdcp);
169 } else if (is_in_hdcp1_states(hdcp)) {
170 status = mod_hdcp_hdcp1_transition(hdcp,
172 } else if (is_in_hdcp1_dp_states(hdcp)) {
173 status = mod_hdcp_hdcp1_dp_transition(hdcp,
175 } else if (is_in_hdcp2_states(hdcp)) {
176 status = mod_hdcp_hdcp2_transition(hdcp,
178 } else if (is_in_hdcp2_dp_states(hdcp)) {
179 status = mod_hdcp_hdcp2_dp_transition(hdcp,
188 static enum mod_hdcp_status reset_authentication(struct mod_hdcp *hdcp,
193 if (is_hdcp1(hdcp)) {
194 if (hdcp->auth.trans_input.hdcp1.create_session != UNKNOWN) {
198 mod_hdcp_hdcp1_destroy_session(hdcp);
202 HDCP_TOP_RESET_AUTH_TRACE(hdcp);
203 memset(&hdcp->auth, 0, sizeof(struct mod_hdcp_authentication));
204 memset(&hdcp->state, 0, sizeof(struct mod_hdcp_state));
205 set_state_id(hdcp, output, HDCP_INITIALIZED);
206 } else if (is_hdcp2(hdcp)) {
207 if (hdcp->auth.trans_input.hdcp2.create_session == PASS) {
208 status = mod_hdcp_hdcp2_destroy_session(hdcp);
216 HDCP_TOP_RESET_AUTH_TRACE(hdcp);
217 memset(&hdcp->auth, 0, sizeof(struct mod_hdcp_authentication));
218 memset(&hdcp->state, 0, sizeof(struct mod_hdcp_state));
219 set_state_id(hdcp, output, HDCP_INITIALIZED);
220 } else if (is_in_cp_not_desired_state(hdcp)) {
221 HDCP_TOP_RESET_AUTH_TRACE(hdcp);
222 memset(&hdcp->auth, 0, sizeof(struct mod_hdcp_authentication));
223 memset(&hdcp->state, 0, sizeof(struct mod_hdcp_state));
224 set_state_id(hdcp, output, HDCP_INITIALIZED);
234 static enum mod_hdcp_status reset_connection(struct mod_hdcp *hdcp,
241 status = reset_authentication(hdcp, output);
245 if (current_state(hdcp) != HDCP_UNINITIALIZED) {
246 HDCP_TOP_RESET_CONN_TRACE(hdcp);
247 set_state_id(hdcp, output, HDCP_UNINITIALIZED);
249 memset(&hdcp->connection, 0, sizeof(hdcp->connection));
254 static enum mod_hdcp_status update_display_adjustments(struct mod_hdcp *hdcp,
260 if (is_in_authenticated_states(hdcp) &&
261 is_dp_mst_hdcp(hdcp) &&
265 if (is_hdcp1(hdcp))
266 status = mod_hdcp_hdcp1_enable_dp_stream_encryption(hdcp);
267 else if (is_hdcp2(hdcp))
268 status = mod_hdcp_hdcp2_enable_dp_stream_encryption(hdcp);
289 enum mod_hdcp_status mod_hdcp_setup(struct mod_hdcp *hdcp,
296 hdcp->config = *config;
297 HDCP_TOP_INTERFACE_TRACE(hdcp);
298 status = reset_connection(hdcp, &output);
300 push_error_status(hdcp, status);
304 enum mod_hdcp_status mod_hdcp_teardown(struct mod_hdcp *hdcp)
309 HDCP_TOP_INTERFACE_TRACE(hdcp);
311 status = reset_connection(hdcp, &output);
313 memset(hdcp, 0, sizeof(struct mod_hdcp));
315 push_error_status(hdcp, status);
319 enum mod_hdcp_status mod_hdcp_add_display(struct mod_hdcp *hdcp,
326 HDCP_TOP_INTERFACE_TRACE_WITH_INDEX(hdcp, display->index);
336 if (get_active_display_at_index(hdcp, display->index)) {
342 display_container = get_empty_display_container(hdcp);
349 status = reset_authentication(hdcp, output);
354 reset_retry_counts(hdcp);
357 memset(&hdcp->connection.trace, 0, sizeof(hdcp->connection.trace));
360 hdcp->connection.link = *link;
362 status = mod_hdcp_add_display_to_topology(hdcp, display_container);
368 if (current_state(hdcp) != HDCP_INITIALIZED)
369 set_state_id(hdcp, output, HDCP_INITIALIZED);
370 callback_in_ms(hdcp->connection.link.adjust.auth_delay * 1000, output);
373 push_error_status(hdcp, status);
378 enum mod_hdcp_status mod_hdcp_remove_display(struct mod_hdcp *hdcp,
384 HDCP_TOP_INTERFACE_TRACE_WITH_INDEX(hdcp, index);
388 display = get_active_display_at_index(hdcp, index);
395 status = reset_authentication(hdcp, output);
400 reset_retry_counts(hdcp);
403 memset(&hdcp->connection.trace, 0, sizeof(hdcp->connection.trace));
406 status = mod_hdcp_remove_display_from_topology(hdcp, index);
412 if (current_state(hdcp) != HDCP_UNINITIALIZED)
413 callback_in_ms(hdcp->connection.link.adjust.auth_delay * 1000,
417 push_error_status(hdcp, status);
421 enum mod_hdcp_status mod_hdcp_update_display(struct mod_hdcp *hdcp,
430 HDCP_TOP_INTERFACE_TRACE_WITH_INDEX(hdcp, index);
434 display = get_active_display_at_index(hdcp, index);
441 if (memcmp(link_adjust, &hdcp->connection.link.adjust,
449 if (memcmp(link_adjust, &hdcp->connection.link.adjust,
453 status = update_display_adjustments(hdcp, display, display_adjust);
459 status = reset_authentication(hdcp, output);
464 reset_retry_counts(hdcp);
467 memset(&hdcp->connection.trace, 0, sizeof(hdcp->connection.trace));
470 hdcp->connection.link.adjust = *link_adjust;
474 if (current_state(hdcp) != HDCP_UNINITIALIZED)
480 push_error_status(hdcp, status);
484 enum mod_hdcp_status mod_hdcp_query_display(struct mod_hdcp *hdcp,
491 display = get_active_display_at_index(hdcp, index);
498 query->link = &hdcp->connection.link;
500 query->trace = &hdcp->connection.trace;
504 if (is_hdcp1(hdcp)) {
506 } else if (is_hdcp2(hdcp)) {
522 enum mod_hdcp_status mod_hdcp_reset_connection(struct mod_hdcp *hdcp,
527 HDCP_TOP_INTERFACE_TRACE(hdcp);
528 status = reset_connection(hdcp, output);
530 push_error_status(hdcp, status);
535 enum mod_hdcp_status mod_hdcp_process_event(struct mod_hdcp *hdcp,
541 HDCP_EVENT_TRACE(hdcp, event);
547 exec_status = execution(hdcp, &event_ctx, &hdcp->auth.trans_input);
549 hdcp, &event_ctx, &hdcp->auth.trans_input, output);
554 push_error_status(hdcp, status);
557 push_error_status(hdcp, status);
562 mod_hdcp_log_ddc_trace(hdcp);
563 reset_status = reset_authentication(hdcp, output);
565 push_error_status(hdcp, reset_status);
570 status = mod_hdcp_clear_cp_irq_status(hdcp);
572 push_error_status(hdcp, status);