From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 AF91226560A for ; Wed, 24 Dec 2025 01:03:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538215; cv=none; b=Hy8wp5kJea/NUpJMrEybdACYHYyUHxWpRLw5/bxTwPJS+YQWGFCbBTqn6SgVe+rQAr83fdxKjpozCKha88jeCyvGdSh/SZ89yzjXW+R6+ldkXW55Np5eLo20RP4h064CNUAl5RDPIUqaTsJzqFwdSzSAhm83OSXSvWD7mXGCAl8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538215; c=relaxed/simple; bh=4c2IE1BIzyhKdA8ekc6Wi7j9/H9RE93hZFloRU4ijTo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gnpoVheHAY3zDp2Lo8N3Yem+XFptYz6r2ZTwtfgokhnPpEZnkaCPnH9anf2A2yru4eALBgwyb87MrCsrxPkB1Qhc40RxZqNWe5wqkj7tbsWEn89hzTAVnzzY0NbpMIX//+T4u5TH5+VagoDb2n0W7f6Xtvvx5JP/lweI09ZHf1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=gIvj0GeH; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ZKeqbqnz; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="gIvj0GeH"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ZKeqbqnz" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNEN8XM913442 for ; Wed, 24 Dec 2025 01:03:31 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ptoV5YpYGtgGRLJf4KHHysjARuk6/g5YlYSeU98pZHo=; b=gIvj0GeHpbn8eVfr wXnrJmJpvSr5QelBPOCepN4CqYuIJWwOKTs6lBSaqhJ9nAitMz4Z8s7BiucYbTMy kZCmDZV3SZf3WhpYAZwbnSjXTvW2q72hTzeZKU1EbekO+rpy8hd8gVvV8OIKOiwu cu9qe2yqw98BwjKOH9mqtCGlS3Vn8ZbksauvepdBJdaFm2//o0/LKKGq6QpLm2NO FWUtx7mBww1fL1RJ2Iq6hDbbyVxtYbG6/0m7gdbEt4a8c04NpSvufC16W+Miz646 dHdAX/2lY1Yrgdf6K6cDnFuwX5AhWiU9+3woAWTmN4VEsm5eZFc+FCQVGwIQNV/b BYLnlA== Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7vt2hn0k-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:31 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-4f1d60f037bso124406021cf.0 for ; Tue, 23 Dec 2025 17:03:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538211; x=1767143011; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ptoV5YpYGtgGRLJf4KHHysjARuk6/g5YlYSeU98pZHo=; b=ZKeqbqnzx6XHC6Z8AcrbTl3I28E5S0o12xnmCdIw6D0lXi4fcW+2gwunrmF4aV3FwG ORMMBXew5kxalUyHLGHfp061baarezXChGvF+UpXpqoS2JrVGMARAqJqSvgtVD704R2k NZNU3pSaGBQ5zt2Tn674uDVgFfpbT8F1+eBwrXks6pQRBdtne1xxV0UeU7O15gAQXd7s wdZvKGAtFaeWyiFpkQzvbo25OMcXmU055ca2OXIXFvAyL3QVv0tJsDG+AAx/rYgdOSOa cftd89+hwEWlktrcbwQtQtGjom9/6/VM+ngf6GcMB5X5aCbB/QVit9UPvac7OBFf79ZR RDBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538211; x=1767143011; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ptoV5YpYGtgGRLJf4KHHysjARuk6/g5YlYSeU98pZHo=; b=CmHK24rRT/NOROiKWT0KM/crwxHYCc1bXH0Biyral9M8FFkFtbqmtIWHPuJn8gD/hk +OlubBL7lnGdQiHwgiEBN/U1J/9cmrQy+HVdcMN0I9aJ8/db7s42YERvq+4OzWcreLk8 L2eTQT/ybajSZ0W5gwkE2lQtNswNNR4SaBwWKIRaw+txfO1SKvG/dYUJgQxVA1ZDJuXG mGzpXpU8oRju/cYxrTEtu58crR9E1SYaK4LfU39AxqpIp2KdGOrn0alJ8rcQMWwm/SA+ 2gzpushNBbTmu7JL5Vb/qitddnSrF0MENI0cb09te0pRy6MRQx0ESziu6L6yCRyfAkHZ RGfQ== X-Forwarded-Encrypted: i=1; AJvYcCXu44mKFxRf3tHjkICx1pYPT7Bcrkgh1j4hVjttObehFmB1tyMKjwevLRnkQuGBhhiIiOngzvAlmojY5UU=@vger.kernel.org X-Gm-Message-State: AOJu0YwndXZmL/cIsNvWayr6H6IBQRXv5jXxH++eQLAkbydcRaQ2wTAD T8N75uyMePUnhlnlJQEbqwoLOHS9Ka9s8QYF3umylNCE2PfevOimHVe8Opz7r0E5tiltf93mpWT gF/aupy5m3sYnJYJ3auYwUIxIphhvuLCB7hvPEIXXKSBU0EwutToJsKW+OEQEtDUReME= X-Gm-Gg: AY/fxX6y6ZH7cqx9Rf2iUjwHhB8asKC97/uZSUwEjuIVUTzZuk7a9uh/kJEjSuPXMV4 jir2RmtiTHVdq60NkSiDPdmYy27UEqWfBaAUco/tvTQ0UtIETkqkygvq+bNA8oKhNZSIIEzsJ6o REabF+392Z0KHDo7BY60z1CeAvldqiRzdgdwLMoHKOIOJiNJO7zi40NrfDvrHHGJZ8cMwkh/2Hw TSwpJLB3WemrI8Di4O6ZQF0ZJpvUmpIVKEdlh1970uVvzufP05xP4iaLFQUORB1LVh9pH5eWzK6 60scMLmxp1oS60/Cy5+dQfj8KUtNyi34JLI5FGTYTvyg86J2QO9zmJX/78u1yGorUwuFVBzmdXS OZBC7bc9hgoH4PT3qzwozoLD9pNP+tdl0s9n3HB1j89CNtEEIl/ng0eiikp4Oz4dtpNLVMLpogD SUh0iOlWzNN09iQzrRgYRngsg= X-Received: by 2002:a05:622a:2514:b0:4e7:2210:295f with SMTP id d75a77b69052e-4f4abccf15bmr243879601cf.13.1766538210644; Tue, 23 Dec 2025 17:03:30 -0800 (PST) X-Google-Smtp-Source: AGHT+IG2zGu373peB7MX1qjZy0q4jVqd6qNkCBDuXwSVgEQTyt/BLEgTukN0rowiAa42hXU7+E3H2A== X-Received: by 2002:a05:622a:2514:b0:4e7:2210:295f with SMTP id d75a77b69052e-4f4abccf15bmr243878991cf.13.1766538210095; Tue, 23 Dec 2025 17:03:30 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:27 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:50 +0200 Subject: [PATCH v3 01/10] drm/tests: hdmi: check the infoframes behaviour 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: <20251224-limit-infoframes-2-v3-1-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=23481; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=4c2IE1BIzyhKdA8ekc6Wi7j9/H9RE93hZFloRU4ijTo=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvXcxW2jIpPeezbmraLDB4RzhRncsqcEuY/j p0d6qW0M2aJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs71wAKCRCLPIo+Aiko 1Y8pB/9N4zzcXVbaCQf/lN/+ysB8X6rw17vrj/cVY4xLnABy1fO2aSkyIucNPrfvWGd7VNFJmUV 0yB+ElTc9Cu69aMcCvyPEjqkm5xJRG7bldzCnUt+PQ17aB8KVQxs+8cJIMdCsZdAfK0NYpsCxYS fvHIEgrZwTix9h0qu4VcK0M+0pMYY+RLaOvWl8K4YrqZ2wrAMaqdEsG8JpK0309n6usaYU1YqYT CqIMwThd2g3c2kl0iEo8N3R8P8elAPFrDExSIZ+Z4nHwELOhHmuG8fWdoPP7OaqYe9Nn0+GH+P/ x6SyH1gwcYfl/hX10V9jrSXJ3VUbc7x9zO1VKe2goP01IOQP X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX9uKm3BIY07Lr jHSG+e5wa8W4XVbU3asreD0AQDHDdsKBiPK/z+t9sHxJGCpyGObUFzJxRAJ/lG/6inJYlhebz7q bBsX5dJ1ODqRpSLhRqwTT3v+GXqXlc+p4PKZqUOjeDJCPjruE2w3OnM7r+K9HzkWXXc1tedk4YI qN4OZEUAT3UgIRd7dgruJvbPKK/fRyhQtG87TOgH931AS4NqTuhYhr4d9iJF19kCUmC6PRJHPxQ kmanL5W5yzrQGrGCsHqTDPQh1I5g7Z1kwEOXwqqh9Wk/Ush+Ssx3QtTRNYGKKwCzhDP5sL7ELGf vOY68SkT7O+VrJe7L+CqBumlKRLvJfrWFSPZnD4QIUgU/QK46dhwuu7y9ghhD1n4hW9mURtyDB5 1obwtsM1LvUzEaOeHmX6F5OIWGFbDOo7bwKwgLPchsERtei1lEaBrLlDvQSLNP/mHlK/PB+Sce3 W/oa4eZrdZkq0qUo44A== X-Proofpoint-GUID: uaFl7C6Pi3T08rDZ01S-M1wZKQ6ckIy- X-Proofpoint-ORIG-GUID: uaFl7C6Pi3T08rDZ01S-M1wZKQ6ckIy- X-Authority-Analysis: v=2.4 cv=brtBxUai c=1 sm=1 tr=0 ts=694b3be3 cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=VwQbUJbxAAAA:8 a=pqfWdQB9qOw6z5IVkt4A:9 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 suspectscore=0 spamscore=0 adultscore=0 priorityscore=1501 malwarescore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 Verify the InfoFrames behaviour. Check that reporting InfoFrame as unsupported doesn't result in a commit error. Also check that HDR and Audio InfoFrames are not triggered if corresponding features are not enabled. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/tests/drm_client_modeset_test.c | 3 + drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 485 +++++++++++++++++= ++++ drivers/gpu/drm/tests/drm_kunit_edid.h | 119 +++++ 3 files changed, 607 insertions(+) diff --git a/drivers/gpu/drm/tests/drm_client_modeset_test.c b/drivers/gpu/= drm/tests/drm_client_modeset_test.c index 3f44fe5e92e4..ec58fe064d86 100644 --- a/drivers/gpu/drm/tests/drm_client_modeset_test.c +++ b/drivers/gpu/drm/tests/drm_client_modeset_test.c @@ -5,6 +5,7 @@ =20 #include =20 +#include #include #include #include @@ -48,6 +49,8 @@ static const struct drm_connector_helper_funcs drm_client= _modeset_connector_help }; =20 static const struct drm_connector_funcs drm_client_modeset_connector_funcs= =3D { + .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, + .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state }; =20 static int drm_client_modeset_test_init(struct kunit *test) diff --git a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c b/drivers/g= pu/drm/tests/drm_hdmi_state_helper_test.c index 8bd412735000..bdf14a0623b2 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -40,6 +40,9 @@ struct drm_atomic_helper_connector_hdmi_priv { #define connector_to_priv(c) \ container_of_const(c, struct drm_atomic_helper_connector_hdmi_priv, conne= ctor) =20 +#define encoder_to_priv(e) \ + container_of_const(e, struct drm_atomic_helper_connector_hdmi_priv, encod= er) + static struct drm_display_mode *find_preferred_mode(struct drm_connector *= connector) { struct drm_device *drm =3D connector->dev; @@ -138,6 +141,24 @@ static const struct drm_connector_funcs dummy_connecto= r_funcs =3D { .reset =3D dummy_hdmi_connector_reset, }; =20 +static int hdmi_update_failures; + +static void test_encoder_atomic_enable(struct drm_encoder *encoder, + struct drm_atomic_state *state) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv =3D + encoder_to_priv(encoder); + int ret; + + ret =3D drm_atomic_helper_connector_hdmi_update_infoframes(&priv->connect= or, state); + if (ret) + hdmi_update_failures++; +} + +static const struct drm_encoder_helper_funcs test_encoder_helper_funcs =3D= { + .atomic_enable =3D test_encoder_atomic_enable, +}; + static struct drm_atomic_helper_connector_hdmi_priv * __connector_hdmi_init(struct kunit *test, @@ -2323,10 +2344,474 @@ static struct kunit_suite drm_atomic_helper_connec= tor_hdmi_mode_valid_test_suite .test_cases =3D drm_atomic_helper_connector_hdmi_mode_valid_tests, }; =20 +/* + * Test that the default behaviour works without errors. + */ +static void drm_test_check_infoframes(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_connector_state *new_conn_state; + struct drm_crtc_state *crtc_state; + struct drm_atomic_state *state; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + int old_hdmi_update_failures; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(HDMI_COLORSPACE_RGB), + 8, + &dummy_connector_hdmi_funcs, + test_edid_hdmi_1080p_rgb_max_200mhz); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + drm_modeset_acquire_init(&ctx, 0); + + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + KUNIT_ASSERT_EQ(test, ret, 0); + + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_ASSERT_EQ(test, old_hdmi_update_failures, hdmi_update_failures); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + +static int reject_avi_infoframe_write_infoframe(struct drm_connector *conn= ector, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + if (type =3D=3D HDMI_INFOFRAME_TYPE_AVI) + return -EOPNOTSUPP; + + return 0; +} + +static const struct drm_connector_hdmi_funcs reject_avi_infoframe_hdmi_fun= cs =3D { + .write_infoframe =3D reject_avi_infoframe_write_infoframe, +}; + +/* + * Test that the rejection of AVI InfoFrame results in the failure of + * drm_atomic_helper_connector_hdmi_update_infoframes(). + */ +static void drm_test_check_reject_avi_infoframe(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *state; + struct drm_connector_state *new_conn_state; + struct drm_crtc_state *crtc_state; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + int old_hdmi_update_failures; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(HDMI_COLORSPACE_RGB), + 8, + &reject_avi_infoframe_hdmi_funcs, + test_edid_hdmi_1080p_rgb_max_200mhz); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + drm_modeset_acquire_init(&ctx, 0); + + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + KUNIT_ASSERT_EQ(test, ret, 0); + + drm_encoder_helper_add(&priv->encoder, &test_encoder_helper_funcs); + + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_ASSERT_NE(test, old_hdmi_update_failures, hdmi_update_failures); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + +static int reject_hdr_infoframe_write_infoframe(struct drm_connector *conn= ector, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + if (type =3D=3D HDMI_INFOFRAME_TYPE_DRM) + return -EOPNOTSUPP; + + return 0; +} + +static const struct drm_connector_hdmi_funcs reject_hdr_infoframe_hdmi_fun= cs =3D { + .write_infoframe =3D reject_hdr_infoframe_write_infoframe, +}; + +/* + * Test that the HDR InfoFrame isn't programmed in + * drm_atomic_helper_connector_hdmi_update_infoframes() if the max_bpc is = 8. + */ +static void drm_test_check_reject_hdr_infoframe_bpc_8(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *state; + struct drm_connector_state *new_conn_state; + struct drm_crtc_state *crtc_state; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + int old_hdmi_update_failures; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(HDMI_COLORSPACE_RGB), + 8, + &reject_hdr_infoframe_hdmi_funcs, + test_edid_hdmi_1080p_rgb_max_200mhz_hdr); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + drm_modeset_acquire_init(&ctx, 0); + + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + KUNIT_ASSERT_EQ(test, ret, 0); + + drm_encoder_helper_add(&priv->encoder, &test_encoder_helper_funcs); + + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + /* Verify that there is no HDR property, so "userspace" can't set it. */ + for (int i =3D 0; i < conn->base.properties->count; i++) + KUNIT_ASSERT_PTR_NE(test, + drm->mode_config.hdr_output_metadata_property, + conn->base.properties->properties[i]); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_ASSERT_EQ(test, old_hdmi_update_failures, hdmi_update_failures); + + new_conn_state =3D conn->state; + KUNIT_ASSERT_NOT_NULL(test, new_conn_state); + + KUNIT_ASSERT_EQ(test, new_conn_state->hdmi.output_bpc, 8); + KUNIT_ASSERT_EQ(test, new_conn_state->hdmi.infoframes.hdr_drm.set, false); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + +/* + * Test that the rejection of HDR InfoFrame results in the failure of + * drm_atomic_helper_connector_hdmi_update_infoframes() in the high bpc is + * supported. + */ +static void drm_test_check_reject_hdr_infoframe_bpc_10(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *state; + struct drm_connector_state *new_conn_state; + struct drm_crtc_state *crtc_state; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + int old_hdmi_update_failures; + struct hdr_output_metadata hdr_data; + struct drm_property_blob *hdr_blob; + bool replaced; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(HDMI_COLORSPACE_RGB), + 10, + &reject_hdr_infoframe_hdmi_funcs, + test_edid_hdmi_1080p_rgb_max_200mhz_hdr); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + drm_modeset_acquire_init(&ctx, 0); + + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + KUNIT_ASSERT_EQ(test, ret, 0); + + drm_encoder_helper_add(&priv->encoder, &test_encoder_helper_funcs); + + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + hdr_data.metadata_type =3D HDMI_STATIC_METADATA_TYPE1; + hdr_data.hdmi_metadata_type1.eotf =3D HDMI_EOTF_TRADITIONAL_GAMMA_SDR; + hdr_data.hdmi_metadata_type1.metadata_type =3D HDMI_STATIC_METADATA_TYPE1; + + hdr_blob =3D drm_property_create_blob(drm, sizeof(hdr_data), &hdr_data); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, hdr_blob); + + ret =3D drm_property_replace_blob_from_id(drm, + &new_conn_state->hdr_output_metadata, + hdr_blob->base.id, + sizeof(struct hdr_output_metadata), -1, + &replaced); + KUNIT_ASSERT_EQ(test, ret, 0); + KUNIT_ASSERT_EQ(test, replaced, true); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_ASSERT_NE(test, old_hdmi_update_failures, hdmi_update_failures); + + new_conn_state =3D conn->state; + KUNIT_ASSERT_NOT_NULL(test, new_conn_state); + + KUNIT_ASSERT_EQ(test, new_conn_state->hdmi.output_bpc, 10); + KUNIT_ASSERT_EQ(test, new_conn_state->hdmi.infoframes.hdr_drm.set, true); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + +static int reject_audio_infoframe_write_infoframe(struct drm_connector *co= nnector, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + if (type =3D=3D HDMI_INFOFRAME_TYPE_AUDIO) + return -EOPNOTSUPP; + + return 0; +} + +static const struct drm_connector_hdmi_funcs reject_audio_infoframe_hdmi_f= uncs =3D { + .write_infoframe =3D reject_audio_infoframe_write_infoframe, +}; + +/* + * Test that Audio InfoFrame is only programmed if we call a corresponding= API, + * thus the drivers can safely assume that they won't get Audio InfoFrames= if + * they don't call it. + */ +static void drm_test_check_reject_audio_infoframe(struct kunit *test) +{ + struct drm_atomic_helper_connector_hdmi_priv *priv; + struct drm_modeset_acquire_ctx ctx; + struct drm_atomic_state *state; + struct drm_connector_state *new_conn_state; + struct drm_crtc_state *crtc_state; + struct drm_display_mode *preferred; + struct drm_connector *conn; + struct drm_device *drm; + struct drm_crtc *crtc; + int old_hdmi_update_failures; + struct hdmi_audio_infoframe cea; + int ret; + + priv =3D drm_kunit_helper_connector_hdmi_init_with_edid_funcs(test, + BIT(HDMI_COLORSPACE_RGB), + 8, + &reject_audio_infoframe_hdmi_funcs, + test_edid_hdmi_1080p_rgb_max_200mhz); + KUNIT_ASSERT_NOT_NULL(test, priv); + + drm =3D &priv->drm; + crtc =3D priv->crtc; + conn =3D &priv->connector; + + preferred =3D find_preferred_mode(conn); + KUNIT_ASSERT_NOT_NULL(test, preferred); + + drm_modeset_acquire_init(&ctx, 0); + + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + KUNIT_ASSERT_EQ(test, ret, 0); + + drm_encoder_helper_add(&priv->encoder, &test_encoder_helper_funcs); + + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_ASSERT_EQ(test, old_hdmi_update_failures, hdmi_update_failures); + + /* + * So, it works without Audio InfoFrame, let's fail with it in place, + * checking that writing the infofraem actually gets triggered. + */ + + hdmi_audio_infoframe_init(&cea); + cea.channels =3D 2; + cea.coding_type =3D HDMI_AUDIO_CODING_TYPE_STREAM; + cea.sample_size =3D HDMI_AUDIO_SAMPLE_SIZE_STREAM; + cea.sample_frequency =3D HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM; + + ret =3D drm_atomic_helper_connector_hdmi_update_audio_infoframe(conn, &ce= a); + KUNIT_ASSERT_EQ(test, ret, -EOPNOTSUPP); + + state =3D drm_kunit_helper_atomic_state_alloc(test, drm, &ctx); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, state); + + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_ASSERT_NE(test, old_hdmi_update_failures, hdmi_update_failures); + + drm_modeset_drop_locks(&ctx); + drm_modeset_acquire_fini(&ctx); +} + + +static struct kunit_case drm_atomic_helper_connector_hdmi_infoframes_tests= [] =3D { + KUNIT_CASE(drm_test_check_infoframes), + KUNIT_CASE(drm_test_check_reject_avi_infoframe), + KUNIT_CASE(drm_test_check_reject_hdr_infoframe_bpc_8), + KUNIT_CASE(drm_test_check_reject_hdr_infoframe_bpc_10), + KUNIT_CASE(drm_test_check_reject_audio_infoframe), + { } +}; + +static struct kunit_suite drm_atomic_helper_connector_hdmi_infoframes_test= _suite =3D { + .name =3D "drm_atomic_helper_connector_hdmi_infoframes", + .test_cases =3D drm_atomic_helper_connector_hdmi_infoframes_tests, +}; + kunit_test_suites( &drm_atomic_helper_connector_hdmi_check_test_suite, &drm_atomic_helper_connector_hdmi_reset_test_suite, &drm_atomic_helper_connector_hdmi_mode_valid_test_suite, + &drm_atomic_helper_connector_hdmi_infoframes_test_suite, ); =20 MODULE_AUTHOR("Maxime Ripard "); diff --git a/drivers/gpu/drm/tests/drm_kunit_edid.h b/drivers/gpu/drm/tests= /drm_kunit_edid.h index c59c8528a3f7..f4923157f5bf 100644 --- a/drivers/gpu/drm/tests/drm_kunit_edid.h +++ b/drivers/gpu/drm/tests/drm_kunit_edid.h @@ -293,6 +293,125 @@ static const unsigned char test_edid_hdmi_1080p_rgb_m= ax_200mhz[] =3D { 0x00, 0x00, 0x00, 0xfc }; =20 +/* + * edid-decode (hex): + * + * 00 ff ff ff ff ff ff 00 31 d8 2a 00 00 00 00 00 + * 00 21 01 03 81 a0 5a 78 02 00 00 00 00 00 00 00 + * 00 00 00 20 00 00 01 01 01 01 01 01 01 01 01 01 + * 01 01 01 01 01 01 02 3a 80 18 71 38 2d 40 58 2c + * 45 00 40 84 63 00 00 1e 00 00 00 fc 00 54 65 73 + * 74 20 45 44 49 44 0a 20 20 20 00 00 00 fd 00 32 + * 46 1e 46 0f 00 0a 20 20 20 20 20 20 00 00 00 10 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 92 + * + * 02 03 1c 81 e3 05 c0 20 41 10 e2 00 4a 67 03 0c + * 00 12 34 00 28 e6 06 05 01 52 52 51 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + * 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4e + * + * ---------------- + * + * Block 0, Base EDID: + * EDID Structure Version & Revision: 1.3 + * Vendor & Product Identification: + * Manufacturer: LNX + * Model: 42 + * Made in: 2023 + * Basic Display Parameters & Features: + * Digital display + * DFP 1.x compatible TMDS + * Maximum image size: 160 cm x 90 cm + * Gamma: 2.20 + * Monochrome or grayscale display + * First detailed timing is the preferred timing + * Color Characteristics: + * Red : 0.0000, 0.0000 + * Green: 0.0000, 0.0000 + * Blue : 0.0000, 0.0000 + * White: 0.0000, 0.0000 + * Established Timings I & II: + * DMT 0x04: 640x480 59.940476 Hz 4:3 31.469 kHz 25.175= 000 MHz + * Standard Timings: none + * Detailed Timing Descriptors: + * DTD 1: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.500000= MHz (1600 mm x 900 mm) + * Hfront 88 Hsync 44 Hback 148 Hpol P + * Vfront 4 Vsync 5 Vback 36 Vpol P + * Display Product Name: 'Test EDID' + * Display Range Limits: + * Monitor ranges (GTF): 50-70 Hz V, 30-70 kHz H, max dotclock 150 M= Hz + * Dummy Descriptor: + * Extension blocks: 1 + * Checksum: 0x92 + * + * ---------------- + * + * Block 1, CTA-861 Extension Block: + * Revision: 3 + * Underscans IT Video Formats by default + * Native detailed modes: 1 + * Colorimetry Data Block: + * BT2020YCC + * BT2020RGB + * sRGB + * Video Data Block: + * VIC 16: 1920x1080 60.000000 Hz 16:9 67.500 kHz 148.5000= 00 MHz + * Video Capability Data Block: + * YCbCr quantization: No Data + * RGB quantization: Selectable (via AVI Q) + * PT scan behavior: No Data + * IT scan behavior: Always Underscanned + * CE scan behavior: Always Underscanned + * Vendor-Specific Data Block (HDMI), OUI 00-0C-03: + * Source physical address: 1.2.3.4 + * Maximum TMDS clock: 200 MHz + * HDR Static Metadata Data Block: + * Electro optical transfer functions: + * Traditional gamma - SDR luminance range + * SMPTE ST2084 + * Supported static metadata descriptors: + * Static metadata type 1 + * Desired content max luminance: 82 (295.365 cd/m^2) + * Desired content max frame-average luminance: 82 (295.365 cd/m^2) + * Desired content min luminance: 81 (0.298 cd/m^2) + * Checksum: 0x4e Unused space in Extension Block: 99 bytes + * + * ---------------- + * + * edid-decode 1.31.0-5387 + * edid-decode SHA: 5508bc4301ac 2025-08-25 08:14:22 + * + * EDID conformity: PASS + */ +static const unsigned char test_edid_hdmi_1080p_rgb_max_200mhz_hdr[] =3D { + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x31, 0xd8, 0x2a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x01, 0x03, 0x81, 0xa0, 0x5a, 0x78, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x02, 0x3a, 0x80, 0x18, 0x71, 0x38, + 0x2d, 0x40, 0x58, 0x2c, 0x45, 0x00, 0x40, 0x84, 0x63, 0x00, 0x00, 0x1e, + 0x00, 0x00, 0x00, 0xfc, 0x00, 0x54, 0x65, 0x73, 0x74, 0x20, 0x45, 0x44, + 0x49, 0x44, 0x0a, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x32, + 0x46, 0x1e, 0x46, 0x0f, 0x00, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92, 0x02, 0x03, 0x1c, 0x81, + 0xe3, 0x05, 0xc0, 0x20, 0x41, 0x10, 0xe2, 0x00, 0x4a, 0x67, 0x03, 0x0c, + 0x00, 0x12, 0x34, 0x78, 0x28, 0xe6, 0x06, 0x05, 0x01, 0x52, 0x52, 0x51, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xd6, +}; + /* * edid-decode (hex): * --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 ED15E225760 for ; Wed, 24 Dec 2025 01:03:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538218; cv=none; b=kvgBxhsSc66FTAn+Uo7FFci9QRfsgrTpKd+T3v5xFyiDwev924KjnIG46afpSsqDDz8U4vGyFSE8c+ewyQZDWvCbEk2L4HcraIIj+2p4JqGu7S5CMN+ZVt020MGD+BT9e98JVguAvyTW+mjKCH/WyNM4hEBmknX7GxRwoM/wRdI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538218; c=relaxed/simple; bh=mr8qXjnvYFOwO7KQ17AFNeqHgYNZnWBLYdH41Q2tDUw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=K/MKd6X3SWlEsU4CoUsE0vuyHKr1ETgelXPhnND64CcB0loINPloPeEWpbRxAoHhCfp6Eu7xjBUsH2l0vYsUR7VSoIruDBHmM6HbwzM5wEfqiLkWTwAesKyV7Ht9hGnYFEmrAEU4hzxcigyevQVEQRQ6v2OhsOUaS1RplVRvGnw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=hWR5Ojqm; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=dXVviLlH; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="hWR5Ojqm"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="dXVviLlH" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BO0ffRo559790 for ; Wed, 24 Dec 2025 01:03:35 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= xhyidPKELK4mgPty7R89IfFpAnaFS+xQI4oanQexDkI=; b=hWR5OjqmTENGCgZk I4zXeoe0FG7+9/6SD3mCvvxs8H3pccL8dmb/4n93hTOrhvZH9t3GbcV7sRBlbwqh j3vMtO15GjZ43NDH5xDBw1xydalP3nQJoi/cquWmGbTFSO0HIAKy7YEvhLkXqIlb dQJ62hwBdIBtDRmwviqI78iNNVhEH7JVIqEWs3P+GhpXvYZbEb2mskJsWiOFpo+9 0w9HVSCBA6DhMLa9kwIXPMA7/MAnPT6hxcp69upX2RXhvAhyWGDr02JZGhZE7hrC /ZRv6AGGoy+yRGIjDtc/ZYrlLleHwBbYd2TR/74vUAOumKhok4evGO2QVUh5wiVI wbOeAw== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7u9csxme-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:35 +0000 (GMT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-88888397482so167089256d6.1 for ; Tue, 23 Dec 2025 17:03:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538215; x=1767143015; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xhyidPKELK4mgPty7R89IfFpAnaFS+xQI4oanQexDkI=; b=dXVviLlHjfWQexM9lzcUguCAZuM0Fj/U9BXfBNFEmJzNWL9rK9bsu6SBx9HXmr+DZG rXcFHAZAii7cTnGB5h1ypNTqQa2en3J0MEk++zNJY2+DabfPYxUwHmOjl0Mrs3yPuTst NEJcnHtLqy8o8Dr0lY7dyjOCjfR5nxf/JzR3x5sqphIPFN33qgNSPRBmp0pLNatv8rBs EUSxmPRt+w0lj9FhUdUcMDfrMJVjxHoGXap0iSmHozCzWqpXgv5seDjr8sd4HtExciKY +3ys7rAx5swec5trxxQehzQ5p2RQY7R1dK+q2tjgsxwlDEwUdsbq9FLXfffO2mTla9u9 3zCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538215; x=1767143015; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=xhyidPKELK4mgPty7R89IfFpAnaFS+xQI4oanQexDkI=; b=C2jjy9EoAecm5BWrNyD/Fect6idcdWCMzBrWobuRDpuoAzRSEM9k3SpIfpVkd7SaNL yyLAqeblBeW7ZCG0C7NRSRYahydRokG8+bjr6YjGfOeK/X3rNzTxKcXsGr7475P2J9FX ixCzeQC29vKI8xwyInFhQ7Ucg5Dw5CFO7zrhIg4Lmc/cbY4bkqO6hS7RTtS5eqzLaz3Y ok6/o3ddeIvxJFMlvsT0EoAbKtUglV1ml67CN4Z+4gWv36S5B/ZsY/1udWIb8V/j1IJn LKI69dc9od2K9YmmJ7zE4R3XafM2mN7nSzOpA7b/N1ZLLLf7nrwQEhZsHtgMMm0EW2hs BNtA== X-Forwarded-Encrypted: i=1; AJvYcCWMJoDYvmQEu5Gzm2vujuU08F7FoJe+mxg6rBkW6nR/qZpxAgo8NFLHqZmOkL5cPuOwcmkaHWobACwM/AE=@vger.kernel.org X-Gm-Message-State: AOJu0Yyk/FX+6xLY3YxkPgrK8EQPT9sZf/i+9D7ZfP4m9FEpC4grotUv GCeGD6bjQuQqF98K+G8ffHmGihi1q0D8PlEwCnlGbEMTYIiAQfxmn/3pFeTwSsZ1ch6sU3xixsb bevMdSfKVqjxsuvVbd0zUy3K4PYTFc0ZKqkUPobjjaTJ8RnKhq8zZpPEGaX+vx//wiHw= X-Gm-Gg: AY/fxX5uI19KIbGVKg2XizbF4n6qPxAjjJ3nB7JHWXkSGGAUHYuykfimAY5NIOM9aMp HZyq3tejH1XHiGEJInUzILDMzGr5tgJqMnl7NHDtmaPRLYU6DcZGrwlGmee9wF+fnYGrU+A15B/ XUH+b8YvmzYQyexaX2HIvq1+fNwGulZKGyMUTTgyKGhj3jCbaAYnXhbrmH5oGJzzixZaniNPnnV 9NWCRO3MCmIfreqDS4zgrZ3aYKzLIff6RJVTNWKCtsBggVm0EJ5NneRN+auFaz/jwToL0jJdyg7 cfU/Wrb8GP4XN6v5Jg4a1Ux2InUMH1dzRunO4Ecpb15utTTbfl6gYOMA0rOuCvP0E+/ZIKGbtd0 yxO2Zqa9e2+nRRJcWJKxD8CBZ7mdYm0VJGjgOHH4XOW8w6fJYNar9sGB/Bkqbne6RLajB/GOmd7 EuRofHQeDA72BwX7NEalsYTWU= X-Received: by 2002:a05:6214:4e07:b0:888:6ea5:a8f2 with SMTP id 6a1803df08f44-88d82234a02mr251739076d6.29.1766538215197; Tue, 23 Dec 2025 17:03:35 -0800 (PST) X-Google-Smtp-Source: AGHT+IEpKbGgnmym2Mtt5yWxfAHv9iuZOADyKontrek89W07BD34phYJfGyZ7WWcGGMKQLxabxO7ZQ== X-Received: by 2002:a05:6214:4e07:b0:888:6ea5:a8f2 with SMTP id 6a1803df08f44-88d82234a02mr251738596d6.29.1766538214801; Tue, 23 Dec 2025 17:03:34 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:32 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:51 +0200 Subject: [PATCH v3 02/10] drm/vc4: hdmi: implement clear_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: <20251224-limit-infoframes-2-v3-2-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1703; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=mr8qXjnvYFOwO7KQ17AFNeqHgYNZnWBLYdH41Q2tDUw=; b=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ6a39fX0APvL2yu8D9Rc3hNQrCmR/DDaffohjZWMNm3TW qUDX0zvZDRmYWDkYpAVU2TxKWiZGrMpOezDjqn1MINYmUCmMHBxCsBEyqI4GNYH291ht/25OWpN +Vnmr+nWTHOc+k9sTsiarlmVcz3+bZnyG76iwxndrZ6Wj9f3RuYEOJzb6B3/blvX/q0ezEeTEnX Dnpb5/F56eOYGp4ml9wQ/ivtYRbm8EOP/EM/JY+69MHef7kne9Z5Zt1QKdvxjyT8+5acQa+C//A uiTqvfV1f8C7nQJzN7xfT91yIKVmyPb1rrFqV84Zy75YP+wD/rjPT4rZawrlHT9uq6uOhGaxCje WWdfpCJ7w9Z9vbZN8tfzJffEHu3lltStTXUXUTlbfaz0MQpGWsbFNULpWVswpb3nP91WtD11Kq4 VOMQR0brUk6/yjc2PJFtDgf1l07Zor3rOPuy2bdnid8FAA== X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: XLGvdqv6QttrMWWduQMCnlc5-xH0TFQY X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfXxRS4+/WRbkjK jEfCv2jYBE7bA/O69EZIgX6pFkXyFQo7F7dFytnxA3JVZLJFmKNYNj6Ec2VW61XQqzh4aQ4xp7p dyVUXWsh8MZXOBkHE1KmnDEeG9Xma9+Si/H1JyMaYunFCfLfgV7ZJT3Q50JWwVtuv3lyipgnDJa YFo6XPN0HmihAomEd168vbpxcdztrfmR+m2Yu7YILgVfuYyscTJP5PPuVfrbRTloJxKClJBzb2k iJDXd3wYgPtx0QSeEiqVMWGWvxMYQ2m6ie2n/j2BH0Dcyfpo8TcNzA8t7f/zSKTzU0h41j89TvT 4UNzNM1SDe3S9QtTs36q8/+o4BFOZpQqMcQM0HZLnRCxJcMEtaNIz2P0Cd1pRR/5x4BUo7+WwMB zQcIRxQ3lAeahmg3ZZrb8Emlxn4qnRfwKZ24sghTDZ6+3fx+G1FkMv59uGjDswU0vc5ssIi2bFU c0xatQDpeK3mxdabhdQ== X-Authority-Analysis: v=2.4 cv=HsN72kTS c=1 sm=1 tr=0 ts=694b3be7 cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=gsP-wGJUQ9tQerkYUh8A:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-ORIG-GUID: XLGvdqv6QttrMWWduQMCnlc5-xH0TFQY X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0 malwarescore=0 clxscore=1015 adultscore=0 bulkscore=0 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 Implement the clear_infoframe callback, disabling corresponding InfoFrame type. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/vc4/vc4_hdmi.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 1798d1156d10..4cfb7ebc0c81 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -624,6 +624,30 @@ static int vc4_hdmi_stop_packet(struct vc4_hdmi *vc4_h= dmi, return ret; } =20 +static int vc4_hdmi_clear_infoframe(struct drm_connector *connector, + enum hdmi_infoframe_type type) +{ + struct vc4_hdmi *vc4_hdmi =3D connector_to_vc4_hdmi(connector); + struct drm_device *drm =3D connector->dev; + int ret; + int idx; + + if (!drm_dev_enter(drm, &idx)) + return 0; + + WARN_ONCE(!(HDMI_READ(HDMI_RAM_PACKET_CONFIG) & + VC4_HDMI_RAM_PACKET_ENABLE), + "Packet RAM has to be on to store the packet."); + + ret =3D vc4_hdmi_stop_packet(vc4_hdmi, type, true); + if (ret) + drm_err(drm, "Failed to wait for infoframe to go idle: %d\n", ret); + + drm_dev_exit(idx); + + return ret; +} + static int vc4_hdmi_write_infoframe(struct drm_connector *connector, enum hdmi_infoframe_type type, const u8 *infoframe, size_t len) @@ -1660,6 +1684,7 @@ vc4_hdmi_connector_clock_valid(const struct drm_conne= ctor *connector, =20 static const struct drm_connector_hdmi_funcs vc4_hdmi_hdmi_connector_funcs= =3D { .tmds_char_rate_valid =3D vc4_hdmi_connector_clock_valid, + .clear_infoframe =3D vc4_hdmi_clear_infoframe, .write_infoframe =3D vc4_hdmi_write_infoframe, }; =20 --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 46740264A74 for ; Wed, 24 Dec 2025 01:03:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538224; cv=none; b=DOnS+JRowvheCuPYhmq2P6XuEHPJCTS5ruivrIPfO7gaY2b1ptH33YKgmoXf2t6+SnzlhwLZ8AF3+F4OqQj22Fxbp2VGq5GENEpFM0RLqh6qOlAlr99/yt/M7DmmPrv8i01ttoRQqVF7D3n+kY0zLJ/TPcvQJg6HzVHDZ2a8iYo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538224; c=relaxed/simple; bh=i9/GyfQ7oCfW1uA2EJ42B3bpRaDaBcnVtDJI1DBQZYU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KBp3NHHMHW9BjLWpAQRFMZylm9ildiirtFNjLK4KKWEQ8YdLrU8mHKvbDAXTdrENk6sJX2UB/Ds1QQvu1/BDZWy+u/Eud9UrPOXJdl3KsIM4qPp5r0Epfy6PNMkKTHGZYGjzgzesdA03h9/A9x4BNd203Hd8lR75tSJVlf9iAy0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Bl0jOJV2; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DmBoYiul; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Bl0jOJV2"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DmBoYiul" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNHwsDm1246312 for ; Wed, 24 Dec 2025 01:03:40 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= j2BT4ALqtU5AjsTQozcF6Tmng8niaFOYcGnl/GxzzY8=; b=Bl0jOJV24JiFPMET xHzSY4DSukQHLXYvaS+j8AC2V1B7oTwCX/V4HE3eWFTq5cS6OcPRyrAqVDY+qCpe qrFYm27AFt8KkxgawPYL/Fe0FaD7KkT9u3yDdi2AmiHPp++bl3E8ECzsLRIu88Jo PvaOMF1dSP4/LJTXL81dgO0Pa9pdcH+1O6q1pRDc4tlgrNHbr87ywG+rGaofvEBZ XzUlymhYYoz5ryyo4G9IluagRkMxMBkjTodNRJQv/iSAW66J69otOk5hjpFyATm+ s9XUpm9Lf9XcyKMP9SFUa7aIWGdeBNgNefrwznwxC+Mhh+cGxaMqYAk14PEYEr89 IcsumQ== Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7u9csxn6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:40 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-4f4d60d1fbdso70878341cf.3 for ; Tue, 23 Dec 2025 17:03:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538220; x=1767143020; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=j2BT4ALqtU5AjsTQozcF6Tmng8niaFOYcGnl/GxzzY8=; b=DmBoYiulv7rB58NSTJ5GbarrXxR6uPNW9vWBQUjb2jwW+Uy/tRghFKIm73oUaKpj/Y WNi0fEOsfU6XgDdzdLcUvCL4fnrinG0bJbaMGVIlBDyFMNDVkRkGHpOm2iGgqxD59qVh JrXBXkPYguUUaBU8sUWxWTMcogP+NK4bkDCRCOPZm1f6EzkOgy1mIAnws0gWyiISWmmw Y3HuzPPiT0TU44R6tRSzgGPifY3j3tie+18/w6sCRy/89lIgalMkpM/jjUzLF9xK8q5q eD1THGaSEY6BTqAR1+T0wknRJgGh2/hLM3zvJilU3eqGn9f3U/8/7BqFYbEaQHoSF8zs D7Yw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538220; x=1767143020; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=j2BT4ALqtU5AjsTQozcF6Tmng8niaFOYcGnl/GxzzY8=; b=drpUExeCyjrJeIM/RVf3o2ur9DuY66qZHIAwJ2MfhePC7Oh1zeDCdwGB4Ay0eIml4q SqoP+Rp9Wo2C6zftIODzLynir2a9rRvrqJ5iit0+e7LX+CuMQLHzPG/Tp5as3/HmLcbO +HVylb2JHaoZ1mpOsJIN0OO7GlKoAMd4rcP/OGofxJtL4RanpnnNNg64NEi7uXS1e/2B PSRbsalOcPVOSYUiOvPIE9uti2qVbI8yyX89hqHjSjKZSZL/ln6mR7Q4ylMnWTzvPUzG beAXKNfer46LRTSUzEB0+QT5zOpvYY7EOS7vUjWvrnnRsqNiRgdvK4La0A3ZhF+1qOrO qQxg== X-Forwarded-Encrypted: i=1; AJvYcCW6y/I9Z2WyChhXcMVAYFjf9b3JNTXaZgxqaAY9WSZep2VO36wtG7lRrYsnankd4wzJ1su5zbENqvv1m5o=@vger.kernel.org X-Gm-Message-State: AOJu0YzufvABeXHnTEIS+v8yhq9KnLtUNtyWMLE9Ws4uCuVz8Ray0x09 v4l4au8CDXq+/SgaTDt82TMj2bA91o+lE0pXHB64hcgiNpsE1AqHDR76pv48Lvai1C94Tw5FvVN uejda1LGXQVtLiAcOxQWLjNMY/wr1uCWx4zfgFLoL88RLEp4/8u5jXw755AODZyK5P4A= X-Gm-Gg: AY/fxX7Y3NwkHb93YKVP/o5o/WYtA+hae7tWAk5Ka9kj/6MsK+pfVUPSQ46AtBWzJMs KAMgSd+FDR7auTdJzw2/rfARrTlXIRknqfIcUsW91/7+Q3+zU8u11MgL1SumCFeq+AOLQefpVX2 8p5+ytlmDxKwES1gCO8hS0ewrRgnbEbx7hhp+I7FUhLIEQwS7wqGWLTZzT706lbwnEPPSKqGsgi RDe8xIt70ioQ+xx420UDzxoJhhgJqDSZGLIPAogFKwE32eQ+Kvco4nNgtdDyVQtXmsPx+TMG29Y eeRswt1gMEDk2Sa5V32qTjXZp2+s6/qouFcNM3T/7cQWa9of0bnoYfnAKI4O1EYndsqPE0B97fQ HGnh37dFV2ssp0ttYkH1Q0jwB31bKZ5jsDpzMoeXPKtNcxhO07h1mM6FHyQo62MyW+sQud7OyY3 gSwWVpeyXGCA8W6kpckXxcWWo= X-Received: by 2002:a05:622a:5983:b0:4ed:aa7b:e1a6 with SMTP id d75a77b69052e-4f4abdca79fmr229406181cf.81.1766538219497; Tue, 23 Dec 2025 17:03:39 -0800 (PST) X-Google-Smtp-Source: AGHT+IEwvXGbOT6oW55CWvGFCaGI9Z8vq9+dFl2bwrw/ngJaHdkAtC4PTePtFImzvZoy9oibBhKF7A== X-Received: by 2002:a05:622a:5983:b0:4ed:aa7b:e1a6 with SMTP id d75a77b69052e-4f4abdca79fmr229405351cf.81.1766538218943; Tue, 23 Dec 2025 17:03:38 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:36 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:52 +0200 Subject: [PATCH v3 03/10] drm/sun4i: hdmi_enc: implement clear_infoframe stub 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: <20251224-limit-infoframes-2-v3-3-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1354; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=i9/GyfQ7oCfW1uA2EJ42B3bpRaDaBcnVtDJI1DBQZYU=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvY+d+DN6B8oFFIbxWN6Mv+qvpFGNgFj0Zg9 429cFCSW4uJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72AAKCRCLPIo+Aiko 1U0DB/9O5L3yXk2jLLqOmN8V6q8wWbokThIMSYo9wxIHSgy0M5PT1YvNv+IkCrajuHc7rLm0/Wy cAHvtRKaeF+QVunb5Ui4hiZx4SEbTrbizizbDcBXrW4jWiZ1w4OIEFSo9Ca2FBA/eLbTNfYILzi HQCpFhDfzos5m2svcelBiHZqryy14l9P2FF1hFVv73xKqoG79GEfcN56cxOyCxeLVVkSb5izUXV /Qi7gDaaGNrZhhP1D1d2VscJWoEi/L1VJ1MTZPr1mxGEaDugo8tx8aKiQtr2Q++hnZkOcfFfbZ7 adTRg5h65Vh9hNP2Kvva0EBQb2XULPOZjxhcE0hxDNYLkX4A X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: 9QRQRWsg3JCIoiMCo_P9VkbsItC38AN4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX+H4vy1P67iYS MiUGFL7hJNs0B5Lcg2jmfOjRaLl0tQeMZZpyUgKe4qnEa4SEAA/ifnHyL2sTutBChJjCsSLbd6d pL2rOav5sjNYDhP7Y8H7Ttw0gnnuTaexKYuVyFTV4KKrW+a0v9zAnRRswllvAJGwL1KiT+WnjTE ejwA/Rnm0CuJXnfYbiDi+z0dHwR1wf8R7hGFPbHZzD22kaP/Wjx73E/f0pYguPF7DP94LYgD4Ca SUmI2v91rSlazjqSDkbKRlE4fN2Kp60e6Pi2cjxQt26uP6npw/KMf1D2iVPWzWcvE9NeDoL+wCJ jG95IdMUSwor8jMXRIK1OjjGFCotQZNsmveLllN3j5SRyNDwTNgxdHcBGR1oYQ5/ilpfiWx+Kip V3cS+RArN3lzmusonJwN1Cgnp/zqx/tNZ9n71r+raQvGtsPfNTTRrapNEe6CuzG14hrYfMA2bAl 8+JToWO2C4SF3ExTJGA== X-Authority-Analysis: v=2.4 cv=HsN72kTS c=1 sm=1 tr=0 ts=694b3bec cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=J8re_t9gDAGCMx8MSDUA:9 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-ORIG-GUID: 9QRQRWsg3JCIoiMCo_P9VkbsItC38AN4 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0 malwarescore=0 clxscore=1015 adultscore=0 bulkscore=0 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 In preparation to making clear_infoframes callbacks required, add a stub to the sun4i driver. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i= /sun4i_hdmi_enc.c index ab0938ba61f7..6263ee15880a 100644 --- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c @@ -40,6 +40,14 @@ #define drm_connector_to_sun4i_hdmi(c) \ container_of_const(c, struct sun4i_hdmi, connector) =20 +static int sun4i_hdmi_clear_infoframe(struct drm_connector *connector, + enum hdmi_infoframe_type type) +{ + drm_warn_once(connector->dev, "clearing of AVI infoframe is not implement= ed\n"); + + return 0; +} + static int sun4i_hdmi_write_infoframe(struct drm_connector *connector, enum hdmi_infoframe_type type, const u8 *buffer, size_t len) @@ -236,6 +244,7 @@ static struct i2c_adapter *sun4i_hdmi_get_ddc(struct de= vice *dev) =20 static const struct drm_connector_hdmi_funcs sun4i_hdmi_hdmi_connector_fun= cs =3D { .tmds_char_rate_valid =3D sun4i_hdmi_connector_clock_valid, + .clear_infoframe =3D sun4i_hdmi_clear_infoframe, .write_infoframe =3D sun4i_hdmi_write_infoframe, }; =20 --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 C69DC12E1E9 for ; Wed, 24 Dec 2025 01:03:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538227; cv=none; b=FmkVrdcmhYzO1ILEH7sG/d6P3JlqrtuVkgxODYocj12uWyOUnfBVtvnKq7vn4OfZM1G82ajf+Ldkbtpwp0g0j3wesCGcfge9cTwaOccjmJTRSN2e4lBZxx/OTjlK4p7E4qw5tTK/kPnC+GEx9OARQWLRbWh7WgWqiYG9jB7ColE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538227; c=relaxed/simple; bh=nzElO3qrN1ngMVHhZahBd7pKCsEHzR84mn0cPkFgNGc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hyOcE3AuxMysWmWLd1BZUtaZCDOyWcyUxjc+uGJU+pZwBcg9HDyQJCyXEkUSH8P2IAA4PoJyjr8F/pDwyERucYHqWTJYorx3o9xN1XHuoSARCy8VjWFsE3uXiqWFXpkNKLXuMcBB/jxGsnFF/VPS4tyy1ACxEE3nYPPm3TkAJQc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Esi0DjvA; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IZ5FEz3+; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Esi0DjvA"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IZ5FEz3+" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNKWNna700762 for ; Wed, 24 Dec 2025 01:03:44 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= P+SBTDTtGkE8RnKwaj4dcEp5VbeaO6x7ZVfHg3H5ESs=; b=Esi0DjvAzJhxorsi g/+0CqqpWMMGETBCdKGbWAK6+wNpcpUgTsjDU9DlpBhFnx5A2q/r6vi44H6iJUXd rPPoPBKv2ob/TY6coqKmULhrTq2Ws6j+f1M5oSTqqnWsgVyacZy7WUZUBsb+QMhe sVf7WTTTDaZPKrSeFvRIcvrsmY9LL6x5U1DHtvybghVoCFvFFqxVCZzkgRnOiIYx H35A0mjZyRosZPZTj7L+ZI3MajMOghue3ZY7KIoamPv5jAAt1K1TE602mnIix5mB USOF+TIqUZJyVRx1gM9WdnGaDLRzkPzwjk6ea6N96EV/KiLzbxuB8eejkGQj0J+I X+d4Eg== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7t7jt5qk-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:44 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-4f1d2aa793fso140168161cf.3 for ; Tue, 23 Dec 2025 17:03:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538224; x=1767143024; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=P+SBTDTtGkE8RnKwaj4dcEp5VbeaO6x7ZVfHg3H5ESs=; b=IZ5FEz3+0DPobY1v/khXC56u1loAmRl5Fmxl5I/+nVdExSaMWyhdMvaYRu0+qBykG/ Lzb7txIlgdvPOFr+rn1NKnJVr0eyVPPY+j1FTYuOucCPlYOnCc3ooWI1p5FOHx2VQejG /JO2iDSCx+5d9/TsK9T0ryJ4Lc1pJfNuclqmUSCqhK+IayRxDzN0jJlK9uY9U51sKIOS vE7AixroICSwORJyOc4a/Gxd9BM+8eYvXrYgHDi7wz1Tol2aA2DgEV3mCozKgA/KXpsQ 3rnx6Ul3itNYvGc/rPUsl2XZ121IFaYQ/xW9nF6LZ7ASOWDI/VWBHZyUs/pMTkLnSAa6 I2Lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538224; x=1767143024; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=P+SBTDTtGkE8RnKwaj4dcEp5VbeaO6x7ZVfHg3H5ESs=; b=Zc7xmGxVXeTR4B1btmmTBN77dFM5KLjBBqkVMX//ulNrVrT4hZyQ5cBB3x6XArm+Qn u9toZCR3ysnSRPMZmPaVukjfBHB9jCb3B23+YNaCx14zgoqf2Jojt/7c28eyNKd9j8GK M4ut/w/EKFxhCh2TDonxaQhriGqQoLW9WOKmGE9WG1btmCaIEUj0dRDK5AkB5y5C/Dmw 2gFhNVCFLrCCDDO97eqOzq4w0X6zeHn1JIXINviQXUZoJ1fBAFMtD07kNmYlqA/pDfkP UiFFZ4vSn18wdCbNHAIeXW2GUQ5/6KBD7rHTNARh038XUhc/cAWkITkEOREMdLb9X3Df 7AEA== X-Forwarded-Encrypted: i=1; AJvYcCX+dHgloZTUicgj562sMRDWg66blzJUJzn+MzIm8kfofp/PDl2Joy+cvE/Qit2Ufi8XT/7Ch8KGURwSdgg=@vger.kernel.org X-Gm-Message-State: AOJu0YxAlwbGDmJFZZRtlgKTN1ZEcCrTlwrEinlgEmOiTAFHgbEOB3Sw +WHXMiUEixTeD6ktt3nN3uzgcDeIjCkonLwJwVtnLUO58Uc6JZojrqig6nW6zlMKCc09FjR2NXL dZxaFI3Q7SkkkYO5Ne+c6ELd1S/+k0pWUbqCixU6yKqY2VZlJnNsJD2eZrc/DRS9iTOw= X-Gm-Gg: AY/fxX63ZhVuLWexjrw93hPwT1RnHJFTta22bR/uO+IFXox1kmwXPMpZkuGYDSCdgjb Vop9JfKC9wbh5T3+dHXWXo2xJCxrtb8T9TG3+PLpcDn2mHhJ2z/OgvGZUFRW1FxMdcA4QlLSYxF CtUuMDALu+L0Xci3rPUbPbjqi3w0avb6fGtOApMsQgHNSrfvrT2nGDYeXv/20J2qq800sOLNzGR OHrX8FfhhwUmuGP2U1UsWWZQWpgZqsLM5vliqD1YTIQLNdHINCuspEDr+pzbTm29pO7yHBNpwgX dSlbTufo3Hv3EcWmBQOozvNO2KleEZrgR/hjpTGTgr3wzfQ66VcIOZmXmTPZjhCBcRXAo3oPxbG YUUgKN1PodQ8bjORGUwbw/Oi3Kg9tz112gNN5o+zYZFvVkHKcT68uAkwo4kRbOEVWZt37kMBoW1 zdwDH/oG4PBw1picIXdwTjPGI= X-Received: by 2002:ac8:5714:0:b0:4ed:b06b:d67d with SMTP id d75a77b69052e-4f4abd79a65mr200344511cf.45.1766538223845; Tue, 23 Dec 2025 17:03:43 -0800 (PST) X-Google-Smtp-Source: AGHT+IF3FPxruJlcg4sByZJPHlC6i+AJRJP3LWX/PRkxW+hSkPSJ4R06usLW/tOcstjoguUC6XxUXg== X-Received: by 2002:ac8:5714:0:b0:4ed:b06b:d67d with SMTP id d75a77b69052e-4f4abd79a65mr200343621cf.45.1766538223198; Tue, 23 Dec 2025 17:03:43 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:40 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:53 +0200 Subject: [PATCH v3 04/10] drm/connector: make clear_infoframe callback mandatory for HDMI connectors 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: <20251224-limit-infoframes-2-v3-4-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5379; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=nzElO3qrN1ngMVHhZahBd7pKCsEHzR84mn0cPkFgNGc=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvY4okwjZ995SvLTt2suiGbzvPytcBxbUZoJ IPFjD2XFqiJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72AAKCRCLPIo+Aiko 1VbaB/9msli7nDTqX+64qChKWsJQHzLJSmqJubE1UJ2Nf5Hi/AwpsU7hfYtfCl3WwKKmKfuuu8Q Lnl1Ig4EyHgBKD8apvy+9QiFbhlYaqL42IMOn+b4fFQG+1HPmsw4bhcy1pYeNPK2nWrNf4Iot+s sd3Qh5XwmI66qB1NAgelgo+ogMATAG/krn39azAVbzRMw8HrEzuws07zAM9ceLRCB1ggf6IEBFQ TFqvoA7DhLiuf8z1XlDYFdpss+zjWGa6X0rgks+Jb7dLupcHZqGP6X4NiZ6MxeJ8PeusTd6aEyy LwfXlcUtR0hby0mDACU1DWxjeEkPR22us8arufoAaAdFAFeo X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfXxPzcLjfrgtne Slbt52UTajXaVNXTNY9/naeLCLZQrf44Xc71xoIGBUQIL+ay6Ti6uU5Zaj7/XQgdPOW4/YlOwRx wuQ7KwQ0GKJ2Hxqs/T03kbFFZw2dnuPgc51960WJGrZ2tiBZ02Im8pxln6KEgGBskM4BEELZaQS 16tGdNnNbSyvgeyDSkl1C3/2DDEuHTppUcvsJT5NNgZzE0UuPRD1921eLmRgAHeJiXm6YrXggUJ a5EbQe5IjFpF4Jc6XFltwBxJK4E86mXTZyirKF69SS529D4X354uyklq1MgeQbf4GseMUJqeRMC eTuZXPe3oRk2NPEDNu15yWgQ9bMtLgw0hJ0O7anpS1Wvq9zHpgJARfZRxlWJu0PFCFjwnvsETfr 5JGVomwhKatc9Z154DLkGo4W6KU+XAPJNeTjy1hGTFkOV+K3qILMCF/41B/WTvj/QrIJPeCWuTn kTXGBntAUs8QXf8l+4Q== X-Authority-Analysis: v=2.4 cv=IvATsb/g c=1 sm=1 tr=0 ts=694b3bf0 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=9fyoTQa5ixSHU3Y6h0oA:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-GUID: p2vfFUc4flGIbveyyz13P0TMjPBbni73 X-Proofpoint-ORIG-GUID: p2vfFUc4flGIbveyyz13P0TMjPBbni73 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 impostorscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 We already require both hdmi_write_infoframe and hdmi_clear_infoframe for bridges implementing DRM_BRIDGE_OP_HDMI. It makes sense to require the clear_infoframes callback for HDMI connectors utilizing drmm_connector_hdmi_init(). Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/drm_connector.c | 4 ++++ drivers/gpu/drm/tests/drm_connector_test.c | 15 +++++++++++++++ drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 22 ++++++++++++++++++= ++++ include/drm/drm_connector.h | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 4d6dc9ebfdb5..40e025712c9b 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -600,6 +600,10 @@ int drmm_connector_hdmi_init(struct drm_device *dev, if (!(max_bpc =3D=3D 8 || max_bpc =3D=3D 10 || max_bpc =3D=3D 12)) return -EINVAL; =20 + if (!hdmi_funcs->clear_infoframe || + !hdmi_funcs->write_infoframe) + return -EINVAL; + ret =3D drmm_connector_init(dev, connector, funcs, connector_type, ddc); if (ret) return ret; diff --git a/drivers/gpu/drm/tests/drm_connector_test.c b/drivers/gpu/drm/t= ests/drm_connector_test.c index 22e2d959eb31..f356ea695ae7 100644 --- a/drivers/gpu/drm/tests/drm_connector_test.c +++ b/drivers/gpu/drm/tests/drm_connector_test.c @@ -25,7 +25,22 @@ struct drm_connector_init_priv { struct i2c_adapter ddc; }; =20 +static int accept_infoframe_clear_infoframe(struct drm_connector *connecto= r, + enum hdmi_infoframe_type type) +{ + return 0; +} + +static int accept_infoframe_write_infoframe(struct drm_connector *connecto= r, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + return 0; +} + static const struct drm_connector_hdmi_funcs dummy_hdmi_funcs =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, }; =20 static const struct drm_connector_funcs dummy_funcs =3D { diff --git a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c b/drivers/g= pu/drm/tests/drm_hdmi_state_helper_test.c index bdf14a0623b2..915dcd106703 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -76,7 +76,22 @@ static int set_connector_edid(struct kunit *test, struct= drm_connector *connecto return ret; } =20 +static int accept_infoframe_clear_infoframe(struct drm_connector *connecto= r, + enum hdmi_infoframe_type type) +{ + return 0; +} + +static int accept_infoframe_write_infoframe(struct drm_connector *connecto= r, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len) +{ + return 0; +} + static const struct drm_connector_hdmi_funcs dummy_connector_hdmi_funcs = =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, }; =20 static enum drm_mode_status @@ -89,6 +104,8 @@ reject_connector_tmds_char_rate_valid(const struct drm_c= onnector *connector, =20 static const struct drm_connector_hdmi_funcs reject_connector_hdmi_funcs = =3D { .tmds_char_rate_valid =3D reject_connector_tmds_char_rate_valid, + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, }; =20 static enum drm_mode_status @@ -101,6 +118,8 @@ reject_100mhz_connector_tmds_char_rate_valid(const stru= ct drm_connector *connect =20 static const struct drm_connector_hdmi_funcs reject_100mhz_connector_hdmi_= funcs =3D { .tmds_char_rate_valid =3D reject_100mhz_connector_tmds_char_rate_valid, + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, }; =20 static int dummy_connector_get_modes(struct drm_connector *connector) @@ -2419,6 +2438,7 @@ static int reject_avi_infoframe_write_infoframe(struc= t drm_connector *connector, } =20 static const struct drm_connector_hdmi_funcs reject_avi_infoframe_hdmi_fun= cs =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, .write_infoframe =3D reject_avi_infoframe_write_infoframe, }; =20 @@ -2500,6 +2520,7 @@ static int reject_hdr_infoframe_write_infoframe(struc= t drm_connector *connector, } =20 static const struct drm_connector_hdmi_funcs reject_hdr_infoframe_hdmi_fun= cs =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, .write_infoframe =3D reject_hdr_infoframe_write_infoframe, }; =20 @@ -2685,6 +2706,7 @@ static int reject_audio_infoframe_write_infoframe(str= uct drm_connector *connecto } =20 static const struct drm_connector_hdmi_funcs reject_audio_infoframe_hdmi_f= uncs =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, .write_infoframe =3D reject_audio_infoframe_write_infoframe, }; =20 diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 8f34f4b8183d..4543833acdec 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1253,7 +1253,7 @@ struct drm_connector_hdmi_funcs { * called multiple times, once for every disabled infoframe * type. * - * The @clear_infoframe callback is optional. + * The @clear_infoframe callback is mandatory. * * Returns: * 0 on success, a negative error code otherwise --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 EEF441DF74F for ; Wed, 24 Dec 2025 01:03:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538234; cv=none; b=oVRgaHwzJXSKFC3TakMl3VgCjFw/LmFWJFUIOngb5MFXzA/TWc0g4wAlEGDvTSHw3FmQnk6GLID9QG0OqJnZk9sET+EgVgig/yGQRpZR3AIkJ0SPKS2cMiE6KAAqOTITO/oQ/cCu/ZsYZh7MVuG85kWjgVnauzvVla1GsSG+HJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538234; c=relaxed/simple; bh=+QPYF0Tug/JCmoPzh+bFm4wK4F7oGHQUQ4VMfR5uVQU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iOwzF/bsJZpVFBLzCmL69ksjW2/f8F41j1Fh9l2VkPKuRaH0f0UPgfIQe3pKVVWBdZIha2iu1DEwNGPMFvriNMsYbC15U8riBmqcwnOW4xT9X6wCKEtdyrGnjmhytV/wvs3t2kGTfBsqcrYgKq6X2RPckskvA3FG1f5gdfDwlI4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ErF+H/k6; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=bAUvgD/6; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ErF+H/k6"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="bAUvgD/6" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BO0CsDN559749 for ; Wed, 24 Dec 2025 01:03:49 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 4f0Nmr1gI6kLHres3R4fEDj4W/LRmTszLklxKTrGmQ4=; b=ErF+H/k6f4Dblwc2 LANGe5ae2oNPlhahyHIhRPTYaYKaFHMb/MEEOv5L8W1Cx6S5gq69elBe/k/Pe6Lu /yky4ZXwAYqHVlXvloZy89O8BZwBf4T1TOxl3iwTJYi21102jLVWuniX+k0hkDup o89Cc93Ubo1ofN2xw4eawieySUdIbocc3zdsNqKtQBcZC1pQtTzqacfAEUw/onhy FL69OY1x9icKegAtSariGEa+yEjvNqbsYGxvYXZqJEcw8do5udHCLdEry0e85rlN 9DA52/6MSCy0Bjc/9RYu+Qrxh+vE5kgJQEW56QGt67EVXSUnTUpE01brcRfFaDH3 SgCpHw== Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7u9csxnn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:49 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-4ed79dd4a47so117118121cf.3 for ; Tue, 23 Dec 2025 17:03:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538229; x=1767143029; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4f0Nmr1gI6kLHres3R4fEDj4W/LRmTszLklxKTrGmQ4=; b=bAUvgD/6qMqN7Y7taFzVlOWovOV8m9S6NGwfanmSpyyJ0Tr091JTpjnkCiSmBeRdtX LREq2+zXTCSLjHnJRZa0OmiINZ6lV+/g4cdFfI2S3dqemvR8KJ0IPFuIag5bQBKb+vab bDfafrSBLlN7oyoXvLMRDNWeVjglEas1w17PQZ8FqlCSCQerJwHSmwlnUyfk1A+uUhlq P399haERKKEiO/CiJan4OpqtsSRTvzfIhbeUtPXSONN1DuQlKdaA27izxnr8gZtr7AhN dWMORQ0f/yx1JWw4T7RyKGQ5R+kzhAD7YguSxfw9wQwN4Y9LzvlYHvGFh8+NfcWeGmBb 9mAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538229; x=1767143029; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4f0Nmr1gI6kLHres3R4fEDj4W/LRmTszLklxKTrGmQ4=; b=Tu9+RaJK4hZqqXaLWIzEEY0UoPSRkYyYn6ZfedXoIkxkiF4GsVceLu1LcjSnmSzAOq Y/+J3rE5yN7SAu5zVcHRr+l6AKzao12GpV90tmcRMn5rpFaoV3s2bbGfpBWKT7rR8x/0 dwepV55DigCQBXXnfj0aqH83R05rRj/yZ7xvia4BRL14pG3hJHVPmo13o/NGos7zrgij AYzLMiRiFkEG27NlDWXuR2Y6o4pQAuip9qI7OfJxvu5KE0PxMNSGdo8kWd9aZUQ/Rurd CpyOvrW/lJxxKdSrJ90ZhIytp7DBS9/9WJB0I3F6LwO6bW/6vJ5TdiA9bS+Fmu54VUuh yGVQ== X-Forwarded-Encrypted: i=1; AJvYcCW07LnTBdjzK0Jpr83HqKYoth55QYkmsICyfpWixjyoBrxhLEpRvKbNqdRtsye/ozFIJLVIP8hN4TmAIaA=@vger.kernel.org X-Gm-Message-State: AOJu0YxPNR4mHzY+Sx8N6u8IgWvkbDqIdu2MAolR7p6mo8rr5CW0ddIW VXPmq/R/jLIlpJaCJHu45EvkpBCjXASxeHm9f2LIlY5zTT4cuUeBbJWUqx7sNI5ocPSvykodCPK Ns5zLmZ+1VX+XMb62/imqAf0ay3mSwn1ytFZy5FJg9wsxR70Vhz7SdcFBBROv5M5ifyI= X-Gm-Gg: AY/fxX7qMZOBbEALepgIs8g9VTwwUTkDnEFs3yh2RUx+cB/PRJpc70eLppPEV9JyAtU ITLnZM3jHqSbPAhNFNBRKmslZuPuABhdp/d3jt+qg1j1Xbp/23u0Y957CU5TjSA1YrSrGM+i4of 5CAtxf3mwUXQtF8MCwEdHK3GF+JNDEx69VgejR1ISAi8o9ISggZV6+PtIBPde3EHA9ef9mED69v kWvt3B5Zqk7lIRW2dCnisc6Q4VJxGU2vukOM3ed0XBvkWej4yon3BcrdkMIJymoF+/1MdkcFlOi 8N6N4KFwK0k2H+2LR7/w9ItgyOZfsf83YKZz2QaUbCWTvvF9b9stLqeaMAXVg6Zc45SUtr6JJiM 7bXNBxGAwfuVLutq5FRCg8hGXKVi1daxT/RVXlmCJC9uavVbiWtJgB4Knx5RgRMrHhVGSqRqX7E HQ+s/nFhZOe29YLizKObGPJIM= X-Received: by 2002:a05:622a:1452:b0:4f1:c6c4:dbcf with SMTP id d75a77b69052e-4f4abd798d9mr222028541cf.41.1766538228360; Tue, 23 Dec 2025 17:03:48 -0800 (PST) X-Google-Smtp-Source: AGHT+IEbTrd16vSJ7f7WUUSqIvAXX61qJZiWxMvCe/My3Edj08irC9mxXMsAXAYp29gClMerW3Fo1g== X-Received: by 2002:a05:622a:1452:b0:4f1:c6c4:dbcf with SMTP id d75a77b69052e-4f4abd798d9mr222027691cf.41.1766538227412; Tue, 23 Dec 2025 17:03:47 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:43 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:54 +0200 Subject: [PATCH v3 05/10] drm/bridge: refactor HDMI InfoFrame callbacks 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: <20251224-limit-infoframes-2-v3-5-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=56672; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=+QPYF0Tug/JCmoPzh+bFm4wK4F7oGHQUQ4VMfR5uVQU=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvYuLFaXxScuxNF1+0/TKkFs1/KWGCWOp7cZ tktA5DxF2SJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72AAKCRCLPIo+Aiko 1SReCACElWIaoH7XXV8LOFGe2NwhAIEnuRcV4R5poA7xyil1ylOzsHV7RBI5ZN3FZCBGaBNZOxg lLZoHZf77SrGqo3AhKy3/ePXwlP/aN4dd3Ypqi41/2ikxbsaQ4uTPtH8EhA5Gp+3l6WjB8RW62R xpHVQyYx6B0L+BdRG7n3dkbNw/dBAlxouIHbpPJ5r34fLnmWyUO3ad4W2njO3iEhSuh/Y3q+LmZ SbR4iD3tPzBCvoj7HjVjNqlf2TtgUo7y4m1RJc169QxgtXkZo8j15gJvAP2GAWE+nXaOM+WPaVk EcbeNyb8wd8D6hDWY4fZX3Mo1ab2v6gGXGhnNIeQlFSXR9+w X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: k6oIXLcbYp7X35G5BvN1GczsmJluXeMw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX9phZ83HP3/Zu Tj+YrqWbNimNHdxw4qoyL2eEg8vOMv69i1YgUvD4sGifp/Ih/T6FHlVUZ+b/PTJ2UwuMyCsYb80 JxCFVsm7Tc4yEi1emFQr8r68Sw79QHqcPWa5CiVWuYy0YoKr1e5BxGvS83j57Fx3lqhPABxAGVc KfM/zH7kdLYAhA8xIocZeHtg4TvK5ra1Hwa5kqpc0lyWvL1pvYJM/WOEY2rVhLLw1vDLOA9WDu9 RuT9dt7jmGyGuzxl7iQ4zkUNQPK1Wy57/gwv6+mAY/Dsr9pi7uU5axbbDqmXVXtCk202la09Tih SfadyXMp+5R1QbW0X5WqlAjmVyEEuCIYr4VYWYrvP5dduGrsjMp/7DLuW+JIsWs6+jy2g1dq42K lDxUXbc3H7OChhjKOfnLqNT0kPX+56REPJu8H5O79QZIwyAcXQCS0gtW/hyidsftcFD6kEnwt6G EgPGdNd0WtWtQodVzow== X-Authority-Analysis: v=2.4 cv=HsN72kTS c=1 sm=1 tr=0 ts=694b3bf5 cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=9DOczjz_NQof1JSYJV0A:9 a=QEXdDO2ut3YA:10 a=uxP6HrT_eTzRwkO_Te1X:22 X-Proofpoint-ORIG-GUID: k6oIXLcbYp7X35G5BvN1GczsmJluXeMw X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0 malwarescore=0 clxscore=1015 adultscore=0 bulkscore=0 phishscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 Having only a single set of callbacks, hdmi_clear_infoframe and hdmi_write_infoframe, bridge drivers don't have an easy way to signal to the DRM framework, which InfoFrames are actually supported by the hardware and by the driver and which are not. Also, it makes it extremely easy for HDMI bridge drivers to skip implementing the seemingly required InfoFrames (e.g. HDMI VSI). Last, but not least, those callbacks take a single 'type' parameter, which makes it impossible to implement support for multiple VSIs (which will be required once we start working on HDMI Forum VSI). Split the callbacks into a per-InfoFrame-kind pairs, letting the bridge drivers actually signal supported features. The implementation follows the overall drm_bridge design, where the bridge has a single drm_bridge_funcs implementation and signals, which functions are to be called using the drm_bridge->ops flags. The AVI and HDMI VSI are assumed to be required for a normal HDMI operation (with the drivers getting a drm_warn_once() stub implementation if one is missing). The Audio InfoFrame is handled by the existing DRM_BRIDGE_OP_HDMI_AUDIO, while the SPD and HDR DRM InfoFrames got new drm_bridge_ops values. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 180 +++++++++++++--------= -- drivers/gpu/drm/bridge/ite-it6263.c | 95 ++++++------ drivers/gpu/drm/bridge/lontium-lt9611.c | 143 ++++++++++-------- drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c | 110 +++++++++----- drivers/gpu/drm/display/drm_bridge_connector.c | 70 ++++++++- drivers/gpu/drm/mediatek/mtk_hdmi_common.c | 8 +- drivers/gpu/drm/mediatek/mtk_hdmi_v2.c | 110 +++++++------- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 195 +++++++++++++--------= ---- drivers/gpu/drm/rockchip/rk3066_hdmi.c | 47 +++--- include/drm/drm_bridge.h | 127 ++++++++++++++-- 10 files changed, 682 insertions(+), 403 deletions(-) diff --git a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c b/drivers/gpu/drm= /bridge/adv7511/adv7511_drv.c index b9be86541307..1050bb62280b 100644 --- a/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c +++ b/drivers/gpu/drm/bridge/adv7511/adv7511_drv.c @@ -887,88 +887,111 @@ static const struct drm_edid *adv7511_bridge_edid_re= ad(struct drm_bridge *bridge return adv7511_edid_read(adv, connector); } =20 -static int adv7511_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int adv7511_bridge_hdmi_clear_audio_infoframe(struct drm_bridge *br= idge) { struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AUDIO: - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME); - break; - case HDMI_INFOFRAME_TYPE_AVI: - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); - break; - case HDMI_INFOFRAME_TYPE_SPD: - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD); - break; - case HDMI_INFOFRAME_TYPE_VENDOR: - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1); - break; - default: - drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", t= ype); - break; - } + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME); =20 return 0; } =20 -static int adv7511_bridge_hdmi_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int adv7511_bridge_hdmi_clear_avi_infoframe(struct drm_bridge *brid= ge) { struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AUDIO: - /* send current Audio infoframe values while updating */ - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, - BIT(5), BIT(5)); - - /* The Audio infoframe id is not configurable */ - regmap_bulk_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_VERSION, - buffer + 1, len - 1); - - /* use Audio infoframe updated info */ - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, - BIT(5), 0); - - adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME); - break; - case HDMI_INFOFRAME_TYPE_AVI: - /* send current AVI infoframe values while updating */ - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, - BIT(6), BIT(6)); - - /* The AVI infoframe id is not configurable */ - regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, - buffer + 1, len - 1); - - regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_LENGTH, 0x2); - regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(1), 0x1); - - /* use AVI infoframe updated info */ - regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, - BIT(6), 0); - - adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); - break; - case HDMI_INFOFRAME_TYPE_SPD: - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD); - regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPD(0), - buffer, len); - adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPD); - break; - case HDMI_INFOFRAME_TYPE_VENDOR: - adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1); - regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPARE1(0), - buffer, len); - adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPARE1); - break; - default: - drm_dbg_driver(adv7511->bridge.dev, "Unsupported HDMI InfoFrame %x\n", t= ype); - break; - } + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + + return 0; +} + +static int adv7511_bridge_hdmi_clear_spd_infoframe(struct drm_bridge *brid= ge) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD); + + return 0; +} + +static int adv7511_bridge_hdmi_clear_hdmi_infoframe(struct drm_bridge *bri= dge) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1); + + return 0; +} + +static int adv7511_bridge_hdmi_write_audio_infoframe(struct drm_bridge *br= idge, + const u8 *buffer, size_t len) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + /* send current Audio infoframe values while updating */ + regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, + BIT(5), BIT(5)); + + /* The Audio infoframe id is not configurable */ + regmap_bulk_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_VERSION, + buffer + 1, len - 1); + + /* use Audio infoframe updated info */ + regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, + BIT(5), 0); + + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AUDIO_INFOFRAME); + + return 0; +} + +static int adv7511_bridge_hdmi_write_avi_infoframe(struct drm_bridge *brid= ge, + const u8 *buffer, size_t len) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + /* send current AVI infoframe values while updating */ + regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, + BIT(6), BIT(6)); + + /* The AVI infoframe id is not configurable */ + regmap_bulk_write(adv7511->regmap, ADV7511_REG_AVI_INFOFRAME_VERSION, + buffer + 1, len - 1); + + regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME_LENGTH, 0x2); + regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(1), 0x1); + + /* use AVI infoframe updated info */ + regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE, + BIT(6), 0); + + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_AVI_INFOFRAME); + + return 0; +} + +static int adv7511_bridge_hdmi_write_spd_infoframe(struct drm_bridge *brid= ge, + const u8 *buffer, size_t len) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPD); + regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPD(0), + buffer, len); + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPD); + + return 0; +} + +static int adv7511_bridge_hdmi_write_hdmi_infoframe(struct drm_bridge *bri= dge, + const u8 *buffer, size_t len) +{ + struct adv7511 *adv7511 =3D bridge_to_adv7511(bridge); + + adv7511_packet_disable(adv7511, ADV7511_PACKET_ENABLE_SPARE1); + regmap_bulk_write(adv7511->regmap_packet, ADV7511_PACKET_SPARE1(0), + buffer, len); + adv7511_packet_enable(adv7511, ADV7511_PACKET_ENABLE_SPARE1); =20 return 0; } @@ -986,8 +1009,14 @@ static const struct drm_bridge_funcs adv7511_bridge_f= uncs =3D { .atomic_reset =3D drm_atomic_helper_bridge_reset, =20 .hdmi_tmds_char_rate_valid =3D adv7511_bridge_hdmi_tmds_char_rate_valid, - .hdmi_clear_infoframe =3D adv7511_bridge_hdmi_clear_infoframe, - .hdmi_write_infoframe =3D adv7511_bridge_hdmi_write_infoframe, + .hdmi_clear_audio_infoframe =3D adv7511_bridge_hdmi_clear_audio_infoframe, + .hdmi_write_audio_infoframe =3D adv7511_bridge_hdmi_write_audio_infoframe, + .hdmi_clear_avi_infoframe =3D adv7511_bridge_hdmi_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D adv7511_bridge_hdmi_write_avi_infoframe, + .hdmi_clear_spd_infoframe =3D adv7511_bridge_hdmi_clear_spd_infoframe, + .hdmi_write_spd_infoframe =3D adv7511_bridge_hdmi_write_spd_infoframe, + .hdmi_clear_hdmi_infoframe =3D adv7511_bridge_hdmi_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe =3D adv7511_bridge_hdmi_write_hdmi_infoframe, =20 .hdmi_audio_startup =3D adv7511_hdmi_audio_startup, .hdmi_audio_prepare =3D adv7511_hdmi_audio_prepare, @@ -1322,7 +1351,8 @@ static int adv7511_probe(struct i2c_client *i2c) =20 adv7511->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | - DRM_BRIDGE_OP_HDMI; + DRM_BRIDGE_OP_HDMI | + DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME; if (adv7511->i2c_main->irq) adv7511->bridge.ops |=3D DRM_BRIDGE_OP_HPD; =20 diff --git a/drivers/gpu/drm/bridge/ite-it6263.c b/drivers/gpu/drm/bridge/i= te-it6263.c index 2eb8fba7016c..3991fb76143c 100644 --- a/drivers/gpu/drm/bridge/ite-it6263.c +++ b/drivers/gpu/drm/bridge/ite-it6263.c @@ -759,61 +759,62 @@ it6263_hdmi_tmds_char_rate_valid(const struct drm_bri= dge *bridge, return MODE_OK; } =20 -static int it6263_hdmi_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int it6263_hdmi_clear_avi_infoframe(struct drm_bridge *bridge) { struct it6263 *it =3D bridge_to_it6263(bridge); =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - regmap_write(it->hdmi_regmap, HDMI_REG_AVI_INFOFRM_CTRL, 0); - break; - case HDMI_INFOFRAME_TYPE_VENDOR: - regmap_write(it->hdmi_regmap, HDMI_REG_PKT_NULL_CTRL, 0); - break; - default: - dev_dbg(it->dev, "unsupported HDMI infoframe 0x%x\n", type); - } + regmap_write(it->hdmi_regmap, HDMI_REG_AVI_INFOFRM_CTRL, 0); + + return 0; +} + +static int it6263_hdmi_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + struct it6263 *it =3D bridge_to_it6263(bridge); + + regmap_write(it->hdmi_regmap, HDMI_REG_PKT_NULL_CTRL, 0); =20 return 0; } =20 -static int it6263_hdmi_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int it6263_hdmi_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { struct it6263 *it =3D bridge_to_it6263(bridge); struct regmap *regmap =3D it->hdmi_regmap; =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - /* write the first AVI infoframe data byte chunk(DB1-DB5) */ - regmap_bulk_write(regmap, HDMI_REG_AVI_DB1, - &buffer[HDMI_INFOFRAME_HEADER_SIZE], - HDMI_AVI_DB_CHUNK1_SIZE); - - /* write the second AVI infoframe data byte chunk(DB6-DB13) */ - regmap_bulk_write(regmap, HDMI_REG_AVI_DB6, - &buffer[HDMI_INFOFRAME_HEADER_SIZE + - HDMI_AVI_DB_CHUNK1_SIZE], - HDMI_AVI_DB_CHUNK2_SIZE); - - /* write checksum */ - regmap_write(regmap, HDMI_REG_AVI_CSUM, buffer[3]); - - regmap_write(regmap, HDMI_REG_AVI_INFOFRM_CTRL, - ENABLE_PKT | REPEAT_PKT); - break; - case HDMI_INFOFRAME_TYPE_VENDOR: - /* write header and payload */ - regmap_bulk_write(regmap, HDMI_REG_PKT_HB(0), buffer, len); - - regmap_write(regmap, HDMI_REG_PKT_NULL_CTRL, - ENABLE_PKT | REPEAT_PKT); - break; - default: - dev_dbg(it->dev, "unsupported HDMI infoframe 0x%x\n", type); - } + /* write the first AVI infoframe data byte chunk(DB1-DB5) */ + regmap_bulk_write(regmap, HDMI_REG_AVI_DB1, + &buffer[HDMI_INFOFRAME_HEADER_SIZE], + HDMI_AVI_DB_CHUNK1_SIZE); + + /* write the second AVI infoframe data byte chunk(DB6-DB13) */ + regmap_bulk_write(regmap, HDMI_REG_AVI_DB6, + &buffer[HDMI_INFOFRAME_HEADER_SIZE + + HDMI_AVI_DB_CHUNK1_SIZE], + HDMI_AVI_DB_CHUNK2_SIZE); + + /* write checksum */ + regmap_write(regmap, HDMI_REG_AVI_CSUM, buffer[3]); + + regmap_write(regmap, HDMI_REG_AVI_INFOFRM_CTRL, + ENABLE_PKT | REPEAT_PKT); + + return 0; +} + +static int it6263_hdmi_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct it6263 *it =3D bridge_to_it6263(bridge); + struct regmap *regmap =3D it->hdmi_regmap; + + /* write header and payload */ + regmap_bulk_write(regmap, HDMI_REG_PKT_HB(0), buffer, len); + + regmap_write(regmap, HDMI_REG_PKT_NULL_CTRL, + ENABLE_PKT | REPEAT_PKT); + =20 return 0; } @@ -830,8 +831,10 @@ static const struct drm_bridge_funcs it6263_bridge_fun= cs =3D { .edid_read =3D it6263_bridge_edid_read, .atomic_get_input_bus_fmts =3D it6263_bridge_atomic_get_input_bus_fmts, .hdmi_tmds_char_rate_valid =3D it6263_hdmi_tmds_char_rate_valid, - .hdmi_clear_infoframe =3D it6263_hdmi_clear_infoframe, - .hdmi_write_infoframe =3D it6263_hdmi_write_infoframe, + .hdmi_clear_avi_infoframe =3D it6263_hdmi_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D it6263_hdmi_write_avi_infoframe, + .hdmi_clear_hdmi_infoframe =3D it6263_hdmi_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe =3D it6263_hdmi_write_hdmi_infoframe, }; =20 static int it6263_probe(struct i2c_client *client) diff --git a/drivers/gpu/drm/bridge/lontium-lt9611.c b/drivers/gpu/drm/brid= ge/lontium-lt9611.c index a2d032ee4744..0628d8e737ab 100644 --- a/drivers/gpu/drm/bridge/lontium-lt9611.c +++ b/drivers/gpu/drm/bridge/lontium-lt9611.c @@ -843,84 +843,96 @@ lt9611_atomic_get_input_bus_fmts(struct drm_bridge *b= ridge, #define LT9611_INFOFRAME_AUDIO 0x02 #define LT9611_INFOFRAME_AVI 0x08 #define LT9611_INFOFRAME_SPD 0x10 -#define LT9611_INFOFRAME_VENDOR 0x20 +#define LT9611_INFOFRAME_HDMI 0x20 =20 -static int lt9611_hdmi_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int lt9611_hdmi_clear_audio_infoframe(struct drm_bridge *bridge) { struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); - unsigned int mask; =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AUDIO: - mask =3D LT9611_INFOFRAME_AUDIO; - break; + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_AUDIO, 0); =20 - case HDMI_INFOFRAME_TYPE_AVI: - mask =3D LT9611_INFOFRAME_AVI; - break; + return 0; +} =20 - case HDMI_INFOFRAME_TYPE_SPD: - mask =3D LT9611_INFOFRAME_SPD; - break; +static int lt9611_hdmi_clear_avi_infoframe(struct drm_bridge *bridge) +{ + struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); =20 - case HDMI_INFOFRAME_TYPE_VENDOR: - mask =3D LT9611_INFOFRAME_VENDOR; - break; + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_AVI, 0); =20 - default: - drm_dbg_driver(lt9611->bridge.dev, "Unsupported HDMI InfoFrame %x\n", ty= pe); - mask =3D 0; - break; - } + return 0; +} + +static int lt9611_hdmi_clear_spd_infoframe(struct drm_bridge *bridge) +{ + struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); =20 - if (mask) - regmap_update_bits(lt9611->regmap, 0x843d, mask, 0); + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_SPD, 0); =20 return 0; } =20 -static int lt9611_hdmi_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int lt9611_hdmi_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); + + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_HDMI, 0); + + return 0; +} + +static int lt9611_hdmi_write_audio_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); - unsigned int mask, addr; int i; =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AUDIO: - mask =3D LT9611_INFOFRAME_AUDIO; - addr =3D 0x84b2; - break; - - case HDMI_INFOFRAME_TYPE_AVI: - mask =3D LT9611_INFOFRAME_AVI; - addr =3D 0x8440; - break; - - case HDMI_INFOFRAME_TYPE_SPD: - mask =3D LT9611_INFOFRAME_SPD; - addr =3D 0x8493; - break; - - case HDMI_INFOFRAME_TYPE_VENDOR: - mask =3D LT9611_INFOFRAME_VENDOR; - addr =3D 0x8474; - break; - - default: - drm_dbg_driver(lt9611->bridge.dev, "Unsupported HDMI InfoFrame %x\n", ty= pe); - mask =3D 0; - break; - } + for (i =3D 0; i < len; i++) + regmap_write(lt9611->regmap, 0x84b2 + i, buffer[i]); =20 - if (mask) { - for (i =3D 0; i < len; i++) - regmap_write(lt9611->regmap, addr + i, buffer[i]); + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_AUDIO, LT9611= _INFOFRAME_AUDIO); =20 - regmap_update_bits(lt9611->regmap, 0x843d, mask, mask); - } + return 0; +} + +static int lt9611_hdmi_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); + int i; + + for (i =3D 0; i < len; i++) + regmap_write(lt9611->regmap, 0x8440 + i, buffer[i]); + + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_AVI, LT9611_I= NFOFRAME_AVI); + + return 0; +} + +static int lt9611_hdmi_write_spd_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); + int i; + + for (i =3D 0; i < len; i++) + regmap_write(lt9611->regmap, 0x8493 + i, buffer[i]); + + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_SPD, LT9611_I= NFOFRAME_SPD); + + return 0; +} + +static int lt9611_hdmi_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct lt9611 *lt9611 =3D bridge_to_lt9611(bridge); + int i; + + for (i =3D 0; i < len; i++) + regmap_write(lt9611->regmap, 0x8474 + i, buffer[i]); + + regmap_update_bits(lt9611->regmap, 0x843d, LT9611_INFOFRAME_HDMI, LT9611_= INFOFRAME_HDMI); =20 return 0; } @@ -1003,8 +1015,14 @@ static const struct drm_bridge_funcs lt9611_bridge_f= uncs =3D { .atomic_get_input_bus_fmts =3D lt9611_atomic_get_input_bus_fmts, =20 .hdmi_tmds_char_rate_valid =3D lt9611_hdmi_tmds_char_rate_valid, - .hdmi_write_infoframe =3D lt9611_hdmi_write_infoframe, - .hdmi_clear_infoframe =3D lt9611_hdmi_clear_infoframe, + .hdmi_write_audio_infoframe =3D lt9611_hdmi_write_audio_infoframe, + .hdmi_clear_audio_infoframe =3D lt9611_hdmi_clear_audio_infoframe, + .hdmi_write_avi_infoframe =3D lt9611_hdmi_write_avi_infoframe, + .hdmi_clear_avi_infoframe =3D lt9611_hdmi_clear_avi_infoframe, + .hdmi_write_spd_infoframe =3D lt9611_hdmi_write_spd_infoframe, + .hdmi_clear_spd_infoframe =3D lt9611_hdmi_clear_spd_infoframe, + .hdmi_write_hdmi_infoframe =3D lt9611_hdmi_write_hdmi_infoframe, + .hdmi_clear_hdmi_infoframe =3D lt9611_hdmi_clear_hdmi_infoframe, =20 .hdmi_audio_startup =3D lt9611_hdmi_audio_startup, .hdmi_audio_prepare =3D lt9611_hdmi_audio_prepare, @@ -1132,7 +1150,8 @@ static int lt9611_probe(struct i2c_client *client) lt9611->bridge.of_node =3D client->dev.of_node; lt9611->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_MODES | - DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_HDMI_AUDIO; + DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_HDMI_AUDIO | + DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME; lt9611->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; lt9611->bridge.vendor =3D "Lontium"; lt9611->bridge.product =3D "LT9611"; diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c b/drivers/gpu/drm= /bridge/synopsys/dw-hdmi-qp.c index fe4c026280f0..f57307dd61c8 100644 --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-qp.c @@ -26,6 +26,7 @@ #include #include #include +#include =20 #include =20 @@ -933,57 +934,85 @@ dw_hdmi_qp_bridge_tmds_char_rate_valid(const struct d= rm_bridge *bridge, return MODE_OK; } =20 -static int dw_hdmi_qp_bridge_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int dw_hdmi_qp_bridge_clear_avi_infoframe(struct drm_bridge *bridge) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, - PKTSCHED_PKT_EN); - break; + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_AVI_TX_EN | PKTSCHED_GCP_TX_EN, + PKTSCHED_PKT_EN); =20 - case HDMI_INFOFRAME_TYPE_DRM: - dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); - break; + return 0; +} =20 - case HDMI_INFOFRAME_TYPE_AUDIO: - dw_hdmi_qp_mod(hdmi, 0, - PKTSCHED_ACR_TX_EN | - PKTSCHED_AUDS_TX_EN | - PKTSCHED_AUDI_TX_EN, - PKTSCHED_PKT_EN); - break; - default: - dev_dbg(hdmi->dev, "Unsupported infoframe type %x\n", type); - } +static int dw_hdmi_qp_bridge_clear_hdmi_infoframe(struct drm_bridge *bridg= e) +{ + /* FIXME: add support for this InfoFrame */ + + drm_warn_once(bridge->encoder->dev, "HDMI VSI not supported\n"); =20 return 0; } =20 -static int dw_hdmi_qp_bridge_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int dw_hdmi_qp_bridge_clear_hdr_drm_infoframe(struct drm_bridge *br= idge) { struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 - dw_hdmi_qp_bridge_clear_infoframe(bridge, type); + dw_hdmi_qp_mod(hdmi, 0, PKTSCHED_DRMI_TX_EN, PKTSCHED_PKT_EN); =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - return dw_hdmi_qp_config_avi_infoframe(hdmi, buffer, len); + return 0; +} =20 - case HDMI_INFOFRAME_TYPE_DRM: - return dw_hdmi_qp_config_drm_infoframe(hdmi, buffer, len); +static int dw_hdmi_qp_bridge_clear_audio_infoframe(struct drm_bridge *brid= ge) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; =20 - case HDMI_INFOFRAME_TYPE_AUDIO: - return dw_hdmi_qp_config_audio_infoframe(hdmi, buffer, len); + dw_hdmi_qp_mod(hdmi, 0, + PKTSCHED_ACR_TX_EN | + PKTSCHED_AUDS_TX_EN | + PKTSCHED_AUDI_TX_EN, + PKTSCHED_PKT_EN); =20 - default: - dev_dbg(hdmi->dev, "Unsupported infoframe type %x\n", type); - return 0; - } + return 0; +} + +static int dw_hdmi_qp_bridge_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + dw_hdmi_qp_bridge_clear_avi_infoframe(bridge); + + return dw_hdmi_qp_config_avi_infoframe(hdmi, buffer, len); +} + +static int dw_hdmi_qp_bridge_write_hdmi_infoframe(struct drm_bridge *bridg= e, + const u8 *buffer, size_t len) +{ + dw_hdmi_qp_bridge_clear_hdmi_infoframe(bridge); + + /* FIXME: add support for the HDMI VSI */ + + return 0; +} + +static int dw_hdmi_qp_bridge_write_hdr_drm_infoframe(struct drm_bridge *br= idge, + const u8 *buffer, size_t len) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + dw_hdmi_qp_bridge_clear_hdr_drm_infoframe(bridge); + + return dw_hdmi_qp_config_drm_infoframe(hdmi, buffer, len); +} + +static int dw_hdmi_qp_bridge_write_audio_infoframe(struct drm_bridge *brid= ge, + const u8 *buffer, size_t len) +{ + struct dw_hdmi_qp *hdmi =3D bridge->driver_private; + + dw_hdmi_qp_bridge_clear_audio_infoframe(bridge); + + return dw_hdmi_qp_config_audio_infoframe(hdmi, buffer, len); } =20 #ifdef CONFIG_DRM_DW_HDMI_QP_CEC @@ -1168,8 +1197,14 @@ static const struct drm_bridge_funcs dw_hdmi_qp_brid= ge_funcs =3D { .detect =3D dw_hdmi_qp_bridge_detect, .edid_read =3D dw_hdmi_qp_bridge_edid_read, .hdmi_tmds_char_rate_valid =3D dw_hdmi_qp_bridge_tmds_char_rate_valid, - .hdmi_clear_infoframe =3D dw_hdmi_qp_bridge_clear_infoframe, - .hdmi_write_infoframe =3D dw_hdmi_qp_bridge_write_infoframe, + .hdmi_clear_avi_infoframe =3D dw_hdmi_qp_bridge_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D dw_hdmi_qp_bridge_write_avi_infoframe, + .hdmi_clear_hdmi_infoframe =3D dw_hdmi_qp_bridge_clear_hdmi_infoframe, + .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_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, .hdmi_audio_shutdown =3D dw_hdmi_qp_audio_disable, .hdmi_audio_prepare =3D dw_hdmi_qp_audio_prepare, @@ -1282,6 +1317,7 @@ 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_HPD; hdmi->bridge.of_node =3D pdev->dev.of_node; hdmi->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index a2d30cf9e06d..8fd7722fe9a3 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -412,7 +412,30 @@ static int drm_bridge_connector_clear_infoframe(struct= drm_connector *connector, if (!bridge) return -EINVAL; =20 - return bridge->funcs->hdmi_clear_infoframe(bridge, type); + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + /* required */ + return bridge->funcs->hdmi_clear_avi_infoframe(bridge); + case HDMI_INFOFRAME_TYPE_VENDOR: + /* required */ + return bridge->funcs->hdmi_clear_hdmi_infoframe(bridge); + case HDMI_INFOFRAME_TYPE_AUDIO: + if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) + return bridge->funcs->hdmi_clear_audio_infoframe(bridge); + break; + case HDMI_INFOFRAME_TYPE_DRM: + if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) + return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); + break; + case HDMI_INFOFRAME_TYPE_SPD: + if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) + return bridge->funcs->hdmi_clear_spd_infoframe(bridge); + break; + } + + drm_dbg_driver(connector->dev, "Unsupported HDMI InfoFrame %x\n", type); + + return 0; } =20 static int drm_bridge_connector_write_infoframe(struct drm_connector *conn= ector, @@ -427,7 +450,30 @@ static int drm_bridge_connector_write_infoframe(struct= drm_connector *connector, if (!bridge) return -EINVAL; =20 - return bridge->funcs->hdmi_write_infoframe(bridge, type, buffer, len); + switch (type) { + case HDMI_INFOFRAME_TYPE_AVI: + /* required */ + return bridge->funcs->hdmi_write_avi_infoframe(bridge, buffer, len); + case HDMI_INFOFRAME_TYPE_VENDOR: + /* required */ + return bridge->funcs->hdmi_write_hdmi_infoframe(bridge, buffer, len); + case HDMI_INFOFRAME_TYPE_AUDIO: + if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) + return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); + break; + case HDMI_INFOFRAME_TYPE_DRM: + if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) + return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); + break; + case HDMI_INFOFRAME_TYPE_SPD: + if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) + return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); + break; + } + + drm_dbg_driver(connector->dev, "Unsupported HDMI InfoFrame %x\n", type); + + return 0; } =20 static const struct drm_edid * @@ -709,8 +755,20 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, if (bridge->ops & DRM_BRIDGE_OP_HDMI) { if (bridge_connector->bridge_hdmi) return ERR_PTR(-EBUSY); - if (!bridge->funcs->hdmi_write_infoframe || - !bridge->funcs->hdmi_clear_infoframe) + if (!bridge->funcs->hdmi_write_avi_infoframe || + !bridge->funcs->hdmi_clear_avi_infoframe || + !bridge->funcs->hdmi_write_hdmi_infoframe || + !bridge->funcs->hdmi_clear_hdmi_infoframe) + return ERR_PTR(-EINVAL); + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME && + (!bridge->funcs->hdmi_write_hdr_drm_infoframe || + !bridge->funcs->hdmi_clear_hdr_drm_infoframe)) + return ERR_PTR(-EINVAL); + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME && + (!bridge->funcs->hdmi_write_spd_infoframe || + !bridge->funcs->hdmi_clear_spd_infoframe)) return ERR_PTR(-EINVAL); =20 bridge_connector->bridge_hdmi =3D drm_bridge_get(bridge); @@ -732,7 +790,9 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, !bridge->hdmi_audio_spdif_playback) return ERR_PTR(-EINVAL); =20 - if (!bridge->funcs->hdmi_audio_prepare || + if (!bridge->funcs->hdmi_write_audio_infoframe || + !bridge->funcs->hdmi_clear_audio_infoframe || + !bridge->funcs->hdmi_audio_prepare || !bridge->funcs->hdmi_audio_shutdown) return ERR_PTR(-EINVAL); =20 diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_common.c b/drivers/gpu/drm/m= ediatek/mtk_hdmi_common.c index e78eb0876f16..c599ba767093 100644 --- a/drivers/gpu/drm/mediatek/mtk_hdmi_common.c +++ b/drivers/gpu/drm/mediatek/mtk_hdmi_common.c @@ -433,9 +433,11 @@ struct mtk_hdmi *mtk_hdmi_common_probe(struct platform= _device *pdev) hdmi->bridge.ops =3D DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID | DRM_BRIDGE_OP_HPD; =20 - if (ver_conf->bridge_funcs->hdmi_write_infoframe && - ver_conf->bridge_funcs->hdmi_clear_infoframe) - hdmi->bridge.ops |=3D DRM_BRIDGE_OP_HDMI; + /* Only v2 support OP_HDMI now and it we know that it also support SPD */ + if (ver_conf->bridge_funcs->hdmi_write_avi_infoframe && + ver_conf->bridge_funcs->hdmi_clear_avi_infoframe) + hdmi->bridge.ops |=3D DRM_BRIDGE_OP_HDMI | + DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME; =20 hdmi->bridge.type =3D DRM_MODE_CONNECTOR_HDMIA; hdmi->bridge.ddc =3D hdmi->ddc_adpt; diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_v2.c b/drivers/gpu/drm/media= tek/mtk_hdmi_v2.c index c272e1e74b7d..d0e4440b7491 100644 --- a/drivers/gpu/drm/mediatek/mtk_hdmi_v2.c +++ b/drivers/gpu/drm/mediatek/mtk_hdmi_v2.c @@ -145,8 +145,11 @@ static inline u32 mtk_hdmi_v2_format_hw_packet(const u= 8 *buffer, u8 len) return val; } =20 -static void mtk_hdmi_v2_hw_write_audio_infoframe(struct mtk_hdmi *hdmi, co= nst u8 *buffer) +static int mtk_hdmi_v2_hdmi_write_audio_infoframe(struct drm_bridge *bridg= e, + const u8 *buffer, size_t len) { + struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, AUD_EN | AUD_EN_WR); regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, AUD_RPT_EN); =20 @@ -158,10 +161,15 @@ static void mtk_hdmi_v2_hw_write_audio_infoframe(stru= ct mtk_hdmi *hdmi, const u8 =20 regmap_set_bits(hdmi->regs, TOP_INFO_RPT, AUD_RPT_EN); regmap_set_bits(hdmi->regs, TOP_INFO_EN, AUD_EN | AUD_EN_WR); + + return 0; } =20 -static void mtk_hdmi_v2_hw_write_avi_infoframe(struct mtk_hdmi *hdmi, cons= t u8 *buffer) +static int mtk_hdmi_v2_hdmi_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { + struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, AVI_EN_WR | AVI_EN); regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, AVI_RPT_EN); =20 @@ -175,10 +183,15 @@ static void mtk_hdmi_v2_hw_write_avi_infoframe(struct= mtk_hdmi *hdmi, const u8 * =20 regmap_set_bits(hdmi->regs, TOP_INFO_RPT, AVI_RPT_EN); regmap_set_bits(hdmi->regs, TOP_INFO_EN, AVI_EN_WR | AVI_EN); + + return 0; } =20 -static void mtk_hdmi_v2_hw_write_spd_infoframe(struct mtk_hdmi *hdmi, cons= t u8 *buffer) +static int mtk_hdmi_v2_hdmi_write_spd_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { + struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, SPD_EN_WR | SPD_EN); regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, SPD_RPT_EN); =20 @@ -194,10 +207,15 @@ static void mtk_hdmi_v2_hw_write_spd_infoframe(struct= mtk_hdmi *hdmi, const u8 * =20 regmap_set_bits(hdmi->regs, TOP_INFO_EN, SPD_EN_WR | SPD_EN); regmap_set_bits(hdmi->regs, TOP_INFO_RPT, SPD_RPT_EN); + + return 0; } =20 -static void mtk_hdmi_v2_hw_write_vendor_infoframe(struct mtk_hdmi *hdmi, c= onst u8 *buffer) +static int mtk_hdmi_v2_hdmi_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { + struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, VSIF_EN_WR | VSIF_EN); regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, VSIF_RPT_EN); =20 @@ -213,6 +231,8 @@ static void mtk_hdmi_v2_hw_write_vendor_infoframe(struc= t mtk_hdmi *hdmi, const u =20 regmap_set_bits(hdmi->regs, TOP_INFO_EN, VSIF_EN_WR | VSIF_EN); regmap_set_bits(hdmi->regs, TOP_INFO_RPT, VSIF_RPT_EN); + + return 0; } =20 static void mtk_hdmi_yuv420_downsampling(struct mtk_hdmi *hdmi, bool enabl= e) @@ -255,7 +275,7 @@ static int mtk_hdmi_v2_setup_audio_infoframe(struct mtk= _hdmi *hdmi) if (ret < 0) return ret; =20 - mtk_hdmi_v2_hw_write_audio_infoframe(hdmi, buffer); + mtk_hdmi_v2_hdmi_write_audio_infoframe(&hdmi->bridge, buffer, sizeof(buff= er)); =20 return 0; } @@ -1132,60 +1152,42 @@ static int mtk_hdmi_v2_hdmi_tmds_char_rate_valid(co= nst struct drm_bridge *bridge return MODE_OK; } =20 -static int mtk_hdmi_v2_hdmi_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int mtk_hdmi_v2_hdmi_clear_audio_infoframe(struct drm_bridge *bridg= e) { struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AUDIO: - regmap_clear_bits(hdmi->regs, TOP_INFO_EN, AUD_EN_WR | AUD_EN); - regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, AUD_RPT_EN); - break; - case HDMI_INFOFRAME_TYPE_AVI: - regmap_clear_bits(hdmi->regs, TOP_INFO_EN, AVI_EN_WR | AVI_EN); - regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, AVI_RPT_EN); - break; - case HDMI_INFOFRAME_TYPE_SPD: - regmap_clear_bits(hdmi->regs, TOP_INFO_EN, SPD_EN_WR | SPD_EN); - regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, SPD_RPT_EN); - break; - case HDMI_INFOFRAME_TYPE_VENDOR: - regmap_clear_bits(hdmi->regs, TOP_INFO_EN, VSIF_EN_WR | VSIF_EN); - regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, VSIF_RPT_EN); - break; - case HDMI_INFOFRAME_TYPE_DRM: - default: - break; - }; + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, AUD_EN_WR | AUD_EN); + regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, AUD_RPT_EN); =20 return 0; } =20 -static int mtk_hdmi_v2_hdmi_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int mtk_hdmi_v2_hdmi_clear_avi_infoframe(struct drm_bridge *bridge) { struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AUDIO: - mtk_hdmi_v2_hw_write_audio_infoframe(hdmi, buffer); - break; - case HDMI_INFOFRAME_TYPE_AVI: - mtk_hdmi_v2_hw_write_avi_infoframe(hdmi, buffer); - break; - case HDMI_INFOFRAME_TYPE_SPD: - mtk_hdmi_v2_hw_write_spd_infoframe(hdmi, buffer); - break; - case HDMI_INFOFRAME_TYPE_VENDOR: - mtk_hdmi_v2_hw_write_vendor_infoframe(hdmi, buffer); - break; - case HDMI_INFOFRAME_TYPE_DRM: - default: - dev_err(hdmi->dev, "Unsupported HDMI infoframe type %u\n", type); - break; - }; + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, AVI_EN_WR | AVI_EN); + regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, AVI_RPT_EN); + + return 0; +} + +static int mtk_hdmi_v2_hdmi_clear_spd_infoframe(struct drm_bridge *bridge) +{ + struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); + + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, SPD_EN_WR | SPD_EN); + regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, SPD_RPT_EN); + + return 0; +} + +static int mtk_hdmi_v2_hdmi_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + struct mtk_hdmi *hdmi =3D hdmi_ctx_from_bridge(bridge); + + regmap_clear_bits(hdmi->regs, TOP_INFO_EN, VSIF_EN_WR | VSIF_EN); + regmap_clear_bits(hdmi->regs, TOP_INFO_RPT, VSIF_RPT_EN); =20 return 0; } @@ -1329,8 +1331,14 @@ static const struct drm_bridge_funcs mtk_v2_hdmi_bri= dge_funcs =3D { .hpd_enable =3D mtk_hdmi_v2_hpd_enable, .hpd_disable =3D mtk_hdmi_v2_hpd_disable, .hdmi_tmds_char_rate_valid =3D mtk_hdmi_v2_hdmi_tmds_char_rate_valid, - .hdmi_clear_infoframe =3D mtk_hdmi_v2_hdmi_clear_infoframe, - .hdmi_write_infoframe =3D mtk_hdmi_v2_hdmi_write_infoframe, + .hdmi_clear_audio_infoframe =3D mtk_hdmi_v2_hdmi_clear_audio_infoframe, + .hdmi_write_audio_infoframe =3D mtk_hdmi_v2_hdmi_write_audio_infoframe, + .hdmi_clear_avi_infoframe =3D mtk_hdmi_v2_hdmi_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D mtk_hdmi_v2_hdmi_write_avi_infoframe, + .hdmi_clear_spd_infoframe =3D mtk_hdmi_v2_hdmi_clear_spd_infoframe, + .hdmi_write_spd_infoframe =3D mtk_hdmi_v2_hdmi_write_spd_infoframe, + .hdmi_clear_hdmi_infoframe =3D mtk_hdmi_v2_hdmi_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe =3D mtk_hdmi_v2_hdmi_write_hdmi_infoframe, .debugfs_init =3D mtk_hdmi_v2_debugfs_init, }; =20 diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index 46fd58646d32..98cd490e7ab0 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -54,9 +54,80 @@ static void power_off(struct drm_bridge *bridge) #define SPD_IFRAME_LINE_NUMBER 1 #define VENSPEC_IFRAME_LINE_NUMBER 3 =20 -static int msm_hdmi_config_avi_infoframe(struct hdmi *hdmi, - const u8 *buffer, size_t len) +static int msm_hdmi_bridge_clear_avi_infoframe(struct drm_bridge *bridge) { + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; + u32 val; + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); + val &=3D ~(HDMI_INFOFRAME_CTRL0_AVI_SEND | + HDMI_INFOFRAME_CTRL0_AVI_CONT); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &=3D ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + + return 0; +} + +static int msm_hdmi_bridge_clear_audio_infoframe(struct drm_bridge *bridge) +{ + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; + u32 val; + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); + val &=3D ~(HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE | + HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + val &=3D ~HDMI_INFOFRAME_CTRL1_AUDIO_INFO_LINE__MASK; + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + + return 0; +} + +static int msm_hdmi_bridge_clear_spd_infoframe(struct drm_bridge *bridge) +{ + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; + u32 val; + + val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val &=3D ~(HDMI_GEN_PKT_CTRL_GENERIC1_SEND | + HDMI_GEN_PKT_CTRL_GENERIC1_CONT | + HDMI_GEN_PKT_CTRL_GENERIC1_LINE__MASK); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + return 0; +} + +static int msm_hdmi_bridge_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; + u32 val; + + val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); + val &=3D ~(HDMI_GEN_PKT_CTRL_GENERIC0_SEND | + HDMI_GEN_PKT_CTRL_GENERIC0_CONT | + HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE | + HDMI_GEN_PKT_CTRL_GENERIC0_LINE__MASK); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + return 0; +} + +static int msm_hdmi_bridge_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; u32 buf[4] =3D {}; u32 val; int i; @@ -67,6 +138,8 @@ static int msm_hdmi_config_avi_infoframe(struct hdmi *hd= mi, return -EINVAL; } =20 + msm_hdmi_bridge_clear_avi_infoframe(bridge); + /* * the AVI_INFOx registers don't map exactly to how the AVI infoframes * are packed according to the spec. The checksum from the header is @@ -93,9 +166,11 @@ static int msm_hdmi_config_avi_infoframe(struct hdmi *h= dmi, return 0; } =20 -static int msm_hdmi_config_audio_infoframe(struct hdmi *hdmi, - const u8 *buffer, size_t len) +static int msm_hdmi_bridge_write_audio_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; u32 val; =20 if (len !=3D HDMI_INFOFRAME_SIZE(AUDIO)) { @@ -104,6 +179,8 @@ static int msm_hdmi_config_audio_infoframe(struct hdmi = *hdmi, return -EINVAL; } =20 + msm_hdmi_bridge_clear_audio_infoframe(bridge); + hdmi_write(hdmi, REG_HDMI_AUDIO_INFO0, buffer[3] | buffer[4] << 8 | @@ -126,9 +203,11 @@ static int msm_hdmi_config_audio_infoframe(struct hdmi= *hdmi, return 0; } =20 -static int msm_hdmi_config_spd_infoframe(struct hdmi *hdmi, - const u8 *buffer, size_t len) +static int msm_hdmi_bridge_write_spd_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; u32 buf[7] =3D {}; u32 val; int i; @@ -139,6 +218,8 @@ static int msm_hdmi_config_spd_infoframe(struct hdmi *h= dmi, return -EINVAL; } =20 + msm_hdmi_bridge_clear_spd_infoframe(bridge); + /* checksum gets written together with the body of the frame */ hdmi_write(hdmi, REG_HDMI_GENERIC1_HDR, buffer[0] | @@ -159,9 +240,11 @@ static int msm_hdmi_config_spd_infoframe(struct hdmi *= hdmi, return 0; } =20 -static int msm_hdmi_config_hdmi_infoframe(struct hdmi *hdmi, - const u8 *buffer, size_t len) +static int msm_hdmi_bridge_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { + struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); + struct hdmi *hdmi =3D hdmi_bridge->hdmi; u32 buf[7] =3D {}; u32 val; int i; @@ -173,6 +256,8 @@ static int msm_hdmi_config_hdmi_infoframe(struct hdmi *= hdmi, return -EINVAL; } =20 + msm_hdmi_bridge_clear_hdmi_infoframe(bridge); + /* checksum gets written together with the body of the frame */ hdmi_write(hdmi, REG_HDMI_GENERIC0_HDR, buffer[0] | @@ -194,90 +279,6 @@ static int msm_hdmi_config_hdmi_infoframe(struct hdmi = *hdmi, return 0; } =20 -static int msm_hdmi_bridge_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) -{ - struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); - struct hdmi *hdmi =3D hdmi_bridge->hdmi; - u32 val; - - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); - val &=3D ~(HDMI_INFOFRAME_CTRL0_AVI_SEND | - HDMI_INFOFRAME_CTRL0_AVI_CONT); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); - - val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); - val &=3D ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); - - break; - - case HDMI_INFOFRAME_TYPE_AUDIO: - val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); - val &=3D ~(HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND | - HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT | - HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE | - HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, val); - - val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); - val &=3D ~HDMI_INFOFRAME_CTRL1_AUDIO_INFO_LINE__MASK; - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); - - break; - - case HDMI_INFOFRAME_TYPE_SPD: - val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); - val &=3D ~(HDMI_GEN_PKT_CTRL_GENERIC1_SEND | - HDMI_GEN_PKT_CTRL_GENERIC1_CONT | - HDMI_GEN_PKT_CTRL_GENERIC1_LINE__MASK); - hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); - - break; - - case HDMI_INFOFRAME_TYPE_VENDOR: - val =3D hdmi_read(hdmi, REG_HDMI_GEN_PKT_CTRL); - val &=3D ~(HDMI_GEN_PKT_CTRL_GENERIC0_SEND | - HDMI_GEN_PKT_CTRL_GENERIC0_CONT | - HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE | - HDMI_GEN_PKT_CTRL_GENERIC0_LINE__MASK); - hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); - - break; - - default: - drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n",= type); - } - - return 0; -} - -static int msm_hdmi_bridge_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) -{ - struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); - struct hdmi *hdmi =3D hdmi_bridge->hdmi; - - msm_hdmi_bridge_clear_infoframe(bridge, type); - - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - return msm_hdmi_config_avi_infoframe(hdmi, buffer, len); - case HDMI_INFOFRAME_TYPE_AUDIO: - return msm_hdmi_config_audio_infoframe(hdmi, buffer, len); - case HDMI_INFOFRAME_TYPE_SPD: - return msm_hdmi_config_spd_infoframe(hdmi, buffer, len); - case HDMI_INFOFRAME_TYPE_VENDOR: - return msm_hdmi_config_hdmi_infoframe(hdmi, buffer, len); - default: - drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n",= type); - return 0; - } -} - static void msm_hdmi_set_timings(struct hdmi *hdmi, const struct drm_display_mode *mode); =20 @@ -462,8 +463,14 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_f= uncs =3D { .hpd_enable =3D msm_hdmi_hpd_enable, .hpd_disable =3D msm_hdmi_hpd_disable, .hdmi_tmds_char_rate_valid =3D msm_hdmi_bridge_tmds_char_rate_valid, - .hdmi_clear_infoframe =3D msm_hdmi_bridge_clear_infoframe, - .hdmi_write_infoframe =3D msm_hdmi_bridge_write_infoframe, + .hdmi_clear_audio_infoframe =3D msm_hdmi_bridge_clear_audio_infoframe, + .hdmi_write_audio_infoframe =3D msm_hdmi_bridge_write_audio_infoframe, + .hdmi_clear_avi_infoframe =3D msm_hdmi_bridge_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D msm_hdmi_bridge_write_avi_infoframe, + .hdmi_clear_spd_infoframe =3D msm_hdmi_bridge_clear_spd_infoframe, + .hdmi_write_spd_infoframe =3D msm_hdmi_bridge_write_spd_infoframe, + .hdmi_clear_hdmi_infoframe =3D msm_hdmi_bridge_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe =3D msm_hdmi_bridge_write_hdmi_infoframe, .hdmi_audio_prepare =3D msm_hdmi_bridge_audio_prepare, .hdmi_audio_shutdown =3D msm_hdmi_bridge_audio_shutdown, }; diff --git a/drivers/gpu/drm/rockchip/rk3066_hdmi.c b/drivers/gpu/drm/rockc= hip/rk3066_hdmi.c index 997429115068..9066ee2d1dff 100644 --- a/drivers/gpu/drm/rockchip/rk3066_hdmi.c +++ b/drivers/gpu/drm/rockchip/rk3066_hdmi.c @@ -158,35 +158,33 @@ static void rk3066_hdmi_set_power_mode(struct rk3066_= hdmi *hdmi, int mode) hdmi->tmdsclk =3D DEFAULT_PLLA_RATE; } =20 -static int rk3066_hdmi_bridge_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int rk3066_hdmi_bridge_clear_avi_infoframe(struct drm_bridge *bridg= e) { struct rk3066_hdmi *hdmi =3D bridge_to_rk3066_hdmi(bridge); =20 - if (type !=3D HDMI_INFOFRAME_TYPE_AVI) { - drm_err(bridge->dev, "Unsupported infoframe type: %u\n", type); - return 0; - } - hdmi_writeb(hdmi, HDMI_CP_BUF_INDEX, HDMI_INFOFRAME_AVI); =20 return 0; } =20 static int -rk3066_hdmi_bridge_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +rk3066_hdmi_bridge_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + /* FIXME: add support for this InfoFrame */ + + drm_warn_once(bridge->encoder->dev, "HDMI VSI not supported\n"); + + return 0; +} + +static int +rk3066_hdmi_bridge_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { struct rk3066_hdmi *hdmi =3D bridge_to_rk3066_hdmi(bridge); ssize_t i; =20 - if (type !=3D HDMI_INFOFRAME_TYPE_AVI) { - drm_err(bridge->dev, "Unsupported infoframe type: %u\n", type); - return 0; - } - - rk3066_hdmi_bridge_clear_infoframe(bridge, type); + rk3066_hdmi_bridge_clear_avi_infoframe(bridge); =20 for (i =3D 0; i < len; i++) hdmi_writeb(hdmi, HDMI_CP_BUF_ACC_HB0 + i * 4, buffer[i]); @@ -194,6 +192,17 @@ rk3066_hdmi_bridge_write_infoframe(struct drm_bridge *= bridge, return 0; } =20 +static int +rk3066_hdmi_bridge_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + rk3066_hdmi_bridge_clear_hdmi_infoframe(bridge); + + /* FIXME: add support for this InfoFrame */ + + return 0; +} + static int rk3066_hdmi_config_video_timing(struct rk3066_hdmi *hdmi, struct drm_display_mode *mode) { @@ -493,8 +502,10 @@ static const struct drm_bridge_funcs rk3066_hdmi_bridg= e_funcs =3D { .atomic_disable =3D rk3066_hdmi_bridge_atomic_disable, .detect =3D rk3066_hdmi_bridge_detect, .edid_read =3D rk3066_hdmi_bridge_edid_read, - .hdmi_clear_infoframe =3D rk3066_hdmi_bridge_clear_infoframe, - .hdmi_write_infoframe =3D rk3066_hdmi_bridge_write_infoframe, + .hdmi_clear_avi_infoframe =3D rk3066_hdmi_bridge_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D rk3066_hdmi_bridge_write_avi_infoframe, + .hdmi_clear_hdmi_infoframe =3D rk3066_hdmi_bridge_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe =3D rk3066_hdmi_bridge_write_hdmi_infoframe, .mode_valid =3D rk3066_hdmi_bridge_mode_valid, }; =20 diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index d2683846cc61..071e2f72fd0f 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -784,29 +784,113 @@ struct drm_bridge_funcs { unsigned long long tmds_rate); =20 /** - * @hdmi_clear_infoframe: + * @hdmi_clear_avi_infoframe: * * This callback clears the infoframes in the hardware during commit. - * It will be called multiple times, once for every disabled infoframe - * type. * * This callback is optional but it must be implemented by bridges that * set the DRM_BRIDGE_OP_HDMI flag in their &drm_bridge->ops. */ - int (*hdmi_clear_infoframe)(struct drm_bridge *bridge, - enum hdmi_infoframe_type type); + int (*hdmi_clear_avi_infoframe)(struct drm_bridge *bridge); + + /** + * @hdmi_write_avi_infoframe: + * + * Program the infoframe into the hardware. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI flag in their &drm_bridge->ops. + */ + int (*hdmi_write_avi_infoframe)(struct drm_bridge *bridge, + const u8 *buffer, size_t len); + + /** + * @hdmi_clear_hdmi_infoframe: + * + * This callback clears the infoframes in the hardware during commit. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI flag in their &drm_bridge->ops. + */ + int (*hdmi_clear_hdmi_infoframe)(struct drm_bridge *bridge); + /** - * @hdmi_write_infoframe: + * @hdmi_write_hdmi_infoframe: * - * Program the infoframe into the hardware. It will be called multiple - * times, once for every updated infoframe type. + * Program the infoframe into the hardware. * * This callback is optional but it must be implemented by bridges that * set the DRM_BRIDGE_OP_HDMI flag in their &drm_bridge->ops. */ - int (*hdmi_write_infoframe)(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len); + int (*hdmi_write_hdmi_infoframe)(struct drm_bridge *bridge, + const u8 *buffer, size_t len); + + /** + * @hdmi_clear_hdr_drm_infoframe: + * + * This callback clears the infoframes in the hardware during commit. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME flag in their + * &drm_bridge->ops. + */ + int (*hdmi_clear_hdr_drm_infoframe)(struct drm_bridge *bridge); + + /** + * @hdmi_write_hdr_drm_infoframe: + * + * Program the infoframe into the hardware. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME flag in their + * &drm_bridge->ops. + */ + int (*hdmi_write_hdr_drm_infoframe)(struct drm_bridge *bridge, + const u8 *buffer, size_t len); + + /** + * @hdmi_clear_spd_infoframe: + * + * This callback clears the infoframes in the hardware during commit. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME flag in their + * &drm_bridge->ops. + */ + int (*hdmi_clear_spd_infoframe)(struct drm_bridge *bridge); + + /** + * @hdmi_write_spd_infoframe: + * + * Program the infoframe into the hardware. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME flag in their + * &drm_bridge->ops. + */ + int (*hdmi_write_spd_infoframe)(struct drm_bridge *bridge, + const u8 *buffer, size_t len); + + /** + * @hdmi_clear_audio_infoframe: + * + * This callback clears the infoframes in the hardware during commit. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_AUDIO flag in their &drm_bridge->ops. + */ + int (*hdmi_clear_audio_infoframe)(struct drm_bridge *bridge); + + /** + * @hdmi_write_audio_infoframe: + * + * Program the infoframe into the hardware. + * + * This callback is optional but it must be implemented by bridges that + * set the DRM_BRIDGE_OP_HDMI_AUDIO flag in their &drm_bridge->ops. + */ + int (*hdmi_write_audio_infoframe)(struct drm_bridge *bridge, + const u8 *buffer, size_t len); =20 /** * @hdmi_audio_startup: @@ -1062,7 +1146,11 @@ enum drm_bridge_ops { /** * @DRM_BRIDGE_OP_HDMI: The bridge provides HDMI connector operations, * including infoframes support. Bridges that set this flag must - * implement the &drm_bridge_funcs->write_infoframe callback. + * provide HDMI-related information and implement the + * &drm_bridge_funcs->clear_avi_infoframe, + * &drm_bridge_funcs->write_avi_infoframe, + * &drm_bridge_funcs->clear_hdmi_infoframe and + * &drm_bridge_funcs->write_hdmi_infoframe callbacks. * * Note: currently there can be at most one bridge in a chain that sets * this bit. This is to simplify corresponding glue code in connector @@ -1074,6 +1162,9 @@ enum drm_bridge_ops { * Bridges that set this flag must implement the * &drm_bridge_funcs->hdmi_audio_prepare and * &drm_bridge_funcs->hdmi_audio_shutdown callbacks. + * If the bridge implements @DRM_BRIDGE_OP_HDMI, it also must implement + * &drm_bridge_funcs->hdmi_write_audio_infoframe and + * &drm_bridge_funcs->hdmi_cleaer_audio_infoframe callbacks. * * Note: currently there can be at most one bridge in a chain that sets * this bit. This is to simplify corresponding glue code in connector @@ -1105,6 +1196,18 @@ enum drm_bridge_ops { * to be present. */ DRM_BRIDGE_OP_HDMI_CEC_ADAPTER =3D BIT(8), + /** + * @DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME: The bridge supports + * &drm_bridge_funcs->hdmi_write_hdr_drm_infoframe and + * &drm_bridge_funcs->hdmi_clear_hdr_drm_infoframe callbacks. + */ + DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME =3D BIT(9), + /** + * @DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME: The bridge supports + * &drm_bridge_funcs->hdmi_write_spd_infoframe and + * &drm_bridge_funcs->hdmi_clear_spd_infoframe callbacks. + */ + DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME =3D BIT(10), }; =20 /** --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 3A81B12E1E9 for ; Wed, 24 Dec 2025 01:03:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538237; cv=none; b=Mf3jKChx19qFav8cyDigMGThJFi9zIxQ6KA0mbWZrBuMF7oqnQ4uwoHiskYIFXON1M/HR8NO0CQv4/8wwuZMoMprTF285nqjBll2T0vkHt99VbED8KIWT1xnysjSrApG3yotzgqgtfZIXherPIwvI+9oqr7ozW/u5qNRfzopg6U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538237; c=relaxed/simple; bh=e/gQf9q5+V+aZ5QL0NOVTe19dHH1IQ2nuBhXDgw+pv4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=NXrzQRj+gT8C561IEk/OfjTjNofzLuWhSQOgdlLegPb7PLvL006zUVRGj+2WdDJaJpPoYpGAYNCIUFUyodtKlUhnGQifuqkQ69tlKFWgZu+MwJvxsnxtIm6LTemiGR00l65+h9XyCLWMippd/757myf9bbTVRs/M6dpzckEk+H4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=T7PlQaF1; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Dn2xlkJk; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="T7PlQaF1"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Dn2xlkJk" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNGOEAe1018224 for ; Wed, 24 Dec 2025 01:03:53 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= h5H/J2/L1Alqc9sN3kBM8iI2ejxx+Xn5EAV6Vj/TX7M=; b=T7PlQaF18eLaTIhS W3SesQgRyt8Qn1dvta9ZXYuKDqe2e1AQdlRRHFagzO86q3EGB1Ei74d0l6g5GhK8 jbgBCXCizJUhPnOvxTnfpJbP9ys4XusJImAiIv+QL1LKVXRtnjS+XkxaHf8KTUG2 +Ii7q1pWMgKXwiomVKw2rrwn9Z/mdyYR0r/Vy/N4cg/lKyT8HviffpQfyApJBetm gyu9R+qIJ2s7wGdR9nYB2AQ2OEAPG8remN+9x+MEr1UpSCJ3jbsDFzJhHfhDSbU1 a192kXejJ9Bl62E07bz5pAttoy7sPGyqnsvD7PalSYToE1ZvwprBZWUXV6Vaygtd lZfbrQ== Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7xjs9ajm-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:52 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-4ee0c1c57bcso184913631cf.2 for ; Tue, 23 Dec 2025 17:03:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538232; x=1767143032; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=h5H/J2/L1Alqc9sN3kBM8iI2ejxx+Xn5EAV6Vj/TX7M=; b=Dn2xlkJkxRuQwkg0tzAEb609vSAzNIN/b9Sb19VQG4m9XZRBteQT5M7//TQdj3wzDl ++V2hKQv1JeQ8jc/y0KHLPNViECMUMpU6CqYjjX7APKZ2A5SbksjlfLqwHYE3uHRgRMq 1QaoFI0cIKc0XJ0QRmRaTmVaRfVyrFzVbo4ribzMYPUFnRpPIKb5lxE4ktom48Imw2WA 5D9NJ45o5IMM+Z1jQpdAJ39t4hl0pC2E39/c6uOLKb+QHuXp4iyE5KkfWfCsgEUYwitP oYb+7q6Z4wdquOT++Tb7Q2/cC1EU1XlYii/M4P9KsAvGXxV8IQHpT6XD1OClrOtDrKi1 JzLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538232; x=1767143032; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=h5H/J2/L1Alqc9sN3kBM8iI2ejxx+Xn5EAV6Vj/TX7M=; b=uAMoUi4zkmJVXHsZ97dRpliGNznOT+eVFXNdi4ejCNTgbcrbNA8h+Fgc2CyJG/yGsv 7MA6ztH1Cgrm+wI3F9n/lfLLT0IdAzx4XyrD+2vX1KQjq5CLNMI7ZqwV/QU+5HDj2qj2 CaVZKD9ath3pm7paAA1avCzSLJBIs98f9Cd6iyfu9t/43Kl8OGWK1ut0nVc8cNXvZt0i IoVcSJaiDgFzsFFNpc6cYNme5TDU5AbJYIYDHKeINpD5YpZ2XUOXMupVhGovcaQf5bGZ O9Fuq+X3tnSUAxnJLc0VfYYVbR6++ek/no4RJZk42I6rYZ5Uu++17oqzWtzCDp42RW8J CGoQ== X-Forwarded-Encrypted: i=1; AJvYcCXF50TpCnsD6QU4OJel7H7fTRxXZVCcv7oYvGHDghOIDGdINp5CYoPVv4KTMDFdFThV0V14Psd2S3axxsI=@vger.kernel.org X-Gm-Message-State: AOJu0YxZlFebPCpGqfkSFCleKJuz4+ahzVW+mo6+/uH3IFxJAAkVk86X T4/nR4xUJ0RTM8jN8DZzdF8XdfU+PPwDWZq9ugXEWqBGf4xiXDBCvnOVZZSu2WnP3qHHN+hYqB6 PTZXjjRlxfGnFjbLrgyGWhqEXJJDraiGVYvb3yhNjC6E8doe8oDMzC5FU1tRt3LQ+PhM= X-Gm-Gg: AY/fxX5Jjt/Aq/2e/EyWaITZO/4yHTKJD4upUdwYiTBJIRQ1QSGoYLl0hRQP5qbHMVV 7GANkvkjI31VANZJL0G2v9dSZj8lu6pvmKl8H1qQcg1w8TV0s6JKvArY6utlUv5EASmzFibLXXo rR2njxo99rZkKFaoTfy09GKSEs+irPD9DyoCdzFkgGHx3cnTaekwCWN6OS6EX8cNFpfPJfUMjWx 7jXP+1G2bZ/Tib/AfMkmIWqaQCbvHVyWBtH7xmRdMNwiSidw5icGBWSZrQI/QTPA4dkwvV+o6Rv usNzU0k33QRe6kXBYdUwDYOmVFyP0Azd81ocWBDQTtps9/TmZkXKiQ6m0wuAYyglwzZk1t2oCWa rtWPBfW7fq87AiviAB/Nicn3F0398oKS6OzyVS5mQd5IkdhgkJJL6oLuA/415gfjLwfANpdm4uY Z88TteQ8kmv+tTmkau4MlGTOg= X-Received: by 2002:a05:622a:1889:b0:4f1:ac9c:9388 with SMTP id d75a77b69052e-4f4abbc6fabmr256846551cf.0.1766538231973; Tue, 23 Dec 2025 17:03:51 -0800 (PST) X-Google-Smtp-Source: AGHT+IEChtLZDL3+cZho1A2Xkr0OH3eZZEfhDRLTcC5yNx32/7wwSUAWSE0QdcayVceg3AkXaGX/ig== X-Received: by 2002:a05:622a:1889:b0:4f1:ac9c:9388 with SMTP id d75a77b69052e-4f4abbc6fabmr256846081cf.0.1766538231402; Tue, 23 Dec 2025 17:03:51 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:49 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:55 +0200 Subject: [PATCH v3 06/10] drm/display: hdmi_state_helper: split InfoFrame functions per type 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: <20251224-limit-infoframes-2-v3-6-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=37993; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=e/gQf9q5+V+aZ5QL0NOVTe19dHH1IQ2nuBhXDgw+pv4=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvZxJMqVHiuVcE1k5S7VGLj2tNZ9k7z3lazs +XKfigYcgyJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72QAKCRCLPIo+Aiko 1dAdB/9pY+38ipzKpn8nn6vzLd9m9Vhc+U9v6zonnsIgr1Dhrc5M7QEJw1CM1ITTkEcjuU0J/KN cjWeQ648lzVPRK//ZqxBjfGVT0ib2GF2i/kZ/gf+ha4cjuOccXa+Uaucm24OdHePJbPC5aR5OmK bZWlAGv8vrMgRGfyO74tbVnuq/Gh3DCsr4MGO7BbDbTPQA8P+bG1P8xmY4EfnssMW4mfcj7VsDU 5GnC2oQMfqTRHpPF8F0TTV1k3ejt9q7S3HINqkUQP0aecst7yVABO3SL4nNKTKf7ldTfbFNYQyO JztLz/wMZ/tIgLMSP/QKARD4bV06k5+wUrK/tFzHvaFhml5r X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX8rKylld+BUu4 L/k0DLv8R+AOUyCAbc9WwIqunCbCxk0yffSL4GXroBeoj0VlHaXSzfY63loLoTjOVaLQJKGgW1Z gRSNbSzC6W5KiYc85BxoitEYIJFxZ5BCKzgjmEo0vSg9IWoncDNmGJ9LmQvsZJysclIszbMncjI yOlF0Yd3ohgz7SCRuds7S1l/KpJExB42UQB/aGtTkm98eGF3CG0d9/6ROyXsAAcnRJo1MBiqRfN lH1/9FMtoooui9tN0GoecaNCE5xX406KGQQAV9YXLml9l00z+1W9q+xAM104++r5KXFgWoxPLJz Ni62Ln4obgaWDFugjnXxZpj/DD5YCL5MV6+DtD/uQdkeAhi0RPIk0C5m9tdkoGdut9HIrzTLth2 EqFSaBX4FbYtjztH099LRej6youlWBYR6VEAe8/Y/ZTUESZrzJmdlKmZhqfNlYmCOvjKUE9Zoiy VILcGElcvma17L03/2A== X-Proofpoint-ORIG-GUID: yp_ozdb7NtWGhWBpwf7r0MR4QmyccgK1 X-Authority-Analysis: v=2.4 cv=YcqwJgRf c=1 sm=1 tr=0 ts=694b3bf8 cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=e4yJ5TXQa4jp-2S-TdcA:9 a=QEXdDO2ut3YA:10 a=uxP6HrT_eTzRwkO_Te1X:22 X-Proofpoint-GUID: yp_ozdb7NtWGhWBpwf7r0MR4QmyccgK1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 lowpriorityscore=0 adultscore=0 phishscore=0 clxscore=1015 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 Havign a single set of InfoFrame callbacks doesn't provide enough information to the DRM framework about the InfoFrame types that are actually supported. Also it's not really future-proof: it provides a way to program only a single Vendor-Specific frame, however we might need to support multiple VSIs at the same time (e.g. HDMI vs HDMI Forum VSIs). Provide separate sets of callbacks, one per the InfoFrame type. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/display/drm_bridge_connector.c | 206 ++++++++++++++++-= ---- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 86 ++++----- drivers/gpu/drm/drm_connector.c | 6 +- drivers/gpu/drm/rockchip/inno_hdmi.c | 47 +++-- drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c | 39 ++-- drivers/gpu/drm/tests/drm_connector_test.c | 14 +- drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 102 +++++----- drivers/gpu/drm/vc4/vc4_hdmi.c | 82 +++++++- include/drm/drm_connector.h | 105 ++++++++--- 9 files changed, 482 insertions(+), 205 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index 8fd7722fe9a3..c8858d48199c 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -401,8 +401,7 @@ drm_bridge_connector_tmds_char_rate_valid(const struct = drm_connector *connector, return MODE_OK; } =20 -static int drm_bridge_connector_clear_infoframe(struct drm_connector *conn= ector, - enum hdmi_infoframe_type type) +static int drm_bridge_connector_clear_avi_infoframe(struct drm_connector *= connector) { struct drm_bridge_connector *bridge_connector =3D to_drm_bridge_connector(connector); @@ -412,35 +411,70 @@ static int drm_bridge_connector_clear_infoframe(struc= t drm_connector *connector, if (!bridge) return -EINVAL; =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - /* required */ - return bridge->funcs->hdmi_clear_avi_infoframe(bridge); - case HDMI_INFOFRAME_TYPE_VENDOR: - /* required */ - return bridge->funcs->hdmi_clear_hdmi_infoframe(bridge); - case HDMI_INFOFRAME_TYPE_AUDIO: - if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) - return bridge->funcs->hdmi_clear_audio_infoframe(bridge); - break; - case HDMI_INFOFRAME_TYPE_DRM: - if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) - return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); - break; - case HDMI_INFOFRAME_TYPE_SPD: - if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) - return bridge->funcs->hdmi_clear_spd_infoframe(bridge); - break; - } + return bridge->funcs->hdmi_clear_avi_infoframe(bridge); +} + +static int drm_bridge_connector_write_avi_infoframe(struct drm_connector *= connector, + const u8 *buffer, size_t len) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + return bridge->funcs->hdmi_write_avi_infoframe(bridge, buffer, len); +} =20 - drm_dbg_driver(connector->dev, "Unsupported HDMI InfoFrame %x\n", type); +static int drm_bridge_connector_clear_hdmi_infoframe(struct drm_connector = *connector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + return bridge->funcs->hdmi_clear_hdmi_infoframe(bridge); +} + +static int drm_bridge_connector_write_hdmi_infoframe(struct drm_connector = *connector, + const u8 *buffer, size_t len) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + return bridge->funcs->hdmi_write_hdmi_infoframe(bridge, buffer, len); +} + +static int drm_bridge_connector_clear_audio_infoframe(struct drm_connector= *connector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) + return bridge->funcs->hdmi_clear_audio_infoframe(bridge); + + drm_dbg_driver(connector->dev, "Unsupported HDMI Audio InfoFrame\n"); =20 return 0; } =20 -static int drm_bridge_connector_write_infoframe(struct drm_connector *conn= ector, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int drm_bridge_connector_write_audio_infoframe(struct drm_connector= *connector, + const u8 *buffer, size_t len) { struct drm_bridge_connector *bridge_connector =3D to_drm_bridge_connector(connector); @@ -450,28 +484,84 @@ static int drm_bridge_connector_write_infoframe(struc= t drm_connector *connector, if (!bridge) return -EINVAL; =20 - switch (type) { - case HDMI_INFOFRAME_TYPE_AVI: - /* required */ - return bridge->funcs->hdmi_write_avi_infoframe(bridge, buffer, len); - case HDMI_INFOFRAME_TYPE_VENDOR: - /* required */ - return bridge->funcs->hdmi_write_hdmi_infoframe(bridge, buffer, len); - case HDMI_INFOFRAME_TYPE_AUDIO: - if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) - return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); - break; - case HDMI_INFOFRAME_TYPE_DRM: - if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) - return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); - break; - case HDMI_INFOFRAME_TYPE_SPD: - if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) - return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); - break; - } + if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) + return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); + + drm_dbg_driver(connector->dev, "Unsupported HDMI Audio InfoFrame\n"); + + return 0; +} + +static int drm_bridge_connector_clear_hdr_drm_infoframe(struct drm_connect= or *connector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) + return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); + + drm_dbg_driver(connector->dev, "Unsupported HDMI HDR DRM InfoFrame\n"); + + return 0; +} + +static int drm_bridge_connector_write_hdr_drm_infoframe(struct drm_connect= or *connector, + const u8 *buffer, size_t len) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) + return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); + + drm_dbg_driver(connector->dev, "Unsupported HDMI HDR DRM InfoFrame\n"); + + return 0; +} + +static int drm_bridge_connector_clear_spd_infoframe(struct drm_connector *= connector) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) + return bridge->funcs->hdmi_clear_spd_infoframe(bridge); + + drm_dbg_driver(connector->dev, "Unsupported HDMI SPD InfoFrame\n"); + + return 0; +} + +static int drm_bridge_connector_write_spd_infoframe(struct drm_connector *= connector, + const u8 *buffer, size_t len) +{ + struct drm_bridge_connector *bridge_connector =3D + to_drm_bridge_connector(connector); + struct drm_bridge *bridge; + + bridge =3D bridge_connector->bridge_hdmi; + if (!bridge) + return -EINVAL; + + if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) + return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); =20 - drm_dbg_driver(connector->dev, "Unsupported HDMI InfoFrame %x\n", type); + drm_dbg_driver(connector->dev, "Unsupported HDMI SPD InfoFrame\n"); =20 return 0; } @@ -492,9 +582,27 @@ drm_bridge_connector_read_edid(struct drm_connector *c= onnector) =20 static const struct drm_connector_hdmi_funcs drm_bridge_connector_hdmi_fun= cs =3D { .tmds_char_rate_valid =3D drm_bridge_connector_tmds_char_rate_valid, - .clear_infoframe =3D drm_bridge_connector_clear_infoframe, - .write_infoframe =3D drm_bridge_connector_write_infoframe, .read_edid =3D drm_bridge_connector_read_edid, + .avi =3D { + .clear_infoframe =3D drm_bridge_connector_clear_avi_infoframe, + .write_infoframe =3D drm_bridge_connector_write_avi_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D drm_bridge_connector_clear_hdmi_infoframe, + .write_infoframe =3D drm_bridge_connector_write_hdmi_infoframe, + }, + .audio =3D { + .clear_infoframe =3D drm_bridge_connector_clear_audio_infoframe, + .write_infoframe =3D drm_bridge_connector_write_audio_infoframe, + }, + .hdr_drm =3D { + .clear_infoframe =3D drm_bridge_connector_clear_hdr_drm_infoframe, + .write_infoframe =3D drm_bridge_connector_write_hdr_drm_infoframe, + }, + .spd =3D { + .clear_infoframe =3D drm_bridge_connector_clear_spd_infoframe, + .write_infoframe =3D drm_bridge_connector_write_spd_infoframe, + }, }; =20 static int drm_bridge_connector_audio_startup(struct drm_connector *connec= tor) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index a561f124be99..5a3817271d91 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -891,21 +891,21 @@ drm_hdmi_connector_mode_valid(struct drm_connector *c= onnector, } EXPORT_SYMBOL(drm_hdmi_connector_mode_valid); =20 -static int clear_device_infoframe(struct drm_connector *connector, - enum hdmi_infoframe_type type) +static int clear_infoframe(struct drm_connector *connector, + const struct drm_connector_infoframe_funcs *funcs, + const char *type) { - const struct drm_connector_hdmi_funcs *funcs =3D connector->hdmi.funcs; struct drm_device *dev =3D connector->dev; int ret; =20 - drm_dbg_kms(dev, "Clearing infoframe type 0x%x\n", type); + drm_dbg_kms(dev, "Clearing %s InfoFrame\n", type); =20 - if (!funcs || !funcs->clear_infoframe) { + if (!funcs->clear_infoframe) { drm_dbg_kms(dev, "Function not implemented, bailing.\n"); return 0; } =20 - ret =3D funcs->clear_infoframe(connector, type); + ret =3D funcs->clear_infoframe(connector); if (ret) { drm_dbg_kms(dev, "Call failed: %d\n", ret); return ret; @@ -914,39 +914,28 @@ static int clear_device_infoframe(struct drm_connecto= r *connector, return 0; } =20 -static int clear_infoframe(struct drm_connector *connector, - struct drm_connector_hdmi_infoframe *old_frame) -{ - int ret; - - ret =3D clear_device_infoframe(connector, old_frame->data.any.type); - if (ret) - return ret; - - return 0; -} - -static int write_device_infoframe(struct drm_connector *connector, - union hdmi_infoframe *frame) +static int write_infoframe(struct drm_connector *connector, + const struct drm_connector_infoframe_funcs *funcs, + const char *type, + struct drm_connector_hdmi_infoframe *new_frame) { - const struct drm_connector_hdmi_funcs *funcs =3D connector->hdmi.funcs; struct drm_device *dev =3D connector->dev; u8 buffer[HDMI_INFOFRAME_SIZE(MAX)]; int ret; int len; =20 - drm_dbg_kms(dev, "Writing infoframe type %x\n", frame->any.type); + drm_dbg_kms(dev, "Writing %s InfoFrame\n", type); =20 - if (!funcs || !funcs->write_infoframe) { + if (!funcs->write_infoframe) { drm_dbg_kms(dev, "Function not implemented, bailing.\n"); - return -EINVAL; + return 0; /* XXX: temporal until we stop generating unsupported frames */ } =20 - len =3D hdmi_infoframe_pack(frame, buffer, sizeof(buffer)); + len =3D hdmi_infoframe_pack(&new_frame->data, buffer, sizeof(buffer)); if (len < 0) return len; =20 - ret =3D funcs->write_infoframe(connector, frame->any.type, buffer, len); + ret =3D funcs->write_infoframe(connector, buffer, len); if (ret) { drm_dbg_kms(dev, "Call failed: %d\n", ret); return ret; @@ -955,27 +944,17 @@ static int write_device_infoframe(struct drm_connecto= r *connector, return 0; } =20 -static int write_infoframe(struct drm_connector *connector, - struct drm_connector_hdmi_infoframe *new_frame) -{ - int ret; - - ret =3D write_device_infoframe(connector, &new_frame->data); - if (ret) - return ret; - - return 0; -} - static int write_or_clear_infoframe(struct drm_connector *connector, + const struct drm_connector_infoframe_funcs *funcs, + const char *type, struct drm_connector_hdmi_infoframe *old_frame, struct drm_connector_hdmi_infoframe *new_frame) { if (new_frame->set) - return write_infoframe(connector, new_frame); + return write_infoframe(connector, funcs, type, new_frame); =20 if (old_frame->set && !new_frame->set) - return clear_infoframe(connector, old_frame); + return clear_infoframe(connector, funcs, type); =20 return 0; } @@ -995,6 +974,7 @@ static int write_or_clear_infoframe(struct drm_connecto= r *connector, int drm_atomic_helper_connector_hdmi_update_infoframes(struct drm_connecto= r *connector, struct drm_atomic_state *state) { + const struct drm_connector_hdmi_funcs *funcs =3D connector->hdmi.funcs; struct drm_connector_state *old_conn_state =3D drm_atomic_get_old_connector_state(state, connector); struct drm_connector_state *new_conn_state =3D @@ -1005,9 +985,15 @@ int drm_atomic_helper_connector_hdmi_update_infoframe= s(struct drm_connector *con if (!info->is_hdmi) return 0; =20 + if (!funcs) { + drm_dbg_kms(connector->dev, "Function not implemented, bailing.\n"); + return -EINVAL; + } + mutex_lock(&connector->hdmi.infoframes.lock); =20 ret =3D write_or_clear_infoframe(connector, + &funcs->avi, "AVI", &old_conn_state->hdmi.infoframes.avi, &new_conn_state->hdmi.infoframes.avi); if (ret) @@ -1015,18 +1001,21 @@ int drm_atomic_helper_connector_hdmi_update_infofra= mes(struct drm_connector *con =20 if (connector->hdmi.infoframes.audio.set) { ret =3D write_infoframe(connector, + &funcs->audio, "Audio", &connector->hdmi.infoframes.audio); if (ret) goto out; } =20 ret =3D write_or_clear_infoframe(connector, + &funcs->hdr_drm, "HDR DRM", &old_conn_state->hdmi.infoframes.hdr_drm, &new_conn_state->hdmi.infoframes.hdr_drm); if (ret) goto out; =20 ret =3D write_or_clear_infoframe(connector, + &funcs->spd, "SPD", &old_conn_state->hdmi.infoframes.spd, &new_conn_state->hdmi.infoframes.spd); if (ret) @@ -1034,6 +1023,7 @@ int drm_atomic_helper_connector_hdmi_update_infoframe= s(struct drm_connector *con =20 if (info->has_hdmi_infoframe) { ret =3D write_or_clear_infoframe(connector, + &funcs->hdmi, "HDMI-VS", &old_conn_state->hdmi.infoframes.hdmi, &new_conn_state->hdmi.infoframes.hdmi); if (ret) @@ -1062,6 +1052,7 @@ int drm_atomic_helper_connector_hdmi_update_audio_infoframe(struct drm_connect= or *connector, struct hdmi_audio_infoframe *frame) { + const struct drm_connector_hdmi_funcs *funcs =3D connector->hdmi.funcs; struct drm_connector_hdmi_infoframe *infoframe =3D &connector->hdmi.infoframes.audio; struct drm_display_info *info =3D &connector->display_info; @@ -1070,12 +1061,17 @@ drm_atomic_helper_connector_hdmi_update_audio_infof= rame(struct drm_connector *co if (!info->is_hdmi) return 0; =20 + if (!funcs) { + drm_dbg_kms(connector->dev, "Function not implemented, bailing.\n"); + return -EINVAL; + } + mutex_lock(&connector->hdmi.infoframes.lock); =20 memcpy(&infoframe->data, frame, sizeof(infoframe->data)); infoframe->set =3D true; =20 - ret =3D write_infoframe(connector, infoframe); + ret =3D write_infoframe(connector, &funcs->audio, "Audio", infoframe); =20 mutex_unlock(&connector->hdmi.infoframes.lock); =20 @@ -1097,6 +1093,7 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_update= _audio_infoframe); int drm_atomic_helper_connector_hdmi_clear_audio_infoframe(struct drm_connecto= r *connector) { + const struct drm_connector_hdmi_funcs *funcs =3D connector->hdmi.funcs; struct drm_connector_hdmi_infoframe *infoframe =3D &connector->hdmi.infoframes.audio; struct drm_display_info *info =3D &connector->display_info; @@ -1105,11 +1102,16 @@ drm_atomic_helper_connector_hdmi_clear_audio_infofr= ame(struct drm_connector *con if (!info->is_hdmi) return 0; =20 + if (!funcs) { + drm_dbg_kms(connector->dev, "Function not implemented, bailing.\n"); + return -EINVAL; + } + mutex_lock(&connector->hdmi.infoframes.lock); =20 infoframe->set =3D false; =20 - ret =3D clear_infoframe(connector, infoframe); + ret =3D clear_infoframe(connector, &funcs->audio, "Audio"); =20 memset(&infoframe->data, 0, sizeof(infoframe->data)); =20 diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connecto= r.c index 40e025712c9b..4f5b27fab475 100644 --- a/drivers/gpu/drm/drm_connector.c +++ b/drivers/gpu/drm/drm_connector.c @@ -600,8 +600,10 @@ int drmm_connector_hdmi_init(struct drm_device *dev, if (!(max_bpc =3D=3D 8 || max_bpc =3D=3D 10 || max_bpc =3D=3D 12)) return -EINVAL; =20 - if (!hdmi_funcs->clear_infoframe || - !hdmi_funcs->write_infoframe) + if (!hdmi_funcs->avi.clear_infoframe || + !hdmi_funcs->avi.write_infoframe || + !hdmi_funcs->hdmi.clear_infoframe || + !hdmi_funcs->hdmi.write_infoframe) return -EINVAL; =20 ret =3D drmm_connector_init(dev, connector, funcs, connector_type, ddc); diff --git a/drivers/gpu/drm/rockchip/inno_hdmi.c b/drivers/gpu/drm/rockchi= p/inno_hdmi.c index 9f7a8cf0ab44..1575f05bb4af 100644 --- a/drivers/gpu/drm/rockchip/inno_hdmi.c +++ b/drivers/gpu/drm/rockchip/inno_hdmi.c @@ -637,36 +637,22 @@ static void inno_hdmi_init_hw(struct inno_hdmi *hdmi) hdmi_modb(hdmi, HDMI_STATUS, m_MASK_INT_HOTPLUG, v_MASK_INT_HOTPLUG(1)); } =20 -static int inno_hdmi_disable_frame(struct drm_connector *connector, - enum hdmi_infoframe_type type) +static int inno_hdmi_clear_avi_infoframe(struct drm_connector *connector) { struct inno_hdmi *hdmi =3D connector_to_inno_hdmi(connector); =20 - if (type !=3D HDMI_INFOFRAME_TYPE_AVI) { - drm_err(connector->dev, - "Unsupported infoframe type: %u\n", type); - return 0; - } - hdmi_writeb(hdmi, HDMI_CONTROL_PACKET_BUF_INDEX, INFOFRAME_AVI); =20 return 0; } =20 -static int inno_hdmi_upload_frame(struct drm_connector *connector, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int inno_hdmi_write_avi_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) { struct inno_hdmi *hdmi =3D connector_to_inno_hdmi(connector); ssize_t i; =20 - if (type !=3D HDMI_INFOFRAME_TYPE_AVI) { - drm_err(connector->dev, - "Unsupported infoframe type: %u\n", type); - return 0; - } - - inno_hdmi_disable_frame(connector, type); + inno_hdmi_clear_avi_infoframe(connector); =20 for (i =3D 0; i < len; i++) hdmi_writeb(hdmi, HDMI_CONTROL_PACKET_ADDR + i, buffer[i]); @@ -674,9 +660,30 @@ static int inno_hdmi_upload_frame(struct drm_connector= *connector, return 0; } =20 +static int inno_hdmi_clear_hdmi_infoframe(struct drm_connector *connector) +{ + drm_warn_once(connector->dev, "HDMI VSI not implemented\n"); + + return 0; +} + +static int inno_hdmi_write_hdmi_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) +{ + drm_warn_once(connector->dev, "HDMI VSI not implemented\n"); + + return 0; +} + static const struct drm_connector_hdmi_funcs inno_hdmi_hdmi_connector_func= s =3D { - .clear_infoframe =3D inno_hdmi_disable_frame, - .write_infoframe =3D inno_hdmi_upload_frame, + .avi =3D { + .clear_infoframe =3D inno_hdmi_clear_avi_infoframe, + .write_infoframe =3D inno_hdmi_write_avi_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D inno_hdmi_clear_hdmi_infoframe, + .write_infoframe =3D inno_hdmi_write_hdmi_infoframe, + }, }; =20 static int inno_hdmi_config_video_csc(struct inno_hdmi *hdmi) diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i= /sun4i_hdmi_enc.c index 6263ee15880a..a50f260c73e4 100644 --- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c +++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c @@ -40,27 +40,19 @@ #define drm_connector_to_sun4i_hdmi(c) \ container_of_const(c, struct sun4i_hdmi, connector) =20 -static int sun4i_hdmi_clear_infoframe(struct drm_connector *connector, - enum hdmi_infoframe_type type) +static int sun4i_hdmi_clear_avi_infoframe(struct drm_connector *connector) { drm_warn_once(connector->dev, "clearing of AVI infoframe is not implement= ed\n"); =20 return 0; } =20 -static int sun4i_hdmi_write_infoframe(struct drm_connector *connector, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int sun4i_hdmi_write_avi_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) { struct sun4i_hdmi *hdmi =3D drm_connector_to_sun4i_hdmi(connector); int i; =20 - if (type !=3D HDMI_INFOFRAME_TYPE_AVI) { - drm_err(connector->dev, - "Unsupported infoframe type: %u\n", type); - return 0; - } - for (i =3D 0; i < len; i++) writeb(buffer[i], hdmi->base + SUN4I_HDMI_AVI_INFOFRAME_REG(i)); =20 @@ -68,6 +60,21 @@ static int sun4i_hdmi_write_infoframe(struct drm_connect= or *connector, =20 } =20 +static int sun4i_hdmi_clear_hdmi_infoframe(struct drm_connector *connector) +{ + drm_warn_once(connector->dev, "HDMI VSI not implemented\n"); + + return 0; +} + +static int sun4i_hdmi_write_hdmi_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) +{ + drm_warn_once(connector->dev, "HDMI VSI not implemented\n"); + + return 0; +} + static void sun4i_hdmi_disable(struct drm_encoder *encoder, struct drm_atomic_state *state) { @@ -244,8 +251,14 @@ static struct i2c_adapter *sun4i_hdmi_get_ddc(struct d= evice *dev) =20 static const struct drm_connector_hdmi_funcs sun4i_hdmi_hdmi_connector_fun= cs =3D { .tmds_char_rate_valid =3D sun4i_hdmi_connector_clock_valid, - .clear_infoframe =3D sun4i_hdmi_clear_infoframe, - .write_infoframe =3D sun4i_hdmi_write_infoframe, + .avi =3D { + .clear_infoframe =3D sun4i_hdmi_clear_avi_infoframe, + .write_infoframe =3D sun4i_hdmi_write_avi_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D sun4i_hdmi_clear_hdmi_infoframe, + .write_infoframe =3D sun4i_hdmi_write_hdmi_infoframe, + }, }; =20 static const struct drm_connector_helper_funcs sun4i_hdmi_connector_helper= _funcs =3D { diff --git a/drivers/gpu/drm/tests/drm_connector_test.c b/drivers/gpu/drm/t= ests/drm_connector_test.c index f356ea695ae7..86860ad0861c 100644 --- a/drivers/gpu/drm/tests/drm_connector_test.c +++ b/drivers/gpu/drm/tests/drm_connector_test.c @@ -25,22 +25,26 @@ struct drm_connector_init_priv { struct i2c_adapter ddc; }; =20 -static int accept_infoframe_clear_infoframe(struct drm_connector *connecto= r, - enum hdmi_infoframe_type type) +static int accept_infoframe_clear_infoframe(struct drm_connector *connecto= r) { return 0; } =20 static int accept_infoframe_write_infoframe(struct drm_connector *connecto= r, - enum hdmi_infoframe_type type, const u8 *buffer, size_t len) { return 0; } =20 static const struct drm_connector_hdmi_funcs dummy_hdmi_funcs =3D { - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D accept_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, }; =20 static const struct drm_connector_funcs dummy_funcs =3D { diff --git a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c b/drivers/g= pu/drm/tests/drm_hdmi_state_helper_test.c index 915dcd106703..7e4e986bdfd6 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -76,22 +76,26 @@ static int set_connector_edid(struct kunit *test, struc= t drm_connector *connecto return ret; } =20 -static int accept_infoframe_clear_infoframe(struct drm_connector *connecto= r, - enum hdmi_infoframe_type type) +static int accept_infoframe_clear_infoframe(struct drm_connector *connecto= r) { return 0; } =20 static int accept_infoframe_write_infoframe(struct drm_connector *connecto= r, - enum hdmi_infoframe_type type, const u8 *buffer, size_t len) { return 0; } =20 static const struct drm_connector_hdmi_funcs dummy_connector_hdmi_funcs = =3D { - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D accept_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, }; =20 static enum drm_mode_status @@ -104,8 +108,14 @@ reject_connector_tmds_char_rate_valid(const struct drm= _connector *connector, =20 static const struct drm_connector_hdmi_funcs reject_connector_hdmi_funcs = =3D { .tmds_char_rate_valid =3D reject_connector_tmds_char_rate_valid, - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D accept_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, }; =20 static enum drm_mode_status @@ -118,8 +128,14 @@ reject_100mhz_connector_tmds_char_rate_valid(const str= uct drm_connector *connect =20 static const struct drm_connector_hdmi_funcs reject_100mhz_connector_hdmi_= funcs =3D { .tmds_char_rate_valid =3D reject_100mhz_connector_tmds_char_rate_valid, - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D accept_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, }; =20 static int dummy_connector_get_modes(struct drm_connector *connector) @@ -2427,19 +2443,21 @@ static void drm_test_check_infoframes(struct kunit = *test) drm_modeset_acquire_fini(&ctx); } =20 -static int reject_avi_infoframe_write_infoframe(struct drm_connector *conn= ector, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int reject_infoframe_write_infoframe(struct drm_connector *connecto= r, + const u8 *buffer, size_t len) { - if (type =3D=3D HDMI_INFOFRAME_TYPE_AVI) - return -EOPNOTSUPP; - - return 0; + return -EOPNOTSUPP; } =20 static const struct drm_connector_hdmi_funcs reject_avi_infoframe_hdmi_fun= cs =3D { - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D reject_avi_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D reject_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, }; =20 /* @@ -2509,19 +2527,19 @@ static void drm_test_check_reject_avi_infoframe(str= uct kunit *test) drm_modeset_acquire_fini(&ctx); } =20 -static int reject_hdr_infoframe_write_infoframe(struct drm_connector *conn= ector, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) -{ - if (type =3D=3D HDMI_INFOFRAME_TYPE_DRM) - return -EOPNOTSUPP; - - return 0; -} - static const struct drm_connector_hdmi_funcs reject_hdr_infoframe_hdmi_fun= cs =3D { - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D reject_hdr_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdr_drm =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D reject_infoframe_write_infoframe, + }, }; =20 /* @@ -2695,19 +2713,19 @@ static void drm_test_check_reject_hdr_infoframe_bpc= _10(struct kunit *test) drm_modeset_acquire_fini(&ctx); } =20 -static int reject_audio_infoframe_write_infoframe(struct drm_connector *co= nnector, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) -{ - if (type =3D=3D HDMI_INFOFRAME_TYPE_AUDIO) - return -EOPNOTSUPP; - - return 0; -} - static const struct drm_connector_hdmi_funcs reject_audio_infoframe_hdmi_f= uncs =3D { - .clear_infoframe =3D accept_infoframe_clear_infoframe, - .write_infoframe =3D reject_audio_infoframe_write_infoframe, + .avi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D accept_infoframe_write_infoframe, + }, + .audio =3D { + .clear_infoframe =3D accept_infoframe_clear_infoframe, + .write_infoframe =3D reject_infoframe_write_infoframe, + }, }; =20 /* diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c index 4cfb7ebc0c81..9fe605a42df7 100644 --- a/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c @@ -727,6 +727,66 @@ static int vc4_hdmi_write_infoframe(struct drm_connect= or *connector, return ret; } =20 +static int vc4_hdmi_clear_avi_infoframe(struct drm_connector *connector) +{ + return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_AVI); +} + +static int vc4_hdmi_clear_hdmi_infoframe(struct drm_connector *connector) +{ + return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_VENDOR); +} + +static int vc4_hdmi_clear_audio_infoframe(struct drm_connector *connector) +{ + return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_AUDIO); +} + +static int vc4_hdmi_clear_hdr_drm_infoframe(struct drm_connector *connecto= r) +{ + return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_DRM); +} + +static int vc4_hdmi_clear_spd_infoframe(struct drm_connector *connector) +{ + return vc4_hdmi_clear_infoframe(connector, HDMI_INFOFRAME_TYPE_SPD); +} + +static int vc4_hdmi_write_avi_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) +{ + return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_AVI, + buffer, len); +} + +static int vc4_hdmi_write_hdmi_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) +{ + return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_VENDOR, + buffer, len); +} + +static int vc4_hdmi_write_audio_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) +{ + return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_AUDIO, + buffer, len); +} + +static int vc4_hdmi_write_hdr_drm_infoframe(struct drm_connector *connecto= r, + const u8 *buffer, size_t len) +{ + return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_DRM, + buffer, len); +} + +static int vc4_hdmi_write_spd_infoframe(struct drm_connector *connector, + const u8 *buffer, size_t len) +{ + return vc4_hdmi_write_infoframe(connector, HDMI_INFOFRAME_TYPE_SPD, + buffer, len); +} + #define SCRAMBLING_POLLING_DELAY_MS 1000 =20 static void vc4_hdmi_enable_scrambling(struct drm_encoder *encoder) @@ -1684,8 +1744,26 @@ vc4_hdmi_connector_clock_valid(const struct drm_conn= ector *connector, =20 static const struct drm_connector_hdmi_funcs vc4_hdmi_hdmi_connector_funcs= =3D { .tmds_char_rate_valid =3D vc4_hdmi_connector_clock_valid, - .clear_infoframe =3D vc4_hdmi_clear_infoframe, - .write_infoframe =3D vc4_hdmi_write_infoframe, + .avi =3D { + .clear_infoframe =3D vc4_hdmi_clear_avi_infoframe, + .write_infoframe =3D vc4_hdmi_write_avi_infoframe, + }, + .hdmi =3D { + .clear_infoframe =3D vc4_hdmi_clear_hdmi_infoframe, + .write_infoframe =3D vc4_hdmi_write_hdmi_infoframe, + }, + .audio =3D { + .clear_infoframe =3D vc4_hdmi_clear_audio_infoframe, + .write_infoframe =3D vc4_hdmi_write_audio_infoframe, + }, + .hdr_drm =3D { + .clear_infoframe =3D vc4_hdmi_clear_hdr_drm_infoframe, + .write_infoframe =3D vc4_hdmi_write_hdr_drm_infoframe, + }, + .spd =3D { + .clear_infoframe =3D vc4_hdmi_clear_spd_infoframe, + .write_infoframe =3D vc4_hdmi_write_spd_infoframe, + }, }; =20 #define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h index 4543833acdec..7eaec37ae1c7 100644 --- a/include/drm/drm_connector.h +++ b/include/drm/drm_connector.h @@ -1222,44 +1222,24 @@ struct drm_connector_cec_funcs { }; =20 /** - * struct drm_connector_hdmi_funcs - drm_hdmi_connector control functions + * struct drm_connector_infoframe_funcs - InfoFrame-related functions */ -struct drm_connector_hdmi_funcs { - /** - * @tmds_char_rate_valid: - * - * This callback is invoked at atomic_check time to figure out - * whether a particular TMDS character rate is supported by the - * driver. - * - * The @tmds_char_rate_valid callback is optional. - * - * Returns: - * - * Either &drm_mode_status.MODE_OK or one of the failure reasons - * in &enum drm_mode_status. - */ - enum drm_mode_status - (*tmds_char_rate_valid)(const struct drm_connector *connector, - const struct drm_display_mode *mode, - unsigned long long tmds_rate); - +struct drm_connector_infoframe_funcs { /** * @clear_infoframe: * * This callback is invoked through * @drm_atomic_helper_connector_hdmi_update_infoframes during a * commit to clear the infoframes into the hardware. It will be - * called multiple times, once for every disabled infoframe - * type. + * called once for each frame type to be disabled. * - * The @clear_infoframe callback is mandatory. + * The @clear_infoframe callback is mandatory for AVI and HDMI-VS + * InfoFrame types. * * Returns: * 0 on success, a negative error code otherwise */ - int (*clear_infoframe)(struct drm_connector *connector, - enum hdmi_infoframe_type type); + int (*clear_infoframe)(struct drm_connector *connector); =20 /** * @write_infoframe: @@ -1267,18 +1247,42 @@ struct drm_connector_hdmi_funcs { * This callback is invoked through * @drm_atomic_helper_connector_hdmi_update_infoframes during a * commit to program the infoframes into the hardware. It will - * be called multiple times, once for every updated infoframe - * type. + * be called for every updated infoframe type. * - * The @write_infoframe callback is mandatory. + * The @write_infoframe callback is mandatory for AVI and HDMI-VS + * InfoFrame types. * * Returns: * 0 on success, a negative error code otherwise */ int (*write_infoframe)(struct drm_connector *connector, - enum hdmi_infoframe_type type, const u8 *buffer, size_t len); =20 +}; + +/** + * struct drm_connector_hdmi_funcs - drm_hdmi_connector control functions + */ +struct drm_connector_hdmi_funcs { + /** + * @tmds_char_rate_valid: + * + * This callback is invoked at atomic_check time to figure out + * whether a particular TMDS character rate is supported by the + * driver. + * + * The @tmds_char_rate_valid callback is optional. + * + * Returns: + * + * Either &drm_mode_status.MODE_OK or one of the failure reasons + * in &enum drm_mode_status. + */ + enum drm_mode_status + (*tmds_char_rate_valid)(const struct drm_connector *connector, + const struct drm_display_mode *mode, + unsigned long long tmds_rate); + /** * @read_edid: * @@ -1293,6 +1297,47 @@ struct drm_connector_hdmi_funcs { * Valid EDID on success, NULL in case of failure. */ const struct drm_edid *(*read_edid)(struct drm_connector *connector); + + /** + * @avi: + * + * Set of callbacks for handling the AVI InfoFrame. These callbacks are + * mandatory. + */ + struct drm_connector_infoframe_funcs avi; + + /** + * @hdmi: + * + * Set of callbacks for handling the HDMI Vendor-Specific InfoFrame. + * These callbacks are mandatory. + */ + struct drm_connector_infoframe_funcs hdmi; + + /** + * @audio: + * + * Set of callbacks for handling the Audio InfoFrame. These callbacks + * are optional, but they are required for drivers which use + * drm_atomic_helper_connector_hdmi_update_audio_infoframe(). + */ + struct drm_connector_infoframe_funcs audio; + + /** + * @hdr_drm: + * + * Set of callbacks for handling the HDR DRM InfoFrame. These callbacks + * are mandatory if HDR output is to be supported. + */ + struct drm_connector_infoframe_funcs hdr_drm; + + /** + * @spd: + * + * Set of callbacks for handling the SPD InfoFrame. These callbacks are + * optional. + */ + struct drm_connector_infoframe_funcs spd; }; =20 /** --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 77D9926B2D3 for ; Wed, 24 Dec 2025 01:03:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538239; cv=none; b=Kl2JAOZz9y7XfRmkWVhwPiiZdJUHlRvoLDRRTHF0zxx5+EinL3iWDJzcRRSXPzItUnTw/xyvMr37sussxoo3i5h2IQeypwiZMTch8s8RBwISoy5BENeHAqBK+J3j/J6dtp7vB4Dy1vj7vCtpMvcLLshYwDHG1DUYlHCo2Pz+sww= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538239; c=relaxed/simple; bh=oV58YVZ6PqGUocr9XjdKTVXla4jnp1WcJhUj/fGMzJo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=LsGZZ00RTIHUOcN3bzT4Non2pz4fj2RHhhHLC9br4jzeL/GXLdABZ9eK2si+eyIIUsgRdax/ooc13mqYAgvlTjhOvYc5VM2BRVRZILjLr2BojGx1A2wlw08s8AMnlG/+vLCfO+nFkAXSyD2+YcEjECbSccMmDSGqFv/o6Tb4BFk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=XfH2Ljc+; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=BtlF54sS; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="XfH2Ljc+"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="BtlF54sS" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNLQ26i700995 for ; Wed, 24 Dec 2025 01:03:56 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ecVHGdcKUGcf1BVa43vSmPZjJ3ubI7MYeuQBBNyE8CA=; b=XfH2Ljc+dZzYTrzi pD5ysYGQfEwkhPa6D1pi8C2qbcfBhGuJdEE5Tm7axPuo9cDSGursj22LOxEqHeP5 R9uBpaJ+4/sOsdjt2aULzxdHjQc0CHLodncP7N+ebgW+QzIgym8Fu/RIkEVIq0Jj jRDxvdSZXrLN5ge3caHHbALSV00mhM5U92CRhkAtigwUmz2f0w29lkiq9FqPE05j iEFxVpGxxc9A96yD8kdKzBFG2/urw5k637d0CrkxbijK0WRFw1tIvf767zHurFAJ 1U1WFXX9uBnoE3GI5zyeTch4vmOF0P//3srIopPnVaZrtxW8W5okZ4R2ipkZ+bcV //Fs7g== Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7t7jt5rf-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:03:56 +0000 (GMT) Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-88a34f64f5eso171461776d6.1 for ; Tue, 23 Dec 2025 17:03:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538236; x=1767143036; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ecVHGdcKUGcf1BVa43vSmPZjJ3ubI7MYeuQBBNyE8CA=; b=BtlF54sShRMKu8txULfPk1wdGfnouKd/vlQeTam5tl+HEGP/CfIDNz3oIFA+21r7YR 23vEHyNKiyY75UFLJ/4bFNeE7ooNRuyvU93QyuPvcFkM8NMxfdrTTYR2afrpftXOijwu b5xccMQiRpIm/JvHaIGH+5nH3ok17lJeB9dYMjxkpXZcwW9EVUIA9C3VO2z/mjSiZFvU uRv6LmMDC123snjYAAlCunkq/rBg8+NRnQBSjy7g4J3mm/sWHHneLbzgTWZOogJ43fND G7zEhsIV6x0Hi1KnTRZb6RQBwZl5JCHgPOBmXWM+EMT9LKKod07h1l4wjwuPCWCAus1y N62w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538236; x=1767143036; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=ecVHGdcKUGcf1BVa43vSmPZjJ3ubI7MYeuQBBNyE8CA=; b=ChC/AB24LXveG7xbwkPzONPhSM6PMnmsbaXhD0xRhYpoD6bwbFgeN6whmtvh2UQI2o AM+HWicljh9Hd6Peum4Qd/I6KZsV/lOrx2WdXxjcube8nWOHf5x2RD9X9CsWv3vOAI1s GTlhQ9hxpDFbXTf+1064clUK8uVJkg/PZ/DAaOktxE5x3ohn4caW3+fBFeTuVlG6ur7F IPST1WoZJwqP/ENgYtSusAKRi45PUGWY7Aj9QqBs5lJ55AHYPc19IsRzSfd3Ux1ryjL7 KXBY/1gmBnhOGYsNJd6GjZNuOhyfe7F0p8ORzG8l8/VG95aXM4B7f5j2Fp9HQOWLpMjD jkSA== X-Forwarded-Encrypted: i=1; AJvYcCXRmxhRt+zWEo5PteKynhXqVap9ULH43AMuICUKZBppQGz/cO/e7lnnxK+HvlUOb8lGbbSxR0wpJZcpCH0=@vger.kernel.org X-Gm-Message-State: AOJu0YwWZuiIHYVxiK1cwXd8CptZXi60z9hCky68dkk55aZaMdcpuE4Q bu2K0yDJC0C7DEJkNBDtySbrLxjtAl8R31qhcxzMw2AhL+yCmRUG+ehi3S11Nm6VaKalaHkiaQ+ c6V8fp7fGUDyW/oxW52NR7qj7gIzvv7oJwirUdidU9rDohoqH7K7M125klbuV48eGbXw= X-Gm-Gg: AY/fxX7Jn2HOWFEybnrNiRsgLOAis+femWMttlEeEFTPtxh62E6EBw9wJWUlaWk2eG9 zkeXtQ+Haaro4ftTSiK40jks06Xws7MN9Yqy3SAsoTu9S3lG5V8IUraDLhpA1NYXILPGukKoolB tRUluhE3zf6mJHVS7um0H5QqLJZnnQKR0WYpe0wH4oMUuUW55DxDY+/QN8N//wPfvBPEYHO1Mmu LwrS0e+M89OoD5ODpptncuur6eHX6gcapuJnJJhmABX3k3QY/K8ddeiKf3ChcEH/BLzXQP1RQ1D BuoA5RyGXFqQbqSnVMVCEDI/La5VtX/BDnVgz1lA/qOjT0N65pifZfkwJXjJodjA+FsHTJsEAye NiKn9h5VXIXrr1q4UTKdjj5Yynd3jMyc8k/ZqQ/RlAm9STukcTPpFs0xuRd8X7hoLA+XYVJsGWa OjzzxWhCs0bxlz+1y2Xr/plYY= X-Received: by 2002:a05:6214:4686:b0:880:4cfb:ab57 with SMTP id 6a1803df08f44-88d83c64e72mr214392526d6.25.1766538235592; Tue, 23 Dec 2025 17:03:55 -0800 (PST) X-Google-Smtp-Source: AGHT+IHaK542l9xmzYYsxqdNmih3a3J+cADi7DGuEWQ94lgYPMK9IxHSj3e3msfodcDCfxK5YjzPVA== X-Received: by 2002:a05:6214:4686:b0:880:4cfb:ab57 with SMTP id 6a1803df08f44-88d83c64e72mr214392216d6.25.1766538235179; Tue, 23 Dec 2025 17:03:55 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:53 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:56 +0200 Subject: [PATCH v3 07/10] drm/display: hdmi_state_helper: reject Audio IF updates if it's not supported 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: <20251224-limit-infoframes-2-v3-7-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1357; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=oV58YVZ6PqGUocr9XjdKTVXla4jnp1WcJhUj/fGMzJo=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvZGVPsohAMKCXOdz12kIPkrJMlkOnHo6hb3 HWobYyhg7WJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72QAKCRCLPIo+Aiko 1QKNCACqcQqgJBRBcg7CRb0dfX/GGsMyAFAip0dgaqJtDLf7ApFonc0Vo0fA+NhcV5j0Nx8Ti9U I3ZV4TYzf23eOcnZCdm7rXhqmyxWKpftkt+8hIkJizIcSP+w7WDLeC2a6QEPQiGVuMei4kWHGnm o85bmygfh11FQZkX2pCCQNJlyfTByGtP4Y8JpLUrRBIvBMTYNUGhePLY9wL2DAFLPPW6ccgE1wi X82GoCEVaLpslRdu4Y6qY0DXtzUr9H7AOhKf8Hucv3GM83Xm/DL5TfDXh/a3uK8yiLTMpc8RB1r OJlOJIJ4Pu0i+HpaBnRzjUWikC+VvVcYf/m/QP/ndRhcoX39 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX8xuCuMPhA2Ri ujYaLHQOOk7P150BQG1EjMzfQIu0Ipa/6vB3HSFHsZ+DsS4lDjVHQ4LC0mLByTLwaIpi291zCc4 jBwMWqqJI2m1CSDGIZLK20X2jWwSJnk1ZfoWy/bDaZxBc9F9bW50rXxvYyoZtYWE+w2X0G+EGD2 DGvSabI9Rtc8Pb71TC9j59FUlbt1Yuxr56RSZoe+e5+f8Z3Kk2seSBv4qA1r1q8JB2CwTpTP/XP zz+MqOzbgCH5IBHtzr3k2xEbi1uvJmg6mOfsgZm1Y8mL7WvgfMO+VIOfoA4UkqEw5nQHIdBEJek tsg1KVpEfltI1IMtrSCXieX2Z4KxuKlrzdedICyXCpl+Vk/0sHLuNADzP1NHF7UW8bnlZX1YWge ajJ99+ggk7BQ5EOMJZ+adBbMReiVi06fWTrcRN5ymYTAz6FpVq4gFdV36VuLwbAekWE0UCUvKuf ZWaeNGNbAySK3w3L5Pg== X-Authority-Analysis: v=2.4 cv=IvATsb/g c=1 sm=1 tr=0 ts=694b3bfc cx=c_pps a=oc9J++0uMp73DTRD5QyR2A==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=FWtRXCEnrA9oX9MUO7wA:9 a=QEXdDO2ut3YA:10 a=iYH6xdkBrDN1Jqds4HTS:22 X-Proofpoint-GUID: O-u37egmZtwBmFA58I1tfrSZtUOr6wt0 X-Proofpoint-ORIG-GUID: O-u37egmZtwBmFA58I1tfrSZtUOr6wt0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 clxscore=1015 bulkscore=0 malwarescore=0 impostorscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 Updating the InfoFrame if it can not be sent over the wire makes no sense. Change drm_atomic_helper_connector_hdmi_update_audio_infoframe() and drm_atomic_helper_connector_hdmi_clear_audio_infoframe() to return an error if Audio InfoFrame callbacks are not implemented. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index 5a3817271d91..e8556bf9e1da 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -1061,7 +1061,7 @@ drm_atomic_helper_connector_hdmi_update_audio_infofra= me(struct drm_connector *co if (!info->is_hdmi) return 0; =20 - if (!funcs) { + if (!funcs || !funcs->audio.write_infoframe) { drm_dbg_kms(connector->dev, "Function not implemented, bailing.\n"); return -EINVAL; } @@ -1102,7 +1102,7 @@ drm_atomic_helper_connector_hdmi_clear_audio_infofram= e(struct drm_connector *con if (!info->is_hdmi) return 0; =20 - if (!funcs) { + if (!funcs || !funcs->audio.write_infoframe) { drm_dbg_kms(connector->dev, "Function not implemented, bailing.\n"); return -EINVAL; } --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 1FC5826FA6F for ; Wed, 24 Dec 2025 01:04:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538249; cv=none; b=ZeTwIiA8dkePsmdRHuOjS+6SOMw8xWcH3EFXwn25ImA3QvaSgMQ7GgZ5T689xQK/s4ERT5fLzwE1zgq4qPAlEdb50eEUC0X4d4x7I8wXSy4saYweCY6zIv4ezJWJMsDsZKu20gz5YwjEi6bW30+jNTDiRXoQld2tJmSBEdXOc+o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538249; c=relaxed/simple; bh=sxrbcfgP+1lHt6WjBr3iluImnNCx0aJDmiljrTHbhwQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CUiwNQOqqmjgvK1Mq2/DU/8OdPSOqUwmNdHD02m7IEN/jwv7pdkWUa8HOc55Mv7AHqhzQjlWMz3yHxjjD7bNr+FqalrSj8cVTTMj7oY2hi5nfaNrcSqce+OsmztBvt8UBN9l0gvIIuoFHe/yoigI6CKnwjRZLW1PtN8kA8NHdo4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=B5FzLQH/; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=jnH2d5lQ; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="B5FzLQH/"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="jnH2d5lQ" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNFr0Z24133945 for ; Wed, 24 Dec 2025 01:04:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= O0WcJstQEewLBWylyM1yaF1uo6Aq9IevUZuM4w9v8/c=; b=B5FzLQH/4hdXvpfe zRFH90K8m6qtrg/XEWhQfEiFLYj2sJlborOxSU6Ve5K1V7hKJG6ddM5f5hLHr9O4 G5FXrg+x2+sZ9U/OXiaNp/wHJ9rRB0Js17h6g8QCgkkdYEEOM682EJmWdkRJSwhK kQePbxHNlL6j+a/BpNbMONLysUtobbr5nGvrJmzoA9yB0sF9cVMuIU6eE0kaGPiH 9zYXOPs5JQjKabNmUxd4fZ+aeTJlgQvTv72a/GeIgJrwdHaN0Dd/bJzy1t13hpI4 C6ekVf2ER33wY8q3E2wG5W5TveJk+urBH5JoBUQQ2/ZGy/5+7CIj2iJgKbR7pbjn GsKuwg== Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7x46sebt-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:04:05 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-4f4a92bf359so117875811cf.2 for ; Tue, 23 Dec 2025 17:04:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538244; x=1767143044; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=O0WcJstQEewLBWylyM1yaF1uo6Aq9IevUZuM4w9v8/c=; b=jnH2d5lQENEqV7hUbMTbbS6Sow1x286qTnW+cNDGlqpH2ER1oIbgR9A+zTvFjm36B6 LFq60O5QGMK0fZ5EnOH8dLqQ8ar6EskR3mVWUmrMGab+AbLmMA7+/6gwu13Ga8F1Xo4i nOzEFv/vrZ4sqP63mCZgsK2PbCpKcOM1ZbqtIrDC2VPMVd+aOrv4K8DxwgLD5zzseNQT YnSk9J/oZZ8qAI/84uo8WJm95psw2w93Sxh/RMvpfNR0bzOhy4trDW0tIfXfTlQ62iwJ D8p1wzbXm4/0kjKt9I9JDTfHsWL7L0KJfFNUg8VySJeGaP/MC7SXmAUQQyQcHaZE+hiO Atiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538244; x=1767143044; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=O0WcJstQEewLBWylyM1yaF1uo6Aq9IevUZuM4w9v8/c=; b=W5O/TWie3ZwNO8pxtWo7DEtR6pRaNrnSINywTnghPK5XaYcQ1rL+WSPB205Lc+DAAQ GhCxqcmPX4DgjhWzFfcOnDKz1VCBbK3ai4v+JjIk9SgtacspeEBH6oNyBmRdvxnaN90m seRAqSn4sdotWEY47YvWu1xdjlicE+CVECfoLjmKXbj0TrgtGaCNaPWT+DZwEDL3G2dZ EwisMoUhSTaAHyaeaVpyoDNj/SbzHcVZpgT3xROPDt7dvlQ6A1iK9Iem4R/jPUu304ka ILKDSkOv4IS3cyUm7FISG5+zXLsAxm43FdMp73O9hTrNjmzdLwdR1/BjKMBVr71oGEG5 u8eA== X-Forwarded-Encrypted: i=1; AJvYcCX3tFPnnbI3ZfMCZNSJ0rk+hIymdIbtR4qvROwS0VGlSSBJ7hflFeMFXApUBl0/BX3NFk1bHpY4nF0rgO4=@vger.kernel.org X-Gm-Message-State: AOJu0YxgfeFpRBRo0GsWNbE+hHhIpNalVzKe6eQyIfUxBDsp5dJw0x+o Q/OJDROUxWslVzlBQCiws5vHg+k8S+i/wSqfrZX3AYCASrOK9E58ZEB7GrKjz/Q/4KM7RFyRH+W 9GLPhZzaRxvu3c1l8udEZ7WStbep1yiXakWB0Ltd4F16+iPlXE02g1z9GUPM+JNXxnRQ= X-Gm-Gg: AY/fxX4Jvdmwcp9EEoIzlE88ZScc1Xc6rJ0yC7UKbRJY1cTT9mc7iAumvm6koo6zW/T FEUA54eQzgviSfMALEeVPIRYTNptgoVgaErrmH4wnJee6wenK+ec8BS5Ram7RsI29GedX2ybbrG iTu2OztKyeLn7TtyIS2XL9gOxZN11yUt49dUQQQctq8ZjoyE8Sz9nzzdC92ivDcQU+BdKEaDiyy RooQjm7vIxR2BjD8wTsB1TwcQTKeCqzn7h2UQ2yVX4OTEukOkxxFYYRt/SOB4YNj/pirNYBa+qd AmOEHvECKwA10hMO/rLqEdyR8vdDodq5y1am4xQ57jEHjYOKzKSpLMg+pdM3kySjMjtSIdd5PRM sC629Qb8+q1xxBaSM+PcDJL1k/+6fxu3Jo2H7YYiFwNK6+FJU0LPGLI0S4f7Lvd/LUEUheX8laM PqDvkIrO+7av5SuiJvkIe9DhY= X-Received: by 2002:a05:622a:4d0f:b0:4f1:cd72:f22b with SMTP id d75a77b69052e-4f4abd98192mr256226081cf.52.1766538239479; Tue, 23 Dec 2025 17:03:59 -0800 (PST) X-Google-Smtp-Source: AGHT+IEQGuGT0UI/67dXu411P/e6eStajQsFB8+nCzwFqQBAvO4esgI+rdZ+y7jVSLNcipwTefBy2w== X-Received: by 2002:a05:622a:4d0f:b0:4f1:cd72:f22b with SMTP id d75a77b69052e-4f4abd98192mr256225241cf.52.1766538238937; Tue, 23 Dec 2025 17:03:58 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:57 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:57 +0200 Subject: [PATCH v3 08/10] drm/display: hdmi_state_helper: don't generate unsupported InfoFrames 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: <20251224-limit-infoframes-2-v3-8-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=2020; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=sxrbcfgP+1lHt6WjBr3iluImnNCx0aJDmiljrTHbhwQ=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvZLWWWNHwhc00YhsGGHeZN4blSTiSB4fsQ2 dICD4LJEyWJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72QAKCRCLPIo+Aiko 1TXpB/9MY/IAmp3a91kMBGdYigbcoUHZMxaQmuYtcY1pIt9hLZ/xDG0HyDeKfdb4ZXPmrbxM+Lr sZHIZRai5kkZBYBHRbs1UvhqFPaEKWCBVQ2Okq4Z1fFonAOh7dEtqQxrre3ELHCo/ljQz4N4wif r83ry1FetVmArWVlTeM2HjwKHkCtccISoiLzXtBF/vjY/mM4/GPwg3Vgf2yuvlfOviragLloVE3 bKNPzT63BmazQ/jQ/THvNVxTXxfLg7YxC6jPXiOFdD16vj7gkXrw6SeuFK7IBzesw8H/JFK5eGM 6letmWY47KyLynSka/FTDRJs5TQaxz+pxi/8ZGoJLndSd0+D X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: FcHmb0rWEPVBKFuDEgfPQhXWSZu3MIFB X-Proofpoint-GUID: FcHmb0rWEPVBKFuDEgfPQhXWSZu3MIFB X-Authority-Analysis: v=2.4 cv=aOf9aL9m c=1 sm=1 tr=0 ts=694b3c05 cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=dmsjDmb_ix4f0IDqKoUA:9 a=QEXdDO2ut3YA:10 a=uxP6HrT_eTzRwkO_Te1X:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX3RpMIN9KCmQ/ a/1JJihoPWLNCkHC1S818rFwQW9sVwE2uVaCJ6LeWknmprOzqk5qEQvBYX4Od26O7KRSDRBfXXG PlYF07PrYGToa3hq6dapuvA0quq0k9NC4bJQAfVkKl3fIKEWz3pfwDJ+ZKL7/fIb4tMayW7hp45 Mj59JxoY73X8Eo2CMLQvysZYTFc+vycYzWhq4foRDPbj8Ydsxe9SY8s2ityOMG2csxXq5R9sL0a tctWc2386jxAt0jlvKsMYlo9nDT/r38ynGPEPIVqf30lQ4dY/FLNFjFVImf2AnYdPMt+d2wKBqY lIO0F0ptyl/kOMW2P1k+48N9IIqLW9lMcGAeLipf0okYhEwKY9Ul6mrTVA2iELb1MxF1Z+uw3+d vTlgHNtjE5Zryi4uFuS6BFcncVOmjsI1tB56NxKVYotViDLGTY90QvU26jhYVntSKcDSx2AfYPC ksG0kFv0os2jIOjIQ8w== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 suspectscore=0 spamscore=0 bulkscore=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 There is little point in generating InfoFrames which are not supported by the driver. Skip generating the unsupported InfoFrames, making sure that the kernel never tries to write the unsupported frame. As there are no remaining usecases, change write_infoframe / clear_infoframe helpers return an error if the corresponding callback is NULL. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index e8556bf9e1da..a1d16762ac7a 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -718,6 +718,9 @@ static int hdmi_generate_spd_infoframe(const struct drm= _connector *connector, =20 infoframe->set =3D false; =20 + if (!connector->hdmi.funcs->spd.write_infoframe) + return 0; + ret =3D hdmi_spd_infoframe_init(frame, connector->hdmi.vendor, connector->hdmi.product); @@ -742,6 +745,9 @@ static int hdmi_generate_hdr_infoframe(const struct drm= _connector *connector, =20 infoframe->set =3D false; =20 + if (!connector->hdmi.funcs->hdr_drm.write_infoframe) + return 0; + if (connector->max_bpc < 10) return 0; =20 @@ -902,7 +908,7 @@ static int clear_infoframe(struct drm_connector *connec= tor, =20 if (!funcs->clear_infoframe) { drm_dbg_kms(dev, "Function not implemented, bailing.\n"); - return 0; + return -EOPNOTSUPP; } =20 ret =3D funcs->clear_infoframe(connector); @@ -928,7 +934,7 @@ static int write_infoframe(struct drm_connector *connec= tor, =20 if (!funcs->write_infoframe) { drm_dbg_kms(dev, "Function not implemented, bailing.\n"); - return 0; /* XXX: temporal until we stop generating unsupported frames */ + return -EOPNOTSUPP; } =20 len =3D hdmi_infoframe_pack(&new_frame->data, buffer, sizeof(buffer)); --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 C19392701CB for ; Wed, 24 Dec 2025 01:04:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538246; cv=none; b=LLDApFqyKaSIVTLVhM0RdQs+NX76R/jbLkh3LUf92LjcS1xlbKl9yKlEiU2aQ5cQdShTHYFF9EIoDzTnDw7gV3Jp93dulD3+PRXdmNuF13DNhvodkWyeWhk2uI0M6qTgCWNdAQHXoUmcrJay6FWMrovfdCwNOkjpEagrONYaBVQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538246; c=relaxed/simple; bh=wjvfsQWX2SPvZmtfq/QDNeAsj27LvHfOsz915cSO54Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YEjbLWRD8kIizAvSFe4x8xVgUP1/lvslPBMJbo10djPJVu8MjFAIh707Lq5xH+AFUQ0tnaY3Asovh04wqjvPBxWDY1ZR0xFesjmECprnQWKc0Gi+oVD4xjqRhD0PBKF4ekm50YxTGm6dOcYelxAEVmzivFGuAgn1ZeVLNxkFatY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ocinDGIN; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=UXs8yDEb; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ocinDGIN"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="UXs8yDEb" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNKXiwG1206461 for ; Wed, 24 Dec 2025 01:04:02 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= wLWwE3+OeE/g9lVfst6cEgHRxD/v4AAQeIf29KzVQzU=; b=ocinDGINcuRyGvWv qgltR7lMm4frTJ+aSKEOdPX0aqzZyqJpD0PaCxOFOPgiQGr8laYQxH2lb7R7e7GV StCQHC4ToUZakKAcrVPgk8iBJI3GUxmqXWxjHc+jc0ITFaURqs/zzdephK0ypwMg c9+RTYdv7+i4SA5bdkwOcom1HHKM1OVl1zHW2rjDg3VtGG2mZKer/0Xt9/vzIZ1t QBiyCjKVR0pAYq4M5lmdEu+yxeZgw7/mFMGtCknAggjID0J53oUXjiHrgmUm4kD9 QOuCLmI0lP5EuXkuauAhK0eSR+kY8bj4evofy818VH7lrm0NXy5OxS9h7ifZrQCi 9qeA+w== Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b827r0gs1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:04:02 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-4f1d26abbd8so149230991cf.1 for ; Tue, 23 Dec 2025 17:04:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538242; x=1767143042; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=wLWwE3+OeE/g9lVfst6cEgHRxD/v4AAQeIf29KzVQzU=; b=UXs8yDEb1jrznbtEIg91bL6nI73W3R1rYhjiTKfz7drfKpgC9yuVK4DonizZmL2c05 bqIDTEVhP1I33ve9/wy+o36z8dPpVPSfPQURyTdknBXT+SPVJFJX7rfhV0183CKinetK 32OtgE5YsNr7CH049ZpHqXjB5G/RxmbDlZazM5J3Rch6762cyf45S6SWGoe05LfLHsvf DafqknEppAhINF3HSnqmLiwelc9X5qBfU4SnqK+Kx/3ocZxrybyMvcHDyJOZe/ltWJn5 KrE5ksGnnPz4Pz+rNsHFHXzdL0IzBgFMqfGnOHM/pi0m2eLwZsh2zfGRucH0GHv+MGT7 5V5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538242; x=1767143042; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=wLWwE3+OeE/g9lVfst6cEgHRxD/v4AAQeIf29KzVQzU=; b=ZDv9zHhYG3NUJzPPoJpOWoa36QXdIyDh90iDO+1KFGXLGCIRQAakwZDud7sO67Ofg0 WkglVjklGHF8YuR89ZpP+28fAmO+N5aVwufWN8cfUoT4lFXV5AQWvUfXZ4VHDprEL7T7 mCbFAMFygM7qpe45BATGhfWFOUM9+Becw/u+iJH1z5mEediEo5igh7dW7oQrBOU4jonh ni0AOhVdJwqff2DRLF+CtkjpUEpf3UVtICVudPZ2s+iRbu94NeQcRS7s1wSzvpsw2aaV 3JvIY5aANa9EA/sXjC/VfsWcrpphSj/GIcTVxzbbGDVQcYGiIgP+waMBv5fDfUBzpzY4 z/sg== X-Forwarded-Encrypted: i=1; AJvYcCU8LF0qT/NtLdtcMHjqCFMdFjV66DtN3ktJqTKbIMyP0Ti5+8N83h3cZz8GhQb0B2Y2iPaMRdg4d80/eLM=@vger.kernel.org X-Gm-Message-State: AOJu0Yw3GXjSkp11DkxgTZuC96x9VhMylUiksSGQ3iWPaTTRN/K0qDEJ YIMolVk6zYcAqe0sR8/BBUkw++QszgkInjFXzqQhrcNXwYGsHTlGSIhLszKZQaf50F0cwtMesXg H7PIdcpUeMbV4yGgKG2Wed+Nt+i1JmKVc3uZz6i/8+8843cNEAySolaeIunyaR92GoZA= X-Gm-Gg: AY/fxX6ZbrjD+DX7fZ2WXhoNnlDh4/ISF7HDXn9RDq+wqPWd+1mjxhht/t0RS/zZ+Bd rNy4YBVcncIq90teaw/Ut6eBWtmrsaxL6ZoBVBEUbwxj25S3ZbWkRCp1edSV3f6ipCRhy5X/UJV F9Jd5KxaEmQ7pQ+qHF+0BcQ9YiveI7OeW7CoB7aBFGNc477xMyEPk7CngzQobzO7a4Gq7k9tb4I qAeogBD2oBzUJHoCe5vmvK6G1lahh07Ca7tdmFu9EqXd5HZ3UAISLAGTsqBRNTgUtMtVrPfyIp4 3KMmhzZ86W7zOzfVWxyiE37pNrX0RrYb/l2VWglLa6dr7oKWS/lL+eHl3hHi+PBYULlBvoo1FRe pHHBxDMrwMSa5g8zKBqzFLgJXSSQ9qw0ENol2b6OsdNMyN5MFV+sZ1jYVM7JZRDTjT3mYejtBxn XWM8rCU2Sf3zqWSQHe7iz1iqI= X-Received: by 2002:a05:622a:1248:b0:4ec:ef62:8c81 with SMTP id d75a77b69052e-4f4abd8c6bdmr206266721cf.47.1766538241844; Tue, 23 Dec 2025 17:04:01 -0800 (PST) X-Google-Smtp-Source: AGHT+IFjEL6KpdvGkaIQESqzuIk0ruXwS4QCPmI+GKo0q+FP+/3F3vrZO4vptQGCTX9RSoNL/0h9gg== X-Received: by 2002:a05:622a:1248:b0:4ec:ef62:8c81 with SMTP id d75a77b69052e-4f4abd8c6bdmr206266431cf.47.1766538241402; Tue, 23 Dec 2025 17:04:01 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.03.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:03:59 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:58 +0200 Subject: [PATCH v3 09/10] drm/display: bridge_connector: dynamically generate HDMI callbacks 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: <20251224-limit-infoframes-2-v3-9-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=6848; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=wjvfsQWX2SPvZmtfq/QDNeAsj27LvHfOsz915cSO54Q=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvaCm570BXj+xIjC/HsGcDtU3JpA7khf+YXS u9a7QR7RCeJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72gAKCRCLPIo+Aiko 1RcNCACKsTzltXBEDv5JA74NluYiKEOT2sk5yj6c9PVolhP6Av6n3Nd8/t+6XB3cYSb5w1io960 9wqlW7vqJLAveCu+3Z7ebSvwfcaFyBSv3WTPBayBsfMzB6AqlUWornDKj76LVqhdKVSt7WBuDXD vatVEwKidWBUCYmkZVY6bgw3MHh1IavrIwmGwccrpBiOcKQX1569bdMvX2V/vrBdoY8npN/Vf3i 9xPNMTYOWUmhlvG0QOffuyOf6enZ52Ukumfye5R7tjm0nOHqVQZqBI8rEAzGWq6Pp4W1J9M14XP oQc7kGcYfsQuNjirDnckyZJ7oCPqQPN1z3b/dJVZs+CcxwPT X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: Owc1ZXm6CSKthtp5fJynCMAf70cHukBe X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX/w8hZwWCYl5T qZeDpMJ9wLXPFlkixMZYeLG3xM85+pZug7KU28avM4bh3cW7/UqOXfEMDNMplpIt+d3rYtxkkDB lgdvs1A6HYVi0RVtD2KPiozZ3cZZhR5NI8ci8602HW+qEfY9CYC7SUl0k/G/GsXqW2sxfCPxoQl 8L18skIBxxVmShlIIdgkOgvDDEnXPlpJNiW65EzTpQL001YIy2C7xhFnFj2vHfZu5vN+dKIUoS9 WZF66LRyEZB5YZm2g6wKeOsl8vbR+GQFidE3bWWj+vFOUFpn/+S7cn8PT5wmpY81S5U1LZ851iO 5BhTD+jBcvSKsea2pZQ+tIf0rk7eYkG62QO9LdjtSfD4ewbj9ilOQd1f2MsqBdv64rTxOxoeDnw UXAGmCF+p8oWN+OAaqBKzBeg0LZZHnjjIPZL4QQ80Ddgw/iPu1GLREEQdPnc/AnjWd9xqZyjYiZ q8lCeS3zzPRhopyIroA== X-Proofpoint-GUID: Owc1ZXm6CSKthtp5fJynCMAf70cHukBe X-Authority-Analysis: v=2.4 cv=RbSdyltv c=1 sm=1 tr=0 ts=694b3c02 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=SmQ2dRXw9u10PpR7_9MA:9 a=QEXdDO2ut3YA:10 a=kacYvNCVWA4VmyqE58fU:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 impostorscore=0 priorityscore=1501 clxscore=1015 phishscore=0 adultscore=0 lowpriorityscore=0 bulkscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 The rest of the DRM framework uses presence of the callbacks to check if the particular infoframe is supported. Register HDMI callbacks dynamically, basing on the corresponding drm_bridge ops. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/display/drm_bridge_connector.c | 94 ++++++++++++----------= ---- 1 file changed, 45 insertions(+), 49 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index c8858d48199c..2a8f586c6d13 100644 --- a/drivers/gpu/drm/display/drm_bridge_connector.c +++ b/drivers/gpu/drm/display/drm_bridge_connector.c @@ -123,6 +123,14 @@ struct drm_bridge_connector { * DRM_BRIDGE_OP_HDMI_CEC_NOTIFIER). */ struct drm_bridge *bridge_hdmi_cec; + + /** + * @hdmi_funcs: + * + * The particular &drm_connector_hdmi_funcs implementation for this + * bridge connector. + */ + struct drm_connector_hdmi_funcs hdmi_funcs; }; =20 #define to_drm_bridge_connector(x) \ @@ -465,12 +473,7 @@ static int drm_bridge_connector_clear_audio_infoframe(= struct drm_connector *conn if (!bridge) return -EINVAL; =20 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) - return bridge->funcs->hdmi_clear_audio_infoframe(bridge); - - drm_dbg_driver(connector->dev, "Unsupported HDMI Audio InfoFrame\n"); - - return 0; + return bridge->funcs->hdmi_clear_audio_infoframe(bridge); } =20 static int drm_bridge_connector_write_audio_infoframe(struct drm_connector= *connector, @@ -484,12 +487,7 @@ static int drm_bridge_connector_write_audio_infoframe(= struct drm_connector *conn if (!bridge) return -EINVAL; =20 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_AUDIO) - return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); - - drm_dbg_driver(connector->dev, "Unsupported HDMI Audio InfoFrame\n"); - - return 0; + return bridge->funcs->hdmi_write_audio_infoframe(bridge, buffer, len); } =20 static int drm_bridge_connector_clear_hdr_drm_infoframe(struct drm_connect= or *connector) @@ -502,12 +500,7 @@ static int drm_bridge_connector_clear_hdr_drm_infofram= e(struct drm_connector *co if (!bridge) return -EINVAL; =20 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) - return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); - - drm_dbg_driver(connector->dev, "Unsupported HDMI HDR DRM InfoFrame\n"); - - return 0; + return bridge->funcs->hdmi_clear_hdr_drm_infoframe(bridge); } =20 static int drm_bridge_connector_write_hdr_drm_infoframe(struct drm_connect= or *connector, @@ -521,12 +514,7 @@ static int drm_bridge_connector_write_hdr_drm_infofram= e(struct drm_connector *co if (!bridge) return -EINVAL; =20 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFOFRAME) - return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); - - drm_dbg_driver(connector->dev, "Unsupported HDMI HDR DRM InfoFrame\n"); - - return 0; + return bridge->funcs->hdmi_write_hdr_drm_infoframe(bridge, buffer, len); } =20 static int drm_bridge_connector_clear_spd_infoframe(struct drm_connector *= connector) @@ -539,12 +527,7 @@ static int drm_bridge_connector_clear_spd_infoframe(st= ruct drm_connector *connec if (!bridge) return -EINVAL; =20 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) - return bridge->funcs->hdmi_clear_spd_infoframe(bridge); - - drm_dbg_driver(connector->dev, "Unsupported HDMI SPD InfoFrame\n"); - - return 0; + return bridge->funcs->hdmi_clear_spd_infoframe(bridge); } =20 static int drm_bridge_connector_write_spd_infoframe(struct drm_connector *= connector, @@ -558,12 +541,7 @@ static int drm_bridge_connector_write_spd_infoframe(st= ruct drm_connector *connec if (!bridge) return -EINVAL; =20 - if (bridge->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAME) - return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); - - drm_dbg_driver(connector->dev, "Unsupported HDMI SPD InfoFrame\n"); - - return 0; + return bridge->funcs->hdmi_write_spd_infoframe(bridge, buffer, len); } =20 static const struct drm_edid * @@ -591,18 +569,22 @@ static const struct drm_connector_hdmi_funcs drm_brid= ge_connector_hdmi_funcs =3D { .clear_infoframe =3D drm_bridge_connector_clear_hdmi_infoframe, .write_infoframe =3D drm_bridge_connector_write_hdmi_infoframe, }, - .audio =3D { - .clear_infoframe =3D drm_bridge_connector_clear_audio_infoframe, - .write_infoframe =3D drm_bridge_connector_write_audio_infoframe, - }, - .hdr_drm =3D { - .clear_infoframe =3D drm_bridge_connector_clear_hdr_drm_infoframe, - .write_infoframe =3D drm_bridge_connector_write_hdr_drm_infoframe, - }, - .spd =3D { - .clear_infoframe =3D drm_bridge_connector_clear_spd_infoframe, - .write_infoframe =3D drm_bridge_connector_write_spd_infoframe, - }, + /* audio, hdr_drm and spd are set dynamically during init */ +}; + +static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdm= i_audio_infoframe =3D { + .clear_infoframe =3D drm_bridge_connector_clear_audio_infoframe, + .write_infoframe =3D drm_bridge_connector_write_audio_infoframe, +}; + +static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdm= i_hdr_drm_infoframe =3D { + .clear_infoframe =3D drm_bridge_connector_clear_hdr_drm_infoframe, + .write_infoframe =3D drm_bridge_connector_write_hdr_drm_infoframe, +}; + +static const struct drm_connector_infoframe_funcs drm_bridge_connector_hdm= i_spd_infoframe =3D { + .clear_infoframe =3D drm_bridge_connector_clear_spd_infoframe, + .write_infoframe =3D drm_bridge_connector_write_spd_infoframe, }; =20 static int drm_bridge_connector_audio_startup(struct drm_connector *connec= tor) @@ -971,11 +953,25 @@ struct drm_connector *drm_bridge_connector_init(struc= t drm_device *drm, if (!connector->ycbcr_420_allowed) supported_formats &=3D ~BIT(HDMI_COLORSPACE_YUV420); =20 + bridge_connector->hdmi_funcs =3D drm_bridge_connector_hdmi_funcs; + + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_AUDIO) + bridge_connector->hdmi_funcs.audio =3D + drm_bridge_connector_hdmi_audio_infoframe; + + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_HDR_DRM_INFO= FRAME) + bridge_connector->hdmi_funcs.hdr_drm =3D + drm_bridge_connector_hdmi_hdr_drm_infoframe; + + if (bridge_connector->bridge_hdmi->ops & DRM_BRIDGE_OP_HDMI_SPD_INFOFRAM= E) + bridge_connector->hdmi_funcs.spd =3D + drm_bridge_connector_hdmi_spd_infoframe; + ret =3D drmm_connector_hdmi_init(drm, connector, bridge_connector->bridge_hdmi->vendor, bridge_connector->bridge_hdmi->product, &drm_bridge_connector_funcs, - &drm_bridge_connector_hdmi_funcs, + &bridge_connector->hdmi_funcs, connector_type, ddc, supported_formats, max_bpc); --=20 2.47.3 From nobody Sun Feb 8 13:27:22 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 14ABC26D4E5 for ; Wed, 24 Dec 2025 01:04:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538248; cv=none; b=C7XvCs2IVqt0Cy7WAOdHnoUe7lSm+nkYbnK3dHtksZR0nBCy/DZO4sQeCTRL8M85+bzJVfz5OGa1vIewUujGKKpbEy+lxz6XuIN4xZoUAcwqzhfLzh34cAePsE4s5C5eX2NnfvYf3bgVn1S8oAOYXzf+TBWh89amOthOHzHrnKI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1766538248; c=relaxed/simple; bh=e83riHemz7jmVSC1s86WzW2uTf0LnBtD9CtSbMUNt3o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XjEAA9DxhfIeofRRLBxiW4bXX+b4nBBcFBTObh5xV8tH/wD77yE+mS0xwPSu5smu/Fen2Wu2a+cLkFkmdswN3ENpIb7Kf2wavkZg2FGBFdURhcDH/c0zCHf80M/8eQvW/HQeaO/iIfG8Q/O3+c62bRxoUy5jH7njQuX+A0jdTC8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=jlqhWfoS; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=dNYTqcNg; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="jlqhWfoS"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="dNYTqcNg" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 5BNFr3ow4134142 for ; Wed, 24 Dec 2025 01:04:05 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= CHgg9IL7FE026ch0/W9DThBQX+0QxyHh6wbnCQb/hR4=; b=jlqhWfoSus3AvDYQ rNg9bNMgYw3zocQdvrdxXy5zd9+nVPnYik3umQeq7Mmy5TnJxJsd+oTkcbSg02YL tJRoDy8grzJPGgruw6Maxu+YfHm6coLBuXuwydQGMU91gsjihn+disnYvNpaiYxJ ykGhPxjB8pKv76xpOyCwQX9Jwr5wSrHlYaXtQRIGxIyXo3f7NLyRqyhx4oI+pjR+ k7YNcJdVZdT/hUIB2ZMPZ0Tj1SbWVvQ677CmJNXRRGCrosb8XlOFzSxJs4jjCygl uLcRnnKQV0wPWFIkJtQoSnI3IhTy89qHQ5TuDEMuzVZsBV+ghOHxSGDhxLmU5Uk2 wzPqvQ== Received: from mail-qv1-f72.google.com (mail-qv1-f72.google.com [209.85.219.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4b7x46sebr-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 24 Dec 2025 01:04:05 +0000 (GMT) Received: by mail-qv1-f72.google.com with SMTP id 6a1803df08f44-88a2cc5b548so143849076d6.0 for ; Tue, 23 Dec 2025 17:04:05 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1766538244; x=1767143044; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CHgg9IL7FE026ch0/W9DThBQX+0QxyHh6wbnCQb/hR4=; b=dNYTqcNgDsQzI/6GvL47zgSXvzrZdanEhs7YJBOKU7tlGOPK+HcsnLS+f8frdt3cov kRBRt26QNoFDIa6MTm8STervaP6/ZT9GG+Xv7QphZnnAkgNdrudkgKSiU8OQow3WjR6e Gqt/swNPaoIYSW7TfGYL4ogLFEpx3PoJju9oFfnOE4YJZBOlOOAMXqrsIv3fGCA5Ny7E aImM0erh73jYqfWhlfVUoi4VJ513NNNRWPvFJJM60g1gDBxCPrgjB3XjNS0oxhe5D+Ac PgwqOdgw5qOUeLc8mNBHywuilgGE5VcdWVuD0+FUsXlE9Pym1cv39dSFP+4P6JCvDYYe dx2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1766538244; x=1767143044; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=CHgg9IL7FE026ch0/W9DThBQX+0QxyHh6wbnCQb/hR4=; b=ZmNebk+aug5YcEe0Ww9a6w5WLFKKcBp+Y0isHU9Xo8DJqfFU6RW0RanCQXGPK7+yTg aRpDKpsOMxHtfJAk4Z5rG2+3UkT9lZEpZY5Nkb+EoKUqs8wiRwaxByleWfTfXVkU2p1/ 81+Zz72kMSFICQpdqik+yNc6hx3Q7Kj1cNWvMuqavSZtOju6YTVx75U8vAjXVWPqUtce ExvTPdS5TsJ6PB3SFuFlfPj9Lcv8HcPdv47A85KTcpLG3R36FjW1TI6Bn5M4B7uh2fgg MpngwPVyfSyJyzTxy9Nn+gMd728AoR3dxuzqKn7GYftytb3oOAmnoiAS/8lwIzpmcl/4 TFsg== X-Forwarded-Encrypted: i=1; AJvYcCVcR/OGshTkEBBW5Ex7C8n39Pl+rqEnyaR4pRcqdInHg8e2AakkYAmlSGV7d9yO+1OFkxgURhTxCWMX72I=@vger.kernel.org X-Gm-Message-State: AOJu0YynGrTDDyCT4OEhorTB3PgOVjnGBMXPOhhtqtvGkBDUtaIDwzAs +/MeWgeoBH6Rwkbjiv8VdZ+LeYA2SqYCBEO1neHXWkRKy5gh3yQhFwTMskkXXIVN/I2cUS/qFff uLhSW+CfWT5kneHjlWwIdDS+PIzbjrGigCbve7VYJASCmIIcunSYK5H/s9QoR7ZmLFpk= X-Gm-Gg: AY/fxX45nLFP1jpXzLf6L9urkF+22NQ/CbgB8Dj6q8Y6TdhXEVNiXZM8O+eVyzd/8aR A3fIEXfkoiPonB7qQqV3nxYYM+edJ7Jrz99VdZM74/4bev4K1gujj3TUxU5VV695Hhn/m3e4MDN q+4O9QkZATDSUFlbsCUETz6n4flSaQ7dkkxi69GPoqwxRxtvp6eLo3bSWm4AvdcFBwIeJqxWXAB ewuwJm9AFyc4prysVXOJi4OXNMjZpGPdXXxoAVJJ3g9LChnasi76iyFz+YayU4K2tI2d2pIxHnx TRW97sPjxbWaf3yWL2edJ/QV5U001/VP95DtlWe+dIQ819DgQRoHcpNROEl5MqnL37Ja/YjsrKE tYZiIi9oUyJS4VS6jWUCqT7xxV3MinpdeoMxKzmbw0Kxs1MEkJah2+iFGo4Om/gwuJU8SvtuStg /Fqz1BY2pH+xadF84q5oFK1bs= X-Received: by 2002:ad4:4e8f:0:b0:888:7d61:b218 with SMTP id 6a1803df08f44-88d81d47b5fmr175846736d6.11.1766538244309; Tue, 23 Dec 2025 17:04:04 -0800 (PST) X-Google-Smtp-Source: AGHT+IFu7+HH145K//WnhennzRUAZ/qC4YMZkCHH5OOgkflOfdjzzhnjIk8vQXkFQam/FvXO84smjQ== X-Received: by 2002:ad4:4e8f:0:b0:888:7d61:b218 with SMTP id 6a1803df08f44-88d81d47b5fmr175846286d6.11.1766538243819; Tue, 23 Dec 2025 17:04:03 -0800 (PST) Received: from umbar.lan (2001-14ba-a073-af00-264b-feff-fe8b-be8a.rev.dnainternet.fi. [2001:14ba:a073:af00:264b:feff:fe8b:be8a]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59a18628284sm4545268e87.93.2025.12.23.17.04.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 23 Dec 2025 17:04:03 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 24 Dec 2025 03:02:59 +0200 Subject: [PATCH v3 10/10] drm/debug: don't register files for unsupported HDMI InfoFrames 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: <20251224-limit-infoframes-2-v3-10-7fd3cacfefed@oss.qualcomm.com> References: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> In-Reply-To: <20251224-limit-infoframes-2-v3-0-7fd3cacfefed@oss.qualcomm.com> To: Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Simona Vetter , Dave Stevenson , =?utf-8?q?Ma=C3=ADra_Canal?= , Raspberry Pi Kernel Maintenance , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Liu Ying , Chun-Kuang Hu , Philipp Zabel , Matthias Brugger , AngeloGioacchino Del Regno , Rob Clark , Dmitry Baryshkov , Abhinav Kumar , Jessica Zhang , Sean Paul , Marijn Suijten , Sandy Huang , =?utf-8?q?Heiko_St=C3=BCbner?= , Andy Yan Cc: dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-mediatek@lists.infradead.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-rockchip@lists.infradead.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=1244; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=e83riHemz7jmVSC1s86WzW2uTf0LnBtD9CtSbMUNt3o=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpSzvaPmw40jATyUWTrYBTNEusZxIc+obHstv5S b4iElplUN6JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaUs72gAKCRCLPIo+Aiko 1di3B/95raEOH5VDkaGoqgK45/yZh46TpjSkI0p4xAQ5QWmsMaaCn7Newqpeo25B8E3VpDS52aa up3rolkowr24CN+AOTFNP4qaLU+wQ5ufsLePmUId4/Sf7f/3uLCmTjU2bAAc7WkBJDBOUgESVoE VPOds3GCRBLX3X0qEONZ6Q6pJmz9433H5cMK5o5GZz3dTS0dZZqphPcLWyxJSLEmmZrEn2G8Wyx MZQXEWNaui7oT4aHMyYoZX0z2RTqrLwJAAmkkLQISa4jHnSF5bBJb4YQauizaBu+BJqV1TOmbVf WZtZHkfsakdCoN6Xjk8QGpdcOMYzMgS1IQv2DEwSOdtfE7Y8 X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: pekGl7FvVQhfY5ABu51q4qhf4aEkwOCs X-Proofpoint-GUID: pekGl7FvVQhfY5ABu51q4qhf4aEkwOCs X-Authority-Analysis: v=2.4 cv=aOf9aL9m c=1 sm=1 tr=0 ts=694b3c05 cx=c_pps a=7E5Bxpl4vBhpaufnMqZlrw==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=wP3pNCr1ah4A:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=tIAOKlZC_mo2NaXw_9IA:9 a=QEXdDO2ut3YA:10 a=pJ04lnu7RYOZP9TFuWaZ:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjI0MDAwNyBTYWx0ZWRfX/GTvyiC/BLUE kmKvkQJub4EbOao31RRDnMdk6GD0EMM9iFZyIKBDus9x9Gi5qRmdH1sEbO4tGnx3kzsEVVNlL7V nhBYtJJkGHgbYVorwlLDyshl688U3UeADeFF+t1zUYKpV0YVSBO2208tWdPK2it/O8nEUCkXbVJ vKQron9oMupibpuoWIDmDr0cQDkm/jxWLB1T9k1qgrV3JVdTsAQ8tFU2ZH6x3o5rHd8SETkC22N srG9zMAQU+ibmvL2eg9l9NdhI3j+NNLi6JKKiTK1fQ5abjPdQZEAlnPT5RL4t07NSf3eFKljJ/R WVN5gB46+jblHZbRLesllA5oL04aK6owOHfAS5N6BnG8b0KtHBAW6EUAQfBvKFNpX3mpSgUDEWz AgJBpLBog3vqHjA9Y5o/HJqlRnEQbqBbUsQxpETNQMdCV0mC8w0ZzVdfHNmsKwiBtxBS7DACAFW nSjdR37KtPO7bvelkRA== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-23_05,2025-12-22_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 phishscore=0 suspectscore=0 spamscore=0 bulkscore=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 impostorscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2512240007 Having debugfs files for the InfoFrames that are not supported by the driver is confusing, stop registering those in the debugfs. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/drm_debugfs.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index 365cf337529f..ae1c6126c2c5 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -672,6 +672,10 @@ static int create_hdmi_audio_infoframe_file(struct drm= _connector *connector, { struct dentry *file; =20 + if (!connector->hdmi.funcs || + !connector->hdmi.funcs->audio.write_infoframe) + return 0; + file =3D debugfs_create_file("audio", 0400, parent, connector, &audio_inf= oframe_fops); if (IS_ERR(file)) return PTR_ERR(file); @@ -726,6 +730,9 @@ static int create_hdmi_## _f ## _infoframe_file(struct = drm_connector *connector, { \ struct dentry *file; \ \ + if (!connector->hdmi.funcs || \ + !connector->hdmi.funcs->_f.write_infoframe) \ + return 0; \ file =3D debugfs_create_file(#_f, 0400, parent, connector, &_f ## _infofr= ame_fops); \ if (IS_ERR(file)) \ return PTR_ERR(file); \ --=20 2.47.3