From nobody Tue Apr 7 15:26:15 2026 Received: from mail-ua1-f48.google.com (mail-ua1-f48.google.com [209.85.222.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC82B38553E for ; Wed, 25 Feb 2026 23:45:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772063124; cv=none; b=t9jQ5+FBOPhPxFslM8q+ddsAFOzhjLKOCD0p82Jpf8lhXGWI87l1XYoFYgPUNMEU122Q2/1Qp++Tizgpt9+AAs98J9jsglpSkLvmW8nydrdq9Cr1diFKXBjfO6kFyAv2myovOA9+p2/WsLhfEEd7nktsacArTzd4q0xqkyTYUpI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772063124; c=relaxed/simple; bh=w8WA7Ao1md+AcKIOtyNNqueTIL2uaFuOTkXlPk8NqaE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ZECYvLklipsGGv9fEujqdZHnj2n2gRU2jaRoyeiz0XB4J2fmM2B84Y7N5/jzAOuI97MEOGiuZxDXvccQugp4NflsT41/pD0armaQGF0EMYButUvQLGUif+mzXvHqPUamtqDJKur9MFXbICHFuP0hjtn8qWBinlWCOOiqqYl4I4Y= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=j23c0ln0; arc=none smtp.client-ip=209.85.222.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="j23c0ln0" Received: by mail-ua1-f48.google.com with SMTP id a1e0cc1a2514c-94aaa5d3bfcso154834241.3 for ; Wed, 25 Feb 2026 15:45:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772063122; x=1772667922; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PUr8SLvQryvqYLcag0z8osWYOXvaps7+TNLrrSYBjRQ=; b=j23c0ln0oIF6IPe9deOYG5f17ME/RqUZURVWq9pMw+tj3JQdcmUBtRAxUjU9mnhtsG r1Gufb420FONneZV6dbNg9+gUkzOQmDJhFHHrtF8eiT/NM5Y6Tweh4UBjawjyE3C3kHa RNCx1R9yR/Xp1wEkLC5j+U98X19Lg9kHxPAxS7NcQeEbgxx6GADpxGHXyl+sT5k9gRBQ ggf4hedAGopHQFNxNO8Km7iZbIB4gDBeCfbqS3HPuTGX1oVp7ysnlaNUmLM1AKZxNehw omyRIE0NO087yJO9kNiro4A9xteDe0eShr6RcZOlbbbhlFiFk9eia6v90IgwD3iVluDZ pxBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772063122; x=1772667922; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=PUr8SLvQryvqYLcag0z8osWYOXvaps7+TNLrrSYBjRQ=; b=sg8710/V3x4efXLiggdKHF5KLvNjjfCrAiFBOmcPFKE2qGDFrY3AE5X9YBiXUwZIXZ mWLdQ0+DfY5hk2a2zMs9Q+/Ub10Q38QaUcEgz5UlARsJkpOYVhd0xuO2L3iHLDNOnqO+ J3C/IXwJrSDWhnkHIyHQCKBxQukkntxUKWlJoGwBjf7KGmBpkG2hceCJHem6lY9PNlUD tRkVFCReYYa+Mw+ODeEcQTdBOYdctoQ4AU5JxeAC30Jl6i7lKuSFhdVyx4QF6pil8F2b MqeO8KbKYJU9HDZ79ugEO20cXcXYzwGrZSUgkn7sbWSaECs9F+1o2Isr/jMCylSa3mun uUDA== X-Forwarded-Encrypted: i=1; AJvYcCX4QJaLVLhhhe6W6pLvjZiMrzdbAM3dizQ0fq92IJTNi8J8rl9x+9Ea27uAtduY2YtIMO8sWqZrH6A3q3s=@vger.kernel.org X-Gm-Message-State: AOJu0YzTOXnrD2oX/G/eYzAE1gVf6QqXwvlvnjz7KVAfZxYc4FOpD8KY uQcEbAjaTEhv53DCOvcjhSOmRIV4A9lDtUTsvCx7fMOmrIIh6XacCfA0rxvjilkz X-Gm-Gg: ATEYQzwEpq/GWWjK74Sb0oIkyxXM0XqiCjZ02x4m6lxxnPoYWdplLTS1cEMSL6s1cu6 WFu9GqwxYD5cMX9zXkWpbMXJT4hPov7uQ6AXGdGE2bKVtjsaSrDvI1bdnO9SGxpBvnH7d58ecMw KiCeOEaHNXgOtaMSSjyreEhaoDDEgDvni13Q9zDy0tePc5R+xgLQLEgLiQB0ah4zu95p7X8Eh0g BcmDAtD5QYO08Ml+xlZHoTigHV4KipDX6+5RM5pv9S5lgGSRhCA6MmHu9DVbQOsawPAgNUOOIeg TU3GkFN/kYSV1d6crBbXbr/1vIzDRHc9t19rtfu127j02vfpmUXKjNBDJUT72dMD+EwziS+Aqk6 o54bnwLhsW3+0YsuO80WGKrp6+dGssowaidqOqOJe3gr/TnlCBtK9lZ+RyjIXt1z3mCu4rkqS+0 XoRidO+/jUdRdnHQ0iWn+WahviCROqYdJWVvXtFeeqB4KcGXiZGIIhzA== X-Received: by 2002:a05:6a20:c786:b0:35d:58d3:2904 with SMTP id adf61e73a8af0-395ad0da629mr1705437637.31.1772056238539; Wed, 25 Feb 2026 13:50:38 -0800 (PST) Received: from ryzen ([2601:644:8000:56f5::8bd]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c70fa8059bcsm11990a12.18.2026.02.25.13.50.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Feb 2026 13:50:36 -0800 (PST) From: Rosen Penev To: stable@vger.kernel.org Cc: Harry Wentland , Leo Li , Rodrigo Siqueira , Alex Deucher , =?UTF-8?q?Christian=20K=C3=B6nig?= , Xinhui Pan , David Airlie , Simona Vetter , Kenneth Feng , =?UTF-8?q?Timur=20Krist=C3=B3f?= , Greg Kroah-Hartman , Alex Hung , Lijo Lazar , "chr[]" , Sasha Levin , Wentao Liang , amd-gfx@lists.freedesktop.org (open list:AMD DISPLAY CORE), dri-devel@lists.freedesktop.org (open list:DRM DRIVERS), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 2/2] drm/amd/pm: Use pm_display_cfg in legacy DPM (v2) Date: Wed, 25 Feb 2026 13:50:13 -0800 Message-ID: <20260225215013.11224-3-rosenp@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260225215013.11224-1-rosenp@gmail.com> References: <20260225215013.11224-1-rosenp@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Timur Krist=C3=B3f commit 9d73b107a61b73e7101d4b728ddac3d2c77db111 upstream. This commit is necessary for DC to function well with chips that use the legacy power management code, ie. SI and KV. Communicate display information from DC to the legacy PM code. Currently DC uses pm_display_cfg to communicate power management requirements from the display code to the DPM code. However, the legacy (non-DC) code path used different fields and therefore could not take into account anything from DC. Change the legacy display code to fill the same pm_display_cfg struct as DC and use the same in the legacy DPM code. To ease review and reduce churn, this commit does not yet delete the now unneeded code, that is done in the next commit. v2: Rebase. Fix single_display in amdgpu_dpm_pick_power_state. Signed-off-by: Timur Krist=C3=B3f Signed-off-by: Alex Deucher --- drivers/gpu/drm/amd/pm/amdgpu_dpm_internal.c | 67 +++++++++++++++++++ .../gpu/drm/amd/pm/inc/amdgpu_dpm_internal.h | 2 + drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 4 +- .../gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c | 6 +- drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c | 65 ++++++------------ .../gpu/drm/amd/pm/powerplay/amd_powerplay.c | 11 +-- 6 files changed, 97 insertions(+), 58 deletions(-) diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm_internal.c b/drivers/gpu/drm= /amd/pm/amdgpu_dpm_internal.c index 2d2d2d5e6763..9ef965e4a92e 100644 --- a/drivers/gpu/drm/amd/pm/amdgpu_dpm_internal.c +++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm_internal.c @@ -100,3 +100,70 @@ u32 amdgpu_dpm_get_vrefresh(struct amdgpu_device *adev) =20 return vrefresh; } + +void amdgpu_dpm_get_display_cfg(struct amdgpu_device *adev) +{ + struct drm_device *ddev =3D adev_to_drm(adev); + struct amd_pp_display_configuration *cfg =3D &adev->pm.pm_display_cfg; + struct single_display_configuration *display_cfg; + struct drm_crtc *crtc; + struct amdgpu_crtc *amdgpu_crtc; + struct amdgpu_connector *conn; + int num_crtcs =3D 0; + int vrefresh; + u32 vblank_in_pixels, vblank_time_us; + + cfg->min_vblank_time =3D 0xffffffff; /* if the displays are off, vblank t= ime is max */ + + if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) { + list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) { + amdgpu_crtc =3D to_amdgpu_crtc(crtc); + + /* The array should only contain active displays. */ + if (!amdgpu_crtc->enabled) + continue; + + conn =3D to_amdgpu_connector(amdgpu_crtc->connector); + display_cfg =3D &adev->pm.pm_display_cfg.displays[num_crtcs++]; + + if (amdgpu_crtc->hw_mode.clock) { + vrefresh =3D drm_mode_vrefresh(&amdgpu_crtc->hw_mode); + + vblank_in_pixels =3D + amdgpu_crtc->hw_mode.crtc_htotal * + (amdgpu_crtc->hw_mode.crtc_vblank_end - + amdgpu_crtc->hw_mode.crtc_vdisplay + + (amdgpu_crtc->v_border * 2)); + + vblank_time_us =3D + vblank_in_pixels * 1000 / amdgpu_crtc->hw_mode.clock; + + /* The legacy (non-DC) code has issues with mclk switching + * with refresh rates over 120 Hz. Disable mclk switching. + */ + if (vrefresh > 120) + vblank_time_us =3D 0; + + /* Find minimum vblank time. */ + if (vblank_time_us < cfg->min_vblank_time) + cfg->min_vblank_time =3D vblank_time_us; + + /* Find vertical refresh rate of first active display. */ + if (!cfg->vrefresh) + cfg->vrefresh =3D vrefresh; + } + + if (amdgpu_crtc->crtc_id < cfg->crtc_index) { + /* Find first active CRTC and its line time. */ + cfg->crtc_index =3D amdgpu_crtc->crtc_id; + cfg->line_time_in_us =3D amdgpu_crtc->line_time; + } + + display_cfg->controller_id =3D amdgpu_crtc->crtc_id; + display_cfg->pixel_clock =3D conn->pixelclock_for_modeset; + } + } + + cfg->display_clk =3D adev->clock.default_dispclk; + cfg->num_display =3D num_crtcs; +} diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm_internal.h b/drivers/gpu= /drm/amd/pm/inc/amdgpu_dpm_internal.h index 5c2a89f0d5d5..8be11510cd92 100644 --- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm_internal.h +++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm_internal.h @@ -29,4 +29,6 @@ u32 amdgpu_dpm_get_vblank_time(struct amdgpu_device *adev= ); =20 u32 amdgpu_dpm_get_vrefresh(struct amdgpu_device *adev); =20 +void amdgpu_dpm_get_display_cfg(struct amdgpu_device *adev); + #endif diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c b/drivers/gpu/drm/a= md/pm/legacy-dpm/kv_dpm.c index 6b34a33d788f..8cf7e517da84 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c @@ -2299,7 +2299,7 @@ static void kv_apply_state_adjust_rules(struct amdgpu= _device *adev, =20 if (pi->sys_info.nb_dpm_enable) { force_high =3D (mclk >=3D pi->sys_info.nbp_memory_clock[3]) || - pi->video_start || (adev->pm.dpm.new_active_crtc_count >=3D 3) || + pi->video_start || (adev->pm.pm_display_cfg.num_display >=3D 3) || pi->disable_nb_ps3_in_battery; ps->dpm0_pg_nb_ps_lo =3D force_high ? 0x2 : 0x3; ps->dpm0_pg_nb_ps_hi =3D 0x2; @@ -2358,7 +2358,7 @@ static int kv_calculate_nbps_level_settings(struct am= dgpu_device *adev) return 0; =20 force_high =3D ((mclk >=3D pi->sys_info.nbp_memory_clock[3]) || - (adev->pm.dpm.new_active_crtc_count >=3D 3) || pi->video_start); + (adev->pm.pm_display_cfg.num_display >=3D 3) || pi->video_start); =20 if (force_high) { for (i =3D pi->lowest_valid; i <=3D pi->highest_valid; i++) diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c b/drivers/gpu/d= rm/amd/pm/legacy-dpm/legacy_dpm.c index c7518b13e787..8eb121db2ce4 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/legacy_dpm.c @@ -797,8 +797,7 @@ static struct amdgpu_ps *amdgpu_dpm_pick_power_state(st= ruct amdgpu_device *adev, int i; struct amdgpu_ps *ps; u32 ui_class; - bool single_display =3D (adev->pm.dpm.new_active_crtc_count < 2) ? - true : false; + bool single_display =3D adev->pm.pm_display_cfg.num_display < 2; =20 /* check if the vblank period is too short to adjust the mclk */ if (single_display && adev->powerplay.pp_funcs->vblank_too_short) { @@ -994,7 +993,8 @@ void amdgpu_legacy_dpm_compute_clocks(void *handle) { struct amdgpu_device *adev =3D (struct amdgpu_device *)handle; =20 - amdgpu_dpm_get_active_displays(adev); + if (!adev->dc_enabled) + amdgpu_dpm_get_display_cfg(adev); =20 amdgpu_dpm_change_power_state_locked(adev); } diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c b/drivers/gpu/drm/a= md/pm/legacy-dpm/si_dpm.c index 29cecfab0704..7ea310601ff5 100644 --- a/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/si_dpm.c @@ -3058,7 +3058,7 @@ static int si_get_vce_clock_voltage(struct amdgpu_dev= ice *adev, static bool si_dpm_vblank_too_short(void *handle) { struct amdgpu_device *adev =3D (struct amdgpu_device *)handle; - u32 vblank_time =3D amdgpu_dpm_get_vblank_time(adev); + u32 vblank_time =3D adev->pm.pm_display_cfg.min_vblank_time; /* we never hit the non-gddr5 limit so disable it */ u32 switch_limit =3D adev->gmc.vram_type =3D=3D AMDGPU_VRAM_TYPE_GDDR5 ? = 450 : 0; =20 @@ -3424,9 +3424,10 @@ static void rv770_get_engine_memory_ss(struct amdgpu= _device *adev) static void si_apply_state_adjust_rules(struct amdgpu_device *adev, struct amdgpu_ps *rps) { + const struct amd_pp_display_configuration *display_cfg =3D + &adev->pm.pm_display_cfg; struct si_ps *ps =3D si_get_ps(rps); struct amdgpu_clock_and_voltage_limits *max_limits; - struct amdgpu_connector *conn; bool disable_mclk_switching =3D false; bool disable_sclk_switching =3D false; u32 mclk, sclk; @@ -3470,14 +3471,9 @@ static void si_apply_state_adjust_rules(struct amdgp= u_device *adev, * For example, 4K 60Hz and 1080p 144Hz fall into this category. * Find number of such displays connected. */ - for (i =3D 0; i < adev->mode_info.num_crtc; i++) { - if (!(adev->pm.dpm.new_active_crtcs & (1 << i)) || - !adev->mode_info.crtcs[i]->enabled) - continue; - - conn =3D to_amdgpu_connector(adev->mode_info.crtcs[i]->connector); - - if (conn->pixelclock_for_modeset > 297000) + for (i =3D 0; i < display_cfg->num_display; i++) { + /* The array only contains active displays. */ + if (display_cfg->displays[i].pixel_clock > 297000) high_pixelclock_count++; } =20 @@ -3510,7 +3506,7 @@ static void si_apply_state_adjust_rules(struct amdgpu= _device *adev, rps->ecclk =3D 0; } =20 - if ((adev->pm.dpm.new_active_crtc_count > 1) || + if ((adev->pm.pm_display_cfg.num_display > 1) || si_dpm_vblank_too_short(adev)) disable_mclk_switching =3D true; =20 @@ -3658,7 +3654,7 @@ static void si_apply_state_adjust_rules(struct amdgpu= _device *adev, ps->performance_levels[i].mclk, max_limits->vddc, &ps->performance_levels[i].vddc); btc_apply_voltage_dependency_rules(&adev->pm.dpm.dyn_state.vddc_dependen= cy_on_dispclk, - adev->clock.current_dispclk, + display_cfg->display_clk, max_limits->vddc, &ps->performance_levels[i].vddc); } =20 @@ -4183,16 +4179,16 @@ static void si_program_ds_registers(struct amdgpu_d= evice *adev) =20 static void si_program_display_gap(struct amdgpu_device *adev) { + const struct amd_pp_display_configuration *cfg =3D &adev->pm.pm_display_c= fg; u32 tmp, pipe; - int i; =20 tmp =3D RREG32(CG_DISPLAY_GAP_CNTL) & ~(DISP1_GAP_MASK | DISP2_GAP_MASK); - if (adev->pm.dpm.new_active_crtc_count > 0) + if (cfg->num_display > 0) tmp |=3D DISP1_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM); else tmp |=3D DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE); =20 - if (adev->pm.dpm.new_active_crtc_count > 1) + if (cfg->num_display > 1) tmp |=3D DISP2_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM); else tmp |=3D DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE); @@ -4202,17 +4198,8 @@ static void si_program_display_gap(struct amdgpu_dev= ice *adev) tmp =3D RREG32(DCCG_DISP_SLOW_SELECT_REG); pipe =3D (tmp & DCCG_DISP1_SLOW_SELECT_MASK) >> DCCG_DISP1_SLOW_SELECT_SH= IFT; =20 - if ((adev->pm.dpm.new_active_crtc_count > 0) && - (!(adev->pm.dpm.new_active_crtcs & (1 << pipe)))) { - /* find the first active crtc */ - for (i =3D 0; i < adev->mode_info.num_crtc; i++) { - if (adev->pm.dpm.new_active_crtcs & (1 << i)) - break; - } - if (i =3D=3D adev->mode_info.num_crtc) - pipe =3D 0; - else - pipe =3D i; + if (cfg->num_display > 0 && pipe !=3D cfg->crtc_index) { + pipe =3D cfg->crtc_index; =20 tmp &=3D ~DCCG_DISP1_SLOW_SELECT_MASK; tmp |=3D DCCG_DISP1_SLOW_SELECT(pipe); @@ -4223,7 +4210,7 @@ static void si_program_display_gap(struct amdgpu_devi= ce *adev) * This can be a problem on PowerXpress systems or if you want to use the= card * for offscreen rendering or compute if there are no crtcs enabled. */ - si_notify_smc_display_change(adev, adev->pm.dpm.new_active_crtc_count > 0= ); + si_notify_smc_display_change(adev, cfg->num_display > 0); } =20 static void si_enable_spread_spectrum(struct amdgpu_device *adev, bool ena= ble) @@ -5527,7 +5514,7 @@ static int si_convert_power_level_to_smc(struct amdgp= u_device *adev, (pl->mclk <=3D pi->mclk_stutter_mode_threshold) && !eg_pi->uvd_enabled && (RREG32(DPG_PIPE_STUTTER_CONTROL) & STUTTER_ENABLE) && - (adev->pm.dpm.new_active_crtc_count <=3D 2)) { + (adev->pm.pm_display_cfg.num_display <=3D 2)) { level->mcFlags |=3D SISLANDS_SMC_MC_STUTTER_EN; } =20 @@ -5676,7 +5663,7 @@ static bool si_is_state_ulv_compatible(struct amdgpu_= device *adev, /* XXX validate against display requirements! */ =20 for (i =3D 0; i < adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.count= ; i++) { - if (adev->clock.current_dispclk <=3D + if (adev->pm.pm_display_cfg.display_clk <=3D adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[i].clk) { if (ulv->pl.vddc < adev->pm.dpm.dyn_state.vddc_dependency_on_dispclk.entries[i].v) @@ -5830,30 +5817,22 @@ static int si_upload_ulv_state(struct amdgpu_device= *adev) =20 static int si_upload_smc_data(struct amdgpu_device *adev) { - struct amdgpu_crtc *amdgpu_crtc =3D NULL; - int i; + const struct amd_pp_display_configuration *cfg =3D &adev->pm.pm_display_c= fg; u32 crtc_index =3D 0; u32 mclk_change_block_cp_min =3D 0; u32 mclk_change_block_cp_max =3D 0; =20 - for (i =3D 0; i < adev->mode_info.num_crtc; i++) { - if (adev->pm.dpm.new_active_crtcs & (1 << i)) { - amdgpu_crtc =3D adev->mode_info.crtcs[i]; - break; - } - } - /* When a display is plugged in, program these so that the SMC * performs MCLK switching when it doesn't cause flickering. * When no display is plugged in, there is no need to restrict * MCLK switching, so program them to zero. */ - if (adev->pm.dpm.new_active_crtc_count && amdgpu_crtc) { - crtc_index =3D amdgpu_crtc->crtc_id; + if (cfg->num_display) { + crtc_index =3D cfg->crtc_index; =20 - if (amdgpu_crtc->line_time) { - mclk_change_block_cp_min =3D 200 / amdgpu_crtc->line_time; - mclk_change_block_cp_max =3D 100 / amdgpu_crtc->line_time; + if (cfg->line_time_in_us) { + mclk_change_block_cp_min =3D 200 / cfg->line_time_in_us; + mclk_change_block_cp_max =3D 100 / cfg->line_time_in_us; } } =20 diff --git a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c b/drivers/gpu= /drm/amd/pm/powerplay/amd_powerplay.c index 0115d26b5af9..24b25cddf0c1 100644 --- a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c +++ b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c @@ -1569,16 +1569,7 @@ static void pp_pm_compute_clocks(void *handle) struct amdgpu_device *adev =3D hwmgr->adev; =20 if (!adev->dc_enabled) { - amdgpu_dpm_get_active_displays(adev); - adev->pm.pm_display_cfg.num_display =3D adev->pm.dpm.new_active_crtc_cou= nt; - adev->pm.pm_display_cfg.vrefresh =3D amdgpu_dpm_get_vrefresh(adev); - adev->pm.pm_display_cfg.min_vblank_time =3D amdgpu_dpm_get_vblank_time(a= dev); - /* we have issues with mclk switching with - * refresh rates over 120 hz on the non-DC code. - */ - if (adev->pm.pm_display_cfg.vrefresh > 120) - adev->pm.pm_display_cfg.min_vblank_time =3D 0; - + amdgpu_dpm_get_display_cfg(adev); pp_display_configuration_change(handle, &adev->pm.pm_display_cfg); } --=20 2.53.0