From patchwork Mon Jan 18 15:51:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Manivannan Sadhasivam X-Patchwork-Id: 12027573 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 64C95C433DB for ; Mon, 18 Jan 2021 15:53:38 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1AA6A22B4E for ; Mon, 18 Jan 2021 15:53:38 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1AA6A22B4E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To:From: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Owner; bh=ZaF3AUqNufsYQJgCyQsTdVVqBaTNvHxpdRpw6/iAHPw=; b=VmyN2Lwh2LaoGnmuJhBcU1Tze7 DJs56qJtjiJ0C09/28ONtdJ/u5jhYRUJWcMmK4ihiSq1kwzEdVmPKD1sIQi58lq7gQLHpnE5bBgfb gTPnBPYTV5kv8VNlxpb3VYhAppwCucbPdFJpkH6d4g7q5om4zfNtqI77TpA57eOfn8PEHCV2CUrkE 77mWtTkJXyJs0LU1+2729mDaG0NrXMLEOLatT+D/DURg80hu4gOnNODZhfaW8zJtLdbKfGsi2Tfu6 e6eXLcVAQGdDj0foueNGaM7cXl0VTkqWb3dNGAddi+kGjuUMgUClo+Vf/pHfrYytgSyR5c5CH6od+ shtvMbrQ==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1WpE-0008Dd-DZ; Mon, 18 Jan 2021 15:52:16 +0000 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1l1WpB-0008Cn-4V for linux-arm-kernel@lists.infradead.org; Mon, 18 Jan 2021 15:52:13 +0000 Received: by mail-pf1-x434.google.com with SMTP id w14so1380845pfi.2 for ; Mon, 18 Jan 2021 07:52:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=0pDSU6bAYm4v0S5tyvU/TnzjGcaf+2G3ePumYZ4Xdo8=; b=j/XoMmnZ9J74SKF7Rh1xKqcu6i3ZGt2B436LoUKt09f4LmZpVAurdYxtiOpY1iEQmo kas9x0d7DtJV/BHc9+RelJTSdeGGccCSNMD8HFMuYz82SOwJsLCD3IVTE4Vc5Fi+41/W siLtR2jUO5Zp6Hw41DuhYPSxf+uCpzO3HkQK2TORksvGWHtcGm72S+7LHxQZTCnIl9d1 lG2TLU7KQ7yQIHQyZEazDOoPEEhC7jjWQA3dMvKTuVtC3eH5Dx2nQlPPoQ9CwCMHOzIy rRcmDUfYzCqoMm2gB8ZimtcfjqufJa+IysuX50yzDwRc1RdkZv/RBAK68LbngZxB+9Ga gRvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=0pDSU6bAYm4v0S5tyvU/TnzjGcaf+2G3ePumYZ4Xdo8=; b=FeytgHr7HfWi74xTomoP10sHY2vsDcS7xF6eArhaX9qWao3Zuucbwo9VbdSz2V9VrI StS/IZQILe/Pk+rWgF1gXNp8743MkP0pDAX4bnOVH+ILfoch9J+pwmFIXD/FfvXYv35D Ywiz7U4bsZVDx625xzU5z5OGIRuBHp8/cjUPHRQZGbF/+o2nMoK73eZXkJJ2xgSEF7+x 1XpCJHUhfSkcfRVBbUugP8u0kdrEKJs/felwNhlUwT3cA5D8cV6hwEu6wc4UI0jbhTMv 47c7N2/hkZPR+xNil9lkyz6j/5gnVwqDFk6sXxJynZr/WN2VW8QsQccvgVYLhddOoJHa 5Nhw== X-Gm-Message-State: AOAM530Xjihm+Cf0N73CHsZL9qPxvfzugktT5BMM4xWGnC+VILk2TASE +Mjywcwx8dw9OoioJwpveaZm X-Google-Smtp-Source: ABdhPJzk1yrGmfK+11mlAOIA0fnH5Z/XUKpI9fHxGn6Ovb2G1Th7pDE2zCXpeNWa09azG69ybYm9uA== X-Received: by 2002:a62:6d06:0:b029:1a8:4d3f:947a with SMTP id i6-20020a626d060000b02901a84d3f947amr241920pfc.6.1610985128193; Mon, 18 Jan 2021 07:52:08 -0800 (PST) Received: from localhost.localdomain ([2409:4072:6d10:e0cf:bf2b:fc5e:cb6d:136]) by smtp.gmail.com with ESMTPSA id d133sm15776543pfd.6.2021.01.18.07.52.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Jan 2021 07:52:07 -0800 (PST) From: Manivannan Sadhasivam To: linux@armlinux.org.uk, will@kernel.org Subject: [PATCH] ARM: kernel: Fix interrupted SMC calls Date: Mon, 18 Jan 2021 21:21:53 +0530 Message-Id: <20210118155153.21520-1-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210118_105213_194843_892104F0 X-CRM114-Status: GOOD ( 13.45 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-msm@vger.kernel.org, Manivannan Sadhasivam , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, bjorn.andersson@linaro.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On Qualcomm ARM32 platforms, the SMC call can return before it has completed. If this occurs, the call can be restarted, but it requires using the returned session ID value from the interrupted SMC call. The ARM32 SMCC code already has the provision to add platform specific quirks for things like this. So let's make use of it and add the Qualcomm specific quirk (ARM_SMCCC_QUIRK_QCOM_A6) used by the QCOM_SCM driver. This change is similar to the below one added for ARM64 a while ago: commit 82bcd087029f ("firmware: qcom: scm: Fix interrupted SCM calls") Without this change, the Qualcomm ARM32 platforms like SDX55 will return -EINVAL for SMC calls used for modem firmware loading and validation. Signed-off-by: Manivannan Sadhasivam --- arch/arm/kernel/asm-offsets.c | 3 +++ arch/arm/kernel/smccc-call.S | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index a1570c8bab25..2e2fa6fc2d4f 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -23,6 +23,7 @@ #include #include #include +#include #include "signal.h" /* @@ -147,6 +148,8 @@ int main(void) DEFINE(SLEEP_SAVE_SP_PHYS, offsetof(struct sleep_save_sp, save_ptr_stash_phys)); DEFINE(SLEEP_SAVE_SP_VIRT, offsetof(struct sleep_save_sp, save_ptr_stash)); #endif + DEFINE(ARM_SMCCC_QUIRK_ID_OFFS, offsetof(struct arm_smccc_quirk, id)); + DEFINE(ARM_SMCCC_QUIRK_STATE_OFFS, offsetof(struct arm_smccc_quirk, state)); BLANK(); DEFINE(DMA_BIDIRECTIONAL, DMA_BIDIRECTIONAL); DEFINE(DMA_TO_DEVICE, DMA_TO_DEVICE); diff --git a/arch/arm/kernel/smccc-call.S b/arch/arm/kernel/smccc-call.S index 00664c78faca..e1ab00b8244b 100644 --- a/arch/arm/kernel/smccc-call.S +++ b/arch/arm/kernel/smccc-call.S @@ -3,7 +3,9 @@ * Copyright (c) 2015, Linaro Limited */ #include +#include +#include #include #include #include @@ -27,10 +29,18 @@ UNWIND( .fnstart) UNWIND( .save {r4-r7}) ldm r12, {r4-r7} \instr + mov r9, r6 // Copy r6 before popping from stack pop {r4-r7} ldr r12, [sp, #(4 * 4)] stm r12, {r0-r3} - bx lr + ldr r10, [sp, #20] + cmp r10, #0 + beq 1f // No quirk structure + ldr r11, [r10, #ARM_SMCCC_QUIRK_ID_OFFS] + cmp r11, #ARM_SMCCC_QUIRK_QCOM_A6 + bne 1f // No quirk present + str r9, [r10, #ARM_SMCCC_QUIRK_STATE_OFFS] +1: bx lr UNWIND( .fnend) .endm