Commit 70181ad9 authored by Timur Kristóf's avatar Timur Kristóf Committed by Alex Deucher
Browse files

drm/amd/display: Add common modes to analog displays without EDID



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: default avatarTimur Kristóf <timur.kristof@gmail.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent ac1bb495
Loading
Loading
Loading
Loading
+28 −18
Original line number Diff line number Diff line
@@ -8412,7 +8412,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;
@@ -8434,17 +8434,7 @@ amdgpu_dm_create_common_mode(struct drm_encoder *encoder,

}

static void amdgpu_dm_connector_add_common_modes(struct drm_encoder *encoder,
						 struct drm_connector *connector)
{
	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
	struct drm_display_mode *mode = NULL;
	struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
	struct amdgpu_dm_connector *amdgpu_dm_connector =
				to_amdgpu_dm_connector(connector);
	int i;
	int n;
	struct mode_size {
static const struct amdgpu_dm_mode_size {
	char name[DRM_DISPLAY_MODE_LEN];
	int w;
	int h;
@@ -8462,6 +8452,17 @@ static void amdgpu_dm_connector_add_common_modes(struct drm_encoder *encoder,
	{"1920x1200", 1920, 1200}
};

static void amdgpu_dm_connector_add_common_modes(struct drm_encoder *encoder,
						 struct drm_connector *connector)
{
	struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
	struct drm_display_mode *mode = NULL;
	struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
	struct amdgpu_dm_connector *amdgpu_dm_connector =
				to_amdgpu_dm_connector(connector);
	int i;
	int n;

	if ((connector->connector_type != DRM_MODE_CONNECTOR_eDP) &&
	    (connector->connector_type != DRM_MODE_CONNECTOR_LVDS))
		return;
@@ -8684,6 +8685,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)