From nobody Thu Apr 9 13:31:45 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 564583D6CD2; Mon, 2 Mar 2026 13:00:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772456437; cv=none; b=AZHarL0nGE/4bH0gqdAeupDhrRg3ht7HAj0rNqwbUMiGy79gKj2gSmRgwSOM4O+lCxSQwPAZxxKf36zPd6YoaQA1xZfErQSxpW02ACmZUphbRgkgcI7JTCECHP+ZKAg4cv40vRYsPwITvvDZ808nt65N7Z9/+QGUHvg6lG046wI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772456437; c=relaxed/simple; bh=GjYJ0sv55slG3sVEqFeYGczFX9MBpOsZQCWJvgRMcfo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gRscewgr3c7eTWAjOaYylwteYQa68pP3WVKR8PJ3MWVHbuToEQHlpmjwuPtCrpecGvaY/dkoQ+xyV1sMN0LpovGU4NjnykZMUKjdh3PaVqo4KZIY5kS5ixEzC7U0dAjia/GVGELgmLLaqfWtiH9/Cte7I09Cq2rgdPSVNtO40Kc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=HxcJXzEO; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="HxcJXzEO" Received: by smtp.kernel.org (Postfix) with ESMTPS id 188E3C2BC86; Mon, 2 Mar 2026 13:00:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1772456437; bh=GjYJ0sv55slG3sVEqFeYGczFX9MBpOsZQCWJvgRMcfo=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=HxcJXzEO0+ISCCYu4dQzrYWs2uvev9BVT6b9o34QBrEUKLCWuEFbtgaGz/tkpHesa gCJoFgzP3gh2b7MKB8RhsdUbO2emWqY89YdOP7zjbbm33ub1M6S8JHYVSIzbfChIkA IRR5WvdOOvZrBOa+5RV+Ik7mUL+ClpN6u2/Q9avrXWeEJZSW8PxB709yKV4YrF6Qvw f6ZVA2ynNaU2o4UdG6KQSBdLMUkjyd8FRhgwCLKA5HlDrQ83DK3VZX6JHRtq2INO1g Qc44FsYPN2J09PV3bgMjvK9kRpJ9tY87jrTR46YabI/LbrufUPOsuFZVn/CJp/ETPX 7US8GvN2EtDzw== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id F1580E9B377; Mon, 2 Mar 2026 13:00:36 +0000 (UTC) From: Manivannan Sadhasivam via B4 Relay Date: Mon, 02 Mar 2026 18:30:18 +0530 Subject: [PATCH v4 1/5] soc: qcom: ice: Fix race between qcom_ice_probe() and of_qcom_ice_get() 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: <20260302-qcom-ice-fix-v4-1-0e65740a5dcc@oss.qualcomm.com> References: <20260302-qcom-ice-fix-v4-0-0e65740a5dcc@oss.qualcomm.com> In-Reply-To: <20260302-qcom-ice-fix-v4-0-0e65740a5dcc@oss.qualcomm.com> To: Bjorn Andersson , Konrad Dybcio , Adrian Hunter , Ulf Hansson , Manivannan Sadhasivam , "James E.J. Bottomley" , "Martin K. Petersen" , Abel Vesa , Abel Vesa Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mmc@vger.kernel.org, linux-scsi@vger.kernel.org, Sumit Garg , mani@kernel.org, Neeraj Soni , Manivannan Sadhasivam , stable@vger.kernel.org X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=3469; i=manivannan.sadhasivam@oss.qualcomm.com; h=from:subject:message-id; bh=PxxI5HrtkjPrewqydVjynd/KfkIqbLW5DMY9IbWY+NA=; b=owEBbQGS/pANAwAKAVWfEeb+kc71AcsmYgBppYnyYy1MQoGSXd/MDRFIrOfC/xxPjbIcsmm6f lyIwDa27+KJATMEAAEKAB0WIQRnpUMqgUjL2KRYJ5dVnxHm/pHO9QUCaaWJ8gAKCRBVnxHm/pHO 9fXMB/4kmYdO/8QSldFwnY9RlPzmF3wDrJqZfUBmCjSLXpzobrai5e3qPCC8OC5IfHmiKBSiJzK d34+Ra8ERcgshcviBGZXHljmwY5mGaTdhFzhkbt4sSoIq6IxQCNLp7oswrCjHJ07P504km+h46w vMO7T676t4oQTLOAinGa9weFEIcpy8va4XWuMuenNyA4SYtpVb6xabm64cIYHZ5666Nc0KKNDKF aDCJqSkzTgWM/g+aymzYHPtun8gLP91xJWvDEqLWFixvSVoqcI/+WrxL8sEWiYe+BY5JF65elxK iSmvaF/YbWxoBseeCvO+DBVHs1chMmaVHyQXwVegRb4JCn2X X-Developer-Key: i=manivannan.sadhasivam@oss.qualcomm.com; a=openpgp; fpr=C668AEC3C3188E4C611465E7488550E901166008 X-Endpoint-Received: by B4 Relay for manivannan.sadhasivam@oss.qualcomm.com/default with auth_id=461 X-Original-From: Manivannan Sadhasivam Reply-To: manivannan.sadhasivam@oss.qualcomm.com From: Manivannan Sadhasivam The current platform driver design causes probe ordering races with consumers (UFS, eMMC) due to ICE's dependency on SCM firmware calls. If ICE probe fails (missing ICE SCM or DT registers), devm_of_qcom_ice_get() loops with -EPROBE_DEFER, leaving consumers non-functional even when ICE should be gracefully disabled. devm_of_qcom_ice_get() doesn't know if the ICE driver probe has failed due to above reasons or it is waiting for the SCM driver. Moreover, there is no devlink dependency between ICE and consumer drivers as 'qcom,ice' is not considered as a DT 'supplier'. So the consumer drivers have no idea of when the ICE driver is going to probe. To address these issues, store the error pointer in the platform drvdata during probe in addition to the valid ice pointer and synchronize both qcom_ice_probe() and of_qcom_ice_get() using a mutex. If the platform drvdata is NULL, then it implies that the driver is not probed yet, so return -EPROBE_DEFER. If it has any error pointer, return that error pointer directly. Note that this change only fixes the standalone ICE DT node bindings and not the ones with 'ice' range embedded in the consumer nodes, where there is no issue. Cc: # 6.4 Fixes: 2afbf43a4aec ("soc: qcom: Make the Qualcomm UFS/SDCC ICE a dedicated= driver") Reported-by: Sumit Garg Signed-off-by: Manivannan Sadhasivam --- drivers/soc/qcom/ice.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/soc/qcom/ice.c b/drivers/soc/qcom/ice.c index b203bc685cad..a7e7e2251015 100644 --- a/drivers/soc/qcom/ice.c +++ b/drivers/soc/qcom/ice.c @@ -113,6 +113,8 @@ struct qcom_ice { u8 hwkm_version; }; =20 +static DEFINE_MUTEX(ice_mutex); + static bool qcom_ice_check_supported(struct qcom_ice *ice) { u32 regval =3D qcom_ice_readl(ice, QCOM_ICE_REG_VERSION); @@ -631,6 +633,8 @@ static struct qcom_ice *of_qcom_ice_get(struct device *= dev) return qcom_ice_create(&pdev->dev, base); } =20 + guard(mutex)(&ice_mutex); + /* * If the consumer node does not provider an 'ice' reg range * (legacy DT binding), then it must at least provide a phandle @@ -648,11 +652,12 @@ static struct qcom_ice *of_qcom_ice_get(struct device= *dev) } =20 ice =3D platform_get_drvdata(pdev); - if (!ice) { - dev_err(dev, "Cannot get ice instance from %s\n", - dev_name(&pdev->dev)); + if (IS_ERR_OR_NULL(ice)) { platform_device_put(pdev); - return ERR_PTR(-EPROBE_DEFER); + if (!ice) + return ERR_PTR(-EPROBE_DEFER); + else + return ice; } =20 link =3D device_link_add(dev, &pdev->dev, DL_FLAG_AUTOREMOVE_SUPPLIER); @@ -719,15 +724,22 @@ static int qcom_ice_probe(struct platform_device *pde= v) struct qcom_ice *engine; void __iomem *base; =20 + guard(mutex)(&ice_mutex); + base =3D devm_platform_ioremap_resource(pdev, 0); if (IS_ERR(base)) { dev_warn(&pdev->dev, "ICE registers not found\n"); + /* Store the error pointer for devm_of_qcom_ice_get() */ + platform_set_drvdata(pdev, base); return PTR_ERR(base); } =20 engine =3D qcom_ice_create(&pdev->dev, base); - if (IS_ERR(engine)) + if (IS_ERR(engine)) { + /* Store the error pointer for devm_of_qcom_ice_get() */ + platform_set_drvdata(pdev, engine); return PTR_ERR(engine); + } =20 platform_set_drvdata(pdev, engine); =20 --=20 2.51.0