From patchwork Mon Nov 15 06:44:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shuai Xue X-Patchwork-Id: 12692521 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E5C3C433F5 for ; Mon, 15 Nov 2021 06:45:49 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 E397461BFA for ; Mon, 15 Nov 2021 06:45:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org E397461BFA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.alibaba.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :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=bI+uLTMpoWOjx8yrSNaEiAKgSwKmcspmSnmZ9Oi+LXo=; b=G3a+MzuLW2Z2al qvgMvqqSPcV9qiBuU6a3Ky0L7gTDtQ2TVw12tWe9kfT0OSJR/XQ3EKHZMkJ/2hUgKUzxF7cuVUo53 gcgIVGNjzZKjB+XAGBEErvHSe6J+94JFUluqKyG1B3IRIAJrCMEJpLp2NpmeoHRWp23UvJ1/orC1d Jy5yeWy2fD4uWAGzvoQPbqkabQzWH2WQHwrDyyCkAi+4H2Dw5xp1Y5wp6b5UIes8izFl4cx2Bcowd fKGhZ3heMT1heosYpbdoFoDTIpzt2+OUirpGTfz1iXKd3IBaaSGKaL/SNIxnQVHx/bhm7Noy1qm09 NaRXa1hNLiOJO09iMnZQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mmVj9-00ESmk-Ez; Mon, 15 Nov 2021 06:44:27 +0000 Received: from out30-57.freemail.mail.aliyun.com ([115.124.30.57]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mmVj5-00ESmE-2i for linux-arm-kernel@lists.infradead.org; Mon, 15 Nov 2021 06:44:25 +0000 X-Alimail-AntiSpam: AC=PASS; BC=-1|-1; BR=01201311R421e4; CH=green; DM=||false|; DS=||; FP=0|-1|-1|-1|0|-1|-1|-1; HT=e01e04400; MF=xueshuai@linux.alibaba.com; NM=1; PH=DS; RN=13; SR=0; TI=SMTPD_---0UwafAYb_1636958656; Received: from localhost.localdomain(mailfrom:xueshuai@linux.alibaba.com fp:SMTPD_---0UwafAYb_1636958656) by smtp.aliyun-inc.com(127.0.0.1); Mon, 15 Nov 2021 14:44:18 +0800 From: Shuai Xue To: linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org Cc: bp@alien8.de, tony.luck@intel.com, james.morse@arm.com, lenb@kernel.org, rjw@rjwysocki.net, bhelgaas@google.com, xueshuai@linux.alibaba.com, zhangliguang@linux.alibaba.com, zhuo.song@linux.alibaba.com Subject: [RFC PATCH v3] ACPI: Move sdei_init and ghes_init ahead Date: Mon, 15 Nov 2021 14:44:15 +0800 Message-Id: <20211115064415.29933-1-xueshuai@linux.alibaba.com> X-Mailer: git-send-email 2.30.1 (Apple Git-130) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211114_224423_313048_C1FA1BDF X-CRM114-Status: GOOD ( 16.18 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org On an ACPI system, ACPI is initialised very early from a subsys_initcall(), while SDEI is not ready until a subsys_initcall(). More seriously, the kernel is able to handle and report errors until the GHES is initialised by device_initcall(). Consequently, when an error occurs during the kernel booting, the phyiscal sdei dispatcher in firmware fails to dispatch error events. All errors that occurred before GHES initialization are missed and there is no chance to report and find them again. In this patch, move sdei_init and ghes_init as far ahead as possible, right after acpi_hest_init(). Signed-off-by: Shuai Xue --- Changelog v2 -> v3: Fix compile error in X86 Reported-by: kernel test robot --- drivers/acpi/apei/ghes.c | 3 +-- drivers/acpi/pci_root.c | 8 +++++++- drivers/firmware/arm_sdei.c | 9 +-------- include/acpi/apei.h | 2 ++ include/linux/arm_sdei.h | 2 ++ 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index 0c8330ed1ffd..4200369503b8 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -1457,7 +1457,7 @@ static struct platform_driver ghes_platform_driver = { .remove = ghes_remove, }; -static int __init ghes_init(void) +int __init ghes_init(void) { int rc; @@ -1499,4 +1499,3 @@ static int __init ghes_init(void) err: return rc; } -device_initcall(ghes_init); diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c index ab2f7dfb0c44..7658ae509377 100644 --- a/drivers/acpi/pci_root.c +++ b/drivers/acpi/pci_root.c @@ -23,7 +23,7 @@ #include #include #include /* for acpi_hest_init() */ - +#include /* for sdei_init() */ #include "internal.h" #define ACPI_PCI_ROOT_CLASS "pci_bridge" @@ -946,6 +946,12 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root, void __init acpi_pci_root_init(void) { acpi_hest_init(); + #ifdef CONFIG_ARM_SDE_INTERFACE + sdei_init(); + #endif + #ifdef CONFIG_ACPI_APEI_GHES + ghes_init(); + #endif if (acpi_pci_disabled) return; diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index a7e762c352f9..606520be326e 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -1059,7 +1059,7 @@ static bool __init sdei_present_acpi(void) return true; } -static int __init sdei_init(void) +int __init sdei_init(void) { struct platform_device *pdev; int ret; @@ -1080,13 +1080,6 @@ static int __init sdei_init(void) return ret; } -/* - * On an ACPI system SDEI needs to be ready before HEST:GHES tries to register - * its events. ACPI is initialised from a subsys_initcall(), GHES is initialised - * by device_initcall(). We want to be called in the middle. - */ -subsys_initcall_sync(sdei_init); - int sdei_event_handler(struct pt_regs *regs, struct sdei_registered_event *arg) { diff --git a/include/acpi/apei.h b/include/acpi/apei.h index ece0a8af2bae..155a0fe417c6 100644 --- a/include/acpi/apei.h +++ b/include/acpi/apei.h @@ -27,8 +27,10 @@ extern int hest_disable; extern int erst_disable; #ifdef CONFIG_ACPI_APEI_GHES extern bool ghes_disable; +int __init ghes_init(void); #else #define ghes_disable 1 +static inline int ghes_init(void) { return 0; } #endif #ifdef CONFIG_ACPI_APEI diff --git a/include/linux/arm_sdei.h b/include/linux/arm_sdei.h index 0a241c5c911d..983b7404bff9 100644 --- a/include/linux/arm_sdei.h +++ b/include/linux/arm_sdei.h @@ -46,9 +46,11 @@ int sdei_unregister_ghes(struct ghes *ghes); /* For use by arch code when CPU hotplug notifiers are not appropriate. */ int sdei_mask_local_cpu(void); int sdei_unmask_local_cpu(void); +int __init sdei_init(void); #else static inline int sdei_mask_local_cpu(void) { return 0; } static inline int sdei_unmask_local_cpu(void) { return 0; } +static inline int sdei_init(void) { return 0; } #endif /* CONFIG_ARM_SDE_INTERFACE */