From patchwork Mon Jan 8 15:38:16 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 10149895 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 BA3FD602CA for ; Mon, 8 Jan 2018 15:59:04 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C15EE28514 for ; Mon, 8 Jan 2018 15:59:04 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B0C98288A7; Mon, 8 Jan 2018 15:59: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=-4.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 3E16D2879C for ; Mon, 8 Jan 2018 15:59:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To: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:List-Owner; bh=2+930rX+0TZty0NF2s8yuG24gVVmeq++NaL2drYrtO4=; b=FcSFByFnbbi4Ia9+yD1m9YI8jV CDvrLRBstwbLN7kGqyOhufL5ZVMHIb1mbEV8vZUcSPnpq3SzsYm1DvkkE91ZzWkbPoW5aJVIeq798 OQrDSbGf2lRszrtK043uEjAez4KmXtLLwcpDeV+akRMhhUhoFMFhr01ZWAVGtOffcqejXTOGhpgZf r0nmdThv2l2ROAPvzkfvnFyLI1rOQiJI8C/re6+2BMxu3NKfbKN9I8MpNsAE1Sm8LSgKlCHw2VLRe 2V75q3GWxPdScOoU3dP7zPPtC14L4gkvN0gRZ5lKEOzuWRpNsn8VfPWbLGZJ60KaCF33uHyHtFQzW hwebUQfA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1eYZpE-0000O1-8o; Mon, 08 Jan 2018 15:59:00 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.89 #1 (Red Hat Linux)) id 1eYZna-0007QE-Am for linux-arm-kernel@bombadil.infradead.org; Mon, 08 Jan 2018 15:57:18 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=ttKJehK4S4UwNlde8feJunPTDAb0z5N4YE5vf5In36Y=; b=eLqCEIFGUKNC/FGhtG8cn7z5U tT+WlDt2bHvCV63Fs8WV7S7xbEIlsgdOkDzR4N3wtNf16vHCD2JwyeQaFUJ3M55Hgd3dHSCofTQq0 8g5cW+9Q3RIcSrgDcFyXl7hnlUBoZgEbSswBHNnCwERWi/4moUG0d78+tOnPlMpus58D1+8xje/hW cZXA4tcLdF1J/6HE0kpB1dKG22G/UK5XXF4KBHLq+K4loY4YA7OhxiUE1NBUZfVe89RPpF6lnutqk Q62znWLmIwlzPpRSHMplwLbkd4Jy+Gj6J05orbTj0KlDGF5ehxgcEr9p/D1mz9f0hDfNxK5if6tER vl3vrOQ6A==; Received: from foss.arm.com ([217.140.101.70]) by casper.infradead.org with esmtp (Exim 4.89 #1 (Red Hat Linux)) id 1eYZYC-0000DV-7v for linux-arm-kernel@lists.infradead.org; Mon, 08 Jan 2018 15:41:26 +0000 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 0345C15A2; Mon, 8 Jan 2018 07:41:24 -0800 (PST) Received: from melchizedek.cambridge.arm.com (melchizedek.cambridge.arm.com [10.1.207.55]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E506F3F581; Mon, 8 Jan 2018 07:41:21 -0800 (PST) From: James Morse To: linux-arm-kernel@lists.infradead.org Subject: [PATCH v6 14/16] firmware: arm_sdei: Discover SDEI support via ACPI Date: Mon, 8 Jan 2018 15:38:16 +0000 Message-Id: <20180108153818.22743-15-james.morse@arm.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20180108153818.22743-1-james.morse@arm.com> References: <20180108153818.22743-1-james.morse@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20180108_154124_415644_1A1E632A X-CRM114-Status: GOOD ( 15.43 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , devicetree@vger.kernel.org, Lorenzo Pieralisi , Marc Zyngier , Catalin Marinas , Will Deacon , Rob Herring , Loc Ho , Heyi Guo , kvmarm@lists.cs.columbia.edu, Christoffer Dall MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP SDEI defines a new ACPI table to indicate the presence of the interface. The conduit is discovered in the same way as PSCI. For ACPI we need to create the platform device ourselves as SDEI doesn't have an entry in the DSDT. The SDEI platform device should be created after ACPI has been initialised so that we can parse the table, but before GHES devices are created, which may register SDE events if they use SDEI as their notification type. Signed-off-by: James Morse Acked-by: Catalin Marinas Reviewed-by: Lorenzo Pieralisi --- drivers/firmware/arm_sdei.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c index 10a8bfa7339a..fb7caa3628b9 100644 --- a/drivers/firmware/arm_sdei.c +++ b/drivers/firmware/arm_sdei.c @@ -907,6 +907,14 @@ static int sdei_get_conduit(struct platform_device *pdev) } pr_warn("invalid \"method\" property: %s\n", method); + } else if (IS_ENABLED(CONFIG_ACPI) && !acpi_disabled) { + if (acpi_psci_use_hvc()) { + sdei_firmware_call = &sdei_smccc_hvc; + return CONDUIT_HVC; + } else { + sdei_firmware_call = &sdei_smccc_smc; + return CONDUIT_SMC; + } } return CONDUIT_INVALID; @@ -1020,14 +1028,45 @@ static bool __init sdei_present_dt(void) return true; } +static bool __init sdei_present_acpi(void) +{ + acpi_status status; + struct platform_device *pdev; + struct acpi_table_header *sdei_table_header; + + if (acpi_disabled) + return false; + + status = acpi_get_table(ACPI_SIG_SDEI, 0, &sdei_table_header); + if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { + const char *msg = acpi_format_exception(status); + + pr_info("Failed to get ACPI:SDEI table, %s\n", msg); + } + if (ACPI_FAILURE(status)) + return false; + + pdev = platform_device_register_simple(sdei_driver.driver.name, 0, NULL, + 0); + if (IS_ERR(pdev)) + return false; + + return true; +} + static int __init sdei_init(void) { - if (sdei_present_dt()) + if (sdei_present_dt() || sdei_present_acpi()) platform_driver_register(&sdei_driver); return 0; } +/* + * 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,