From nobody Thu Mar 5 08:20:14 2026 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) (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 AE86A332EBE for ; Mon, 16 Feb 2026 16:45:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260351; cv=none; b=TS/XylpM6XwWPtRNnv07yyXPVexhRiGPW8epysS9716sYCkKVnn9QY8ye2xustcWZgUNlJhxOkAbWR21veAhT+hlUtt9VY0K4sD4wTsYjSpthxfHOAecvBLHu6hXBDK9OcxJoaQ9bGkSvYMk/wPynMzindqN/tD2Svaywq2XIAw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260351; c=relaxed/simple; bh=NhCJ7orlQCXCbPzURPTLhP0UOG+3oHr5p9LXYzK4zqg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=TtWrQehwlV0C1JLbwp9rMMRk12FlawRgIYvuUdsfS+7iQTYcHFN0CnKPyNbsCK8UMZ05qevv+xiB50mQAzixfxbEI/vK+ax3HTDeG8ICB5seWghiVauu2QK2CnI9uKJNx7iXoR9ljlK6gboA8cbQBlbdPzeow/hN1Js4Pj/B7WM= 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=TEoHUmtd; arc=none smtp.client-ip=209.85.218.52 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="TEoHUmtd" Received: by mail-ej1-f52.google.com with SMTP id a640c23a62f3a-b8de2b5a122so59443866b.0 for ; Mon, 16 Feb 2026 08:45:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771260346; x=1771865146; 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=a6BfGiUOVQc89YPAV055hurM0Ll6ocTXT/P7sPP0SvQ=; b=TEoHUmtdaUzgE14i+3rqbyjtJUmbh5S8UxXbfv/pCVubffWVwUkRQVV88uZ47TliIi DRyt6raKNQRHxwBHCXkx5YFT1bbExJ7X5B2/RQanbEnjiO+PMP0AvBQ9YA5+mFJA15dH qwSD2cjrTrQcz4mUP22ayg92KdodA+4LbLQbb9cCrkRYBoCd8l7gqKVpjooXYxUYUAWn u6mh3/o6HY2rIHY2Dx02XfM72O1Cuum8hTGgzHn+mWYHU+hoLyeV6oaEPPcGfq+u6cpY Cf2JBki2aSP67S2r0aJcli975Gk7qyrrVaJVQUPVwLgzsdt8NhluIJ9zbgB0j+XV1sYb w4kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771260346; x=1771865146; 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=a6BfGiUOVQc89YPAV055hurM0Ll6ocTXT/P7sPP0SvQ=; b=foFRPJcMypvxpsZXEVDK02FluT14oV/YYw3xTxQsTwIa/a2tSkHR3o0K4lE4TZhc7n 3Pt51GXSQC2D8uvtaWrouNDv1OB9WhW/bV9He1YlztdE8ThBAr+daD/XlY9YYhj80O4Z +/91ulJDADCEDPmRpQpfPdl2DZ8gsDa8/1PAGGwQFIEAH9mlU05ksMsxlLISB9JqC5jM 0OVZxvx3C/7TuUkXb4/ihHNvpDR1kLB2KROFX61VYn7mxWnuxioNQo+DmFmvubvp/5NQ UcT8BEU4wIitUT6Eeu6zHNLah5KLwMy6ALYtrcNCYu0KmJlc07SP/Hcz5DCD3IzP64QM Rx7g== X-Forwarded-Encrypted: i=1; AJvYcCUwfrxDozAl3Y35znPieAPlnqUWLagVUoahkSqxAUxEdcjpvDdEmfVpbXGvkjSi6DSS+Sn9NcAN6KCz3ow=@vger.kernel.org X-Gm-Message-State: AOJu0Yxc6//VC07d+mz2hVPMrxw26Yy427sAgT6lmsiYKNu8QCE2JdKe lXoRU70MiaugbO3gNrEY4/sWgPXOF17cxrmjc9TQpu8t8N5kE+0Qw6xB X-Gm-Gg: AZuq6aJLfDFDbC1u4gDGG2RuGeXhLmUz0aNKVDPJukmqlaeQydgoFaf/dYiBiWL3ZR1 vqADPCEQy2Finz5FN7wTh84s5cOYcGC1Nuw4NwAym84IGDcmQxZAUfNjkXDb5TIeO/zIIbfXRoV GbPPfS4gVMpFCJEjpI0xA2YWkMxREBW2igcj9nk1YkalupS/bSCQwW6hnFSXZmIJdvNs9xngyN/ WDWleArAhvRbFjlh6okfg2QVyPi4cHv9n/NcM7tEcWZz6eeW1ocf9kc6Pv9XDwk8XHOzHW1dl94 wjcL4+f9lXFoR7YS3xZS8pLgZ03a8vft28vwkJMXjWXcZCwBHV23d8G/UllxbS7n8r5fw3l8P3u P/lbq+asulq9T8MwDBTUn+yrZAZeLkpDWAdA7pXENQ9qcPZ/GkbuVfh6+ZNuCjE1GrmBYFFeh5V DGJxoxKYwr1UUAuDRfIxSdh8ZZw1Nh1c4ReTa3B5UuwVNaU33IzbpiG/KhSbuCY6lKZstxYfFQa rzM X-Received: by 2002:a17:907:7b91:b0:b76:2667:7736 with SMTP id a640c23a62f3a-b8face24653mr356210866b.4.1771260345811; Mon, 16 Feb 2026 08:45:45 -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.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 08:45:45 -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 20/27] drm/amd/display: Reintroduce VTEM info frame Date: Mon, 16 Feb 2026 17:45:09 +0100 Message-ID: <20260216164516.36803-21-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] 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). Signed-off-by: Tomasz Paku=C5=82a --- .../amd/display/modules/inc/mod_info_packet.h | 4 + .../display/modules/info_packet/info_packet.c | 167 ++++++++++++------ 2 files changed, 119 insertions(+), 52 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 306eb7355c25..027113ec147d 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 @@ -49,6 +49,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 53e488fdb4ea..96c84f70ed44 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 @@ -48,6 +48,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 @@ -63,65 +64,52 @@ enum vsc_packet_revision { #define VTEM_PB5 5 #define VTEM_PB6 6 =20 -#define VTEM_MD0 7 -#define VTEM_MD1 8 -#define VTEM_MD2 9 -#define VTEM_MD3 10 +#define VTEM_ORG_ID 1 +#define VTEM_DATA_SET_TAG 1 +#define VTEM_DATA_SET_LENGTH 4 =20 +#define VTEM_M_CONST 0 +#define VTEM_FVA_FACTOR 0 =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 +#define VTEM_BRR_MASK_UPPER 0x03 +#define VTEM_BRR_MASK_LOWER 0xFF =20 -//PB1 -#define MASK_VTEM_PB1__RESERVED1 0xFF +/* 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 -//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 +#define VTEM_MD0 7 +#define VTEM_MD1 8 +#define VTEM_MD2 9 +#define VTEM_MD3 10 =20 +/* 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, @@ -612,6 +600,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.53.0