From nobody Thu Mar 5 08:15:13 2026 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (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 F2892255F28 for ; Mon, 16 Feb 2026 16:45:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260325; cv=none; b=AdgZA5V20Q2m8LF5bix/Dpt0ulcb9UMsCDR+Uvhhgp3WfMrN4ULq+MgdymtoeUSzISfzFZss0ktNriaYM/phEpJyUDyTS7jrMtlqVSu89Gm1v2QIM3kZ4t+iYKVvsLGIn90EF/nF4vznVV1vgwTIYWfUGQhIevI4knHO5eiJ1nY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260325; c=relaxed/simple; bh=ge376fZngo0uEz8jcG4h1tFahkAHHnPtZ3dtQxp8FI8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=k9r75JRhzuzz1HHiNYwCFTCztI9+otvL3BD8MUe4P8F3LtNitKxufu6FSQBgwGt0Snrt5z0827aS+9F3S59nFECDX2Xt+ibohkCCVzTIRASujDCrqFvAdS1LDWrGM47GRYujTwOOrmIBkYZR8d64in8QEJYDiWalZru30gWLDSs= 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=KsESiKk6; arc=none smtp.client-ip=209.85.218.54 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="KsESiKk6" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-b8f7fd33bd2so48120466b.3 for ; Mon, 16 Feb 2026 08:45:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771260322; x=1771865122; 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=ZnYsqKjwkdi7cukTOBwMkwqlRWnCwHpOCDkCCBv/1xY=; b=KsESiKk6ZtlKNrQxuxN+4xjuJhEeEkvSBML6YynB8ca/FsqwlnJY9rn5tf+Zr8OR3f NBcOkVdiZpylR8omClKzfyS2zVKbF8JYDqKgn/o67oLuqAmSEV0Vij9XPJlHggiVOnGr eaPbeuehszRFE5J2w4FpWwsxwbZst12SMwvfgvkhyQSxIwmTMscrcCqBcKRWxbqQSpYJ nRedpKhp/BzJJddIN6QyybxOJgxpS6qFGluXElaAbCy/OLA+iwlRU0ykS3EYX1DkmZdg 1kHbq/7lscotnX9ye3FdmGNVGCihJMpgkJ3mDqCobXDFbVfdq6WwaUJQPT0JZtXO6ROT aK6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771260322; x=1771865122; 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=ZnYsqKjwkdi7cukTOBwMkwqlRWnCwHpOCDkCCBv/1xY=; b=lR0xWLa3v33ogH04uthjPcdXzvhhRUe2BZV/o/jgAb6HycKIJJ6sLS2thHASgca4Ct fisHOynS7fAHVzkiPBdvws3KY5sV+CTbTHRYFddEt77MXO5v0M5sxXMrnJK9v839PC8Z 7nUKzmzVUwyO8qW8k0W05QauAWpLfqc2cjE01Xoo20XOyZKQHm0XSZ8JuYVmBUHLSY/d Nr+uIoyFBELzkhv+6aV1Wtwd0VySdeeFEhK6K5vA/tmHvv5QZ8dGMqldHc1rWEUYgd2y Ll1AVeS9ejRfafrphRtktJjjQjexIbvvTYa/Z9BcUqpUNxEeEhX0D+cMYuRg2NAy1wgq lmhQ== X-Forwarded-Encrypted: i=1; AJvYcCXjbz9d8rcP8mK8Ssjz3aQZWMVKpD5yJH7lK4DLmJrcoN4wNN0T0umBI0TltdtA+pJB/xWcInOgeFq+rMk=@vger.kernel.org X-Gm-Message-State: AOJu0Yzwre4VH3PH4UOhYz9uKzWyuhlMBjTOIGN6d63gMTTv4pUTZ3qC Y72KFst1K1NRbfgJgw3z7rR8zUyE9vXDfb6nsoXjP5cpDE3z5GlHfS3y X-Gm-Gg: AZuq6aK5F/mAhb0hcwLN2FnNzLONnFtWw5twV+2MmMeRCrAE+o+qi8N0Vgh9KLaJcN2 DdPF/pYnagnMiFanxjKaQN/wF2lZJWM5jB87W8fA6uN5OYpJxtehCzRWWY8IK1j4tPc0n/HeEOG iZzq0rxvLEuV8ZZcFs9XiQOeDzbE/vuGE2+3UIy3ph1/tdqSIJhvt0CSXW+hk2ZNDLJtkpI0MvG WWIn36y3JXbTvvtZ1LN9TdN0fOCofEAcl+yjI1Hekty+H0QKXT1VYmlHO0zs78HcY6melZIt41/ c1uQ+P4USYGfubgKIjPRn78t5H58KBa3Emt2cNiHQcnM60foJZkjO3iXjv7blyVS3zdY79kbnGd sIcGFTAMfAP8piIffViVdlGyHJP6Gn5LagUG7T/YYvx5rVN4TE7TpSuh6L7rVuMLsbWonC+ENbA waRIiYfy2Wubf7qI9JnaJxJw2hAA5CacfK2aJCycI+6X8fJhSGYoaG0YIC97GDe5VpD0hgPBvKD 7Aw X-Received: by 2002:a17:907:3e88:b0:b73:59b0:34c6 with SMTP id a640c23a62f3a-b8face510e0mr348057966b.4.1771260321971; Mon, 16 Feb 2026 08:45:21 -0800 (PST) Received: from laptok.lan (87-205-5-123.static.ip.netia.com.pl. [87.205.5.123]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b8fc735d185sm264683866b.14.2026.02.16.08.45.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 08:45:21 -0800 (PST) From: =?UTF-8?q?Tomasz=20Paku=C5=82a?= To: alexander.deucher@amd.com, harry.wentland@amd.com, sunpeng.li@amd.com Cc: maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, siqueira@igalia.com, dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, tomasz.pakula.oficjalny@gmail.com, bernhard.berger@gmail.com, michel.daenzer@mailbox.org, daniel@fooishbar.org Subject: [PATCH v4 02/27] drm/amd/display: Refactor amdgpu_dm_update_freesync_caps() Date: Mon, 16 Feb 2026 17:44:51 +0100 Message-ID: <20260216164516.36803-3-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260216164516.36803-1-tomasz.pakula.oficjalny@gmail.com> References: <20260216164516.36803-1-tomasz.pakula.oficjalny@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 [Why] This function started to get very messy and hard to follow. [How] Eject some functionality to separate functions and simplify greatly. Signed-off-by: Tomasz Paku=C5=82a --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 110 +++++++++++------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 2d770ed98871..6218ad911fde 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -13144,8 +13144,8 @@ static void parse_edid_displayid_vrr(struct drm_con= nector *connector, } } =20 -static int parse_amd_vsdb(struct amdgpu_dm_connector *aconnector, - const struct edid *edid, struct amdgpu_hdmi_vsdb_info *vsdb_info) +static int parse_amd_vsdb_did(struct amdgpu_dm_connector *aconnector, + const struct edid *edid, struct amdgpu_hdmi_vsdb_info *vsdb_info) { u8 *edid_ext =3D NULL; int i; @@ -13199,13 +13199,13 @@ static int parse_amd_vsdb(struct amdgpu_dm_connec= tor *aconnector, return false; } =20 -static int parse_hdmi_amd_vsdb(struct amdgpu_dm_connector *aconnector, +static bool parse_amd_vsdb_cea(struct amdgpu_dm_connector *aconnector, const struct edid *edid, struct amdgpu_hdmi_vsdb_info *vsdb_info) { + struct amdgpu_hdmi_vsdb_info vsdb_local =3D {0}; u8 *edid_ext =3D NULL; int i; - bool valid_vsdb_found =3D false; =20 /*----- drm_find_cea_extension() -----*/ /* No EDID or EDID extensions */ @@ -13226,9 +13226,47 @@ static int parse_hdmi_amd_vsdb(struct amdgpu_dm_co= nnector *aconnector, if (edid_ext[0] !=3D CEA_EXT) return -ENODEV; =20 - valid_vsdb_found =3D parse_edid_cea(aconnector, edid_ext, EDID_LENGTH, vs= db_info); + if (!parse_edid_cea(aconnector, edid_ext, EDID_LENGTH, &vsdb_local)) + return -ENODEV; =20 - return valid_vsdb_found ? i : -ENODEV; + *vsdb_info =3D vsdb_local; + return false; +} + +static bool is_monitor_range_invalid(const struct drm_connector *conn) +{ + return conn->display_info.monitor_range.min_vfreq =3D=3D 0 || + conn->display_info.monitor_range.max_vfreq =3D=3D 0; +} + +/* + * Returns true if (max_vfreq - min_vfreq) > 10 + */ +static bool is_freesync_capable(const struct drm_monitor_range_info *range) +{ + return (range->max_vfreq - range->min_vfreq) > 10; +} + +static void monitor_range_from_vsdb(struct drm_display_info *display, + const struct amdgpu_hdmi_vsdb_info *vsdb) +{ + display->monitor_range.min_vfreq =3D vsdb->min_refresh_rate_hz; + display->monitor_range.max_vfreq =3D vsdb->max_refresh_rate_hz; +} + +/* + * Returns true if connector is capable of freesync + * Optionally, can fetch the range from AMD vsdb + */ +static bool copy_range_to_amdgpu_connector(struct drm_connector *conn) +{ + struct amdgpu_dm_connector *aconn =3D to_amdgpu_dm_connector(conn); + struct drm_monitor_range_info *range =3D &conn->display_info.monitor_rang= e; + + aconn->min_vfreq =3D range->min_vfreq; + aconn->max_vfreq =3D range->max_vfreq; + + return is_freesync_capable(range); } =20 /** @@ -13245,13 +13283,14 @@ static int parse_hdmi_amd_vsdb(struct amdgpu_dm_c= onnector *aconnector, void amdgpu_dm_update_freesync_caps(struct drm_connector *connector, const struct drm_edid *drm_edid) { - int i =3D 0; struct amdgpu_dm_connector *amdgpu_dm_connector =3D to_amdgpu_dm_connector(connector); struct dm_connector_state *dm_con_state =3D NULL; struct dc_sink *sink; struct amdgpu_device *adev =3D drm_to_adev(connector->dev); struct amdgpu_hdmi_vsdb_info vsdb_info =3D {0}; + struct amdgpu_hdmi_vsdb_info vsdb_did =3D {0}; + struct dpcd_caps dpcd_caps =3D {0}; const struct edid *edid; bool freesync_capable =3D false; enum adaptive_sync_type as_type =3D ADAPTIVE_SYNC_TYPE_NONE; @@ -13284,60 +13323,49 @@ void amdgpu_dm_update_freesync_caps(struct drm_co= nnector *connector, =20 edid =3D drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw() =20 + if (amdgpu_dm_connector->dc_link) + dpcd_caps =3D amdgpu_dm_connector->dc_link->dpcd_caps; + /* Some eDP panels only have the refresh rate range info in DisplayID */ - if ((connector->display_info.monitor_range.min_vfreq =3D=3D 0 || - connector->display_info.monitor_range.max_vfreq =3D=3D 0)) + if (is_monitor_range_invalid(connector)) parse_edid_displayid_vrr(connector, edid); =20 if (edid && (sink->sink_signal =3D=3D SIGNAL_TYPE_DISPLAY_PORT || sink->sink_signal =3D=3D SIGNAL_TYPE_EDP)) { - if (amdgpu_dm_connector->dc_link && - amdgpu_dm_connector->dc_link->dpcd_caps.allow_invalid_MSA_timing_par= am) { - amdgpu_dm_connector->min_vfreq =3D connector->display_info.monitor_rang= e.min_vfreq; - amdgpu_dm_connector->max_vfreq =3D connector->display_info.monitor_rang= e.max_vfreq; - if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 1= 0) - freesync_capable =3D true; - } =20 - parse_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info); + if (dpcd_caps.allow_invalid_MSA_timing_param) + freesync_capable =3D copy_range_to_amdgpu_connector(connector); =20 - if (vsdb_info.replay_mode) { - amdgpu_dm_connector->vsdb_info.replay_mode =3D vsdb_info.replay_mode; - amdgpu_dm_connector->vsdb_info.amd_vsdb_version =3D vsdb_info.amd_vsdb_= version; + /* eDP */ + parse_amd_vsdb_did(amdgpu_dm_connector, edid, &vsdb_did); + if (vsdb_did.replay_mode) { + amdgpu_dm_connector->vsdb_info.replay_mode =3D vsdb_did.replay_mode; + amdgpu_dm_connector->vsdb_info.amd_vsdb_version =3D vsdb_did.amd_vsdb_v= ersion; amdgpu_dm_connector->as_type =3D ADAPTIVE_SYNC_TYPE_EDP; } =20 - } else if (drm_edid && sink->sink_signal =3D=3D SIGNAL_TYPE_HDMI_TYPE_A) { - i =3D parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info); - if (i >=3D 0 && vsdb_info.freesync_supported) { - amdgpu_dm_connector->min_vfreq =3D vsdb_info.min_refresh_rate_hz; - amdgpu_dm_connector->max_vfreq =3D vsdb_info.max_refresh_rate_hz; - if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 1= 0) - freesync_capable =3D true; - - connector->display_info.monitor_range.min_vfreq =3D vsdb_info.min_refre= sh_rate_hz; - connector->display_info.monitor_range.max_vfreq =3D vsdb_info.max_refre= sh_rate_hz; + } else if (sink->sink_signal =3D=3D SIGNAL_TYPE_HDMI_TYPE_A && + drm_edid) { + parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_info); + if (vsdb_info.freesync_supported) { + monitor_range_from_vsdb(&connector->display_info, &vsdb_info); + freesync_capable =3D copy_range_to_amdgpu_connector(connector); } } =20 if (amdgpu_dm_connector->dc_link) as_type =3D dm_get_adaptive_sync_support_type(amdgpu_dm_connector->dc_li= nk); =20 - if (as_type =3D=3D FREESYNC_TYPE_PCON_IN_WHITELIST) { - i =3D parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info); - if (i >=3D 0 && vsdb_info.freesync_supported && vsdb_info.amd_vsdb_versi= on > 0) { - + if (as_type =3D=3D FREESYNC_TYPE_PCON_IN_WHITELIST && drm_edid) { + parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_info); + if (vsdb_info.freesync_supported) { amdgpu_dm_connector->pack_sdp_v1_3 =3D true; amdgpu_dm_connector->as_type =3D as_type; amdgpu_dm_connector->vsdb_info =3D vsdb_info; =20 - amdgpu_dm_connector->min_vfreq =3D vsdb_info.min_refresh_rate_hz; - amdgpu_dm_connector->max_vfreq =3D vsdb_info.max_refresh_rate_hz; - if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 1= 0) - freesync_capable =3D true; - - connector->display_info.monitor_range.min_vfreq =3D vsdb_info.min_refre= sh_rate_hz; - connector->display_info.monitor_range.max_vfreq =3D vsdb_info.max_refre= sh_rate_hz; + parse_amd_vsdb_cea(amdgpu_dm_connector, edid, &vsdb_info); + monitor_range_from_vsdb(&connector->display_info, &vsdb_info); + freesync_capable =3D copy_range_to_amdgpu_connector(connector); } } =20 --=20 2.53.0