aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0681-drm-amd-dal-virtual-link-and-sink-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0681-drm-amd-dal-virtual-link-and-sink-support.patch')
-rw-r--r--common/recipes-kernel/linux/files/0681-drm-amd-dal-virtual-link-and-sink-support.patch667
1 files changed, 0 insertions, 667 deletions
diff --git a/common/recipes-kernel/linux/files/0681-drm-amd-dal-virtual-link-and-sink-support.patch b/common/recipes-kernel/linux/files/0681-drm-amd-dal-virtual-link-and-sink-support.patch
deleted file mode 100644
index 41509b3c..00000000
--- a/common/recipes-kernel/linux/files/0681-drm-amd-dal-virtual-link-and-sink-support.patch
+++ /dev/null
@@ -1,667 +0,0 @@
-From d2375cf918a6a0fe2d6dce2b480e8e094ab2d074 Mon Sep 17 00:00:00 2001
-From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
-Date: Thu, 7 Jan 2016 18:09:48 -0500
-Subject: [PATCH 0681/1110] drm/amd/dal: virtual link and sink support
-
-Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
-Acked-by: Jordan Lazare <Jordan.Lazare@amd.com>
----
- .../drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c | 4 +-
- .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 2 +
- drivers/gpu/drm/amd/dal/dc/core/dc.c | 44 +++++++++-------
- drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 16 +++---
- drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c | 10 ++--
- drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c | 2 +-
- drivers/gpu/drm/amd/dal/dc/core/dc_resource.c | 5 +-
- drivers/gpu/drm/amd/dal/dc/core/dc_sink.c | 12 ++---
- drivers/gpu/drm/amd/dal/dc/core/dc_target.c | 4 +-
- drivers/gpu/drm/amd/dal/dc/dc.h | 6 ++-
- .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 58 +++++++++++-----------
- .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c | 14 ++++--
- .../drm/amd/dal/dc/dce_base/dce_base_resource.c | 26 ++++++----
- drivers/gpu/drm/amd/dal/dc/inc/core_dc.h | 2 +-
- drivers/gpu/drm/amd/dal/dc/inc/core_types.h | 7 +--
- drivers/gpu/drm/amd/dal/include/dal_types.h | 1 +
- drivers/gpu/drm/amd/dal/include/signal_types.h | 3 +-
- 17 files changed, 124 insertions(+), 92 deletions(-)
-
-diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
-index 80bd0c6..61e12ad 100644
---- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
-+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
-@@ -119,7 +119,7 @@ static struct dc_sink *dm_dp_mst_add_mst_sink(
- uint16_t len)
- {
- struct dc_sink *dc_sink;
-- struct sink_init_data init_params = {
-+ struct dc_sink_init_data init_params = {
- .link = dc_link,
- .sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST};
- enum dc_edid_status edid_status;
-@@ -139,7 +139,7 @@ static struct dc_sink *dm_dp_mst_add_mst_sink(
- * dc_link->connector_signal;
- */
-
-- dc_sink = sink_create(&init_params);
-+ dc_sink = dc_sink_create(&init_params);
-
- if (!dc_sink)
- return NULL;
-diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
-index 00a0139..7df2d28 100644
---- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
-+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
-@@ -1605,6 +1605,8 @@ static int to_drm_connector_type(enum signal_type st)
- case SIGNAL_TYPE_DVI_DUAL_LINK:
- case SIGNAL_TYPE_DVI_SINGLE_LINK:
- return DRM_MODE_CONNECTOR_DVID;
-+ case SIGNAL_TYPE_VIRTUAL:
-+ return DRM_MODE_CONNECTOR_VIRTUAL;
-
- default:
- return DRM_MODE_CONNECTOR_Unknown;
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c
-index 96ec35f..397b664 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c
-@@ -92,14 +92,6 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params)
- dal_output_to_console("%s: connectors_num:%d\n", __func__,
- connectors_num);
-
-- dc->links = dc_service_alloc(
-- init_params->ctx, connectors_num * sizeof(struct core_link *));
--
-- if (NULL == dc->links) {
-- dal_error("DC: failed to allocate 'links' storage!\n");
-- goto allocate_dc_links_storage_fail;
-- }
--
- for (i = 0; i < connectors_num; i++) {
- struct link_init_data link_init_params = {0};
- struct core_link *link;
-@@ -121,14 +113,28 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params)
- }
- }
-
-- if (!dc->link_count) {
-- dal_error("DC: no 'links' were created!\n");
-- goto allocate_dc_links_storage_fail;
-+ for (i = 0; i < init_params->num_virtual_links; i++) {
-+ struct core_link *link =
-+ dc_service_alloc(dc->ctx, sizeof(*link));
-+
-+ if (link == NULL) {
-+ BREAK_TO_DEBUGGER();
-+ goto failed_alloc;
-+ }
-+
-+ link->adapter_srv = init_params->adapter_srv;
-+ link->ctx = init_params->ctx;
-+ link->dc = dc;
-+ link->public.connector_signal = SIGNAL_TYPE_VIRTUAL;
-+
-+ link->public.link_index = dc->link_count;
-+ dc->links[dc->link_count] = link;
-+ dc->link_count++;
- }
-
- return true;
-
--allocate_dc_links_storage_fail:
-+failed_alloc:
- return false;
- }
-
-@@ -165,7 +171,8 @@ static void init_hw(struct dc *dc)
- * required signal (which may be different from the
- * default signal on connector). */
- struct core_link *link = dc->links[i];
-- dc->hwss.encoder_hw_init(link->link_enc);
-+ if (link->public.connector_signal != SIGNAL_TYPE_VIRTUAL)
-+ dc->hwss.encoder_hw_init(link->link_enc);
- }
-
- for(i = 0; i < dc->res_pool.controller_count; i++) {
-@@ -291,6 +298,7 @@ static bool construct(struct dc *dc, const struct dal_init_data *init_params)
- }
- dc_init_data.ctx->driver_context = init_params->driver;
- dc_init_data.ctx->cgs_device = init_params->cgs_device;
-+ dc_init_data.num_virtual_links = init_params->num_virtual_links;
- dc_init_data.ctx->dc = dc;
-
- /* Create logger */
-@@ -359,7 +367,6 @@ ctx_fail:
- static void destruct(struct dc *dc)
- {
- destroy_links(dc);
-- dc_service_free(dc->ctx, dc->links);
- dc->hwss.destruct_resource_pool(&dc->res_pool);
- dal_logger_destroy(&dc->ctx->logger);
- dc_service_free(dc->ctx, dc->ctx);
-@@ -623,9 +630,9 @@ const struct audio **dc_get_audios(struct dc *dc)
-
- void dc_get_caps(const struct dc *dc, struct dc_caps *caps)
- {
-- caps->max_targets = dc->res_pool.controller_count;
-- caps->max_links = dc->link_count;
-- caps->max_audios = dc->res_pool.audio_count;
-+ caps->max_targets = dc->res_pool.controller_count;
-+ caps->max_links = dc->link_count;
-+ caps->max_audios = dc->res_pool.audio_count;
- }
-
- void dc_flip_surface_addrs(struct dc* dc,
-@@ -843,6 +850,9 @@ bool dc_link_add_sink(const struct dc_link *link, struct dc_sink *sink)
-
- dc_link->sink[link->sink_count] = sink;
- dc_link->sink_count++;
-+ if (sink->sink_signal == SIGNAL_TYPE_VIRTUAL
-+ && link->connector_signal == SIGNAL_TYPE_VIRTUAL)
-+ dc_link->type = dc_connection_single;
-
- return true;
- }
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
-index 794465e..2ef0451 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
-@@ -553,7 +553,7 @@ static void dc_link_detect_dp(
- void dc_link_detect(const struct dc_link *dc_link)
- {
- struct core_link *link = DC_LINK_TO_LINK(dc_link);
-- struct sink_init_data sink_init_data = { 0 };
-+ struct dc_sink_init_data sink_init_data = { 0 };
- struct display_sink_capability sink_caps = { 0 };
- uint8_t i;
- bool converter_disable_audio = false;
-@@ -566,6 +566,9 @@ void dc_link_detect(const struct dc_link *dc_link)
- struct core_sink *sink = NULL;
- enum dc_connection_type new_connection_type = dc_connection_none;
-
-+ if (link->public.connector_signal == SIGNAL_TYPE_VIRTUAL)
-+ return;
-+
- if (false == detect_sink(link, &new_connection_type)) {
- BREAK_TO_DEBUGGER();
- return;
-@@ -647,7 +650,7 @@ void dc_link_detect(const struct dc_link *dc_link)
- sink_init_data.converter_disable_audio =
- converter_disable_audio;
-
-- dc_sink = sink_create(&sink_init_data);
-+ dc_sink = dc_sink_create(&sink_init_data);
- if (!dc_sink) {
- DC_ERROR("Failed to create sink!\n");
- return;
-@@ -835,7 +838,6 @@ static bool construct(
-
- link->dc = init_params->dc;
- link->adapter_srv = as;
-- link->connector_index = init_params->connector_index;
- link->ctx = dc_ctx;
- link->public.link_index = init_params->link_index;
-
-@@ -994,7 +996,6 @@ struct core_link *link_create(const struct link_init_data *init_params)
- {
- struct core_link *link =
- dc_service_alloc(init_params->ctx, sizeof(*link));
-- link->ctx = init_params->ctx;
-
- if (NULL == link)
- goto alloc_fail;
-@@ -1063,9 +1064,9 @@ static void dpcd_configure_panel_mode(
- }
- dal_logger_write(link->ctx->logger, LOG_MAJOR_DETECTION,
- LOG_MINOR_DETECTION_DP_CAPS,
-- "Connector: %d eDP panel mode supported: %d "
-+ "Link: %d eDP panel mode supported: %d "
- "eDP panel mode enabled: %d \n",
-- link->connector_index,
-+ link->public.link_index,
- link->dpcd_caps.panel_mode_edp,
- panel_mode_edp);
- }
-@@ -1268,7 +1269,8 @@ bool dc_link_set_backlight_level(const struct dc_link *public, uint32_t level)
-
- void core_link_resume(struct core_link *link)
- {
-- program_hpd_filter(link);
-+ if (link->public.connector_signal != SIGNAL_TYPE_VIRTUAL)
-+ program_hpd_filter(link);
- }
-
- static struct fixed31_32 get_pbn_per_slot(struct core_stream *stream)
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
-index 787091f..4c17ff1 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
-@@ -1404,8 +1404,8 @@ bool dc_link_handle_hpd_rx_irq(const struct dc_link *dc_link)
- dal_logger_write(link->ctx->logger,
- LOG_MAJOR_HW_TRACE,
- LOG_MINOR_HW_TRACE_HPD_IRQ,
-- "%s: Got short pulse HPD on connector %d\n",
-- __func__, link->connector_index);
-+ "%s: Got short pulse HPD on link %d\n",
-+ __func__, link->public.link_index);
-
- /* All the "handle_hpd_irq_xxx()" methods
- * should be called only after
-@@ -1582,16 +1582,16 @@ static void dp_wa_power_up_0010FA(struct core_link *link, uint8_t *dpcd_data,
- * keep receiver powered all the time.*/
- case DP_BRANCH_DEVICE_ID_1:
- case DP_BRANCH_DEVICE_ID_4:
-- link->dp_wa.bits.KEEP_RECEIVER_POWERED = 1;
-+ link->wa_flags.dp_keep_receiver_powered = true;
- break;
-
- /* TODO: May need work around for other dongles. */
- default:
-- link->dp_wa.bits.KEEP_RECEIVER_POWERED = 0;
-+ link->wa_flags.dp_keep_receiver_powered = false;
- break;
- }
- } else
-- link->dp_wa.bits.KEEP_RECEIVER_POWERED = 0;
-+ link->wa_flags.dp_keep_receiver_powered = false;
- }
-
- static void retrieve_link_cap(struct core_link *link)
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
-index 27acac8..e9ae9e1 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
-@@ -72,7 +72,7 @@ void dp_enable_link_phy(
-
- void dp_disable_link_phy(struct core_link *link, enum signal_type signal)
- {
-- if (!link->dp_wa.bits.KEEP_RECEIVER_POWERED)
-+ if (!link->wa_flags.dp_keep_receiver_powered)
- dp_receiver_power_ctrl(link, false);
-
- link->dc->hwss.encoder_disable_output(link->link_enc, signal);
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
-index 1ad317a..557f918 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
-@@ -457,8 +457,11 @@ static void fill_display_configs(
- cfg->src_width = stream->public.src.width;
- cfg->ddi_channel_mapping =
- stream->sink->link->ddi_channel_mapping.raw;
-- cfg->transmitter =
-+ if (stream->signal != SIGNAL_TYPE_VIRTUAL)
-+ cfg->transmitter =
- stream->sink->link->link_enc->transmitter;
-+ else
-+ cfg->transmitter = TRANSMITTER_UNKNOWN;
- cfg->link_settings =
- stream->sink->link->cur_link_settings;
- cfg->sym_clock = stream->public.timing.pix_clk_khz;
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_sink.c b/drivers/gpu/drm/amd/dal/dc/core/dc_sink.c
-index 3d537d5..608fb99 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc_sink.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_sink.c
-@@ -48,7 +48,7 @@ static void destruct(struct sink *sink)
-
- }
-
--static bool construct(struct sink *sink, const struct sink_init_data *init_params)
-+static bool construct(struct sink *sink, const struct dc_sink_init_data *init_params)
- {
-
- struct core_link *core_link = DC_LINK_TO_LINK(init_params->link);
-@@ -87,12 +87,7 @@ void dc_sink_release(const struct dc_sink *dc_sink)
- }
- }
-
--
--/*******************************************************************************
-- * Protected functions - visible only inside of DC (not visible in DM)
-- ******************************************************************************/
--
--struct dc_sink *sink_create(const struct sink_init_data *init_params)
-+struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params)
- {
- struct core_link *core_link = DC_LINK_TO_LINK(init_params->link);
-
-@@ -116,3 +111,6 @@ alloc_fail:
- return NULL;
- }
-
-+/*******************************************************************************
-+ * Protected functions - visible only inside of DC (not visible in DM)
-+ ******************************************************************************/
-diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c
-index 31374ab..b8420bf 100644
---- a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c
-+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c
-@@ -497,7 +497,7 @@ void dc_target_log(
- dal_logger_write(dal_logger,
- log_major,
- log_minor,
-- "\tconnector: %d",
-- core_stream->sink->link->connector_index);
-+ "\tlink: %d",
-+ core_stream->sink->link->public.link_index);
- }
- }
-diff --git a/drivers/gpu/drm/amd/dal/dc/dc.h b/drivers/gpu/drm/amd/dal/dc/dc.h
-index 007fdc4..bcfd96d 100644
---- a/drivers/gpu/drm/amd/dal/dc/dc.h
-+++ b/drivers/gpu/drm/amd/dal/dc/dc.h
-@@ -40,6 +40,7 @@
- struct dc_init_data {
- struct dc_context *ctx;
- struct adapter_service *adapter_srv;
-+ uint8_t num_virtual_links;
- };
-
- struct dc_caps {
-@@ -311,6 +312,7 @@ void dc_link_remove_sink(
- const struct dc_link *link,
- const struct dc_sink *sink);
-
-+
- /*******************************************************************************
- * Sink Interfaces - A sink corresponds to a display output device
- ******************************************************************************/
-@@ -329,14 +331,14 @@ void dc_sink_release(const struct dc_sink *sink);
-
- const struct audio **dc_get_audios(struct dc *dc);
-
--struct sink_init_data {
-+struct dc_sink_init_data {
- enum signal_type sink_signal;
- const struct dc_link *link;
- uint32_t dongle_max_pix_clk;
- bool converter_disable_audio;
- };
-
--struct dc_sink *sink_create(const struct sink_init_data *init_params);
-+struct dc_sink *dc_sink_create(const struct dc_sink_init_data *init_params);
-
-
- /*******************************************************************************
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
-index 0d8b050..4f37282 100644
---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
-+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
-@@ -802,8 +802,8 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
- */
- stream->tg->funcs->set_blank(stream->tg, true);
-
-- core_link_disable_stream(
-- stream->sink->link, stream);
-+ if (stream->signal != SIGNAL_TYPE_VIRTUAL)
-+ core_link_disable_stream(stream->sink->link, stream);
-
- /*TODO: AUTO check if timing changed*/
- if (false == dal_clock_source_program_pix_clk(
-@@ -822,9 +822,10 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
- }
-
- /*TODO: mst support - use total stream count*/
-- dce110_mem_input_allocate_dmif_buffer(stream->mi,
-- &stream->public.timing,
-- context->target_count);
-+ dce110_mem_input_allocate_dmif_buffer(
-+ stream->mi,
-+ &stream->public.timing,
-+ context->target_count);
-
- if (timing_changed) {
- if (false == stream->tg->funcs->enable_crtc(
-@@ -834,10 +835,11 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
- }
- }
-
-- if (DC_OK != bios_parser_crtc_source_select(stream)) {
-- BREAK_TO_DEBUGGER();
-- return DC_ERROR_UNEXPECTED;
-- }
-+ if (stream->signal != SIGNAL_TYPE_VIRTUAL)
-+ if (DC_OK != bios_parser_crtc_source_select(stream)) {
-+ BREAK_TO_DEBUGGER();
-+ return DC_ERROR_UNEXPECTED;
-+ }
-
- dce110_opp_set_dyn_expansion(
- opp,
-@@ -845,14 +847,12 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
- stream->public.timing.display_color_depth,
- stream->sink->public.sink_signal);
-
-- program_fmt(
-- opp,
-- &stream->fmt_bit_depth,
-- &stream->clamping);
-+ program_fmt(opp, &stream->fmt_bit_depth, &stream->clamping);
-
-- dce110_link_encoder_setup(
-- stream->sink->link->link_enc,
-- stream->signal);
-+ if (stream->signal != SIGNAL_TYPE_VIRTUAL)
-+ dce110_link_encoder_setup(
-+ stream->sink->link->link_enc,
-+ stream->signal);
-
- if (dc_is_dp_signal(stream->signal))
- stream->stream_enc->funcs->dp_set_stream_attribute(
-@@ -861,16 +861,16 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
-
- if (dc_is_hdmi_signal(stream->signal))
- stream->stream_enc->funcs->hdmi_set_stream_attribute(
-- stream->stream_enc,
-- &stream->public.timing,
-- stream->audio != NULL);
-+ stream->stream_enc,
-+ &stream->public.timing,
-+ stream->audio != NULL);
-
- if (dc_is_dvi_signal(stream->signal))
- stream->stream_enc->funcs->dvi_set_stream_attribute(
-- stream->stream_enc,
-- &stream->public.timing,
-- (stream->signal == SIGNAL_TYPE_DVI_DUAL_LINK) ?
-- true : false);
-+ stream->stream_enc,
-+ &stream->public.timing,
-+ (stream->signal == SIGNAL_TYPE_DVI_DUAL_LINK) ?
-+ true : false);
-
- if (stream->audio != NULL) {
- if (AUDIO_RESULT_OK != dal_audio_setup(
-@@ -891,14 +891,12 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
- &stream->audio_output.pll_info);
-
- /* program blank color */
-- color_space = get_output_color_space(
-- &stream->public.timing);
--
-+ color_space = get_output_color_space(&stream->public.timing);
- stream->tg->funcs->set_blank_color(
- context->res_ctx.pool.timing_generators[controller_idx],
- color_space);
-
-- if (timing_changed) {
-+ if (timing_changed && stream->signal != SIGNAL_TYPE_VIRTUAL) {
- core_link_enable_stream(stream->sink->link, stream);
- } else {
- core_link_update_stream(stream->sink->link, stream);
-@@ -918,7 +916,8 @@ static void power_down_encoders(struct dc *dc)
- int i;
-
- for (i = 0; i < dc->link_count; i++) {
-- dce110_link_encoder_disable_output(
-+ if (dc->links[i]->public.connector_signal != SIGNAL_TYPE_VIRTUAL)
-+ dce110_link_encoder_disable_output(
- dc->links[i]->link_enc, SIGNAL_TYPE_NONE);
- }
- }
-@@ -1571,7 +1570,8 @@ static void reset_single_stream_hw_ctx(struct core_stream *stream,
- stream->audio = NULL;
- }
-
-- core_link_disable_stream(stream->sink->link, stream);
-+ if (stream->signal != SIGNAL_TYPE_VIRTUAL)
-+ core_link_disable_stream(stream->sink->link, stream);
-
- stream->tg->funcs->set_blank(stream->tg, true);
- stream->tg->funcs->disable_crtc(stream->tg);
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
-index 266b761..f3610b4 100644
---- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
-+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
-@@ -528,14 +528,17 @@ static enum dc_status validate_mapped_resource(
- DC_STREAM_TO_CORE(target->public.streams[j]);
- struct core_link *link = stream->sink->link;
-
-- status = build_stream_hw_param(stream);
-+ if (!stream->tg->funcs->validate_timing(
-+ stream->tg, &stream->public.timing))
-+ return DC_FAIL_CONTROLLER_VALIDATE;
-
-- if (status != DC_OK)
-+ if (stream->signal == SIGNAL_TYPE_VIRTUAL)
- return status;
-
-- if (!stream->tg->funcs->validate_timing(stream->tg, &stream->public.timing))
-- return DC_FAIL_CONTROLLER_VALIDATE;
-+ status = build_stream_hw_param(stream);
-
-+ if (status != DC_OK)
-+ return status;
-
- if (!dce110_link_encoder_validate_output_with_stream(
- link->link_enc,
-@@ -781,7 +784,8 @@ static enum dc_status map_clock_resources(
- struct core_stream *stream =
- DC_STREAM_TO_CORE(target->public.streams[j]);
-
-- if (dc_is_dp_signal(stream->signal))
-+ if (dc_is_dp_signal(stream->signal)
-+ || stream->signal == SIGNAL_TYPE_VIRTUAL)
- stream->clock_source = context->res_ctx.
- pool.clock_sources[DCE110_CLK_SRC_EXT];
- else
-diff --git a/drivers/gpu/drm/amd/dal/dc/dce_base/dce_base_resource.c b/drivers/gpu/drm/amd/dal/dc/dce_base/dce_base_resource.c
-index 1b091be..85cff3b 100644
---- a/drivers/gpu/drm/amd/dal/dc/dce_base/dce_base_resource.c
-+++ b/drivers/gpu/drm/amd/dal/dc/dce_base/dce_base_resource.c
-@@ -227,6 +227,23 @@ enum dc_status dce_base_map_resources(
-
- attach_stream_to_controller(&context->res_ctx, stream);
-
-+ set_stream_signal(stream);
-+
-+ curr_stream =
-+ dc->current_context.res_ctx.controller_ctx
-+ [stream->controller_idx].stream;
-+ context->res_ctx.controller_ctx[stream->controller_idx]
-+ .flags.timing_changed =
-+ check_timing_change(curr_stream, stream);
-+
-+ /*
-+ * we do not need stream encoder or audio resources
-+ * when connecting to virtual link
-+ */
-+ if (stream->sink->link->public.connector_signal ==
-+ SIGNAL_TYPE_VIRTUAL)
-+ continue;
-+
- stream->stream_enc =
- find_first_free_match_stream_enc_for_link(
- &context->res_ctx,
-@@ -239,8 +256,6 @@ enum dc_status dce_base_map_resources(
- &context->res_ctx,
- stream->stream_enc);
-
-- set_stream_signal(stream);
--
- /* TODO: Add check if ASIC support and EDID audio */
- if (!stream->sink->converter_disable_audio &&
- dc_is_audio_capable_signal(
-@@ -254,13 +269,6 @@ enum dc_status dce_base_map_resources(
- set_audio_in_use(&context->res_ctx,
- stream->audio);
- }
-- curr_stream =
-- dc->current_context.res_ctx.controller_ctx
-- [stream->controller_idx].stream;
-- context->res_ctx.controller_ctx[stream->controller_idx]
-- .flags.timing_changed =
-- check_timing_change(curr_stream, stream);
--
- }
- }
-
-diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h b/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h
-index 66f7544..9d62a24 100644
---- a/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h
-+++ b/drivers/gpu/drm/amd/dal/dc/inc/core_dc.h
-@@ -17,7 +17,7 @@ struct dc {
-
- /** link-related data - begin **/
- uint8_t link_count;
-- struct core_link **links;
-+ struct core_link *links[MAX_PIPES * 2];
- /** link-related data - end **/
-
- /* TODO: determine max number of targets*/
-diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
-index 5f918c1..192399b 100644
---- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
-+++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
-@@ -202,8 +202,6 @@ struct core_link {
-
- struct dc_context *ctx; /* TODO: AUTO remove 'dal' when DC is complete*/
-
-- uint8_t connector_index; /* this will be mapped to the HPD pins */
--
- struct adapter_service *adapter_srv;
- struct link_encoder *link_enc;
- struct ddc_service *ddc;
-@@ -221,10 +219,13 @@ struct core_link {
- unsigned int dpcd_sink_count;
-
- enum edp_revision edp_revision;
-- union dp_wa dp_wa;
-
- /* MST record stream using this link */
- struct dp_mst_stream_allocation_table stream_alloc_table;
-+
-+ struct link_flags {
-+ bool dp_keep_receiver_powered;
-+ } wa_flags;
- };
-
- #define DC_LINK_TO_LINK(dc_link) container_of(dc_link, struct core_link, public)
-diff --git a/drivers/gpu/drm/amd/dal/include/dal_types.h b/drivers/gpu/drm/amd/dal/include/dal_types.h
-index 5539c19..5ec4784 100644
---- a/drivers/gpu/drm/amd/dal/include/dal_types.h
-+++ b/drivers/gpu/drm/amd/dal/include/dal_types.h
-@@ -136,6 +136,7 @@ struct dal_init_data {
- struct dal_override_parameters display_param;
- void *driver; /* ctx */
- void *cgs_device;
-+ uint8_t num_virtual_links;
- };
-
- struct dal_dc_init_data {
-diff --git a/drivers/gpu/drm/amd/dal/include/signal_types.h b/drivers/gpu/drm/amd/dal/include/signal_types.h
-index e95e821..a50f7ed 100644
---- a/drivers/gpu/drm/amd/dal/include/signal_types.h
-+++ b/drivers/gpu/drm/amd/dal/include/signal_types.h
-@@ -37,8 +37,9 @@ enum signal_type {
- SIGNAL_TYPE_DISPLAY_PORT_MST = (1 << 6),
- SIGNAL_TYPE_EDP = (1 << 7),
- SIGNAL_TYPE_WIRELESS = (1 << 8), /* Wireless Display */
-+ SIGNAL_TYPE_VIRTUAL = (1 << 9), /* Virtual Display */
-
-- SIGNAL_TYPE_COUNT = 9,
-+ SIGNAL_TYPE_COUNT = 10,
- SIGNAL_TYPE_ALL = (1 << SIGNAL_TYPE_COUNT) - 1
- };
-
---
-2.7.4
-