From nobody Sat Feb 7 08:45:08 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 97A52EACD for ; Sun, 25 Jan 2026 00:23:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300599; cv=none; b=gx21KEnH4wchxtm/M5b48ETky7wxScbtsy6FpAVsh/h8G5hiDVkIqlFjH9ENUdkFRjbGJ7AgMgJ5D6eeivdlw6fhtvZNB3GaJrJhNDHBa59nXrMPgH37PAwYjUazOJYIxKDrwZDxbkGsWrk5nTuJcg9mbiDsP7JTI3nnvYqzHFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300599; c=relaxed/simple; bh=PS8RAj9emcxdAPA8GEJARM/pErd4GWL1kB8KR+loG88=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s7xilTRz4PW3KJ/pw38UPYpA4e/y0VkPPEiy2XIsllTIhfbcb8IOZH/+khkHZ1f9cjVp5L0BQf2pj5UVXRTyc2WnOM377NWtzGpEO/Hr5XrSPGcVRUqE4ru4TCeJxl3v/UC3fffLj7D4JzW4AnfmJ7ewtYU1k+A8ICmeJNO6GO4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Nqpk9nG4; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Nqpk9nG4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1769300590; bh=PS8RAj9emcxdAPA8GEJARM/pErd4GWL1kB8KR+loG88=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Nqpk9nG41NrMo+JN00pL6gmKhTiT++Wi47waFYn7U6p4vRkAk46kF3de6QNJHjj1y vl+ltYeoXAkK8tr4udoinjWR16/+DU/r+lijIs7ABhmhle29oIErhBeS1i+ky6TQhA WDOwMS/yXpPOLaWBXgKGoTiipnm+F/kkcoXFG7C8OUs/WysmtohfnUS1zO2pJh8fr5 5QV28yY5LyuaprLHlBlYsdMlzHI1xQR5dcQ12biX5f53YEK7HUWy7ZxrLMFK283YXY t2mL4vWAFuuonvBH9P2XCN6g9u9PiHfW7rkYop6tv+F98AduvTlEx9QWZqpVLyx3kK HzygJmQvjh86Q== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 5177B17E139A; Sun, 25 Jan 2026 01:23:10 +0100 (CET) From: Cristian Ciocaltea Date: Sun, 25 Jan 2026 02:22:59 +0200 Subject: [PATCH 1/5] drm/bridge: dw-hdmi-qp: Provide HDMI Vendor Specific InfoFrame 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 Message-Id: <20260125-dw-hdmi-qp-iframe-v1-1-e0f7649ecc4b@collabora.com> References: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> In-Reply-To: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 Since commit b626b1a1c9cc ("drm/bridge: refactor HDMI InfoFrame callbacks"), the following warning is generated: [ 13.654149] rockchip-drm display-subsystem: [drm] HDMI VSI not support= ed Add the missing support for sending HDMI Vendor-Specific Infoframes. Additionally, introduce the dw_hdmi_qp_write_pkt() utility function, as a prerequisite to rework the *_write_*_infoframe() callbacks and get rid of some boilerplate code. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 32 ++++++++++++++++++++++++= +--- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h | 2 ++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 036316e2b60d..b37af6a7e194 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -969,9 +970,9 @@ static int dw_hdmi_qp_bridge_clear_avi_infoframe(struct= drm_bridge *bridge) =20 static int dw_hdmi_qp_bridge_clear_hdmi_infoframe(struct drm_bridge *bridg= e) { - /* FIXME: add support for this InfoFrame */ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 - drm_warn_once(bridge->encoder->dev, "HDMI VSI not supported\n"); + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_VSI_TX_EN, PKTSCHED_PKT_EN); =20 return 0; } @@ -998,6 +999,18 @@ static int dw_hdmi_qp_bridge_clear_audio_infoframe(str= uct drm_bridge *bridge) return 0; } =20 +static void dw_hdmi_qp_write_pkt(struct dw_hdmi_qp *hdmi, const u8 *buffer, + size_t start, size_t len, unsigned int reg) +{ + u32 val =3D 0; + size_t i; + + for (i =3D start; i < start + len; i++) + val |=3D buffer[i] << ((i % 4) * 8); + + dw_hdmi_qp_write(hdmi, val, reg); +} + static int dw_hdmi_qp_bridge_write_avi_infoframe(struct drm_bridge *bridge, const u8 *buffer, size_t len) { @@ -1011,9 +1024,22 @@ static int dw_hdmi_qp_bridge_write_avi_infoframe(str= uct drm_bridge *bridge, static int dw_hdmi_qp_bridge_write_hdmi_infoframe(struct drm_bridge *bridg= e, const u8 *buffer, size_t len) { + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + size_t i; + dw_hdmi_qp_bridge_clear_hdmi_infoframe(bridge); =20 - /* FIXME: add support for the HDMI VSI */ + /* VSI packet header */ + dw_hdmi_qp_write_pkt(hdmi, buffer, 1, 2, PKT_VSI_CONTENTS0); + + /* VSI packet body */ + for (i =3D 0; i < len - 3; i +=3D 4) + dw_hdmi_qp_write_pkt(hdmi, buffer + 3, i, min(len - i - 3, 4), + PKT_VSI_CONTENTS1 + i); + + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_VSI_FIELDRATE, PKTSCHED_PKT_CONFIG1); + dw_hdmi_qp_mod(hdmi, PKTSCHED_VSI_TX_EN, PKTSCHED_VSI_TX_EN, + PKTSCHED_PKT_EN); =20 return 0; } diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.h index 91a15f82e32a..53688eae8dba 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h @@ -198,6 +198,7 @@ #define PKTSCHED_PRQUEUE2_CONFIG2 0xa94 #define PKTSCHED_PKT_CONFIG0 0xa98 #define PKTSCHED_PKT_CONFIG1 0xa9c +#define PKTSCHED_VSI_FIELDRATE BIT(14) #define PKTSCHED_DRMI_FIELDRATE BIT(13) #define PKTSCHED_AVI_FIELDRATE BIT(12) #define PKTSCHED_PKT_CONFIG2 0xaa0 @@ -206,6 +207,7 @@ #define PKTSCHED_DRMI_TX_EN BIT(17) #define PKTSCHED_AUDI_TX_EN BIT(15) #define PKTSCHED_AVI_TX_EN BIT(13) +#define PKTSCHED_VSI_TX_EN BIT(12) #define PKTSCHED_EMP_CVTEM_TX_EN BIT(10) #define PKTSCHED_AMD_TX_EN BIT(8) #define PKTSCHED_GCP_TX_EN BIT(3) --=20 2.52.0 From nobody Sat Feb 7 08:45:08 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 431957FBAC for ; Sun, 25 Jan 2026 00:23:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300599; cv=none; b=SUdkVyKiK0Ss5pDTjGXjrMBSUkalebS1tl2sTOgJWe9QUNdwSIWLyWOvg1bZOPC8yBDjqeQrmppZYCbmcXl9KuRgVao1rw99ykA9ICSCaufvLOGDQXg27ftaC2uMgahw5J5pLXAoSnX/TqL2RyPHdfTEcwzaHpFXmwAEfq27mNU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300599; c=relaxed/simple; bh=8wqL/j4IJaRId1cc1OMklQAuagooBA7lFvGgZ3lacX8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jCaK/5Ryo8nZ1naj9Fr6OsS6t+/BDamiKYN8i6VrFrKpkPqIoySqqy7cJD1QuDMdJV9YwslaFusOvH8M/Q6dmXX7BymTFj6V6EQb9CiytCZZysiYD8TGpwMQ7OYiFvbjqROFFHsa2unxezDfDQtXhCN9xXa6n8xeQhSgFrIe6Xs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=frFEKuGo; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="frFEKuGo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1769300591; bh=8wqL/j4IJaRId1cc1OMklQAuagooBA7lFvGgZ3lacX8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=frFEKuGokJ0COs1C06/4drGybqj+WfBIdgKTIXNgv6FZFFmcKIg79ENI62cf5r/Dl 9IakN36H7UPg9kN247/Fr/BPLSvqL8hsbTwoWEe2s+h22Ir++ne8mrQzjHA7h7/Jia teWhm666YmzAg3OZcBaV8hGJCDouNp8qK8ZwzWgqjsT/UHspHvvzbCH0J9+lI036Yi 9vLq40BndVRcdVgtjem9rj+fmd2YTrUpyx5rpv0Y1FbesA9Jh3FEMRFW9Zm6pxfBOh a1BxUi8z44Oh3ibjCh904dWMcnU6NwL3E+NGvgBi3nyV8wJDzIxJ+NiJ5GnBtj0t2I pQixPbjWrXSSA== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 291F117E141C; Sun, 25 Jan 2026 01:23:11 +0100 (CET) From: Cristian Ciocaltea Date: Sun, 25 Jan 2026 02:23:00 +0200 Subject: [PATCH 2/5] drm/bridge: dw-hdmi-qp: Provide SPD InfoFrame 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 Message-Id: <20260125-dw-hdmi-qp-iframe-v1-2-e0f7649ecc4b@collabora.com> References: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> In-Reply-To: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 The hardware is capable of sending Source Product Description (SPD) InfoFrames, hence enable the missing support. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 36 ++++++++++++++++++++++++= +++- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index b37af6a7e194..429736486d85 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -986,6 +986,15 @@ static int dw_hdmi_qp_bridge_clear_hdr_drm_infoframe(s= truct drm_bridge *bridge) return 0; } =20 +static int dw_hdmi_qp_bridge_clear_spd_infoframe(struct drm_bridge *bridge) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_SPDI_TX_EN, PKTSCHED_PKT_EN); + + return 0; +} + static int dw_hdmi_qp_bridge_clear_audio_infoframe(struct drm_bridge *brid= ge) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; @@ -1054,6 +1063,28 @@ static int dw_hdmi_qp_bridge_write_hdr_drm_infoframe= (struct drm_bridge *bridge, return dw_hdmi_qp_config_drm_infoframe(hdmi, buffer, len); } =20 +static int dw_hdmi_qp_bridge_write_spd_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + size_t i; + + dw_hdmi_qp_bridge_clear_spd_infoframe(bridge); + + /* SPD packet header */ + dw_hdmi_qp_write_pkt(hdmi, buffer, 1, 2, PKT_SPDI_CONTENTS0); + + /* SPD packet body */ + for (i =3D 0; i < len - 3; i +=3D 4) + dw_hdmi_qp_write_pkt(hdmi, buffer + 3, i, min(len - i - 3, 4), + PKT_SPDI_CONTENTS1 + i); + + dw_hdmi_qp_mod(hdmi, PKTSCHED_SPDI_TX_EN, PKTSCHED_SPDI_TX_EN, + PKTSCHED_PKT_EN); + + return 0; +} + static int dw_hdmi_qp_bridge_write_audio_infoframe(struct drm_bridge *brid= ge, const u8 *buffer, size_t len) { @@ -1252,6 +1283,8 @@ static const struct drm_bridge_funcs dw_hdmi_qp_bridg= e_funcs =3D { .hdmi_write_hdmi_infoframe =3D dw_hdmi_qp_bridge_write_hdmi_infoframe, .hdmi_clear_hdr_drm_infoframe =3D dw_hdmi_qp_bridge_clear_hdr_drm_infofra= me, .hdmi_write_hdr_drm_infoframe =3D dw_hdmi_qp_bridge_write_hdr_drm_infofra= me, + .hdmi_clear_spd_infoframe =3D dw_hdmi_qp_bridge_clear_spd_infoframe, + .hdmi_write_spd_infoframe =3D dw_hdmi_qp_bridge_write_spd_infoframe, .hdmi_clear_audio_infoframe =3D dw_hdmi_qp_bridge_clear_audio_infoframe, .hdmi_write_audio_infoframe =3D dw_hdmi_qp_bridge_write_audio_infoframe, .hdmi_audio_startup =3D dw_hdmi_qp_audio_enable, @@ -1368,7 +1401,8 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_de= vice *pdev, DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_HDMI_AUDIO | - DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME; + DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME | + DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME; if (!hdmi->no_hpd) hdmi->bridge.ops |=3D DRM_BRIDGE_OP_HPD; hdmi->bridge.of_node =3D pdev->dev.of_node; diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.h index 53688eae8dba..c07847e8d7dd 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.h @@ -206,6 +206,7 @@ #define PKTSCHED_PKT_EN 0xaa8 #define PKTSCHED_DRMI_TX_EN BIT(17) #define PKTSCHED_AUDI_TX_EN BIT(15) +#define PKTSCHED_SPDI_TX_EN BIT(14) #define PKTSCHED_AVI_TX_EN BIT(13) #define PKTSCHED_VSI_TX_EN BIT(12) #define PKTSCHED_EMP_CVTEM_TX_EN BIT(10) --=20 2.52.0 From nobody Sat Feb 7 08:45:08 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 269791632C8 for ; Sun, 25 Jan 2026 00:23:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300600; cv=none; b=r4G+zd9WlUaWlCe+Wvihgjz1UC2N8tJRz36qN7s8HN+8xlSQZbKpzEJMrpug/iLP5H1T4CQ4uiqOV9+PXHtz6Idb0KYFsX25dfpF5FC0bPI76tnug/exF0gtHAFKT7PvwCYi4lm0gjtpYqcMVvZBwVkBG5VtpumXUcMeZHdIPi0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300600; c=relaxed/simple; bh=Dkt7XUKoNz8No9f4w1DysgLslYRIpWby92iVG0WPp94=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kr4wrBMUoMqwQbPEohSS2+I2Y/Kcerj3jBoJDY9zZo6uk9FwhdGXuuLhZym/ZfmbF6mZZJeNcaxr9GseRH6DHKDtyo5SDAeTpcdPF7Nz3BWkD3lNu5nF1gMajaAbHEX+Qwuq2VD/dlmJVtRT2CLnzo7m3AY6kJD8AmsBQpfci3g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=n2xnIsLv; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="n2xnIsLv" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1769300592; bh=Dkt7XUKoNz8No9f4w1DysgLslYRIpWby92iVG0WPp94=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=n2xnIsLvoAXpHGT1vyM/+GloI6ddHidFoauO6ef8vRAkL6h+OPdCZ0mQOJwraB5Jf QAg5JKOQLvDPtlJG6/lpCRufCrBT4G9y/Z40KyK/akll9Bz+5dAV2fLP9s4txlfl0O qRyksU8vpPuSmtZUlR5/c7Ze6sdD9wfvoIKdw6Njsk7SulGzSdgSZCEzfwBZ9hJ2Kz 6mGxLFDnh2HXaZnXaoFabxOUbiq36fp9xCXfUJhvrwu/iuSDGAYxXTOoxBW63EHwy3 UGShZSSBYLS129EIVnt83E+BLjAqtzdWbBXR5BsEc1kVNP9/CBDCzvnTdrhy+nogXr R16wlowXewLpg== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id 0B8F117E1427; Sun, 25 Jan 2026 01:23:12 +0100 (CET) From: Cristian Ciocaltea Date: Sun, 25 Jan 2026 02:23:01 +0200 Subject: [PATCH 3/5] drm/bridge: dw-hdmi-qp: Rework AVI InfoFrame handler 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 Message-Id: <20260125-dw-hdmi-qp-iframe-v1-3-e0f7649ecc4b@collabora.com> References: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> In-Reply-To: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 Make use of the recently introduced dw_hdmi_qp_write_pkt() helper to simplify the writing of the Auxiliary Video InfoFrame (AVI) packet header and body registers. Moreover, since now having dedicated callbacks per InfoFrame type, move the implementation to dw_hdmi_qp_bridge_write_avi_infoframe() and drop dw_hdmi_qp_config_avi_infoframe(). While at it, also discard the superfluous infoframe size verification. Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 52 ++++++++----------------= ---- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 429736486d85..ff856f8bd53b 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -748,43 +748,6 @@ static struct i2c_adapter *dw_hdmi_qp_i2c_adapter(stru= ct dw_hdmi_qp *hdmi) return adap; } =20 -static int dw_hdmi_qp_config_avi_infoframe(struct dw_hdmi_qp *hdmi, - const u8 *buffer, size_t len) -{ - u32 val, i, j; - - if (len !=3D HDMI_INFOFRAME_SIZE(AVI)) { - dev_err(hdmi->dev, "failed to configure avi infoframe\n"); - return -EINVAL; - } - - /* - * DW HDMI QP IP uses a different byte format from standard AVI info - * frames, though generally the bits are in the correct bytes. - */ - val =3D buffer[1] << 8 | buffer[2] << 16; - dw_hdmi_qp_write(hdmi, val, PKT_AVI_CONTENTS0); - - for (i =3D 0; i < 4; i++) { - for (j =3D 0; j < 4; j++) { - if (i * 4 + j >=3D 14) - break; - if (!j) - val =3D buffer[i * 4 + j + 3]; - val |=3D buffer[i * 4 + j + 3] << (8 * j); - } - - dw_hdmi_qp_write(hdmi, val, PKT_AVI_CONTENTS1 + i * 4); - } - - dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_AVI_FIELDRATE, PKTSCHED_PKT_CONFIG1); - - dw_hdmi_qp_mod(hdmi, PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, - PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, PKTSCHED_PKT_EN); - - return 0; -} - static int dw_hdmi_qp_config_drm_infoframe(struct dw_hdmi_qp *hdmi, const u8 *buffer, size_t len) { @@ -1024,10 +987,23 @@ static int dw_hdmi_qp_bridge_write_avi_infoframe(str= uct drm_bridge *bridge, const u8 *buffer, size_t len) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + size_t i; =20 dw_hdmi_qp_bridge_clear_avi_infoframe(bridge); =20 - return dw_hdmi_qp_config_avi_infoframe(hdmi, buffer, len); + /* AVI packet header */ + dw_hdmi_qp_write_pkt(hdmi, buffer, 1, 2, PKT_AVI_CONTENTS0); + + /* AVI packet body */ + for (i =3D 0; i < len - 3; i +=3D 4) + dw_hdmi_qp_write_pkt(hdmi, buffer + 3, i, min(len - i - 3, 4), + PKT_AVI_CONTENTS1 + i); + + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_AVI_FIELDRATE, PKTSCHED_PKT_CONFIG1); + dw_hdmi_qp_mod(hdmi, PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, + PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, PKTSCHED_PKT_EN); + + return 0; } =20 static int dw_hdmi_qp_bridge_write_hdmi_infoframe(struct drm_bridge *bridg= e, --=20 2.52.0 From nobody Sat Feb 7 08:45:08 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1EFB51A7264 for ; Sun, 25 Jan 2026 00:23:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300601; cv=none; b=c7lyrPQMTmjiR+wQ9WASsRY9QCtf15qEuMuTmLRL/x0YP8jL+tARn63I0VU7roYXuEhmNVaIPlkcdewdotP1Hk/pqcfKOmRNip4Ee6nSS6reEZ7h7g4Np9yZX7d9VTnlMkXvUBQDc1+3AAI7H5euGOOuqz9h18okHhBHoh2Vd+U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300601; c=relaxed/simple; bh=WRP+az7WCTaiRkLX5s8XWqF6Cs1gnW5lvSEMbCzU2Y8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GG69A6fj+F4hciV6v2xfRw2QLKtZihBUucRkOosvsatTrrPo9vSVY1jRDw0aMAiW6nBc4seqL+7SvxRBPCjrmIAh/5ZiNSylUTe3BMI50MrWTak/56QBjltXA8w9L2u12TimxFatl/fne7j9cI5z65FPsn6fQA5apW952ay2IN0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Q8jeGaEz; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Q8jeGaEz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1769300593; bh=WRP+az7WCTaiRkLX5s8XWqF6Cs1gnW5lvSEMbCzU2Y8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Q8jeGaEzamf9G6yW/G6oh4mP4E/uzLgAQkCb3fI0Kb+dHKcbo9ryj0MuadXh3+b90 +ZkdSIIXGsR95owouxlfUdIb2E4imbaFvoY7w/167Zk/VRGkxLBbZa1ddNypLeKSWx zMsgFcwLe6YRvUonvyWfYwJYVRhOPYoqINPf7i4Q6mXB3fOX5TVXw9edBVBEFUX49A 137Odr8Le9+nkRCyfr0D1pGcEtgxFOwpUzJquLZwoiHtMxSqIBjQddT+Qio/n8HYTN lR11cDUq7EqsN3vh+KfJdbPu2OLwJoSJ8LlZvtCwF9q4xwQcLbGT4kSkEsQJUXSGqI DEavZ8Sm8ZMzQ== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id E22C317E1428; Sun, 25 Jan 2026 01:23:12 +0100 (CET) From: Cristian Ciocaltea Date: Sun, 25 Jan 2026 02:23:02 +0200 Subject: [PATCH 4/5] drm/bridge: dw-hdmi-qp: Rework DRM InfoFrame handler 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 Message-Id: <20260125-dw-hdmi-qp-iframe-v1-4-e0f7649ecc4b@collabora.com> References: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> In-Reply-To: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 Make use of the recently introduced dw_hdmi_qp_write_pkt() helper to simplify the writing of the Dynamic Range and Mastering (DRM) InfoFrame packet header and body registers. Moreover, since now having dedicated callbacks per InfoFrame type, move the implementation to dw_hdmi_qp_bridge_write_hdr_drm_infoframe() and drop dw_hdmi_qp_config_drm_infoframe(). While at it, also discard the unnecessary infoframe size verification, as well as the redundant disabling of the packet transmission (already done by the explicit call to the clear callback). Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 47 +++++++++---------------= ---- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index ff856f8bd53b..178d95a8ecbb 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -748,38 +748,6 @@ static struct i2c_adapter *dw_hdmi_qp_i2c_adapter(stru= ct dw_hdmi_qp *hdmi) return adap; } =20 -static int dw_hdmi_qp_config_drm_infoframe(struct dw_hdmi_qp *hdmi, - const u8 *buffer, size_t len) -{ - u32 val, i; - - if (len !=3D HDMI_INFOFRAME_SIZE(DRM)) { - dev_err(hdmi->dev, "failed to configure drm infoframe\n"); - return -EINVAL; - } - - dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); - - val =3D buffer[1] << 8 | buffer[2] << 16; - dw_hdmi_qp_write(hdmi, val, PKT_DRMI_CONTENTS0); - - for (i =3D 0; i <=3D buffer[2]; i++) { - if (i % 4 =3D=3D 0) - val =3D buffer[3 + i]; - val |=3D buffer[3 + i] << ((i % 4) * 8); - - if ((i % 4 =3D=3D 3) || i =3D=3D buffer[2]) - dw_hdmi_qp_write(hdmi, val, - PKT_DRMI_CONTENTS1 + ((i / 4) * 4)); - } - - dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_FIELDRATE, PKTSCHED_PKT_CONFIG1); - dw_hdmi_qp_mod(hdmi, PKTSCHED_DRMI_TX_EN, PKTSCHED_DRMI_TX_EN, - PKTSCHED_PKT_EN); - - return 0; -} - /* * Static values documented in the TRM * Different values are only used for debug purposes @@ -1033,10 +1001,23 @@ static int dw_hdmi_qp_bridge_write_hdr_drm_infofram= e(struct drm_bridge *bridge, const u8 *buffer, size_t len) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + size_t i; =20 dw_hdmi_qp_bridge_clear_hdr_drm_infoframe(bridge); =20 - return dw_hdmi_qp_config_drm_infoframe(hdmi, buffer, len); + /* DRM packet header */ + dw_hdmi_qp_write_pkt(hdmi, buffer, 1, 2, PKT_DRMI_CONTENTS0); + + /* DRM packet body */ + for (i =3D 0; i < len - 3; i +=3D 4) + dw_hdmi_qp_write_pkt(hdmi, buffer + 3, i, min(len - i - 3, 4), + PKT_DRMI_CONTENTS1 + i); + + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_FIELDRATE, PKTSCHED_PKT_CONFIG1); + dw_hdmi_qp_mod(hdmi, PKTSCHED_DRMI_TX_EN, PKTSCHED_DRMI_TX_EN, + PKTSCHED_PKT_EN); + + return 0; } =20 static int dw_hdmi_qp_bridge_write_spd_infoframe(struct drm_bridge *bridge, --=20 2.52.0 From nobody Sat Feb 7 08:45:08 2026 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6DDE21B4244 for ; Sun, 25 Jan 2026 00:23:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300601; cv=none; b=sVnk+n3ZgyEbvRivWGGHj7EeQCJtbyHonzt8kgRZDGh7IOldH3tzCopgdN+731GQCSytCRo3LIaMh0e801qgxccMi9Z44IsuOMazd47+OqN6+FCtLL7iEoM1Z6ZKvAGQ0CvHu9SnOVIPoGcxA8DBuuZfdjQ0w5mLq3b2PMTch1Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769300601; c=relaxed/simple; bh=QAI83uqgo/uM7ljLBwxT2ak27ApMzV7L2qapCKL1Egc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VQfE6n+2KixW8Ii/F/w/n65E9W9X5O3E9mk83N3Cb8r375OezPv5TkMp4t9d0/EAbWeGaQKA4faGEvvllKVFYZUdkRBymgzdAcGdlhMVfKifwN2+64E+6vkeBMVOzVT/HesZH1WAAKF7Kll6r8GJPr6wQDDrEJjpi0aFrcOUoBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=VFaZ89uz; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="VFaZ89uz" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1769300593; bh=QAI83uqgo/uM7ljLBwxT2ak27ApMzV7L2qapCKL1Egc=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=VFaZ89uz3ICNtu7MxnfBngLjSgA0J+OXuDSuA0fY6+3KAWESx29mM3aA7KaDDtV7L 8dWq1ZsvyjSc7GHjn/BQyAHwl2P57N/3c6bFf+9oePd+MZCRerYM6P6Et9x/KDVvfl ALvAuWX5ceGX/bBCyRWB5Fmvrz+DJfG6p9ZhLeszQAJJerWW9rn6gSM12Rs3huGmli CPa0HzCxLvHuvbM0XbuVe3+0bG3dX+T2i86DQiXy890BJr1HYT5Esc6TP66g5sn23n esrpAi9xNuCEm+z88Wrih0HzzA3/bvSABYh38CTEjT/ChgQfwT1l0Px0LKtEVKY6px KN8/oJKO77Uxw== Received: from localhost (unknown [82.79.138.145]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (prime256v1) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: cristicc) by bali.collaboradmins.com (Postfix) with ESMTPSA id BB62B17E14A5; Sun, 25 Jan 2026 01:23:13 +0100 (CET) From: Cristian Ciocaltea Date: Sun, 25 Jan 2026 02:23:03 +0200 Subject: [PATCH 5/5] drm/bridge: dw-hdmi-qp: Rework Audio InfoFrame handler 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 Message-Id: <20260125-dw-hdmi-qp-iframe-v1-5-e0f7649ecc4b@collabora.com> References: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> In-Reply-To: <20260125-dw-hdmi-qp-iframe-v1-0-e0f7649ecc4b@collabora.com> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter Cc: kernel@collabora.com, dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.14.3 Make use of the recently introduced dw_hdmi_qp_write_pkt() helper to simplify the writing of the Audio InfoFrame packet header and body registers. Additionally, discard the redundant static values identifying the frame version and length. Moreover, since now having dedicated callbacks per InfoFrame type, move the implementation to dw_hdmi_qp_bridge_write_audio_infoframe() and drop dw_hdmi_qp_config_audio_infoframe(). Signed-off-by: Cristian Ciocaltea --- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 80 ++++++++++++------------= ---- 1 file changed, 34 insertions(+), 46 deletions(-) diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index 178d95a8ecbb..3e612f82c303 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -748,51 +748,6 @@ static struct i2c_adapter *dw_hdmi_qp_i2c_adapter(stru= ct dw_hdmi_qp *hdmi) return adap; } =20 -/* - * Static values documented in the TRM - * Different values are only used for debug purposes - */ -#define DW_HDMI_QP_AUDIO_INFOFRAME_HB1 0x1 -#define DW_HDMI_QP_AUDIO_INFOFRAME_HB2 0xa - -static int dw_hdmi_qp_config_audio_infoframe(struct dw_hdmi_qp *hdmi, - const u8 *buffer, size_t len) -{ - /* - * AUDI_CONTENTS0: { RSV, HB2, HB1, RSV } - * AUDI_CONTENTS1: { PB3, PB2, PB1, PB0 } - * AUDI_CONTENTS2: { PB7, PB6, PB5, PB4 } - * - * PB0: CheckSum - * PB1: | CT3 | CT2 | CT1 | CT0 | F13 | CC2 | CC1 | CC0 | - * PB2: | F27 | F26 | F25 | SF2 | SF1 | SF0 | SS1 | SS0 | - * PB3: | F37 | F36 | F35 | F34 | F33 | F32 | F31 | F30 | - * PB4: | CA7 | CA6 | CA5 | CA4 | CA3 | CA2 | CA1 | CA0 | - * PB5: | DM_INH | LSV3 | LSV2 | LSV1 | LSV0 | F52 | F51 | F50 | - * PB6~PB10: Reserved - * - * AUDI_CONTENTS0 default value defined by HDMI specification, - * and shall only be changed for debug purposes. - */ - u32 header_bytes =3D (DW_HDMI_QP_AUDIO_INFOFRAME_HB1 << 8) | - (DW_HDMI_QP_AUDIO_INFOFRAME_HB2 << 16); - - regmap_bulk_write(hdmi->regm, PKT_AUDI_CONTENTS0, &header_bytes, 1); - regmap_bulk_write(hdmi->regm, PKT_AUDI_CONTENTS1, &buffer[3], 1); - regmap_bulk_write(hdmi->regm, PKT_AUDI_CONTENTS2, &buffer[4], 1); - - /* Enable ACR, AUDI, AMD */ - dw_hdmi_qp_mod(hdmi, - PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN | PKTSCHED_AMD_TX_EN, - PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN | PKTSCHED_AMD_TX_EN, - PKTSCHED_PKT_EN); - - /* Enable AUDS */ - dw_hdmi_qp_mod(hdmi, PKTSCHED_AUDS_TX_EN, PKTSCHED_AUDS_TX_EN, PKTSCHED_P= KT_EN); - - return 0; -} - static void dw_hdmi_qp_bridge_atomic_enable(struct drm_bridge *bridge, struct drm_atomic_state *state) { @@ -1046,10 +1001,43 @@ static int dw_hdmi_qp_bridge_write_audio_infoframe(= struct drm_bridge *bridge, const u8 *buffer, size_t len) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + size_t i; =20 dw_hdmi_qp_bridge_clear_audio_infoframe(bridge); =20 - return dw_hdmi_qp_config_audio_infoframe(hdmi, buffer, len); + /* + * Audio packet header + * AUDI_CONTENTS0: { RSV, HB2, HB1, RSV } + */ + dw_hdmi_qp_write_pkt(hdmi, buffer, 1, 2, PKT_AUDI_CONTENTS0); + + /* + * Audio packet body + * AUDI_CONTENTS1: { PB3, PB2, PB1, PB0 } + * AUDI_CONTENTS2: { PB7, PB6, PB5, PB4 } + * + * PB0: CheckSum + * PB1: | CT3 | CT2 | CT1 | CT0 | F13 | CC2 | CC1 | CC0 | + * PB2: | F27 | F26 | F25 | SF2 | SF1 | SF0 | SS1 | SS0 | + * PB3: | F37 | F36 | F35 | F34 | F33 | F32 | F31 | F30 | + * PB4: | CA7 | CA6 | CA5 | CA4 | CA3 | CA2 | CA1 | CA0 | + * PB5: | DM_INH | LSV3 | LSV2 | LSV1 | LSV0 | F52 | F51 | F50 | + * PB6~PB10: Reserved + */ + for (i =3D 0; i < len - 3; i +=3D 4) + dw_hdmi_qp_write_pkt(hdmi, buffer + 3, i, min(len - i - 3, 4), + PKT_AUDI_CONTENTS1 + i); + + /* Enable ACR, AUDI, AMD */ + dw_hdmi_qp_mod(hdmi, + PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN | PKTSCHED_AMD_TX_EN, + PKTSCHED_ACR_TX_EN | PKTSCHED_AUDI_TX_EN | PKTSCHED_AMD_TX_EN, + PKTSCHED_PKT_EN); + + /* Enable AUDS */ + dw_hdmi_qp_mod(hdmi, PKTSCHED_AUDS_TX_EN, PKTSCHED_AUDS_TX_EN, PKTSCHED_P= KT_EN); + + return 0; } =20 #ifdef CONFIG_DRM_DW_HDMI_QP_CEC --=20 2.52.0