aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0607-drm-amd-dal-share-initialization-between-connectors.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0607-drm-amd-dal-share-initialization-between-connectors.patch')
-rw-r--r--common/recipes-kernel/linux/files/0607-drm-amd-dal-share-initialization-between-connectors.patch221
1 files changed, 221 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0607-drm-amd-dal-share-initialization-between-connectors.patch b/common/recipes-kernel/linux/files/0607-drm-amd-dal-share-initialization-between-connectors.patch
new file mode 100644
index 00000000..ff9eec50
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0607-drm-amd-dal-share-initialization-between-connectors.patch
@@ -0,0 +1,221 @@
+From c0f9678f83fea7283f961c8853062637400b4693 Mon Sep 17 00:00:00 2001
+From: Mykola Lysenko <Mykola.Lysenko@amd.com>
+Date: Thu, 10 Dec 2015 20:12:49 +0800
+Subject: [PATCH 0607/1110] drm/amd/dal: share initialization between
+ connectors
+
+Also initialize DPMS to OFF state
+
+Signed-off-by: Harry Wentland <harry.wentland@amd.com>
+Acked-by: Harry Wentland<harry.wentland@amd.com>
+---
+ .../drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c | 37 +++++++---
+ .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 82 +++++++++++++---------
+ .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.h | 7 ++
+ 3 files changed, 84 insertions(+), 42 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
+index ba1c854..3246dcd 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_mst_types.c
+@@ -261,6 +261,7 @@ static struct drm_connector *dm_dp_add_mst_connector(struct drm_dp_mst_topology_
+ {
+ struct amdgpu_connector *master = container_of(mgr, struct amdgpu_connector, mst_mgr);
+ struct drm_device *dev = master->base.dev;
++ struct amdgpu_device *adev = dev->dev_private;
+ struct amdgpu_connector *aconnector;
+ struct drm_connector *connector;
+
+@@ -272,21 +273,41 @@ static struct drm_connector *dm_dp_add_mst_connector(struct drm_dp_mst_topology_
+ connector = &aconnector->base;
+ aconnector->port = port;
+ aconnector->mst_port = master;
+- aconnector->dc_link = master->dc_link;
+- aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
+
+- sema_init(&aconnector->mst_sem, 1);
++ if (drm_connector_init(
++ dev,
++ connector,
++ &dm_dp_mst_connector_funcs,
++ DRM_MODE_CONNECTOR_DisplayPort)) {
++ kfree(aconnector);
++ return NULL;
++ }
++ drm_connector_helper_add(connector, &dm_dp_mst_connector_helper_funcs);
+
+- /* Initialize connector state before adding the connectror to drm and framebuffer lists */
+- amdgpu_dm_connector_funcs_reset(connector);
++ amdgpu_dm_connector_init_helper(
++ &adev->dm,
++ aconnector,
++ DRM_MODE_CONNECTOR_DisplayPort,
++ master->dc_link,
++ master->connector_id);
+
+- drm_connector_init(dev, connector, &dm_dp_mst_connector_funcs, DRM_MODE_CONNECTOR_DisplayPort);
+- drm_connector_helper_add(connector, &dm_dp_mst_connector_helper_funcs);
+ aconnector->mst_encoder = dm_dp_create_fake_mst_encoder(master);
+
+- drm_object_attach_property(&connector->base, dev->mode_config.path_property, 0);
++ /*
++ * TODO: understand why this one is needed
++ */
++ drm_object_attach_property(
++ &connector->base,
++ dev->mode_config.path_property,
++ 0);
++
+ drm_mode_connector_set_path_property(connector, pathprop);
+
++ /*
++ * Initialize connector state before adding the connectror to drm and
++ * framebuffer lists
++ */
++ amdgpu_dm_connector_funcs_reset(connector);
+
+ DRM_DEBUG_KMS(":%d\n", connector->base.id);
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
+index ea7a623..45a2a68 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c
+@@ -1753,45 +1753,24 @@ int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
+ return amdgpu_connector->num_modes;
+ }
+
+-/* Note: this function assumes that dc_link_detect() was called for the
+- * dc_link which will be represented by this aconnector. */
+-int amdgpu_dm_connector_init(
++void amdgpu_dm_connector_init_helper(
+ struct amdgpu_display_manager *dm,
+ struct amdgpu_connector *aconnector,
+- uint32_t link_index,
+- struct amdgpu_encoder *aencoder)
++ int connector_type,
++ const struct dc_link *link,
++ int link_index)
+ {
+- int res, connector_type;
+ struct amdgpu_device *adev = dm->ddev->dev_private;
+- struct dc *dc = dm->dc;
+- const struct dc_link *link = dc_get_link_at_index(dc, link_index);
+-
+- DRM_DEBUG_KMS("%s()\n", __func__);
+-
+- connector_type = to_drm_connector_type(link->connector_signal);
+-
+- res = drm_connector_init(
+- dm->ddev,
+- &aconnector->base,
+- &amdgpu_dm_connector_funcs,
+- connector_type);
+-
+- if (res) {
+- DRM_ERROR("connector_init failed\n");
+- aconnector->connector_id = -1;
+- return res;
+- }
+-
+- drm_connector_helper_add(
+- &aconnector->base,
+- &amdgpu_dm_connector_helper_funcs);
+
+ aconnector->connector_id = link_index;
+ aconnector->dc_link = link;
+ aconnector->base.interlace_allowed = true;
+ aconnector->base.doublescan_allowed = true;
++ aconnector->base.dpms = DRM_MODE_DPMS_OFF;
+ aconnector->hpd.hpd = link_index; /* maps to 'enum amdgpu_hpd_id' */
+
++
++
+ /*configure suport HPD hot plug connector_>polled default value is 0
+ * which means HPD hot plug not supported*/
+ switch (connector_type) {
+@@ -1822,15 +1801,51 @@ int amdgpu_dm_connector_init(
+ adev->mode_info.underscan_vborder_property,
+ 0);
+
+- /* TODO: Don't do this manually anymore
+- aconnector->base.encoder = &aencoder->base;
+- */
++ sema_init(&aconnector->mst_sem, 1);
++}
++
++/* Note: this function assumes that dc_link_detect() was called for the
++ * dc_link which will be represented by this aconnector. */
++int amdgpu_dm_connector_init(
++ struct amdgpu_display_manager *dm,
++ struct amdgpu_connector *aconnector,
++ uint32_t link_index,
++ struct amdgpu_encoder *aencoder)
++{
++ int res, connector_type;
++ struct dc *dc = dm->dc;
++ const struct dc_link *link = dc_get_link_at_index(dc, link_index);
++
++ DRM_DEBUG_KMS("%s()\n", __func__);
++
++ connector_type = to_drm_connector_type(link->connector_signal);
++
++ res = drm_connector_init(
++ dm->ddev,
++ &aconnector->base,
++ &amdgpu_dm_connector_funcs,
++ connector_type);
++
++ if (res) {
++ DRM_ERROR("connector_init failed\n");
++ aconnector->connector_id = -1;
++ return res;
++ }
++
++ drm_connector_helper_add(
++ &aconnector->base,
++ &amdgpu_dm_connector_helper_funcs);
++
++ amdgpu_dm_connector_init_helper(
++ dm,
++ aconnector,
++ connector_type,
++ link,
++ link_index);
+
+ drm_mode_connector_attach_encoder(
+ &aconnector->base, &aencoder->base);
+
+- /*drm_sysfs_connector_add(&dm_connector->base);*/
+-
+ drm_connector_register(&aconnector->base);
+
+ if (connector_type == DRM_MODE_CONNECTOR_DisplayPort)
+@@ -1856,7 +1871,6 @@ int amdgpu_dm_connector_init(
+ dm->backlight_link = link;
+ }
+ #endif
+- sema_init(&aconnector->mst_sem, 1);
+
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.h b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.h
+index 0639732..1b8b3eb 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.h
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.h
+@@ -85,6 +85,13 @@ int amdgpu_dm_connector_atomic_set_property(
+
+ int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev);
+
++void amdgpu_dm_connector_init_helper(
++ struct amdgpu_display_manager *dm,
++ struct amdgpu_connector *aconnector,
++ int connector_type,
++ const struct dc_link *link,
++ int link_index);
++
+ extern const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs;
+
+ #endif /* __AMDGPU_DM_TYPES_H__ */
+--
+2.7.4
+