From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0DA8C1CB328 for ; Wed, 29 May 2024 23:12:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024352; cv=none; b=mektOCiJzNgFjQi+we66BOBjxkAs5j1w7EaA1mpIsop09Yg7GWaaouDKgmSq1KBf9hEzd1RcBSSLJOhNtMRqu4vGHSUtK4MknlCUCIzgznUiqdDaytthz8QYAFrN8vz1y9uk9juVfU10DmsZ5JE/PpPHTN6sxyqyeohbvxbOVNM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024352; c=relaxed/simple; bh=AXQkgT8bLCi+J4VLmDhYURPEkLAsLkNbwsYyTx65pa0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mvhZX3jl46NECLQ1VdpEIGEhqvc0vmFiIqlYtJLSdW6AL2CjDUCBiwDusCPElMe6Cqb5UOGfkL5UQbfDeNTb85CHQWT4kNeZw96nSv6JjlPk2Hmw0eCnXvn6HaMY2o1R+g15Ft6osr9oLe4H6WC+9o9OS6sFmsyO7AfsI2WAtG4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=eTLttC16; arc=none smtp.client-ip=209.85.167.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="eTLttC16" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-52b7b4812f3so238486e87.0 for ; Wed, 29 May 2024 16:12:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024349; x=1717629149; 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=xsWyvZJ7smsYEwcJt3QXuB4RboSifhUzN4Y/+3fVgYs=; b=eTLttC16EBJNdIPG8cKd8aFAxJ9jmVxdKclGbafYQDAaSoMg0NVCqX2mfh44boeNZF QUG14PaoC4iiqZh/2IzzdqXvAeQAgHHH8HtZFcuDIhbPwGsUCbQkSXSuvdC66CrL+iiA kREjxD8MFngJtK7YLjWmbirZOc0R7XUtwfxoh8utRE1yfFBDnnlWsdN7RsabXg+uN5Xt ywjjTj4PG04UQOkUEtgJQ2l90beZRr4L6fK6qIvg22BLK2KmV8rLJ3mOZXDuBS/TxVxx 80JvYGn5kZIUlIY1jApa4Zj5ee6vJJ9sGKqvcTLfriIphaUmfecIVt+tlKT8kcdsS121 ABrg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024349; x=1717629149; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xsWyvZJ7smsYEwcJt3QXuB4RboSifhUzN4Y/+3fVgYs=; b=nZipzdjMNsD8e3nG7mDtJdQ5XMh8Vl/MNwe0wI4tIV4OYWrvZEq0bFqrXv6RzOYleU f0Va9e9FVEUH2ZDpj/jG9yWJGSH10PW2FT40C1MCui/e/SPEVsFG2wWpravIP4iEa59d C1D/Fbb6BIpMJTKsYE9Xvt9Jk6vs5cjSntuGuYog/Et21x/dA8GGAr2jYTuvMAvB54Qr u5DkpDZi6CEQHysIE5EnJrz/cg0f6gGjwgYNrh+9/brtt2db5QEHJVYSSmIoIEhQUW66 9ZfiVHIQpmshI7Xjky+XdOwvJ0C7YJwYKwiXkn8yCRDwrfDNKhTCYdsFU1/91rjLpZ+S ftSQ== X-Forwarded-Encrypted: i=1; AJvYcCUAynsy5Uejn29FXhGLgQUw6rkMXiB/Er1ftg6QbrhKSUwehi1xl+WPOtSZrzQRr81/vvJ8nM86Au1QxrkNjE9QMgV5pvP9tOGX0WHr X-Gm-Message-State: AOJu0YzCRn8cOcC+SJkvqUQwGeNhPy2XqF/vcic3bGOEqtUaY0d06A7Y NdiEXplvm9nrGuOh5AECv9q8vLMx1W/k8lZZM/f0OQ6LN+rEJtPNfBNsLGl/z4g= X-Google-Smtp-Source: AGHT+IGR2g9tEjUHRz3sWSg0237KZd0prRiZw5CS2OF0JFp0DTVGONPL8fJFqcllAiRPCR5tE1g7iQ== X-Received: by 2002:ac2:41cb:0:b0:51e:e5cf:9940 with SMTP id 2adb3069b0e04-52b7e0ee8b0mr63089e87.4.1717024348995; Wed, 29 May 2024 16:12:28 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:28 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:24 +0300 Subject: [PATCH v3 1/7] drm/connector: hdmi: accept NULL for Audio 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: <20240530-bridge-hdmi-connector-v3-1-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1693; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=AXQkgT8bLCi+J4VLmDhYURPEkLAsLkNbwsYyTx65pa0=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7ZadQQ/u477cay7r64S0rsMMdpYg2c8F9bsk HP74y9RpWGJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WgAKCRCLPIo+Aiko 1Xz/CACBG8J88iFv44gK5ywM44/nLwAiT0D+h+PopLWugWuGXC0yuvOQ7sSZ/TiE8fpiOzXNghn LqQShLj2piBG17rpD08ku2ULumRjKSuGcbAMUkWy7Vr2hEKxIrHv48HEWd4jkWGWw2JtHE1QZR0 q9ai2atyG3KlWWGVlIEgBSayjXD83ULC38kztI/L6E3YaG7aIITrdW9NfyoSKb0mRuJzLOIwdcj K2Q5n8BtQ0jKRJYqInW7Kx4EXVbYwOy160ewSLGEwZBTd0ka7ZcG4UBpIKZt51O2Aq6cpxhN4R7 U8bkuwdlyNpvpdu4AunLtBCfChGuVdAAJb0UFFgN6lErZjPS X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Allow passing NULL as audio infoframe as a way to disable Audio Infoframe generation. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/display/drm_hdmi_state_helper.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/display/drm_hdmi_state_helper.c b/drivers/gpu/= drm/display/drm_hdmi_state_helper.c index ce96837eea65..5356723d21f5 100644 --- a/drivers/gpu/drm/display/drm_hdmi_state_helper.c +++ b/drivers/gpu/drm/display/drm_hdmi_state_helper.c @@ -681,7 +681,7 @@ EXPORT_SYMBOL(drm_atomic_helper_connector_hdmi_update_i= nfoframes); /** * drm_atomic_helper_connector_hdmi_update_audio_infoframe - Update the Au= dio Infoframe * @connector: A pointer to the HDMI connector - * @frame: A pointer to the audio infoframe to write + * @frame: A pointer to the audio infoframe to write or NULL to disable se= nding the frame * * This function is meant for HDMI connector drivers to update their * audio infoframe. It will typically be used in one of the ALSA hooks @@ -704,10 +704,16 @@ drm_atomic_helper_connector_hdmi_update_audio_infofra= me(struct drm_connector *co =20 mutex_lock(&connector->hdmi.infoframes.lock); =20 - memcpy(&infoframe->data, frame, sizeof(infoframe->data)); - infoframe->set =3D true; + if (frame) { + memcpy(&infoframe->data, frame, sizeof(infoframe->data)); + infoframe->set =3D true; + + ret =3D write_infoframe(connector, infoframe); + } else { + infoframe->set =3D false; =20 - ret =3D write_infoframe(connector, infoframe); + ret =3D clear_infoframe(connector, infoframe); + } =20 mutex_unlock(&connector->hdmi.infoframes.lock); =20 --=20 2.39.2 From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 705DB1CB32A for ; Wed, 29 May 2024 23:12:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024353; cv=none; b=NbLrs5Tf9PE1p1uqYdNmx0CWwAxEW6ZcxaW1EeQ0HVSfbSjkAuF1NeL6PZ5hhHWpoLYtSbiGcNcpoPNJTtEedfdeUvjMJZ5QhiBCNx1pjadYg3WqbwlGVcfxDF034S8nLLQydSo1t3lgMTdAvSK1eQBCcApX+U4gUjd5Hda4Km8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024353; c=relaxed/simple; bh=tsP9tTDeCAxEsLOY742IzVP85XDz5wvrZItLRYft3O8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gnyPEON7+olIsj1f+kphSum8/w7/VsDlsbxtR0ORoOT5ey71aUjG/x3mkDr1Rnkefeo5y13klMAxJYlJCqQzrJJXZgmYEU1mI1hVwnfFZZs8Vj6SKQ+spGZd1cnoFkfTDmeZuCYcVc522rL0oy/wJmSUiJ/HMvyhcohOelsLHtI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=FhI+I0wf; arc=none smtp.client-ip=209.85.208.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="FhI+I0wf" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-2e6f2534e41so2760021fa.0 for ; Wed, 29 May 2024 16:12:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024349; x=1717629149; 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=LSZZkKIdPjs/3pbTSieRssyY+6F3HyNGApLO69pzaQo=; b=FhI+I0wfltXZ06i0GVrehbLR522sUWHoObOGr9UesSj3EiuTgeTUfA2Nb70BRqg1JN GrAbvn0x/By1H86uWSrEXLxu8VxAGifF6NJ7h6icXW5CDDJygNOLRAA8470HT6KTEtre 5xC6artdqeDxKTMMmhYBpNtM/+jv715WvHfWVDtn4R4AgoLEC/X/b0ZDKy3rVGNln6+R Oq5F213M6MNh0GAhBbqABGOHcjR67d3IBrgbIW9mbs2dtdxlrO583SWj6x2fU3HbyiqF +xvm1yiowOA3lY7BMQJBQtoNfI9/d5/2wgZrbXyBUHGGA72m1dXiYnV5nRxlDShKwg5H 75PA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024349; x=1717629149; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LSZZkKIdPjs/3pbTSieRssyY+6F3HyNGApLO69pzaQo=; b=PHYH8Jpo3Zz5Ejb/1KiK2cyCUxC8NxcKC5Srm2eEPCPrjEbsR7Za6wBYt3FQz5KoHP 3qxT1T4k454EPmDGYDKkIujPJ41G4SZOUHGG+XbsXnCflVCM2czitAN+AhyfKZAHMy4y EKhl1MI2EJTt2eij5acR1QHQlws/MRPrbLkx84Ym2+V6Z2cC1/XnvgNQFPV5MkghB2oW u9166+f8B9jfgiaY53nUrupmo0y5w4ByN3XVCyrtCBRQzPO5p/qsozLsfnLe8FQYCle+ 7Weew1dgSumPV+VX7U548QaPSMY72IU+rh4Wkgqa3XoyAUC44Yf6JZ7tuuZxHXXlO1Dn yisA== X-Forwarded-Encrypted: i=1; AJvYcCXTXCA9QzlLAW2pUOS9KRfw+LgHO8iwJBc3YWvUCrKC5yvC9Y/KEp74+IqODGhQC51EHq9yH+pWP6tiqteW49cbUlcIdHgonQAIj2ns X-Gm-Message-State: AOJu0YzBiQVZdEFFYGN/hWiZVl/zyVHFqzgadBzPlGmUC9QtkEYWPeaI qbHPCXE3L2P7vo49LAlvg1lQG9PJxcJ+6QCLteunUkiXL66sfK0WSX0j97kDiHo= X-Google-Smtp-Source: AGHT+IHdUiG+DnvSt0qnuwMbT7cQeaKDEpajLmaXOv5WknZU0NyT9BVVqAh79+PYfLzQZdq2zxMdlQ== X-Received: by 2002:ac2:523c:0:b0:51f:5d0a:d71a with SMTP id 2adb3069b0e04-52b7d418dbemr278746e87.10.1717024349656; Wed, 29 May 2024 16:12:29 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:29 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:25 +0300 Subject: [PATCH v3 2/7] drm/bridge-connector: switch to using drmm allocations 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: <20240530-bridge-hdmi-connector-v3-2-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2740; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=tsP9tTDeCAxEsLOY742IzVP85XDz5wvrZItLRYft3O8=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7ZasP81Hpao/5n4EYES8nIOWWg/gr7QS2AUm 8cTtD+IRrCJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WgAKCRCLPIo+Aiko 1R3MB/9S4LVRBbtll6+h9QWEz5yMUbV4NHe5Si+KYeQBc6Deeau8a0I5gE6NMyZhX8/JVnemsp0 3oN+WuONb8GN7MXAuFmLKC7vABq5bhEmsVBevmbUbsN+HaeMcPL6myXLoHWINkvRsQNL6aDdHkO yKd9atzEHFBrKmdXLvavoHYA7un/xQFOqyUyPCA80UM+pj9ADO8jKTnlS6VFBHWpN3kP+mwio1y jqqbcH+GYZTvcJ0SAenLuEoVs4yOEN1+WIx3Qo/mjlLKOlyqWrdq4l/jrU6f9AhYbgTcw0PytT/ yVToaD/CsmmfEmM4MXGQX+JA6AmidNVgELG8S4eg24GKEsOB X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Turn drm_bridge_connector to using drmm_kzalloc() and drmm_connector_init() and drop the custom destroy function. The drm_connector_unregister() and fwnode_handle_put() are already handled by the drm_connector_cleanup() and so are safe to be dropped. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/drm_bridge_connector.c | 23 +++++------------------ 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_b= ridge_connector.c index 982552c9f92c..e093fc8928dc 100644 --- a/drivers/gpu/drm/drm_bridge_connector.c +++ b/drivers/gpu/drm/drm_bridge_connector.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include =20 @@ -193,19 +194,6 @@ drm_bridge_connector_detect(struct drm_connector *conn= ector, bool force) return status; } =20 -static void drm_bridge_connector_destroy(struct drm_connector *connector) -{ - struct drm_bridge_connector *bridge_connector =3D - to_drm_bridge_connector(connector); - - drm_connector_unregister(connector); - drm_connector_cleanup(connector); - - fwnode_handle_put(connector->fwnode); - - kfree(bridge_connector); -} - static void drm_bridge_connector_debugfs_init(struct drm_connector *connec= tor, struct dentry *root) { @@ -224,7 +212,6 @@ static const struct drm_connector_funcs drm_bridge_conn= ector_funcs =3D { .reset =3D drm_atomic_helper_connector_reset, .detect =3D drm_bridge_connector_detect, .fill_modes =3D drm_helper_probe_single_connector_modes, - .destroy =3D drm_bridge_connector_destroy, .atomic_duplicate_state =3D drm_atomic_helper_connector_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_connector_destroy_state, .debugfs_init =3D drm_bridge_connector_debugfs_init, @@ -328,7 +315,7 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, int connector_type; int ret; =20 - bridge_connector =3D kzalloc(sizeof(*bridge_connector), GFP_KERNEL); + bridge_connector =3D drmm_kzalloc(drm, sizeof(*bridge_connector), GFP_KER= NEL); if (!bridge_connector) return ERR_PTR(-ENOMEM); =20 @@ -383,9 +370,9 @@ struct drm_connector *drm_bridge_connector_init(struct = drm_device *drm, return ERR_PTR(-EINVAL); } =20 - ret =3D drm_connector_init_with_ddc(drm, connector, - &drm_bridge_connector_funcs, - connector_type, ddc); + ret =3D drmm_connector_init(drm, connector, + &drm_bridge_connector_funcs, + connector_type, ddc); if (ret) { kfree(bridge_connector); return ERR_PTR(ret); --=20 2.39.2 From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3576B1CB32B for ; Wed, 29 May 2024 23:12:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024354; cv=none; b=qbOHkUH571SlGquG7ejWOYTmYmHxueg3geu8jNihvG7gjpkiUcS6F0rpxoM1RW9JMTmKQIXI94vO3kVfq/2gi4s2TOjqcSRSwbrAkTSUqUf1FVvbh/9PouGCb1ixmzOvvGvJhsm5s/oee+t09yfZtJDtEPD8HrWUDRgk7YksGvs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024354; c=relaxed/simple; bh=tOIH3JPEpDxof7OQM6P6CQE/OX6XXbqLAqWvMjH3caE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Iimj3AnXiFxvPTQhxc9B8yfAHCpgZHp7zpQ50vtDG6gIT37Dq5+GfsMnONPnsCqyz+KlNtgj9bTXGPC4c2JWGBCH5u4X1ct/0/ADVq2jkr4Bz/PjxFWpuGWRT55qH7ULpF5YFg2C8hM5BgFCbBPzFzBawuZj1t0/wfbaJ9Jw7O0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=zrYMfZmR; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="zrYMfZmR" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-52b0d25b54eso401945e87.3 for ; Wed, 29 May 2024 16:12:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024350; x=1717629150; 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=kOz+df2raUbCtUFRosciH+kU8h+dx/PGU1pG4gC6J9Y=; b=zrYMfZmRj74WJSot1OSS8/X9W8lipUr47E+9GSM0L0MlB6I1KNrgOl+Qj+TCn04afD j26Y48htEqpltoRHCEP2Ry0R9u+fDAsJWDAArOOENsSJbc7jZBv1tgSyskS0t8CYKKUf oQrE1+aXRiUVy2aXfQ8iNJVG1YrGEQrg74NzHf9mKUkjf65txXyHI1KLH1M3nEkRgaxo FxKiFIcLcCZGS+Hu0RSOR17ossIiHJccZ+lbzgnIgiIGyL+dcak3XV3UYVKkNcR7XCqe 6zZJ8PPi0PYEshJJ6q8vQZ6jaNOWB361cKIdOyZ5kv6VSN6ktQNT3lyaR8F1Luc67pE+ xV1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024350; x=1717629150; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kOz+df2raUbCtUFRosciH+kU8h+dx/PGU1pG4gC6J9Y=; b=v+/KP8/B7c1cyqDcqdUaVQVYllz0xUDh4+AY9ya2Ib075b9/TN3OABU4t5XdiTgYOq hBpijS0Sde06LqPRsfXz10d4GydOxdBfT4X3N5MrL2BgphjL1gtDbAC7djpcAHJqfVLO sPEnow8Y9sLLsHj+z+S91USJnK5vml6eX2qBF1JPGYPIRIxFntCVkk5/8R2EVGP02P3f W230uFacBGRv0vuiSnwgNhde5D/3fYK2bShum3MfpcWtaynFN8MUInq2NurdG2IBSdvL q8WKB4E228V0yPA1pTidFdiLgreIpo5OkDuJz4CsAa02ysQ9Xpo264PN6LHldyyQ94RD CkAA== X-Forwarded-Encrypted: i=1; AJvYcCWeFaKyXZTVIfM0HkbA2jwDoBX5yueBaVVIw7gCsdyG+vi+wJuMtQPNwqZyFv6qJpIb+b0EkiT2NYs8HnSScdYgHyCjJxlklQcBrOsR X-Gm-Message-State: AOJu0YxFBNBELoCy96QxPwEzLjMCsuTqU/sKxTYzvif72DNohhEeRHnY i0tb7cSvGahK8li7gh/DtXvJlXM1onmnYD4XEGmY/TDD/fu6080JiuqquVnXOfY= X-Google-Smtp-Source: AGHT+IGcWfVhQQUzLM0fQ0j58Hq7J7sQGpv1qopmw+bd9uKZgyflTXgXKf4z9o9FcOVrrYO+5d8UbQ== X-Received: by 2002:ac2:5979:0:b0:51a:c3b8:b9cf with SMTP id 2adb3069b0e04-52b7d4b1c97mr343366e87.69.1717024350342; Wed, 29 May 2024 16:12:30 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:29 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:26 +0300 Subject: [PATCH v3 3/7] drm/bridge-connector: implement glue code for HDMI connector 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: <20240530-bridge-hdmi-connector-v3-3-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=9517; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=tOIH3JPEpDxof7OQM6P6CQE/OX6XXbqLAqWvMjH3caE=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7ZahtocGRDfZCeZ3ATZVji45oLhxvIeiW215 Yj6EA6EJm2JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WgAKCRCLPIo+Aiko 1SDPB/9AVKlLTJK6OnbadA3AHcW3UGZeJN8TpWpF53fYoS0Lp/kigDkMgs3gGuyeiQya0XkeRls Ex6Vu3OAO+RxP0mTgVkzWpvkH2Dw+jL6TjkaDOE+XP8mK/ohk0KZilESaMP70R7kX3Ek0HdYKll UbpXYgPhFFwUKvHEX3o2xDsS77uPdb4UGO1DGqg6e78AtTnAXjjIUDRYPumNeYM5mtwvoHhpnU5 z6QUJef/HfPdHFyfoxWx+A+OKSTteC5+N3IVmtfPFGxYzQ/zKy3C0e+Wb/RX/+sOzCAtUgSR7il kSbyjlp1eXRl6W3b2VyB6Gv2akXNVekyFpLlv0uZKcJ4ozSl X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A In order to let bridge chains implement HDMI connector infrastructure, add necessary glue code to the drm_bridge_connector. In case there is a bridge that sets DRM_BRIDGE_OP_HDMI, drm_bridge_connector will register itself as a HDMI connector and provide proxy drm_connector_hdmi_funcs implementation. Note, to simplify implementation, there can be only one bridge in a chain that sets DRM_BRIDGE_OP_HDMI. Setting more than one is considered an error. This limitation can be lifted later, if the need arises. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/drm_bridge_connector.c | 101 +++++++++++++++++++++++++++++= +++- drivers/gpu/drm/drm_debugfs.c | 2 + include/drm/drm_bridge.h | 82 ++++++++++++++++++++++++++ 3 files changed, 182 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/drm_bridge_connector.c b/drivers/gpu/drm/drm_b= ridge_connector.c index e093fc8928dc..8dca3eda5381 100644 --- a/drivers/gpu/drm/drm_bridge_connector.c +++ b/drivers/gpu/drm/drm_bridge_connector.c @@ -18,6 +18,7 @@ #include #include #include +#include =20 /** * DOC: overview @@ -87,6 +88,13 @@ struct drm_bridge_connector { * connector modes detection, if any (see &DRM_BRIDGE_OP_MODES). */ struct drm_bridge *bridge_modes; + /** + * @bridge_hdmi: + * + * The bridge in the chain that implements necessary support for the + * HDMI connector infrastructure, if any (see &DRM_BRIDGE_OP_HDMI). + */ + struct drm_bridge *bridge_hdmi; }; =20 #define to_drm_bridge_connector(x) \ @@ -287,6 +295,61 @@ static const struct drm_connector_helper_funcs drm_bri= dge_connector_helper_funcs .disable_hpd =3D drm_bridge_connector_disable_hpd, }; =20 +static enum drm_mode_status +drm_bridge_connector_tmds_char_rate_valid(const struct drm_connector *conn= ector, + const struct drm_display_mode *mode, + unsigned long long tmds_rate) +{ + 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 bridge->funcs->tmds_char_rate_valid ? + bridge->funcs->tmds_char_rate_valid(bridge, mode, tmds_rate) : + MODE_OK; + + return MODE_ERROR; +} + +static int drm_bridge_connector_clear_infoframe(struct drm_connector *conn= ector, + enum hdmi_infoframe_type type) +{ + 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 bridge->funcs->clear_infoframe ? + bridge->funcs->clear_infoframe(bridge, type) : + 0; + + return -EINVAL; +} + +static int drm_bridge_connector_write_infoframe(struct drm_connector *conn= ector, + enum hdmi_infoframe_type type, + 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 bridge->funcs->write_infoframe(bridge, type, buffer, len); + + return -EINVAL; +} + +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, +}; + /* -----------------------------------------------------------------------= ------ * Bridge Connector Initialisation */ @@ -312,6 +375,10 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, struct drm_connector *connector; struct i2c_adapter *ddc =3D NULL; struct drm_bridge *bridge, *panel_bridge =3D NULL; + const char *vendor =3D "Unknown"; + const char *product =3D "Unknown"; + unsigned int supported_formats =3D BIT(HDMI_COLORSPACE_RGB); + unsigned int max_bpc =3D 8; int connector_type; int ret; =20 @@ -348,6 +415,25 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, bridge_connector->bridge_detect =3D bridge; if (bridge->ops & DRM_BRIDGE_OP_MODES) bridge_connector->bridge_modes =3D bridge; + if (bridge->ops & DRM_BRIDGE_OP_HDMI) { + if (bridge_connector->bridge_hdmi) + return ERR_PTR(-EBUSY); + if (!bridge->funcs->write_infoframe) + return ERR_PTR(-EINVAL); + + bridge_connector->bridge_hdmi =3D bridge; + + if (bridge->supported_formats) + supported_formats =3D bridge->supported_formats; + if (bridge->max_bpc) + max_bpc =3D bridge->max_bpc; + } + + if (bridge->vendor) + vendor =3D bridge->vendor; + + if (bridge->product) + product =3D bridge->product; =20 if (!drm_bridge_get_next_bridge(bridge)) connector_type =3D bridge->type; @@ -370,9 +456,18 @@ struct drm_connector *drm_bridge_connector_init(struct= drm_device *drm, return ERR_PTR(-EINVAL); } =20 - ret =3D drmm_connector_init(drm, connector, - &drm_bridge_connector_funcs, - connector_type, ddc); + if (bridge_connector->bridge_hdmi) + ret =3D drmm_connector_hdmi_init(drm, connector, + vendor, product, + &drm_bridge_connector_funcs, + &drm_bridge_connector_hdmi_funcs, + connector_type, ddc, + supported_formats, + max_bpc); + else + ret =3D drmm_connector_init(drm, connector, + &drm_bridge_connector_funcs, + connector_type, ddc); if (ret) { kfree(bridge_connector); return ERR_PTR(ret); diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index dd39a5b7a711..e385d90ef893 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -762,6 +762,8 @@ static int bridges_show(struct seq_file *m, void *data) drm_puts(&p, " hpd"); if (bridge->ops & DRM_BRIDGE_OP_MODES) drm_puts(&p, " modes"); + if (bridge->ops & DRM_BRIDGE_OP_HDMI) + drm_puts(&p, " hdmi"); drm_puts(&p, "\n"); } =20 diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h index 4baca0d9107b..c45e539fe276 100644 --- a/include/drm/drm_bridge.h +++ b/include/drm/drm_bridge.h @@ -630,6 +630,54 @@ struct drm_bridge_funcs { */ void (*hpd_disable)(struct drm_bridge *bridge); =20 + /** + * @tmds_char_rate_valid: + * + * Check whether a particular TMDS character rate is supported by the + * driver. + * + * This callback is optional and should only be implemented by the + * bridges that take part in the HDMI connector implementation. Bridges + * that implement it shall set set the DRM_BRIDGE_OP_HDMI flag in their + * &drm_bridge->ops. + * + * 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_bridge *bridge, + const struct drm_display_mode *mode, + unsigned long long tmds_rate); + + /** + * @clear_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 and should only be implemented by the + * bridges that take part in the HDMI connector implementation. Bridges + * that implement it shall set set the DRM_BRIDGE_OP_HDMI flag in their + * &drm_bridge->ops. + */ + int (*clear_infoframe)(struct drm_bridge *bridge, + enum hdmi_infoframe_type type); + /** + * @write_infoframe: + * + * Program the infoframe into the hardware. It will be called multiple + * times, once for every updated 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 (*write_infoframe)(struct drm_bridge *bridge, + enum hdmi_infoframe_type type, + const u8 *buffer, size_t len); + /** * @debugfs_init: * @@ -705,6 +753,16 @@ enum drm_bridge_ops { * this flag shall implement the &drm_bridge_funcs->get_modes callback. */ DRM_BRIDGE_OP_MODES =3D BIT(3), + /** + * @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. + * + * 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 + * drivers. + */ + DRM_BRIDGE_OP_HDMI =3D BIT(4), }; =20 /** @@ -773,6 +831,30 @@ struct drm_bridge { * @hpd_cb. */ void *hpd_data; + + /** + * @vendor: Vendor of the product to be used for the SPD InfoFrame + * generation. + */ + const char *vendor; + + /** + * @product: Name of the product to be used for the SPD InfoFrame + * generation. + */ + const char *product; + + /** + * @supported_formats: Bitmask of @hdmi_colorspace listing supported + * output formats. This is only relevant if @DRM_BRIDGE_OP_HDMI is set. + */ + unsigned int supported_formats; + + /** + * @max_bpc: Maximum bits per char the HDMI bridge supports. This is + * only relevant if @DRM_BRIDGE_OP_HDMI is set. + */ + unsigned int max_bpc; }; =20 static inline struct drm_bridge * --=20 2.39.2 From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 163FE200103 for ; Wed, 29 May 2024 23:12:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024354; cv=none; b=d1LMwo9wI5nQXQKSPHizWSyCoRBKvifcou9eIh2js3Whito7RJYvFlZNijcvWXe2lOI0XjyE7XItCbtIFLy4aGLb2yUTqZbnIf5/HRCrdONX3c2I3OpV/H5fyb5RF8Kbep5ECnB4RRYkTv+Kp/BqHf+KQIG/aUtBOAtt3j5g6GU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024354; c=relaxed/simple; bh=BLTMrmfRiYz+a4tS74ezbT2hZO40I+AiAHfNW/m4HPQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oSBxI2zsl+risxS3v300BBpNhnGy/Awh7W7F90/82s68EqDwcuxCQXuOc+Ayyl3ZSyjJwoQMmVvl9NQHTV4UmaiyybpiktVqdSpBKSwNrl63uXzHxJVAvY6Rqw7ZXm/IGj25bodufNaSskUPHeRnvoqO2t0gMG3CD+J2bDUECAo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=pnJSBKhY; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="pnJSBKhY" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-52ae38957e8so329020e87.1 for ; Wed, 29 May 2024 16:12:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024351; x=1717629151; 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=oSCLgDYohNznRCwnS8tfo5EB4gMkp+kuVZWS1xIx1Q0=; b=pnJSBKhYwhFbKyOVnBrXQqdZMUQYmIed5XFAo21xMH5EduBR+xaB5R4pBqOuQf65mK 7RlxEn1Tb/RMDKVkHfPqnROL7IDxya7sIZubsp0A8REFmMt8Fhk70znaKdMuLUep+6HI JVS1/h40Tf5P8sp/6GF+L2YO280nKWYDkrDKJHA2EMsWNlMQjgEl/4WPoesppaTs/Mcp ZIGMQKN7lC426ZanOkKPGkuTCa+hGd83Egty8X7weUTBYbEkOdHcJMEEVXMFaOdlWcxl cstKtPTzVwec9j+GCCbk5CiuWdpJccJGYUh7HdYLWS4Q3rYs1qa1Q+pbz3KYjjlHHu5C LPBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024351; x=1717629151; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=oSCLgDYohNznRCwnS8tfo5EB4gMkp+kuVZWS1xIx1Q0=; b=YLJbTNvbiGv8OYkVB1ATFncpC6kbPcLgNLPKgdODyjdE8uPcOyjKfc1uVhlGI7sLhv peDg113Z885FhDfopERt2zvGXyj4L74eG5ziK+o2GtOlVbg74SZK28GunHVFyEC+OoAl tB2QWzyFUWPEXGnRt88ov07Ia8de7eybxzg3f9p3v2CHePR8yGmVRpYcFBGofmhkmV4U L/lar6J6+CSW+IydxTWUmBwCTLnWrsq4N4SL/ai3+cXv2Web1WAz/1jWLSFdQ/SRBTht wp5rjVPKvre4fXR4MHl/5VcrhG6aGVjjMoOt4uU+XPReBjjBpzDZbxRcq2BOmcJd1W7v Kt3Q== X-Forwarded-Encrypted: i=1; AJvYcCVMI2P66wSUsQjsiwN945d4QXR78XHQCA118Djl1JjfdIcVQAM87SB0O+4d9zNfBTzMdh5MgaBLVX2/unI14SiQWtQc9lTAIHdGUMqA X-Gm-Message-State: AOJu0Yw4dDZ7INw11LeaXYrV20NB/H4Vdbk1lpx3ILOsS02p2qysWSOE +GDpRMl18lKiVT73wYjmnsjtUFH5UZtt8G+knOTXxkRFQ7a0Df5lznU+kDjxnqw= X-Google-Smtp-Source: AGHT+IED00Nm5mAxm/FX23Rm3CEi3WI/fVSCS88PVojYjAKG46K22pFDih1lMhk2JtVr9IDeDcpXHA== X-Received: by 2002:ac2:5e8b:0:b0:52b:401e:1b5e with SMTP id 2adb3069b0e04-52b7d4225c8mr266833e87.17.1717024351237; Wed, 29 May 2024 16:12:31 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:30 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:27 +0300 Subject: [PATCH v3 4/7] drm/msm/hdmi: switch to atomic bridge 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: <20240530-bridge-hdmi-connector-v3-4-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=2124; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=BLTMrmfRiYz+a4tS74ezbT2hZO40I+AiAHfNW/m4HPQ=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7Zb04aIt+1q301e04xSTt7Fn8NIuv7kWJOC2 sA8qKwVOM6JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WwAKCRCLPIo+Aiko 1cvQB/40zDY86KHpQQKKgrgHeU5s5ns13/oPw5qGupVySmwib3re/YXYqywaLQxoUxnWd/WUAiO 5GAdLHL3m5ZynKBrIA+uYZDbeeTniF25BwWkOhkPV6Wcd/BdqBPKrP9dSclXgKs5Ea6uhzmiYL1 sAY9pc65Ujne7ZlQ7fIkPeDLBDIf4CYxA6SFrQoPsrCyGrcX7sm/VTqChTU7mkO4qWIyfXfa/81 4NyHjYl45+QPKaHssFr4t/3/WSsBj2g0ywnhSjR1WpKhETArPiX5VKI24ZEn8/7HcAdSMIgDafI 38bQLf4xRGrpn3X73H6nsi9qtgm42DKC9vORHts4TvGS6F5q X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Change MSM HDMI bridge to use atomic_* callbacks in preparation to enablign the HDMI connector support. Signed-off-by: Dmitry Baryshkov Acked-by: Maxime Ripard --- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index 4a5b5112227f..d839c71091dc 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -126,7 +126,8 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi *= hdmi) hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); } =20 -static void msm_hdmi_bridge_pre_enable(struct drm_bridge *bridge) +static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge, + struct drm_bridge_state *old_bridge_state) { struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; @@ -152,7 +153,8 @@ static void msm_hdmi_bridge_pre_enable(struct drm_bridg= e *bridge) msm_hdmi_hdcp_on(hdmi->hdcp_ctrl); } =20 -static void msm_hdmi_bridge_post_disable(struct drm_bridge *bridge) +static void msm_hdmi_bridge_atomic_post_disable(struct drm_bridge *bridge, + struct drm_bridge_state *old_bridge_state) { struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; @@ -299,8 +301,11 @@ static enum drm_mode_status msm_hdmi_bridge_mode_valid= (struct drm_bridge *bridge } =20 static const struct drm_bridge_funcs msm_hdmi_bridge_funcs =3D { - .pre_enable =3D msm_hdmi_bridge_pre_enable, - .post_disable =3D msm_hdmi_bridge_post_disable, + .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, + .atomic_reset =3D drm_atomic_helper_bridge_reset, + .atomic_pre_enable =3D msm_hdmi_bridge_atomic_pre_enable, + .atomic_post_disable =3D msm_hdmi_bridge_atomic_post_disable, .mode_set =3D msm_hdmi_bridge_mode_set, .mode_valid =3D msm_hdmi_bridge_mode_valid, .edid_read =3D msm_hdmi_bridge_edid_read, --=20 2.39.2 From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB272200119 for ; Wed, 29 May 2024 23:12:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024356; cv=none; b=FGRJ9dLC9fAeac6cF/ET4s9Ve61Ej6nLKoPn31mTUp9IWHPZoti6j1MW/m8lDCCLrh6R5o6CQUK7FFJc3L2xp5n/YPPnMoLQeVPRT9pnSFSAm3BL4+RPhTZy8l4S70eEudMu9oqL2q0BvwOJ7qlbG2HWGPzFKdkpMVRSlBvucQs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024356; c=relaxed/simple; bh=5Yg0YSDKjqAR7arMVGSXgdv/Zx/VQXuYD6Q+vFXyJaI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JdngvBJ704vR8sSrbempG3N/I8QVGoln5zk5BNhjzMn+ms1so5uFIFwpNW+5CP/3MO5aMdxjW/r6erOUZRXI0Oq3RpyNxRGhEQ7ep+Ew2dVjQiZ5vSypiO70RnA3yJ59buPoRW77GH+DBmfR/95Le0y/M/jjEYkoseBh1BF90UY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=r+qAzcui; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="r+qAzcui" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5241b49c0daso351499e87.0 for ; Wed, 29 May 2024 16:12:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024352; x=1717629152; 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=CwIIiRP34uv5IfVcvNl6bx82qs5CNtf+aHIfcxszzGU=; b=r+qAzcuihN0ePMRAhcLN66nWnKMXjMv0nq5fuxMeqhXJmx77poIN+8ZVIKMxTcF4pB Ux8wrGTtnOnQgHji/laziVktxXmRU77evqpY8NGv4mS3WdeyqtubD4Jq7R5TNM97QKRN rMp4S6jNKF7EFtKg2aC3sklZYQFj/Kxvm2rEjxAKmJv+hDlfyQ4aRc3diY+kiYt7bMWG uMbcPktN2Cbv71PEmoWY65zr83bdZ++SdaeaUeVaZnOQ5DfhWn8uWi5FZaM/KGm5251S GhADV2LY9wlOwCpq3vCj9TkyDxq1SMmphZDM6LzFN00jN4X7dOuF52D1be7G4rVo//tZ IxiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024352; x=1717629152; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CwIIiRP34uv5IfVcvNl6bx82qs5CNtf+aHIfcxszzGU=; b=pX36Zy1RntcbTjdzQMK4oCII0HwTs9HZ05653vuaqQnukQGgn4rtJkCelRDcmfwXvM pQ8ovafVQtYS7QIEj9jL+d2afogY8kYRB7VQTUkh4vZfSxdHcSCtDgI5nlLNr3w2bkcZ gRBrPUJJDpi28/KdN8MMtXsRwzf9xAzP39QZdqgufllQRc+TE2VGRLv7FBzdZQRRVdSd Y+vZ4PgNRbQcEAZUXt+R2SSxf8uS0r0g7MIWbiTTuUFI37+lDrzhtSeFPYgpOfGb9sba iRE/Tl7RmNdxMKtes+5mSqWFAPcGzZVgLxK/25euRNCbkU/STgRxaJxOtCZkefcTf1IU +1Mg== X-Forwarded-Encrypted: i=1; AJvYcCXVmKW7E1qO3I8JtcKzeCUsGYwcJMTjqd+H2djTjdTqevAMM6iMihkoTXe3/gb9vmdbazBjRJtbAM7rrVGxqBRAxHGaV4AI9+5kfpU1 X-Gm-Message-State: AOJu0YwVw1JS4ibLPYXoM5ae9X5/xCHTD/wTY0Ob1jghr0X2c2SU6pzF BEfPz/cYG0u250xVbtgrKUdw1hIaR6VMfnF2v6Qjs3F8Z3nHSxAuvEQmZMptIE8= X-Google-Smtp-Source: AGHT+IGkrWAOyr6Nj34noOCqxyGz5K3UWL/5cwT8jnB89IC2QsVad5GdTdVqFBERxhYST6c1VFIiQg== X-Received: by 2002:a05:6512:3b6:b0:51d:3b87:70a4 with SMTP id 2adb3069b0e04-52b7d43a877mr282771e87.36.1717024352007; Wed, 29 May 2024 16:12:32 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:31 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:28 +0300 Subject: [PATCH v3 5/7] drm/msm/hdmi: make use of the drm_connector_hdmi framework 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: <20240530-bridge-hdmi-connector-v3-5-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=19838; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=5Yg0YSDKjqAR7arMVGSXgdv/Zx/VQXuYD6Q+vFXyJaI=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7ZbnNIgMdlLmSooj6PB7hZ+WDKiWLxAFtu1P OuKJQGBZ52JATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WwAKCRCLPIo+Aiko 1UBaCACGB0Z8ZlrpPGG/cx6PFNpQ/5nWt02ee0HAeM4KhWSSiJg6t1s4sywnRhmix+bAF/O2LO9 X3flzO257gfxt6RbIfXZbTO7JLMqUJT86+upEMpXixJNf6owRalltWs7R0T/roGH+StwPqmS4CB k+bGJGn56ePqwCV2/qH54NSn3c+UU/cZH14yWzbIVUqjUUQctzQ/4B5U3Mjac9aLtyckM363uOg d13mx1K9VnygMYUkZLOL1rIiiVgWRxB1n87qRohUmGRwvAvDU/XWcseptHF3LHUuCqNDGyWpxCE 76LCFRbIm9M90rmgZKCi36bx7ZtS5VY/udKVDUWZONGgYWsU X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Setup the HDMI connector on the MSM HDMI outputs. Make use of atomic_check hook and of the provided Infoframe infrastructure. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/Kconfig | 2 + drivers/gpu/drm/msm/hdmi/hdmi.c | 44 ++------- drivers/gpu/drm/msm/hdmi/hdmi.h | 16 +--- drivers/gpu/drm/msm/hdmi/hdmi_audio.c | 74 ++++----------- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 165 +++++++++++++++++++++++++----= ---- 5 files changed, 160 insertions(+), 141 deletions(-) diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig index 1931ecf73e32..b5c78c1dd744 100644 --- a/drivers/gpu/drm/msm/Kconfig +++ b/drivers/gpu/drm/msm/Kconfig @@ -164,6 +164,8 @@ config DRM_MSM_HDMI bool "Enable HDMI support in MSM DRM driver" depends on DRM_MSM default y + select DRM_DISPLAY_HDMI_HELPER + select DRM_DISPLAY_HDMI_STATE_HELPER help Compile in support for the HDMI output MSM DRM driver. It can be a primary or a secondary display on device. Note that this is used diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdm= i.c index 24abcb7254cc..179da72f8f70 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -12,6 +12,7 @@ =20 #include #include +#include =20 #include #include "hdmi.h" @@ -165,8 +166,6 @@ int msm_hdmi_modeset_init(struct hdmi *hdmi, hdmi->dev =3D dev; hdmi->encoder =3D encoder; =20 - hdmi_audio_infoframe_init(&hdmi->audio.infoframe); - ret =3D msm_hdmi_bridge_init(hdmi); if (ret) { DRM_DEV_ERROR(dev->dev, "failed to create HDMI bridge: %d\n", ret); @@ -254,40 +253,12 @@ static int msm_hdmi_audio_hw_params(struct device *de= v, void *data, struct hdmi_codec_params *params) { struct hdmi *hdmi =3D dev_get_drvdata(dev); - unsigned int chan; - unsigned int channel_allocation =3D 0; unsigned int rate; - unsigned int level_shift =3D 0; /* 0dB */ - bool down_mix =3D false; + int ret; =20 DRM_DEV_DEBUG(dev, "%u Hz, %d bit, %d channels\n", params->sample_rate, params->sample_width, params->cea.channels); =20 - switch (params->cea.channels) { - case 2: - /* FR and FL speakers */ - channel_allocation =3D 0; - chan =3D MSM_HDMI_AUDIO_CHANNEL_2; - break; - case 4: - /* FC, LFE, FR and FL speakers */ - channel_allocation =3D 0x3; - chan =3D MSM_HDMI_AUDIO_CHANNEL_4; - break; - case 6: - /* RR, RL, FC, LFE, FR and FL speakers */ - channel_allocation =3D 0x0B; - chan =3D MSM_HDMI_AUDIO_CHANNEL_6; - break; - case 8: - /* FRC, FLC, RR, RL, FC, LFE, FR and FL speakers */ - channel_allocation =3D 0x1F; - chan =3D MSM_HDMI_AUDIO_CHANNEL_8; - break; - default: - return -EINVAL; - } - switch (params->sample_rate) { case 32000: rate =3D HDMI_SAMPLE_RATE_32KHZ; @@ -316,9 +287,12 @@ static int msm_hdmi_audio_hw_params(struct device *dev= , void *data, return -EINVAL; } =20 - msm_hdmi_audio_set_sample_rate(hdmi, rate); - msm_hdmi_audio_info_setup(hdmi, 1, chan, channel_allocation, - level_shift, down_mix); + ret =3D drm_atomic_helper_connector_hdmi_update_audio_infoframe(hdmi->con= nector, + ¶ms->cea); + if (ret) + return ret; + + msm_hdmi_audio_info_setup(hdmi, rate, params->cea.channels); =20 return 0; } @@ -327,7 +301,7 @@ static void msm_hdmi_audio_shutdown(struct device *dev,= void *data) { struct hdmi *hdmi =3D dev_get_drvdata(dev); =20 - msm_hdmi_audio_info_setup(hdmi, 0, 0, 0, 0, 0); + msm_hdmi_audio_disable(hdmi); } =20 static const struct hdmi_codec_ops msm_hdmi_audio_codec_ops =3D { diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.h b/drivers/gpu/drm/msm/hdmi/hdm= i.h index 4586baf36415..0ac034eaaf0f 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.h +++ b/drivers/gpu/drm/msm/hdmi/hdmi.h @@ -24,8 +24,8 @@ struct hdmi_platform_config; =20 struct hdmi_audio { bool enabled; - struct hdmi_audio_infoframe infoframe; int rate; + int channels; }; =20 struct hdmi_hdcp_ctrl; @@ -199,12 +199,6 @@ static inline int msm_hdmi_pll_8996_init(struct platfo= rm_device *pdev) /* * audio: */ -/* Supported HDMI Audio channels and rates */ -#define MSM_HDMI_AUDIO_CHANNEL_2 0 -#define MSM_HDMI_AUDIO_CHANNEL_4 1 -#define MSM_HDMI_AUDIO_CHANNEL_6 2 -#define MSM_HDMI_AUDIO_CHANNEL_8 3 - #define HDMI_SAMPLE_RATE_32KHZ 0 #define HDMI_SAMPLE_RATE_44_1KHZ 1 #define HDMI_SAMPLE_RATE_48KHZ 2 @@ -213,12 +207,8 @@ static inline int msm_hdmi_pll_8996_init(struct platfo= rm_device *pdev) #define HDMI_SAMPLE_RATE_176_4KHZ 5 #define HDMI_SAMPLE_RATE_192KHZ 6 =20 -int msm_hdmi_audio_update(struct hdmi *hdmi); -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, bool enabled, - uint32_t num_of_channels, uint32_t channel_allocation, - uint32_t level_shift, bool down_mix); -void msm_hdmi_audio_set_sample_rate(struct hdmi *hdmi, int rate); - +int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels); +int msm_hdmi_audio_disable(struct hdmi *hdmi); =20 /* * hdmi bridge: diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c b/drivers/gpu/drm/msm/hd= mi/hdmi_audio.c index 4c2058c4adc1..b10d43f8c621 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_audio.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_audio.c @@ -7,9 +7,6 @@ #include #include "hdmi.h" =20 -/* maps MSM_HDMI_AUDIO_CHANNEL_n consts used by audio driver to # of chann= els: */ -static int nchannels[] =3D { 2, 4, 6, 8 }; - /* Supported HDMI Audio sample rates */ #define MSM_HDMI_SAMPLE_RATE_32KHZ 0 #define MSM_HDMI_SAMPLE_RATE_44_1KHZ 1 @@ -71,19 +68,20 @@ static const struct hdmi_msm_audio_arcs *get_arcs(unsig= ned long int pixclock) return NULL; } =20 -int msm_hdmi_audio_update(struct hdmi *hdmi) +static int msm_hdmi_audio_update(struct hdmi *hdmi) { struct hdmi_audio *audio =3D &hdmi->audio; - struct hdmi_audio_infoframe *info =3D &audio->infoframe; const struct hdmi_msm_audio_arcs *arcs =3D NULL; bool enabled =3D audio->enabled; uint32_t acr_pkt_ctrl, vbi_pkt_ctrl, aud_pkt_ctrl; - uint32_t infofrm_ctrl, audio_config; + uint32_t audio_config; + + if (!hdmi->hdmi_mode) + return -EINVAL; + + DBG("audio: enabled=3D%d, channels=3D%d, rate=3D%d", + audio->enabled, audio->channels, audio->rate); =20 - DBG("audio: enabled=3D%d, channels=3D%d, channel_allocation=3D0x%x, " - "level_shift_value=3D%d, downmix_inhibit=3D%d, rate=3D%d", - audio->enabled, info->channels, info->channel_allocation, - info->level_shift_value, info->downmix_inhibit, audio->rate); DBG("video: power_on=3D%d, pixclock=3D%lu", hdmi->power_on, hdmi->pixcloc= k); =20 if (enabled && !(hdmi->power_on && hdmi->pixclock)) { @@ -104,7 +102,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) acr_pkt_ctrl =3D hdmi_read(hdmi, REG_HDMI_ACR_PKT_CTRL); vbi_pkt_ctrl =3D hdmi_read(hdmi, REG_HDMI_VBI_PKT_CTRL); aud_pkt_ctrl =3D hdmi_read(hdmi, REG_HDMI_AUDIO_PKT_CTRL1); - infofrm_ctrl =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL0); audio_config =3D hdmi_read(hdmi, REG_HDMI_AUDIO_CFG); =20 /* Clear N/CTS selection bits */ @@ -113,7 +110,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) if (enabled) { uint32_t n, cts, multiplier; enum hdmi_acr_cts select; - uint8_t buf[14]; =20 n =3D arcs->lut[audio->rate].n; cts =3D arcs->lut[audio->rate].cts; @@ -155,20 +151,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) HDMI_ACR_1_N(n)); =20 hdmi_write(hdmi, REG_HDMI_AUDIO_PKT_CTRL2, - COND(info->channels !=3D 2, HDMI_AUDIO_PKT_CTRL2_LAYOUT) | + COND(audio->channels !=3D 2, HDMI_AUDIO_PKT_CTRL2_LAYOUT) | HDMI_AUDIO_PKT_CTRL2_OVERRIDE); =20 acr_pkt_ctrl |=3D HDMI_ACR_PKT_CTRL_CONT; acr_pkt_ctrl |=3D HDMI_ACR_PKT_CTRL_SEND; =20 - /* configure infoframe: */ - hdmi_audio_infoframe_pack(info, buf, sizeof(buf)); - hdmi_write(hdmi, REG_HDMI_AUDIO_INFO0, - (buf[3] << 0) | (buf[4] << 8) | - (buf[5] << 16) | (buf[6] << 24)); - hdmi_write(hdmi, REG_HDMI_AUDIO_INFO1, - (buf[7] << 0) | (buf[8] << 8)); - hdmi_write(hdmi, REG_HDMI_GC, 0); =20 vbi_pkt_ctrl |=3D HDMI_VBI_PKT_CTRL_GC_ENABLE; @@ -176,11 +164,6 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) =20 aud_pkt_ctrl |=3D HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND; =20 - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND; - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT; - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE; - infofrm_ctrl |=3D HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; - audio_config &=3D ~HDMI_AUDIO_CFG_FIFO_WATERMARK__MASK; audio_config |=3D HDMI_AUDIO_CFG_FIFO_WATERMARK(4); audio_config |=3D HDMI_AUDIO_CFG_ENGINE_ENABLE; @@ -190,17 +173,12 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) vbi_pkt_ctrl &=3D ~HDMI_VBI_PKT_CTRL_GC_ENABLE; vbi_pkt_ctrl &=3D ~HDMI_VBI_PKT_CTRL_GC_EVERY_FRAME; aud_pkt_ctrl &=3D ~HDMI_AUDIO_PKT_CTRL1_AUDIO_SAMPLE_SEND; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SEND; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_CONT; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_SOURCE; - infofrm_ctrl &=3D ~HDMI_INFOFRAME_CTRL0_AUDIO_INFO_UPDATE; audio_config &=3D ~HDMI_AUDIO_CFG_ENGINE_ENABLE; } =20 hdmi_write(hdmi, REG_HDMI_ACR_PKT_CTRL, acr_pkt_ctrl); hdmi_write(hdmi, REG_HDMI_VBI_PKT_CTRL, vbi_pkt_ctrl); hdmi_write(hdmi, REG_HDMI_AUDIO_PKT_CTRL1, aud_pkt_ctrl); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, infofrm_ctrl); =20 hdmi_write(hdmi, REG_HDMI_AUD_INT, COND(enabled, HDMI_AUD_INT_AUD_FIFO_URUN_INT) | @@ -214,41 +192,29 @@ int msm_hdmi_audio_update(struct hdmi *hdmi) return 0; } =20 -int msm_hdmi_audio_info_setup(struct hdmi *hdmi, bool enabled, - uint32_t num_of_channels, uint32_t channel_allocation, - uint32_t level_shift, bool down_mix) +int msm_hdmi_audio_info_setup(struct hdmi *hdmi, int rate, int channels) { - struct hdmi_audio *audio; - if (!hdmi) return -ENXIO; =20 - audio =3D &hdmi->audio; - - if (num_of_channels >=3D ARRAY_SIZE(nchannels)) + if ((rate < 0) || (rate >=3D MSM_HDMI_SAMPLE_RATE_MAX)) return -EINVAL; =20 - audio->enabled =3D enabled; - audio->infoframe.channels =3D nchannels[num_of_channels]; - audio->infoframe.channel_allocation =3D channel_allocation; - audio->infoframe.level_shift_value =3D level_shift; - audio->infoframe.downmix_inhibit =3D down_mix; + hdmi->audio.rate =3D rate; + hdmi->audio.channels =3D channels; + hdmi->audio.enabled =3D true; =20 return msm_hdmi_audio_update(hdmi); } =20 -void msm_hdmi_audio_set_sample_rate(struct hdmi *hdmi, int rate) +int msm_hdmi_audio_disable(struct hdmi *hdmi) { - struct hdmi_audio *audio; - if (!hdmi) - return; - - audio =3D &hdmi->audio; + return -ENXIO; =20 - if ((rate < 0) || (rate >=3D MSM_HDMI_SAMPLE_RATE_MAX)) - return; + hdmi->audio.rate =3D 0; + hdmi->audio.channels =3D 2; + hdmi->audio.enabled =3D false; =20 - audio->rate =3D rate; - msm_hdmi_audio_update(hdmi); + return msm_hdmi_audio_update(hdmi); } diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index d839c71091dc..3ac63edbf5bb 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -7,6 +7,7 @@ #include #include #include +#include =20 #include "msm_kms.h" #include "hdmi.h" @@ -68,23 +69,17 @@ static void power_off(struct drm_bridge *bridge) =20 #define AVI_IFRAME_LINE_NUMBER 1 =20 -static void msm_hdmi_config_avi_infoframe(struct hdmi *hdmi) +static int msm_hdmi_config_avi_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) { - struct drm_crtc *crtc =3D hdmi->encoder->crtc; - const struct drm_display_mode *mode =3D &crtc->state->adjusted_mode; - union hdmi_infoframe frame; - u8 buffer[HDMI_INFOFRAME_SIZE(AVI)]; + u32 buf[4] =3D {}; u32 val; - int len; + int i; =20 - drm_hdmi_avi_infoframe_from_display_mode(&frame.avi, - hdmi->connector, mode); - - len =3D hdmi_infoframe_pack(&frame, buffer, sizeof(buffer)); - if (len < 0) { + if (len !=3D HDMI_INFOFRAME_SIZE(AVI) || len - 3 > sizeof(buf)) { DRM_DEV_ERROR(&hdmi->pdev->dev, "failed to configure avi infoframe\n"); - return; + return -EINVAL; } =20 /* @@ -93,37 +88,126 @@ static void msm_hdmi_config_avi_infoframe(struct hdmi = *hdmi) * written to the LSB byte of AVI_INFO0 and the version is written to * the third byte from the LSB of AVI_INFO3 */ - hdmi_write(hdmi, REG_HDMI_AVI_INFO(0), + memcpy(buf, &buffer[3], len - 3); + + buf[3] |=3D buffer[1] << 24; + + for (i =3D 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_AVI_INFO(i), buf[i]); + + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + 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; + val |=3D HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE(AVI_IFRAME_LINE_NUMBER); + hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + + return 0; +} + +static int msm_hdmi_config_audio_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) +{ + u32 val; + + if (len !=3D HDMI_INFOFRAME_SIZE(AUDIO)) { + DRM_DEV_ERROR(&hdmi->pdev->dev, + "failed to configure audio infoframe\n"); + return -EINVAL; + } + + hdmi_write(hdmi, REG_HDMI_AUDIO_INFO0, buffer[3] | buffer[4] << 8 | buffer[5] << 16 | buffer[6] << 24); =20 - hdmi_write(hdmi, REG_HDMI_AVI_INFO(1), + hdmi_write(hdmi, REG_HDMI_AUDIO_INFO1, buffer[7] | buffer[8] << 8 | buffer[9] << 16 | buffer[10] << 24); =20 - hdmi_write(hdmi, REG_HDMI_AVI_INFO(2), - buffer[11] | - buffer[12] << 8 | - buffer[13] << 16 | - buffer[14] << 24); + val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); + 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); + + return 0; +} + +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); =20 - hdmi_write(hdmi, REG_HDMI_AVI_INFO(3), - buffer[15] | - buffer[16] << 8 | - buffer[1] << 24); + 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); =20 - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL0, - HDMI_INFOFRAME_CTRL0_AVI_SEND | - HDMI_INFOFRAME_CTRL0_AVI_CONT); + break; =20 - val =3D hdmi_read(hdmi, REG_HDMI_INFOFRAME_CTRL1); - val &=3D ~HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE__MASK; - val |=3D HDMI_INFOFRAME_CTRL1_AVI_INFO_LINE(AVI_IFRAME_LINE_NUMBER); - hdmi_write(hdmi, REG_HDMI_INFOFRAME_CTRL1, val); + 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; + + 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); + default: + drm_dbg_driver(hdmi_bridge->base.dev, "Unsupported infoframe type %x\n",= type); + return 0; + } +} + +static int msm_hdmi_bridge_atomic_check(struct drm_bridge *bridge, + struct drm_bridge_state *bridge_state, + struct drm_crtc_state *crtc_state, + struct drm_connector_state *conn_state) +{ + return drm_atomic_helper_connector_hdmi_check(conn_state->connector, conn= _state->state); } =20 static void msm_hdmi_bridge_atomic_pre_enable(struct drm_bridge *bridge, @@ -132,6 +216,10 @@ static void msm_hdmi_bridge_atomic_pre_enable(struct d= rm_bridge *bridge, struct hdmi_bridge *hdmi_bridge =3D to_hdmi_bridge(bridge); struct hdmi *hdmi =3D hdmi_bridge->hdmi; struct hdmi_phy *phy =3D hdmi->phy; + struct drm_encoder *encoder =3D bridge->encoder; + struct drm_atomic_state *state =3D old_bridge_state->base.state; + struct drm_connector *connector =3D + drm_atomic_get_new_connector_for_encoder(state, encoder); =20 DBG("power up"); =20 @@ -139,12 +227,10 @@ static void msm_hdmi_bridge_atomic_pre_enable(struct = drm_bridge *bridge, msm_hdmi_phy_resource_enable(phy); msm_hdmi_power_on(bridge); hdmi->power_on =3D true; - if (hdmi->hdmi_mode) { - msm_hdmi_config_avi_infoframe(hdmi); - msm_hdmi_audio_update(hdmi); - } } =20 + drm_atomic_helper_connector_hdmi_update_infoframes(connector, state); + msm_hdmi_phy_powerup(phy, hdmi->pixclock); =20 msm_hdmi_set_mode(hdmi, true); @@ -171,8 +257,6 @@ static void msm_hdmi_bridge_atomic_post_disable(struct = drm_bridge *bridge, if (hdmi->power_on) { power_off(bridge); hdmi->power_on =3D false; - if (hdmi->hdmi_mode) - msm_hdmi_audio_update(hdmi); msm_hdmi_phy_resource_disable(phy); } } @@ -233,9 +317,6 @@ static void msm_hdmi_bridge_mode_set(struct drm_bridge = *bridge, frame_ctrl |=3D HDMI_FRAME_CTRL_INTERLACED_EN; DBG("frame_ctrl=3D%08x", frame_ctrl); hdmi_write(hdmi, REG_HDMI_FRAME_CTRL, frame_ctrl); - - if (hdmi->hdmi_mode) - msm_hdmi_audio_update(hdmi); } =20 static const struct drm_edid *msm_hdmi_bridge_edid_read(struct drm_bridge = *bridge, @@ -304,12 +385,15 @@ static const struct drm_bridge_funcs msm_hdmi_bridge_= funcs =3D { .atomic_duplicate_state =3D drm_atomic_helper_bridge_duplicate_state, .atomic_destroy_state =3D drm_atomic_helper_bridge_destroy_state, .atomic_reset =3D drm_atomic_helper_bridge_reset, + .atomic_check =3D msm_hdmi_bridge_atomic_check, .atomic_pre_enable =3D msm_hdmi_bridge_atomic_pre_enable, .atomic_post_disable =3D msm_hdmi_bridge_atomic_post_disable, .mode_set =3D msm_hdmi_bridge_mode_set, .mode_valid =3D msm_hdmi_bridge_mode_valid, .edid_read =3D msm_hdmi_bridge_edid_read, .detect =3D msm_hdmi_bridge_detect, + .clear_infoframe =3D msm_hdmi_bridge_clear_infoframe, + .write_infoframe =3D msm_hdmi_bridge_write_infoframe, }; =20 static void @@ -341,8 +425,11 @@ int msm_hdmi_bridge_init(struct hdmi *hdmi) bridge->funcs =3D &msm_hdmi_bridge_funcs; bridge->ddc =3D hdmi->i2c; bridge->type =3D DRM_MODE_CONNECTOR_HDMIA; + bridge->vendor =3D "Qualcomm"; + bridge->product =3D "Snapdragon"; bridge->ops =3D DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_DETECT | + DRM_BRIDGE_OP_HDMI | DRM_BRIDGE_OP_EDID; =20 ret =3D devm_drm_bridge_add(hdmi->dev->dev, bridge); --=20 2.39.2 From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7AB9020012A for ; Wed, 29 May 2024 23:12:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024356; cv=none; b=CkGd64GAM3Qu/aYC8a+1JpoQ1JigkiK5x7Hkn6Kk1c9uB7hMcs/drLXX/vVULoznma+sdaR0Llv8caY1E+z4bmWK9y6wsYfbSwB5QzwQOJ7SWL4q0rmPI34+cHhdhRFKbnrawCpPgQTrvFpQweBx7ij2g6W90q24RPg5hJysSiM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024356; c=relaxed/simple; bh=JXbaAkUfXwOLePC7VJ3jRbdq5WguoXJxRCdZfMDCGD0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JaDDBfmlosd+rQzGBT+YTEE23vTUfqsAEvpzNV7k9M5hY/Y9wBX+MfEgYm8jPWUsgal8tF9S/Jlt0kDofDxfuZTTckDITHT39pviMYK4xH+LYihcovzGuMciW8dsbSlIy/J/6wMLAzdy2SAWriA+iJDQErfHVP/hFO0c51iiKbI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=PLuJjRBG; arc=none smtp.client-ip=209.85.167.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="PLuJjRBG" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-52ac0c4b62cso303108e87.2 for ; Wed, 29 May 2024 16:12:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024353; x=1717629153; 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=TkMzRYwH0rVG++I7PNZai1lbvWhZpzJwskrcS26a0W8=; b=PLuJjRBGozU7FmlnuSZWd2Y8/nOUobrUgg08Nzpa036aR3blbWo4hTdpyBj94/Meuu fCkOpA8tu9RBlHVkVicn+bNRK4pg7chq6RNshjNy7YoIWe7cPgp/y8LdMKvCCY5+PUi3 p3mVyrnaovqN2PT3u5EnLkIeIzhs1Qp9ZuspsNbm+tcQcC8bRkeNpakU3gM5QtF5kedu 7h4qT2hSV7H0qDVOuxhcP72VJZpLSGHzWNTerJCKy6uUR6LTrPprE4XFs2pxzhk6VRYc XR2BwdZ+iFCxkBfRLNtqWfmSNOgW55ZdgdmY0NeCK2zz5hf6ok05/r2oB6uBV8cpJn32 Vg7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024353; x=1717629153; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TkMzRYwH0rVG++I7PNZai1lbvWhZpzJwskrcS26a0W8=; b=osJCCLPpI5QJLHuLwf4+IfbzleaRCmoOZ//9Qd+HJEBl5aTXcewC4yej9riv3G8HjO WrKxJwk10WUqWtdsavvOXeaeKjZw/gF+h1dSTZqsjM+2patewFuMfavA+T6Ab4hcXxdX uSbvAXrL0sG+L+M5QvLq9KI8eNhLGbiuyJqYzSTJKd4HGJZDkJJFWVk6flt0jdy5lXNj GA1Z8FbYUL4zqCA+0JhHab287SkiORQHBgZg6nfDNDzAV6cU2EhvYVDmoLnUbNef1uyn J2VQgWf+VmrlgjJvFK4zk4IW2R8xynQrmAHZYKWU6Ou/Pw4YmRkyBzoL2lxdQVYNsBUt YWQQ== X-Forwarded-Encrypted: i=1; AJvYcCUBxh5Oqk2y/XP+M+9dKjeBsBuZ1/tgvKGJ5mlZGSEpi1bSniLTs/vakz/50fbeSmI1Kd48AX0t9wAMagJchuiLtIc+VIymOh2R5gFJ X-Gm-Message-State: AOJu0Yxe1sC80SNBI6ZdlNI5G/JCkaxSd+Z1ZMO/KUHNQ4hI5LdaVyA2 nXjXNulFapF8lRE0mF8zAuT8+rKFT7cyMeVVtk30kIQIlB4KAvq/gXi1qVAg1Ok= X-Google-Smtp-Source: AGHT+IGmn4vLOr1MpA4C9QZUwUHy3hAdOgzgBEcF4Qehtqq74DHO6cH6XT1OjA7Xg6kiavbvMjoCdg== X-Received: by 2002:a05:6512:48d7:b0:52b:51f9:a37d with SMTP id 2adb3069b0e04-52b7d48dbaamr287163e87.56.1717024352703; Wed, 29 May 2024 16:12:32 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:32 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:29 +0300 Subject: [PATCH v3 6/7] drm/msm/hdmi: update HDMI_GEN_PKT_CTRL_GENERIC0_UPDATE definition 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: <20240530-bridge-hdmi-connector-v3-6-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=1113; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=JXbaAkUfXwOLePC7VJ3jRbdq5WguoXJxRCdZfMDCGD0=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7ZbQzkUf+QwXevZVgVGcnoXh6v/BnUkVpyoc TiWtOs/RsmJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WwAKCRCLPIo+Aiko 1aJICACGzEbeaqCcKTsoSOiXZTVsNiRuecSSJPWPE015VnX/qerF5K3/E+W4puR/itA39pQ+bcq XkmAGajulOanAgaEFLW5+CgQs/hK19qo2bLZ0VI1iB60zzfsnVU4feOKWnKvESKWOpDNhVhsVgB M0Feb0yG+pNYFPlh8uYHaU2PONT8HFdj3kzXJ4drgba2WdWRpUG6zR0BcfrkWkRlAkkVr4nAidl ZC2F20SCwLa6EsGFmKm0XbHJayCT52ncDPTRcpHGdSpwUo72VagG341Lyerufqww2nTTO3csU5t gcLLxlZ7++W071qCfiOGgJ4h2YcoefYvJPvuv5MuyJklXkyh X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A The GENERIC0_UPDATE field is a single bit. Redefine it as boolean to simplify its usage in the driver. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/registers/display/hdmi.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/registers/display/hdmi.xml b/drivers/gpu/d= rm/msm/registers/display/hdmi.xml index 6c81581016c7..fc711a842363 100644 --- a/drivers/gpu/drm/msm/registers/display/hdmi.xml +++ b/drivers/gpu/drm/msm/registers/display/hdmi.xml @@ -131,7 +131,7 @@ xsi:schemaLocation=3D"https://gitlab.freedesktop.org/fr= eedreno/ rules-fd.xsd"> --> - = + --=20 2.39.2 From nobody Tue Dec 16 14:36:04 2025 Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75A12201249 for ; Wed, 29 May 2024 23:12:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024357; cv=none; b=UhS9KgZWMHrA6j3p9AZFx+2zovfhvPuRVeIzUjksnCFgR6Q0EtXLwfDRb92eabfIbIxEUqIvkWy7udoxMaXKHlKnB/76NvP2qbgZiePZ0rpeW24Zho0gtRecIq2/9aEEZYZsLCkagCjE805As3gN7+VGFrdRETEleQX1zrGle8Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1717024357; c=relaxed/simple; bh=Z5HyGMj9APefRaxEDeEqqLA87VR+HciRAWGWfJZW4lA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PPbpYxIS3r1v6YccLtXckh4HclxGOi4MlSxN+2HVKGwJtuvzkibWU++3NnNdd8THhz1xAcTYPZVFahYhCSrnyxuW30GTcWBx7bcc+iuFW0Ipo/7xN39QOFUix+w5MJ1J+Yw+GuYSBKH4lKBOp3APkqJhLB83Pe9wqY4IwUcaM6M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=JMN6kA3B; arc=none smtp.client-ip=209.85.167.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="JMN6kA3B" Received: by mail-lf1-f47.google.com with SMTP id 2adb3069b0e04-52b7db60003so187634e87.3 for ; Wed, 29 May 2024 16:12:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1717024353; x=1717629153; 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=qFqvSl6cE0JuDyfinWPR+ZylqDnid+FJwqA2hwQ4DFs=; b=JMN6kA3BkTDVs237aEzTlLVxVkQTbw0GEgHjmHJ+zc51nX9iYLPnpkdwBt0d+nr1Uh g+fXNDLR7tJIzRBs62Lak3Y5cHsuayqplihuiDthqGUT4tymibt6zjCW9JvHFkqBY9u6 vSMkCoDcAaQ0O1ZVuvLnAqtDq/3fxSbgvmxHxOT4972b3YhWHYIlltMHyqEWoSorblpX k8DkloYoseKnAsKE6K5lS3Rzk3+xVUmkxWSXjO5MiqHO9UumAqnqGg0McgDLiFtEGqOY RO8kjuha4TNnXMYuSVhmtths3R81xPm7eblhF2c2bm4ENAoGhzDCN5lTFMT/PCWKsDil ZgMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1717024353; x=1717629153; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qFqvSl6cE0JuDyfinWPR+ZylqDnid+FJwqA2hwQ4DFs=; b=qfHGBF+UnWTdkH8ebFKJYi1hWWGgtICnnSypZA1Dk9AJpJRzm4RTBMotNUf4pBYsZQ Sc5eWpWQ2Lk2Ex9ivwMakQK2KvBTVXeUMo+ByRt6puAqKfon8MHgvUK8P57urdkWQ7Qq q6H5xVIprbc3zo3KEgyvOK+3UZhFYb3lIQVs7k7xenBaSwjFfit7gmpt4PhWAyHmob46 ENEk7ciUveYdwFVLTrt3UH+Msno6LbflRIA1dy7p0KgbxTAUKPZqgXNKS8G03G6r/99E 8QFmdssrF4yX5mCE3BV8mdTf0TiB9uoeA9OblIBlb653gNaKVECkr4prSD+yF/e1BwAN 82sA== X-Forwarded-Encrypted: i=1; AJvYcCVgbWZjbdlkDgqh+gO3nv8SB5T7PjokC+YpeKGxHn3LvguebZygrQMQrkDKspJJvwoNJg48F7OXb+F+0WNxClc+vJiq8dMQHZKkdEVi X-Gm-Message-State: AOJu0YxA4n06wn1TjL3fsBEDu5QO+8/LSWzh16HePIupXIb6oc2S96fi Gq/HCH5tDScr/ONNP06PO29oyYUVWnG7Pd5wSydmJEUHF2tOQm+wOMiA/gEfFUs= X-Google-Smtp-Source: AGHT+IH5aSmqRPHTo0UG4pFiS1vT4kt8zwVM8HO6DfMchsgJu7PBKOyLEVj19RbkGTT+ov5bBXm3cw== X-Received: by 2002:a19:385d:0:b0:521:5583:483c with SMTP id 2adb3069b0e04-52b7d47b180mr447915e87.54.1717024353584; Wed, 29 May 2024 16:12:33 -0700 (PDT) Received: from umbar.lan ([192.130.178.91]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-529acea1ea8sm1015998e87.276.2024.05.29.16.12.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 May 2024 16:12:33 -0700 (PDT) From: Dmitry Baryshkov Date: Thu, 30 May 2024 02:12:30 +0300 Subject: [PATCH v3 7/7] drm/msm/hdmi: also send the SPD and HDMI Vendor Specific 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: <20240530-bridge-hdmi-connector-v3-7-a1d184d68fe3@linaro.org> References: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> In-Reply-To: <20240530-bridge-hdmi-connector-v3-0-a1d184d68fe3@linaro.org> To: Andrzej Hajda , Neil Armstrong , Robert Foss , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Clark , Abhinav Kumar , Sean Paul , Marijn Suijten Cc: dri-devel@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, freedreno@lists.freedesktop.org, linux-kernel@vger.kernel.org, Dmitry Baryshkov X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4619; i=dmitry.baryshkov@linaro.org; h=from:subject:message-id; bh=Z5HyGMj9APefRaxEDeEqqLA87VR+HciRAWGWfJZW4lA=; b=owEBbQGS/pANAwAKAYs8ij4CKSjVAcsmYgBmV7ZbguFTt1zdbaP9jCvDU93XbT8eFn6tgB+64 z4kMhW8bLaJATMEAAEKAB0WIQRMcISVXLJjVvC4lX+LPIo+Aiko1QUCZle2WwAKCRCLPIo+Aiko 1dliCACmfXMljuWZIQ03AWDZ1a4riEFfzm+g0Xjhm5z9o3MlwfKxyL2QeVqwBICP6qmAXm2wT5+ ukY13FkUjQ02/v4vIaNSgu7JEKWeAiVTs+AXi13Q18Ljv/huxC9V7KEFih9KFx5nXDfXbCFmY/0 3QvSBWLm9NPzhevt5V4C0GYEkdzqESeoDLDA3md0SimJaMYwIlQn8NDUyxG6IRJBwTaWv7N1ss7 vr1q8PSDJrxx1JaB8lJEQoHbdveFXF0UvesUZMZ49pli7oguoqsXhIQJmstjBtEcA6N+IP3H7YS Q6nOyGKyQP1McDlZFU+5SWx/OJH9P6GRe7eMa5guwdgw2vKC X-Developer-Key: i=dmitry.baryshkov@linaro.org; a=openpgp; fpr=8F88381DD5C873E4AE487DA5199BF1243632046A Extend the driver to send SPD and HDMI Vendor Specific InfoFrames. While the HDMI block has special block to send HVS InfoFrame, use GENERIC0 block instead. VENSPEC_INFO registers pack frame data in a way that requires manual repacking in the driver, while GENERIC0 doesn't have such format requirements. The msm-4.4 kernel uses GENERIC0 to send HDR InfoFrame which we do not at this point anyway. Signed-off-by: Dmitry Baryshkov --- drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 93 ++++++++++++++++++++++++++++++= ++++ 1 file changed, 93 insertions(+) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c b/drivers/gpu/drm/msm/h= dmi/hdmi_bridge.c index 3ac63edbf5bb..79ce3b6d1222 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi_bridge.c @@ -68,6 +68,8 @@ static void power_off(struct drm_bridge *bridge) } =20 #define AVI_IFRAME_LINE_NUMBER 1 +#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) @@ -141,6 +143,74 @@ 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) +{ + u32 buf[7] =3D {}; + u32 val; + int i; + + if (len !=3D HDMI_INFOFRAME_SIZE(SPD) || len - 3 > sizeof(buf)) { + DRM_DEV_ERROR(&hdmi->pdev->dev, + "failed to configure SPD infoframe\n"); + return -EINVAL; + } + + /* checksum gets written together with the body of the frame */ + hdmi_write(hdmi, REG_HDMI_GENERIC1_HDR, + buffer[0] | + buffer[1] << 8 | + buffer[2] << 16); + + memcpy(buf, &buffer[3], len - 3); + + for (i =3D 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_GENERIC1(i), buf[i]); + + 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(SPD_IFRAME_LINE_NUMBER); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + return 0; +} + +static int msm_hdmi_config_hdmi_infoframe(struct hdmi *hdmi, + const u8 *buffer, size_t len) +{ + u32 buf[7] =3D {}; + u32 val; + int i; + + if (len < HDMI_INFOFRAME_HEADER_SIZE + HDMI_VENDOR_INFOFRAME_SIZE || + len - 3 > sizeof(buf)) { + DRM_DEV_ERROR(&hdmi->pdev->dev, + "failed to configure HDMI infoframe\n"); + return -EINVAL; + } + + /* checksum gets written together with the body of the frame */ + hdmi_write(hdmi, REG_HDMI_GENERIC0_HDR, + buffer[0] | + buffer[1] << 8 | + buffer[2] << 16); + + memcpy(buf, &buffer[3], len - 3); + + for (i =3D 0; i < ARRAY_SIZE(buf); i++) + hdmi_write(hdmi, REG_HDMI_GENERIC0(i), buf[i]); + + 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(VENSPEC_IFRAME_LINE_NUMBER); + hdmi_write(hdmi, REG_HDMI_GEN_PKT_CTRL, val); + + return 0; +} + static int msm_hdmi_bridge_clear_infoframe(struct drm_bridge *bridge, enum hdmi_infoframe_type type) { @@ -175,6 +245,25 @@ static int msm_hdmi_bridge_clear_infoframe(struct drm_= bridge *bridge, =20 break; =20 + 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); } @@ -196,6 +285,10 @@ static int msm_hdmi_bridge_write_infoframe(struct drm_= bridge *bridge, 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; --=20 2.39.2