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

drm/amd/display: move dc_link functions in protocols 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 third step to move
dc_link functions under protocols 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 6455cb52
Loading
Loading
Loading
Loading
+199 −0
Original line number Diff line number Diff line
@@ -279,3 +279,202 @@ void dc_link_remove_remote_sink(struct dc_link *link, struct dc_sink *sink)
	link->dc->link_srv->remove_remote_sink(link, sink);
}

int dc_link_aux_transfer_raw(struct ddc_service *ddc,
		struct aux_payload *payload,
		enum aux_return_code_type *operation_result)
{
	const struct dc *dc = ddc->link->dc;

	return dc->link_srv->aux_transfer_raw(
			ddc, payload, operation_result);
}

uint32_t dc_link_bw_kbps_from_raw_frl_link_rate_data(
		struct dc *dc, uint8_t bw)
{
	return dc->link_srv->bw_kbps_from_raw_frl_link_rate_data(bw);
}

bool dc_link_decide_edp_link_settings(struct dc_link *link,
		struct dc_link_settings *link_setting, uint32_t req_bw)
{
	return link->dc->link_srv->edp_decide_link_settings(link, link_setting, req_bw);
}


bool dc_link_dp_get_max_link_enc_cap(const struct dc_link *link,
		struct dc_link_settings *max_link_enc_cap)
{
	return link->dc->link_srv->dp_get_max_link_enc_cap(link, max_link_enc_cap);
}

enum dp_link_encoding dc_link_dp_mst_decide_link_encoding_format(
		const struct dc_link *link)
{
	return link->dc->link_srv->mst_decide_link_encoding_format(link);
}

const struct dc_link_settings *dc_link_get_link_cap(const struct dc_link *link)
{
	return link->dc->link_srv->dp_get_verified_link_cap(link);
}

bool dc_link_is_dp_sink_present(struct dc_link *link)
{
	return link->dc->link_srv->dp_is_sink_present(link);
}

bool dc_link_is_fec_supported(const struct dc_link *link)
{
	return link->dc->link_srv->dp_is_fec_supported(link);
}

void dc_link_overwrite_extended_receiver_cap(
		struct dc_link *link)
{
	link->dc->link_srv->dp_overwrite_extended_receiver_cap(link);
}

bool dc_link_should_enable_fec(const struct dc_link *link)
{
	return link->dc->link_srv->dp_should_enable_fec(link);
}

int dc_link_dp_dpia_handle_usb4_bandwidth_allocation_for_link(
		struct dc_link *link, int peak_bw)
{
	return link->dc->link_srv->dpia_handle_usb4_bandwidth_allocation_for_link(link, peak_bw);
}

void dc_link_handle_usb4_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t result)
{
	link->dc->link_srv->dpia_handle_bw_alloc_response(link, bw, result);
}

bool dc_link_check_link_loss_status(
	struct dc_link *link,
	union hpd_irq_data *hpd_irq_dpcd_data)
{
	return link->dc->link_srv->dp_parse_link_loss_status(link, hpd_irq_dpcd_data);
}

bool dc_link_dp_allow_hpd_rx_irq(const struct dc_link *link)
{
	return link->dc->link_srv->dp_should_allow_hpd_rx_irq(link);
}

void dc_link_dp_handle_link_loss(struct dc_link *link)
{
	link->dc->link_srv->dp_handle_link_loss(link);
}

enum dc_status dc_link_dp_read_hpd_rx_irq_data(
	struct dc_link *link,
	union hpd_irq_data *irq_data)
{
	return link->dc->link_srv->dp_read_hpd_rx_irq_data(link, irq_data);
}

bool dc_link_handle_hpd_rx_irq(struct dc_link *link,
		union hpd_irq_data *out_hpd_irq_dpcd_data, bool *out_link_loss,
		bool defer_handling, bool *has_left_work)
{
	return link->dc->link_srv->dp_handle_hpd_rx_irq(link, out_hpd_irq_dpcd_data,
			out_link_loss, defer_handling, has_left_work);
}

void dc_link_dp_receiver_power_ctrl(struct dc_link *link, bool on)
{
	link->dc->link_srv->dpcd_write_rx_power_ctrl(link, on);
}

enum lttpr_mode dc_link_decide_lttpr_mode(struct dc_link *link,
		struct dc_link_settings *link_setting)
{
	return link->dc->link_srv->dp_decide_lttpr_mode(link, link_setting);
}

void dc_link_edp_panel_backlight_power_on(struct dc_link *link, bool wait_for_hpd)
{
	link->dc->link_srv->edp_panel_backlight_power_on(link, wait_for_hpd);
}

int dc_link_get_backlight_level(const struct dc_link *link)
{
	return link->dc->link_srv->edp_get_backlight_level(link);
}

