drm/amd/display: remove sink reference in dc_stream_state
[why] dc_stream_state containing a pointer to sink is poor design. Sink describes the display, and the specifications or capabilities it has. That information is irrelevant for dc_stream_state, which describes hardware state, and is generally used for hardware programming. It could further be argued that dc_sink itself is just a convenience dc provides, and DC should be perfectly capable of programming hardware without any dc_sinks (for example, emulated sinks). [how] Phase 1: Deprecate use of dc_sink pointer in dc_stream. Most references are trivial to remove, but some call sites are risky (such as is_timing_changed) with no obvious logical replacement. These will be removed in follow up change. Add dc_link pointer to dc_stream. This is the typical reason DC really needed sink pointer, and most call sites are replaced with this. DMs also need minor updates, as all 3 DMs leverage stream->sink for some functionality. this is replaced instead by a pointer to private data inside dc_stream_state, which is used by DMs as a quality of life improvment for some key functionality. it allows DMs to set pointers have to their own objects which associate OS objects to dc_stream_states (such as DisplayTarget and amdgpu_dm_connector). Without the private pointer, DMs would be forced to perform a lookup for callbacks. Signed-off-by: Jun Lei <Jun.Lei@amd.com> Reviewed-by: Aric Cyr <Aric.Cyr@amd.com> Acked-by: David Francis <David.Francis@amd.com> Acked-by: Leo Li <sunpeng.li@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
51ba137ef2
commit
ceb3dbb469
|
@ -2666,10 +2666,10 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
|
|||
timing_out->v_border_bottom = 0;
|
||||
/* TODO: un-hardcode */
|
||||
if (drm_mode_is_420_only(info, mode_in)
|
||||
&& stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
&& stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
|
||||
else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB444)
|
||||
&& stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
&& stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444;
|
||||
else
|
||||
timing_out->pixel_encoding = PIXEL_ENCODING_RGB;
|
||||
|
@ -2711,7 +2711,7 @@ fill_stream_properties_from_drm_display_mode(struct dc_stream_state *stream,
|
|||
|
||||
stream->out_transfer_func->type = TF_TYPE_PREDEFINED;
|
||||
stream->out_transfer_func->tf = TRANSFER_FUNCTION_SRGB;
|
||||
if (stream->sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
adjust_colour_depth_from_display_info(timing_out, info);
|
||||
}
|
||||
|
||||
|
@ -2905,6 +2905,8 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
|||
goto finish;
|
||||
}
|
||||
|
||||
stream->dm_stream_context = aconnector;
|
||||
|
||||
list_for_each_entry(preferred_mode, &aconnector->base.modes, head) {
|
||||
/* Search for preferred mode */
|
||||
if (preferred_mode->type & DRM_MODE_TYPE_PREFERRED) {
|
||||
|
@ -2956,7 +2958,7 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
|||
drm_connector,
|
||||
sink);
|
||||
|
||||
update_stream_signal(stream);
|
||||
update_stream_signal(stream, sink);
|
||||
|
||||
if (dm_state && dm_state->freesync_capable)
|
||||
stream->ignore_msa_timing_param = true;
|
||||
|
|
|
@ -192,7 +192,7 @@ bool dm_helpers_dp_mst_write_payload_allocation_table(
|
|||
int bpp = 0;
|
||||
int pbn = 0;
|
||||
|
||||
aconnector = stream->sink->priv;
|
||||
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
|
||||
|
||||
if (!aconnector || !aconnector->mst_port)
|
||||
return false;
|
||||
|
@ -284,7 +284,7 @@ bool dm_helpers_dp_mst_poll_for_allocation_change_trigger(
|
|||
struct drm_dp_mst_topology_mgr *mst_mgr;
|
||||
int ret;
|
||||
|
||||
aconnector = stream->sink->priv;
|
||||
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
|
||||
|
||||
if (!aconnector || !aconnector->mst_port)
|
||||
return false;
|
||||
|
@ -312,7 +312,7 @@ bool dm_helpers_dp_mst_send_payload_allocation(
|
|||
struct drm_dp_mst_port *mst_port;
|
||||
int ret;
|
||||
|
||||
aconnector = stream->sink->priv;
|
||||
aconnector = (struct amdgpu_dm_connector *)stream->dm_stream_context;
|
||||
|
||||
if (!aconnector || !aconnector->mst_port)
|
||||
return false;
|
||||
|
|
|
@ -961,7 +961,7 @@ bool dcn_validate_bandwidth(
|
|||
v->dcc_rate[input_idx] = 1; /*TODO: Worst case? does this change?*/
|
||||
v->output_format[input_idx] = pipe->stream->timing.pixel_encoding ==
|
||||
PIXEL_ENCODING_YCBCR420 ? dcn_bw_420 : dcn_bw_444;
|
||||
v->output[input_idx] = pipe->stream->sink->sink_signal ==
|
||||
v->output[input_idx] = pipe->stream->signal ==
|
||||
SIGNAL_TYPE_HDMI_TYPE_A ? dcn_bw_hdmi : dcn_bw_dp;
|
||||
v->output_deep_color[input_idx] = dcn_bw_encoder_8bpc;
|
||||
if (v->output[input_idx] == dcn_bw_hdmi) {
|
||||
|
|
|
@ -384,7 +384,7 @@ void dc_stream_set_dither_option(struct dc_stream_state *stream,
|
|||
enum dc_dither_option option)
|
||||
{
|
||||
struct bit_depth_reduction_params params;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
struct pipe_ctx *pipes = NULL;
|
||||
int i;
|
||||
|
||||
|
@ -526,9 +526,8 @@ void dc_link_set_preferred_link_settings(struct dc *dc,
|
|||
|
||||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
pipe = &dc->current_state->res_ctx.pipe_ctx[i];
|
||||
if (pipe->stream && pipe->stream->sink
|
||||
&& pipe->stream->sink->link) {
|
||||
if (pipe->stream->sink->link == link)
|
||||
if (pipe->stream && pipe->stream->link) {
|
||||
if (pipe->stream->link == link)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1045,7 +1044,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
|
|||
|
||||
/* Program all planes within new context*/
|
||||
for (i = 0; i < context->stream_count; i++) {
|
||||
const struct dc_sink *sink = context->streams[i]->sink;
|
||||
const struct dc_link *link = context->streams[i]->link;
|
||||
|
||||
if (!context->streams[i]->mode_changed)
|
||||
continue;
|
||||
|
@ -1070,7 +1069,7 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c
|
|||
}
|
||||
}
|
||||
|
||||
CONN_MSG_MODE(sink->link, "{%dx%d, %dx%d@%dKhz}",
|
||||
CONN_MSG_MODE(link, "{%dx%d, %dx%d@%dKhz}",
|
||||
context->streams[i]->timing.h_addressable,
|
||||
context->streams[i]->timing.v_addressable,
|
||||
context->streams[i]->timing.h_total,
|
||||
|
|
|
@ -789,7 +789,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
|||
return false;
|
||||
}
|
||||
|
||||
sink->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
|
||||
sink->link->dongle_max_pix_clk = sink_caps.max_hdmi_pixel_clock;
|
||||
sink->converter_disable_audio = converter_disable_audio;
|
||||
|
||||
link->local_sink = sink;
|
||||
|
@ -1372,7 +1372,7 @@ static void dpcd_configure_panel_mode(
|
|||
static void enable_stream_features(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
union down_spread_ctrl old_downspread;
|
||||
union down_spread_ctrl new_downspread;
|
||||
|
||||
|
@ -1397,7 +1397,7 @@ static enum dc_status enable_link_dp(
|
|||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
enum dc_status status;
|
||||
bool skip_video_pattern;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
struct dc_link_settings link_settings = {0};
|
||||
enum dp_panel_mode panel_mode;
|
||||
|
||||
|
@ -1414,8 +1414,8 @@ static enum dc_status enable_link_dp(
|
|||
pipe_ctx->clock_source->id,
|
||||
&link_settings);
|
||||
|
||||
if (stream->sink->edid_caps.panel_patch.dppowerup_delay > 0) {
|
||||
int delay_dp_power_up_in_ms = stream->sink->edid_caps.panel_patch.dppowerup_delay;
|
||||
if (stream->sink_patches.dppowerup_delay > 0) {
|
||||
int delay_dp_power_up_in_ms = stream->sink_patches.dppowerup_delay;
|
||||
|
||||
msleep(delay_dp_power_up_in_ms);
|
||||
}
|
||||
|
@ -1448,7 +1448,7 @@ static enum dc_status enable_link_edp(
|
|||
{
|
||||
enum dc_status status;
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
/*in case it is not on*/
|
||||
link->dc->hwss.edp_power_control(link, true);
|
||||
link->dc->hwss.edp_wait_for_hpd_ready(link, true);
|
||||
|
@ -1463,7 +1463,7 @@ static enum dc_status enable_link_dp_mst(
|
|||
struct dc_state *state,
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_link *link = pipe_ctx->stream->sink->link;
|
||||
struct dc_link *link = pipe_ctx->stream->link;
|
||||
|
||||
/* sink signal type after MST branch is MST. Multiple MST sinks
|
||||
* share one link. Link DP PHY is enable or training only once.
|
||||
|
@ -1597,7 +1597,7 @@ static bool i2c_write(struct pipe_ctx *pipe_ctx,
|
|||
cmd.payloads = &payload;
|
||||
|
||||
if (dm_helpers_submit_i2c(pipe_ctx->stream->ctx,
|
||||
pipe_ctx->stream->sink->link, &cmd))
|
||||
pipe_ctx->stream->link, &cmd))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -1651,7 +1651,7 @@ static void write_i2c_retimer_setting(
|
|||
else {
|
||||
i2c_success =
|
||||
dal_ddc_service_query_ddc_data(
|
||||
pipe_ctx->stream->sink->link->ddc,
|
||||
pipe_ctx->stream->link->ddc,
|
||||
slave_address, &offset, 1, &value, 1);
|
||||
if (!i2c_success)
|
||||
/* Write failure */
|
||||
|
@ -1704,7 +1704,7 @@ static void write_i2c_retimer_setting(
|
|||
else {
|
||||
i2c_success =
|
||||
dal_ddc_service_query_ddc_data(
|
||||
pipe_ctx->stream->sink->link->ddc,
|
||||
pipe_ctx->stream->link->ddc,
|
||||
slave_address, &offset, 1, &value, 1);
|
||||
if (!i2c_success)
|
||||
/* Write failure */
|
||||
|
@ -1929,7 +1929,7 @@ static void write_i2c_redriver_setting(
|
|||
static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
enum dc_color_depth display_color_depth;
|
||||
enum engine_id eng_id;
|
||||
struct ext_hdmi_settings settings = {0};
|
||||
|
@ -1943,7 +1943,7 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
|
|||
is_over_340mhz = true;
|
||||
|
||||
if (dc_is_hdmi_signal(pipe_ctx->stream->signal)) {
|
||||
unsigned short masked_chip_caps = pipe_ctx->stream->sink->link->chip_caps &
|
||||
unsigned short masked_chip_caps = pipe_ctx->stream->link->chip_caps &
|
||||
EXT_DISPLAY_PATH_CAPS__EXT_CHIP_MASK;
|
||||
if (masked_chip_caps == EXT_DISPLAY_PATH_CAPS__HDMI20_TISN65DP159RSBT) {
|
||||
/* DP159, Retimer settings */
|
||||
|
@ -1964,11 +1964,11 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
|
|||
|
||||
if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
|
||||
dal_ddc_service_write_scdc_data(
|
||||
stream->sink->link->ddc,
|
||||
stream->link->ddc,
|
||||
stream->phy_pix_clk,
|
||||
stream->timing.flags.LTE_340MCSC_SCRAMBLE);
|
||||
|
||||
memset(&stream->sink->link->cur_link_settings, 0,
|
||||
memset(&stream->link->cur_link_settings, 0,
|
||||
sizeof(struct dc_link_settings));
|
||||
|
||||
display_color_depth = stream->timing.display_color_depth;
|
||||
|
@ -1989,12 +1989,12 @@ static void enable_link_hdmi(struct pipe_ctx *pipe_ctx)
|
|||
static void enable_link_lvds(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
|
||||
if (stream->phy_pix_clk == 0)
|
||||
stream->phy_pix_clk = stream->timing.pix_clk_khz;
|
||||
|
||||
memset(&stream->sink->link->cur_link_settings, 0,
|
||||
memset(&stream->link->cur_link_settings, 0,
|
||||
sizeof(struct dc_link_settings));
|
||||
|
||||
link->link_enc->funcs->enable_lvds_output(
|
||||
|
@ -2145,7 +2145,7 @@ enum dc_status dc_link_validate_mode_timing(
|
|||
struct dc_link *link,
|
||||
const struct dc_crtc_timing *timing)
|
||||
{
|
||||
uint32_t max_pix_clk = stream->sink->dongle_max_pix_clk;
|
||||
uint32_t max_pix_clk = stream->link->dongle_max_pix_clk;
|
||||
struct dpcd_caps *dpcd_caps = &link->dpcd_caps;
|
||||
|
||||
/* A hack to avoid failing any modes for EDID override feature on
|
||||
|
@ -2219,7 +2219,7 @@ bool dc_link_set_backlight_level(const struct dc_link *link,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
if (core_dc->current_state->res_ctx.pipe_ctx[i].stream) {
|
||||
if (core_dc->current_state->res_ctx.
|
||||
pipe_ctx[i].stream->sink->link
|
||||
pipe_ctx[i].stream->link
|
||||
== link)
|
||||
/* DMCU -1 for all controller id values,
|
||||
* therefore +1 here
|
||||
|
@ -2279,7 +2279,7 @@ void core_link_resume(struct dc_link *link)
|
|||
static struct fixed31_32 get_pbn_per_slot(struct dc_stream_state *stream)
|
||||
{
|
||||
struct dc_link_settings *link_settings =
|
||||
&stream->sink->link->cur_link_settings;
|
||||
&stream->link->cur_link_settings;
|
||||
uint32_t link_rate_in_mbps =
|
||||
link_settings->link_rate * LINK_RATE_REF_FREQ_IN_MHZ;
|
||||
struct fixed31_32 mbps = dc_fixpt_from_int(
|
||||
|
@ -2386,7 +2386,7 @@ static void update_mst_stream_alloc_table(
|
|||
static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
struct link_encoder *link_encoder = link->link_enc;
|
||||
struct stream_encoder *stream_encoder = pipe_ctx->stream_res.stream_enc;
|
||||
struct dp_mst_stream_allocation_table proposed_table = {0};
|
||||
|
@ -2466,7 +2466,7 @@ static enum dc_status allocate_mst_payload(struct pipe_ctx *pipe_ctx)
|
|||
static enum dc_status deallocate_mst_payload(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
struct link_encoder *link_encoder = link->link_enc;
|
||||
struct stream_encoder *stream_encoder = pipe_ctx->stream_res.stream_enc;
|
||||
struct dp_mst_stream_allocation_table proposed_table = {0};
|
||||
|
@ -2551,8 +2551,8 @@ void core_link_enable_stream(
|
|||
DC_LOGGER_INIT(pipe_ctx->stream->ctx->logger);
|
||||
|
||||
if (pipe_ctx->stream->signal != SIGNAL_TYPE_VIRTUAL) {
|
||||
stream->sink->link->link_enc->funcs->setup(
|
||||
stream->sink->link->link_enc,
|
||||
stream->link->link_enc->funcs->setup(
|
||||
stream->link->link_enc,
|
||||
pipe_ctx->stream->signal);
|
||||
pipe_ctx->stream_res.stream_enc->funcs->setup_stereo_sync(
|
||||
pipe_ctx->stream_res.stream_enc,
|
||||
|
@ -2604,7 +2604,7 @@ void core_link_enable_stream(
|
|||
|
||||
if (status != DC_OK) {
|
||||
DC_LOG_WARNING("enabling link %u failed: %d\n",
|
||||
pipe_ctx->stream->sink->link->link_index,
|
||||
pipe_ctx->stream->link->link_index,
|
||||
status);
|
||||
|
||||
/* Abort stream enable *unless* the failure was due to
|
||||
|
@ -2633,12 +2633,12 @@ void core_link_enable_stream(
|
|||
allocate_mst_payload(pipe_ctx);
|
||||
|
||||
core_dc->hwss.unblank_stream(pipe_ctx,
|
||||
&pipe_ctx->stream->sink->link->cur_link_settings);
|
||||
&pipe_ctx->stream->link->cur_link_settings);
|
||||
|
||||
if (dc_is_dp_signal(pipe_ctx->stream->signal))
|
||||
enable_stream_features(pipe_ctx);
|
||||
|
||||
dc_link_set_backlight_level(pipe_ctx->stream->sink->link,
|
||||
dc_link_set_backlight_level(pipe_ctx->stream->link,
|
||||
pipe_ctx->stream->bl_pwm_level,
|
||||
0,
|
||||
pipe_ctx->stream);
|
||||
|
@ -2657,7 +2657,7 @@ void core_link_disable_stream(struct pipe_ctx *pipe_ctx, int option)
|
|||
|
||||
core_dc->hwss.disable_stream(pipe_ctx, option);
|
||||
|
||||
disable_link(pipe_ctx->stream->sink->link, pipe_ctx->stream->signal);
|
||||
disable_link(pipe_ctx->stream->link, pipe_ctx->stream->signal);
|
||||
}
|
||||
|
||||
void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable)
|
||||
|
|
|
@ -1634,7 +1634,7 @@ void decide_link_settings(struct dc_stream_state *stream,
|
|||
|
||||
req_bw = bandwidth_in_kbps_from_timing(&stream->timing);
|
||||
|
||||
link = stream->sink->link;
|
||||
link = stream->link;
|
||||
|
||||
/* if preferred is specified through AMDDP, use it, if it's enough
|
||||
* to drive the mode
|
||||
|
@ -1656,7 +1656,7 @@ void decide_link_settings(struct dc_stream_state *stream,
|
|||
}
|
||||
|
||||
/* EDP use the link cap setting */
|
||||
if (stream->sink->sink_signal == SIGNAL_TYPE_EDP) {
|
||||
if (link->connector_signal == SIGNAL_TYPE_EDP) {
|
||||
*link_setting = link->verified_link_cap;
|
||||
return;
|
||||
}
|
||||
|
@ -2621,7 +2621,7 @@ bool dc_link_dp_set_test_pattern(
|
|||
memset(&training_pattern, 0, sizeof(training_pattern));
|
||||
|
||||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
if (pipes[i].stream->sink->link == link) {
|
||||
if (pipes[i].stream->link == link) {
|
||||
pipe_ctx = &pipes[i];
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -70,8 +70,7 @@ void dp_enable_link_phy(
|
|||
*/
|
||||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
if (pipes[i].stream != NULL &&
|
||||
pipes[i].stream->sink != NULL &&
|
||||
pipes[i].stream->sink->link == link) {
|
||||
pipes[i].stream->link == link) {
|
||||
if (pipes[i].clock_source != NULL &&
|
||||
pipes[i].clock_source->id != CLOCK_SOURCE_ID_DP_DTO) {
|
||||
pipes[i].clock_source = dp_cs;
|
||||
|
@ -279,10 +278,8 @@ void dp_retrain_link_dp_test(struct dc_link *link,
|
|||
for (i = 0; i < MAX_PIPES; i++) {
|
||||
if (pipes[i].stream != NULL &&
|
||||
!pipes[i].top_pipe &&
|
||||
pipes[i].stream->sink != NULL &&
|
||||
pipes[i].stream->sink->link != NULL &&
|
||||
pipes[i].stream_res.stream_enc != NULL &&
|
||||
pipes[i].stream->sink->link == link) {
|
||||
pipes[i].stream->link != NULL &&
|
||||
pipes[i].stream_res.stream_enc != NULL) {
|
||||
udelay(100);
|
||||
|
||||
pipes[i].stream_res.stream_enc->funcs->dp_blank(
|
||||
|
|
|
@ -1559,7 +1559,7 @@ static struct stream_encoder *find_first_free_match_stream_enc_for_link(
|
|||
{
|
||||
int i;
|
||||
int j = -1;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
|
||||
for (i = 0; i < pool->stream_enc_count; i++) {
|
||||
if (!res_ctx->is_stream_enc_acquired[i] &&
|
||||
|
@ -1748,7 +1748,7 @@ static struct dc_stream_state *find_pll_sharable_stream(
|
|||
if (resource_are_streams_timing_synchronizable(
|
||||
stream_needs_pll, stream_has_pll)
|
||||
&& !dc_is_dp_signal(stream_has_pll->signal)
|
||||
&& stream_has_pll->sink->link->connector_signal
|
||||
&& stream_has_pll->link->connector_signal
|
||||
!= SIGNAL_TYPE_VIRTUAL)
|
||||
return stream_has_pll;
|
||||
|
||||
|
@ -1850,7 +1850,7 @@ enum dc_status resource_map_pool_resources(
|
|||
true);
|
||||
|
||||
/* TODO: Add check if ASIC support and EDID audio */
|
||||
if (!stream->sink->converter_disable_audio &&
|
||||
if (!stream->converter_disable_audio &&
|
||||
dc_is_audio_capable_signal(pipe_ctx->stream->signal) &&
|
||||
stream->audio_info.mode_count) {
|
||||
pipe_ctx->stream_res.audio = find_first_free_audio(
|
||||
|
@ -2112,7 +2112,7 @@ static void set_avi_info_frame(
|
|||
itc = true;
|
||||
itc_value = 1;
|
||||
|
||||
support = stream->sink->edid_caps.content_support;
|
||||
support = stream->content_support;
|
||||
|
||||
if (itc) {
|
||||
if (!support.bits.valid_content_type) {
|
||||
|
@ -2151,8 +2151,8 @@ static void set_avi_info_frame(
|
|||
|
||||
/* TODO : We should handle YCC quantization */
|
||||
/* but we do not have matrix calculation */
|
||||
if (stream->sink->edid_caps.qs_bit == 1 &&
|
||||
stream->sink->edid_caps.qy_bit == 1) {
|
||||
if (stream->qs_bit == 1 &&
|
||||
stream->qy_bit == 1) {
|
||||
if (color_space == COLOR_SPACE_SRGB ||
|
||||
color_space == COLOR_SPACE_2020_RGB_FULLRANGE) {
|
||||
hdmi_info.bits.Q0_Q1 = RGB_QUANTIZATION_FULL_RANGE;
|
||||
|
@ -2596,7 +2596,7 @@ void resource_build_bit_depth_reduction_params(struct dc_stream_state *stream,
|
|||
enum dc_status dc_validate_stream(struct dc *dc, struct dc_stream_state *stream)
|
||||
{
|
||||
struct dc *core_dc = dc;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
struct timing_generator *tg = core_dc->res_pool->timing_generators[0];
|
||||
enum dc_status res = DC_OK;
|
||||
|
||||
|
|
|
@ -35,20 +35,17 @@
|
|||
/*******************************************************************************
|
||||
* Private functions
|
||||
******************************************************************************/
|
||||
void update_stream_signal(struct dc_stream_state *stream)
|
||||
void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink)
|
||||
{
|
||||
|
||||
struct dc_sink *dc_sink = stream->sink;
|
||||
|
||||
if (dc_sink->sink_signal == SIGNAL_TYPE_NONE)
|
||||
stream->signal = stream->sink->link->connector_signal;
|
||||
if (sink->sink_signal == SIGNAL_TYPE_NONE)
|
||||
stream->signal = stream->link->connector_signal;
|
||||
else
|
||||
stream->signal = dc_sink->sink_signal;
|
||||
stream->signal = sink->sink_signal;
|
||||
|
||||
if (dc_is_dvi_signal(stream->signal)) {
|
||||
if (stream->ctx->dc->caps.dual_link_dvi &&
|
||||
stream->timing.pix_clk_khz > TMDS_MAX_PIXEL_CLOCK &&
|
||||
stream->sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK)
|
||||
sink->sink_signal != SIGNAL_TYPE_DVI_SINGLE_LINK)
|
||||
stream->signal = SIGNAL_TYPE_DVI_DUAL_LINK;
|
||||
else
|
||||
stream->signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
|
||||
|
@ -61,10 +58,15 @@ static void construct(struct dc_stream_state *stream,
|
|||
uint32_t i = 0;
|
||||
|
||||
stream->sink = dc_sink_data;
|
||||
stream->ctx = stream->sink->ctx;
|
||||
|
||||
dc_sink_retain(dc_sink_data);
|
||||
|
||||
stream->ctx = dc_sink_data->ctx;
|
||||
stream->link = dc_sink_data->link;
|
||||
stream->sink_patches = dc_sink_data->edid_caps.panel_patch;
|
||||
stream->converter_disable_audio = dc_sink_data->converter_disable_audio;
|
||||
stream->qs_bit = dc_sink_data->edid_caps.qs_bit;
|
||||
stream->qy_bit = dc_sink_data->edid_caps.qy_bit;
|
||||
|
||||
/* Copy audio modes */
|
||||
/* TODO - Remove this translation */
|
||||
for (i = 0; i < (dc_sink_data->edid_caps.audio_mode_count); i++)
|
||||
|
@ -100,7 +102,7 @@ static void construct(struct dc_stream_state *stream,
|
|||
/* EDID CAP translation for HDMI 2.0 */
|
||||
stream->timing.flags.LTE_340MCSC_SCRAMBLE = dc_sink_data->edid_caps.lte_340mcsc_scramble;
|
||||
|
||||
update_stream_signal(stream);
|
||||
update_stream_signal(stream, dc_sink_data);
|
||||
|
||||
stream->out_transfer_func = dc_create_transfer_func();
|
||||
stream->out_transfer_func->type = TF_TYPE_BYPASS;
|
||||
|
@ -339,11 +341,7 @@ void dc_stream_log(const struct dc *dc, const struct dc_stream_state *stream)
|
|||
stream->timing.v_total,
|
||||
stream->timing.pixel_encoding,
|
||||
stream->timing.display_color_depth);
|
||||
DC_LOG_DC(
|
||||
"\tsink name: %s, serial: %d\n",
|
||||
stream->sink->edid_caps.display_name,
|
||||
stream->sink->edid_caps.serial_number);
|
||||
DC_LOG_DC(
|
||||
"\tlink: %d\n",
|
||||
stream->sink->link->link_index);
|
||||
stream->link->link_index);
|
||||
}
|
||||
|
|
|
@ -110,6 +110,7 @@ struct dc_link {
|
|||
union ddi_channel_mapping ddi_channel_mapping;
|
||||
struct connector_device_tag_info device_tag;
|
||||
struct dpcd_caps dpcd_caps;
|
||||
uint32_t dongle_max_pix_clk;
|
||||
unsigned short chip_caps;
|
||||
unsigned int dpcd_sink_count;
|
||||
enum edp_revision edp_revision;
|
||||
|
|
|
@ -51,7 +51,13 @@ struct freesync_context {
|
|||
};
|
||||
|
||||
struct dc_stream_state {
|
||||
// sink is deprecated, new code should not reference
|
||||
// this pointer
|
||||
struct dc_sink *sink;
|
||||
|
||||
struct dc_link *link;
|
||||
struct dc_panel_patch sink_patches;
|
||||
union display_content_support content_support;
|
||||
struct dc_crtc_timing timing;
|
||||
struct dc_crtc_timing_adjust adjust;
|
||||
struct dc_info_packet vrr_infopacket;
|
||||
|
@ -80,6 +86,9 @@ struct dc_stream_state {
|
|||
enum view_3d_format view_format;
|
||||
|
||||
bool ignore_msa_timing_param;
|
||||
bool converter_disable_audio;
|
||||
uint8_t qs_bit;
|
||||
uint8_t qy_bit;
|
||||
|
||||
unsigned long long periodic_fn_vsync_delta;
|
||||
|
||||
|
@ -105,6 +114,8 @@ struct dc_stream_state {
|
|||
bool dpms_off;
|
||||
bool apply_edp_fast_boot_optimization;
|
||||
|
||||
void *dm_stream_context;
|
||||
|
||||
struct dc_cursor_attributes cursor_attributes;
|
||||
struct dc_cursor_position cursor_position;
|
||||
uint32_t sdr_white_level; // for boosting (SDR) cursor in HDR mode
|
||||
|
@ -256,7 +267,7 @@ enum surface_update_type dc_check_update_surfaces_for_stream(
|
|||
*/
|
||||
struct dc_stream_state *dc_create_stream_for_sink(struct dc_sink *dc_sink);
|
||||
|
||||
void update_stream_signal(struct dc_stream_state *stream);
|
||||
void update_stream_signal(struct dc_stream_state *stream, struct dc_sink *sink);
|
||||
|
||||
void dc_stream_retain(struct dc_stream_state *dc_stream);
|
||||
void dc_stream_release(struct dc_stream_state *dc_stream);
|
||||
|
|
|
@ -483,15 +483,15 @@ void dce110_fill_display_configs(
|
|||
cfg->src_height = stream->src.height;
|
||||
cfg->src_width = stream->src.width;
|
||||
cfg->ddi_channel_mapping =
|
||||
stream->sink->link->ddi_channel_mapping.raw;
|
||||
stream->link->ddi_channel_mapping.raw;
|
||||
cfg->transmitter =
|
||||
stream->sink->link->link_enc->transmitter;
|
||||
stream->link->link_enc->transmitter;
|
||||
cfg->link_settings.lane_count =
|
||||
stream->sink->link->cur_link_settings.lane_count;
|
||||
stream->link->cur_link_settings.lane_count;
|
||||
cfg->link_settings.link_rate =
|
||||
stream->sink->link->cur_link_settings.link_rate;
|
||||
stream->link->cur_link_settings.link_rate;
|
||||
cfg->link_settings.link_spread =
|
||||
stream->sink->link->cur_link_settings.link_spread;
|
||||
stream->link->cur_link_settings.link_spread;
|
||||
cfg->sym_clock = stream->phy_pix_clk;
|
||||
/* Round v_refresh*/
|
||||
cfg->v_refresh = stream->timing.pix_clk_khz * 1000;
|
||||
|
|
|
@ -788,7 +788,7 @@ bool dce110_link_encoder_validate_output_with_stream(
|
|||
case SIGNAL_TYPE_DVI_DUAL_LINK:
|
||||
is_valid = dce110_link_encoder_validate_dvi_output(
|
||||
enc110,
|
||||
stream->sink->link->connector_signal,
|
||||
stream->link->connector_signal,
|
||||
stream->signal,
|
||||
&stream->timing);
|
||||
break;
|
||||
|
|
|
@ -617,12 +617,11 @@ dce110_set_output_transfer_func(struct pipe_ctx *pipe_ctx,
|
|||
static enum dc_status bios_parser_crtc_source_select(
|
||||
struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_bios *dcb;
|
||||
struct dc_bios *dcb = pipe_ctx->stream->ctx->dc_bios;
|
||||
/* call VBIOS table to set CRTC source for the HW
|
||||
* encoder block
|
||||
* note: video bios clears all FMT setting here. */
|
||||
struct bp_crtc_source_select crtc_source_select = {0};
|
||||
const struct dc_sink *sink = pipe_ctx->stream->sink;
|
||||
|
||||
crtc_source_select.engine_id = pipe_ctx->stream_res.stream_enc->id;
|
||||
crtc_source_select.controller_id = pipe_ctx->stream_res.tg->inst + 1;
|
||||
|
@ -652,8 +651,6 @@ static enum dc_status bios_parser_crtc_source_select(
|
|||
break;
|
||||
}
|
||||
|
||||
dcb = sink->ctx->dc_bios;
|
||||
|
||||
if (BP_RESULT_OK != dcb->funcs->crtc_source_select(
|
||||
dcb,
|
||||
&crtc_source_select)) {
|
||||
|
@ -692,10 +689,10 @@ void dce110_update_info_frame(struct pipe_ctx *pipe_ctx)
|
|||
void dce110_enable_stream(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
enum dc_lane_count lane_count =
|
||||
pipe_ctx->stream->sink->link->cur_link_settings.lane_count;
|
||||
pipe_ctx->stream->link->cur_link_settings.lane_count;
|
||||
|
||||
struct dc_crtc_timing *timing = &pipe_ctx->stream->timing;
|
||||
struct dc_link *link = pipe_ctx->stream->sink->link;
|
||||
struct dc_link *link = pipe_ctx->stream->link;
|
||||
|
||||
|
||||
uint32_t active_total_with_borders;
|
||||
|
@ -1048,7 +1045,7 @@ void dce110_disable_audio_stream(struct pipe_ctx *pipe_ctx, int option)
|
|||
void dce110_disable_stream(struct pipe_ctx *pipe_ctx, int option)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
struct dc *dc = pipe_ctx->stream->ctx->dc;
|
||||
|
||||
if (dc_is_hdmi_signal(pipe_ctx->stream->signal))
|
||||
|
@ -1073,7 +1070,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
|
|||
{
|
||||
struct encoder_unblank_param params = { { 0 } };
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
|
||||
/* only 3 items below are used by unblank */
|
||||
params.pixel_clk_khz =
|
||||
|
@ -1090,7 +1087,7 @@ void dce110_unblank_stream(struct pipe_ctx *pipe_ctx,
|
|||
void dce110_blank_stream(struct pipe_ctx *pipe_ctx)
|
||||
{
|
||||
struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
struct dc_link *link = stream->sink->link;
|
||||
struct dc_link *link = stream->link;
|
||||
|
||||
if (link->local_sink && link->local_sink->sink_signal == SIGNAL_TYPE_EDP) {
|
||||
link->dc->hwss.edp_backlight_control(link, false);
|
||||
|
@ -1408,7 +1405,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(
|
|||
|
||||
pipe_ctx->plane_res.scl_data.lb_params.alpha_en = pipe_ctx->bottom_pipe != 0;
|
||||
|
||||
pipe_ctx->stream->sink->link->psr_enabled = false;
|
||||
pipe_ctx->stream->link->psr_enabled = false;
|
||||
|
||||
return DC_OK;
|
||||
}
|
||||
|
@ -1813,18 +1810,15 @@ static bool should_enable_fbc(struct dc *dc,
|
|||
if (i == dc->res_pool->pipe_count)
|
||||
return false;
|
||||
|
||||
if (!pipe_ctx->stream->sink)
|
||||
return false;
|
||||
|
||||
if (!pipe_ctx->stream->sink->link)
|
||||
if (!pipe_ctx->stream->link)
|
||||
return false;
|
||||
|
||||
/* Only supports eDP */
|
||||
if (pipe_ctx->stream->sink->link->connector_signal != SIGNAL_TYPE_EDP)
|
||||
if (pipe_ctx->stream->link->connector_signal != SIGNAL_TYPE_EDP)
|
||||
return false;
|
||||
|
||||
/* PSR should not be enabled */
|
||||
if (pipe_ctx->stream->sink->link->psr_enabled)
|
||||
if (pipe_ctx->stream->link->psr_enabled)
|
||||
return false;
|
||||
|
||||
/* Nothing to compress */
|
||||
|
|
|
@ -780,7 +780,7 @@ static void get_pixel_clock_parameters(
|
|||
* in pll_adjust_pix_clk
|
||||
*/
|
||||
pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz;
|
||||
pixel_clk_params->encoder_object_id = stream->sink->link->link_enc->id;
|
||||
pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
|
||||
pixel_clk_params->signal_type = pipe_ctx->stream->signal;
|
||||
pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
|
||||
/* TODO: un-hardcode*/
|
||||
|
|
|
@ -763,7 +763,7 @@ static struct clock_source *find_matching_pll(
|
|||
const struct resource_pool *pool,
|
||||
const struct dc_stream_state *const stream)
|
||||
{
|
||||
switch (stream->sink->link->link_enc->transmitter) {
|
||||
switch (stream->link->link_enc->transmitter) {
|
||||
case TRANSMITTER_UNIPHY_A:
|
||||
return pool->clock_sources[DCE112_CLK_SRC_PLL0];
|
||||
case TRANSMITTER_UNIPHY_B:
|
||||
|
|
|
@ -2524,7 +2524,7 @@ static void dcn10_config_stereo_parameters(
|
|||
timing_3d_format == TIMING_3D_FORMAT_DP_HDMI_INBAND_FA ||
|
||||
timing_3d_format == TIMING_3D_FORMAT_SIDEBAND_FA) {
|
||||
enum display_dongle_type dongle = \
|
||||
stream->sink->link->ddc->dongle_type;
|
||||
stream->link->ddc->dongle_type;
|
||||
if (dongle == DISPLAY_DONGLE_DP_VGA_CONVERTER ||
|
||||
dongle == DISPLAY_DONGLE_DP_DVI_CONVERTER ||
|
||||
dongle == DISPLAY_DONGLE_DP_HDMI_CONVERTER)
|
||||
|
|
|
@ -738,7 +738,7 @@ bool dcn10_link_encoder_validate_output_with_stream(
|
|||
case SIGNAL_TYPE_DVI_DUAL_LINK:
|
||||
is_valid = dcn10_link_encoder_validate_dvi_output(
|
||||
enc10,
|
||||
stream->sink->link->connector_signal,
|
||||
stream->link->connector_signal,
|
||||
stream->signal,
|
||||
&stream->timing);
|
||||
break;
|
||||
|
|
|
@ -975,7 +975,7 @@ static void get_pixel_clock_parameters(
|
|||
{
|
||||
const struct dc_stream_state *stream = pipe_ctx->stream;
|
||||
pixel_clk_params->requested_pix_clk = stream->timing.pix_clk_khz;
|
||||
pixel_clk_params->encoder_object_id = stream->sink->link->link_enc->id;
|
||||
pixel_clk_params->encoder_object_id = stream->link->link_enc->id;
|
||||
pixel_clk_params->signal_type = pipe_ctx->stream->signal;
|
||||
pixel_clk_params->controller_id = pipe_ctx->stream_res.tg->inst + 1;
|
||||
/* TODO: un-hardcode*/
|
||||
|
|
Loading…
Reference in New Issue