Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp31129pxy; Thu, 29 Apr 2021 22:00:34 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyQ/DgaKwLn3Sze8FrlU4HoWTPxyfwFefu4r2/2TzXoZqaglCsAGgVrayLOFUw/Ivzp295C X-Received: by 2002:a05:6402:34cd:: with SMTP id w13mr3414670edc.73.1619758834231; Thu, 29 Apr 2021 22:00:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619758834; cv=none; d=google.com; s=arc-20160816; b=FhWrfQQ5ggQ0sWzMIeZsjZ1RDouNgyskvbG9+NfzNC09TAposkJpqqTmoysiMISSjf zmXGFQdBOfwAZGAsslSrt+icdLQhq9mOYq9PpyetQMj4tT1CzzL5LK6kT0PnCSu1Prus 7rG2fLXY/xiNjqxC/WCIbStt5haUqCIbDmCzJS/LGfC5x7S+CQf1DxCMc0yHzQFTj/kT Zs7RcyuepZyVv9sPISZ8E+QZlZc1G0IfAiFx+FDr7lVpO+Vywr63iJ1gyB4xPaau284q 0f4rS3kuD5TJyLnPG/ltsNbMnD/vm7sxZe7FBpjSsKob5B8dL3shytUjAhe58y25/Xqw 6xsQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=K7iY2Fn4xGo0PcYMp9NjAmHbGG4a/vcpt6x3wqLN5C0=; b=D7UDz67ihW27twVtVegNnK5Fz7Qog3rUmIUYUeSJkLVypSbi+usEWq/ji/lw7i56gl s91VxqAxqDfcjHc5fA1GQ/YrFWh5e03zgnP7qpu5QCsEjxdXthJh9GXPiBaKQ6C8C3d+ e/XCJ1szsL8HFUJl20pNaaAeNhPYM0QlxbDm+DhMAijkQFHtwprkTqiTAokYW2Pkm6RZ mOM4mfZJpqNCcdCVpzc4CuV8J2dcRphbccnlSfO1R1NVoHCOu1vZD58mY4k9R/9zHO79 LP7xcpyLCxesrcsz8UmKADoLILWXVshblxFLrNLmrQjCl0nn3K8A4BkPW7IXGmuanQZ1 C2hg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id gb6si1934054ejc.629.2021.04.29.22.00.08; Thu, 29 Apr 2021 22:00:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=canonical.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230082AbhD3E54 (ORCPT + 99 others); Fri, 30 Apr 2021 00:57:56 -0400 Received: from youngberry.canonical.com ([91.189.89.112]:43724 "EHLO youngberry.canonical.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229482AbhD3E5z (ORCPT ); Fri, 30 Apr 2021 00:57:55 -0400 Received: from 1-171-217-32.dynamic-ip.hinet.net ([1.171.217.32] helo=localhost) by youngberry.canonical.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.86_2) (envelope-from ) id 1lcLD6-0003dM-4f; Fri, 30 Apr 2021 04:57:04 +0000 From: Kai-Heng Feng To: alexander.deucher@amd.com, christian.koenig@amd.com Cc: Kai-Heng Feng , David Airlie , Daniel Vetter , amd-gfx@lists.freedesktop.org (open list:RADEON and AMDGPU DRM DRIVERS), dri-devel@lists.freedesktop.org (open list:DRM DRIVERS), linux-kernel@vger.kernel.org (open list) Subject: [PATCH v2] drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected Date: Fri, 30 Apr 2021 12:56:56 +0800 Message-Id: <20210430045656.577395-1-kai.heng.feng@canonical.com> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Screen flickers rapidly when two 4K 60Hz monitors are in use. This issue doesn't happen when one monitor is 4K 60Hz (pixelclock 594MHz) and another one is 4K 30Hz (pixelclock 297MHz). The issue is gone after setting "power_dpm_force_performance_level" to "high". Following the indication, we found that the issue occurs when sclk is too low. So resolve the issue by disabling sclk switching when there are two monitors requires high pixelclock (> 297MHz). v2: - Only apply the fix to Oland. Signed-off-by: Kai-Heng Feng --- drivers/gpu/drm/radeon/radeon.h | 1 + drivers/gpu/drm/radeon/radeon_pm.c | 8 ++++++++ drivers/gpu/drm/radeon/si_dpm.c | 3 +++ 3 files changed, 12 insertions(+) diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 42281fce552e6..56ed5634cebef 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -1549,6 +1549,7 @@ struct radeon_dpm { void *priv; u32 new_active_crtcs; int new_active_crtc_count; + int high_pixelclock_count; u32 current_active_crtcs; int current_active_crtc_count; bool single_display; diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 0c1950f4e146f..3861c0b98fcf3 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -1767,6 +1767,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) struct drm_device *ddev = rdev->ddev; struct drm_crtc *crtc; struct radeon_crtc *radeon_crtc; + struct radeon_connector *radeon_connector; if (!rdev->pm.dpm_enabled) return; @@ -1776,6 +1777,7 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) /* update active crtc counts */ rdev->pm.dpm.new_active_crtcs = 0; rdev->pm.dpm.new_active_crtc_count = 0; + rdev->pm.dpm.high_pixelclock_count = 0; if (rdev->num_crtc && rdev->mode_info.mode_config_initialized) { list_for_each_entry(crtc, &ddev->mode_config.crtc_list, head) { @@ -1783,6 +1785,12 @@ static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev) if (crtc->enabled) { rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id); rdev->pm.dpm.new_active_crtc_count++; + if (!radeon_crtc->connector) + continue; + + radeon_connector = to_radeon_connector(radeon_crtc->connector); + if (radeon_connector->pixelclock_for_modeset > 297000) + rdev->pm.dpm.high_pixelclock_count++; } } } diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 9186095518047..3cc2b96a7f368 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c @@ -2979,6 +2979,9 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, (rdev->pdev->device == 0x6605)) { max_sclk = 75000; } + + if (rdev->pm.dpm.high_pixelclock_count > 1) + disable_sclk_switching = true; } if (rps->vce_active) { -- 2.30.2