bool dc_link_get_backlight_level_nits(struct dc_link *link,
		uint32_t *backlight_millinits_avg,
		uint32_t *backlight_millinits_peak)
{
	return link->dc->link_srv->edp_get_backlight_level_nits(link,
			backlight_millinits_avg,
			backlight_millinits_peak);
}

bool dc_link_set_backlight_level(const struct dc_link *link,
		uint32_t backlight_pwm_u16_16,
		uint32_t frame_ramp)
{
	return link->dc->link_srv->edp_set_backlight_level(link,
			backlight_pwm_u16_16, frame_ramp);
}

bool dc_link_set_backlight_level_nits(struct dc_link *link,
		bool isHDR,
		uint32_t backlight_millinits,
		uint32_t transition_time_in_ms)
{
	return link->dc->link_srv->edp_set_backlight_level_nits(link, isHDR,
			backlight_millinits, transition_time_in_ms);
}

int dc_link_get_target_backlight_pwm(const struct dc_link *link)
{
	return link->dc->link_srv->edp_get_target_backlight_pwm(link);
}

bool dc_link_get_psr_state(const struct dc_link *link, enum dc_psr_state *state)
{
	return link->dc->link_srv->edp_get_psr_state(link, state);
}

bool dc_link_set_psr_allow_active(struct dc_link *link, const bool *allow_active,
		bool wait, bool force_static, const unsigned int *power_opts)
{
	return link->dc->link_srv->edp_set_psr_allow_active(link, allow_active, wait,
			force_static, power_opts);
}

bool dc_link_setup_psr(struct dc_link *link,
		const struct dc_stream_state *stream, struct psr_config *psr_config,
		struct psr_context *psr_context)
{
	return link->dc->link_srv->edp_setup_psr(link, stream, psr_config, psr_context);
}

bool dc_link_wait_for_t12(struct dc_link *link)
{
	return link->dc->link_srv->edp_wait_for_t12(link);
}

bool dc_link_get_hpd_state(struct dc_link *link)
{
	return link->dc->link_srv->get_hpd_state(link);
}

void dc_link_enable_hpd(const struct dc_link *link)
{
	link->dc->link_srv->enable_hpd(link);
}

void dc_link_disable_hpd(const struct dc_link *link)
{
	link->dc->link_srv->disable_hpd(link);
}

