]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/display: Use scaling for non-native resolutions on eDP
authorMario Limonciello <mario.limonciello@amd.com>
Tue, 3 Jun 2025 04:14:51 +0000 (23:14 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 18 Jun 2025 16:19:20 +0000 (12:19 -0400)
[Why]
Common resolutions are added to supported modes to enable compatibility
scenarios that compositors may use to do things like clone displays. There
is no guarantee however that the panel will natively support these modes.

[How]
If the compositor hasn't enabled scaling but a non-native resolution has
been picked for an eDP panel turn the scaler on anyway.  This will ensure
compatibility.

Reviewed-by: Roman Li <roman.li@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index a4e3448e5a2c636cca167219dab917e8e12ad046..12cbfd7ffbc7e33ce25a4e8e03ef97cd61ab8a7f 100644 (file)
@@ -7891,6 +7891,22 @@ static int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,
        int clock, bpp = 0;
        bool is_y420 = false;
 
+       if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
+               struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
+               struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
+               enum drm_mode_status result;
+
+               result = drm_crtc_helper_mode_valid_fixed(encoder->crtc, adjusted_mode, native_mode);
+               if (result != MODE_OK && dm_new_connector_state->scaling == RMX_OFF) {
+                       drm_dbg_driver(encoder->dev,
+                                      "mode %dx%d@%dHz is not native, enabling scaling\n",
+                                      adjusted_mode->hdisplay, adjusted_mode->vdisplay,
+                                      drm_mode_vrefresh(adjusted_mode));
+                       dm_new_connector_state->scaling = RMX_FULL;
+               }
+               return 0;
+       }
+
        if (!aconnector->mst_output_port)
                return 0;