From nobody Tue Feb 10 03:44:55 2026 Received: from mail-ej1-f50.google.com (mail-ej1-f50.google.com [209.85.218.50]) (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 0720236AB59 for ; Tue, 3 Feb 2026 18:56:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770145017; cv=none; b=uqnMb9MPatOyRAbF1HVAvYAMYptqFG2q80ql8/9a9RyX6aOIAFlsKWCUQYxdfgseoydw49a+UTh5rhWWE1PcsLRRjN3ZL5CN7DE4N3ZkHROtAtMaskO6s+62y1fFjvM7kGfwj06CvxqP4Ezd9Nhzf7yPnnscc14/LiuoBBdsMHo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770145017; c=relaxed/simple; bh=tNTBqc7f5sGN1dLXqOcfkxHUQIKmSU0qS3EbYOSHkHg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=faRf9M8fna07pFuj6ZvVni+2wq/ZY+LBmCxSW4v8reAywwHrUuxeTRvYn2f0kfTNSkPttLJFq7nsmysm4VYkEExLdxEo+fy76O8RJZh/VtJNyoNach2inj8QmVPSMQMH9fSpP3Ezd55LHffzbO3lCY8YzMqwCIjEU8eG9BF2Ivg= 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=W7Gl2aOH; arc=none smtp.client-ip=209.85.218.50 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="W7Gl2aOH" Received: by mail-ej1-f50.google.com with SMTP id a640c23a62f3a-b87266fdf56so78419966b.2 for ; Tue, 03 Feb 2026 10:56:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770145014; x=1770749814; 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=LljkZz4Ncf35oAxsgibHKbM5EMiP01agBwrYGt55o9U=; b=W7Gl2aOHoinDVl/+YbnEUtpcmzZYfVTM/1cZkFjBxZR/Kyl/53rxqbjYrK4czRbd0a Ajp44OxVuVWyB5M2PjFJyQV6IXr5NDF3cr7rhdXFtZGwJLIL4b/sWnu6ia8kf7NuFEnk J6p1Knzz+7VaqaCxYmogSNmqXn6M8wmsgMXjgRs4zE/WKQvdxgLCPhELkSRUzCkZjL6b 4Xf1Bn+iVjL920FGAMch8G7VHAFpuJ3zKUC/Jm9fjrKW79NyBP7hpZyvrBDYUN6WCl3m yHTTXeJGVHr9AEoo5ag8awf15Dzw1I2X1tpXYNhBq8l9yl6aGAyKFWZiuhFWeluWkL5+ tO+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770145014; x=1770749814; 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=LljkZz4Ncf35oAxsgibHKbM5EMiP01agBwrYGt55o9U=; b=uc+BEfVsVm3VT04i3JEZ+d2dGsh+INycetMcuLrhsckg1sDxpv7njaoxBhcpdZb+37 JjOUGjhMHH1VqpjT1+ZfBcQCexl28boVuo291RbxDyfOJVkS1KBpro3lIe1V2g+hmm7a VNAHo/cW2E2/5TJxGOwV7zcviag9BAzpkRHlj9mntPkF50xUxnEX3vniAqXUM5k2QQxx 63xWRp26M7sMWcM2xjDCVKa/n6ORKHV/vcXNqB7pTBQtemEHNAUGZmHZ7e8YKsUPkyfV mA1FyxC7Ivg5sTMD+UiPyA+oADDqkp6sKYu5AVTcVU1u2oLLYC2XSFYuUJodGVH5vT5J zTtg== X-Forwarded-Encrypted: i=1; AJvYcCWYLxcV0DFU51l0b1XU5wtuqlnH/biVzUq82WkiUBmhO8wCQnAOg+HmPnzsWrrHalXqvdRIl/2sbJC7lY0=@vger.kernel.org X-Gm-Message-State: AOJu0YyP/5cT6JaJW9RkQ1MZyNXOfCXDYt6Sq+mZLYzkjjOx8ji5HbmD 3V1Odp8iMrBQettwddui3mhkT5pCwqK7ssMpNv8JQNRqBcaJH0eQB75G X-Gm-Gg: AZuq6aJ0Tb4WAqLs9INrvlaw/xy4fKhD/xeqFjMxQoVZtcSNjTbCkivcGRP2oaH9VzB 6P8eDHqS94FsTYjiZGd26ZJCsDVEEJeTlFyeZStaol7Rm4pVSQ6Lp8oZ9/LwYl4SGx8WfxSqWBK 6UyJzvkl43VHJcpTzcL8cFtXiN3VNqfKMAwf+EausdV4CKuBBpK+Dcj2M2fpS4lLjzyr3dkR0gh 3Hh6ksQ9Ptc9iZPv5cl95x5N3/eb2gDOTxQ1huux3kHEZcgykux7080fscHrj8kg0j52G/SaZsD vdk7HoXthHSbLB6s3J34gqddvDKF6qdujWorr0tjLZnR5HdvWBFOTfW7894hyvMynvUrqbyGam2 tilFlamwyyU8tJu3CNniJ4eX3kMWxlYJa4SL+O/oxHkxlfyGtT7YxGbuL2KEaihuju8iALCcYaY BKnGWasjrdK2Fao633eLgaBd32XSVOJvp7D0H1E7xRh8PdGU73E0fNrbFUCLBwqTaA X-Received: by 2002:a17:907:d26:b0:b76:2667:7736 with SMTP id a640c23a62f3a-b8e9f1702c6mr21573566b.4.1770145014183; Tue, 03 Feb 2026 10:56:54 -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-b8e9fad97a7sm16715766b.0.2026.02.03.10.56.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 10:56:53 -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, admin@ptr1337.dev Subject: [PATCH v3 17/19] drm/amd/display: Reintroduce VTEM info frame Date: Tue, 3 Feb 2026 19:56:24 +0100 Message-ID: <20260203185626.55428-18-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260203185626.55428-1-tomasz.pakula.oficjalny@gmail.com> References: <20260203185626.55428-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] VTEM info fram building was removed back in: commit a9f54ce3c603 ("drm/amd/display: Refactoring VTEM"), but it's needed to support HDMI VRR signalling. [How] Build completely new and more robust functions to build out the VTEM infopacket. Many values are defined but could have added logic in the future, that's shy they are not static values but already value + bit position in it's byte. Reduced blanking detection was previously missing. Use possible hblank periods defined for RB1 (from CVT 1.2), RB2 and RB3 (from CVT 2.1). Changes in v3: - Use div_u64() instead of division operator Signed-off-by: Tomasz Paku=C5=82a --- .../amd/display/modules/inc/mod_info_packet.h | 4 + .../display/modules/info_packet/info_packet.c | 176 ++++++++++++------ 2 files changed, 119 insertions(+), 61 deletions(-) diff --git a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h b/dr= ivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h index 9ec123ecc7c4..07e86b16ef77 100644 --- a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h +++ b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h @@ -50,6 +50,10 @@ void mod_build_vsc_infopacket(const struct dc_stream_sta= te *stream, void mod_build_hf_vsif_infopacket(const struct dc_stream_state *stream, struct dc_info_packet *info_packet); =20 +void mod_build_vtem_infopacket(const struct dc_stream_state *stream, + const struct mod_vrr_params *vrr, + struct dc_info_packet *infopacket); + enum adaptive_sync_type { ADAPTIVE_SYNC_TYPE_NONE =3D 0, ADAPTIVE_SYNC_TYPE_DP =3D 1, diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c = b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c index 829cce9455db..b08b52bba574 100644 --- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c @@ -49,6 +49,7 @@ enum vsc_packet_revision { vsc_packet_rev7 =3D 7, }; =20 +#define HDMI_INFOFRAME_TYPE_EMP 0x7F #define HDMI_INFOFRAME_TYPE_VENDOR 0x81 #define HDMI_INFOFRAME_LENGTH_MASK 0x1F #define HF_VSIF_VERSION 1 @@ -61,74 +62,52 @@ enum allm_trigger_mode { ALLM_MODE_ENABLED_FORCED =3D 2, }; =20 -// VTEM Byte Offset -#define VTEM_PB0 0 -#define VTEM_PB1 1 -#define VTEM_PB2 2 -#define VTEM_PB3 3 -#define VTEM_PB4 4 -#define VTEM_PB5 5 -#define VTEM_PB6 6 +#define VTEM_ORG_ID 1 +#define VTEM_DATA_SET_TAG 1 +#define VTEM_DATA_SET_LENGTH 4 =20 -#define VTEM_MD0 7 -#define VTEM_MD1 8 -#define VTEM_MD2 9 -#define VTEM_MD3 10 +#define VTEM_M_CONST 0 +#define VTEM_FVA_FACTOR 0 =20 +#define VTEM_BRR_MASK_UPPER 0x03 +#define VTEM_BRR_MASK_LOWER 0xFF =20 -// VTEM Byte Masks -//PB0 -#define MASK_VTEM_PB0__RESERVED0 0x01 -#define MASK_VTEM_PB0__SYNC 0x02 -#define MASK_VTEM_PB0__VFR 0x04 -#define MASK_VTEM_PB0__AFR 0x08 -#define MASK_VTEM_PB0__DS_TYPE 0x30 - //0: Periodic pseudo-static EM Data Set - //1: Periodic dynamic EM Data Set - //2: Unique EM Data Set - //3: Reserved -#define MASK_VTEM_PB0__END 0x40 -#define MASK_VTEM_PB0__NEW 0x80 +/* VTEM Byte Offset */ +#define VTEM_PB0 0 +#define VTEM_PB1 1 +#define VTEM_PB2 2 +#define VTEM_PB3 3 +#define VTEM_PB4 4 +#define VTEM_PB5 5 +#define VTEM_PB6 6 =20 -//PB1 -#define MASK_VTEM_PB1__RESERVED1 0xFF +#define VTEM_MD0 7 +#define VTEM_MD1 8 +#define VTEM_MD2 9 +#define VTEM_MD3 10 =20 -//PB2 -#define MASK_VTEM_PB2__ORGANIZATION_ID 0xFF - //0: This is a Vendor Specific EM Data Set - //1: This EM Data Set is defined by This Specification (HDMI 2.1 r102.cle= an) - //2: This EM Data Set is defined by CTA-861-G - //3: This EM Data Set is defined by VESA -//PB3 -#define MASK_VTEM_PB3__DATA_SET_TAG_MSB 0xFF -//PB4 -#define MASK_VTEM_PB4__DATA_SET_TAG_LSB 0xFF -//PB5 -#define MASK_VTEM_PB5__DATA_SET_LENGTH_MSB 0xFF -//PB6 -#define MASK_VTEM_PB6__DATA_SET_LENGTH_LSB 0xFF +/* Extended Metadata Packet */ +/* Header */ +#define EMP_LAST_BIT 6 +#define EMP_FIRST_BIT 7 +/* PB0 */ +#define EMP_SNC_BIT 1 +#define EMP_VFR_BIT 2 +#define EMP_AFR_BIT 3 +#define EMP_DST_BIT 4 +#define EMP_END_BIT 6 +#define EMP_NEW_BIT 7 +/* PB7 =3D MD0 */ +#define VTEM_VRR_BIT 0 +#define VTEM_M_CONST_BIT 1 +#define VTEM_FVA_BIT 4 +/* MD1 Base_Vfront */ +/* MD2 */ +#define VTEM_BRR_UPPER_BIT 0 +#define VTEM_RB_BIT 2 +/* MD3 BRR Lower */ =20 =20 - -//PB7-27 (20 bytes): -//PB7 =3D MD0 -#define MASK_VTEM_MD0__VRR_EN 0x01 -#define MASK_VTEM_MD0__M_CONST 0x02 -#define MASK_VTEM_MD0__QMS_EN 0x04 -#define MASK_VTEM_MD0__RESERVED2 0x08 -#define MASK_VTEM_MD0__FVA_FACTOR_M1 0xF0 - -//MD1 -#define MASK_VTEM_MD1__BASE_VFRONT 0xFF - -//MD2 -#define MASK_VTEM_MD2__BASE_REFRESH_RATE_98 0x03 -#define MASK_VTEM_MD2__RB 0x04 -#define MASK_VTEM_MD2__NEXT_TFR 0xF8 - -//MD3 -#define MASK_VTEM_MD3__BASE_REFRESH_RATE_07 0xFF - enum ColorimetryRGBDP { ColorimetryRGB_DP_sRGB =3D 0, ColorimetryRGB_DP_AdobeRGB =3D 3, @@ -644,6 +623,81 @@ void mod_build_hf_vsif_infopacket(const struct dc_stre= am_state *stream, info_packet->valid =3D true; } =20 +static void build_vtem_infopacket_header(struct dc_info_packet *infopacket) +{ + uint8_t pb0 =3D 0; + + /* might need logic in the future */ + pb0 |=3D 0 << EMP_SNC_BIT; + pb0 |=3D 1 << EMP_VFR_BIT; + pb0 |=3D 0 << EMP_AFR_BIT; + pb0 |=3D 0 << EMP_DST_BIT; + pb0 |=3D 0 << EMP_END_BIT; + pb0 |=3D 1 << EMP_NEW_BIT; + + infopacket->hb0 =3D HDMI_INFOFRAME_TYPE_EMP; + infopacket->hb1 =3D (1 << EMP_FIRST_BIT) | (1 << EMP_LAST_BIT); + infopacket->hb2 =3D 0; // sequence + + infopacket->sb[VTEM_PB0] =3D pb0; + infopacket->sb[VTEM_PB2] =3D VTEM_ORG_ID; + infopacket->sb[VTEM_PB4] =3D VTEM_DATA_SET_TAG; + infopacket->sb[VTEM_PB6] =3D VTEM_DATA_SET_LENGTH; +} + +static void build_vtem_infopacket_data(const struct dc_stream_state *strea= m, + const struct mod_vrr_params *vrr, + struct dc_info_packet *infopacket) +{ + unsigned int hblank =3D 0; + unsigned int brr =3D 0; + bool vrr_active =3D false; + bool rb =3D false; + + vrr_active =3D vrr->state =3D=3D VRR_STATE_ACTIVE_VARIABLE || + vrr->state =3D=3D VRR_STATE_ACTIVE_FIXED; + + infopacket->sb[VTEM_MD0] =3D VTEM_M_CONST << VTEM_M_CONST_BIT; + infopacket->sb[VTEM_MD0] |=3D VTEM_FVA_FACTOR << VTEM_FVA_BIT; + infopacket->sb[VTEM_MD0] |=3D vrr_active << VTEM_VRR_BIT; + + infopacket->sb[VTEM_MD1] =3D 0; + infopacket->sb[VTEM_MD2] =3D 0; + infopacket->sb[VTEM_MD3] =3D 0; + + if (!vrr_active || is_hdmi_vic_mode(stream)) + return; + /* + * In accordance with CVT 1.2 and CVT 2.1: + * Reduced Blanking standard defines a fixed value of + * 160 for hblank, further reduced to 80 in RB2. RB3 uses + * fixed hblank of 80 pixels + up to 120 additional pixels + * in 8-pixel steps. + */ + hblank =3D stream->timing.h_total - stream->timing.h_addressable; + rb =3D (hblank >=3D 80 && hblank <=3D 200 && hblank % 8 =3D=3D 0); + brr =3D div_u64(mod_freesync_calc_nominal_field_rate(stream), 1000000); + + if (brr > VTEM_BRR_MAX) { + infopacket->valid =3D false; + return; + } + + infopacket->sb[VTEM_MD1] =3D (uint8_t) stream->timing.v_front_porch; + infopacket->sb[VTEM_MD2] =3D rb << VTEM_RB_BIT; + infopacket->sb[VTEM_MD2] |=3D (brr >> 8) & VTEM_BRR_MASK_UPPER; + infopacket->sb[VTEM_MD3] =3D brr & VTEM_BRR_MASK_LOWER; +} + +void mod_build_vtem_infopacket(const struct dc_stream_state *stream, + const struct mod_vrr_params *vrr, + struct dc_info_packet *infopacket) +{ + infopacket->valid =3D true; + build_vtem_infopacket_header(infopacket); + build_vtem_infopacket_data(stream, vrr, infopacket); +} + void mod_build_adaptive_sync_infopacket(const struct dc_stream_state *stre= am, enum adaptive_sync_type asType, const struct AS_Df_params *param, --=20 2.52.0