aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0715-drm-amd-dal-add-virtual-link-and-stream-encoders.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0715-drm-amd-dal-add-virtual-link-and-stream-encoders.patch')
-rw-r--r--common/recipes-kernel/linux/files/0715-drm-amd-dal-add-virtual-link-and-stream-encoders.patch799
1 files changed, 799 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0715-drm-amd-dal-add-virtual-link-and-stream-encoders.patch b/common/recipes-kernel/linux/files/0715-drm-amd-dal-add-virtual-link-and-stream-encoders.patch
new file mode 100644
index 00000000..b49a65d2
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0715-drm-amd-dal-add-virtual-link-and-stream-encoders.patch
@@ -0,0 +1,799 @@
+From fd5a57c67269301e7441f4e3acff12bd42d1bf2f Mon Sep 17 00:00:00 2001
+From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Date: Thu, 21 Jan 2016 11:38:21 -0500
+Subject: [PATCH 0715/1110] drm/amd/dal: add virtual link and stream encoders
+
+Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+---
+ drivers/gpu/drm/amd/dal/dc/Makefile | 2 +-
+ .../gpu/drm/amd/dal/dc/bios/command_table_helper.c | 1 +
+ drivers/gpu/drm/amd/dal/dc/core/dc.c | 37 ++++--
+ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 7 +-
+ drivers/gpu/drm/amd/dal/dc/core/dc_resource.c | 13 +-
+ drivers/gpu/drm/amd/dal/dc/dc.h | 2 +-
+ .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c | 20 ++--
+ .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c | 18 ++-
+ .../gpu/drm/amd/dal/dc/dce110/dce110_resource.h | 1 +
+ drivers/gpu/drm/amd/dal/dc/inc/core_types.h | 4 +-
+ drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h | 1 +
+ drivers/gpu/drm/amd/dal/dc/virtual/Makefile | 9 ++
+ .../drm/amd/dal/dc/virtual/virtual_link_encoder.c | 131 +++++++++++++++++++++
+ .../drm/amd/dal/dc/virtual/virtual_link_encoder.h | 35 ++++++
+ .../amd/dal/dc/virtual/virtual_stream_encoder.c | 124 +++++++++++++++++++
+ .../amd/dal/dc/virtual/virtual_stream_encoder.h | 39 ++++++
+ drivers/gpu/drm/amd/dal/include/grph_object_id.h | 6 +-
+ 17 files changed, 406 insertions(+), 44 deletions(-)
+ create mode 100644 drivers/gpu/drm/amd/dal/dc/virtual/Makefile
+ create mode 100644 drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c
+ create mode 100644 drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.h
+ create mode 100644 drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.c
+ create mode 100644 drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.h
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/Makefile b/drivers/gpu/drm/amd/dal/dc/Makefile
+index 05d8ce7..4396203 100644
+--- a/drivers/gpu/drm/amd/dal/dc/Makefile
++++ b/drivers/gpu/drm/amd/dal/dc/Makefile
+@@ -3,7 +3,7 @@
+ #
+
+ DC_LIBS = adapter asic_capability audio basics bios calcs \
+-dcs gpio gpu i2caux irq
++dcs gpio gpu i2caux irq virtual
+
+ ifdef CONFIG_DRM_AMD_DAL_DCE11_0
+ DC_LIBS += dce110
+diff --git a/drivers/gpu/drm/amd/dal/dc/bios/command_table_helper.c b/drivers/gpu/drm/amd/dal/dc/bios/command_table_helper.c
+index e0407f4..83a80d5 100644
+--- a/drivers/gpu/drm/amd/dal/dc/bios/command_table_helper.c
++++ b/drivers/gpu/drm/amd/dal/dc/bios/command_table_helper.c
+@@ -311,6 +311,7 @@ uint8_t dal_cmd_table_helper_encoder_id_to_atom(
+ return ENCODER_OBJECT_ID_INTERNAL_VCE;
+ case ENCODER_ID_EXTERNAL_GENERIC_DVO:
+ return ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO;
++ case ENCODER_ID_INTERNAL_VIRTUAL:
+ case ENCODER_ID_UNKNOWN:
+ return ENCODER_OBJECT_ID_NONE;
+ default:
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+index d953784..71df979 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+@@ -40,6 +40,7 @@
+ #include "bandwidth_calcs.h"
+ #include "include/irq_service_interface.h"
+ #include "inc/transform.h"
++#include "../virtual/virtual_link_encoder.h"
+
+ #include "link_hwss.h"
+ #include "link_encoder.h"
+@@ -125,6 +126,7 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params)
+ for (i = 0; i < init_params->num_virtual_links; i++) {
+ struct core_link *link =
+ dc_service_alloc(dc->ctx, sizeof(*link));
++ struct encoder_init_data enc_init = { 0 };
+
+ if (link == NULL) {
+ BREAK_TO_DEBUGGER();
+@@ -135,6 +137,22 @@ static bool create_links(struct dc *dc, const struct dc_init_data *init_params)
+ link->ctx = init_params->ctx;
+ link->dc = dc;
+ link->public.connector_signal = SIGNAL_TYPE_VIRTUAL;
++ link->link_id.type = OBJECT_TYPE_CONNECTOR;
++ link->link_id.id = CONNECTOR_ID_VIRTUAL;
++ link->link_id.enum_id = ENUM_ID_1;
++ link->link_enc =
++ dc_service_alloc(dc->ctx, sizeof(*link->link_enc));
++
++ enc_init.adapter_service = init_params->adapter_srv;
++ enc_init.ctx = init_params->ctx;
++ enc_init.channel = CHANNEL_ID_UNKNOWN;
++ enc_init.hpd_source = HPD_SOURCEID_UNKNOWN;
++ enc_init.transmitter = TRANSMITTER_UNKNOWN;
++ enc_init.connector = link->link_id;
++ enc_init.encoder.type = OBJECT_TYPE_ENCODER;
++ enc_init.encoder.id = ENCODER_ID_INTERNAL_VIRTUAL;
++ enc_init.encoder.enum_id = ENUM_ID_1;
++ virtual_link_encoder_construct(link->link_enc, &enc_init);
+
+ link->public.link_index = dc->link_count;
+ dc->links[dc->link_count] = link;
+@@ -180,8 +198,7 @@ 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];
+- if (link->public.connector_signal != SIGNAL_TYPE_VIRTUAL)
+- link->link_enc->funcs->hw_init(link->link_enc);
++ link->link_enc->funcs->hw_init(link->link_enc);
+ }
+
+ for(i = 0; i < dc->res_pool.controller_count; i++) {
+@@ -355,6 +372,7 @@ static bool construct(struct dc *dc, const struct dal_init_data *init_params)
+
+ if (!dc->hwss.construct_resource_pool(
+ dc_init_data.adapter_srv,
++ dc_init_data.num_virtual_links,
+ dc,
+ &dc->res_pool))
+ goto construct_resource_fail;
+@@ -866,23 +884,24 @@ bool dc_link_add_remote_sink(const struct dc_link *link, struct dc_sink *sink)
+
+ dc_link->remote_sinks[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;
+ }
+
+-void dc_link_add_sink(const struct dc_link *link, struct dc_sink *sink)
++void dc_link_set_sink(const struct dc_link *link, struct dc_sink *sink)
+ {
+ struct core_link *core_link = DC_LINK_TO_LINK(link);
+ struct dc_link *dc_link = &core_link->public;
+
+ dc_link->local_sink = sink;
+- dc_link->sink_count = 1;
+- if (sink->sink_signal == SIGNAL_TYPE_VIRTUAL
+- && link->connector_signal == SIGNAL_TYPE_VIRTUAL)
++
++ if (sink == NULL) {
++ dc_link->sink_count = 0;
++ dc_link->type = dc_connection_none;
++ } else {
++ dc_link->sink_count = 1;
+ dc_link->type = dc_connection_single;
++ }
+ }
+
+ void dc_link_remove_remote_sink(const struct dc_link *link, const struct dc_sink *sink)
+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 3f6a7bb..912f3fe 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+@@ -1228,7 +1228,7 @@ static void enable_link_hdmi(struct core_stream *stream)
+ /****************************enable_link***********************************/
+ static enum dc_status enable_link(struct core_stream *stream)
+ {
+- enum dc_status status;
++ enum dc_status status = DC_ERROR_UNEXPECTED;
+ switch (stream->signal) {
+ case SIGNAL_TYPE_DISPLAY_PORT:
+ case SIGNAL_TYPE_EDP:
+@@ -1244,9 +1244,10 @@ static enum dc_status enable_link(struct core_stream *stream)
+ enable_link_hdmi(stream);
+ status = DC_OK;
+ break;
+-
++ case SIGNAL_TYPE_VIRTUAL:
++ status = DC_OK;
++ break;
+ default:
+- status = DC_ERROR_UNEXPECTED;
+ break;
+ }
+
+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 7cc4ed2..c52a1e2 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_resource.c
+@@ -457,11 +457,8 @@ static void fill_display_configs(
+ cfg->src_width = stream->public.src.width;
+ cfg->ddi_channel_mapping =
+ stream->sink->link->ddi_channel_mapping.raw;
+- if (stream->signal != SIGNAL_TYPE_VIRTUAL)
+- cfg->transmitter =
++ 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;
+@@ -745,14 +742,6 @@ enum dc_status map_resources(
+ .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,
+diff --git a/drivers/gpu/drm/amd/dal/dc/dc.h b/drivers/gpu/drm/amd/dal/dc/dc.h
+index c541ecf..a06a8a7 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dc.h
++++ b/drivers/gpu/drm/amd/dal/dc/dc.h
+@@ -318,7 +318,7 @@ void dc_link_remove_remote_sink(
+ const struct dc_sink *sink);
+
+ /* Used by diagnostics for virtual link at the moment */
+-void dc_link_add_sink(const struct dc_link *link, struct dc_sink *sink);
++void dc_link_set_sink(const struct dc_link *link, struct dc_sink *sink);
+
+ /*******************************************************************************
+ * Sink Interfaces - A sink corresponds to a display output device
+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 24b8824..44ad5a2 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
+@@ -806,8 +806,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+ */
+ stream->tg->funcs->set_blank(stream->tg, true);
+
+- if (stream->signal != SIGNAL_TYPE_VIRTUAL)
+- core_link_disable_stream(stream->sink->link, stream);
++ core_link_disable_stream(stream->sink->link, stream);
+
+ /*TODO: AUTO check if timing changed*/
+ if (false == dal_clock_source_program_pix_clk(
+@@ -818,7 +817,6 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+ return DC_ERROR_UNEXPECTED;
+ }
+
+-
+ stream->tg->funcs->program_timing(
+ stream->tg,
+ &stream->public.timing,
+@@ -839,6 +837,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+ }
+ }
+
++ /* TODO: move to stream encoder */
+ if (stream->signal != SIGNAL_TYPE_VIRTUAL)
+ if (DC_OK != bios_parser_crtc_source_select(stream)) {
+ BREAK_TO_DEBUGGER();
+@@ -853,10 +852,9 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+
+ program_fmt(opp, &stream->fmt_bit_depth, &stream->clamping);
+
+- if (stream->signal != SIGNAL_TYPE_VIRTUAL)
+- stream->sink->link->link_enc->funcs->setup(
+- stream->sink->link->link_enc,
+- stream->signal);
++ stream->sink->link->link_enc->funcs->setup(
++ stream->sink->link->link_enc,
++ stream->signal);
+
+ if (dc_is_dp_signal(stream->signal))
+ stream->stream_enc->funcs->dp_set_stream_attribute(
+@@ -900,7 +898,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
+ context->res_ctx.pool.timing_generators[controller_idx],
+ color_space);
+
+- if (timing_changed && stream->signal != SIGNAL_TYPE_VIRTUAL) {
++ if (timing_changed) {
+ core_link_enable_stream(stream->sink->link, stream);
+ } else {
+ core_link_update_stream(stream->sink->link, stream);
+@@ -920,8 +918,7 @@ static void power_down_encoders(struct dc *dc)
+ int i;
+
+ for (i = 0; i < dc->link_count; i++) {
+- if (dc->links[i]->public.connector_signal != SIGNAL_TYPE_VIRTUAL)
+- dc->links[i]->link_enc->funcs->disable_output(
++ dc->links[i]->link_enc->funcs->disable_output(
+ dc->links[i]->link_enc, SIGNAL_TYPE_NONE);
+ }
+ }
+@@ -1575,8 +1572,7 @@ static void reset_single_stream_hw_ctx(struct core_stream *stream,
+ stream->audio = NULL;
+ }
+
+- if (stream->signal != SIGNAL_TYPE_VIRTUAL)
+- core_link_disable_stream(stream->sink->link, stream);
++ 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 96f4423..fd8a928 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
+@@ -30,6 +30,7 @@
+ #include "resource.h"
+ #include "include/irq_service_interface.h"
+ #include "include/timing_generator_interface.h"
++#include "../virtual/virtual_stream_encoder.h"
+
+ #include "dce110/dce110_timing_generator.h"
+ #include "dce110/dce110_link_encoder.h"
+@@ -304,6 +305,7 @@ void dce110_link_encoder_destroy(struct link_encoder **enc)
+
+ bool dce110_construct_resource_pool(
+ struct adapter_service *adapter_serv,
++ uint8_t num_virtual_links,
+ struct dc *dc,
+ struct resource_pool *pool)
+ {
+@@ -459,6 +461,19 @@ bool dce110_construct_resource_pool(
+ }
+ }
+
++ for (i = 0; i < num_virtual_links; i++) {
++ pool->stream_enc[pool->stream_enc_count] =
++ virtual_stream_encoder_create(
++ dc->ctx, dal_adapter_service_get_bios_parser(
++ adapter_serv));
++ if (pool->stream_enc[pool->stream_enc_count] == NULL) {
++ BREAK_TO_DEBUGGER();
++ dal_error("DC: failed to create stream_encoder!\n");
++ goto stream_enc_create_fail;
++ }
++ pool->stream_enc_count++;
++ }
++
+ return true;
+
+ stream_enc_create_fail:
+@@ -726,9 +741,6 @@ static enum dc_status validate_mapped_resource(
+ stream->tg, &stream->public.timing))
+ return DC_FAIL_CONTROLLER_VALIDATE;
+
+- if (stream->signal == SIGNAL_TYPE_VIRTUAL)
+- return status;
+-
+ status = build_stream_hw_param(stream);
+
+ if (status != DC_OK)
+diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h
+index e47b19d..5f00a3c 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h
++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.h
+@@ -36,6 +36,7 @@ struct dc_validation_set;
+
+ bool dce110_construct_resource_pool(
+ struct adapter_service *adapter_serv,
++ uint8_t num_virtual_links,
+ struct dc *dc,
+ struct resource_pool *pool);
+
+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 192399b..f31ee42 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
+@@ -263,7 +263,7 @@ struct resource_pool {
+ struct transform *transforms[MAX_PIPES];
+ struct output_pixel_processor *opps[MAX_PIPES];
+ struct timing_generator *timing_generators[MAX_STREAMS];
+- struct stream_encoder *stream_enc[MAX_STREAMS];
++ struct stream_encoder *stream_enc[MAX_PIPES * 2];
+
+ uint8_t controller_count;
+ uint8_t stream_enc_count;
+@@ -294,7 +294,7 @@ struct resource_context {
+ struct resource_pool pool;
+ struct controller_ctx controller_ctx[MAX_PIPES];
+ union supported_stream_engines used_stream_engines;
+- bool is_stream_enc_acquired[MAX_STREAMS];
++ bool is_stream_enc_acquired[MAX_PIPES * 2];
+ bool is_audio_acquired[MAX_STREAMS];
+ uint8_t clock_source_ref_count[MAX_CLOCK_SOURCES];
+ };
+diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
+index 46721cd..0bbf9b5 100644
+--- a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
++++ b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
+@@ -106,6 +106,7 @@ struct hw_sequencer_funcs {
+ /* resource management and validation*/
+ bool (*construct_resource_pool)(
+ struct adapter_service *adapter_serv,
++ uint8_t num_virtual_links,
+ struct dc *dc,
+ struct resource_pool *pool);
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/virtual/Makefile b/drivers/gpu/drm/amd/dal/dc/virtual/Makefile
+new file mode 100644
+index 0000000..0e2cbc0
+--- /dev/null
++++ b/drivers/gpu/drm/amd/dal/dc/virtual/Makefile
+@@ -0,0 +1,9 @@
++#
++# Makefile for the virtual sub-component of DAL.
++# It provides the control and status of HW CRTC block.
++
++VIRTUAL = virtual_link_encoder.o virtual_stream_encoder.o
++
++AMD_DAL_VIRTUAL = $(addprefix $(AMDDALPATH)/dc/virtual/,$(VIRTUAL))
++
++AMD_DAL_FILES += $(AMD_DAL_VIRTUAL)
+diff --git a/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c
+new file mode 100644
+index 0000000..5fa9af8
+--- /dev/null
++++ b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.c
+@@ -0,0 +1,131 @@
++/*
++ * Copyright 2012-15 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ * Authors: AMD
++ *
++ */
++
++#include "virtual_link_encoder.h"
++
++#define VIRTUAL_MAX_PIXEL_CLK_IN_KHZ 600000
++
++static bool virtual_link_encoder_validate_output_with_stream(
++ struct link_encoder *enc,
++ struct core_stream *stream) { return true; }
++
++static void virtual_link_encoder_hw_init(struct link_encoder *enc) {}
++
++static void virtual_link_encoder_setup(
++ struct link_encoder *enc,
++ enum signal_type signal) {}
++
++static void virtual_link_encoder_enable_tmds_output(
++ struct link_encoder *enc,
++ enum clock_source_id clock_source,
++ enum dc_color_depth color_depth,
++ bool hdmi,
++ bool dual_link,
++ uint32_t pixel_clock) {}
++
++static void virtual_link_encoder_enable_dp_output(
++ struct link_encoder *enc,
++ const struct link_settings *link_settings,
++ enum clock_source_id clock_source) {}
++
++static void virtual_link_encoder_enable_dp_mst_output(
++ struct link_encoder *enc,
++ const struct link_settings *link_settings,
++ enum clock_source_id clock_source) {}
++
++static void virtual_link_encoder_disable_output(
++ struct link_encoder *link_enc,
++ enum signal_type signal) {}
++
++static void virtual_link_encoder_dp_set_lane_settings(
++ struct link_encoder *enc,
++ const struct link_training_settings *link_settings) {}
++
++static void virtual_link_encoder_dp_set_phy_pattern(
++ struct link_encoder *enc,
++ const struct encoder_set_dp_phy_pattern_param *param) {}
++
++static void virtual_link_encoder_update_mst_stream_allocation_table(
++ struct link_encoder *enc,
++ const struct dp_mst_stream_allocation_table *table) {}
++
++static void virtual_link_encoder_set_lcd_backlight_level(
++ struct link_encoder *enc,
++ uint32_t level) {}
++
++static void virtual_link_encoder_edp_backlight_control(
++ struct link_encoder *enc,
++ bool enable) {}
++
++static void virtual_link_encoder_edp_power_control(
++ struct link_encoder *enc,
++ bool power_up) {}
++
++static void virtual_link_encoder_connect_dig_be_to_fe(
++ struct link_encoder *enc,
++ enum engine_id engine,
++ bool connect) {}
++
++static struct link_encoder_funcs virtual_lnk_enc_funcs = {
++ .validate_output_with_stream =
++ virtual_link_encoder_validate_output_with_stream,
++ .hw_init = virtual_link_encoder_hw_init,
++ .setup = virtual_link_encoder_setup,
++ .enable_tmds_output = virtual_link_encoder_enable_tmds_output,
++ .enable_dp_output = virtual_link_encoder_enable_dp_output,
++ .enable_dp_mst_output = virtual_link_encoder_enable_dp_mst_output,
++ .disable_output = virtual_link_encoder_disable_output,
++ .dp_set_lane_settings = virtual_link_encoder_dp_set_lane_settings,
++ .dp_set_phy_pattern = virtual_link_encoder_dp_set_phy_pattern,
++ .update_mst_stream_allocation_table =
++ virtual_link_encoder_update_mst_stream_allocation_table,
++ .set_lcd_backlight_level = virtual_link_encoder_set_lcd_backlight_level,
++ .backlight_control = virtual_link_encoder_edp_backlight_control,
++ .power_control = virtual_link_encoder_edp_power_control,
++ .connect_dig_be_to_fe = virtual_link_encoder_connect_dig_be_to_fe
++};
++
++bool virtual_link_encoder_construct(
++ struct link_encoder *enc, const struct encoder_init_data *init_data)
++{
++ enc->funcs = &virtual_lnk_enc_funcs;
++ enc->ctx = init_data->ctx;
++ enc->id = init_data->encoder;
++
++ enc->hpd_source = init_data->hpd_source;
++ enc->connector = init_data->connector;
++
++ enc->adapter_service = init_data->adapter_service;
++
++ enc->transmitter = init_data->transmitter;
++
++ enc->features.max_pixel_clock = VIRTUAL_MAX_PIXEL_CLK_IN_KHZ;
++
++ enc->output_signals = SIGNAL_TYPE_VIRTUAL;
++
++ enc->preferred_engine = ENGINE_ID_VIRTUAL;
++
++ return true;
++}
+diff --git a/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.h b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.h
+new file mode 100644
+index 0000000..c34bd04
+--- /dev/null
++++ b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_link_encoder.h
+@@ -0,0 +1,35 @@
++/*
++ * Copyright 2012-15 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ * Authors: AMD
++ *
++ */
++
++#ifndef __DC_VIRTUAL_LINK_ENCODER_H__
++#define __DC_VIRTUAL_LINK_ENCODER_H__
++
++#include "inc/link_encoder.h"
++
++bool virtual_link_encoder_construct(
++ struct link_encoder *enc, const struct encoder_init_data *init_data);
++
++
++#endif /* __DC_VIRTUAL_LINK_ENCODER_H__ */
+diff --git a/drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.c b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.c
+new file mode 100644
+index 0000000..dcfda67
+--- /dev/null
++++ b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.c
+@@ -0,0 +1,124 @@
++/*
++ * Copyright 2012-15 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ * Authors: AMD
++ *
++ */
++
++#include "virtual_stream_encoder.h"
++#include "dc_services.h"
++
++static void virtual_stream_encoder_dp_set_stream_attribute(
++ struct stream_encoder *enc,
++ struct dc_crtc_timing *crtc_timing) {}
++
++static void virtual_stream_encoder_hdmi_set_stream_attribute(
++ struct stream_encoder *enc,
++ struct dc_crtc_timing *crtc_timing,
++ bool enable_audio) {}
++
++static void virtual_stream_encoder_dvi_set_stream_attribute(
++ struct stream_encoder *enc,
++ struct dc_crtc_timing *crtc_timing,
++ bool is_dual_link) {}
++
++static void virtual_stream_encoder_set_mst_bandwidth(
++ struct stream_encoder *enc,
++ struct fixed31_32 avg_time_slots_per_mtp) {}
++
++static void virtual_stream_encoder_update_hdmi_info_packets(
++ struct stream_encoder *enc,
++ const struct encoder_info_frame *info_frame) {}
++
++static void virtual_stream_encoder_stop_hdmi_info_packets(
++ struct stream_encoder *enc) {}
++
++static void virtual_stream_encoder_update_dp_info_packets(
++ struct stream_encoder *enc,
++ const struct encoder_info_frame *info_frame) {}
++
++static void virtual_stream_encoder_stop_dp_info_packets(
++ struct stream_encoder *enc) {}
++
++static void virtual_stream_encoder_dp_blank(
++ struct stream_encoder *enc) {}
++
++static void virtual_stream_encoder_dp_unblank(
++ struct stream_encoder *enc,
++ const struct encoder_unblank_param *param) {}
++
++static struct stream_encoder_funcs virtual_str_enc_funcs = {
++ .dp_set_stream_attribute =
++ virtual_stream_encoder_dp_set_stream_attribute,
++ .hdmi_set_stream_attribute =
++ virtual_stream_encoder_hdmi_set_stream_attribute,
++ .dvi_set_stream_attribute =
++ virtual_stream_encoder_dvi_set_stream_attribute,
++ .set_mst_bandwidth =
++ virtual_stream_encoder_set_mst_bandwidth,
++ .update_hdmi_info_packets =
++ virtual_stream_encoder_update_hdmi_info_packets,
++ .stop_hdmi_info_packets =
++ virtual_stream_encoder_stop_hdmi_info_packets,
++ .update_dp_info_packets =
++ virtual_stream_encoder_update_dp_info_packets,
++ .stop_dp_info_packets =
++ virtual_stream_encoder_stop_dp_info_packets,
++ .dp_blank =
++ virtual_stream_encoder_dp_blank,
++ .dp_unblank =
++ virtual_stream_encoder_dp_unblank,
++};
++
++bool virtual_stream_encoder_construct(
++ struct stream_encoder *enc,
++ struct dc_context *ctx,
++ struct dc_bios *bp)
++{
++ if (!enc)
++ return false;
++ if (!bp)
++ return false;
++
++ enc->funcs = &virtual_str_enc_funcs;
++ enc->ctx = ctx;
++ enc->id = ENGINE_ID_VIRTUAL;
++ enc->bp = bp;
++
++ return true;
++}
++
++struct stream_encoder *virtual_stream_encoder_create(
++ struct dc_context *ctx, struct dc_bios *bp)
++{
++ struct stream_encoder *enc = dc_service_alloc(ctx, sizeof(*enc));
++
++ if (!enc)
++ return NULL;
++
++ if (virtual_stream_encoder_construct(enc, ctx, bp))
++ return enc;
++
++ BREAK_TO_DEBUGGER();
++ dc_service_free(ctx, enc);
++ return NULL;
++}
++
+diff --git a/drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.h b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.h
+new file mode 100644
+index 0000000..dce8425
+--- /dev/null
++++ b/drivers/gpu/drm/amd/dal/dc/virtual/virtual_stream_encoder.h
+@@ -0,0 +1,39 @@
++/*
++ * Copyright 2012-15 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ * Authors: AMD
++ *
++ */
++
++#ifndef __DC_VIRTUAL_STREAM_ENCODER_H__
++#define __DC_VIRTUAL_STREAM_ENCODER_H__
++
++#include "inc/stream_encoder.h"
++
++struct stream_encoder *virtual_stream_encoder_create(
++ struct dc_context *ctx, struct dc_bios *bp);
++
++bool virtual_stream_encoder_construct(
++ struct stream_encoder *enc,
++ struct dc_context *ctx,
++ struct dc_bios *bp);
++
++#endif /* __DC_VIRTUAL_STREAM_ENCODER_H__ */
+diff --git a/drivers/gpu/drm/amd/dal/include/grph_object_id.h b/drivers/gpu/drm/amd/dal/include/grph_object_id.h
+index 1eafe7c..2f73797 100644
+--- a/drivers/gpu/drm/amd/dal/include/grph_object_id.h
++++ b/drivers/gpu/drm/amd/dal/include/grph_object_id.h
+@@ -26,6 +26,8 @@
+ #ifndef __DAL_GRPH_OBJECT_ID_H__
+ #define __DAL_GRPH_OBJECT_ID_H__
+
++#include "dal_services_types.h"
++
+ /* Types of graphics objects */
+ enum object_type {
+ OBJECT_TYPE_UNKNOWN = 0,
+@@ -160,6 +162,7 @@ enum encoder_id {
+
+ ENCODER_ID_INTERNAL_WIRELESS, /* Internal wireless display encoder */
+ ENCODER_ID_INTERNAL_UNIPHY3,
++ ENCODER_ID_INTERNAL_VIRTUAL,
+
+ ENCODER_ID_EXTERNAL_GENERIC_DVO = 0xFF
+ };
+@@ -183,7 +186,7 @@ enum connector_id {
+ CONNECTOR_ID_WIRELESS = 22,
+ CONNECTOR_ID_MIRACAST = 23,
+
+- CONNECTOR_ID_COUNT
++ CONNECTOR_ID_VIRTUAL = 100
+ };
+
+
+@@ -207,6 +210,7 @@ enum engine_id {
+ ENGINE_ID_DACA,
+ ENGINE_ID_DACB,
+ ENGINE_ID_VCE, /* wireless display pseudo-encoder */
++ ENGINE_ID_VIRTUAL,
+
+ ENGINE_ID_COUNT,
+ ENGINE_ID_UNKNOWN = (-1L)
+--
+2.7.4
+