drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_transition.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_transition.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_transition.c
Extension
.c
Size
10655 bytes
Lines
323
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (input->bksv_read != PASS || input->bcaps_read != PASS) {
			/* 1A-04: repeatedly attempts on port access failure */
			callback_in_ms(500, output);
			increment_stay_counter(hdcp);
			break;
		}
		callback_in_ms(0, output);
		set_state_id(hdcp, output, H1_A1_EXCHANGE_KSVS);
		break;
	case H1_A1_EXCHANGE_KSVS:
		if (input->create_session != PASS) {
			/* out of sync with psp state */
			adjust->hdcp1.disable = 1;
			fail_and_restart_in_ms(0, &status, output);
			break;
		} else if (input->an_write != PASS ||
				input->aksv_write != PASS ||
				input->bksv_read != PASS ||
				input->bksv_validation != PASS ||
				input->ainfo_write == FAIL) {
			/* 1A-05: consider invalid bksv a failure */
			fail_and_restart_in_ms(0, &status, output);
			break;
		}
		callback_in_ms(300, output);
		set_state_id(hdcp, output,
			H1_A2_COMPUTATIONS_A3_VALIDATE_RX_A6_TEST_FOR_REPEATER);
		break;
	case H1_A2_COMPUTATIONS_A3_VALIDATE_RX_A6_TEST_FOR_REPEATER:
		if (input->bcaps_read != PASS ||
				input->r0p_read != PASS) {
			fail_and_restart_in_ms(0, &status, output);
			break;
		} else if (input->rx_validation != PASS) {
			/* 1A-06: consider invalid r0' a failure */
			/* 1A-08: consider bksv listed in SRM a failure */
			/*
			 * some slow RX will fail rx validation when it is
			 * not ready. give it more time to react before retry.
			 */
			fail_and_restart_in_ms(1000, &status, output);
			break;
		} else if (!conn->is_repeater && input->encryption != PASS) {
			fail_and_restart_in_ms(0, &status, output);
			break;
		}
		if (conn->is_repeater) {
			callback_in_ms(0, output);
			set_watchdog_in_ms(hdcp, 5000, output);
			set_state_id(hdcp, output, H1_A8_WAIT_FOR_READY);
		} else {
			callback_in_ms(0, output);
			set_state_id(hdcp, output, H1_A45_AUTHENTICATED);
			set_auth_complete(hdcp, output);
		}
		break;
	case H1_A45_AUTHENTICATED:
		if (input->link_maintenance == FAIL) {
			/* 1A-07: consider invalid ri' a failure */
			/* 1A-07a: consider read ri' not returned a failure */
			fail_and_restart_in_ms(0, &status, output);
			break;
		}
		callback_in_ms(500, output);
		increment_stay_counter(hdcp);
		break;
	case H1_A8_WAIT_FOR_READY:
		if (input->ready_check != PASS) {
			if (event_ctx->event ==
					MOD_HDCP_EVENT_WATCHDOG_TIMEOUT) {
				/* 1B-03: fail hdcp on ksv list READY timeout */
				/* prevent black screen in next attempt */
				adjust->hdcp1.postpone_encryption = 1;
				fail_and_restart_in_ms(0, &status, output);
			} else {
				/* continue ksv list READY polling*/
				callback_in_ms(500, output);
				increment_stay_counter(hdcp);
			}
			break;
		}
		callback_in_ms(0, output);
		set_state_id(hdcp, output, H1_A9_READ_KSV_LIST);
		break;
	case H1_A9_READ_KSV_LIST:
		if (input->bstatus_read != PASS ||
				input->max_cascade_check != PASS ||
				input->max_devs_check != PASS ||
				input->device_count_check != PASS ||
				input->ksvlist_read != PASS ||

Annotation

Implementation Notes