drm/amdgpu: utilize subconnector property for DP through atombios
authorOleg Vasilev <oleg.vasilev@intel.com>
Fri, 24 Apr 2020 12:50:54 +0000 (18:20 +0530)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 11 Aug 2020 12:19:41 +0000 (14:19 +0200)
Since DP-specific information is stored in driver's structures, every
driver needs to implement subconnector property by itself.

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: Jeevan B <jeevan.b@intel.com>
Signed-off-by: Oleg Vasilev <oleg.vasilev@intel.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/1587732655-17544-4-git-send-email-jeevan.b@intel.com
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
drivers/gpu/drm/amd/amdgpu/atombios_dp.c

index f355d9a752d29ffa67ccb120a41706e97a0e01ec..8955c4fed8cbf74824f214b77dec5db7f08c082b 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <drm/drm_edid.h>
 #include <drm/drm_fb_helper.h>
+#include <drm/drm_dp_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
@@ -1405,6 +1406,10 @@ out:
                pm_runtime_put_autosuspend(connector->dev->dev);
        }
 
+       drm_dp_set_subconnector_property(&amdgpu_connector->base,
+                                        ret,
+                                        amdgpu_dig_connector->dpcd,
+                                        amdgpu_dig_connector->downstream_ports);
        return ret;
 }
 
@@ -1951,6 +1956,11 @@ amdgpu_connector_add(struct amdgpu_device *adev,
        if (has_aux)
                amdgpu_atombios_dp_aux_init(amdgpu_connector);
 
+       if (connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
+           connector_type == DRM_MODE_CONNECTOR_eDP) {
+               drm_connector_attach_dp_subconnector_property(&amdgpu_connector->base);
+       }
+
        return;
 
 failed:
index 37ba07e2feb545a8e1045a4527955e7aee0c3541..04a430e0e2e1ac56bb55a4538a5f461de5abe261 100644 (file)
@@ -469,6 +469,7 @@ struct amdgpu_encoder {
 struct amdgpu_connector_atom_dig {
        /* displayport */
        u8 dpcd[DP_RECEIVER_CAP_SIZE];
+       u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
        u8 dp_sink_type;
        int dp_clock;
        int dp_lane_count;
index 9b74cfdba7b8cb9207c461adb30853769d48d808..900b2727f432aeebf89e443de3b56465d98edbb7 100644 (file)
@@ -328,6 +328,22 @@ static void amdgpu_atombios_dp_probe_oui(struct amdgpu_connector *amdgpu_connect
                              buf[0], buf[1], buf[2]);
 }
 
+static void amdgpu_atombios_dp_ds_ports(struct amdgpu_connector *amdgpu_connector)
+{
+       struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv;
+       int ret;
+
+       if (dig_connector->dpcd[DP_DPCD_REV] > 0x10) {
+               ret = drm_dp_dpcd_read(&amdgpu_connector->ddc_bus->aux,
+                                      DP_DOWNSTREAM_PORT_0,
+                                      dig_connector->downstream_ports,
+                                      DP_MAX_DOWNSTREAM_PORTS);
+               if (ret)
+                       memset(dig_connector->downstream_ports, 0,
+                              DP_MAX_DOWNSTREAM_PORTS);
+       }
+}
+
 int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector)
 {
        struct amdgpu_connector_atom_dig *dig_connector = amdgpu_connector->con_priv;
@@ -343,7 +359,7 @@ int amdgpu_atombios_dp_get_dpcd(struct amdgpu_connector *amdgpu_connector)
                              dig_connector->dpcd);
 
                amdgpu_atombios_dp_probe_oui(amdgpu_connector);
-
+               amdgpu_atombios_dp_ds_ports(amdgpu_connector);
                return 0;
        }