void dc_link_enable_hpd_filter(struct dc_link *link, bool enable)
{
	link->dc->link_srv->enable_hpd_filter(link, enable);
}
+3 −2
Original line number Diff line number Diff line
@@ -1600,7 +1600,7 @@ bool dc_link_detect_connection_type(struct dc_link *link,
 * return - true HPD is asserted (HPD high), false otherwise (HPD low)
 *
 */
bool dc_link_get_hpd_state(struct dc_link *dc_link);
bool dc_link_get_hpd_state(struct dc_link *link);

/* Getter for cached link status from given link */
const struct dc_link_status *dc_link_get_status(const struct dc_link *link);
@@ -1775,7 +1775,8 @@ void dc_restore_link_res_map(const struct dc *dc, uint32_t *map);
bool dc_link_update_dsc_config(struct pipe_ctx *pipe_ctx);

/* translate a raw link rate data to bandwidth in kbps */
uint32_t dc_link_bw_kbps_from_raw_frl_link_rate_data(uint8_t bw);
uint32_t dc_link_bw_kbps_from_raw_frl_link_rate_data(
		struct dc *dc, uint8_t bw);

/* determine the optimal bandwidth given link and required bw.
 * @link - current detected link
+0 −2
Original line number Diff line number Diff line
@@ -71,8 +71,6 @@ void dce110_optimize_bandwidth(
		struct dc *dc,
		struct dc_state *context);

void dc_link_dp_receiver_power_ctrl(struct dc_link *link, bool on);

void dce110_edp_power_control(
		struct dc_link *link,
		bool power_up);
+75 −8
Original line number Diff line number Diff line
@@ -28,14 +28,10 @@

/* FILE POLICY AND INTENDED USAGE:
 *
 * This header declares link functions exposed to dc. All functions must have
 * "link_" as prefix. For example link_run_my_function. This header is strictly
 * private in dc and should never be included in other header files. dc
 * components should include this header in their .c files in order to access
 * functions in link folder. This file should never include any header files in
 * link folder. If there is a need to expose a function declared in one of
 * header files in side link folder, you need to move the function declaration
 * into this file and prefix it with "link_".
 * This header declares link functions exposed to dc. All functions must use
 * function pointers. This header is strictly private in dc and should never be
 * included by DM. If DM needs to call a new link function, it needs to be
 * translated by dc_link_exports.c.
 */
#include "core_types.h"

@@ -49,12 +45,81 @@ struct link_init_data {
};

struct link_service {
	/* Detection */
	struct dc_sink *(*add_remote_sink)(
			struct dc_link *link,
			const uint8_t *edid,
			int len,
			struct dc_sink_init_data *init_data);
	void (*remove_remote_sink)(struct dc_link *link, struct dc_sink *sink);
	bool (*get_hpd_state)(struct dc_link *link);
	void (*enable_hpd)(const struct dc_link *link);
	void (*disable_hpd)(const struct dc_link *link);
	void (*enable_hpd_filter)(struct dc_link *link, bool enable);

	/* DDC */
	int (*aux_transfer_raw)(struct ddc_service *ddc,
			struct aux_payload *payload,
			enum aux_return_code_type *operation_result);

	/* DP Capability */
	bool (*dp_is_sink_present)(struct dc_link *link);
	bool (*dp_is_fec_supported)(const struct dc_link *link);
	bool (*dp_get_max_link_enc_cap)(const struct dc_link *link,
			struct dc_link_settings *max_link_enc_cap);
	const struct dc_link_settings *(*dp_get_verified_link_cap)(
			const struct dc_link *link);
	bool (*dp_should_enable_fec)(const struct dc_link *link);
	enum dp_link_encoding (*mst_decide_link_encoding_format)(const struct dc_link *link);
	bool (*edp_decide_link_settings)(struct dc_link *link,
			struct dc_link_settings *link_setting, uint32_t req_bw);
	uint32_t (*bw_kbps_from_raw_frl_link_rate_data)(uint8_t bw);
	bool (*dp_overwrite_extended_receiver_cap)(struct dc_link *link);
	enum lttpr_mode (*dp_decide_lttpr_mode)(struct dc_link *link,
			struct dc_link_settings *link_setting);

	/* DP DPIA/PHY */
	int (*dpia_handle_usb4_bandwidth_allocation_for_link)(struct dc_link *link, int peak_bw);
	void (*dpia_handle_bw_alloc_response)(struct dc_link *link, uint8_t bw, uint8_t result);
	void (*dpcd_write_rx_power_ctrl)(struct dc_link *link, bool on);

	/* DP IRQ Handler */
	bool (*dp_parse_link_loss_status)(
		struct dc_link *link,
		union hpd_irq_data *hpd_irq_dpcd_data);
	bool (*dp_should_allow_hpd_rx_irq)(const struct dc_link *link);
	void (*dp_handle_link_loss)(struct dc_link *link);
	enum dc_status (*dp_read_hpd_rx_irq_data)(
		struct dc_link *link,
		union hpd_irq_data *irq_data);
	bool (*dp_handle_hpd_rx_irq)(struct dc_link *link,
			union hpd_irq_data *out_hpd_irq_dpcd_data, bool *out_link_loss,
			bool defer_handling, bool *has_left_work);

	/* eDP Panel Control */
	void (*edp_panel_backlight_power_on)(struct dc_link *link, bool wait_for_hpd);
	int (*edp_get_backlight_level)(const struct dc_link *link);
	bool (*edp_get_backlight_level_nits)(struct dc_link *link,
			uint32_t *backlight_millinits_avg,
			uint32_t *backlight_millinits_peak);
	bool (*edp_set_backlight_level)(const struct dc_link *link,
			uint32_t backlight_pwm_u16_16,
			uint32_t frame_ramp);
	bool (*edp_set_backlight_level_nits)(struct dc_link *link,
			bool isHDR,
			uint32_t backlight_millinits,
			uint32_t transition_time_in_ms);
	int (*edp_get_target_backlight_pwm)(const struct dc_link *link);
	bool (*edp_get_psr_state)(const struct dc_link *link, enum dc_psr_state *state);
	bool (*edp_set_psr_allow_active)(struct dc_link *link, const bool *allow_active,
			bool wait, bool force_static, const unsigned int *power_opts);
	bool (*edp_setup_psr)(struct dc_link *link,
			const struct dc_stream_state *stream,
			struct psr_config *psr_config,
			struct psr_context *psr_context);
	bool (*edp_wait_for_t12)(struct dc_link *link);

	/* DP CTS */
	void (*dp_handle_automated_test)(struct dc_link *link);
	bool (*dp_set_test_pattern)(
			struct dc_link *link,
@@ -71,6 +136,8 @@ struct link_service {
			struct dc_link_training_overrides *lt_overrides,
			struct dc_link *link,
			bool skip_immediate_retrain);

	/* DP Trace */
	bool (*dp_trace_is_initialized)(struct dc_link *link);
	void (*dp_trace_set_is_logged_flag)(struct dc_link *link,
			bool in_detection,
+1 −1
Original line number Diff line number Diff line
@@ -1205,7 +1205,7 @@ bool link_detect_connection_type(struct dc_link *link, enum dc_connection_type *

	/* Link may not have physical HPD pin. */
	if (link->ep_type != DISPLAY_ENDPOINT_PHY) {
		if (link->is_hpd_pending || !dc_link_dpia_query_hpd_status(link))
		if (link->is_hpd_pending || !dpia_query_hpd_status(link))
			*type = dc_connection_none;
		else
			*type = dc_connection_single;
Loading