Commit 36516001 authored by Wenjing Liu's avatar Wenjing Liu Committed by Alex Deucher
Browse files

drm/amd/display: move dc_link functions in accessories folder to dc_link_exports



[why]
link component should only have one interface serving dc.

[how]
We are moving dc_link functions exposed to DM to dc_link_exports
and unify link component interface in link.h with function pointer
to match the style of other dc component. This is the first step to move
dc_link functions under accessories folder to dc_link_exports.

Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarQingqing Zhuo <qingqing.zhuo@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Tested-by: default avatarDaniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 84c03df5
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -981,6 +981,8 @@ static bool dc_construct(struct dc *dc,
		goto fail;
	}

	dc->link_srv = link_get_link_service();

	dc->res_pool = dc_create_resource_pool(dc, init_params, dc_ctx->dce_version);
	if (!dc->res_pool)
		goto fail;
+78 −0
Original line number Diff line number Diff line
@@ -186,3 +186,81 @@ bool dc_submit_i2c_oem(
	return false;
}

void dc_link_dp_handle_automated_test(struct dc_link *link)
{
	link->dc->link_srv->dp_handle_automated_test(link);
}

bool dc_link_dp_set_test_pattern(
	struct dc_link *link,
	enum dp_test_pattern test_pattern,
	enum dp_test_pattern_color_space test_pattern_color_space,
	const struct link_training_settings *p_link_settings,
	const unsigned char *p_custom_pattern,
	unsigned int cust_pattern_size)
{
	return link->dc->link_srv->dp_set_test_pattern(link, test_pattern,
			test_pattern_color_space, p_link_settings,
			p_custom_pattern, cust_pattern_size);
}

void dc_link_set_drive_settings(struct dc *dc,
				struct link_training_settings *lt_settings,
				struct dc_link *link)
{
	struct link_resource link_res;

	link_get_cur_link_res(link, &link_res);
	dp_set_drive_settings(link, &link_res, lt_settings);
}

void dc_link_set_preferred_link_settings(struct dc *dc,
					 struct dc_link_settings *link_setting,
					 struct dc_link *link)
{
	dc->link_srv->dp_set_preferred_link_settings(dc, link_setting, link);
}

void dc_link_set_preferred_training_settings(struct dc *dc,
		struct dc_link_settings *link_setting,
		struct dc_link_training_overrides *lt_overrides,
		struct dc_link *link,
		bool skip_immediate_retrain)
{
	dc->link_srv->dp_set_preferred_training_settings(dc, link_setting,
			lt_overrides, link, skip_immediate_retrain);
}

bool dc_dp_trace_is_initialized(struct dc_link *link)
{
	return link->dc->link_srv->dp_trace_is_initialized(link);
}

void dc_dp_trace_set_is_logged_flag(struct dc_link *link,
		bool in_detection,
		bool is_logged)
{
	link->dc->link_srv->dp_trace_set_is_logged_flag(link, in_detection, is_logged);
}

bool dc_dp_trace_is_logged(struct dc_link *link, bool in_detection)
{
	return link->dc->link_srv->dp_trace_is_logged(link, in_detection);
}

unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link,
		bool in_detection)
{
	return link->dc->link_srv->dp_trace_get_lt_end_timestamp(link, in_detection);
}

const struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link,
		bool in_detection)
{
	return link->dc->link_srv->dp_trace_get_lt_counts(link, in_detection);
}

unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link)
{
	return link->dc->link_srv->dp_trace_get_link_loss_count(link);
}
+4 −2
Original line number Diff line number Diff line
@@ -714,6 +714,7 @@ struct dc_bounding_box_overrides {
struct dc_state;
struct resource_pool;
struct dce_hwseq;
struct link_service;

/**
 * struct dc_debug_options - DC debug struct
@@ -890,6 +891,7 @@ struct dc {

	uint8_t link_count;
	struct dc_link *links[MAX_PIPES * 2];
	const struct link_service *link_srv;

	struct dc_state *current_state;
	struct resource_pool *res_pool;
@@ -1828,7 +1830,7 @@ bool dc_link_is_dp_sink_present(struct dc_link *link);
 */
void dc_link_set_drive_settings(struct dc *dc,
				struct link_training_settings *lt_settings,
				const struct dc_link *link);
				struct dc_link *link);

/* Enable a test pattern in Link or PHY layer in an active link for compliance
 * test or debugging purpose. The test pattern will remain until next un-plug.
@@ -1986,7 +1988,7 @@ unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link,
 * training in detection sequence. false to get link training count of last link
 * training in commit (dpms) sequence
 */
struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link,
const struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link,
		bool in_detection);

