Commit 0f877894 authored by Oleg Vasilev's avatar Oleg Vasilev Committed by Maarten Lankhorst

drm/amdgpu: utilize subconnector property for DP through DisplayManager

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.

v2:rebase

v3: renamed a function call

Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: Christian König <christian.koenig@amd.com>
Cc: David (ChunMing) Zhou <David1.Zhou@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: default avatarJeevan B <jeevan.b@intel.com>
Signed-off-by: default avatarOleg Vasilev <oleg.vasilev@intel.com>
Tested-by: default avatarOleg Vasilev <oleg.vasilev@intel.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1587732655-17544-5-git-send-email-jeevan.b@intel.com
parent 65bf2cf9
...@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU); ...@@ -121,6 +121,42 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
static int amdgpu_dm_init(struct amdgpu_device *adev); static int amdgpu_dm_init(struct amdgpu_device *adev);
static void amdgpu_dm_fini(struct amdgpu_device *adev); static void amdgpu_dm_fini(struct amdgpu_device *adev);
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_DVID;
case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
case DISPLAY_DONGLE_DP_HDMI_DONGLE:
return DRM_MODE_SUBCONNECTOR_HDMIA;
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);
}
/* /*
* initializes drm_device display related structures, based on the information * initializes drm_device display related structures, based on the information
* provided by DAL. The drm strcutures are: drm_crtc, drm_connector, * provided by DAL. The drm strcutures are: drm_crtc, drm_connector,
...@@ -2069,7 +2105,6 @@ void amdgpu_dm_update_connector_after_detect( ...@@ -2069,7 +2105,6 @@ void amdgpu_dm_update_connector_after_detect(
if (aconnector->mst_mgr.mst_state == true) if (aconnector->mst_mgr.mst_state == true)
return; return;
sink = aconnector->dc_link->local_sink; sink = aconnector->dc_link->local_sink;
if (sink) if (sink)
dc_sink_retain(sink); dc_sink_retain(sink);
...@@ -2195,6 +2230,8 @@ void amdgpu_dm_update_connector_after_detect( ...@@ -2195,6 +2230,8 @@ void amdgpu_dm_update_connector_after_detect(
mutex_unlock(&dev->mode_config.mutex); mutex_unlock(&dev->mode_config.mutex);
update_subconnector_property(aconnector);
if (sink) if (sink)
dc_sink_release(sink); dc_sink_release(sink);
} }
...@@ -4720,6 +4757,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force) ...@@ -4720,6 +4757,8 @@ amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
else else
connected = (aconnector->base.force == DRM_FORCE_ON); connected = (aconnector->base.force == DRM_FORCE_ON);
update_subconnector_property(aconnector);
return (connected ? connector_status_connected : return (connected ? connector_status_connected :
connector_status_disconnected); connector_status_disconnected);
} }
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/version.h> #include <linux/version.h>
#include <drm/drm_atomic_helper.h> #include <drm/drm_atomic_helper.h>
#include <drm/drm_dp_mst_helper.h> #include <drm/drm_dp_mst_helper.h>
#include <drm/drm_dp_helper.h>
#include "dm_services.h" #include "dm_services.h"
#include "amdgpu.h" #include "amdgpu.h"
#include "amdgpu_dm.h" #include "amdgpu_dm.h"
...@@ -432,6 +433,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm, ...@@ -432,6 +433,8 @@ void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
16, 16,
4, 4,
aconnector->connector_id); aconnector->connector_id);
drm_connector_attach_dp_subconnector_property(&aconnector->base);
} }
int dm_mst_get_pbn_divider(struct dc_link *link) int dm_mst_get_pbn_divider(struct dc_link *link)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment