drivers/gpu/drm/amd/display/dc/link/protocols/link_hdmi_frl.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/display/dc/link/protocols/link_hdmi_frl.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/display/dc/link/protocols/link_hdmi_frl.c
Extension
.c
Size
40177 bytes
Lines
1188
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 (flt_no_timeout) {
				hpo_frl_link_enc->funcs->set_hdmi_training_pattern(
					hpo_frl_link_enc,
					ln0_pattern - 1,
					ln1_pattern - 1,
					ln2_pattern - 1,
					ln3_pattern - 1);
			} else
				hpo_frl_link_enc->funcs->set_hdmi_training_pattern(
					hpo_frl_link_enc,
					(ln0_pattern == 0x03) ? 0xF : ln0_pattern - 1,
					(ln1_pattern == 0x03) ? 0xF : ln1_pattern - 1,
					(ln2_pattern == 0x03) ? 0xF : ln2_pattern - 1,
					(ln3_pattern == 0x03) ? 0xF : ln3_pattern - 1);
		} else
			hpo_frl_link_enc->funcs->set_hdmi_training_pattern(
				hpo_frl_link_enc,
				ln0_pattern - 1,
				ln1_pattern - 1,
				ln2_pattern - 1,
				ln3_pattern - 1);
		if (ln0_pattern == 0x0E || ln1_pattern == 0x0E ||
								ln2_pattern == 0x0E  || ln3_pattern == 0x0E) {
			if (scdc_update.fields.FLT_UPDATE) {
				if (link->dc->debug.limit_ffe == 0)
					return false;

				bool de_emphasis_only = false;
				bool pre_shoot_only = false;
				bool no_ffe = false;

				hdmi_return_preeshoot_and_deemphasis(link, &test_req,
					&de_emphasis_only, &pre_shoot_only, &no_ffe);

				dio_link_enc->funcs->prog_eq_setting(dio_link_enc, 0xEE,
						de_emphasis_only,
						pre_shoot_only,
						no_ffe,
						&link->frl_link_settings);
			}
		} else
			if (!flt_no_timeout) {
				hdmi_frl_LTS_clear_Link_Setting(link->ddc);
				hdmi_frl_LTS_clear_Update_flag(link->ddc);
				hpo_frl_link_enc->funcs->set_hdmi_training_pattern(hpo_frl_link_enc, 0, 0, 0, 0);
				hdmi_frl_perform_link_training_with_retries(link);
				link_update = true;
			}

		write_buffer[0] = HDMI_SCDC_UPDATE_0;
		/*Clear SCDC Update Flags*/
		write_buffer[1] = (scdc_update.fields.FLT_UPDATE << 5);
		link_query_ddc_data(link->ddc, slave_address,
				write_buffer, sizeof(write_buffer), NULL, 0);
	}
	if (scdc_update.fields.SOURCE_TEST_UPDATE) {
		offset = HDMI_SCDC_SOURCE_TEST_REQ;
		bool de_emphasis_only = false;
		bool pre_shoot_only = false;
		bool no_ffe = false;

		link_query_ddc_data(link->ddc, slave_address,
						&offset, sizeof(offset), &test_req.byte,
						sizeof(test_req.byte));

		hdmi_return_preeshoot_and_deemphasis(link, &test_req,
			&de_emphasis_only, &pre_shoot_only, &no_ffe);

		dio_link_enc->funcs->prog_eq_setting(dio_link_enc, 0xFF,
				de_emphasis_only,
				pre_shoot_only,
				no_ffe,
				&link->frl_link_settings);


		write_buffer[0] = HDMI_SCDC_UPDATE_0;
		/*Clear SCDC Update Flags*/
		write_buffer[1] = (scdc_update.fields.SOURCE_TEST_UPDATE << 3);
		link_query_ddc_data(link->ddc, slave_address,
				write_buffer, sizeof(write_buffer), NULL, 0);

	}

	return link_update;
}

void hdmi_frl_poll_start(struct ddc_service *ddc_service)
{
	uint8_t slave_address = HDMI_SCDC_ADDRESS;
	uint8_t offset = HDMI_SCDC_UPDATE_0;

Annotation

Implementation Notes