Skip to content

Commit

Permalink
drm/amd/display: replace dio encoder access
Browse files Browse the repository at this point in the history
[WHY]
replace dio encoder access to work with new dio encoder
assignment.

[HOW}
1. before validation, access dio encoder by get_temp_dio_link_enc()
2. after validation, access dio encoder through pipe_ctx->link_res

Reviewed-by: Wenjing Liu <wenjing.liu@amd.com>
Reviewed-by: Meenakshikumar Somasundaram <meenakshikumar.somasundaram@amd.com>
Signed-off-by: Peichen Huang <PeiChen.Huang@amd.com>
Signed-off-by: Zaeem Mohamed <zaeem.mohamed@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
  • Loading branch information
Peichen Huang authored and Alex Deucher committed Feb 25, 2025
1 parent 0fe2df4 commit d295786
Show file tree
Hide file tree
Showing 23 changed files with 161 additions and 55 deletions.
2 changes: 1 addition & 1 deletion drivers/gpu/drm/amd/display/dc/core/dc_resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -5191,7 +5191,7 @@ void get_audio_check(struct audio_info *aud_modes,
}
}

static struct link_encoder *get_temp_dio_link_enc(
struct link_encoder *get_temp_dio_link_enc(
const struct resource_context *res_ctx,
const struct resource_pool *const pool,
const struct dc_link *link)
Expand Down
5 changes: 4 additions & 1 deletion drivers/gpu/drm/amd/display/dc/hwss/dce110/dce110_hwseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -1153,9 +1153,12 @@ void dce110_disable_stream(struct pipe_ctx *pipe_ctx)
struct timing_generator *tg = pipe_ctx->stream_res.tg;
struct dtbclk_dto_params dto_params = {0};
int dp_hpo_inst;
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc;

if (!dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (dc_is_hdmi_tmds_signal(pipe_ctx->stream->signal)) {
pipe_ctx->stream_res.stream_enc->funcs->stop_hdmi_info_packets(
pipe_ctx->stream_res.stream_enc);
Expand Down
5 changes: 4 additions & 1 deletion drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -3020,9 +3020,12 @@ void dcn20_enable_stream(struct pipe_ctx *pipe_ctx)
enum phyd32clk_clock_source phyd32clk;
int dp_hpo_inst;

struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc;

if (!dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (dc->link_srv->dp_is_128b_132b_signal(pipe_ctx)) {
dto_params.otg_inst = tg->inst;
dto_params.pixclk_khz = pipe_ctx->stream->timing.pix_clk_100hz / 10;
Expand Down
5 changes: 4 additions & 1 deletion drivers/gpu/drm/amd/display/dc/hwss/dcn401/dcn401_hwseq.c
Original file line number Diff line number Diff line change
Expand Up @@ -927,9 +927,12 @@ void dcn401_enable_stream(struct pipe_ctx *pipe_ctx)
int dp_hpo_inst = 0;
unsigned int tmds_div = PIXEL_RATE_DIV_NA;
unsigned int unused_div = PIXEL_RATE_DIV_NA;
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc;

if (!dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

dcn401_enable_stream_calc(pipe_ctx, &dp_hpo_inst, &phyd32clk,
&tmds_div, &early_control);

Expand Down
5 changes: 5 additions & 0 deletions drivers/gpu/drm/amd/display/dc/inc/resource.h
Original file line number Diff line number Diff line change
Expand Up @@ -647,4 +647,9 @@ void resource_init_common_dml2_callbacks(struct dc *dc, struct dml2_configuratio
int resource_calculate_det_for_stream(struct dc_state *state, struct pipe_ctx *otg_master);

bool resource_is_hpo_acquired(struct dc_state *context);

struct link_encoder *get_temp_dio_link_enc(
const struct resource_context *res_ctx,
const struct resource_pool *const pool,
const struct dc_link *link);
#endif /* DRIVERS_GPU_DRM_AMD_DC_DEV_DC_INC_RESOURCE_H_ */
66 changes: 56 additions & 10 deletions drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dio.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,16 @@ void set_dio_throttled_vcp_size(struct pipe_ctx *pipe_ctx,

void setup_dio_stream_encoder(struct pipe_ctx *pipe_ctx)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc;

if (!pipe_ctx->stream->ctx->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

link_enc->funcs->connect_dig_be_to_fe(link_enc,
pipe_ctx->stream_res.stream_enc->id, true);
if (dc_is_dp_signal(pipe_ctx->stream->signal))
Expand All @@ -71,9 +78,16 @@ void setup_dio_stream_encoder(struct pipe_ctx *pipe_ctx)

void reset_dio_stream_encoder(struct pipe_ctx *pipe_ctx)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
struct stream_encoder *stream_enc = pipe_ctx->stream_res.stream_enc;

if (!pipe_ctx->stream->ctx->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

if (!stream_enc)
return;

Expand Down Expand Up @@ -142,7 +156,14 @@ void enable_dio_dp_link_output(struct dc_link *link,
enum clock_source_id clock_source,
const struct dc_link_settings *link_settings)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

if (dc_is_dp_sst_signal(signal))
link_enc->funcs->enable_dp_output(
Expand All @@ -162,11 +183,16 @@ void disable_dio_link_output(struct dc_link *link,
const struct link_resource *link_res,
enum signal_type signal)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (link_enc != NULL)
link_enc->funcs->disable_output(link_enc, signal);
if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

link_enc->funcs->disable_output(link_enc, signal);
link->dc->link_srv->dp_trace_source_sequence(link,
DPCD_SOURCE_SEQ_AFTER_DISABLE_LINK_PHY);
}
Expand All @@ -175,7 +201,14 @@ void set_dio_dp_link_test_pattern(struct dc_link *link,
const struct link_resource *link_res,
struct encoder_set_dp_phy_pattern_param *tp_params)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

link_enc->funcs->dp_set_phy_pattern(link_enc, tp_params);
link->dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_SET_SOURCE_PATTERN);
Expand All @@ -186,7 +219,14 @@ void set_dio_dp_lane_settings(struct dc_link *link,
const struct dc_link_settings *link_settings,
const struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX])
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

link_enc->funcs->dp_set_lane_settings(link_enc, link_settings, lane_settings);
}
Expand All @@ -195,9 +235,15 @@ void update_dio_stream_allocation_table(struct dc_link *link,
const struct link_resource *link_res,
const struct link_mst_stream_allocation_table *table)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
if (!link_enc) {
ASSERT(link_enc);
return;
}

ASSERT(link_enc);
link_enc->funcs->update_mst_stream_allocation_table(link_enc, table);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,10 @@ static void set_dio_fixed_vs_pe_retimer_dp_link_test_pattern(struct dc_link *lin
const struct link_resource *link_res,
struct encoder_set_dp_phy_pattern_param *tp_params)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (!set_dio_fixed_vs_pe_retimer_dp_link_test_pattern_override(
link, link_res, tp_params, get_dio_link_hwss())) {
Expand Down
20 changes: 16 additions & 4 deletions drivers/gpu/drm/amd/display/dc/link/hwss/link_hwss_dpia.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,15 @@ static void update_dpia_stream_allocation_table(struct dc_link *link,
const struct link_resource *link_res,
const struct link_mst_stream_allocation_table *table)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;
static enum dc_status status;
uint8_t mst_alloc_slots = 0, prev_mst_slots_in_use = 0xFF;
int i;
DC_LOGGER_INIT(link->ctx->logger);

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

for (i = 0; i < table->stream_count; i++)
mst_alloc_slots += table->stream_allocations[i].slot_count;

Expand All @@ -61,7 +64,10 @@ static void set_dio_dpia_link_test_pattern(struct dc_link *link,
if (tp_params->dp_phy_pattern != DP_TEST_PATTERN_VIDEO_MODE)
return;

struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (!link_enc)
return;
Expand All @@ -83,7 +89,10 @@ static void enable_dpia_link_output(struct dc_link *link,
enum clock_source_id clock_source,
const struct dc_link_settings *link_settings)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (link_enc != NULL) {
if (link->dc->config.enable_dpia_pre_training && link_enc->funcs->enable_dpia_output) {
Expand Down Expand Up @@ -119,7 +128,10 @@ static void disable_dpia_link_output(struct dc_link *link,
const struct link_resource *link_res,
enum signal_type signal)
{
struct link_encoder *link_enc = link_enc_cfg_get_link_enc(link);
struct link_encoder *link_enc = link_res->dio_link_enc;

if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (link_enc != NULL) {
if (link->dc->config.enable_dpia_pre_training && link_enc->funcs->disable_dpia_output) {
Expand Down
15 changes: 8 additions & 7 deletions drivers/gpu/drm/amd/display/dc/link/link_dpms.c
Original file line number Diff line number Diff line change
Expand Up @@ -652,15 +652,15 @@ static void write_i2c_redriver_setting(
static void update_psp_stream_config(struct pipe_ctx *pipe_ctx, bool dpms_off)
{
struct cp_psp *cp_psp = &pipe_ctx->stream->ctx->cp_psp;
struct link_encoder *link_enc = NULL;
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
struct cp_psp_stream_config config = {0};
enum dp_panel_mode panel_mode =
dp_get_panel_mode(pipe_ctx->stream->link);

if (cp_psp == NULL || cp_psp->funcs.update_stream_config == NULL)
return;

link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
if (!pipe_ctx->stream->ctx->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(pipe_ctx->stream->link);
ASSERT(link_enc);
if (link_enc == NULL)
return;
Expand Down Expand Up @@ -1924,7 +1924,7 @@ static void disable_link_dp(struct dc_link *link,

if (link_dp_get_encoding_format(&link_settings) ==
DP_8b_10b_ENCODING) {
dp_set_fec_enable(link, false);
dp_set_fec_enable(link, link_res, false);
dp_set_fec_ready(link, link_res, false);
}
}
Expand Down Expand Up @@ -2122,7 +2122,7 @@ static enum dc_status enable_link_dp(struct dc_state *state,
fec_enable = true;

if (link_dp_get_encoding_format(link_settings) == DP_8b_10b_ENCODING)
dp_set_fec_enable(link, fec_enable);
dp_set_fec_enable(link, &pipe_ctx->link_res, fec_enable);

// during mode set we do DP_SET_POWER off then on, aux writes are lost
if (link->dpcd_sink_ext_caps.bits.oled == 1 ||
Expand Down Expand Up @@ -2461,7 +2461,7 @@ void link_set_dpms_on(
struct dc_stream_state *stream = pipe_ctx->stream;
struct dc_link *link = stream->sink->link;
enum dc_status status;
struct link_encoder *link_enc;
struct link_encoder *link_enc = pipe_ctx->link_res.dio_link_enc;
enum otg_out_mux_dest otg_out_dest = OUT_MUX_DIO;
struct vpg *vpg = pipe_ctx->stream_res.stream_enc->vpg;
const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res);
Expand All @@ -2486,7 +2486,8 @@ void link_set_dpms_on(
}
}

link_enc = link_enc_cfg_get_link_enc(link);
if (!dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
ASSERT(link_enc);

if (!dc_is_virtual_signal(pipe_ctx->stream->signal)
Expand Down
21 changes: 15 additions & 6 deletions drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_capability.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,9 +330,12 @@ bool dp_is_fec_supported(const struct dc_link *link)
/* TODO - use asic cap instead of link_enc->features
* we no longer know which link enc to use for this link before commit
*/
struct link_encoder *link_enc = NULL;
struct resource_context *res_ctx = &link->dc->current_state->res_ctx;
struct resource_pool *res_pool = link->dc->res_pool;
struct link_encoder *link_enc = get_temp_dio_link_enc(res_ctx, res_pool, link);

link_enc = link_enc_cfg_get_link_enc(link);
if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
ASSERT(link_enc);

return (dc_is_dp_signal(link->connector_signal) && link_enc &&
Expand Down Expand Up @@ -2093,14 +2096,17 @@ void detect_edp_sink_caps(struct dc_link *link)

bool dp_get_max_link_enc_cap(const struct dc_link *link, struct dc_link_settings *max_link_enc_cap)
{
struct link_encoder *link_enc = NULL;
struct resource_context *res_ctx = &link->dc->current_state->res_ctx;
struct resource_pool *res_pool = link->dc->res_pool;
struct link_encoder *link_enc = get_temp_dio_link_enc(res_ctx, res_pool, link);

if (!max_link_enc_cap) {
DC_LOG_ERROR("%s: Could not return max link encoder caps", __func__);
return false;
}

link_enc = link_enc_cfg_get_link_enc(link);
if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
ASSERT(link_enc);

if (link_enc && link_enc->funcs->get_max_link_cap) {
Expand Down Expand Up @@ -2128,10 +2134,13 @@ struct dc_link_settings dp_get_max_link_cap(struct dc_link *link)
struct dc_link_settings max_link_cap = {0};
enum dc_link_rate lttpr_max_link_rate;
enum dc_link_rate cable_max_link_rate;
struct link_encoder *link_enc = NULL;
struct resource_context *res_ctx = &link->dc->current_state->res_ctx;
struct resource_pool *res_pool = link->dc->res_pool;
struct link_encoder *link_enc = get_temp_dio_link_enc(res_ctx, res_pool, link);
bool is_uhbr13_5_supported = true;

link_enc = link_enc_cfg_get_link_enc(link);
if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
ASSERT(link_enc);

/* get max link encoder capability */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ bool dp_is_128b_132b_signal(struct pipe_ctx *pipe_ctx);
/* Initialize output parameter lt_settings. */
void dp_decide_training_settings(
struct dc_link *link,
const struct link_resource *link_res,
const struct dc_link_settings *link_setting,
struct link_training_settings *lt_settings);

Expand Down
16 changes: 9 additions & 7 deletions drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_phy.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,12 @@ enum dc_status dp_set_fec_ready(struct dc_link *link, const struct link_resource
* if the sink supports it and leave it enabled on link.
* If FEC is not supported, disable it.
*/
struct link_encoder *link_enc = NULL;
struct link_encoder *link_enc = link_res->dio_link_enc;
enum dc_status status = DC_OK;
uint8_t fec_config = 0;

link_enc = link_enc_cfg_get_link_enc(link);
if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);
ASSERT(link_enc);
if (link_enc->funcs->fec_set_ready == NULL)
return DC_NOT_SUPPORTED;
Expand Down Expand Up @@ -176,13 +177,14 @@ enum dc_status dp_set_fec_ready(struct dc_link *link, const struct link_resource
return status;
}

void dp_set_fec_enable(struct dc_link *link, bool enable)
void dp_set_fec_enable(struct dc_link *link, const struct link_resource *link_res, bool enable)
{
struct link_encoder *link_enc = NULL;
struct link_encoder *link_enc = link_res->dio_link_enc;

link_enc = link_enc_cfg_get_link_enc(link);
ASSERT(link_enc);
if (link_enc->funcs->fec_set_enable == NULL)
if (!link->dc->config.unify_link_enc_assignment)
link_enc = link_enc_cfg_get_link_enc(link);

if (link_enc == NULL || link_enc->funcs == NULL || link_enc->funcs->fec_set_enable == NULL)
return;

if (enable && dp_should_enable_fec(link)) {
Expand Down
Loading

0 comments on commit d295786

Please sign in to comment.