From nobody Sun Feb 8 18:31:07 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 EF73A3559EB for ; Wed, 7 Jan 2026 18:15:08 +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=1767809711; cv=none; b=AKBGFTBKsn08Gv3U5tzmrrJ7dyOnwvcO9GsoSyo7AyZ09OGQhFoBLMUuBmMYdqJcw7e8SAfWa19kkHeoBGCKvAaiwUrtHMI0WAxgZyrAGSet9gstd9mjN3s17JlbthJ5xdPrqxsn7Lw6tY7gekiDuO83dOhyBOULfyekl7WPmss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809711; c=relaxed/simple; bh=XZUiI+P1J2mQYMmzuj2kKLbF6PlyfBdfsh+uTUhKM3o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=sqT7ZdRZpxn+lYygEUy3ImjRvptQqA3h7cFAsaOspw41FSNyK8aR9ZdffODJAW/Fg1aK5lk853H2F87F7UIoLjqmu2i3KCGstRmIWMqNJGgOokM5nQXDcn6J7Zr/G6hxtdbXX1uH/ArWX7zh6oqEercjd2Nk7A+ubZ0zb5Cug/I= 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=XjdPzI+v; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=jx/I/W70; 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="XjdPzI+v"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="jx/I/W70" 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 607H3vch3049898 for ; Wed, 7 Jan 2026 18:15:08 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= pPEqdfktaAHE/Jjjjm6RwHrVcZ7AZ3stnlHc40P42b8=; b=XjdPzI+vprat0Amv gwL3eg4VCPgxWlfP8SP+gmGcQl0yvekPl5SWJ98dXB9sRWjAFvjVdTlLxe8EsDSa bCbSdg7e/6q1v+hHAmq4FOhGOMqEm8eC0vubYxM8GJOK1yBCU/+errTsYHLWBhIk SFPQ4E2fTMzd2tn97gEbpm63rCCzXLmxJ8fjRb4dljA39rjJzOk3p/bPKBc/vyq8 qMbVmKT2l6RFKdu7HoY5DkvrKKkyxuMxaoYPucTRUJI5xhq1v5KKECgSmo+ZDHto nL4i/tijX5o6Fw3wwCPH4i+Bgdnp1Qo1AS/xhUU6LQ28J/eDkz8qaF+rDPVZz9CJ KR6m0A== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhujeg8ha-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:07 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-8c1fa4a1c18so565760285a.3 for ; Wed, 07 Jan 2026 10:15:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809707; x=1768414507; 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=pPEqdfktaAHE/Jjjjm6RwHrVcZ7AZ3stnlHc40P42b8=; b=jx/I/W70CMD585oBD7B5ZACwusYTCyqoKfkUVkd+pVhYGzkzB+udCnkl11nGzS4wHM qbJTrZNYS+r9SvDRd52OZBVtdDRJNiRdUNDw02lsN/9VEgazNoESpY9T1Bcmc/6VWuTR KqhCUXf8uKECXGNCSE3oLklKX+SCHjDaTBMZ+77btg+Vq3K6s2Eo85bkCmlqKcZ8m2X7 n3fWp73d/NCS2nXQi59knW+KReIwKGEfEEDqREJyxFrzWqhUQKs9+TFZfwwqcywTZ14o YqHorpfDqn90ggRC6G0KpEZteqos895l/ASGUNt5Y6en7gKMXxOYcoaaCmUxxKTyiYrm axrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809707; x=1768414507; 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=pPEqdfktaAHE/Jjjjm6RwHrVcZ7AZ3stnlHc40P42b8=; b=pQfFxsVkFFlKZ9z7p7o6Ou9ZCgd5krl9qyctkgUSsfvM0y8oaMZ60EyLA9oXkDofYr L24Tsm22FkD72mXX3E1s+zQodIUjh0lkze/0yGAAyY9+CKQhpcbxxF061PSdIHtRnTfS vf7Hhsw4qGdf59FbfU3J/l5bhJ1Sp/kHtM/dsUFwFvq4BMhsoXIWeKH5WqiDv/5E0d8M GKL1bNQ6QLnSAv98L15PzFExjZisZpcFXMcGHwVMFDpsVS39pyBiZ2jmRFkN2jJTFFfe FpTUK9Rl+JhPkVKcHZVKc/D45YXswZoFucUthRAAVmfdL77jQ348zI4UtXBcNn9uFxHo a3MQ== X-Forwarded-Encrypted: i=1; AJvYcCWbys5tNQymL5k2mx+7lWxHWrldJBejX5b4hm46jFf9LsqTHNGsahK4rR/2VpnKVPbHJx/1K/2jLIVF9g0=@vger.kernel.org X-Gm-Message-State: AOJu0YymHlZT3ROMKPVZziSmFo7ckEEXZZLXyHic2vWMi6cf9+IFzyn6 c1MXir4w+yQTGADlZ6cIzth5EH8zyO+KBR9d+gC92ABosTv6qeoz8UIQHRHzj39hzHDRZDSYdJq ZufSckX2lgZ8SVwXvxHRBPAY4Cm6qK1rRJK15+IinQS/SfZWWH9GJywoZDuJr3/6TWzA= X-Gm-Gg: AY/fxX5b4vBGDcIYiARc6tBjuOJGxlnW15SRH2HcSMBSKY8wBDYJJiRKNyoFtEbk1NK CD3fxhKrtWZNErf0rIbKt2+gDCwaV/xlbGpi0o8f306iIx1eSl6Mo4BcOncQAI5BaRH8AAqz/3Y lORgbr71ftjEJE/MwBf9r9o6dEPK9vJcMpPm/efGfgyHMvjte+ms2KM7qhqtaZnaxd8itC8Yw8k 6T8aAv21hJ/V+LRhsbTMdJnSVhzY/YF510LvCnONrHeRSXLdLhnHYR5XCjy4CmtYsdAlpxU3nb3 pEksCJWws6sSP8MGy3Fem4i01Acmk9UBhJc96Xm9WWA2teS6RtUp1ZshEHCwBrj6caKKM6Mh+JW DzMWVtB0mVjy4rLRWbJoHX2yQgvJjQL3dPbRZDcr/DyHfEmpaOPvZxQzlh8EM2yYIzsjbkHltew nu4gyAEjsR9QXLyWnS1mhy7+g= X-Received: by 2002:a05:620a:711c:b0:8c0:cca6:8522 with SMTP id af79cd13be357-8c38939ce29mr472851085a.37.1767809706532; Wed, 07 Jan 2026 10:15:06 -0800 (PST) X-Google-Smtp-Source: AGHT+IE0AzgUocYSZpm2KC5Ln3K9tzKrPT4erDK/yC4UWYZHbUCAGZhC15uqj5QHGP7DsMDQRvR3PA== X-Received: by 2002:a05:620a:711c:b0:8c0:cca6:8522 with SMTP id af79cd13be357-8c38939ce29mr472830885a.37.1767809704473; Wed, 07 Jan 2026 10:15:04 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:03 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:14:58 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-1-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=26900; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=XZUiI+P1J2mQYMmzuj2kKLbF6PlyfBdfsh+uTUhKM3o=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKk/8Nl7ok1dk6fEgJIBY2eHmOcgrrVbCdGg 4G/w01IwRGJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipAAKCRCLPIo+Aiko 1WqSB/0VrgfS9rAIG9Uf20YH0OIYY4ndo3LeHhBOi8y+NVnkkrgy2GYB7/rQtaNP7nFjGfA4cmL vbob0bl/yFwoZQmX5PkeiPuoQSoaXRP7AtTHFBeRCi8Rj9oXqeEBUvIHu+aQBv/49k7WQadCRsL mUZovgX/I4GjOMOxM5h0ygkXgQO3MvIU+0mML823mquPoOjHaRJ3jIOUUziNm5KhauTTSv8bEZm nSoWmvCvTd8ktElS/MnI/p7rdGaiBmxxWtJifxx6QQ4NVYcjP/iEq3BtdhrWCen/IWD7BodYU3K Hmu1TnqjIt4tgMI702qK4C1kVfoT8MkuGsTjtWOwHZpujBeq X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=WKNyn3sR c=1 sm=1 tr=0 ts=695ea2ac cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=VwQbUJbxAAAA:8 a=8CpnO3W62F676OTI3Z8A:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-GUID: Z2iLPt8Q7spr7oJ0WwBDulKGqHeyMweC X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX+Rxjeao9dPes FHAtHKuEZt2uyV5uRIBUDEzTYf2M+j+gA+3qq2a72VKrvLkI6BBq2PuWnJ2esAJ0qBbyDPxMEjn Q0bp4H6EqzJt8feWa7xwfQeL2U3b1P8jm+1JMavhevU7fe3d37lQvPXs29aFB92Uf32K9SyZo6U FIAGxxyd5hjzGK7/ustbqKA8xjTgPPqfflXY2f6mQ5q1JSDE296Rwl5pMJghffmz2cLy7pW6np7 CCG85NLDpGO7MpDUGZ/oVTQDUC8AsJpk+61Wg/VsCz5hgApdwn7+9as3V9s3Y4rGjsq/Z/QuAoR kgBL97rv4MX3nC4Mh42JThgdoU5GhwRDnVlWEX4usj4p3CL2+59EHiO4r/INtchuUhfinQnHZ8v xCQyUVgi0F8becGUENJrNkDyh2MA9/KkN23QqBseogznGfGtxOy+r/mQIRwdoHlJ7KE0nCXxbQh MuDi21/ePhlEdUKk2Eg== X-Proofpoint-ORIG-GUID: Z2iLPt8Q7spr7oJ0WwBDulKGqHeyMweC 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 malwarescore=0 bulkscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 impostorscore=0 phishscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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 Acked-by: Maxime Ripard --- drivers/gpu/drm/tests/drm_client_modeset_test.c | 3 + drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c | 627 +++++++++++++++++= ++++ drivers/gpu/drm/tests/drm_kunit_edid.h | 119 ++++ 3 files changed, 749 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..80f819a9ff5b 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -35,11 +35,16 @@ struct drm_atomic_helper_connector_hdmi_priv { =20 const void *current_edid; size_t current_edid_len; + + int hdmi_update_failures; }; =20 #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 +143,22 @@ static const struct drm_connector_funcs dummy_connecto= r_funcs =3D { .reset =3D dummy_hdmi_connector_reset, }; =20 +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) + priv->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,616 @@ 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. We expect that + * infoframe-related hooks are called and there are no errors raised. + */ +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_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); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + 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); + +retry_crtc_state: + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + if (PTR_ERR(crtc_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D priv->hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_EXPECT_GE(test, old_hdmi_update_failures, priv->hdmi_update_failure= s); + + 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_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); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + 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); + +retry_crtc_state: + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + if (PTR_ERR(crtc_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D priv->hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_EXPECT_NE(test, old_hdmi_update_failures, priv->hdmi_update_failure= s); + + 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); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + 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); + +retry_conn_state: + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + if (PTR_ERR(new_conn_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + if (PTR_ERR(crtc_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + 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 priv->hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_EXPECT_EQ(test, old_hdmi_update_failures, priv->hdmi_update_failure= s); + + 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); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + 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); + +retry_conn_state: + new_conn_state =3D drm_atomic_get_connector_state(state, conn); + if (PTR_ERR(new_conn_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, new_conn_state); + + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + if (PTR_ERR(crtc_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + 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 priv->hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_EXPECT_LE(test, old_hdmi_update_failures, priv->hdmi_update_failure= s); + + 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_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); + +retry_conn_enable: + ret =3D drm_kunit_helper_enable_crtc_connector(test, drm, + crtc, conn, + preferred, + &ctx); + if (ret =3D=3D -EDEADLK) { + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_conn_enable; + } + 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); + +retry_crtc_state: + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + if (PTR_ERR(crtc_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D priv->hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_EXPECT_EQ(test, old_hdmi_update_failures, priv->hdmi_update_failure= s); + + /* + * 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); + +retry_crtc_state_2: + crtc_state =3D drm_atomic_get_crtc_state(state, crtc); + if (PTR_ERR(crtc_state) =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state_2; + } + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, crtc_state); + + crtc_state->mode_changed =3D true; + + old_hdmi_update_failures =3D priv->hdmi_update_failures; + + ret =3D drm_atomic_check_only(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state_2; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + ret =3D drm_atomic_commit(state); + if (ret =3D=3D -EDEADLK) { + drm_atomic_state_clear(state); + ret =3D drm_modeset_backoff(&ctx); + if (!ret) + goto retry_crtc_state_2; + } + KUNIT_ASSERT_EQ(test, ret, 0); + + KUNIT_EXPECT_LE(test, old_hdmi_update_failures, priv->hdmi_update_failure= s); + + 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 18:31:07 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 7DA5535502B for ; Wed, 7 Jan 2026 18:15:08 +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=1767809710; cv=none; b=dIBkEgboyus91U4qlhhh90sFjymRKjxlM8pBQN6sTq61lu/8EhhhguwLM3ax6Pk6luZRRPXteWcbdiL5wN6BF8Z2MbzZTT0GTk0nnpheRg1fNlX60afzKmXtks0YN0gGd59me0lTKX3kteUQ4ixVGFqyfxc9u+REtMna9gFJAVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809710; c=relaxed/simple; bh=YjRxdH2GhgCXavyWIwCH6N3bsC345EISvDP2gtesFFg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=AdMN0tOOKi49wvlDVV0GYmVddERDIsWyByRbLQ9Th7ovjiIbPDNCyms3zUB3jru1N97B5WKeSUHKVyp9eGy1Ju/hiWzPfeSh8SRvWDie4yX+5It6pxpmWh6LNfoe/m3nrbT2E00DzhSdsecyUtBx9+foBr3R3ymvrg2Ir/fPjFE= 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=LcvKs90c; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=acU4TJ0H; 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="LcvKs90c"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="acU4TJ0H" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 607H6eQ82454263 for ; Wed, 7 Jan 2026 18:15:07 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= CvOBqRWntd3xVSUEtMwnv/Rm6Go596skSwj2MkU+rb8=; b=LcvKs90co5qyoc2Z d/DIjr6T4wp6peOapih1HLy3dVAbvLTC7P2Kndnry/iEomJs8OzmIVngr3ixTOg4 tVc0xZ0DdmPlAIFS82JO8PKad+Hq37EPFHDDYa0GXy6zgBOnPD7vJ+6HgBeCQiT+ G8XV72EZ8iahnPwLPnscVkw1z9E1UZMXnq1dgZHv7GYsWAjoLBiC4TN5mTDh6g/J 6uEGqMsEJNdB6obsu3FYwEUHg8rQ/O4SdEcPEIwhJuQIkWpFmUB31BYP1mcGpKNr 8ZksV4agCherUaArKSC/9gV6QqRKNRz+GmwyFyV4PyNrFAU9PP6VNmmcPKTYAFYo Lf4E3A== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhmnbhpt2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:07 +0000 (GMT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-8b234bae2a7so634331585a.3 for ; Wed, 07 Jan 2026 10:15:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809707; x=1768414507; 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=CvOBqRWntd3xVSUEtMwnv/Rm6Go596skSwj2MkU+rb8=; b=acU4TJ0HvBGNYipDC1jjjbwJws+kXNOvAcp7NRlnz0ceeglznYNnXBlMvm72zl89Lt iORosBkqEvLj/NZHe3MmvB4j1tRmtuR+gJG5ra/4eV8ujT6pEke2oO8S1UNBxltlKbnS SVvC5rgZZ/jUcZaE8Ihjiz9St3IfAld3roQAa1w8InkzjVKgW8OSTeDFwehM/0avkmK7 WcBF4kKYXUapn0N5jJjEL+Teb0pbXWbvfpZpOSePzFzmWzysVtuBVulGvTgD3Be+oMVi 3lDw+QXxCZv7jkjw2o0TC6xEnIL+RH0mDfukP7laBkAPuBWa7UGHc2NhdqWFrl6e3EE+ sB/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809707; x=1768414507; 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=CvOBqRWntd3xVSUEtMwnv/Rm6Go596skSwj2MkU+rb8=; b=QHclQM0SBpBr+plosiVTyzNB9iR6Anb7pdBwTqzHzZzV7JzQBbPN7q4AqdRfVAhKod hSiXIAgoJfrf2Zo2aeIKqMWQhOO8Uc8TsSBpxPz2dMQtViHrldWy0wo1yDLQ8AFLJDUB Y8o9xGbROhibWgFpBLCHh3mtDx7tpqNbYo+cIQMA0EMuIR39ZrkqOagBeP+iCEd4luMD 0YE3h/lLvsnLcKR17Whki5HKth1gMXapfWXV/2IPARKVBlJOlRcQHrlhVw5jLWVXAmMj lg120nsWcNGbkkPke9R3PMT65JJGV0U/ruu+FNMzb3P4a2WgKn40T4f6YeE2sUWhG2pe ATWg== X-Forwarded-Encrypted: i=1; AJvYcCV7LWTaxs2bARDeAnIAM+pj0eyetNlTw5xQtFCBJzl+dlsvDHrVnCoMUo+CCet25LvUM6+pYJAW6MvdZNo=@vger.kernel.org X-Gm-Message-State: AOJu0YzDXQtTZAi1+jTpmt1CMVfjs2bl2olw33C6e1yIFKSSII+Dn2Oq 3hMkbwrNw7lSiu6gAQbJciqVxdICBKZM/I34I/mvg26BktXiY00S8vcake67noHpCuTUpp70/1e 9fzm8RxNTRJ/Xcpt1eB+/UEWdDWttB/3Yh0Iyau+p25X9TPxUOpw2h+LWAFq4TRKiXr4= X-Gm-Gg: AY/fxX52q+jeQO9L8xys9Uv1zyBLKkuZpLKqbg7t2RvdVoqR3DcOMcuMeWgzqAEaH15 IG6rwnyDCQhs4U9MGNt8IdkEECzDkwKF1THtkdcwDInoou9s9YCfbHcsgj9p+oVCdas8YDbO2Vb g0VO0CxG2N7lViJTba85Et2udP3GjX+XLtx/xCl/ZAkjc18+G+EbAZ7ts8pIstof6L2oQ0J1jt3 I7mbHeujQscSxcncFVr4J58RoFX5smv9vhqfbJz3AhyJUKuXymBa5FF72LysQMYI+/05US0fLkZ b66W6G44Ykkfk8OxjqqaKYBDGq36hINI5EO1f4AmDkv661655JDXI/JPryFwch/GxZicsk0BoHM ImBmxm1AfIpEpKcOQ61dsYhrgfp8KgTfqD6hXSLlwVX2WVoqX/wOW8EVvSPDIrTAUs1KIdBvpb5 OHclnru+CfIZXyzpVejl2HfDA= X-Received: by 2002:a05:620a:298c:b0:89f:5541:b5f5 with SMTP id af79cd13be357-8c3893751a1mr451572185a.17.1767809706386; Wed, 07 Jan 2026 10:15:06 -0800 (PST) X-Google-Smtp-Source: AGHT+IErco6iIlONdm8FoPmBoVGT4sMle7p6Daei/gbTGJZ8AsHe90PS3UuyAzSsRgYRNtmFv/UWZQ== X-Received: by 2002:a05:620a:298c:b0:89f:5541:b5f5 with SMTP id af79cd13be357-8c3893751a1mr451564685a.17.1767809705824; Wed, 07 Jan 2026 10:15:05 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:05 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:14:59 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-2-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=1749; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=YjRxdH2GhgCXavyWIwCH6N3bsC345EISvDP2gtesFFg=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKkcDiQpwhgi0U0jf8JGOrxJBwtl/l5GypPK coPxI4tELuJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipAAKCRCLPIo+Aiko 1fRWB/92FTnBMUcYj37wwL0tkj2+9WhnXCNr6YaqOXhJHzBvMN3Ric79sLxWIk6V2x3r2jYCRTc BkdlD9X0pnL+Hq2degXIglnJH2gA1p7PGCVq8s0gm0v1ELu41JL4luLf8f6sJieWu1QXoaJk5qP 79zPwaA5N2vB9hfx5p+R6t4e8pTVe1kMeFaRCUvqmAe1Kovi1sIZ1KaVq04n6rv6Vhjro5yFiFn LyRakv9HjVWBfthh1kbm1YCWTU0Rh+rmb3pMmr07+I6SSf6xRRJ0Yq6B0EcopvIhZhVA3ayoLhz savBzIEyxFTHux8IDyABCGHnOtOfh5srllF0nQkfQKf8sNtQ X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX+dgjY5977/9a UcrWbR+39TSIAytijca239BDIxgeRITlu9cnSt8fDzFjy2TpiT+YWbu7AwJzMtqMJpls/W3IMG7 i2Xt5YmahIaqiV0PLc23QkKpmSzDJGPU/jMQt+o/E3gK4kb51PNaYFBI6o5QFH9iapHnhxSjw0U 0B/vlEMbCbU6oTrrrTqfDLbR03ZbN8GEUnIiJ8UHMKMD6cEAVuSvT7Hwvaz1IRCZfQiPUXJwCjj 1+OqMT6xbQVc4a3U+8jJPZdhcD1PlJqUWWfjh66cwuw06TKNdCzkD+wHlY1H/lh5Lkw1Ly1tlRW hIFAjmjWdi49tjuynPQ7bgYxMJH2sCITNSH0iqaVlWhiyWFbBV/xMTmY6wm3pjGAyW5S7Y7sn1W 9UviDkV0QzmbXTtujHjh33Ra2QehNDrMvOc1Gq/gxMRM0B1zokigYAioFayFjEZb0OVIFCrRqOA lHaPiqmrfENJ9Zpn38Q== X-Proofpoint-GUID: KOhUTc8FxrsiDAMzNAfxGMN254U-AHNu X-Authority-Analysis: v=2.4 cv=eIkeTXp1 c=1 sm=1 tr=0 ts=695ea2ab cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=gsP-wGJUQ9tQerkYUh8A:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-ORIG-GUID: KOhUTc8FxrsiDAMzNAfxGMN254U-AHNu 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 malwarescore=0 suspectscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 Implement the clear_infoframe callback, disabling corresponding InfoFrame type. Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- 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 18:31:07 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 4353F3570A4 for ; Wed, 7 Jan 2026 18:15:09 +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=1767809712; cv=none; b=D/G/7edEnGgzA6c52bLTyxfT6R6GVejc+WwVGofHIm8VLNe5ft2whPemb59j9q1KQ5DxAfZmKCtWDoQVxdGcfziHh5ieL6dB5kuf3CqM/o6+RJPrBR9UlarGB7+7Hda/pMJKawBmLVjbfZseMG1kJ7OqwJ9Ll8fCYuPRPFkLf+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809712; c=relaxed/simple; bh=i9/GyfQ7oCfW1uA2EJ42B3bpRaDaBcnVtDJI1DBQZYU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cyvTOWM/uT+n5s39HHgForE9LJlfFLrGGj1BppIERs/ffeaYg09Eg/IqZvl68ClhVq/cD//356sBDSOaGzBYjXujbNulcF61CfHo5ILNor+/tr1f2x+bFNT2wba6LykAdVcpLVzB/cvDah9gYLsRe6hI58cCxo/oKBcqF2fneLQ= 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=VTI+JdNA; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=j4jM5agl; 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="VTI+JdNA"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="j4jM5agl" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 607H5ksW2454339 for ; Wed, 7 Jan 2026 18:15:09 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=VTI+JdNAvshkdlek Yfh5hok2VL+Ruv93fw7t3nX3JTZAOcnt9yVVeRWzxIrMrpZlkehYKArntaZh4Dhs py6Lp/1rh389bEb6TO0Y+qlxVSCg2M/0T8nIrcc9kP8/orpoqquwDZOkto1AWxb/ cEICWw743ZtkcFMhW8qvlQ9DH1/Cd1MfDCaYRGvFcInihEn1//0v7/KskZESWGo3 Y69JP2reux4mxVQZ3r0Lqk9ULcvavssUs4wagaNQHwAX5YaN1Dx+U04imhGQi0iP 4UE/I2Koa/YNC1rzxkWL1UO7K1dW95kL0fNUN/pRltO3ShXQHw2WkytmT//QMryO taMxNQ== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhmnbhpth-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:09 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-8b51396f3efso455062985a.1 for ; Wed, 07 Jan 2026 10:15:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809708; x=1768414508; 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=j4jM5aglQJ0ReL1JEzuvljRFK7eW6wJjhE/zm6Bz6oUxcFe5c/t5O5DDgTd0ZIXahh 0hvBuaS3DqTWZ82rHCzVmYuOO7K9u3XnqcAhG8QKmnUi5jZJY6s+bJZaLcwY9HDFlJpJ jpFx7dXm6Ez4waNFxqA5p8+yZF7P/Ouhrsp88MRVwNZ85g/jRciBW/xhOa9MVt1NW8iE Nu8No1s7bY82oS4PUEIGQxBToixKpRjVDl1tdbWQb7cTpMJJkJrdVFIpU6G/TSa2pHDq GPxsgk2BDTtYjdqNXy+UvQOtA8Dl+sSQMXDzc4UX7Wbzm1gE56drTPxGMXQ1GMvocf8O 2bNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809708; x=1768414508; 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=H+S4rbAWaI3I0HjwpuLb1DlRhBDsE+DR+0TVDga32oqxtYi2a+NumiI1bRz5BiVq1f ZRpseaUdgiRxr6ydm2gXYFU4HtRvJNnG97rufqM9KQ2QZz1LVkh3esskd24FJ1bK64Cc dam87iq75ztT+ze3CZwzomTu0DxwY9j1xH0rRJF2b6mFCXpUHAQ0Iv4iy/6bjTxv2CD1 ElcwmTW4o2QfrHWRQDrarrRIkYApduCx1adXl5KhenDCJjxXAZNjyMhjtCT41mp5O6oL unl3wo92yNi+zgnpEoDApcbwrycEK7l3BhmTMmHi+j7f8R8g4ZVAcF7AsplL2+6Q4G5U oLLg== X-Forwarded-Encrypted: i=1; AJvYcCWyyxUtyTsSP0CCPFjFxHOuriLpmNGqBYeItcYlXRI27l54qGzKc76uOdoNRdsM/YqRGmthQdLNrj+jkv0=@vger.kernel.org X-Gm-Message-State: AOJu0YwHNgmpNGAyzsA0GaE1zdGFujP+aWP+5qKyUsoqigJvPfELG2pZ +U85cMxJcB/Hok/UXSQsG+ALXp4Z3KVCfOHg3KtYy4YsPvhrnUYxSuPQRttr5hux/maDLPrZMKY hFZ7vvdIkMMBCTj8x6725VbH1BqlFLe+sBdom1NeLVzEGlYPFDyEuzKeDM0z72GU27KA= X-Gm-Gg: AY/fxX7vedltdaWWhapaeVd2C6Ep0Uituy7sQp5zg8LKMvqVWK4PI5QRy/C7vfrAVip +4mj5mKNk4uFw41+u31iFeF7upoq/DE7EscHo4PNZ6ci14sBt64evb90gZN21/kJ52jbIbHjRkN kOWAam612NTIEABeZCCWFcn0XieqT7JiYECawXd9MDq/5n8ro6ndWJ+cUoBiyODk/3+iIwc+3+R nBEebHoL8htuSItLx8XQoKWo38O/MArs2ypL93i8ipRu5CRCUBUyp9FIs3DNXd8Y1DcDXzHlR4H +/R2R+AHIWFoJjHUjhVJYBZglNFRZcz7uthHFzSR+chc3lDMroc7vJy0ib6Tx3zOWFJK3dScNBQ eNnnRFLvhLGOww2blR6H8lWCVn9zK3u+MKruD/HMu1FutsCwERbpi97ssbIWJeRFbT/YXgiCrJs Jz5FMTqBqvMxjuTWvS/PqY2Hk= X-Received: by 2002:a05:620a:bcd:b0:8a9:be12:75cf with SMTP id af79cd13be357-8c3893f7d8cmr453748985a.61.1767809707679; Wed, 07 Jan 2026 10:15:07 -0800 (PST) X-Google-Smtp-Source: AGHT+IEQiBI0nmEwHGDiwmCMtLl/jayFaEU1m0Axo7cKoiE+2HfeOqOTLbx0TrveKVWGZFW8ipORjw== X-Received: by 2002:a05:620a:bcd:b0:8a9:be12:75cf with SMTP id af79cd13be357-8c3893f7d8cmr453739285a.61.1767809707118; Wed, 07 Jan 2026 10:15:07 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:06 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:00 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-3-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ2bcoiW5J9/tWb3J4tHugrKAs3JeyiZt4rWpsWICpksuC jCtyXnbyWjMwsDIxSArpsjiU9AyNWZTctiHHVPrYQaxMoFMYeDiFICJiH5k/1/oclnK/Zz/ja8L v6t7HOL18cg1yeBbaeqq8pOvrnf+XBOj/s8szY+lzvBERUkLGakuejhjjs20u3oewa9eNacmbZf ZErVva/T+iCPe/yKqIoU+z/jzp+2KV28zo9cVjnoraUd13pIVM4oiTrkH6U3OTdOSsJwVt8L5h/ /T3zkX1/bOvsVXv8vj+1+jxyrXD8c0ec7+2mYVenlOTuTBvsSSQqvGuY38Xj3Tv9TeX6BzUVOlc 4rNlrpcI3a1MhGFq3s68l8oMFjf+RBpdHu3yN9MrYxg6YlHexbMklnWv1mXiTVGP2Lax/1P8qs4 j9ptzHJSW9Jgcn/7ST4zM4W/whffsC+fsnRj8rbPKZ+zAA== X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX+/uikrO1BgtW kBheya76MuWfp92sqxlUzbUnli23fOwon9oGFqd7XS0ytML0d6AV4FyNteAe0bL9JNEIE/ScIzt z0EHdF/kRfy5yTpXK2bzLcJVxeku8xECvwK2PXVKA2NVAwwsyaIHB0CwxZk5d7+yLGUiebxcRim ffRsjX0zdXvzVyqbvRV0N7MWR4RENVnunZ0bqx6BXB6pHlqS6HSjCduZz3yeIsjSPkD++BYzJCU bG6PmAVZAtXFJ9Ss+6SfqSsXQ5V50xpmNjcXZZ8drbcuB30+Xi6axsrP10o+h0j4S0qgLm7aJPL lfxz/TQrFGLr0SvczXtThkkJQpmY7SQARI+YUTpp1r2OwZs4HC2BzyQsIw2uCYkYL3M6FQ6ESMw dTCVNpoqrTkmp3ifbZPjm+sW5YN83jBZgtMrGeg0upua7i8eQk2dBV+e4KTkW/Kb4mUmAi4OiFf 0qsdl52Nrf61KXFbuTQ== X-Proofpoint-GUID: 5yRvGLQxMkh_Dp3S3hLmE-XWx1jS9j65 X-Authority-Analysis: v=2.4 cv=eIkeTXp1 c=1 sm=1 tr=0 ts=695ea2ad cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=J8re_t9gDAGCMx8MSDUA:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-ORIG-GUID: 5yRvGLQxMkh_Dp3S3hLmE-XWx1jS9j65 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 clxscore=1015 malwarescore=0 suspectscore=0 phishscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 In preparation to making clear_infoframes callbacks required, add a stub to the sun4i driver. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- 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 18:31:07 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 0458E3587AD for ; Wed, 7 Jan 2026 18:15:11 +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=1767809714; cv=none; b=kMCcgIvB770NY7Y6aJZ0INQTd+EIFwUvE5Ri2C+wMbTHDMFi1cuZlSgOIjuPl9REAeIxAOJ5VpwKAa6Qs0tmaow+8KsP1nHoyicrCRRheWV+TOSZ6cyHSFZ/wYMDhytayBz1v3P/wq8F8VPPU/4Z796fek7SHWzZgUEjuBgys/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809714; c=relaxed/simple; bh=LT/feZw0CtZODegcFJ+4Vz9a++4eaSKUzh1MRBMJ8BM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Gfem+6i52K4qW1YZZbpyg0K6ZoGOS934GYmvJ9meuxAJn8WBBGWHs4NiNA4EQBfl228oVMaHidQjTnEd9WN2+edSA5rqQCrxR/GhJMoyy4n0+dmDbK4HMT5ztG3/ers7A3ex/iWrJop24x2Q3PS0jBmHe4jG1cv3eL/1HwbG88A= 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=Md2Ezqvu; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=eF8vknuZ; 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="Md2Ezqvu"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="eF8vknuZ" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 607I1Dk2218380 for ; Wed, 7 Jan 2026 18:15:11 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= iDMa/3+oiy4vVFgOo69jkSU/S1Hmln8yfU7tzvohWvc=; b=Md2EzqvuQa88+NJo eO9CT6W6zNA2/mmL8bAXb6GdF2TgbDZwRiPcGhExvC1k/rcBmLe+40l0vu3MF44S QoUy/eggghWay8HBTYciFmcK5g2Aaf1FDZD9rolR0ZkMC1fbK/4XwkN295/ny6OD 7Hj8ZpUvDJbaSgxgOTfCtEZ/BOyzVnuN1jYl2TiJ7O858oy/50DcJLZtCL/98fOS wCygVIIJJAKqG1PSF668wIDMDoHtjoc5LvKMAp7ude/wxjONNzUeXjIqQCv44rac XA1DZJ9KsfhFk550JzlbWRLh4b1Kazpk8gIsV1iwDBjhCZWAHHgTWxHTv9A6e2dC QiQ2Fw== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhn809mgu-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:11 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-8b24383b680so927359285a.0 for ; Wed, 07 Jan 2026 10:15:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809710; x=1768414510; 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=iDMa/3+oiy4vVFgOo69jkSU/S1Hmln8yfU7tzvohWvc=; b=eF8vknuZERuZPFoj7N71BxtZ32AYvLKWEVpoZu8KTuDPyxe5s9iC35r2NLQTUJqFWe 9woeYC1gQnMh8WbnqW5phq52aWuPyfpY4Aw3it2lPdgzBVYdQzb/iqdnrA8fxXk0WCEH 1jmZrBiHsWZVgF3xiLGVVcmV9G2lgoL5kYtR7H1zxXdV+TJM2pDigMS4SLIV71cOGCdS 5Rig0FZoc0BySRqzjqUpXruf4P19VTcEQPWPlstqMZHvk+vPpmtjZjMwouND+Zt2mvKR gfpj5iHRqOX9RFjGhVGrEKLcjIsJG2KrtO+OUNAtLqpQ17iN8s9CBnJtXEeBcr5uLxkP jw4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809710; x=1768414510; 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=iDMa/3+oiy4vVFgOo69jkSU/S1Hmln8yfU7tzvohWvc=; b=YdcWB9bFZ9p0sGaGKt9Dq4v3Bb3H422qSexRcZ7HGIfpFX5Db2tuv6vYzpzzr3Unzr BerVRWtZnTz7Z2+bkATTJzNotv5Lrs9pkuH4hN/EJWQWhylYILFobTwIVjqIjswbx8PU VV9XNBrEazL1LB2l9UrwvG9FqnsOxlxUzGwToti8VzUcs0mE89jvrI7Ea2jWtbIEJA1l TR7s/a/WOBtrhgyJBlXFMKTVnRNfok6YRAqm7MESTWrvFb9ibq9ysSrJJJpTGWuvdIma H6fDcZjNH4gnIxmJjhB7BC1OjY4hGTLbBI+5isHRrV/Pz3dYzD8gG+/e8QeFBvCVLznb zi4g== X-Forwarded-Encrypted: i=1; AJvYcCVerp7YRr0XJNmqfqgPTW4/+6lXoN9uuMPr265wtXOltp3s0hUbEsmXXDrB23+1iHDDSnKrFVLHZEZw1NQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwEmdzDQAZNN+1bte9CRsew7gsIenx/dAuUOmc6AFHG0qlZWb5K S5H9XodEy7LapVRjpMNMbofXkSMS4YC5zFVrOZzwArkSCmjQy56nfAwNeAofdZaJCPnhi42O09l 39XII4Gmj6iOi/X1cjiW9mD2oyn2EZyakZZcAlNl7qEW2tQC7k9zBf3q2zGCtqdCFwaY= X-Gm-Gg: AY/fxX457+aFn5mVWbOSy+u7Arhz16tEOdbBSE7igQz1OXzWPNz6wBmevek88fKW+gw 2vUJCzetgkW3AegH+SN4TjXUOp9qw2wmczDo/QjZ/IOh/1tu8UzCNQyycAI4zKUTuT5god6JXPI s1+Tm27UNBgN/3TzthDaWjm554lC7Qle9hkm+7efHOLjLmwI8gs/pn3flQ+Iw9tv+CY43yvVbHT ODKskwEiS6FA7zhX3tLwipKPzWn4jci1Xs7yrD+IVrcqFIqE8xkw9gYSPW3L/Qkc023BMxldpxY QG3s4+VopDG9acMUn4Ig4kSldjlMZIuHsAqtKF2OVHfL5nTdkSAwZx6oDvbNmneB5sKF24Z4hNX lsOfeVnikJ1k/E/avfaQQojtV0fz6t9qVKxoomQd2+3l1yBoFcAPCmTrUc7mkaMftHLto0AVyUr UeC4/9D8a41dlUl5lYFkYwock= X-Received: by 2002:a05:620a:284d:b0:8b0:f8c4:a5ff with SMTP id af79cd13be357-8c38939548dmr415673985a.23.1767809709973; Wed, 07 Jan 2026 10:15:09 -0800 (PST) X-Google-Smtp-Source: AGHT+IHNnSAiO2TN35uowVz5nUxPTarPKtrJKczFdjq8YtoRDL79CU00FYbWgXjKjI0hV5LSFGnXqg== X-Received: by 2002:a05:620a:284d:b0:8b0:f8c4:a5ff with SMTP id af79cd13be357-8c38939548dmr415665885a.23.1767809709293; Wed, 07 Jan 2026 10:15:09 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:07 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:01 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-4-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=5425; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=LT/feZw0CtZODegcFJ+4Vz9a++4eaSKUzh1MRBMJ8BM=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKkh8Uw4zR96uxdfP3B5zJVi4OZsf/KLRV9b W7ObW3B+sCJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipAAKCRCLPIo+Aiko 1b8ZCACVHXOVdotvxgogUT3C9rJjVAwz5C7cHtd38CQCrPUocd+kYKlETxwvuPGlVJvCHUeAM8X 5/dbL3WQ4QoPcR1iBb8oDv1v6oB7mJeoOsV/aJpocz5lRWP8NYncKNG1ePRkGEpeU3WHjpZqIFS kYhO2EzWmB1sJ9inh/CWFfZvf4ElzxfTYGmj/kCkM/z5sVjYqKRiqW7x7HsR8MtVNsWKFqCfk3V dVqKuC0OSU4IUdW2h3I1weh+JiTliULMhONr5eVnvaNom/JZ5QKI3oJK+lJB7grw4QWcRHvOVP2 EkMSiWdtnpNVOEWxdQ2Q6yJ+NQAxzjfP/bYkeyAmuPwG08rp X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Authority-Analysis: v=2.4 cv=OtJCCi/t c=1 sm=1 tr=0 ts=695ea2af cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=9fyoTQa5ixSHU3Y6h0oA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-GUID: OPsN2Flre-sTTOkYVMfNX7NOF7ZoSfde X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfXwvU8SD9/m6Sf HEFAI4tiX9M9g1v5HmbM3zIsNLE9Jds7AZclLN4KWCgJKkOKhIbibG0lppBTTnr8SAZXYYe/xJ2 RxEiZqVuN7esEU4QxUX3UZH+szxnANPWoX1Y2dG0dzZg7v7yIkNDwqjf+tERVgpEdreJYrJ/AR0 SIt0p68dMM/s/IlLLTPa04eFS6AXgYLEimOFRfzN4XNWfZmQmcELadmiBRWE2Y+M86mgNg+em0u wYQKPxBZOEeSuZWLYNJBEWfKBJXOPOvtmkgdkwvwfX6mEyItDIp2u8ryjUgX8yGmJR1CEldSLnf 13SDp/8FTQgSQ8ESKqJL9dm8owsHoMFJRS5Nlhfw8E+swLFHF3n1TD3X+B3d3BH1mrfkhj19vS2 dPN/623MN68Zk84YiKltEGRRm1R6yQ9Bpa4JHPfshzuvLonxXSp7+Q33YC524FvJbP4hkx+Lsvr +5dMwwuLMsJwc6Wb/1g== X-Proofpoint-ORIG-GUID: OPsN2Flre-sTTOkYVMfNX7NOF7ZoSfde 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 spamscore=0 phishscore=0 malwarescore=0 priorityscore=1501 adultscore=0 bulkscore=0 lowpriorityscore=0 clxscore=1015 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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(). Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- 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 80f819a9ff5b..cfa14a6eb97f 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -78,7 +78,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 @@ -91,6 +106,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 @@ -103,6 +120,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) @@ -2441,6 +2460,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 @@ -2543,6 +2563,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 @@ -2790,6 +2811,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 18:31:07 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 6E32335A954 for ; Wed, 7 Jan 2026 18:15:16 +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=1767809721; cv=none; b=aBU9y1UeciOiuLjTlL8r79gNjKxIR7kL+dUbybyk+3VLX/4olLUl0gesvDCCvsckp57hgbpx23IyH6GPiCtqJd8Rmerms6q8EY/IRrmpFaoHj9fOFAriGk3EUIWOkkDjEctvxtGFvRaLnYZ7Qmsco2CONuUMjNWGIdToyjnvZOc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809721; c=relaxed/simple; bh=rrAYuYRkoLgiZDcEXYJBgQ4P9j2sq4poijx+pmGceSA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gI7EVnDSXk+tEvs3fg00GHXw0372x72SqcQsHCK9tk6h+nkIWPRxpdLBqr44UjRL7eKjnK/3HKofinGmJLK0HB7IeG4a2gsZyvJW67bEAi0XJ5o9rHYAcmjzUgM/s/dUIEgQbShDTyCd8AUeat0V5U8ZQLYz7TwEEKGFlJe9m38= 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=ZQwobCkp; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=fLqrOONX; 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="ZQwobCkp"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="fLqrOONX" 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 607HpIFt2988618 for ; Wed, 7 Jan 2026 18:15:15 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= /G9oYIZxPHvtNlgDHuyoJcBPsfPtNnxLcd1dUJtcS+o=; b=ZQwobCkpTW2MdBiK cBSDmjNESFPC0lk+Ot4ZAVWIN/bSnuzmsbA4F2uN8J/GQsy8hcO9jNjNHs6g6zLG 5gZ3dJBpP9n0UhuZajKT+SEyRoundu9vt/qUnjFcUSnolLqEq2y6K0Is0GA3/NLT tZyppf48BtIr600EFVphrKgfiWKAWG9zJs5MBuskH74x9pnxtHSmERdXjSUYGTLU ILP8qV+uM7amINTT0Pkcuo6r5naipuJnFftjcvKP9VuDv4E0See5HRp9QKTXKGDE 4F+UBimIU7IV/TQZrx+6Wjb5KyBbh/RamvtahhRj/K5rz5HDyJjsnuAMHnBnOgyB QZ6OdA== Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhn2nsmhp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:15 +0000 (GMT) Received: by mail-qk1-f197.google.com with SMTP id af79cd13be357-8c38129a433so604512285a.2 for ; Wed, 07 Jan 2026 10:15:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809714; x=1768414514; 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=/G9oYIZxPHvtNlgDHuyoJcBPsfPtNnxLcd1dUJtcS+o=; b=fLqrOONXqJz7qihKLtW6ZrH1wjSaFPDAl/W9K4Mv8mDObeBXBZof/BtKrqfiVxWCuD JRJp1hpSeUIuJE603zvfpufw3dHFNOq4ngXnUjXWzKtKYRc1N+LR1MKpG4q6N/eSUNJp xIF5oDpBW4sipl06aU14cD+FphI24HdZQZ+7rgjMYocrps+I7mj7IMFtXMuyyk0cxhHv Vx3omxLoCI4sz7N1jjZ7Z0+zsw/e3t+r3kk87qIRUt5fNJknLI9nsnakj+G5DboQWt8I YIy2yb0bJYH3OG34RhcYrpVvN7W6pSR59xZqB0CoC8dnZnlepHiZcgjx66tedMimk7Le Ux5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809714; x=1768414514; 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=/G9oYIZxPHvtNlgDHuyoJcBPsfPtNnxLcd1dUJtcS+o=; b=vUdqHXrzgauC5PnNIBQNFVKAYqSJySRuR+L8Y9ak+ShX1TDAfeTbYC6+i652lPEqYn OOzpNkwWCZ64foykfn1JZKPirZzxCfPNqtYSQkirvfROsdJEbG8KT4GdgW3o5rkpZbnb NS6wRZYoW1tUqpHXvIq0PyuGqZ5q4zcdJtmSpQiiwdVLnN4oyDA/4ajsNqrPy7ZlLW/w ysLfUJHQa4eLAWPpVrpyboy9WnwFFm6ARymWFEIP+ywOe/WgNAc181T3ucP18BQGOv8k 64dVpn35zmLke9M/w80tdL2IaQk2rzVeE416LwnPyJWKJweJtxJQdI9P8ihcD2GZJg5a 95VA== X-Forwarded-Encrypted: i=1; AJvYcCXTg0CzMORfmCjhWJMLCyKPRG+CdnOVg5kAObcNVQb0sRh+qK9uclUmp7IOtjQV+yJls/XwS8U0DiLxbPI=@vger.kernel.org X-Gm-Message-State: AOJu0Yz/GJ/wqgPq4MSF+Og9+YhEsNzsIC5FYBAxG9+rWJctd5C6EQ/A kNBoMi2s1Izc0vk6OaoMT0WhSCqXhBA8PRJuXgxIsXldiyCEo53558dYNCy9woh4JKALjB+eOok qHS5EZOesVAWLq5uDHYi8TnyPXXcdCqCcVaLaPwcAQ46kSPtNMIvxniXzkIOkWqyYgCY= X-Gm-Gg: AY/fxX6zGcLvDVfCqBu6PRZWxoNqBbG0OxUo8KC7qo/O5Y7mNkeaUyknLnUwPv+hcF3 tUNXNNUE3nNkgOdFjVaWoDC7OMwAd64U+mjQOAhmpRh5BkCQukmqHAjIa+2kD7qJe8TDU/YaN82 X7xqLfJN3cU/X3TPFqc4seDTszWRuQ+YPv99wgmNU2KYQ9uD5Rd/aXggjv8L+JzQYEXbzZUl02Q syG/SrEbbRnKgvjraArZzYDWdlRekiTyP7776Rt+KATBRRtq6/8neoHoJ1pw8gmG5bYtE8RECMf 3Iasf0AXwkOy05hLfrxtAPG5rSZpPTTZayRCgP8mPq7rCnQi3GORZP+GdpHoDiU7Pw4s/o4O9pF auz/SOqj4dYrgnARWTwRJu3pd19CDVYqLD3HRU1LU01CIJwr1h7uFUOUNvaO9cnTetro+Zoy30s aCG5m91W52pz+ZJuLEPdAg1Lg= X-Received: by 2002:a05:620a:40d4:b0:8c0:f13e:42ee with SMTP id af79cd13be357-8c389420351mr442724385a.88.1767809712395; Wed, 07 Jan 2026 10:15:12 -0800 (PST) X-Google-Smtp-Source: AGHT+IHBRowqaOMG1FOaqGi9pLMNYxVafY2/thMkhgmNvOZZ083Yq6iefukoR+kl3+0wFUVHPYuSVg== X-Received: by 2002:a05:620a:40d4:b0:8c0:f13e:42ee with SMTP id af79cd13be357-8c389420351mr442710385a.88.1767809711036; Wed, 07 Jan 2026 10:15:11 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:10 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:02 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-5-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=59639; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=rrAYuYRkoLgiZDcEXYJBgQ4P9j2sq4poijx+pmGceSA=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKkEZbNZ/Br4hx1XBX2GgPBWTb5SY6twy3gh XbZk6d6I9KJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipAAKCRCLPIo+Aiko 1VwMB/9sl/uLZB5vpOyqv9+DWDFFLjZoLVZME2yljS7sx0rinb4UEdksU9xR3QKb/D2OcsS9g5e GlH/bvxyFUj9cfGEtSJOW8udZAlgl9QU+pC6ZjeBmzlYrkvpFGYk2lSdt3ILbSY+Y2PPLLL5PTH cCsCKCumyB4sIoDVBdxubiGMo/Qh8n1AYm7RDS/8x4VL4TrYIcd5hhiVSzONg8egGqEWo0r0T/T usq8dVMwmN47s0YAP5yDVi+irL2PMe/PKZDwTNJrDuCl3FELqpNcVuzqvlY3GKTGcGyil1LfIJx 3yW1Gz9Oktxu3vnScRM1iRcppsEpdL5xHbEThO42FyWn+Z3R X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX6gY/CwXfinQK 4R/XB3tlTqvv5B5Mv5WO4bNNvrKzD6QJh7cvzMERxuFrUKJBGvdzDWdcWnrk+IzQyrpCcvjWGPl m/XU5uhbqoTiavztQt4RSB7lizNOy1atzX0ls2JufRwIU/ReJZ0ChRFn8lGRRtodBLVGyvwHuUl eNBRqvQJOVnJMCuNhz8YN/WMSgw7Mgbv0BxakFvREYIMINrz4CXmiKsZdH3+o7XXReGN4SAvhPT NfvxZw5SFwx54ZvkMJKPNe6RT0e7+XdR+c4nKpj7pNUUuZQgA85O4L8oQUj9TAJbl/JgbpcKIVp 08ae3yi1k6lMSFhPyQoaTLmGEQFNXej+6VCPUcBqjjcPs91s0fAUlvopNWz1/p8fVFaHhom0yMw ErrSdcMeeV4bp79jxoYeSfiuASRs8dzM0GCvoHxpJguA3fv4sAyO5l2vMvu+VzQtI04Q9HJQVXl iWuXBIdTiL0eQ3HIf7g== X-Authority-Analysis: v=2.4 cv=CYEFJbrl c=1 sm=1 tr=0 ts=695ea2b3 cx=c_pps a=50t2pK5VMbmlHzFWWp8p/g==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=GAiaypzmODBVVc3kIZ8A:9 a=QEXdDO2ut3YA:10 a=IoWCM6iH3mJn3m4BftBB:22 X-Proofpoint-GUID: 0HVwjLQm5Zwbre_JSJ210YdI-ueV34Xs X-Proofpoint-ORIG-GUID: 0HVwjLQm5Zwbre_JSJ210YdI-ueV34Xs 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 lowpriorityscore=0 suspectscore=0 clxscore=1015 impostorscore=0 malwarescore=0 phishscore=0 spamscore=0 adultscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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. Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/bridge/adv7511/adv7511_drv.c | 180 +++++++++++++--------= -- drivers/gpu/drm/bridge/inno-hdmi.c | 41 +++--- 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 ++++++++++++++-- 11 files changed, 705 insertions(+), 421 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/inno-hdmi.c b/drivers/gpu/drm/bridge/in= no-hdmi.c index ab4572eb8395..a26b99b101c4 100644 --- a/drivers/gpu/drm/bridge/inno-hdmi.c +++ b/drivers/gpu/drm/bridge/inno-hdmi.c @@ -584,34 +584,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_bridge_clear_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type) +static int inno_hdmi_bridge_clear_avi_infoframe(struct drm_bridge *bridge) { struct inno_hdmi *hdmi =3D bridge_to_inno_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_CONTROL_PACKET_BUF_INDEX, INFOFRAME_AVI); =20 return 0; } =20 -static int inno_hdmi_bridge_write_infoframe(struct drm_bridge *bridge, - enum hdmi_infoframe_type type, - const u8 *buffer, size_t len) +static int inno_hdmi_bridge_write_avi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) { struct inno_hdmi *hdmi =3D bridge_to_inno_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; - } - - inno_hdmi_bridge_clear_infoframe(bridge, type); + inno_hdmi_bridge_clear_avi_infoframe(bridge); =20 for (i =3D 0; i < len; i++) hdmi_writeb(hdmi, HDMI_CONTROL_PACKET_ADDR + i, buffer[i]); @@ -619,6 +607,21 @@ static int inno_hdmi_bridge_write_infoframe(struct drm= _bridge *bridge, return 0; } =20 +static int inno_hdmi_bridge_clear_hdmi_infoframe(struct drm_bridge *bridge) +{ + drm_warn_once(bridge->encoder->dev, "HDMI VSI not implemented\n"); + + return 0; +} + +static int inno_hdmi_bridge_write_hdmi_infoframe(struct drm_bridge *bridge, + const u8 *buffer, size_t len) +{ + drm_warn_once(bridge->encoder->dev, "HDMI VSI not implemented\n"); + + return 0; +} + static int inno_hdmi_config_video_csc(struct inno_hdmi *hdmi, struct drm_connector *connector, struct drm_display_mode *mode) @@ -883,8 +886,10 @@ static const struct drm_bridge_funcs inno_hdmi_bridge_= funcs =3D { .atomic_disable =3D inno_hdmi_bridge_atomic_disable, .detect =3D inno_hdmi_bridge_detect, .edid_read =3D inno_hdmi_bridge_edid_read, - .hdmi_clear_infoframe =3D inno_hdmi_bridge_clear_infoframe, - .hdmi_write_infoframe =3D inno_hdmi_bridge_write_infoframe, + .hdmi_clear_avi_infoframe =3D inno_hdmi_bridge_clear_avi_infoframe, + .hdmi_write_avi_infoframe =3D inno_hdmi_bridge_write_avi_infoframe, + .hdmi_clear_hdmi_infoframe =3D inno_hdmi_bridge_clear_hdmi_infoframe, + .hdmi_write_hdmi_infoframe =3D inno_hdmi_bridge_write_hdmi_infoframe, .mode_valid =3D inno_hdmi_bridge_mode_valid, }; =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 57a0cceabd34..d38519e3923e 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 3e6cbfa9dc44..73c23fece792 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -785,29 +785,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: @@ -1063,7 +1147,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 @@ -1075,6 +1163,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 @@ -1106,6 +1197,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 18:31:07 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 DFEC435770F for ; Wed, 7 Jan 2026 18:15:15 +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=1767809719; cv=none; b=o5NoRF/xukE66ZC9e/PpYVauVijTqa/47BDKSVQlX7dsMFXQ9KtpF3D3fB8XhapQ7XMehe7H/RIR9LsGF1UI7+OU1lMplirgfTZPHDJB+4lUdkalXtkVfVNiPUnUuRdBv07Hewo+dqfB3Vm0LSChZAkSNHjYQKU+VTTxQewopJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809719; c=relaxed/simple; bh=h+8kSKyyCVYvuPI9clygzcqBDU+O9Zth6ETXqpeby+g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dYkhjv8frsNLGJ6FCm58CbK8aflZUY+GVpdgSbt1TKevy+PTx1yAktMLXJIPRVIHiOd1BPZtDlXxpaZPUTwOm6+VP+snjupLCHvohwJFifNJUFO5gKKIgol8HLXtCTlmkMPeYs0vmN/Igtc7W+QOi6DJBrETSHWEsdRhFZf3wUc= 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=k5gYSI5I; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Totbu+iG; 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="k5gYSI5I"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Totbu+iG" 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 607HVHnG3890315 for ; Wed, 7 Jan 2026 18:15:15 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= FuvKMsYdeHCb+qiex5eN4gaDeI4nVkcPpNxIVMGnEFs=; b=k5gYSI5I8dYAg17d fM5dOuknFoyC2v0PhhCcQJy5+WYmkaFXDf6UMm2EZAvqWe4PeRQlmErsiIPsumpW in/oAbaL16QkUWySHp9122buDOe66yeR+FWY2W9pm1pyNMCL9XIVOxw1jiXIy10Z b2rFMNQDtpmySyLiiWrz/ovTSBcd/EoniUTuKfFtxmoPje3jymd0OVP/TOQL21/8 DR0aQJPIw7VvRe87OUkIAwv0cY7mlToaJtoxlnrYab9Vb8/BrU7tiYHoykcYN+Ey 3QZ4a2nrlQ09bXti4056YjQbVoGpM//9sWpUq2cuGSYOu1QovfEpiz4ysWexp6sx RWp74Q== Received: from mail-qk1-f200.google.com (mail-qk1-f200.google.com [209.85.222.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhuy704s1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:14 +0000 (GMT) Received: by mail-qk1-f200.google.com with SMTP id af79cd13be357-8b2f0be2cf0so259914685a.0 for ; Wed, 07 Jan 2026 10:15:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809714; x=1768414514; 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=FuvKMsYdeHCb+qiex5eN4gaDeI4nVkcPpNxIVMGnEFs=; b=Totbu+iGlazpiUf07yyH6sGSoLSbZTWjiNCUEooZEn9FjFQ61beYRWuDP1PhWvp2yh 2MFmmP3d3Ehry5b2RpHu89Dy0ySQ+RnEkFx33g8/5Vv4ifz82aN/tIvnRIzGVL17YlQs pgzaa8fg6Buz89N2ExniNGVvG6txCv4eT8dgqLmWnWsfte9dGUtnPnwFnCgnO9TvXyv9 iBqVoqIMqN8LcPoR+mozT3S+BB2e5nH6Y7oLjJZRWYQC7xFfHQr7Pz/CiVrr6DsXaNW1 MYO0DVkszg1vRqlIelnfZdzcnrEwK8Txtr1vxAj951mu1wU/frFOsLmugHtebNQmj6Ax h7uA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809714; x=1768414514; 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=FuvKMsYdeHCb+qiex5eN4gaDeI4nVkcPpNxIVMGnEFs=; b=peCTQex0MAIBmvTzWpHSphk5UmXi/zq8goK8q3ZGSj4yIAR8XsCBg6zfYGyAvMcRPU ThtYgZR+JKSjV8DK310FO+qJ1Eh25qqbYZJTg9FecSbAiYZdVtG+wMqwePNnaCW+XyGd du7T4UdKB0Rl/OHuyV/1SURZKUrAvxhfYSFAt90g1sKEKkUMJjyDdaUW5Z4wg2lV2Fah dN6TNwEXIAZMl0T4C40LY+jWNNMlSX664s9lCGQ+TS9RPf3VyL0haV7z9fo9CLPbOcDh SAOUi1HJJmkUYsSr0M5MVGel9mlwTov9nbjAeP4WU2bOLAQIti5NNlVqxOuZMknvd5R6 xY3Q== X-Forwarded-Encrypted: i=1; AJvYcCXbs43g3JJjebZtUak94fUip014yYgpeB6/3rFP+8p9cev2Fx/hkWUZafnHPvsFGQwMIUVcQB89Z7i9akw=@vger.kernel.org X-Gm-Message-State: AOJu0YwDFFowMSDDe4FNUtdaHjcJDml1xAIuyv8z63BCk/PWO9dD2tae BI5TGel/mS553Y5tRJa0Qc/gitk40Ia3nvyvukjXxqO4anLS57/+SkkIkWUspjEZ0Ws3oj8U3jw ChE8A+IZMtL92anlNBVu5hng/Md/8avJeEfuxA/U5Zv+TqaMYywdxU4nx/b3FqBFb93A= X-Gm-Gg: AY/fxX535K8NIpC+mkJO5N7OPFJgrxY0GBzQsA5283z2wGI558uAinbErL4bEB9h9Mb /F3DO17Rd3h8aEP3XWyGTms9wPWthuVIj1R0i82ewmilpgS+Qpl47e0KwCRdYqxSvn15iFIonDp /DMhZSfjHXXR4iLFyt46yiCWNWA31WoDA8eXbOsu8DP+6el1CLei05e3TF4eDq471DKIOU6SLQ1 JI6tNKxXwyyjgVbIdhlhB28Pyik8nDwhpzdcs0BSb80O1enrJ1ypAZNH19acWHvyqBRtvTXrFKc Cz+Oi6+nDylio+BL9NBFqgOYEoAQRcBKSz8tREOXT2Ln/Ov11ZLRU82EQ3yKDz07RAJ99dNSfHW 94pIy/hguGBxwmjgInRdjnIg7Fn8JxQFpIfBjbYgHR14tKQ8y1r9E7d3RN2IMeZ3t1CWU92DmZb 9n0O8P68JyIOiIsgL5HH09eXQ= X-Received: by 2002:a05:620a:698b:b0:8b8:dd7f:f032 with SMTP id af79cd13be357-8c38941bec9mr417352085a.78.1767809713454; Wed, 07 Jan 2026 10:15:13 -0800 (PST) X-Google-Smtp-Source: AGHT+IHoPBA8+usgh8WzBjQcdgLKsyd4pGWZrSMVrhAynD9c1OqnfO2wCskwOefNw7pH9SByyRIHiA== X-Received: by 2002:a05:620a:698b:b0:8b8:dd7f:f032 with SMTP id af79cd13be357-8c38941bec9mr417342485a.78.1767809712676; Wed, 07 Jan 2026 10:15:12 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:11 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:03 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-6-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=35452; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=h+8kSKyyCVYvuPI9clygzcqBDU+O9Zth6ETXqpeby+g=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKkW8YHXV5Ify/ZnGCs1fh2rPNCIYw+Hww1v 6TTYyGVo26JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipAAKCRCLPIo+Aiko 1XMACACCiORH8/VxHuARR4jC9zTWC4weknBPdzh2/dczrn7LnTslSIwwzW/YqMKowkAyvx4QZL4 Kb9P3cbOnPag/CQdL1Q3wUxPvZMXfhb8+607lpgm2mUUyYvX/zHZrCfzWqQLk6JGqwz4zBg2NUj ov1WzfAwXe/UUbwjf+QF6GX4MbBhopo7f86SYAMTe3Fizo5s+4a2jSzeyJxdRGN7WHXr0gSypg3 koy7NKvt0CRrmph4Ov0bc33YNOeIIk08bklKxwzRhOdynycd+YLuete7Jnneqhf1CD+skA7GY9L aKpqoR7OgtZJJm7LITmUXvLy6CBc0SFmJdjXZp3oj0cDWXEB X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: OehOVeXfIGW_BWJ-r2j83TyBn8oAokVo X-Proofpoint-GUID: OehOVeXfIGW_BWJ-r2j83TyBn8oAokVo X-Authority-Analysis: v=2.4 cv=DZEaa/tW c=1 sm=1 tr=0 ts=695ea2b2 cx=c_pps a=hnmNkyzTK/kJ09Xio7VxxA==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=bATBssBWj1biXikgvRQA:9 a=QEXdDO2ut3YA:10 a=PEH46H7Ffwr30OY-TuGO:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX3Lx6qdVdoXNl qcTSwvqpVVgl/YW4lOghKV8fIv8Qu5njCSTQLkkJ82Sf6vDOyTd+MrLq2e2iX2AGGDAi7WE7pC9 SDnKhjzsCcy9gkdso3hqq7HR464FlmX31bJTEIBoqRqpRDle2m2rgRy7MQ65oJg4FGlEYJev+6M A/caNekEtphyTUJwVwL8VNQAxFIvB3hZUN/oUDlBIiCvKR67UfXPcsxMZB2nOReajCe7Wyu/ULQ 3r7vnJhJ9bMAIIzFz/FEmF2Z+/aKzt4Yr+Dlv7D68UzojxvRyBjAzu0/FT874bolFobOQqfD36F KNuKf4Us8amYNdT3TpIn7+FPxqJ02cK1X6cnizYlB4qKfRqxPFgXP3xQPsdgcyeGkmdGCpkW/4g gg/+8VfFUntqSFtOoZV6CbIozzcygqTbGqihNaJqgU3mh2fzx+i1I2yCKl9pGcQaX4PvEtgsaPf fMdzc1I2bFX0gPi6xIQ== 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 impostorscore=0 phishscore=0 bulkscore=0 adultscore=0 spamscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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. Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- 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/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 ++++++++--- 8 files changed, 455 insertions(+), 185 deletions(-) diff --git a/drivers/gpu/drm/display/drm_bridge_connector.c b/drivers/gpu/d= rm/display/drm_bridge_connector.c index d38519e3923e..ca6a72a4cf80 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/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 cfa14a6eb97f..1c60947a13a1 100644 --- a/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c +++ b/drivers/gpu/drm/tests/drm_hdmi_state_helper_test.c @@ -78,22 +78,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 @@ -106,8 +110,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 @@ -120,8 +130,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) @@ -2449,19 +2465,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 /* @@ -2552,19 +2570,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 /* @@ -2800,19 +2818,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 18:31:07 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 DC5103557EF for ; Wed, 7 Jan 2026 18:15:17 +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=1767809719; cv=none; b=j0dhWVizFc2dUqNQAE6HFS1TUonDU4Nj8nUTLv20r1g5pjWak1D9OqPgHHRbxzdRrkAre+crrPMEZh9Kr4elAUdRjJUaXiDht4up9/EmqErNHEc5EIfU1u2uELFKl1ezoCP4im7WMieGUN2mqu0S1O7IwRi7KJuSTzzj3F3/76g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809719; c=relaxed/simple; bh=oV58YVZ6PqGUocr9XjdKTVXla4jnp1WcJhUj/fGMzJo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Jv7LmOvmHgZC5VYA3oV54eGy3k++bCsx733vqx3JCqUJ+uhfZVcta+h6Xm4THBSsH9qXCxPTZFiDVsujSFvHSiFE8ce4jhsl1juJXDxrFYf5yu3jE0ch/FbSvmdFMOmRNrvD62N+aVa9rr4OVy7/bY2slfSYtYxmE71TUs05uJk= 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=KyrngcOK; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=TboZ8NVX; 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="KyrngcOK"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="TboZ8NVX" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 607CsQnp2239346 for ; Wed, 7 Jan 2026 18:15:17 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=KyrngcOKBiSTWSSY izNCCazNvrE8uikK72XmK+Vv0T/Usx1TJnGEi7FoeFr+BCAWxFn5GM7sB7rkw2+R xnkxDU2giwWfYxFgRXZm77sSilAwW+XQfLEnbHeNL5YkgC2bF8pOS/2zY6D1p8zU ibMfQnY8buGFHBKi37HBa7fzog69JpxFX/4NuXpuhM5+I5jdzJdUKlQP3QuW94x3 bA1Uys7tKjWqj4sgvnKSkAfyCHp53cZhkuDxbTa5PCwLUHtNBOuNyxLNwnzd34Ed j7PZBZxB2W5SxkdUVH/o8ptaf5HAjEgqZZJHE5EDaujMhMdI9SLzwqRb2mU52Aea CfoW6A== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhqwg12m8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:16 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-8c1fa4a1c18so565806485a.3 for ; Wed, 07 Jan 2026 10:15:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809716; x=1768414516; 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=TboZ8NVXV2Rp2Qw48lXEHKyoKNHdKvVN9iPSXjW0o2sDkjE0KczFOygqkccMLAuujD HdcewLhwzJ6h9oO/Wb9b0B9U/RWYIuBibMX9gOJ2IW9rh2GjMH8+nZ3ZmDkj2acBMz74 r9dh6b3s3/Y2jeAPsSDWeeQhEyXhIqLeNOOOZkEipBDFyCh44v4Elsdfarn1/T8MpBKm hl/m1p/RAiJw3YSxJLMNRYP6tOT58NE85Lem+w/fWyskBeXdFqwap3BzovdJ90nkwWpw zSDSsQOa23wdKx8jD99nXp/33CHsdAC3sNd4B6VcqeUaHSVzn2igjZmzkkVg55+UN3K5 uZ8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809716; x=1768414516; 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=cybUOQuW+kYKlbTBG6zLYyy28cqqRNkJX7CTHT+HI0RR5fTqW8CXR5rnzC8GlFhk/g ZFqfnnqayVIo2EQbZKBJs7bPgAOJ/kv6IlmnIAjqbBCHSH4NuuKLB8dUKSW6oeMn7oUb ubwO9rgNQU7Zh55isKBeTZa6jpZpR1anZLz8GAbB6P34ACecvNf3l3lqBurqPFxgoeHp 5CZVwEhbPT6Sq4EDv8K5R/Zo0QlSTA5rIbMUINK4ywGJVhz/fdgNmfjXvtyDgvvAyfuT tL/ntLh0fAmRYAFKloCJZJjl7xaJmEnVUyKk64EXKd+ZMS0SwYxaSjubvrGBETWkqS/Y pgcg== X-Forwarded-Encrypted: i=1; AJvYcCWoF8aLLrZbVSC2oRkKRBFj0EenFpouA+f1BuEENmjZ+GDcBAhHpWDWPLq72oCQvB9bg+OdIjwRp4Aw2ME=@vger.kernel.org X-Gm-Message-State: AOJu0YwEhaldIt6OunbAT0rGZIee34It96+Nvabu89o7t9dOh3Sv7qDP dhcf2bPvPzGvUO+XSuKpalSFGEgqgqHxK9aR0Jw7N50FV9rE/9OJTaZJSI6fxNO3UnA96ot4fzD JPAwt6qID2/TJJiR2uNKxm8o5EjI+MJwELUjIR1sHJwPMHG4X/cozLZ6sOFpjbP9wKeA= X-Gm-Gg: AY/fxX6sH2T/DFCs9EzwKZ9JQ5HNumQs456YDzGs+6aUkWAWBoHuApPg8ZwOvRSQVBO bV+YcqF8vkR/hpaB5Yfn6zKP1g5oeGl+ExQXK1ARzi9CdPH5CT4frdfvUppnpWd/xpR5E4+aP7i vF9IHuobQ1b649p9ZbU+IdkyovO7mLYk/6qdfp842W06JmACE1OCOfKIGhU9Up+xJqc+8jnXw1e SWVpDWKOQEyLzlV8ryGjOcigEvQCe5B4yrku4rXbfkY8LYr1p6xsfddvRbfK0UbadBaiUM5Xjur hbFduSXg8KWDn9lcaYtfNf59yL2nJrP4fGCu4FJKJkc2zuh5vpiEHStmR5X6DBJAnvlpQVmITUy jbGpi94lc2u76+acusxVNpGHt2Ixc60OlcMtS8eOJ0QUWYdi7Oc3Bu+CYwLPWsKNVRMCbW67duy ybNy3qTy8otTM7pP5ZWd79QnE= X-Received: by 2002:a05:620a:3941:b0:8b2:ed01:b65b with SMTP id af79cd13be357-8c38940dd0dmr456876785a.83.1767809714715; Wed, 07 Jan 2026 10:15:14 -0800 (PST) X-Google-Smtp-Source: AGHT+IE+D5mrG5EJMb00tLGXnGg/5a3iMwygbvY5+APGv4MWQpPpWnlnvrx9Hf8phdL6F9vP8GwsHw== X-Received: by 2002:a05:620a:3941:b0:8b2:ed01:b65b with SMTP id af79cd13be357-8c38940dd0dmr456865885a.83.1767809713987; Wed, 07 Jan 2026 10:15:13 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:13 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:04 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-7-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=owGbwMvMwMXYbdNlx6SpcZXxtFoSQ2bcoqVOypf3nnz7ysbV1SEu2HFL4awvN5mTrKSPbj51+ +HNQtvQTkZjFgZGLgZZMUUWn4KWqTGbksM+7JhaDzOIlQlkCgMXpwBMZFMHB8MEnRhDz5j7S+s7 33/wuCq3e4f0x0ZX/s8/n15gMap103T9tH1VXsdtoTyjK0HrN38MWXF5zjXm73UHjVK8GY/M2v3 SSqTuxuMI+9iXSq+6WG7sOSCfWmNi1tjVpBC7Sa7Atcb1jx7rMa1jP9dN6+f1uO6p0F7NLHKs7X vYqkff23seqZc1hh1t9rINOs58UiHnRuAviVCTrfz7b1QtiT5vyfh3Et+uU3On8c8PKMyJ6V1Wl Mzvy3zdzdrznXCNGIfM95Jm3xs73nrUaDuLFp77wabg8FSVhyN77+u9LzM4bD6zrSxoyyi2in6V c7dLMv/d453GTG+Kbj738GAInXdKPufnrbyYBYbuh6TUAQ== X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: Yf6RG3y9MENQwRgaFnVsbQWhNqgP5HN4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfXzJ8rH1ugg8j9 T05GbHqPLpcoIaQLcEfqVm+6k23X2/Zp5G4DIkYyDYbvqaQI7TRzlyyxrS6LRaIoTS+40t7PrBQ NZWPdWB3DuPX0zWP3LEcnZwqctiPYORndwRBjSnIfeUk80wkfnkNZW3XK7oVt7gtxeopVpuJOJ9 AfyEUuDqB5NqPEhgbbem+/soO7FOumkI8roZfTFlLEAw/JNuWENl26A8cYNLoAj1+beKJsRc66c tBOo0+cHSctlsIvuVDRaaoDq9IA04N3H8gleGQeB9kN3OzpHiRYXSrJH6HAO6A6JV78IPWZjGuK j/mdwbWUaHeWb6NiKO+Qrpsx8lJ6NHOAtsEwPIE7QH7gMmHt8OyPneDMtF1I9HwqeaSXQGLkUtR hshw2r8pEPkcEMG0ShChhJji4sQEvm0QPZ5HEzSjKECBB4M4XdFC11c7D935/g4lg87i+dtpUe4 Ad54S0fKZBLASqd3Amw== X-Authority-Analysis: v=2.4 cv=Pa7yRyhd c=1 sm=1 tr=0 ts=695ea2b4 cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=FWtRXCEnrA9oX9MUO7wA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 X-Proofpoint-ORIG-GUID: Yf6RG3y9MENQwRgaFnVsbQWhNqgP5HN4 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 bulkscore=0 impostorscore=0 spamscore=0 malwarescore=0 clxscore=1015 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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 Acked-by: Maxime Ripard --- 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 18:31:07 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 6ECBE3587BA for ; Wed, 7 Jan 2026 18:15:18 +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=1767809720; cv=none; b=daSLE0o/BY8lva4H072K0chm4duPHgj+FpDvZ77qVUKIE1lmdIJ0aiZa7Y5uW3+usty34gIIUh6aLCtvmgrB5Sa48grNqBzOHq8Cj70NwobyMxWRpXI2YUhkKt8QzLiL6xdjq65d/JlejqXnSrJUbP1PGPPQbkcAb31opq5R99Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809720; c=relaxed/simple; bh=/ZrVCxC2ORTh/25tcpqTF3QUmYMkLYWP2fYAuUO25LA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MNWM2eMA4JEQHY+XNYreCHA9FguyY/dJcSdf+anpzk7wh1REQyTtJAEPunYsSI75DczHLF5mnt4t2+1RfVDwRL0UtQuunZEovyzYGqayAnC4tVp1q4nTcj7O0lGftHXHHfvEkQclv2VTf6yXQ0qm8Y58tdmMs783F0MbGcanwoQ= 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=YT98JyW5; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=DMxz4mY+; 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="YT98JyW5"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="DMxz4mY+" 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 607H7Ydl3672830 for ; Wed, 7 Jan 2026 18:15:17 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= 6ayeKTjgf6jc54pfgcQupo3DnEV3KmeCjaAg9qNbh2E=; b=YT98JyW5oGIce4yx t62vyUO8gfpzGSWjao8mBdPTYJjg9dpxi69OPT+flXHjY6zvvx9HgiN5VBgBBE3z aP7KS2Ai0vJ/lJpU1dpDd0Wxd3AfpuO+r5VqXRzqZpaUaKyoi0LPozqGRblpfFtK 8FFeJxxsq+wpaKuwqGiSnUZWk/S1M+hmWmUCx+hBTMfSwr6J6aj2V5QFdUUVf0kj CHLH4uqz3dyg/R1Bh8EhaSUJI/DxjitNH/wMuHLMhRLagS+uW1jOa4CUCDBGeaVy RdCTC2bWeHtpXMzHIcJEE6pFwJOYIGnHu5DTmubFL5Kv1LjS0Qoq4BlhHH+zqmpU l0KWkw== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhum507yr-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:17 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-8bb6a7fea4dso572346685a.0 for ; Wed, 07 Jan 2026 10:15:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809717; x=1768414517; 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=6ayeKTjgf6jc54pfgcQupo3DnEV3KmeCjaAg9qNbh2E=; b=DMxz4mY+z1GsNT6WlYY5ePQftxBINzp/Ec3Rx0cc9u8T/z0/NOq0iFgD90t15R5XMR pVIQiEoPBvijKyZgKzbvwFL3hSjtgQSda7sJpqoiwW3Q020DHFzmdLDlo3V9shJoQpjz URXq3mva+MMoNjJZ82mYaEJ6TcYDd/pHSNylKDUM+5BR5nOEew90IxFQ0IiXgIJdbMfy eMDx4sGqIeCFmxSlUTTOH0aqZJSL3AE3tFVnv0x7ygWN6X97ZgTAkZqNAGf5jLE1Wu2T aAeSUPZ+TSpMicOVtYRiDl1GkLhPR7/+RgZnP6OsKN/TwQ7hZ2Mt0z+1ZhehrkdM+uaQ BnZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809717; x=1768414517; 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=6ayeKTjgf6jc54pfgcQupo3DnEV3KmeCjaAg9qNbh2E=; b=D00EfR0jLzuOJ1EndBwqyP48ohQHeV9J/XBOxz0DYqEcn6+8RqCMHX9Z5CYMUcIza0 rw3lk3wC0TwhtsLhKA/xXmS0jLpW2E0vzoEJ+MLgu+/uJrgMB7/QpkSEw5TPdfYrVlAk SALaJC1f5iy404JI0KgcxFdPb35i89bpIcn+2WAZE2mO2tZ0x2CFAc3jiBXAhFdiQEQR LkL/yRWJ9UGSzARB86+cuOINCQnSxb2glML1zNS31lld1QJf9JO3kLvazJUYZKeqKYOB Cn98DODZTia5On5rOooCBcFBNc3cO6sF4tkDW0X7P2H/llkKuOPe8DeG7dIE01gaM8DP rwsA== X-Forwarded-Encrypted: i=1; AJvYcCWDwf3E9Lg8n0QV123KJ/DoDJdZ+GEFi5p9l6lnN9AP4VJC7Iv996HcU8pmwyYdHMm5TN86O//LO5EmAa4=@vger.kernel.org X-Gm-Message-State: AOJu0YxdKfcsYbKzg1pJ9caiQoPYBf3q5z1HWbxN4OPR5V6U6A9LfedE RLrNSed3So4NYMXyoVKBR4qVIeHgC7ZSSDt4L4Cd/Qz5xzpPO7mFiNkQTfCf+OFL30VXHAiPa+/ 8WF1YEM7F3ZhxjquaZdAHLa1ejiGDhhK5OxWrz4asofby3GT02m+OyhGzSVKcX95OF2w= X-Gm-Gg: AY/fxX60evGA2vwleyP6oNlBDI9bbRUL3AEXAhyEuhVMFl8iSR7QamPBjwENWa82jUc 2RrMn4uvCTuvi8XQAfRQqnVVoJTa6XsQ442BRCvdqYlMjpMHr/xaA1b0+khqcr3upbWGmeSRCBF i51Hk+JRVmywrSvCNKeKJb0WO2pSSkQrQjnAqA+m/BEsprh/XamN3Z0ryUMQl8crKXHLpPrORK4 Opfot2LytLzZfXouajEmuqwctM0u/1WSI/4yoJJeCC1AWfvZ0dLmSlYZ/6HuEHaTcHE9oEElo0O 1XsoJ1cjo+zs3G4maDd17l89Gb1+PSE1zXve9k1H+Zx09wLfX4GbCzY2q21aCWRkMZaIJuRinN7 tHFhTU83369opgOWk0qy5CUFN644bqmyBgbm09wL/cdA9Er8QyPVLXEh5kvgfZp3cUnNPiN1HeB jNqtnV7356U8xamjn1g8nYz9U= X-Received: by 2002:a05:620a:2952:b0:89f:5a59:bf30 with SMTP id af79cd13be357-8c38940cc79mr440815485a.78.1767809716507; Wed, 07 Jan 2026 10:15:16 -0800 (PST) X-Google-Smtp-Source: AGHT+IFzR6/I/M+rb+0CfWg9B2pwtmy0BCZ0528ZAW/PtSMTyk3JvUKmiud8K1hEOQV156GKBDOZmQ== X-Received: by 2002:a05:620a:2952:b0:89f:5a59:bf30 with SMTP id af79cd13be357-8c38940cc79mr440807085a.78.1767809715974; Wed, 07 Jan 2026 10:15:15 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:14 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:05 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-8-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=2066; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=/ZrVCxC2ORTh/25tcpqTF3QUmYMkLYWP2fYAuUO25LA=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKlLQRVN1fiNfBhJSnlQQ8yf8TEYh+A8edCs YWTlH3Bcj+JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipQAKCRCLPIo+Aiko 1QOVB/oDjydk2pqigYtLHtwvNWcAKXJbbdPGQ26WTURthKMHJhz9rPZZV04J2QY5hTtypEXd//d nw5Vbwc0So6ysL8Tv/jIxpWqiL+ciHmVHitK6qOCEBS+i8W0MtTLVx1YAdnQ2gp8v5gmqGooPIj URRZkW/XopRmGOqd8hftr59SVEpUvh5HH5NGGNoX/Wx2rngOV+KmUfwE0HXApJlGUvk5kZ/fwRb bGSKspZn9xiu+96xWnVTNQqum/Ct/2q61VCFkl/XqCm0lDpae50DBapNsWOPBMIWt03yTjsHslN UvAY1W9Roxw/F/vls4Ff8wqqmvewupBjJYfykiyeu5Y2vHLK X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-GUID: 0-yp6dEWDhfMesVA9JWvIvwawtdEoplz X-Proofpoint-ORIG-GUID: 0-yp6dEWDhfMesVA9JWvIvwawtdEoplz X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX2vpMvveChavp MC5z3BHv627RUf04CWPKP868rrtjv7IRuyLCxLYKUNtCVNckDfxYxLOkrSPCa2yDQCk4yIY0pm+ 03s+6ZKoSAEAEmlavJujojVh/SdunfkPHVIuFPz0H79OfMfggXpwCnTg4c5cgIMLSVbgrRUrwW7 ufTGe9NIOpV+Us4UrD/4ViQgdvWc3cc10iijFcY+ekfyW2LKBkBcYAUzvno5faxuW2N5Rzgd81i dgMTV1y79wt83p21c4s9kvlsbogx0eTvLIvikYxT/gmkBY6Q2bz6YpMAbTqqkft2kjPPM00pvFR 1dRmYweiHpf8dMGWss/ob9ixAcYJl37Du5WciXs+Q/ZZMmb8JWX8sZheO9hBb3PYO3g9C6B+vaW aDqFwS93O+D+nPKGjmwQkqjUyW2U3tvGpk6Iadw1SOpWyHT9hfq5I/vVjCAbtifnA/DpKPs5T6L UzjdUFQeCUPPgG3FvjA== X-Authority-Analysis: v=2.4 cv=KNZXzVFo c=1 sm=1 tr=0 ts=695ea2b5 cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=58UsvUJqJn8fpqk6aeUA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW: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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 priorityscore=1501 clxscore=1015 impostorscore=0 phishscore=0 adultscore=0 suspectscore=0 bulkscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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. Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- 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 18:31:07 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 B598B3587CA for ; Wed, 7 Jan 2026 18:15:21 +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=1767809723; cv=none; b=clbsZElftaREem5MI/wISyIm1F/xJ74VXbIfsfchObUAHcQnBwvclfX31FcJEkeU9cnyWjvblt1o5rpksyMkY28o7J0bf5ls6k5TtUHCIhtLVYoNyO0Jw7AcOwjLfwR4n51CaqIuLcg6C4H41X0WzmaKj8a6KXXKkDRCwyoMFdY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809723; c=relaxed/simple; bh=j/nplc82Uc8n6ck55GeREmF67vUj6ZFIListkklkuXo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=j42xN8yX96c9Yi/T/C26BZnfP6u5hWy9FyUt9vqqKb8iC8a1jxsf8IeF5prjY/FOa3VK9onaLrBNOR5fxYRgw6KL/vo5kbeYag68AoVF/qY1MHfjUh67WmfMPEQqLjbxNaCKP9T1sT4r+yi1FecT5ICdgHDr7KTyZcqC+lr+W/E= 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=OpUmQbYb; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=WfXOVhu0; 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="OpUmQbYb"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="WfXOVhu0" 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 607G8Wr11981768 for ; Wed, 7 Jan 2026 18:15:20 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= JPs6IVrvHQYSHaamgUjrxzM3vyFi8BapYIQ1hzBD3c8=; b=OpUmQbYb1j/NSFYk Xft3zpHcpuFEAv3CwOsCEDm8TTZut6f7fktTiYhP1reTavXR/x0cZtP0e3AsQjk2 Kd4d6fr83beQDg7xLfrwhBhAE1TfPfdQLKTzu0NA99ht3KT3l1jDTgchxxzV/8nA msygtyBCiUhJg4YwVhjC0/Yw4oEbkJVb5gT29FunL44ATkzFsPDvFDPjYgCoR5ls J6Ghe+PxRcaqeJPPU3PMEpgkcVIcCIzeIl2l+M80+JIOz89logld2RC4jfJ53ZQm YKlxv/l+pU+RIUbbZPSXmCUkNA3IpMNQ3klIl0c0i1wuE62sfSsCVDo1NuIrb25t HacGAg== Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhdavk64u-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:20 +0000 (GMT) Received: by mail-qk1-f198.google.com with SMTP id af79cd13be357-8b24a25cff5so722231385a.2 for ; Wed, 07 Jan 2026 10:15:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809720; x=1768414520; 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=JPs6IVrvHQYSHaamgUjrxzM3vyFi8BapYIQ1hzBD3c8=; b=WfXOVhu0iTmj+Wm/aMB54qKeMvKgbvftOmIp2IHJIdRMGfWVsyzueC0RlQEcqhlCJW iDN+0cUH1Xes/uQw3Y6o1txMC8EIQPttTw7pkkZXr+ioh3FhqhPq8ntLsarqJe4I4nDV IkayQyeUp0OYYb1FCYIzzMuf1AsfiOpf2kKNQzOXWi8LyqaHbUlQ+5Xg8xNZ0trW+qKs 0u3k7ffMwty3Qk2qTkOd6MswNMHZnK4dhHDuBhTOhj3mTrQh4k8CelrBfowtzn0jvAIi LNDl8A1IhnivHaN4h46omTKhwhhjTCa2gBlonBLD7uSDd7tCHToI5xxu5xTEDsds2CJV Pv2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809720; x=1768414520; 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=JPs6IVrvHQYSHaamgUjrxzM3vyFi8BapYIQ1hzBD3c8=; b=rYJVWprDdVbadxzNkxEbu3eL5F047aAQFrxlwh3H5aNQffdsjBpfsWsvhbnxsin7dj fM6IfghmRh+tkGU+mXyrti0KdcYB3om2LlAbgoF7/dt+KbvA8VCN2A2r4nlXqDIgpQaH +jyLsKzbHf+0O9E8bxzRQC9Y5EnLIUHlKsk8VRVyHIcs7y06ZgwH8zzhGj7yzgwuJsJK SbC9bchIZx3C+zglzx4RzVGhGzHcUQD9+TMEBXsVC6zkGAyDki/2hOKn3h9ilJ9fuwbU 7vAUDueVGXik3gCs/YAAUs/g6WMcY9cIrfTKcck6oO/HgODuRhcNswF0Yb6rtkrSQBKy ZDVw== X-Forwarded-Encrypted: i=1; AJvYcCWvJ0j0G9R+YdSx9TQEODVZud+3mR44lGRnwuZFIJaN+v9X9YWo2lfgjHTnkUirETM788I/TZonC3WWgXA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7nVP2j4ppXps5h0db2NUhJDl+6bp9BJPVav+woCGW2NdY2Vd8 iSnf6nxNGsm/x/JrMlEXRFWUdH0u4bXq3iKSlBkeDOJ4B3TRdfAdD5a7OiYxQmquWRlWldBTMck MIlBRR2TaTyYHon6Qdykj1oAqFBmoipaWZD+R+0WUwO0AXCvZlhHMjJvamLpV9vHWkAw= X-Gm-Gg: AY/fxX5lwyccCiQxoGgUu16YgbWpgnF3mDr0xdxvMyQjXt+LyvLp64bOwzfYeUCAFLw HdNgdPuzY2ngn/Qz6Id237dTFDr4uK3JttVlT2+fJIwqHZoi3ZuD0Rlnhc4pdh374oYNg8wy/h+ +VaS+XcWfYaVXdKm6lI2nN4Ct8OyeMq/Lsj30QCUNgaQAb8Jc04d+wBtZquJuIIOygXrzdislWv 6bEv30hhAMxaRvoRR2qD5/gIM3uYC6N5AELGgayIJKYvebynP1FuDnropCb+Vb1Q99XpFhqrTUQ TLjeTaRKhuq5M0ftfV9Krpd/SK1hg48p4JT6Etbo+fDQnaAZVrdLjrWBWnpBIkycZjxY3Tsa0ZL 3cow5jhw8rwSvUGB9U/ng85tE6CnCFCMyfI8VZPbIVFXfmnzIbEZhcteyVQFXPmIwfKOuPS+y3T ImAClspm7bUuvq1Jm9Mu8RFns= X-Received: by 2002:a05:620a:2a0e:b0:8b2:f145:7f28 with SMTP id af79cd13be357-8c3893a26a4mr408413285a.33.1767809719396; Wed, 07 Jan 2026 10:15:19 -0800 (PST) X-Google-Smtp-Source: AGHT+IFUjHXe7uuYeZEqUMuBR5K2kia77K+Kj14ZWPxBppIzS2JiKcdZruRDku2629OMG4LVhagWmw== X-Received: by 2002:a05:620a:2a0e:b0:8b2:f145:7f28 with SMTP id af79cd13be357-8c3893a26a4mr408404785a.33.1767809718716; Wed, 07 Jan 2026 10:15:18 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:17 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:06 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-9-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=6894; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=j/nplc82Uc8n6ck55GeREmF67vUj6ZFIListkklkuXo=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKlQWZc4/P6jahK/bWP1w2B50/o9TLzfzbdf aaZXx2QNIaJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipQAKCRCLPIo+Aiko 1f1FCACoKLk12kYaWdypMvDCzHmH9N8HbMOWbXMZlbluaF79NkCtoNgDonKnKHxYLa9pjqgX17e Rvd8pmDpdv2MOg3WP/GMXH5pZGxRG01FGl7SBtEPw2/YXYEskTFSEq6fG4I+tv8X5Ly85MqO9Lj 9cHsDJOJq0hBFlwxVPg4mvAka59hwWsW69lgA6euCJbibpFCioBMCghtCslqHcxkjZWM/PUGgNE Zgf3lcR3ZdkGqSnlQlrowNKspjiwnAe/Q7/uXCEP9N6R5jyGzXlQUqTGFKBPnuzMfXGuvLMm4dg RY6CU12eS8wodgZ5W3Ilm0fcBuf2GFwlR9F7fNEmqQh95vO+ X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX/q2DS5Low6TS JGnlIBOsOXJ/uS8c1anGZ9dGxm3/cXmMHHRRTu4ViB1SVGceVwa+EK/femf63Q2XIc2Nj0yip7F 25kg+aOi7c46Ctwh8cHQVuTRuf14lQpfWc0SzzhDdPYyRACb4MD85FxswhA1buF8+j98oboxwhQ 0mNAZYb7+/1D7Cqube/T8P2wKFrT2288AXQ7Ej7nHBeS40lZqRoVtoFuPMP3lBBOrMw+c2OcStV zs2WhsYvCjigC8sL1bi9kT7cDEy2x95VKM2NjOe/63ewyUzqAqkP0YEH2XUanAJgVNz8vZ96ezL ODeU9D4YgbrdwUEIHM1MGAe4bbSBJBuS4XEqZsMcz12edLyYHOzUTTctCrvxy2BDs0tHOpCRHZg qyapBeuEtOS7WmHHsA0tngeNXENO+4p3S74EuGs41BO3roh9KYft8KNYEa6mE7nwmvEurHVqZ2P d7E1+CFf99ZVnsjWshw== X-Proofpoint-ORIG-GUID: 8Y1D2ZebgrS-nw4ytqitYnNjEFBRphXd X-Authority-Analysis: v=2.4 cv=comWUl4i c=1 sm=1 tr=0 ts=695ea2b8 cx=c_pps a=qKBjSQ1v91RyAK45QCPf5w==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=SmQ2dRXw9u10PpR7_9MA:9 a=QEXdDO2ut3YA:10 a=NFOGd7dJGGMPyQGDc5-O:22 X-Proofpoint-GUID: 8Y1D2ZebgrS-nw4ytqitYnNjEFBRphXd 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 adultscore=0 priorityscore=1501 phishscore=0 malwarescore=0 bulkscore=0 clxscore=1015 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 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. Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- 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 ca6a72a4cf80..ba8ff113cff1 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 18:31:07 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 8C16D3590AD for ; Wed, 7 Jan 2026 18:15:23 +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=1767809725; cv=none; b=D9EJ624DfMSuoNOJzPh+Bu1aRkKY38Tj+x2ezrIHzga6IZO+vf+YXmyex3hKny5k4untOs767wNrhzjvIY1nZoeDt5GqRtscKnjdeZ4j2nR0nhO1AxWbHTmOY0ARSfRrPpilBj35oJpDt3lO3g4cPQu5gEkR4SQsvtsRHFgmQVU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767809725; c=relaxed/simple; bh=Fqja7nqMdmSMtGtKfnnZaHovKcc+8jCwgpdYFW7dJBE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Lj4CH5Qf2tXRjJlP8CeyE2HDotX6I00K8DBh1ynOJP5roh6RW9Yx4MVbZMgs0vsMSZ99wfoayWGEaaBHil7QRV+MQgFjQPRDvaLHZAjXkYU8LoO8pIflBJI2/r0n4TLeoufUjDnw8I2ms8MA5+trC4XQKtXSypQg3kocKAjLyYw= 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=KbCTIULR; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=gaa/fKrh; 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="KbCTIULR"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="gaa/fKrh" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 607HO6Kl2593315 for ; Wed, 7 Jan 2026 18:15:23 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= Rhn7f75cBzRSaSyNIXu2sGOU3jGwzD9Mh33JQAcGM6E=; b=KbCTIULR+UQD/OAh U1rI7/tfl1/ayoTyuMELUcglhFt/QcCGv9YR7isr79DbYNFS++Nm24Mu8T+F/ns5 Nb46watlWR+VJAYBlUKos9mkuWeL6NeBUNVZUj98sMVDYn2GjcOiUdMMpXb5ieYU GiBSz7AdGoLuCVNMugOoQB39e48Zo0tN0w05xOS1T9zXpjBM7thGm9bfybGIuNeB xcjjgL2nWqLLasPKHDHVkvqInzjqR3T9K6aYC3POkBBlzly+8qYDAHlsSxywEQ+O taP/Fnm6reneRix/8aOooj18dqvaHgLUcSXdljAPsXO95mEpzCjvaJPHJ2mTKXoA UVL9rQ== Received: from mail-qk1-f199.google.com (mail-qk1-f199.google.com [209.85.222.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bhn291n5g-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 07 Jan 2026 18:15:22 +0000 (GMT) Received: by mail-qk1-f199.google.com with SMTP id af79cd13be357-8b2e235d4d2so911719385a.3 for ; Wed, 07 Jan 2026 10:15:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767809722; x=1768414522; 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=Rhn7f75cBzRSaSyNIXu2sGOU3jGwzD9Mh33JQAcGM6E=; b=gaa/fKrhgUyqC/yId6kxwZjBq7/XSSsusWWriF++qCHwCDQClP2uCVj27RhEE2EXF3 drlAwuHrlIpvCPsXW4SQ1n7J29nIJIoocKLCDJNWMPz4pPEZxoW3urPDr0fkvi+GyyN2 AXT5ivE3B3EZBKiTPXj3s6h8nqPlCz/Qh1H3FV1U43+OYiYX/pUSKuxJ4+VBgrM9DG5O uYDlaQ+reY/1ghcAYRFdnAtR3w0POjyjNXjFvMULpdx8LSBo7uQiWNfaW1q0h835jE1j VUJxqRwTJjNQPs4icVzNt40ZlVPt5ya12qfxiTPXMYb7aS7Jjr7nOnIYVGMgWg/NMFir aotw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767809722; x=1768414522; 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=Rhn7f75cBzRSaSyNIXu2sGOU3jGwzD9Mh33JQAcGM6E=; b=Y59348ajbayWmOSRUexc/7vJrJyyfmrtqqC+aVCfcrpWUv2737HK5OK1Xx9IuhRCnX wDuF6mm3MOYtEdEd4MZQ1jd7X84n6tT2QQBEz56fetu0WxV87TFvEr10GBa+ooI8DeaM cG4TQUSt7DbVEuRVbEhNVqH2fNP4BjCiLK703A6fH6pa4s4d34a64lGDt9ZHGZ9NFT4p 96DagAIEY22WzzQRaYeBHIasrCoUwD8k6ZwKPNSM5diVX9tHd0TFY8B1SK/4j0PchPU5 tCGzzRUiGV2ANsmIwI7tEqSQ3WwzjwHU0Yin287xfHCneM2xQIPewZ2m2GM9u9pBbUl/ nu+g== X-Forwarded-Encrypted: i=1; AJvYcCV/XDUXbRa0xclyXQhJQS5VlfrJMQJmYb5zI8II+Ln9hrsqd3FEeRlhFXK+N2j1W91iiOnK9TlrQgKuBpk=@vger.kernel.org X-Gm-Message-State: AOJu0YytHw+0OJd2B/UcLq5YHm9VSEF3w1PiaQ3x+eIzfPTQSENfA1Ed sI8aQ6mczriWRWR+qD9dw4OiGX6RZCwwvtZpLgw3VURG/xzzKp6z8u2PnZ+D2J6lvqsw3uELht/ +Wy8iZ1ZbFMDIpVTsD/OHkDPUA32oM8b7Nk6tX2PTR+JksARi4/XRhavIjfE/65Iile8= X-Gm-Gg: AY/fxX6zyTaxyJ7xsFYCE3LYJ7cCYhfNDyGmUdq4nZ1QQfa0TFHFOwIDEiwmfEffSA0 uOgO9BuNh57jXMYv250J6BQxxWcRIgTxw+9lva3IJ2ynwFP+DP1Xe4vqOmMBMSSDus8MQ8uRTB2 oykhnYOnbcTrKKyJXXg7EWTO5h4oycAwnA4nma6I6SNZgZUhzMhyecLHog2rHgAE/uavnN48L8C pwHizKXcLd8C8e/fff80glxt2O1hY0FougPzFbS0qieDLRCmX9VePhGICAyqU6dIJI0tKHsWRWe wAurprSgXHGJyuwndSaMW+ZRPBJ1lcGdDGt4OF0i5g91QTjj90CWhRW2c5GfOYrpdliZ2uyEGTb w9uKPDVXwWt8PBqVQPNw8EhmkATUt0uNu223OsDChMXWyIHYR6KIrCuxFb6iCIicWkfDLJz2jYw SiOnqe49Gx2kK67CUPWsQ3lsg= X-Received: by 2002:a05:620a:19a5:b0:892:10cb:b427 with SMTP id af79cd13be357-8c38940bc70mr456797185a.67.1767809721952; Wed, 07 Jan 2026 10:15:21 -0800 (PST) X-Google-Smtp-Source: AGHT+IEDhZprVBsv7NrDl4r7/stHLp9ske0/9w25bokRbHgFqXeEm1zUot0CQkb+02Aes2IA+aZv+g== X-Received: by 2002:a05:620a:19a5:b0:892:10cb:b427 with SMTP id af79cd13be357-8c38940bc70mr456790785a.67.1767809721391; Wed, 07 Jan 2026 10:15:21 -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-59b65d6988asm1436884e87.80.2026.01.07.10.15.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 07 Jan 2026 10:15:19 -0800 (PST) From: Dmitry Baryshkov Date: Wed, 07 Jan 2026 20:15:07 +0200 Subject: [PATCH v4 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: <20260107-limit-infoframes-2-v4-10-213d0d3bd490@oss.qualcomm.com> References: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@oss.qualcomm.com> In-Reply-To: <20260107-limit-infoframes-2-v4-0-213d0d3bd490@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=1290; i=dmitry.baryshkov@oss.qualcomm.com; h=from:subject:message-id; bh=Fqja7nqMdmSMtGtKfnnZaHovKcc+8jCwgpdYFW7dJBE=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBpXqKldBKXXeIUEl9VKknThFajiJ4bv/Z+Y6zlU AwqJpH32O6JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCaV6ipQAKCRCLPIo+Aiko 1SajB/4k5q4SEw24CrrWC3HEsLlY/uKXgpKUIWzeXnMMyXHDWo7v5tevjX/ai/KZzmbo1NC5fGU jhVIocLd7kwuiCUjpW/yVaQGBTAKyovOJsTbYp+V9wBPDqh8cp3VXyONhN+s/zhRGG9gAF2YEzG cgchTc/+0JVBdAMG16Sxc4mMOkZGU+Lxks7qJlyhN6XsUcj8iRQG+d9hUkNlBAgdTcMJpMEn0kd dkJOKbe+FFOrO2OOH4BNawMbMIU0982lxSIPgb5Q/RKX8LhTdWcg7s3XNn8GfdQLMft8fGlKdXt B1XWOTyoPib7k0/IiAyVFTJ9DpbDTMyzhznF9TrmGgOPszSr X-Developer-Key: i=dmitry.baryshkov@oss.qualcomm.com; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A X-Proofpoint-ORIG-GUID: ffQBhGB-et1Wnx4ZT96i-C7Zad4ojnlA X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA3MDE0NCBTYWx0ZWRfX4EvwU06IZtx+ efJHGfvF6puKzQcBnpGn5thag4cS55qfpo/LeOIGyww+hc9Nr1ZNEd9OV1PUwhnXSkCbXItdUVy YptBCPRGflxFHNGKXyEfL8kxj9NRcjw9qYvlze+BHnK2MdZwXfLo416YaajUvsHzOaepqFZElyS GKp1/jb6O43H/LC8uNVUSIacyjbr63PPOtEH5TD53sWWAvbNz9g8MIqK1gSpQr7VSlr44YTFewZ afVjLideTKqPqnUNrvFSlJZ5wV29H+4fyHCzuFGONAnk1Kd5Q6bgeSFFN4ot4xCzz9o+rPBsHHD BEKotMOr7AfjgyHVPOa2QJFVErRZ80pQxYVBkEEz2MQlPcZfveftSM+ACcOUSTAtxaIOqSbAS+q YyQpk6XV1EEZZeZEibagIeMxcjbPTEK9QT1UpBaqm+8ZBwsCXWFUDroI2nSAiLj3eNQtRnLIxAV wtdhXdkaQaGKghsjtAg== X-Authority-Analysis: v=2.4 cv=P7k3RyAu c=1 sm=1 tr=0 ts=695ea2ba cx=c_pps a=HLyN3IcIa5EE8TELMZ618Q==:117 a=xqWC_Br6kY4A:10 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VwQbUJbxAAAA:8 a=EUspDBNiAAAA:8 a=tIAOKlZC_mo2NaXw_9IA:9 a=QEXdDO2ut3YA:10 a=bTQJ7kPSJx9SKPbeHEYW:22 X-Proofpoint-GUID: ffQBhGB-et1Wnx4ZT96i-C7Zad4ojnlA 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=2026-01-07_03,2026-01-06_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 spamscore=0 phishscore=0 clxscore=1015 malwarescore=0 lowpriorityscore=0 impostorscore=0 adultscore=0 priorityscore=1501 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601070144 Having debugfs files for the InfoFrames that are not supported by the driver is confusing, stop registering those in the debugfs. Acked-by: Maxime Ripard Signed-off-by: Dmitry Baryshkov --- 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