From patchwork Tue Jun 26 17:01:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 10489641 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2914D605D3 for ; Tue, 26 Jun 2018 17:04:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1603D1FE82 for ; Tue, 26 Jun 2018 17:04:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 098B8285D3; Tue, 26 Jun 2018 17:04:04 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 325E2288AA for ; Tue, 26 Jun 2018 17:03:04 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B3D276B028B; Tue, 26 Jun 2018 13:03:01 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id AEC756B028C; Tue, 26 Jun 2018 13:03:01 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 967D16B028D; Tue, 26 Jun 2018 13:03:01 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot0-f200.google.com (mail-ot0-f200.google.com [74.125.82.200]) by kanga.kvack.org (Postfix) with ESMTP id 672796B028B for ; Tue, 26 Jun 2018 13:03:01 -0400 (EDT) Received: by mail-ot0-f200.google.com with SMTP id w15-v6so11812463otk.12 for ; Tue, 26 Jun 2018 10:03:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=rSIvBvv5cbZQG6Pn2NW2dd8jTAdkjmqCudoKILuTNRg=; b=CO3XN/sEmuPObIQasL6xnkDU3hilnY2bKu5xFrhrT/OBdfSsHim7UMg3UABfMJRVQN hDGoT89z7dS8eXkfn5Gm1s6MqPmUbrZAdZJhhrs98Zi914Kd1TPA0loJgFjjHZY5j835 pBH14Mr1j1+UysCe1pC+WUJCLUIp0dQflpM4q+07HNYCbbUwl1GJrQck3UwBi1bptibt VSRCMvr6UDXtDwRXUoA1Czq/w5c4L22VK6HZ1JN1CKo+Fp04WMx+qyZzFqDWuywSCIxe GUbs/kePIExzEZDDsWBa3W0fRZTwBGLLoe5EXDuoDlZUWGGbOq/aPJ5hw1qnMnMJRjES A5KQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=james.morse@arm.com X-Gm-Message-State: APt69E3Um7jhpUTAzMcWtToReGHhDohZD8A1fRMdnVQUnPH/Jc0cD0D/ HM+/e6RBM96dBk2a7dRt/wbLg0lT3SnWs8+56p4G3ilYL+5ZzuAZ+ZYBzilbLem/MybpyXfq0tu bI8dJZcG7A+Zj544lkAQBXoDPJQ3nA4iRX/oinO68nFKQR1b2taFpgmlZcAZsC/no3g== X-Received: by 2002:a9d:5c0c:: with SMTP id o12-v6mr1249812otk.83.1530032581152; Tue, 26 Jun 2018 10:03:01 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcLDE1+Pp9hATZSuLQHU9mNSZ5moEZOa/augFTDIUj0Vukik7yBdWZQrSfaZ1HwWmH8JX2k X-Received: by 2002:a9d:5c0c:: with SMTP id o12-v6mr1249734otk.83.1530032579706; Tue, 26 Jun 2018 10:02:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530032579; cv=none; d=google.com; s=arc-20160816; b=tDlJpFjJRXQ2QV0FCfFLFMUoo+Gut54PkXp8yylSOYVdSzYdBUATvbIMG3nBNoVUHt OwExyqFB37gpyabDD9m9R09NQd+HU4Tb0PG+WhdJuka2CnxLpBmksVcMXXnQRv9WGee9 Y+Fo/7feuIYg5Qm59S9hOOzqc0jaG5do45Du8HzSphWeo4jxiyXHM8gYYBJpyZMhg9G4 Yioi8MZkw2xhszpBZqSrKzd8OLd7QQCLtIk4EjZT7qcXxXliY3p2cHpveFIbA1XiRBOi Oj3i53M9/oAzplIQRRJ7pMZT+tc4fNXDdvFuu109M1z4GTE9KSf7C48pGZT2ObBE/i/u h0Dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=rSIvBvv5cbZQG6Pn2NW2dd8jTAdkjmqCudoKILuTNRg=; b=xghz6YseA5mqTvcSdFbOR4Jf59bAmdiNGVaK/eECnCKV/7q2jczz49ctdIVFxrxsiF SSPLkWNw5ncSAi1Kc5pqY6RviSyMyRGfGpwO+XJ4vDktMLdx8+oPO4JcehXv3nM/lOF6 e1IjytR06xa3sL2/00E/VQvb7TrrBukkGZkN/HtRJD4fXavJJFjiJdF33VipB8Ak/TwC l20J0XwTIbIyKvOG0DWcq2WJFT1mPef9tjExoRRhIhuUVHqHhNUtzMt7Emx/Xg/aGrpD kXilliu+LOEzr9wgtpyUIV959PsDG0TV2QzCuzQoXzlnQwneaEghRz8gI/UtAb0lhI/d ncTg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=james.morse@arm.com Received: from foss.arm.com (foss.arm.com. [217.140.101.70]) by mx.google.com with ESMTP id c9-v6si638576otl.74.2018.06.26.10.02.59 for ; Tue, 26 Jun 2018 10:02:59 -0700 (PDT) Received-SPF: pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) client-ip=217.140.101.70; Authentication-Results: mx.google.com; spf=pass (google.com: domain of james.morse@arm.com designates 217.140.101.70 as permitted sender) smtp.mailfrom=james.morse@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5435922BE; Tue, 26 Jun 2018 10:02:59 -0700 (PDT) Received: from melchizedek.cambridge.arm.com (melchizedek.cambridge.arm.com [10.1.206.34]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 14E133F318; Tue, 26 Jun 2018 10:02:55 -0700 (PDT) From: James Morse To: linux-acpi@vger.kernel.org Cc: kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org, linux-mm@kvack.org, Borislav Petkov , Marc Zyngier , Christoffer Dall , Will Deacon , Catalin Marinas , Naoya Horiguchi , Rafael Wysocki , Len Brown , Tony Luck , Tyler Baicar , Dongjiu Geng , Xie XiuQi , Punit Agrawal , jonathan.zhang@cavium.com, James Morse Subject: [PATCH v5 17/20] firmware: arm_sdei: Add ACPI GHES registration helper Date: Tue, 26 Jun 2018 18:01:13 +0100 Message-Id: <20180626170116.25825-18-james.morse@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180626170116.25825-1-james.morse@arm.com> References: <20180626170116.25825-1-james.morse@arm.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP APEI's Generic Hardware Error Source structures do not describe whether the SDEI event is shared or private, as this information is discoverable via the API. GHES needs to know whether an event is normal or critical to avoid sharing locks or fixmap entries, but we don't want GHES to have to know much about the SDEI API. Add a helper to register the GHES using the appropriate normal or critical callback. Signed-off-by: James Morse --- Changes since v4: * Moved normal/critical callbacks into the helper, as APEI needs to know. * Dropped Punit's Reviewed-by. Changes since v3: * Removed acpi_disabled() checks that aren't necessary after v2s #ifdef change. Changes since v2: * Added header file, thanks kbuild-robot! * changed ifdef to the GHES version to match the fixmap definition Changes since v1: * ghes->fixmap_idx variable rename --- arch/arm64/include/asm/fixmap.h | 4 ++ drivers/firmware/arm_sdei.c | 66 +++++++++++++++++++++++++++++++++ include/linux/arm_sdei.h | 6 +++ 3 files changed, 76 insertions(+) diff --git a/arch/arm64/include/asm/fixmap.h b/arch/arm64/include/asm/fixmap.h index c3974517c2cb..e2b423a5feaf 100644 --- a/arch/arm64/include/asm/fixmap.h +++ b/arch/arm64/include/asm/fixmap.h @@ -58,6 +58,10 @@ enum fixed_addresses { #ifdef CONFIG_ACPI_APEI_SEA FIX_APEI_GHES_SEA, #endif +#ifdef CONFIG_ARM_SDE_INTERFACE + FIX_APEI_GHES_SDEI_NORMAL, + FIX_APEI_GHES_SDEI_CRITICAL, +#endif #endif /* CONFIG_ACPI_APEI_GHES */ #ifdef CONFIG_UNMAP_KERNEL_AT_EL0 diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 1ea71640fdc2..c1b6591f2183 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -2,6 +2,7 @@ // Copyright (C) 2017 Arm Ltd. #define pr_fmt(fmt) "sdei: " fmt +#include #include #include #include @@ -32,6 +33,8 @@ #include #include +#include + /* * The call to use to reach the firmware. */ @@ -887,6 +890,69 @@ static void sdei_smccc_hvc(unsigned long function_id, arm_smccc_hvc(function_id, arg0, arg1, arg2, arg3, arg4, 0, 0, res); } +#ifdef CONFIG_ACPI_APEI_GHES +int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *normal_cb, + sdei_event_callback *critical_cb) +{ + int err; + u64 result; + u32 event_num; + sdei_event_callback *cb; + + event_num = ghes->generic->notify.vector; + if (event_num == 0) { + /* + * Event 0 is reserved by the specification for + * SDEI_EVENT_SIGNAL. + */ + return -EINVAL; + } + + err = sdei_api_event_get_info(event_num, SDEI_EVENT_INFO_EV_PRIORITY, + &result); + if (err) + return err; + + if (result == SDEI_EVENT_PRIORITY_CRITICAL) + cb = critical_cb; + else + cb = normal_cb; + + err = sdei_event_register(event_num, cb, ghes); + if (!err) + err = sdei_event_enable(event_num); + + return err; +} + +int sdei_unregister_ghes(struct ghes *ghes) +{ + int i; + int err; + u32 event_num = ghes->generic->notify.vector; + + might_sleep(); + + /* + * The event may be running on another CPU. Disable it + * to stop new events, then try to unregister a few times. + */ + err = sdei_event_disable(event_num); + if (err) + return err; + + for (i = 0; i < 3; i++) { + err = sdei_event_unregister(event_num); + if (err != -EINPROGRESS) + break; + + schedule(); + } + + return err; +} +#endif /* CONFIG_ACPI_APEI_GHES */ + static int sdei_get_conduit(struct platform_device *pdev) { const char *method; diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index 942afbd544b7..393899192906 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -11,6 +11,7 @@ enum sdei_conduit_types { CONDUIT_HVC, }; +#include #include /* Arch code should override this to set the entry point from firmware... */ @@ -39,6 +40,11 @@ int sdei_event_unregister(u32 event_num); int sdei_event_enable(u32 event_num); int sdei_event_disable(u32 event_num); +/* GHES register/unregister helpers */ +int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *normal_cb, + sdei_event_callback *critical_cb); +int sdei_unregister_ghes(struct ghes *ghes); + #ifdef CONFIG_ARM_SDE_INTERFACE /* For use by arch code when CPU hotplug notifiers are not appropriate. */ int sdei_mask_local_cpu(void);