diff options
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.patch | 799 |
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 + |