Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself. Display
Core already has the subconnector information, we only need to
expose it through DRM property.

Signed-off-by: Oleg Vasilev <oleg.vasi...@intel.com>
Tested-by: Oleg Vasilev <oleg.vasi...@intel.com>
Cc: Alex Deucher <alexander.deuc...@amd.com>
Cc: Christian König <christian.koe...@amd.com>
Cc: David (ChunMing) Zhou <david1.z...@amd.com>
Cc: amd-...@lists.freedesktop.org
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 41 ++++++++++++++++++-
 .../display/amdgpu_dm/amdgpu_dm_mst_types.c   |  3 ++
 2 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 028a710c1b46..ce3e243e6343 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -143,6 +143,42 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
 static void handle_cursor_update(struct drm_plane *plane,
                                 struct drm_plane_state *old_plane_state);
 
+static enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
+{
+       switch (link->dpcd_caps.dongle_type) {
+       case DISPLAY_DONGLE_NONE:
+               return DRM_MODE_SUBCONNECTOR_Native;
+       case DISPLAY_DONGLE_DP_VGA_CONVERTER:
+               return DRM_MODE_SUBCONNECTOR_VGA;
+       case DISPLAY_DONGLE_DP_DVI_CONVERTER:
+       case DISPLAY_DONGLE_DP_DVI_DONGLE:
+               return DRM_MODE_SUBCONNECTOR_DVI;
+       case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
+       case DISPLAY_DONGLE_DP_HDMI_DONGLE:
+               return DRM_MODE_SUBCONNECTOR_HDMI;
+       case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
+       default:
+               return DRM_MODE_SUBCONNECTOR_Unknown;
+       }
+}
+
+static void update_subconnector_property(struct amdgpu_dm_connector 
*aconnector)
+{
+       struct dc_link *link = aconnector->dc_link;
+       struct drm_connector *connector = &aconnector->base;
+       enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
+
+       if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
+               return;
+
+       if (aconnector->dc_sink)
+               subconnector = get_subconnector_type(link);
+
+       drm_object_property_set_value(&connector->base,
+                       connector->dev->mode_config.dp_subconnector_property,
+                       subconnector);
+}
+
 /*
  * dm_vblank_get_counter
  *
@@ -1322,7 +1358,6 @@ amdgpu_dm_update_connector_after_detect(struct 
amdgpu_dm_connector *aconnector)
        if (aconnector->mst_mgr.mst_state == true)
                return;
 
-
        sink = aconnector->dc_link->local_sink;
        if (sink)
                dc_sink_retain(sink);
@@ -1438,6 +1473,8 @@ amdgpu_dm_update_connector_after_detect(struct 
amdgpu_dm_connector *aconnector)
 
        mutex_unlock(&dev->mode_config.mutex);
 
+       update_subconnector_property(aconnector);
+
        if (sink)
                dc_sink_release(sink);
 }
@@ -3774,6 +3811,8 @@ amdgpu_dm_connector_detect(struct drm_connector 
*connector, bool force)
        else
                connected = (aconnector->base.force == DRM_FORCE_ON);
 
+       update_subconnector_property(aconnector);
+
        return (connected ? connector_status_connected :
                        connector_status_disconnected);
 }
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
index 16218a202b59..f4088914e34f 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
@@ -25,6 +25,7 @@
 
 #include <linux/version.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_dp_helper.h>
 #include "dm_services.h"
 #include "amdgpu.h"
 #include "amdgpu_dm.h"
@@ -425,5 +426,7 @@ void amdgpu_dm_initialize_dp_connector(struct 
amdgpu_display_manager *dm,
                16,
                4,
                aconnector->connector_id);
+
+       drm_mode_add_dp_subconnector_property(&aconnector->base);
 }
 
-- 
2.23.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to