When the EDID of an analog display is not available, we can't
know the possible modes supported by the display. However, we
still need to offer the user to select from a variety of common
modes. It will be up to the user to select the best one, though.

This is how it works on other operating systems as well as the
legacy display code path in amdgpu.

Signed-off-by: Timur Kristóf <timur.kris...@gmail.com>
---
 .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 46 +++++++++++--------
 1 file changed, 28 insertions(+), 18 deletions(-)

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 49ee516dc83d..23333880f4e5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -8172,7 +8172,7 @@ static void amdgpu_dm_get_native_mode(struct 
drm_connector *connector)
 
 static struct drm_display_mode *
 amdgpu_dm_create_common_mode(struct drm_encoder *encoder,
-                            char *name,
+                            const char *name,
                             int hdisplay, int vdisplay)
 {
        struct drm_device *dev = encoder->dev;
@@ -8194,6 +8194,24 @@ amdgpu_dm_create_common_mode(struct drm_encoder *encoder,
 
 }
 
+static const struct amdgpu_dm_mode_size {
+       char name[DRM_DISPLAY_MODE_LEN];
+       int w;
+       int h;
+} common_modes[] = {
+       {  "640x480",  640,  480},
+       {  "800x600",  800,  600},
+       { "1024x768", 1024,  768},
+       { "1280x720", 1280,  720},
+       { "1280x800", 1280,  800},
+       {"1280x1024", 1280, 1024},
+       { "1440x900", 1440,  900},
+       {"1680x1050", 1680, 1050},
+       {"1600x1200", 1600, 1200},
+       {"1920x1080", 1920, 1080},
+       {"1920x1200", 1920, 1200}
+};
+
 static void amdgpu_dm_connector_add_common_modes(struct drm_encoder *encoder,
                                                 struct drm_connector 
*connector)
 {
@@ -8204,23 +8222,6 @@ static void amdgpu_dm_connector_add_common_modes(struct 
drm_encoder *encoder,
                                to_amdgpu_dm_connector(connector);
        int i;
        int n;
-       struct mode_size {
-               char name[DRM_DISPLAY_MODE_LEN];
-               int w;
-               int h;
-       } common_modes[] = {
-               {  "640x480",  640,  480},
-               {  "800x600",  800,  600},
-               { "1024x768", 1024,  768},
-               { "1280x720", 1280,  720},
-               { "1280x800", 1280,  800},
-               {"1280x1024", 1280, 1024},
-               { "1440x900", 1440,  900},
-               {"1680x1050", 1680, 1050},
-               {"1600x1200", 1600, 1200},
-               {"1920x1080", 1920, 1080},
-               {"1920x1200", 1920, 1200}
-       };
 
        n = ARRAY_SIZE(common_modes);
 
@@ -8440,6 +8441,15 @@ static int amdgpu_dm_connector_get_modes(struct 
drm_connector *connector)
                if (dc->link_srv->dp_get_encoding_format(verified_link_cap) == 
DP_128b_132b_ENCODING)
                        amdgpu_dm_connector->num_modes +=
                                drm_add_modes_noedid(connector, 1920, 1080);
+
+               if (amdgpu_dm_connector->dc_sink->edid_caps.analog) {
+                       /* Analog monitor connected by DAC load detection.
+                        * Add common modes. It will be up to the user to 
select one that works.
+                        */
+                       for (int i = 0; i < ARRAY_SIZE(common_modes); i++)
+                               amdgpu_dm_connector->num_modes += 
drm_add_modes_noedid(
+                                       connector, common_modes[i].w, 
common_modes[i].h);
+               }
        } else {
                amdgpu_dm_connector_ddc_get_modes(connector, drm_edid);
                if (encoder && (connector->connector_type != 
DRM_MODE_CONNECTOR_eDP) &&
-- 
2.50.1

Reply via email to