From nobody Thu Mar 5 08:45:20 2026 Received: from mail-ej1-f65.google.com (mail-ej1-f65.google.com [209.85.218.65]) (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 9DA441FF61E for ; Mon, 16 Feb 2026 16:45:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.65 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260353; cv=none; b=tjPQKZyY7k9BP7Hbs7REMZwKn/SQYp2ZNm/zw8iWbNoX46UFSsLjVqK84BYIPsJTfjc3WcApoU5SOaIzM0eCoZDk19X/JNA3g/4fcNFlPqiKLn0FgDYOsoXcHPOo8op4eQ505RxlotBGL3+G8R7Wnymm/PECMivS67vnbOfAAak= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260353; c=relaxed/simple; bh=8JKSbN+ojDSOaSy4mJMfewsIHZ4i0Uszstnts+9HmmA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=W2GHoUJLpZSjkSqXDNnMXh8sA2FXSBtUbMNOUnGcJf0mKqW5ychrSzzXED/SAdWLAvx770hh5cUOHcPL1+flcOc0NbIqUtfrcjRVIFG1UOxCNWYWGUE4XTu2tyesdic5drxXr90lVRCZ/R2fUnMfXzoZwuksxjupSDXoEVbxpMU= 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=GM4z8Qp7; arc=none smtp.client-ip=209.85.218.65 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="GM4z8Qp7" Received: by mail-ej1-f65.google.com with SMTP id a640c23a62f3a-b8de2b5a122so59444966b.0 for ; Mon, 16 Feb 2026 08:45:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771260350; x=1771865150; 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=8GHywGhoa9nMFX4SKcKZGp9++GBGqwr6bmHnyfGvrOs=; b=GM4z8Qp7BcWYYOHD0z97bINUTUuBWDNEkToUfuHB85BFNQu2nBLtAi1LE9uecwq8H8 Wu2hQRnceXV/RwCz9E1AYm/4F0c4RF2DSJ+wr1vD1brBbH64is1Y32Cmiu7skL8nRJr1 c5khwjyKDppmMsLZ+2EQ+YBLQKB1NJChWnVs8OlGPVqvpS6LnVQ4d/JaDfBQblONPYrt mSS69P/k6wyCm4/+gFVRQ56zZnraA7s3IpwKVAGbIr8WaGLZ03GTG3WS4b2T2dQnEYqk bxzRhTx3lLUQ2HhHpcIJGmUoG1D9YGAOYIC++NCwuc6E8mCxV4nlAafAxgqEaiMGX4rx k4GA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771260350; x=1771865150; 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=8GHywGhoa9nMFX4SKcKZGp9++GBGqwr6bmHnyfGvrOs=; b=SqTNUDSgZh92Xg9ExWuP7WJy+3sYjV3vyMQ/oKUmldpJyC2aHWLNirpHOyvemRjQO4 Wf/O+GVx7zMBfuAAswgSVE0WfywG/6DKti/8bYwSTJnj1PF106W7nN/Yv+R9ZHZ58iZn PB30IEimsXrPYFXjZq8iGGkMt/wVMTgJnZYI4SU9GOtsypi9rhBaFzCeaJwsdFTbdLN0 x3xAet4d4MGehN3MJWAqq4SK7khb1jXc02AI0GlZptTmCJTIEavuEkbILppXPDyfLJsd mW+8HOIgLUuXg1Mdc2rj9HYi6gRqABqxXiZHNknOQ9jJu3LrJ6AhPH5rmwP7pSeEfjRN 9QCw== X-Forwarded-Encrypted: i=1; AJvYcCV1ndJ1Ro4yIwsdFC4P6DyEWKD88tmgIwI17WRU0mDYVncxfRi5TbtxSH6SF0ImQ7ShQYFo98DfD3VzFn8=@vger.kernel.org X-Gm-Message-State: AOJu0YzyrIkY6XlNi/QXyUogMwHG33vLe7f8yop3a3AjLKkt1U6l1BXE taFS7VZHHY88v7kaLsmajguPAZ1+Ihby2lLg8h7QBH8d8oP4nGBKHzj3 X-Gm-Gg: AZuq6aI5caY0XBVzv9yxt7MOBI3MilcbqV+GvD5zRc1Cl9XB5oiKmpS2aPqwdAtyrGp mIZ1UT9j+REjNlTb5Dq19YvPGZ22INCDdEaQvwa4yyquJlYKDXbJ7SAygX6g8M1iaqthLzqh4Xz qlE7nOKPD1E7Firf490oLvCcnltU3jFA9T0vG4n0t7g6MHQmNDTp1WIUFtwIy2qC8HKHM/dCuRO Tn4LhEbMVIGyVVREFHhaelKYjOPIstLHzWq/VivJYrnKkNQu7t9BTYBLtBYARWW0rXntVTxd1Ey 3z5Y0x5hcJ7z1GMAS5PH2Nd0v+o4EWVPDz7LI6lyn2tGLJQ8ysCJagQI3qnEmmhQCflI2PYb/N/ BwbJysQKkEM2UPgBkUhrvGyHlni6P05E3PFuRy+MngFx/mqjSWvNq0Uxv8i8ZXxV5swZVaK2Q97 Pu+GDET3RxoZ3dtbkh03CBfa0fW0ygJxewJETRH9oSBKOI/jLKFzOCMvTatFsn8bc7n4ELLmHPm 44EUX8gi3eExZ8= X-Received: by 2002:a17:906:6a0f:b0:b8e:7dcb:7f23 with SMTP id a640c23a62f3a-b8facc9d34dmr363796266b.2.1771260349806; Mon, 16 Feb 2026 08:45:49 -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.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 08:45:49 -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 23/27] drm: Add passive_vrr_disabled property to crtc Date: Mon, 16 Feb 2026 17:45:12 +0100 Message-ID: <20260216164516.36803-24-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 Many TVs and other HDMI sinks suffer from blanking and possibly other glitches when VRR is toggled. With VRR present on such sinks and vrr_on_desktop enabled, they behave like the signal is always variable, even in fixed refresh rate situations. DisplayPort and eDP enforce seamless VRR transitions but HDMI unfortunately doesn't. Keep VRR toggled if it's supported and not explicitly disabled. It can be used for any VRR sinks, but this is mainly targeted for HDMI. Functionally, for an end user, this is the same as normal, fixed refresh rate mode. The only difference is that sink is kept in VRR state which enables seamless transitions into/out of variable refresh rate. Basically, the driver shouldn't change it's behavior around VRR_ENABLED set to false, jut keep sending info packets/frames with VRR/FreeSync/ G-Sync/HDMI VRR active. Enabled by default for sinks that claim it's support Signed-off-by: Tomasz Paku=C5=82a --- drivers/gpu/drm/drm_atomic_uapi.c | 4 ++++ drivers/gpu/drm/drm_crtc.c | 2 ++ drivers/gpu/drm/drm_mode_config.c | 6 ++++++ include/drm/drm_crtc.h | 9 +++++++++ include/drm/drm_mode_config.h | 6 ++++++ 5 files changed, 27 insertions(+) diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic= _uapi.c index b2cb5ae5a139..a3ad2fe3306b 100644 --- a/drivers/gpu/drm/drm_atomic_uapi.c +++ b/drivers/gpu/drm/drm_atomic_uapi.c @@ -383,6 +383,8 @@ static int drm_atomic_crtc_set_property(struct drm_crtc= *crtc, return ret; } else if (property =3D=3D config->prop_vrr_enabled) { state->vrr_enabled =3D val; + } else if (property =3D=3D config->prop_passive_vrr_disabled) { + state->passive_vrr_disabled =3D val; } else if (property =3D=3D config->degamma_lut_property) { ret =3D drm_property_replace_blob_from_id(dev, &state->degamma_lut, @@ -448,6 +450,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc, *val =3D (state->mode_blob) ? state->mode_blob->base.id : 0; else if (property =3D=3D config->prop_vrr_enabled) *val =3D state->vrr_enabled; + else if (property =3D=3D config->prop_passive_vrr_disabled) + *val =3D state->passive_vrr_disabled; else if (property =3D=3D config->degamma_lut_property) *val =3D (state->degamma_lut) ? state->degamma_lut->base.id : 0; else if (property =3D=3D config->ctm_property) diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index a7797d260f1e..4f2c871552e5 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -322,6 +322,8 @@ static int __drm_crtc_init_with_planes(struct drm_devic= e *dev, struct drm_crtc * config->prop_out_fence_ptr, 0); drm_object_attach_property(&crtc->base, config->prop_vrr_enabled, 0); + drm_object_attach_property(&crtc->base, + config->prop_passive_vrr_disabled, 0); } =20 return 0; diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 25f376869b3a..542d21d7ca36 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -340,6 +340,12 @@ static int drm_mode_create_standard_properties(struct = drm_device *dev) return -ENOMEM; dev->mode_config.prop_vrr_enabled =3D prop; =20 + prop =3D drm_property_create_bool(dev, 0, + "PASSIVE_VRR_DISABLED"); + if (!prop) + return -ENOMEM; + dev->mode_config.prop_passive_vrr_disabled =3D prop; + prop =3D drm_property_create(dev, DRM_MODE_PROP_BLOB, "DEGAMMA_LUT", 0); diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 66278ffeebd6..59dbb7ce1358 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -299,6 +299,15 @@ struct drm_crtc_state { */ bool vrr_enabled; =20 + /** + * @passive_vrr_disabled: + * + * Indicates if variable refresh rate on desktop should be enabled for + * the CRTC. Support for the requested state will depend on driver and + * hardware capabiltiy - lacking support is not treated as failure. + */ + bool passive_vrr_disabled; + /** * @self_refresh_active: * diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h index 2e848b816218..541cfaba67a2 100644 --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -679,6 +679,12 @@ struct drm_mode_config { * whether variable refresh rate should be enabled on the CRTC. */ struct drm_property *prop_vrr_enabled; + /** + * @prop_passive_vrr_disabled: Default atomic CRTC property to indicate + * whether passive variable refresh rate should be disabled + * on the CRTC. + */ + struct drm_property *prop_passive_vrr_disabled; =20 /** * @dvi_i_subconnector_property: Optional DVI-I property to --=20 2.53.0