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

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
...@@ -981,6 +981,8 @@ static bool dc_construct(struct dc *dc, ...@@ -981,6 +981,8 @@ static bool dc_construct(struct dc *dc,
goto fail; goto fail;
} }
dc->link_srv = link_get_link_service();
dc->res_pool = dc_create_resource_pool(dc, init_params, dc_ctx->dce_version); dc->res_pool = dc_create_resource_pool(dc, init_params, dc_ctx->dce_version);
if (!dc->res_pool) if (!dc->res_pool)
goto fail; goto fail;
......
...@@ -186,3 +186,81 @@ bool dc_submit_i2c_oem( ...@@ -186,3 +186,81 @@ bool dc_submit_i2c_oem(
return false; 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);
}
...@@ -714,6 +714,7 @@ struct dc_bounding_box_overrides { ...@@ -714,6 +714,7 @@ struct dc_bounding_box_overrides {
struct dc_state; struct dc_state;
struct resource_pool; struct resource_pool;
struct dce_hwseq; struct dce_hwseq;
struct link_service;
/** /**
* struct dc_debug_options - DC debug struct * struct dc_debug_options - DC debug struct
...@@ -890,6 +891,7 @@ struct dc { ...@@ -890,6 +891,7 @@ struct dc {
uint8_t link_count; uint8_t link_count;
struct dc_link *links[MAX_PIPES * 2]; struct dc_link *links[MAX_PIPES * 2];
const struct link_service *link_srv;
struct dc_state *current_state; struct dc_state *current_state;
struct resource_pool *res_pool; struct resource_pool *res_pool;
...@@ -1828,7 +1830,7 @@ bool dc_link_is_dp_sink_present(struct dc_link *link); ...@@ -1828,7 +1830,7 @@ bool dc_link_is_dp_sink_present(struct dc_link *link);
*/ */
void dc_link_set_drive_settings(struct dc *dc, void dc_link_set_drive_settings(struct dc *dc,
struct link_training_settings *lt_settings, 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 /* 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. * 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, ...@@ -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 detection sequence. false to get link training count of last link
* training in commit (dpms) sequence * 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); bool in_detection);
/* Get how many link loss has happened since last link training attempts */ /* Get how many link loss has happened since last link training attempts */
......
...@@ -48,8 +48,38 @@ struct link_init_data { ...@@ -48,8 +48,38 @@ struct link_init_data {
bool is_dpia_link; 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); struct dc_link *link_create(const struct link_init_data *init_params);
void link_destroy(struct dc_link **link); 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 // TODO - convert any function declarations below to function pointers
struct gpio *link_get_hpd_gpio(struct dc_bios *dcb, struct gpio *link_get_hpd_gpio(struct dc_bios *dcb,
...@@ -150,5 +180,10 @@ uint32_t dp_link_bandwidth_kbps( ...@@ -150,5 +180,10 @@ uint32_t dp_link_bandwidth_kbps(
uint32_t link_timing_bandwidth_kbps(const struct dc_crtc_timing *timing); 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_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_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__ */ #endif /* __DC_LINK_HPD_H__ */
...@@ -75,7 +75,7 @@ static bool is_dp_phy_pattern(enum dp_test_pattern test_pattern) ...@@ -75,7 +75,7 @@ static bool is_dp_phy_pattern(enum dp_test_pattern test_pattern)
return false; 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, struct dc_link_settings *link_setting,
bool skip_video_pattern) bool skip_video_pattern)
{ {
...@@ -585,7 +585,7 @@ static void set_crtc_test_pattern(struct dc_link *link, ...@@ -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_request test_request;
union test_response test_response; union test_response test_response;
...@@ -651,7 +651,7 @@ void dc_link_dp_handle_automated_test(struct dc_link *link) ...@@ -651,7 +651,7 @@ void dc_link_dp_handle_automated_test(struct dc_link *link)
sizeof(test_response)); sizeof(test_response));
} }
bool dc_link_dp_set_test_pattern( bool dp_set_test_pattern(
struct dc_link *link, struct dc_link *link,
enum dp_test_pattern test_pattern, enum dp_test_pattern test_pattern,
enum dp_test_pattern_color_space test_pattern_color_space, enum dp_test_pattern_color_space test_pattern_color_space,
...@@ -941,28 +941,9 @@ bool dc_link_dp_set_test_pattern( ...@@ -941,28 +941,9 @@ bool dc_link_dp_set_test_pattern(
return true; return true;
} }
void dc_link_set_drive_settings(struct dc *dc, void dp_set_preferred_link_settings(struct dc *dc,
struct link_training_settings *lt_settings, struct dc_link_settings *link_setting,
const struct dc_link *link) 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,
struct dc_link_settings *link_setting,
struct dc_link *link)
{ {
int i; int i;
struct pipe_ctx *pipe; struct pipe_ctx *pipe;
...@@ -1001,11 +982,11 @@ void dc_link_set_preferred_link_settings(struct dc *dc, ...@@ -1001,11 +982,11 @@ void dc_link_set_preferred_link_settings(struct dc *dc,
dp_retrain_link_dp_test(link, &store_settings, false); 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_settings *link_setting,
struct dc_link_training_overrides *lt_overrides, struct dc_link_training_overrides *lt_overrides,
struct dc_link *link, struct dc_link *link,
bool skip_immediate_retrain) bool skip_immediate_retrain)
{ {
if (lt_overrides != NULL) if (lt_overrides != NULL)
link->preferred_training_settings = *lt_overrides; link->preferred_training_settings = *lt_overrides;
......
...@@ -25,9 +25,20 @@ ...@@ -25,9 +25,20 @@
#ifndef __LINK_DP_CTS_H__ #ifndef __LINK_DP_CTS_H__
#define __LINK_DP_CTS_H__ #define __LINK_DP_CTS_H__
#include "link.h" #include "link.h"
void dp_handle_automated_test(struct dc_link *link);
void dp_retrain_link_dp_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_settings *link_setting,
bool skip_video_pattern); 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);
#endif /* __LINK_DP_CTS_H__ */ #endif /* __LINK_DP_CTS_H__ */
...@@ -37,7 +37,7 @@ void dp_trace_reset(struct dc_link *link) ...@@ -37,7 +37,7 @@ void dp_trace_reset(struct dc_link *link)
memset(&link->dp_trace, 0, sizeof(link->dp_trace)); memset(&link->dp_trace, 0, sizeof(link->dp_trace));
} }
bool dc_dp_trace_is_initialized(struct dc_link *link) bool dp_trace_is_initialized(struct dc_link *link)
{ {
return link->dp_trace.is_initialized; return link->dp_trace.is_initialized;
} }
...@@ -76,7 +76,7 @@ void dp_trace_lt_total_count_increment(struct dc_link *link, ...@@ -76,7 +76,7 @@ void dp_trace_lt_total_count_increment(struct dc_link *link,
link->dp_trace.commit_lt_trace.counts.total++; link->dp_trace.commit_lt_trace.counts.total++;
} }
void dc_dp_trace_set_is_logged_flag(struct dc_link *link, void dp_trace_set_is_logged_flag(struct dc_link *link,
bool in_detection, bool in_detection,
bool is_logged) bool is_logged)
{ {
...@@ -86,8 +86,7 @@ void dc_dp_trace_set_is_logged_flag(struct dc_link *link, ...@@ -86,8 +86,7 @@ void dc_dp_trace_set_is_logged_flag(struct dc_link *link,
link->dp_trace.commit_lt_trace.is_logged = is_logged; link->dp_trace.commit_lt_trace.is_logged = is_logged;
} }
bool dc_dp_trace_is_logged(struct dc_link *link, bool dp_trace_is_logged(struct dc_link *link, bool in_detection)
bool in_detection)
{ {
if (in_detection) if (in_detection)
return link->dp_trace.detect_lt_trace.is_logged; return link->dp_trace.detect_lt_trace.is_logged;
...@@ -123,7 +122,7 @@ void dp_trace_set_lt_end_timestamp(struct dc_link *link, ...@@ -123,7 +122,7 @@ void dp_trace_set_lt_end_timestamp(struct dc_link *link,
link->dp_trace.commit_lt_trace.timestamps.end = dm_get_timestamp(link->dc->ctx); link->dp_trace.commit_lt_trace.timestamps.end = dm_get_timestamp(link->dc->ctx);
} }
unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link, unsigned long long dp_trace_get_lt_end_timestamp(struct dc_link *link,
bool in_detection) bool in_detection)
{ {
if (in_detection) if (in_detection)
...@@ -132,7 +131,7 @@ unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link, ...@@ -132,7 +131,7 @@ unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link,
return link->dp_trace.commit_lt_trace.timestamps.end; return link->dp_trace.commit_lt_trace.timestamps.end;
} }
struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link, const struct dp_trace_lt_counts *dp_trace_get_lt_counts(struct dc_link *link,
bool in_detection) bool in_detection)
{ {
if (in_detection) if (in_detection)
...@@ -141,7 +140,7 @@ struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link, ...@@ -141,7 +140,7 @@ struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link,
return &link->dp_trace.commit_lt_trace.counts; return &link->dp_trace.commit_lt_trace.counts;
} }
unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link) unsigned int dp_trace_get_link_loss_count(struct dc_link *link)
{ {
return link->dp_trace.link_loss_count; return link->dp_trace.link_loss_count;
} }
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
void dp_trace_init(struct dc_link *link); void dp_trace_init(struct dc_link *link);
void dp_trace_reset(struct dc_link *link); void dp_trace_reset(struct dc_link *link);
bool dc_dp_trace_is_initialized(struct dc_link *link); bool dp_trace_is_initialized(struct dc_link *link);
void dp_trace_detect_lt_init(struct dc_link *link); void dp_trace_detect_lt_init(struct dc_link *link);
void dp_trace_commit_lt_init(struct dc_link *link); void dp_trace_commit_lt_init(struct dc_link *link);
void dp_trace_link_loss_increment(struct dc_link *link); void dp_trace_link_loss_increment(struct dc_link *link);
...@@ -37,10 +37,10 @@ void dp_trace_lt_fail_count_update(struct dc_link *link, ...@@ -37,10 +37,10 @@ void dp_trace_lt_fail_count_update(struct dc_link *link,
bool in_detection); bool in_detection);
void dp_trace_lt_total_count_increment(struct dc_link *link, void dp_trace_lt_total_count_increment(struct dc_link *link,
bool in_detection); bool in_detection);
void dc_dp_trace_set_is_logged_flag(struct dc_link *link, void dp_trace_set_is_logged_flag(struct dc_link *link,
bool in_detection, bool in_detection,
bool is_logged); bool is_logged);
bool dc_dp_trace_is_logged(struct dc_link *link, bool dp_trace_is_logged(struct dc_link *link,
bool in_detection); bool in_detection);
void dp_trace_lt_result_update(struct dc_link *link, void dp_trace_lt_result_update(struct dc_link *link,
enum link_training_result result, enum link_training_result result,
...@@ -49,10 +49,10 @@ void dp_trace_set_lt_start_timestamp(struct dc_link *link, ...@@ -49,10 +49,10 @@ void dp_trace_set_lt_start_timestamp(struct dc_link *link,
bool in_detection); bool in_detection);
void dp_trace_set_lt_end_timestamp(struct dc_link *link, void dp_trace_set_lt_end_timestamp(struct dc_link *link,
bool in_detection); bool in_detection);
unsigned long long dc_dp_trace_get_lt_end_timestamp(struct dc_link *link, unsigned long long dp_trace_get_lt_end_timestamp(struct dc_link *link,
bool in_detection); bool in_detection);
struct dp_trace_lt_counts *dc_dp_trace_get_lt_counts(struct dc_link *link, const struct dp_trace_lt_counts *dp_trace_get_lt_counts(struct dc_link *link,
bool in_detection); bool in_detection);
unsigned int dc_dp_trace_get_link_loss_count(struct dc_link *link); unsigned int dp_trace_get_link_loss_count(struct dc_link *link);
#endif /* __LINK_DP_TRACE_H__ */ #endif /* __LINK_DP_TRACE_H__ */
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
* This file owns the creation/destruction of link structure. * This file owns the creation/destruction of link structure.
*/ */
#include "link_factory.h" #include "link_factory.h"
#include "accessories/link_dp_cts.h"
#include "accessories/link_dp_trace.h"
#include "accessories/link_fpga.h"
#include "protocols/link_ddc.h" #include "protocols/link_ddc.h"
#include "protocols/link_edp_panel_control.h" #include "protocols/link_edp_panel_control.h"
#include "protocols/link_hpd.h" #include "protocols/link_hpd.h"
...@@ -39,6 +42,19 @@ ...@@ -39,6 +42,19 @@
DC_LOG_HW_HOTPLUG( \ DC_LOG_HW_HOTPLUG( \
__VA_ARGS__) __VA_ARGS__)
static struct link_service link_srv = {
.dp_handle_automated_test = dp_handle_automated_test,
.dp_set_test_pattern = dp_set_test_pattern,
.dp_set_preferred_link_settings = dp_set_preferred_link_settings,
.dp_set_preferred_training_settings = dp_set_preferred_training_settings,
.dp_trace_is_initialized = dp_trace_is_initialized,
.dp_trace_set_is_logged_flag = dp_trace_set_is_logged_flag,
.dp_trace_is_logged = dp_trace_is_logged,
.dp_trace_get_lt_end_timestamp = dp_trace_get_lt_end_timestamp,
.dp_trace_get_lt_counts = dp_trace_get_lt_counts,
.dp_trace_get_link_loss_count = dp_trace_get_link_loss_count,
};
static enum transmitter translate_encoder_to_transmitter(struct graphics_object_id encoder) static enum transmitter translate_encoder_to_transmitter(struct graphics_object_id encoder)
{ {
switch (encoder.id) { switch (encoder.id) {
...@@ -575,3 +591,7 @@ void link_destroy(struct dc_link **link) ...@@ -575,3 +591,7 @@ void link_destroy(struct dc_link **link)
*link = NULL; *link = NULL;
} }
const struct link_service *link_get_link_service(void)
{
return &link_srv;
}
...@@ -25,7 +25,4 @@ ...@@ -25,7 +25,4 @@
#ifndef __LINK_RESOURCE_H__ #ifndef __LINK_RESOURCE_H__
#define __LINK_RESOURCE_H__ #define __LINK_RESOURCE_H__
#include "link.h" #include "link.h"
void link_get_cur_link_res(const struct dc_link *link,
struct link_resource *link_res);
#endif /* __LINK_RESOURCE_H__ */ #endif /* __LINK_RESOURCE_H__ */
...@@ -44,11 +44,6 @@ void dp_set_hw_lane_settings( ...@@ -44,11 +44,6 @@ void dp_set_hw_lane_settings(
const struct link_training_settings *link_settings, const struct link_training_settings *link_settings,
uint32_t offset); uint32_t offset);
void dp_set_drive_settings(
struct dc_link *link,
const struct link_resource *link_res,
struct link_training_settings *lt_settings);
enum dc_status dp_set_fec_ready(struct dc_link *link, enum dc_status dp_set_fec_ready(struct dc_link *link,
const struct link_resource *link_res, bool ready); const struct link_resource *link_res, bool ready);
void dp_set_fec_enable(struct dc_link *link, bool enable); void dp_set_fec_enable(struct dc_link *link, bool enable);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment