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

drm/amd/display: extract update stream allocation to link_hwss

[why]
Extract update stream allocation table into link hwss as part of the
link hwss refactor work.
Reviewed-by: default avatarGeorge Shen <George.Shen@amd.com>
Reviewed-by: default avatarFangzhi Zuo <Jerry.Zuo@amd.com>
Acked-by: default avatarPavle Kotarac <Pavle.Kotarac@amd.com>
Signed-off-by: default avatarWenjing Liu <wenjing.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9dd94101
...@@ -3487,8 +3487,6 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx, ...@@ -3487,8 +3487,6 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx,
{ {
struct dc_stream_state *stream = pipe_ctx->stream; struct dc_stream_state *stream = pipe_ctx->stream;
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
struct hpo_dp_link_encoder *hpo_dp_link_encoder = pipe_ctx->link_res.hpo_dp_link_enc;
struct hpo_dp_stream_encoder *hpo_dp_stream_encoder = pipe_ctx->stream_res.hpo_dp_stream_enc;
struct link_mst_stream_allocation_table proposed_table = {0}; struct link_mst_stream_allocation_table proposed_table = {0};
struct fixed31_32 avg_time_slots_per_mtp; struct fixed31_32 avg_time_slots_per_mtp;
const struct dc_link_settings empty_link_settings = {0}; const struct dc_link_settings empty_link_settings = {0};
...@@ -3522,7 +3520,7 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx, ...@@ -3522,7 +3520,7 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx,
pipe_ctx->pipe_idx); pipe_ctx->pipe_idx);
} }
proposed_table.stream_allocations[0].hpo_dp_stream_enc = hpo_dp_stream_encoder; proposed_table.stream_allocations[0].hpo_dp_stream_enc = pipe_ctx->stream_res.hpo_dp_stream_enc;
ASSERT(proposed_table.stream_count == 1); ASSERT(proposed_table.stream_count == 1);
...@@ -3535,8 +3533,7 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx, ...@@ -3535,8 +3533,7 @@ static enum dc_status dc_link_update_sst_payload(struct pipe_ctx *pipe_ctx,
proposed_table.stream_allocations[0].slot_count); proposed_table.stream_allocations[0].slot_count);
/* program DP source TX for payload */ /* program DP source TX for payload */
hpo_dp_link_encoder->funcs->update_stream_allocation_table( link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
hpo_dp_link_encoder,
&proposed_table); &proposed_table);
/* poll for ACT handled */ /* poll for ACT handled */
...@@ -3573,8 +3570,6 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -3573,8 +3570,6 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx)
{ {
struct dc_stream_state *stream = pipe_ctx->stream; struct dc_stream_state *stream = pipe_ctx->stream;
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
struct link_encoder *link_encoder = NULL;
struct hpo_dp_link_encoder *hpo_dp_link_encoder = pipe_ctx->link_res.hpo_dp_link_enc;
struct dp_mst_stream_allocation_table proposed_table = {0}; struct dp_mst_stream_allocation_table proposed_table = {0};
struct fixed31_32 avg_time_slots_per_mtp; struct fixed31_32 avg_time_slots_per_mtp;
struct fixed31_32 pbn; struct fixed31_32 pbn;
...@@ -3584,9 +3579,6 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -3584,9 +3579,6 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx)
const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res); const struct link_hwss *link_hwss = get_link_hwss(link, &pipe_ctx->link_res);
DC_LOGGER_INIT(link->ctx->logger); DC_LOGGER_INIT(link->ctx->logger);
link_encoder = link_enc_cfg_get_link_enc(link);
ASSERT(link_encoder);
/* enable_link_dp_mst already check link->enabled_stream_count /* enable_link_dp_mst already check link->enabled_stream_count
* and stream is in link->stream[]. This is called during set mode, * and stream is in link->stream[]. This is called during set mode,
* stream_enc is available. * stream_enc is available.
...@@ -3631,37 +3623,17 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -3631,37 +3623,17 @@ enum dc_status dc_link_allocate_mst_payload(struct pipe_ctx *pipe_ctx)
ASSERT(proposed_table.stream_count > 0); ASSERT(proposed_table.stream_count > 0);
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) {
static enum dc_status status;
uint8_t mst_alloc_slots = 0, prev_mst_slots_in_use = 0xFF;
for (i = 0; i < link->mst_stream_alloc_table.stream_count; i++)
mst_alloc_slots += link->mst_stream_alloc_table.stream_allocations[i].slot_count;
status = dc_process_dmub_set_mst_slots(link->dc, link->link_index,
mst_alloc_slots, &prev_mst_slots_in_use);
ASSERT(status == DC_OK);
DC_LOG_MST("dpia : status[%d]: alloc_slots[%d]: used_slots[%d]\n",
status, mst_alloc_slots, prev_mst_slots_in_use);
}
/* program DP source TX for payload */ /* program DP source TX for payload */
switch (dp_get_link_encoding_format(&link->cur_link_settings)) { if (link_hwss->ext.update_stream_allocation_table == NULL ||
case DP_8b_10b_ENCODING: dp_get_link_encoding_format(&link->cur_link_settings) == DP_UNKNOWN_ENCODING) {
link_encoder->funcs->update_mst_stream_allocation_table(
link_encoder,
&link->mst_stream_alloc_table);
break;
case DP_128b_132b_ENCODING:
hpo_dp_link_encoder->funcs->update_stream_allocation_table(
hpo_dp_link_encoder,
&link->mst_stream_alloc_table);
break;
case DP_UNKNOWN_ENCODING:
DC_LOG_ERROR("Failure: unknown encoding format\n"); DC_LOG_ERROR("Failure: unknown encoding format\n");
return DC_ERROR_UNEXPECTED; return DC_ERROR_UNEXPECTED;
} }
link_hwss->ext.update_stream_allocation_table(link,
&pipe_ctx->link_res,
&link->mst_stream_alloc_table);
/* send down message */ /* send down message */
ret = dm_helpers_dp_mst_poll_for_allocation_change_trigger( ret = dm_helpers_dp_mst_poll_for_allocation_change_trigger(
stream->ctx, stream->ctx,
...@@ -3703,7 +3675,6 @@ enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw ...@@ -3703,7 +3675,6 @@ enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw
struct fixed31_32 avg_time_slots_per_mtp; struct fixed31_32 avg_time_slots_per_mtp;
struct fixed31_32 pbn; struct fixed31_32 pbn;
struct fixed31_32 pbn_per_slot; struct fixed31_32 pbn_per_slot;
struct link_encoder *link_encoder = link->link_enc;
struct dp_mst_stream_allocation_table proposed_table = {0}; struct dp_mst_stream_allocation_table proposed_table = {0};
uint8_t i; uint8_t i;
enum act_return_status ret; enum act_return_status ret;
...@@ -3767,8 +3738,13 @@ enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw ...@@ -3767,8 +3738,13 @@ enum dc_status dc_link_reduce_mst_payload(struct pipe_ctx *pipe_ctx, uint32_t bw
ASSERT(proposed_table.stream_count > 0); ASSERT(proposed_table.stream_count > 0);
/* update mst stream allocation table hardware state */ /* update mst stream allocation table hardware state */
link_encoder->funcs->update_mst_stream_allocation_table( if (link_hwss->ext.update_stream_allocation_table == NULL ||
link_encoder, dp_get_link_encoding_format(&link->cur_link_settings) == DP_UNKNOWN_ENCODING) {
DC_LOG_ERROR("Failure: unknown encoding format\n");
return DC_ERROR_UNEXPECTED;
}
link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
&link->mst_stream_alloc_table); &link->mst_stream_alloc_table);
/* poll for immediate branch device ACT handled */ /* poll for immediate branch device ACT handled */
...@@ -3863,8 +3839,6 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -3863,8 +3839,6 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
{ {
struct dc_stream_state *stream = pipe_ctx->stream; struct dc_stream_state *stream = pipe_ctx->stream;
struct dc_link *link = stream->link; struct dc_link *link = stream->link;
struct link_encoder *link_encoder = NULL;
struct hpo_dp_link_encoder *hpo_dp_link_encoder = pipe_ctx->link_res.hpo_dp_link_enc;
struct dp_mst_stream_allocation_table proposed_table = {0}; struct dp_mst_stream_allocation_table proposed_table = {0};
struct fixed31_32 avg_time_slots_per_mtp = dc_fixpt_from_int(0); struct fixed31_32 avg_time_slots_per_mtp = dc_fixpt_from_int(0);
int i; int i;
...@@ -3873,9 +3847,6 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -3873,9 +3847,6 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
const struct dc_link_settings empty_link_settings = {0}; const struct dc_link_settings empty_link_settings = {0};
DC_LOGGER_INIT(link->ctx->logger); DC_LOGGER_INIT(link->ctx->logger);
link_encoder = link_enc_cfg_get_link_enc(link);
ASSERT(link_encoder);
/* deallocate_mst_payload is called before disable link. When mode or /* deallocate_mst_payload is called before disable link. When mode or
* disable/enable monitor, new stream is created which is not in link * disable/enable monitor, new stream is created which is not in link
* stream[] yet. For this, payload is not allocated yet, so de-alloc * stream[] yet. For this, payload is not allocated yet, so de-alloc
...@@ -3933,36 +3904,16 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx) ...@@ -3933,36 +3904,16 @@ static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
link->mst_stream_alloc_table.stream_allocations[i].slot_count); link->mst_stream_alloc_table.stream_allocations[i].slot_count);
} }
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA) { /* update mst stream allocation table hardware state */
enum dc_status status; if (link_hwss->ext.update_stream_allocation_table == NULL ||
uint8_t mst_alloc_slots = 0, prev_mst_slots_in_use = 0xFF; dp_get_link_encoding_format(&link->cur_link_settings) == DP_UNKNOWN_ENCODING) {
for (i = 0; i < link->mst_stream_alloc_table.stream_count; i++)
mst_alloc_slots += link->mst_stream_alloc_table.stream_allocations[i].slot_count;
status = dc_process_dmub_set_mst_slots(link->dc, link->link_index,
mst_alloc_slots, &prev_mst_slots_in_use);
ASSERT(status != DC_NOT_SUPPORTED);
DC_LOG_MST("dpia : status[%d]: alloc_slots[%d]: used_slots[%d]\n",
status, mst_alloc_slots, prev_mst_slots_in_use);
}
switch (dp_get_link_encoding_format(&link->cur_link_settings)) {
case DP_8b_10b_ENCODING:
link_encoder->funcs->update_mst_stream_allocation_table(
link_encoder,
&link->mst_stream_alloc_table);
break;
case DP_128b_132b_ENCODING:
hpo_dp_link_encoder->funcs->update_stream_allocation_table(
hpo_dp_link_encoder,
&link->mst_stream_alloc_table);
break;
case DP_UNKNOWN_ENCODING:
DC_LOG_DEBUG("Unknown encoding format\n"); DC_LOG_DEBUG("Unknown encoding format\n");
return DC_ERROR_UNEXPECTED; return DC_ERROR_UNEXPECTED;
} }
link_hwss->ext.update_stream_allocation_table(link, &pipe_ctx->link_res,
&link->mst_stream_alloc_table);
if (mst_mode) { if (mst_mode) {
dm_helpers_dp_mst_poll_for_allocation_change_trigger( dm_helpers_dp_mst_poll_for_allocation_change_trigger(
stream->ctx, stream->ctx,
...@@ -4109,8 +4060,8 @@ static void fpga_dp_hpo_enable_link_and_stream(struct dc_state *state, struct pi ...@@ -4109,8 +4060,8 @@ static void fpga_dp_hpo_enable_link_and_stream(struct dc_state *state, struct pi
proposed_table.stream_allocations[0].hpo_dp_stream_enc = pipe_ctx->stream_res.hpo_dp_stream_enc; proposed_table.stream_allocations[0].hpo_dp_stream_enc = pipe_ctx->stream_res.hpo_dp_stream_enc;
} }
pipe_ctx->link_res.hpo_dp_link_enc->funcs->update_stream_allocation_table( link_hwss->ext.update_stream_allocation_table(stream->link,
pipe_ctx->link_res.hpo_dp_link_enc, &pipe_ctx->link_res,
&proposed_table); &proposed_table);
if (link_hwss->ext.set_throttled_vcp_size) if (link_hwss->ext.set_throttled_vcp_size)
......
...@@ -37,9 +37,12 @@ struct dc_link; ...@@ -37,9 +37,12 @@ struct dc_link;
struct link_resource; struct link_resource;
struct pipe_ctx; struct pipe_ctx;
struct encoder_set_dp_phy_pattern_param; struct encoder_set_dp_phy_pattern_param;
struct link_mst_stream_allocation_table;
struct link_hwss_ext { struct link_hwss_ext {
/* function pointers below require check for NULL at all time /* function pointers below may require to check for NULL if caller
* considers missing implementation as expected in some cases or none
* critical to be investigated immediately
* ********************************************************************* * *********************************************************************
*/ */
void (*set_hblank_min_symbol_width)(struct pipe_ctx *pipe_ctx, void (*set_hblank_min_symbol_width)(struct pipe_ctx *pipe_ctx,
...@@ -62,6 +65,9 @@ struct link_hwss_ext { ...@@ -62,6 +65,9 @@ struct link_hwss_ext {
const struct link_resource *link_res, const struct link_resource *link_res,
const struct dc_link_settings *link_settings, const struct dc_link_settings *link_settings,
const struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]); const struct dc_lane_settings lane_settings[LANE_COUNT_DP_MAX]);
void (*update_stream_allocation_table)(struct dc_link *link,
const struct link_resource *link_res,
const struct link_mst_stream_allocation_table *table);
}; };
struct link_hwss { struct link_hwss {
......
...@@ -153,6 +153,16 @@ void set_dio_dp_lane_settings(struct dc_link *link, ...@@ -153,6 +153,16 @@ void set_dio_dp_lane_settings(struct dc_link *link,
link_enc->funcs->dp_set_lane_settings(link_enc, link_settings, lane_settings); link_enc->funcs->dp_set_lane_settings(link_enc, link_settings, lane_settings);
} }
static 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);
ASSERT(link_enc);
link_enc->funcs->update_mst_stream_allocation_table(link_enc, table);
}
static const struct link_hwss dio_link_hwss = { static const struct link_hwss dio_link_hwss = {
.setup_stream_encoder = setup_dio_stream_encoder, .setup_stream_encoder = setup_dio_stream_encoder,
.reset_stream_encoder = reset_dio_stream_encoder, .reset_stream_encoder = reset_dio_stream_encoder,
...@@ -163,6 +173,7 @@ static const struct link_hwss dio_link_hwss = { ...@@ -163,6 +173,7 @@ static const struct link_hwss dio_link_hwss = {
.disable_dp_link_output = disable_dio_dp_link_output, .disable_dp_link_output = disable_dio_dp_link_output,
.set_dp_link_test_pattern = set_dio_dp_link_test_pattern, .set_dp_link_test_pattern = set_dio_dp_link_test_pattern,
.set_dp_lane_settings = set_dio_dp_lane_settings, .set_dp_lane_settings = set_dio_dp_lane_settings,
.update_stream_allocation_table = update_dio_stream_allocation_table,
}, },
}; };
......
...@@ -25,6 +25,32 @@ ...@@ -25,6 +25,32 @@
#include "link_hwss_dpia.h" #include "link_hwss_dpia.h"
#include "core_types.h" #include "core_types.h"
#include "link_hwss_dio.h" #include "link_hwss_dio.h"
#include "link_enc_cfg.h"
#define DC_LOGGER_INIT(logger)
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);
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);
for (i = 0; i < table->stream_count; i++)
mst_alloc_slots += table->stream_allocations[i].slot_count;
status = dc_process_dmub_set_mst_slots(link->dc, link->link_index,
mst_alloc_slots, &prev_mst_slots_in_use);
ASSERT(status == DC_OK);
DC_LOG_MST("dpia : status[%d]: alloc_slots[%d]: used_slots[%d]\n",
status, mst_alloc_slots, prev_mst_slots_in_use);
ASSERT(link_enc);
link_enc->funcs->update_mst_stream_allocation_table(link_enc, table);
}
static const struct link_hwss dpia_link_hwss = { static const struct link_hwss dpia_link_hwss = {
.setup_stream_encoder = setup_dio_stream_encoder, .setup_stream_encoder = setup_dio_stream_encoder,
...@@ -36,6 +62,7 @@ static const struct link_hwss dpia_link_hwss = { ...@@ -36,6 +62,7 @@ static const struct link_hwss dpia_link_hwss = {
.disable_dp_link_output = disable_dio_dp_link_output, .disable_dp_link_output = disable_dio_dp_link_output,
.set_dp_link_test_pattern = set_dio_dp_link_test_pattern, .set_dp_link_test_pattern = set_dio_dp_link_test_pattern,
.set_dp_lane_settings = set_dio_dp_lane_settings, .set_dp_lane_settings = set_dio_dp_lane_settings,
.update_stream_allocation_table = update_dpia_stream_allocation_table,
}, },
}; };
......
...@@ -244,6 +244,15 @@ static void set_hpo_dp_lane_settings(struct dc_link *link, ...@@ -244,6 +244,15 @@ static void set_hpo_dp_lane_settings(struct dc_link *link,
lane_settings[0].FFE_PRESET.raw); lane_settings[0].FFE_PRESET.raw);
} }
static void update_hpo_dp_stream_allocation_table(struct dc_link *link,
const struct link_resource *link_res,
const struct link_mst_stream_allocation_table *table)
{
link_res->hpo_dp_link_enc->funcs->update_stream_allocation_table(
link_res->hpo_dp_link_enc,
table);
}
static const struct link_hwss hpo_dp_link_hwss = { static const struct link_hwss hpo_dp_link_hwss = {
.setup_stream_encoder = setup_hpo_dp_stream_encoder, .setup_stream_encoder = setup_hpo_dp_stream_encoder,
.reset_stream_encoder = reset_hpo_dp_stream_encoder, .reset_stream_encoder = reset_hpo_dp_stream_encoder,
...@@ -255,6 +264,7 @@ static const struct link_hwss hpo_dp_link_hwss = { ...@@ -255,6 +264,7 @@ static const struct link_hwss hpo_dp_link_hwss = {
.disable_dp_link_output = disable_hpo_dp_link_output, .disable_dp_link_output = disable_hpo_dp_link_output,
.set_dp_link_test_pattern = set_hpo_dp_link_test_pattern, .set_dp_link_test_pattern = set_hpo_dp_link_test_pattern,
.set_dp_lane_settings = set_hpo_dp_lane_settings, .set_dp_lane_settings = set_hpo_dp_lane_settings,
.update_stream_allocation_table = update_hpo_dp_stream_allocation_table,
}, },
}; };
......
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