From nobody Sat Sep 26 19:36:35 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 0BF2B3B8BCC; Mon, 31 Aug 2026 08:14:39 +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=1788164080; cv=none; b=O5aSZ6C+86nBaSFZBZyDZuW/c63VORW9TBt5RdUEKzLg5Oz1Sjh6HunriOHOKgZ/Rw3l2/cK2CnI5EK38zW7icOJjLuz8dyRP0wB6YSI0xwRFUlkbfKvwZ11oCT1KYC0KXd0zdZ8uUG1DH9IdyRFy87oX63aCA4f7+Fj6Uh7KqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164080; c=relaxed/simple; bh=8XIDpbXkj9CJFXKgKMb8K9KDabDBANEE0BQhM9zrdh0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iXxDRVAuEp4XW16XXhXViNFl8bpylPAm/DhqDkkERBhF7UyUcgwgFk4n1CT5SNb45sOdA2Kw8LHNugD198tRYMWECDwzyIx0PlXceSyj5AKj03KKShsYuaTD6PtE2KLHZ5j0HaFi+qvg29r1BOrrb+uPSvFU2JZJ9Eoii5cdcDM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RS5Pm0Fv; 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="RS5Pm0Fv" Received: by smtp.kernel.org (Postfix) with ESMTPS id A8783C2BCF5; Mon, 31 Aug 2026 08:14:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788164079; bh=8XIDpbXkj9CJFXKgKMb8K9KDabDBANEE0BQhM9zrdh0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=RS5Pm0FvEv86kQ2OG1yh0tW0NAgKjVHTiUabHC4sPS1B2/z38E1EpfAW5HYsFQNsm N1GYGKLCy6Vw9IYVYXS2MWytdf1BRDDChiVnTyopUB2drv5HHnQ2PTIpUyhtT0tfeD DvbWBmacZS3xB1irY8KY1Da+QpcOBJZXYoiQek64oAUm5q4AupENoTYIPGR3dT3IeJ qa+D65copo+vG8l6uH/agjb1T57Ci3kPcd5OkOU3V+ku47jiNdODKAILiR2lMB7xYM LZhf0Tmnf+kW2DtL9/Nfoqoq5nY86H9dHqPa2tipzZ7Sd0FlL/WUXSi43Fk4LZVPc+ oTcGJj4qJ1Thg== 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 87A72C61DD3; Mon, 31 Aug 2026 08:14:39 +0000 (UTC) From: Albert Esteve via B4 Relay Date: Mon, 31 Aug 2026 10:14:37 +0200 Subject: [PATCH v2 1/2] firmware: qcom: scm: Introduce new locking mechanism for SCM driver 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: <20260831-port-scm-patches-v2-1-bab5595e77b3@redhat.com> References: <20260831-port-scm-patches-v2-0-bab5595e77b3@redhat.com> In-Reply-To: <20260831-port-scm-patches-v2-0-bab5595e77b3@redhat.com> To: Bjorn Andersson , Konrad Dybcio , Shivendra Pratap , Bartosz Golaszewski , Unnathi Chalicheemala , Mukesh Ojha Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Albert Esteve , Ninad Naik , Murali Nalajala , Venkatakrishnaiah Pari , Jian Shu , Guru Das Srinagesh X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788164078; l=4918; i=aesteve@redhat.com; s=20260827; h=from:subject:message-id; bh=6/Qv9tRwdvX6/5mjo1VRSsiyGOM2ISs+NDMUgFQSqCE=; b=hGHwlQDrXvTtjSqaazdhYmRqHEyDLGncTVuGt1euoF2oU2dqfKse8q+csjE5qLKy2qi6Lastq U59VuctaE6xCAMz/wxxLbkkSJ3M9U9UN6DZgkuhKg+D+Z/6epu1Qw2/ X-Developer-Key: i=aesteve@redhat.com; a=ed25519; pk=zI2RBeZgocwYm3AkJW4CtjoJnKoDZrfBl1xe5Ed6h+U= X-Endpoint-Received: by B4 Relay for aesteve@redhat.com/20260827 with auth_id=993 X-Original-From: Albert Esteve Reply-To: aesteve@redhat.com From: Ninad Naik qcom_scm holds its global mutex across WAITQ_SLEEP and wait_for_completion(). Firmware waitqs allow multiple SMCs in flight (wq_cnt). If one call is parked on a waitq while holding the mutex, a second call (e.g., SMCInvoke) cannot enter firmware and both stall on the waitq. Replace the global mutex with a counting semaphore sized from wq_cnt, with at least 1 wait queue. Fixes: ccd207ec848e ("firmware: qcom_scm: Support multiple waitq contexts") Signed-off-by: Murali Nalajala Co-developed-by: Guru Das Srinagesh Signed-off-by: Guru Das Srinagesh Signed-off-by: Venkatakrishnaiah Pari Signed-off-by: Jian Shu Signed-off-by: Ninad Naik Signed-off-by: Albert Esteve --- drivers/firmware/qcom/qcom_scm-legacy.c | 8 ++------ drivers/firmware/qcom/qcom_scm-smc.c | 7 ++----- drivers/firmware/qcom/qcom_scm.c | 6 +++++- drivers/firmware/qcom/qcom_scm.h | 3 +++ 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/firmware/qcom/qcom_scm-legacy.c b/drivers/firmware/qco= m/qcom_scm-legacy.c index 029e6d117cb8..6afcbe6f7e5e 100644 --- a/drivers/firmware/qcom/qcom_scm-legacy.c +++ b/drivers/firmware/qcom/qcom_scm-legacy.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -15,9 +14,6 @@ =20 #include "qcom_scm.h" =20 -static DEFINE_MUTEX(qcom_scm_lock); - - /** * struct arm_smccc_args * @args: The array of values used in registers in smc instruction @@ -173,11 +169,11 @@ int scm_legacy_call(struct device *dev, const struct = qcom_scm_desc *desc, smc.args[1] =3D (unsigned long)&context_id; smc.args[2] =3D cmd_phys; =20 - mutex_lock(&qcom_scm_lock); + down(&qcom_scm_sem_lock); __scm_legacy_do(&smc, &smc_res); if (smc_res.a0) ret =3D qcom_scm_remap_error(smc_res.a0); - mutex_unlock(&qcom_scm_lock); + up(&qcom_scm_sem_lock); if (ret) goto out; =20 diff --git a/drivers/firmware/qcom/qcom_scm-smc.c b/drivers/firmware/qcom/q= com_scm-smc.c index 127365ab11fc..1b51e0fb8292 100644 --- a/drivers/firmware/qcom/qcom_scm-smc.c +++ b/drivers/firmware/qcom/qcom_scm-smc.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include @@ -27,8 +26,6 @@ struct arm_smccc_args { #define CREATE_TRACE_POINTS #include "qcom_scm_trace.h" =20 -static DEFINE_MUTEX(qcom_scm_lock); - #define QCOM_SCM_EBUSY_WAIT_MS 30 #define QCOM_SCM_EBUSY_MAX_RETRY 20 =20 @@ -135,11 +132,11 @@ static int __scm_smc_do(struct device *dev, struct ar= m_smccc_args *smc, } =20 do { - mutex_lock(&qcom_scm_lock); + down(&qcom_scm_sem_lock); =20 ret =3D __scm_smc_do_quirk_handle_waitq(dev, smc, res); =20 - mutex_unlock(&qcom_scm_lock); + up(&qcom_scm_sem_lock); =20 if (ret) return ret; diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_= scm.c index 3eaa4c9ccf3c..ea4481385412 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -78,6 +78,8 @@ struct qcom_scm_mem_map_info { __le64 mem_size; }; =20 +DEFINE_SEMAPHORE(qcom_scm_sem_lock, 1); + /** * struct qcom_scm_qseecom_resp - QSEECOM SCM call response. * @result: Result or status of the SCM call. See &enum qcom_scm_qseeco= m_result. @@ -2869,7 +2871,7 @@ static int qcom_scm_probe(struct platform_device *pde= v) } =20 ret =3D qcom_scm_query_waitq_count(scm); - scm->wq_cnt =3D ret < 0 ? QCOM_SCM_DEFAULT_WAITQ_COUNT : ret; + scm->wq_cnt =3D ret <=3D 0 ? QCOM_SCM_DEFAULT_WAITQ_COUNT : ret; scm->waitq_comps =3D devm_kcalloc(&pdev->dev, scm->wq_cnt, sizeof(*scm->w= aitq_comps), GFP_KERNEL); if (!scm->waitq_comps) @@ -2893,6 +2895,8 @@ static int qcom_scm_probe(struct platform_device *pde= v) "Failed to request qcom-scm irq\n"); } =20 + sema_init(&qcom_scm_sem_lock, scm->wq_cnt); + /* * Paired with smp_load_acquire() in qcom_scm_is_available(). * diff --git a/drivers/firmware/qcom/qcom_scm.h b/drivers/firmware/qcom/qcom_= scm.h index cf90a565fdfb..06fdc5e56bea 100644 --- a/drivers/firmware/qcom/qcom_scm.h +++ b/drivers/firmware/qcom/qcom_scm.h @@ -4,6 +4,8 @@ #ifndef __QCOM_SCM_INT_H #define __QCOM_SCM_INT_H =20 +#include + struct device; struct qcom_tzmem_pool; =20 @@ -15,6 +17,7 @@ enum qcom_scm_convention { }; =20 extern enum qcom_scm_convention qcom_scm_convention; +extern struct semaphore qcom_scm_sem_lock; =20 #define MAX_QCOM_SCM_ARGS 10 #define MAX_QCOM_SCM_RETS 3 --=20 2.55.0 From nobody Sat Sep 26 19:36:35 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 1166A3CAA31; Mon, 31 Aug 2026 08:14:40 +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=1788164080; cv=none; b=R4LnU2Jid6qGWuP3OwdboLe+yPvw+vwXD2kaEnMQdjEl9Om75qsPoAKOV2/8D7Hs/MfGhewW26GA94svV79e3ucxZCncBMzenDw+Z25LmOiFVux1/OixGMpNgxQ4MiDazXr9jahmqE5q436PqYD18xVC6U5X6jDjPABvVVI9sYw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788164080; c=relaxed/simple; bh=1UQ3XKLpRxLaB/IHRKyQ0RKRV0DNP+Kr27aR4M+LLOk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Pp0rMiTo0AEpPthMWyrBgi1lrszAncG9rt6ypoNKc8gE5FOjzgcGEYxr9Qc6iUtOjGv0V8mhY5l3Ih/axIbsdRfkXwK2MYKTR19QYJj0InatL8HlJHPsJHEiZqlDZYb5vmHbRYlfrBEhWD8HJlw4jb8wIGtYZRij/4YWm01GLtg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=RlXXvRJF; 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="RlXXvRJF" Received: by smtp.kernel.org (Postfix) with ESMTPS id CD245C2BD01; Mon, 31 Aug 2026 08:14:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1788164079; bh=1UQ3XKLpRxLaB/IHRKyQ0RKRV0DNP+Kr27aR4M+LLOk=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=RlXXvRJFsfxEjavvl5ZriBDON83Y+Ts0aeFV6bKApFbLb4Et78s2uo/wm+u+CGcfR OOkBXDT8FlH+1cWwwrtTB6tj4pMY7BdAJzQXqoLAWhRwHqGV0mODSWJ643bAHYaDlM g4Uq9ZH43wc3u/mxw87M/9iJ18gHyfKcUEq6F4HheKrm12L1Bi4HUIR9nLUKBXwoE/ dSdaZ7M9SHtbq97ve4Ul7yU9XDQiiOd81yRoHYE8yy5L1YCG7dsg7vanNH1tsIaC87 9K5kuUFfjhWmwLZBPCnB7u1AsC0Mt1+R0DYvuULS8/GZO9PRDH7nCio2OLlzg4Qwwh xOnMmOPxpPU2g== 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 B998EC624A5; Mon, 31 Aug 2026 08:14:39 +0000 (UTC) From: Albert Esteve via B4 Relay Date: Mon, 31 Aug 2026 10:14:38 +0200 Subject: [PATCH v2 2/2] firmware: qcom: scm: Allow the SMC request to freeze and kill 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: <20260831-port-scm-patches-v2-2-bab5595e77b3@redhat.com> References: <20260831-port-scm-patches-v2-0-bab5595e77b3@redhat.com> In-Reply-To: <20260831-port-scm-patches-v2-0-bab5595e77b3@redhat.com> To: Bjorn Andersson , Konrad Dybcio , Shivendra Pratap , Bartosz Golaszewski , Unnathi Chalicheemala , Mukesh Ojha Cc: linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Albert Esteve , Yuvaraj Ranganathan X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1788164078; l=1339; i=aesteve@redhat.com; s=20260827; h=from:subject:message-id; bh=Tm4UTIwoxQT5KHbYSrQ/GqM30LVTWUwE87PSxfkz9NU=; b=oNQQpiWcgeyV0r3wh52GzmqOnGF3Nsk7qtYxhw3PxFjha2ulbeEpp+NVUy/Pqvm7ho6h2o6vS Ne0d0i/PKa7BZnJ+NFIPVZMc9puwT+5Dz9z3qUXiQ7RKX6ZnKvnDD9Y X-Developer-Key: i=aesteve@redhat.com; a=ed25519; pk=zI2RBeZgocwYm3AkJW4CtjoJnKoDZrfBl1xe5Ed6h+U= X-Endpoint-Received: by B4 Relay for aesteve@redhat.com/20260827 with auth_id=993 X-Original-From: Albert Esteve Reply-To: aesteve@redhat.com From: Yuvaraj Ranganathan qcom_scm_wait_for_wq_completion() waits in TASK_IDLE. That is uninterruptible, so a thread parked on a firmware waitq cannot be frozen or killed. A long wait then blocks suspend, and shutdown cannot tear the task down. Wait with TASK_IDLE | TASK_FREEZABLE | TASK_KILLABLE so the freezer can freeze the waiter during suspend; after resume it is still waiting for the same waitq completion, and a fatal signal can abort it on shutdown. Fixes: 366f05e348b2 ("firmware: qcom_scm: Use TASK_IDLE state in wait_for_w= q_completion()") Signed-off-by: Yuvaraj Ranganathan Signed-off-by: Albert Esteve --- drivers/firmware/qcom/qcom_scm.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_= scm.c index ea4481385412..3e12258d0da7 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -2664,9 +2664,7 @@ int qcom_scm_wait_for_wq_completion(struct device *de= v, u32 wq_ctx) if (IS_ERR(wq)) return PTR_ERR(wq); =20 - wait_for_completion_state(wq, TASK_IDLE); - - return 0; + return wait_for_completion_state(wq, TASK_IDLE | TASK_FREEZABLE | TASK_KI= LLABLE); } =20 static int qcom_scm_waitq_wakeup(struct qcom_scm *scm, unsigned int wq_ctx) --=20 2.55.0