From patchwork Tue Jun 26 17:01:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 10489655 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 674E960386 for ; Tue, 26 Jun 2018 17:04:05 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 53619284CE for ; Tue, 26 Jun 2018 17:04:05 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 47E2A285AF; Tue, 26 Jun 2018 17:04:05 +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=unavailable 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 AE65628995 for ; Tue, 26 Jun 2018 17:03:09 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 665886B028D; Tue, 26 Jun 2018 13:03:07 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 595BC6B028E; Tue, 26 Jun 2018 13:03:07 -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 460116B028F; Tue, 26 Jun 2018 13:03:07 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ot0-f199.google.com (mail-ot0-f199.google.com [74.125.82.199]) by kanga.kvack.org (Postfix) with ESMTP id 1D7776B028D for ; Tue, 26 Jun 2018 13:03:07 -0400 (EDT) Received: by mail-ot0-f199.google.com with SMTP id s22-v6so2395889otk.7 for ; Tue, 26 Jun 2018 10:03:07 -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=fIWESuBaCaoVBtLNmgE3uGQxNyo30cEMk8LJu9P+3Jc=; b=cCLh+8/eLrKXzc7Slk2XnnQT06tkZmGIBWCBgzzYka4PzKsRpkYcwFwD4aK/wCiHQ2 hbGgrxLCRY5//7flinAivXoKU1YN9pSaHMSv6VWTpoNQEip/criclL5Cl/R+6Vw8JR4L Wu9TxM4T8ra98ICowTsRBGgF4CCXUzlBQ6om9y1vBMX9zHiTASr6KfAIqdBKJgsj2OXS jx1N3Y+TQFX0FZv1trczjEY03DVsWJ+2m1pdEOTVT72m3K8iNGpQDSLTy3v/QBtx3HKL cDyZS3Zac/3TgmtyXoWaHo1MVj9ODNWJzD8USmCl7qeJAn7yK93vqKWx56wK+aa5afWs S06A== 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: APt69E0PYx1BnzW3g3T6i7axkZe9ADkhZXTigNepZn6/hCtL6JDQc9YH qptBkjXOfaQc4sKeshXR7OIHqGPaTJLq17QDQTQzQPYhnh2L2adw2XwRKkNo9I/TXFJSlTM/0mU F2VIUdrCr4C06TTYXl9UXZxcqZjSwcXZ8ctQP4CywYtbM1Bu8TXux3id9OV7raZotow== X-Received: by 2002:aca:3842:: with SMTP id f63-v6mr1219187oia.299.1530032586881; Tue, 26 Jun 2018 10:03:06 -0700 (PDT) X-Google-Smtp-Source: AAOMgpcx+FIkVYuUZo59PcqUS+rMl+mhW73n2Dd8/9qV58gUHuOkSw6WX0vQbpdC5YXHtMOP2R3g X-Received: by 2002:aca:3842:: with SMTP id f63-v6mr1219117oia.299.1530032585413; Tue, 26 Jun 2018 10:03:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530032585; cv=none; d=google.com; s=arc-20160816; b=HD9Z5bkayLgVUOqJ4Iu4D14qzFnNtsDj8Ot7GR3IoYsGZIDAC0PsWKxcMknZPpm8zl AzIUm1T4YAujVJQnB+jDoE3sDPFHCdxmUAqZ/ZSK0fyS9wqBvDI40tNrKRTqXXefd1ah knpxkkNmrdb5qHo7j83Vv2QNYR35h5UzvSwo8E+QlFcw3RwmRzKOhj1h8/OkqEi1QE1T TTGe6Ps3jurF4kkESTcS4NC7QJRz0MQR8PqEMTUE/18FleUMHXCpVZvS5yeI/NBrBtuK 3XZr3CMvxab9TDeuY1GtJlZlEAsuWeVlOLtc2bj/2gxHtHQZpxMtxIgM9sZCgpFIygbn KHUA== 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=fIWESuBaCaoVBtLNmgE3uGQxNyo30cEMk8LJu9P+3Jc=; b=prJ/dzHDCUyzxPOjpoDCvEOvvD1IVpZGv9bGupbeZ6O8zbn/9oVJz64E0Ut2LSrkkr /BA5JuIf73DZ/QeehIcauAdufkJ9bVU1s4v6q+syeXYvHr4T2LzgxhK9QXKVc5tYqW8V 4/b6qoC2XubEmIGyHHuEQ3xNynzQFC9J9pTEmZXcIUqXBXYMrPT9eK4kCweg/96xydA9 UazvhY0KDbiEcw2IIIT1yGhksXVeWMcwK7FT7hPem6w0e+wUFVY7fYVNBOasGQ6Y7Hz5 Td+oRbNgX556ykPYJfVtWIgJ72no6aCn5yRWkKtUYn0hx5FM0Qk4LhVeeVUWfP1sdzYb aQvA== 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 t204-v6si682920oit.379.2018.06.26.10.03.05 for ; Tue, 26 Jun 2018 10:03:05 -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 F163F1713; Tue, 26 Jun 2018 10:03:04 -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 BE3E83F318; Tue, 26 Jun 2018 10:03:00 -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 18/20] ACPI / APEI: Add support for the SDEI GHES Notification type Date: Tue, 26 Jun 2018 18:01:14 +0100 Message-Id: <20180626170116.25825-19-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 If the GHES notification type is SDEI, register the provided event using the SDEI-GHES helper. SDEI may be one of two types of event, normal and critical. Critical events can interrupt normal events, so these must have separate fixmap slots and locks in case both event types are in use. Signed-off-by: James Morse --- Changes since v4: * We now have two callbacks and separate locks and fixmap entries for normal/critical calls. * Use the new Kconfig selector for ESTATUS_QUEUE arch/arm64/include/asm/fixmap.h | 2 +- drivers/acpi/apei/Kconfig | 5 ++ drivers/acpi/apei/ghes.c | 92 ++++++++++++++++++++++++++++++++- drivers/firmware/Kconfig | 1 + drivers/firmware/arm_sdei.c | 4 +- include/linux/arm_sdei.h | 3 ++ 6 files changed, 102 insertions(+), 5 deletions(-) diff --git a/arch/arm64/include/asm/fixmap.h b/arch/arm64/include/asm/fixmap.h index e2b423a5feaf..e875b97032ce 100644 --- a/arch/arm64/include/asm/fixmap.h +++ b/arch/arm64/include/asm/fixmap.h @@ -58,7 +58,7 @@ enum fixed_addresses { #ifdef CONFIG_ACPI_APEI_SEA FIX_APEI_GHES_SEA, #endif -#ifdef CONFIG_ARM_SDE_INTERFACE +#ifdef CONFIG_ACPI_APEI_SDEI FIX_APEI_GHES_SDEI_NORMAL, FIX_APEI_GHES_SDEI_CRITICAL, #endif diff --git a/drivers/acpi/apei/Kconfig b/drivers/acpi/apei/Kconfig index 2b191e09b647..a8d09065e6a9 100644 --- a/drivers/acpi/apei/Kconfig +++ b/drivers/acpi/apei/Kconfig @@ -61,6 +61,11 @@ config ACPI_APEI_SEA option allows the OS to look for such hardware error record, and take appropriate action. +config ACPI_APEI_SDEI + bool + depends on ACPI_APEI_GHES && ARM_SDE_INTERFACE + select ACPI_APEI_GHES_ESTATUS_QUEUE + config ACPI_APEI_MEMORY_FAILURE bool "APEI memory error recovering support" depends on ACPI_APEI && MEMORY_FAILURE diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 15d472048aa8..b7b335450a6b 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -25,6 +25,7 @@ * GNU General Public License for more details. */ +#include #include #include #include @@ -763,8 +764,8 @@ static int _in_nmi_notify_one(struct ghes *ghes, int fixmap_idx) return rc; } -static int ghes_estatus_queue_notified(struct list_head *rcu_list, - int fixmap_idx) +static int __maybe_unused +ghes_estatus_queue_notified(struct list_head *rcu_list, int fixmap_idx) { int ret = -ENOENT; struct ghes *ghes; @@ -1069,6 +1070,75 @@ static inline void ghes_nmi_add(struct ghes *ghes) { } static inline void ghes_nmi_remove(struct ghes *ghes) { } #endif /* CONFIG_HAVE_ACPI_APEI_NMI */ +#ifdef CONFIG_ACPI_APEI_SDEI +static int __ghes_sdei_callback(struct ghes *ghes, int fixmap_idx) +{ + if (!_in_nmi_notify_one(ghes, fixmap_idx)) { + irq_work_queue(&ghes_proc_irq_work); + + return 0; + } + + return -ENOENT; +} + +static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sdei_normal); +static DEFINE_RAW_SPINLOCK(ghes_notify_lock_sdei_critical); + +static int ghes_sdei_normal_callback(u32 event_num, struct pt_regs *regs, + void *arg) +{ + int err = -ENOENT; + struct ghes *ghes = arg; + + raw_spin_lock(&ghes_notify_lock_sdei_normal); + err = __ghes_sdei_callback(ghes, FIX_APEI_GHES_SDEI_NORMAL); + raw_spin_unlock(&ghes_notify_lock_sdei_normal); + + return err; +} + +static int ghes_sdei_critical_callback(u32 event_num, struct pt_regs *regs, + void *arg) +{ + int err = -ENOENT; + struct ghes *ghes = arg; + + raw_spin_lock(&ghes_notify_lock_sdei_critical); + err = __ghes_sdei_callback(ghes, FIX_APEI_GHES_SDEI_CRITICAL); + raw_spin_unlock(&ghes_notify_lock_sdei_critical); + + return err; +} + +static int apei_sdei_register_ghes(struct ghes *ghes) +{ + int err; + + ghes_estatus_queue_grow_pool(ghes); + + err = sdei_register_ghes(ghes, ghes_sdei_normal_callback, + ghes_sdei_critical_callback); + if (err) + ghes_estatus_queue_shrink_pool(ghes); + + return err; +} + +static int apei_sdei_unregister_ghes(struct ghes *ghes) +{ + int err = sdei_unregister_ghes(ghes); + + if (!err) + ghes_estatus_queue_shrink_pool(ghes); + + return err; +} +#else +static int apei_sdei_register_ghes(struct ghes *ghes) { return -EINVAL; } +static int apei_sdei_unregister_ghes(struct ghes *ghes) { return -EINVAL; } +#endif /* CONFIG_ACPI_APEI_SDEI */ + static int ghes_probe(struct platform_device *ghes_dev) { struct acpi_hest_generic *generic; @@ -1103,6 +1173,13 @@ static int ghes_probe(struct platform_device *ghes_dev) goto err; } break; + case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED: + if (!IS_ENABLED(CONFIG_ACPI_APEI_SDEI)) { + pr_warn(GHES_PFX "Generic hardware error source: %d notified via SDE Interface is not supported!\n", + generic->header.source_id); + goto err; + } + break; case ACPI_HEST_NOTIFY_LOCAL: pr_warning(GHES_PFX "Generic hardware error source: %d notified via local interrupt is not supported!\n", generic->header.source_id); @@ -1166,6 +1243,11 @@ static int ghes_probe(struct platform_device *ghes_dev) case ACPI_HEST_NOTIFY_NMI: ghes_nmi_add(ghes); break; + case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED: + rc = apei_sdei_register_ghes(ghes); + if (rc) + goto err; + break; default: BUG(); } @@ -1189,6 +1271,7 @@ static int ghes_probe(struct platform_device *ghes_dev) static int ghes_remove(struct platform_device *ghes_dev) { + int rc; struct ghes *ghes; struct acpi_hest_generic *generic; @@ -1221,6 +1304,11 @@ static int ghes_remove(struct platform_device *ghes_dev) case ACPI_HEST_NOTIFY_NMI: ghes_nmi_remove(ghes); break; + case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED: + rc = apei_sdei_unregister_ghes(ghes); + if (rc) + return rc; + break; default: BUG(); break; diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig index 6e83880046d7..69c52c0591da 100644 --- a/drivers/firmware/Kconfig +++ b/drivers/firmware/Kconfig @@ -85,6 +85,7 @@ config ARM_SCPI_POWER_DOMAIN config ARM_SDE_INTERFACE bool "ARM Software Delegated Exception Interface (SDEI)" depends on ARM64 + select ACPI_APEI_SDEI if ACPI_APEI_GHES help The Software Delegated Exception Interface (SDEI) is an ARM standard for registering callbacks from the platform firmware diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index c1b6591f2183..97fd8d22bf15 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -890,7 +890,7 @@ 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 +#ifdef CONFIG_ACPI_APEI_SDEI int sdei_register_ghes(struct ghes *ghes, sdei_event_callback *normal_cb, sdei_event_callback *critical_cb) { @@ -951,7 +951,7 @@ int sdei_unregister_ghes(struct ghes *ghes) return err; } -#endif /* CONFIG_ACPI_APEI_GHES */ +#endif /* CONFIG_ACPI_APEI_SDEI */ static int sdei_get_conduit(struct platform_device *pdev) { diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index 393899192906..3305ea7f9dc7 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -12,7 +12,10 @@ enum sdei_conduit_types { }; #include + +#ifdef CONFIG_ARM_SDE_INTERFACE #include +#endif /* Arch code should override this to set the entry point from firmware... */ #ifndef sdei_arch_get_entry_point