From 4a73a01e394537a888a0842062d3c5f0eef5ddd6 Mon Sep 17 00:00:00 2001 From: Harry Wentland Date: Thu, 17 Dec 2015 22:14:58 -0500 Subject: [PATCH 0660/1110] drm/amd/dal: Remove connector We're programming hpd filter but no hpd polling. Signed-off-by: Harry Wentland Acked-by: Harry Wentland --- drivers/gpu/drm/amd/dal/dc/Makefile | 2 +- drivers/gpu/drm/amd/dal/dc/connector/Makefile | 10 - drivers/gpu/drm/amd/dal/dc/connector/connector.h | 39 -- .../gpu/drm/amd/dal/dc/connector/connector_base.c | 421 --------------------- .../drm/amd/dal/dc/connector/connector_signals.c | 238 ------------ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 188 +++++++-- drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c | 1 - drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c | 1 - drivers/gpu/drm/amd/dal/dc/inc/core_types.h | 1 - .../gpu/drm/amd/dal/include/connector_interface.h | 82 ---- 10 files changed, 161 insertions(+), 822 deletions(-) delete mode 100644 drivers/gpu/drm/amd/dal/dc/connector/Makefile delete mode 100644 drivers/gpu/drm/amd/dal/dc/connector/connector.h delete mode 100644 drivers/gpu/drm/amd/dal/dc/connector/connector_base.c delete mode 100644 drivers/gpu/drm/amd/dal/dc/connector/connector_signals.c delete mode 100644 drivers/gpu/drm/amd/dal/include/connector_interface.h diff --git a/drivers/gpu/drm/amd/dal/dc/Makefile b/drivers/gpu/drm/amd/dal/dc/Makefile index 285e30d..0ab2c18 100644 --- a/drivers/gpu/drm/amd/dal/dc/Makefile +++ b/drivers/gpu/drm/amd/dal/dc/Makefile @@ -2,7 +2,7 @@ # Makefile for Display Core (dc) component. # -DC_LIBS = adapter asic_capability audio basics bios calcs connector \ +DC_LIBS = adapter asic_capability audio basics bios calcs \ dcs gpio gpu i2caux irq dce_base ifdef CONFIG_DRM_AMD_DAL_DCE11_0 diff --git a/drivers/gpu/drm/amd/dal/dc/connector/Makefile b/drivers/gpu/drm/amd/dal/dc/connector/Makefile deleted file mode 100644 index ebd4115..0000000 --- a/drivers/gpu/drm/amd/dal/dc/connector/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -# -# Makefile for the 'connector' sub-component of DAL. -# It provides the control and status of HW connectors blocks. - - -CONNECTOR = connector_base.o connector_signals.o - -AMD_DAL_CONNECTOR = $(addprefix $(AMDDALPATH)/dc/connector/,$(CONNECTOR)) - -AMD_DAL_FILES += $(AMD_DAL_CONNECTOR) diff --git a/drivers/gpu/drm/amd/dal/dc/connector/connector.h b/drivers/gpu/drm/amd/dal/dc/connector/connector.h deleted file mode 100644 index 7d6057b..0000000 --- a/drivers/gpu/drm/amd/dal/dc/connector/connector.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 __DAL_CONNECTOR_H__ -#define __DAL_CONNECTOR_H__ - -#include "include/connector_interface.h" - -extern const uint32_t number_of_default_signals; -extern const uint32_t number_of_signals; - -/* Indexed by enum connector_id */ -extern const struct connector_signals default_signals[]; -/* Indexed by enum connector_id */ -extern const struct connector_signals supported_signals[]; - -#endif diff --git a/drivers/gpu/drm/amd/dal/dc/connector/connector_base.c b/drivers/gpu/drm/amd/dal/dc/connector/connector_base.c deleted file mode 100644 index 34005fd..0000000 --- a/drivers/gpu/drm/amd/dal/dc/connector/connector_base.c +++ /dev/null @@ -1,421 +0,0 @@ -/* - * 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 "dal_services.h" - -#include "connector.h" -#include "include/irq_interface.h" -#include "include/ddc_interface.h" -#include "include/connector_interface.h" - -struct connector { - struct graphics_object_id id; - uint32_t input_signals; - uint32_t output_signals; - struct adapter_service *as; - struct connector_feature_support features; - struct connector_signals default_signals; - struct dc_context *ctx; -}; - -static bool connector_construct( - struct connector *connector, - struct dc_context *ctx, - struct adapter_service *as, - struct graphics_object_id go_id) -{ - bool hw_ddc_polling = false; - struct ddc *ddc; - struct irq *hpd; - enum connector_id connector_id; - uint32_t signals_vector = 0; - uint32_t signals_num = 0; - uint32_t i; - - if (!as) { - BREAK_TO_DEBUGGER(); - return false; - } - - connector->as = as; - connector->id = go_id; - connector->features.ddc_line = CHANNEL_ID_UNKNOWN; - connector->features.hpd_line = HPD_SOURCEID_UNKNOWN; - connector->ctx = ctx; - - ddc = dal_adapter_service_obtain_ddc(as, connector->id); - hpd = dal_adapter_service_obtain_hpd_irq(as, connector->id); - - connector_id = dal_graphics_object_id_get_connector_id(go_id); - - /* Initialize DDC line */ - if (ddc) { - switch (dal_ddc_get_line(ddc)) { - case GPIO_DDC_LINE_DDC1: - connector->features.ddc_line = CHANNEL_ID_DDC1; - break; - case GPIO_DDC_LINE_DDC2: - connector->features.ddc_line = CHANNEL_ID_DDC2; - break; - case GPIO_DDC_LINE_DDC3: - connector->features.ddc_line = CHANNEL_ID_DDC3; - break; - case GPIO_DDC_LINE_DDC4: - connector->features.ddc_line = CHANNEL_ID_DDC4; - break; - case GPIO_DDC_LINE_DDC5: - connector->features.ddc_line = CHANNEL_ID_DDC5; - break; - case GPIO_DDC_LINE_DDC6: - connector->features.ddc_line = CHANNEL_ID_DDC6; - break; - case GPIO_DDC_LINE_DDC_VGA: - connector->features.ddc_line = CHANNEL_ID_DDC_VGA; - break; - case GPIO_DDC_LINE_I2C_PAD: - connector->features.ddc_line = CHANNEL_ID_I2C_PAD; - break; - default: - BREAK_TO_DEBUGGER(); - break; - } - - /* Initialize HW DDC polling support - * On DCE6.0 only DDC lines support HW polling (I2cPad does not) - */ - - if (dal_adapter_service_is_feature_supported( - FEATURE_ENABLE_HW_EDID_POLLING)) { - switch (dal_ddc_get_line(ddc)) { - case GPIO_DDC_LINE_DDC1: - case GPIO_DDC_LINE_DDC2: - case GPIO_DDC_LINE_DDC3: - case GPIO_DDC_LINE_DDC4: - case GPIO_DDC_LINE_DDC5: - case GPIO_DDC_LINE_DDC6: - case GPIO_DDC_LINE_DDC_VGA: - hw_ddc_polling = true; - break; - default: - break; - } - } - - dal_adapter_service_release_ddc(as, ddc); - } - - /* Initialize HPD line */ - if (hpd) { - switch (dal_irq_get_source(hpd)) { - case DC_IRQ_SOURCE_HPD1: - connector->features.hpd_line = HPD_SOURCEID1; - break; - case DC_IRQ_SOURCE_HPD2: - connector->features.hpd_line = HPD_SOURCEID2; - break; - case DC_IRQ_SOURCE_HPD3: - connector->features.hpd_line = HPD_SOURCEID3; - break; - case DC_IRQ_SOURCE_HPD4: - connector->features.hpd_line = HPD_SOURCEID4; - break; - case DC_IRQ_SOURCE_HPD5: - connector->features.hpd_line = HPD_SOURCEID5; - break; - case DC_IRQ_SOURCE_HPD6: - connector->features.hpd_line = HPD_SOURCEID6; - break; - default: - BREAK_TO_DEBUGGER(); - break; - } - - dal_adapter_service_release_irq(as, hpd); - } - - if ((uint32_t)connector_id >= number_of_default_signals && - (uint32_t)connector_id >= number_of_signals) - return false; - - /* Initialize default signals */ - connector->default_signals = default_signals[connector_id]; - - /* Fill supported signals */ - signals_num = supported_signals[connector_id].number_of_signals; - for (i = 0; i < signals_num; i++) - signals_vector |= supported_signals[connector_id].signal[i]; - - /* Connector supports same set for input and output signals */ - connector->input_signals = signals_vector; - connector->output_signals = signals_vector; - - switch (connector_id) { - case CONNECTOR_ID_VGA: - if (hw_ddc_polling - && connector->features.ddc_line != CHANNEL_ID_UNKNOWN) - connector->features.HW_DDC_POLLING = true; - break; - case CONNECTOR_ID_SINGLE_LINK_DVII: - case CONNECTOR_ID_DUAL_LINK_DVII: - if (connector->features.hpd_line != HPD_SOURCEID_UNKNOWN) - connector->features.HPD_FILTERING = true; - if (hw_ddc_polling - && connector->features.ddc_line != CHANNEL_ID_UNKNOWN) - connector->features.HW_DDC_POLLING = true; - break; - case CONNECTOR_ID_SINGLE_LINK_DVID: - case CONNECTOR_ID_DUAL_LINK_DVID: - case CONNECTOR_ID_HDMI_TYPE_A: - case CONNECTOR_ID_LVDS: - case CONNECTOR_ID_DISPLAY_PORT: - case CONNECTOR_ID_EDP: - if (connector->features.hpd_line != HPD_SOURCEID_UNKNOWN) - connector->features.HPD_FILTERING = true; - break; - default: - connector->features.HPD_FILTERING = false; - connector->features.HW_DDC_POLLING = false; - break; - } - - return true; -} - -struct connector *dal_connector_create( - struct dc_context *ctx, - struct adapter_service *as, - struct graphics_object_id go_id) -{ - struct connector *connector = NULL; - - connector = dc_service_alloc(ctx, sizeof(struct connector)); - - if (!connector) { - BREAK_TO_DEBUGGER(); - return NULL; - } - - if (connector_construct(connector, ctx, as, go_id)) - return connector; - - BREAK_TO_DEBUGGER(); - - dc_service_free(ctx, connector); - - return NULL; -} - -void dal_connector_destroy(struct connector **connector) -{ - if (!connector || !*connector) { - BREAK_TO_DEBUGGER(); - return; - } - - dc_service_free((*connector)->ctx, *connector); - - *connector = NULL; -} - -uint32_t dal_connector_enumerate_output_signals( - const struct connector *connector) -{ - return connector->output_signals; -} - -uint32_t dal_connector_enumerate_input_signals( - const struct connector *connector) -{ - return connector->input_signals; -} - -struct connector_signals dal_connector_get_default_signals( - const struct connector *connector) -{ - return connector->default_signals; -} - -const struct graphics_object_id dal_connector_get_graphics_object_id( - const struct connector *connector) -{ - return connector->id; -} - -/* - * Function: program_hpd_filter - * - * @brief - * Programs HPD filter on associated HPD line - * - * @param [in] delay_on_connect_in_ms: Connect filter timeout - * @param [in] delay_on_disconnect_in_ms: Disconnect filter timeout - * - * @return - * true on success, false otherwise - */ -bool dal_connector_program_hpd_filter( - const struct connector *connector, - const uint32_t delay_on_connect_in_ms, - const uint32_t delay_on_disconnect_in_ms) -{ - bool result = false; - - struct irq *hpd; - - /* Verify feature is supported */ - - if (!connector->features.HPD_FILTERING) - return result; - - /* Obtain HPD handle */ - - hpd = dal_adapter_service_obtain_hpd_irq( - connector->as, connector->id); - - if (!hpd) - return result; - - /* Setup HPD filtering */ - - if (GPIO_RESULT_OK == dal_irq_open(hpd)) { - struct gpio_hpd_config config; - - config.delay_on_connect = delay_on_connect_in_ms; - config.delay_on_disconnect = delay_on_disconnect_in_ms; - - dal_irq_setup_hpd_filter(hpd, &config); - - dal_irq_close(hpd); - - result = true; - } else { - ASSERT_CRITICAL(false); - } - - /* Release HPD handle */ - - dal_adapter_service_release_irq(connector->as, hpd); - - return result; -} - -/* - * Function: setup_ddc_polling - * - * @brief - * Enables/Disables HW polling on associated DDC line - * - * @param [in] ddc_config: Specifies polling mode - * - * @return - * true on success, false otherwise - */ -static bool setup_ddc_polling( - const struct connector *connector, - enum gpio_ddc_config_type ddc_config) -{ - bool result = false; - - struct ddc *ddc; - - /* Verify feature is supported */ - - if (!connector->features.HW_DDC_POLLING) - return result; - - /* Obtain DDC handle */ - - ddc = dal_adapter_service_obtain_ddc( - connector->as, connector->id); - - if (!ddc) { - BREAK_TO_DEBUGGER(); - return result; - } - - /* Setup DDC polling */ - - if (GPIO_RESULT_OK == dal_ddc_open(ddc, GPIO_MODE_HARDWARE, - GPIO_DDC_CONFIG_TYPE_MODE_I2C)) { - dal_ddc_set_config(ddc, ddc_config); - - dal_ddc_close(ddc); - - result = true; - } else { - BREAK_TO_DEBUGGER(); - } - - /* Release DDC handle */ - - dal_adapter_service_release_ddc(connector->as, ddc); - - return result; -} - -/* - * Function: enable_ddc_polling - * - * @brief - * Enables HW polling on associated DDC line - * - * @param [in] is_poll_for_connect: Specifies polling mode - * - * @return - * true on success, false otherwise - */ -bool dal_connector_enable_ddc_polling( - const struct connector *connector, - const bool is_poll_for_connect) -{ - enum gpio_ddc_config_type ddc_config = is_poll_for_connect ? - GPIO_DDC_CONFIG_TYPE_POLL_FOR_CONNECT : - GPIO_DDC_CONFIG_TYPE_POLL_FOR_DISCONNECT; - - return setup_ddc_polling(connector, ddc_config); -} - -/* - * Function: disable_ddc_polling - * - * @brief - * Disables HW polling on associated DDC line - * - * @return - * true on success, false otherwise - */ -bool dal_connector_disable_ddc_polling(const struct connector *connector) -{ - return setup_ddc_polling(connector, - GPIO_DDC_CONFIG_TYPE_DISABLE_POLLING); -} - -void dal_connector_get_features( - const struct connector *con, - struct connector_feature_support *cfs) -{ - dc_service_memmove(cfs, &con->features, - sizeof(struct connector_feature_support)); -} diff --git a/drivers/gpu/drm/amd/dal/dc/connector/connector_signals.c b/drivers/gpu/drm/amd/dal/dc/connector/connector_signals.c deleted file mode 100644 index 3a5d75b..0000000 --- a/drivers/gpu/drm/amd/dal/dc/connector/connector_signals.c +++ /dev/null @@ -1,238 +0,0 @@ -/* - * 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 "dal_services.h" - -#include "connector.h" - -static const enum signal_type signals_none[] = { - SIGNAL_TYPE_NONE -}; - -static const enum signal_type signals_single_link_dvii[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK, - SIGNAL_TYPE_RGB -}; - -static const enum signal_type signals_dual_link_dvii[] = { - SIGNAL_TYPE_DVI_DUAL_LINK, - SIGNAL_TYPE_DVI_SINGLE_LINK, - SIGNAL_TYPE_RGB -}; - -static const enum signal_type signals_single_link_dvid[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK -}; - -static const enum signal_type signals_dual_link_dvid[] = { - SIGNAL_TYPE_DVI_DUAL_LINK, - SIGNAL_TYPE_DVI_SINGLE_LINK, -}; - -static const enum signal_type signals_vga[] = { - SIGNAL_TYPE_RGB -}; - -static const enum signal_type signals_hdmi_type_a[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK, - SIGNAL_TYPE_HDMI_TYPE_A -}; - -static const enum signal_type signals_lvds[] = { - SIGNAL_TYPE_LVDS -}; - -static const enum signal_type signals_pcie[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK, - SIGNAL_TYPE_HDMI_TYPE_A, - SIGNAL_TYPE_DISPLAY_PORT -}; - -static const enum signal_type signals_hardcode_dvi[] = { - SIGNAL_TYPE_NONE -}; - -static const enum signal_type signals_displayport[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK, - SIGNAL_TYPE_HDMI_TYPE_A, - SIGNAL_TYPE_DISPLAY_PORT, - SIGNAL_TYPE_DISPLAY_PORT_MST -}; - -static const enum signal_type signals_edp[] = { - SIGNAL_TYPE_EDP -}; - -static const enum signal_type signals_wireless[] = { - SIGNAL_TYPE_WIRELESS -}; - -static const enum signal_type signals_miracast[] = { - SIGNAL_TYPE_WIRELESS -}; - -static const enum signal_type default_signals_none[] = { - SIGNAL_TYPE_NONE -}; - -static const enum signal_type default_signals_single_link_dvii[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK, - SIGNAL_TYPE_RGB -}; - -static const enum signal_type default_signals_dual_link_dvii[] = { - SIGNAL_TYPE_DVI_DUAL_LINK, - SIGNAL_TYPE_RGB -}; - -static const enum signal_type default_signals_single_link_dvid[] = { - SIGNAL_TYPE_DVI_SINGLE_LINK -}; - -static const enum signal_type default_signals_dual_link_dvid[] = { - SIGNAL_TYPE_DVI_DUAL_LINK, -}; - -static const enum signal_type default_signals_vga[] = { - SIGNAL_TYPE_RGB -}; - -static const enum signal_type default_signals_hdmi_type_a[] = { - SIGNAL_TYPE_HDMI_TYPE_A -}; - -static const enum signal_type default_signals_lvds[] = { - SIGNAL_TYPE_LVDS -}; - -static const enum signal_type default_signals_pcie[] = { - SIGNAL_TYPE_DISPLAY_PORT -}; - -static const enum signal_type default_signals_hardcode_dvi[] = { - SIGNAL_TYPE_NONE -}; - -static const enum signal_type default_signals_displayport[] = { - SIGNAL_TYPE_DISPLAY_PORT -}; - -static const enum signal_type default_signals_edp[] = { - SIGNAL_TYPE_EDP -}; - -static const enum signal_type default_signals_wireless[] = { - SIGNAL_TYPE_WIRELESS -}; - -static const enum signal_type default_signals_miracast[] = { - SIGNAL_TYPE_WIRELESS -}; - -/* - * Signal arrays - */ - -#define SIGNALS_ARRAY_ELEM(a) {a, ARRAY_SIZE(a)} - -/* Indexed by enum connector_id */ -const struct connector_signals default_signals[] = { - SIGNALS_ARRAY_ELEM(default_signals_none), - SIGNALS_ARRAY_ELEM(default_signals_single_link_dvii), - SIGNALS_ARRAY_ELEM(default_signals_dual_link_dvii), - SIGNALS_ARRAY_ELEM(default_signals_single_link_dvid), - SIGNALS_ARRAY_ELEM(default_signals_dual_link_dvid), - SIGNALS_ARRAY_ELEM(default_signals_vga), - /* Composite */ - SIGNALS_ARRAY_ELEM(default_signals_none), - /* S Video */ - SIGNALS_ARRAY_ELEM(default_signals_none), - /* YPbPr */ - SIGNALS_ARRAY_ELEM(default_signals_none), - /* DConnector */ - SIGNALS_ARRAY_ELEM(default_signals_none), - /* 9pinDIN */ - SIGNALS_ARRAY_ELEM(default_signals_none), - /* SCART */ - SIGNALS_ARRAY_ELEM(default_signals_none), - SIGNALS_ARRAY_ELEM(default_signals_hdmi_type_a), - /* Not Used */ - SIGNALS_ARRAY_ELEM(default_signals_none), - SIGNALS_ARRAY_ELEM(default_signals_lvds), - /* 7pin DIN*/ - SIGNALS_ARRAY_ELEM(default_signals_none), - SIGNALS_ARRAY_ELEM(default_signals_pcie), - /* CrossFire */ - SIGNALS_ARRAY_ELEM(default_signals_none), - SIGNALS_ARRAY_ELEM(default_signals_hardcode_dvi), - SIGNALS_ARRAY_ELEM(default_signals_displayport), - SIGNALS_ARRAY_ELEM(default_signals_edp), - /* MXM*/ - SIGNALS_ARRAY_ELEM(default_signals_none), - SIGNALS_ARRAY_ELEM(default_signals_wireless), - SIGNALS_ARRAY_ELEM(default_signals_miracast) -}; - -const uint32_t number_of_default_signals = ARRAY_SIZE(default_signals); - -/* Indexed by enum connector_id */ -const struct connector_signals supported_signals[] = { - SIGNALS_ARRAY_ELEM(signals_none), - SIGNALS_ARRAY_ELEM(signals_single_link_dvii), - SIGNALS_ARRAY_ELEM(signals_dual_link_dvii), - SIGNALS_ARRAY_ELEM(signals_single_link_dvid), - SIGNALS_ARRAY_ELEM(signals_dual_link_dvid), - SIGNALS_ARRAY_ELEM(signals_vga), - /* Composite */ - SIGNALS_ARRAY_ELEM(signals_none), - /* S Video */ - SIGNALS_ARRAY_ELEM(signals_none), - /* YPbPr */ - SIGNALS_ARRAY_ELEM(signals_none), - /* DConnector */ - SIGNALS_ARRAY_ELEM(signals_none), - /* 9pinDIN */ - SIGNALS_ARRAY_ELEM(signals_none), - /* SCART */ - SIGNALS_ARRAY_ELEM(signals_none), - SIGNALS_ARRAY_ELEM(signals_hdmi_type_a), - /* Note Used */ - SIGNALS_ARRAY_ELEM(signals_none), - SIGNALS_ARRAY_ELEM(signals_lvds), - /* 7pin DIN*/ - SIGNALS_ARRAY_ELEM(signals_none), - SIGNALS_ARRAY_ELEM(signals_pcie), - /* CrossFire */ - SIGNALS_ARRAY_ELEM(signals_none), - SIGNALS_ARRAY_ELEM(signals_hardcode_dvi), - SIGNALS_ARRAY_ELEM(signals_displayport), - SIGNALS_ARRAY_ELEM(signals_edp), - /* MXM */ - SIGNALS_ARRAY_ELEM(signals_none), - SIGNALS_ARRAY_ELEM(signals_wireless), - SIGNALS_ARRAY_ELEM(signals_miracast) -}; - -const uint32_t number_of_signals = ARRAY_SIZE(supported_signals); 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 2211f38..3347174 100644 --- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c +++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c @@ -29,7 +29,6 @@ #include "core_dc.h" #include "adapter_service_interface.h" #include "grph_object_id.h" -#include "connector_interface.h" #include "gpio_service_interface.h" #include "ddc_service_interface.h" #include "core_status.h" @@ -45,6 +44,10 @@ LOG_MAJOR_HW_TRACE, LOG_MINOR_HW_TRACE_HOTPLUG, \ __VA_ARGS__) +#define DELAY_ON_CONNECT_IN_MS 500 +#define DELAY_ON_DISCONNECT_IN_MS 500 + + /******************************************************************************* * Private structures ******************************************************************************/ @@ -55,9 +58,6 @@ ******************************************************************************/ static void destruct(struct core_link *link) { - if (link->connector) - dal_connector_destroy(&link->connector); - if (link->ddc) dal_ddc_service_destroy(&link->ddc); @@ -65,6 +65,73 @@ static void destruct(struct core_link *link) link->ctx->dc->hwss.encoder_destroy(&link->link_enc); } +/* + * Function: program_hpd_filter + * + * @brief + * Programs HPD filter on associated HPD line + * + * @param [in] delay_on_connect_in_ms: Connect filter timeout + * @param [in] delay_on_disconnect_in_ms: Disconnect filter timeout + * + * @return + * true on success, false otherwise + */ +static bool program_hpd_filter( + const struct core_link *link) +{ + bool result = false; + + struct irq *hpd; + + /* Verify feature is supported */ + + switch (link->public.connector_signal) { + case SIGNAL_TYPE_DVI_SINGLE_LINK: + case SIGNAL_TYPE_DVI_DUAL_LINK: + case SIGNAL_TYPE_HDMI_TYPE_A: + case SIGNAL_TYPE_LVDS: + case SIGNAL_TYPE_DISPLAY_PORT: + case SIGNAL_TYPE_DISPLAY_PORT_MST: + case SIGNAL_TYPE_EDP: + /* program hpd filter */ + break; + default: + /* don't program hpd filter */ + return false; + } + + /* Obtain HPD handle */ + hpd = dal_adapter_service_obtain_hpd_irq( + link->adapter_srv, link->link_id); + + if (!hpd) + return result; + + /* Setup HPD filtering */ + + if (dal_irq_open(hpd) == GPIO_RESULT_OK) { + struct gpio_hpd_config config; + + config.delay_on_connect = DELAY_ON_CONNECT_IN_MS; + config.delay_on_disconnect = DELAY_ON_DISCONNECT_IN_MS; + + dal_irq_setup_hpd_filter(hpd, &config); + + dal_irq_close(hpd); + + result = true; + } else { + ASSERT_CRITICAL(false); + } + + /* Release HPD handle */ + + dal_adapter_service_release_irq(link->adapter_srv, hpd); + + return result; +} + static bool detect_sink(struct core_link *link) { uint32_t is_hpd_high = 0; @@ -651,6 +718,91 @@ void dc_link_detect(const struct dc_link *dc_link) return; } +static enum hpd_source_id get_hpd_line( + struct core_link *link, + struct adapter_service *as) +{ + struct irq *hpd; + enum hpd_source_id hpd_id = HPD_SOURCEID_UNKNOWN; + + hpd = dal_adapter_service_obtain_hpd_irq(as, link->link_id); + + if (hpd) { + switch (dal_irq_get_source(hpd)) { + case DC_IRQ_SOURCE_HPD1: + hpd_id = HPD_SOURCEID1; + break; + case DC_IRQ_SOURCE_HPD2: + hpd_id = HPD_SOURCEID2; + break; + case DC_IRQ_SOURCE_HPD3: + hpd_id = HPD_SOURCEID3; + break; + case DC_IRQ_SOURCE_HPD4: + hpd_id = HPD_SOURCEID4; + break; + case DC_IRQ_SOURCE_HPD5: + hpd_id = HPD_SOURCEID5; + break; + case DC_IRQ_SOURCE_HPD6: + hpd_id = HPD_SOURCEID6; + break; + default: + BREAK_TO_DEBUGGER(); + break; + } + + dal_adapter_service_release_irq(as, hpd); + } + + return hpd_id; +} + +static enum channel_id get_ddc_line(struct core_link *link, struct adapter_service *as) +{ + struct ddc *ddc; + enum channel_id channel = CHANNEL_ID_UNKNOWN; + + ddc = dal_adapter_service_obtain_ddc(as, link->link_id); + + if (ddc) { + switch (dal_ddc_get_line(ddc)) { + case GPIO_DDC_LINE_DDC1: + channel = CHANNEL_ID_DDC1; + break; + case GPIO_DDC_LINE_DDC2: + channel = CHANNEL_ID_DDC2; + break; + case GPIO_DDC_LINE_DDC3: + channel = CHANNEL_ID_DDC3; + break; + case GPIO_DDC_LINE_DDC4: + channel = CHANNEL_ID_DDC4; + break; + case GPIO_DDC_LINE_DDC5: + channel = CHANNEL_ID_DDC5; + break; + case GPIO_DDC_LINE_DDC6: + channel = CHANNEL_ID_DDC6; + break; + case GPIO_DDC_LINE_DDC_VGA: + channel = CHANNEL_ID_DDC_VGA; + break; + case GPIO_DDC_LINE_I2C_PAD: + channel = CHANNEL_ID_I2C_PAD; + break; + default: + BREAK_TO_DEBUGGER(); + break; + } + + dal_adapter_service_release_ddc(as, ddc); + } + + return channel; +} + + static bool construct( struct core_link *link, const struct link_init_data *init_params) @@ -661,7 +813,6 @@ static bool construct( struct ddc_service_init_data ddc_service_init_data = { 0 }; struct dc_context *dc_ctx = init_params->ctx; struct encoder_init_data enc_init_data = { 0 }; - struct connector_feature_support cfs = { 0 }; struct integrated_info info = {{{ 0 }}}; link->dc = init_params->dc; @@ -732,13 +883,6 @@ static bool construct( init_params->connector_index, link->public.connector_signal); - link->connector = dal_connector_create(dc_ctx, as, link->link_id); - if (NULL == link->connector) { - DC_ERROR("Failed to create connector object!\n"); - goto create_fail; - } - - hpd_gpio = dal_adapter_service_obtain_hpd_irq(as, link->link_id); if (hpd_gpio != NULL) { @@ -756,15 +900,13 @@ static bool construct( goto create_fail; } - dal_connector_get_features(link->connector, &cfs); - enc_init_data.adapter_service = as; enc_init_data.ctx = dc_ctx; enc_init_data.encoder = dal_adapter_service_get_src_obj( as, link->link_id, 0); enc_init_data.connector = link->link_id; - enc_init_data.channel = cfs.ddc_line; - enc_init_data.hpd_source = cfs.hpd_line; + enc_init_data.channel = get_ddc_line(link, as); + enc_init_data.hpd_source = get_hpd_line(link, as); link->link_enc = dc_ctx->dc->hwss.encoder_create(&enc_init_data); if( link->link_enc == NULL) { @@ -819,13 +961,7 @@ static bool construct( * If GPIO isn't programmed correctly HPD might not rise or drain * fast enough, leading to bounces. */ -#define DELAY_ON_CONNECT_IN_MS 500 -#define DELAY_ON_DISCONNECT_IN_MS 500 - - dal_connector_program_hpd_filter( - link->connector, - DELAY_ON_CONNECT_IN_MS, - DELAY_ON_DISCONNECT_IN_MS); + program_hpd_filter(link); return true; @@ -1126,10 +1262,7 @@ bool dc_link_set_backlight_level(const struct dc_link *public, uint32_t level) void core_link_resume(struct core_link *link) { - dal_connector_program_hpd_filter( - link->connector, - DELAY_ON_CONNECT_IN_MS, - DELAY_ON_DISCONNECT_IN_MS); + program_hpd_filter(link); } @@ -1279,4 +1412,3 @@ void core_link_disable_stream( disable_link(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 c0390e1..787091f 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 @@ -5,7 +5,6 @@ #include "inc/core_types.h" #include "link_hwss.h" #include "ddc_service_interface.h" -#include "connector_interface.h" #include "core_status.h" #include "dpcd_defs.h" 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 5ed0380..715aa9f 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 @@ -6,7 +6,6 @@ #include "include/ddc_service_types.h" #include "include/i2caux_interface.h" #include "link_hwss.h" -#include "include/connector_interface.h" #include "hw_sequencer.h" #include "include/ddc_service_interface.h" #include "dc_helpers.h" 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 dc871ad..26f5002 100644 --- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h +++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h @@ -205,7 +205,6 @@ struct core_link { uint8_t connector_index; /* this will be mapped to the HPD pins */ struct adapter_service *adapter_srv; - struct connector *connector; struct link_encoder *link_enc; struct ddc_service *ddc; struct graphics_object_id link_id; diff --git a/drivers/gpu/drm/amd/dal/include/connector_interface.h b/drivers/gpu/drm/amd/dal/include/connector_interface.h deleted file mode 100644 index e09af7e..0000000 --- a/drivers/gpu/drm/amd/dal/include/connector_interface.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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 __DAL_CONNECTOR_INTERFACE_H__ -#define __DAL_CONNECTOR_INTERFACE_H__ - -#include "adapter_service_interface.h" -#include "signal_types.h" - -/* forward declaration */ -struct connector; - -struct connector_signals { - const enum signal_type *signal; - uint32_t number_of_signals; -}; - -struct connector_feature_support { - bool HPD_FILTERING:1; - bool HW_DDC_POLLING:1; - enum hpd_source_id hpd_line; - enum channel_id ddc_line; -}; - -void dal_connector_get_features( - const struct connector *con, - struct connector_feature_support *cfs); - -struct connector *dal_connector_create( - struct dc_context *ctx, - struct adapter_service *as, - struct graphics_object_id go_id); - -void dal_connector_destroy(struct connector **connector); - -void dal_connector_destroy(struct connector **connector); - -const struct graphics_object_id dal_connector_get_graphics_object_id( - const struct connector *connector); - -uint32_t dal_connector_enumerate_output_signals( - const struct connector *connector); -uint32_t dal_connector_enumerate_input_signals( - const struct connector *connector); - -struct connector_signals dal_connector_get_default_signals( - const struct connector *connector); - -bool dal_connector_program_hpd_filter( - const struct connector *connector, - const uint32_t delay_on_connect_in_ms, - const uint32_t delay_on_disconnect_in_ms); - -bool dal_connector_enable_ddc_polling( - const struct connector *connector, - const bool is_poll_for_connect); - -bool dal_connector_disable_ddc_polling(const struct connector *connector); - -#endif -- 2.7.4