/* Get how many link loss has happened since last link training attempts */
+36 −1
Original line number Diff line number Diff line
@@ -48,8 +48,38 @@ struct link_init_data {
	bool is_dpia_link;
};

struct link_service {
	void (*dp_handle_automated_test)(struct dc_link *link);
	bool (*dp_set_test_pattern)(
			struct dc_link *link,
			enum dp_test_pattern test_pattern,
			enum dp_test_pattern_color_space test_pattern_color_space,
			const struct link_training_settings *p_link_settings,
			const unsigned char *p_custom_pattern,
			unsigned int cust_pattern_size);
	void (*dp_set_preferred_link_settings)(struct dc *dc,
			struct dc_link_settings *link_setting,
			struct dc_link *link);
	void (*dp_set_preferred_training_settings)(struct dc *dc,
			struct dc_link_settings *link_setting,
			struct dc_link_training_overrides *lt_overrides,
			struct dc_link *link,
			bool skip_immediate_retrain);
	bool (*dp_trace_is_initialized)(struct dc_link *link);
	void (*dp_trace_set_is_logged_flag)(struct dc_link *link,
			bool in_detection,
			bool is_logged);
	bool (*dp_trace_is_logged)(struct dc_link *link, bool in_detection);
	unsigned long long (*dp_trace_get_lt_end_timestamp)(
			struct dc_link *link, bool in_detection);
	const struct dp_trace_lt_counts *(*dp_trace_get_lt_counts)(
			struct dc_link *link, bool in_detection);
	unsigned int (*dp_trace_get_link_loss_count)(struct dc_link *link);
};

struct dc_link *link_create(const struct link_init_data *init_params);
void link_destroy(struct dc_link **link);
const struct link_service *link_get_link_service(void);

// TODO - convert any function declarations below to function pointers
struct gpio *link_get_hpd_gpio(struct dc_bios *dcb,
@@ -150,5 +180,10 @@ uint32_t dp_link_bandwidth_kbps(
uint32_t link_timing_bandwidth_kbps(const struct dc_crtc_timing *timing);
void link_get_cur_res_map(const struct dc *dc, uint32_t *map);
void link_restore_res_map(const struct dc *dc, uint32_t *map);

void link_get_cur_link_res(const struct dc_link *link,
		struct link_resource *link_res);
void dp_set_drive_settings(
	struct dc_link *link,
	const struct link_resource *link_res,
	struct link_training_settings *lt_settings);
#endif /* __DC_LINK_HPD_H__ */
+11 −30
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ static bool is_dp_phy_pattern(enum dp_test_pattern test_pattern)
		return false;
}

void dp_retrain_link_dp_test(struct dc_link *link,
static void dp_retrain_link_dp_test(struct dc_link *link,
			struct dc_link_settings *link_setting,
			bool skip_video_pattern)
{
@@ -585,7 +585,7 @@ static void set_crtc_test_pattern(struct dc_link *link,
	}
}

void dc_link_dp_handle_automated_test(struct dc_link *link)
void dp_handle_automated_test(struct dc_link *link)
{
	union test_request test_request;
	union test_response test_response;
@@ -651,7 +651,7 @@ void dc_link_dp_handle_automated_test(struct dc_link *link)
			sizeof(test_response));
}

bool dc_link_dp_set_test_pattern(
bool dp_set_test_pattern(
	struct dc_link *link,
	enum dp_test_pattern test_pattern,
	enum dp_test_pattern_color_space test_pattern_color_space,
@@ -941,26 +941,7 @@ bool dc_link_dp_set_test_pattern(
	return true;
}

void dc_link_set_drive_settings(struct dc *dc,
				struct link_training_settings *lt_settings,
				const struct dc_link *link)
{

	int i;
	struct link_resource link_res;

	for (i = 0; i < dc->link_count; i++)
		if (dc->links[i] == link)
			break;

	if (i >= dc->link_count)
		ASSERT_CRITICAL(false);

	link_get_cur_link_res(link, &link_res);
	dp_set_drive_settings(dc->links[i], &link_res, lt_settings);
}

void dc_link_set_preferred_link_settings(struct dc *dc,
void dp_set_preferred_link_settings(struct dc *dc,
		struct dc_link_settings *link_setting,
		struct dc_link *link)
{
@@ -1001,7 +982,7 @@ void dc_link_set_preferred_link_settings(struct dc *dc,
		dp_retrain_link_dp_test(link, &store_settings, false);
}

void dc_link_set_preferred_training_settings(struct dc *dc,
void dp_set_preferred_training_settings(struct dc *dc,
		struct dc_link_settings *link_setting,
		struct dc_link_training_overrides *lt_overrides,
		struct dc_link *link,
Loading