Received: by 2002:a05:6a10:a841:0:0:0:0 with SMTP id d1csp68887pxy; Wed, 21 Apr 2021 18:48:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw4qA4An+n9zq/04YMohnidUw/JCrnl6EahLre14SC7ZERQ9S0A8ph63Pe5Bu3xC18AsxV2 X-Received: by 2002:a17:906:7ac9:: with SMTP id k9mr737101ejo.229.1619056107604; Wed, 21 Apr 2021 18:48:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619056107; cv=none; d=google.com; s=arc-20160816; b=Ib0BJ/UasWeXS4lZxuL03gkqenhEXfwap5L2usTkY3X9nm+V6bRnzZE5DcCjfCDS5s rvxy8paTEP5kKXMs81ZJABf4mXxm9T1n4m0+d9rFTiYaqymdwR7Pg5WlXwC3J8Za2xg6 WZd/U71V29CYdwZLddKCd8queXZTI3kGTVN5GGPN0/YlIu6RPwLtZY2bwCvZ/zciOqwx 74ZZ4T4jwVTjGb3M9swMZhbD57Lvfhbffwr8hppUPxH692j0OCP9lnraM6ab6GLU5/Fc XEsLsuYn0EqKa24vUPuADDH6HQmoFS7Ejnw9XK2xM9vVyexFVm6N9DP4m4YA3dMv0lHl FdFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=NiU/TQrF1zAZB3bkmQxiuKer6E92Es4iQGe214IsNRQ=; b=duH3j4YDmFHYe3r37z3aPjKSDHqH6qY+wBNQ6H9/hQw+iYPCxsDBoAHGI1cl7x3JeC o7CDyxrtsS8Y1rLpFiZ/iyvi8uXAmtIPipvDpnb9tADhWO8lUisDR9xezQMf46CORg3q ZeJBX45nxOgK822r3Rb/AcTI2ti0GH+NpNFUnefvPI0Z+XSvD+TNp626UOzl5d6+hF9H USrTbK529RZiqqsUjzqYkO194BW+ZZ+9WIoj47ho56PaJVBMMN8oSY4vnYFEWY7Fgvou drT4sUCPfC4/ma+kbwZ8lZZnzJfvQn4cKDpF3z3ocMimkjzETBulA64M5BWx9YYfyjx8 fEDQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bv9si835225ejb.377.2021.04.21.18.48.04; Wed, 21 Apr 2021 18:48:27 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236149AbhDUQoD (ORCPT + 99 others); Wed, 21 Apr 2021 12:44:03 -0400 Received: from mail.kernel.org ([198.145.29.99]:53616 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239598AbhDUQoB (ORCPT ); Wed, 21 Apr 2021 12:44:01 -0400 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 45B1C61406; Wed, 21 Apr 2021 16:43:28 +0000 (UTC) Received: from 78.163-31-62.static.virginmediabusiness.co.uk ([62.31.163.78] helo=why.lan) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94) (envelope-from ) id 1lZFwk-008jPD-Dw; Wed, 21 Apr 2021 17:43:26 +0100 From: Marc Zyngier To: Lorenzo Pieralisi , Sudeep Holla , Hanjun Guo Cc: dann frazier , Fu Wei , Len Brown , "Rafael J. Wysocki" , linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, stable@vgerlkernel.org Subject: [PATCH 1/2] ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure Date: Wed, 21 Apr 2021 17:43:16 +0100 Message-Id: <20210421164317.1718831-2-maz@kernel.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210421164317.1718831-1-maz@kernel.org> References: <20210421164317.1718831-1-maz@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 62.31.163.78 X-SA-Exim-Rcpt-To: lorenzo.pieralisi@arm.com, sudeep.holla@arm.com, guohanjun@huawei.com, dann.frazier@canonical.com, wefu@redhat.com, lenb@kernel.org, rjw@rjwysocki.net, linux-acpi@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, kernel-team@android.com, stable@vgerlkernel.org X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When failing the driver probe because of invalid firmware properties, the GTDT driver unmaps the interrupt that it mapped earlier. However, it never checks whether the mapping of the interrupt actially succeeded. Even more, should the firmware report an illegal interrupt number that overlaps with the GIC SGI range, this can result in an IPI being unmapped, and subsequent fireworks (as reported by Dann Frazier). Rework the driver to have a slightly saner behaviour and actually check whether the interrupt has been mapped before unmapping things. Reported-by: dann frazier Fixes: ca9ae5ec4ef0 ("acpi/arm64: Add SBSA Generic Watchdog support in GTDT driver") Signed-off-by: Marc Zyngier Link: https://lore.kernel.org/r/YH87dtTfwYgavusz@xps13.dannf Cc: stable@vgerlkernel.org Cc: Fu Wei --- drivers/acpi/arm64/gtdt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/acpi/arm64/gtdt.c b/drivers/acpi/arm64/gtdt.c index f2d0e5915dab..0a0a982f9c28 100644 --- a/drivers/acpi/arm64/gtdt.c +++ b/drivers/acpi/arm64/gtdt.c @@ -329,7 +329,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd, int index) { struct platform_device *pdev; - int irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags); + int irq; /* * According to SBSA specification the size of refresh and control @@ -338,7 +338,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd, struct resource res[] = { DEFINE_RES_MEM(wd->control_frame_address, SZ_4K), DEFINE_RES_MEM(wd->refresh_frame_address, SZ_4K), - DEFINE_RES_IRQ(irq), + {}, }; int nr_res = ARRAY_SIZE(res); @@ -348,10 +348,11 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd, if (!(wd->refresh_frame_address && wd->control_frame_address)) { pr_err(FW_BUG "failed to get the Watchdog base address.\n"); - acpi_unregister_gsi(wd->timer_interrupt); return -EINVAL; } + irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags); + res[2] = (struct resource)DEFINE_RES_IRQ(irq); if (irq <= 0) { pr_warn("failed to map the Watchdog interrupt.\n"); nr_res--; @@ -364,7 +365,8 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd, */ pdev = platform_device_register_simple("sbsa-gwdt", index, res, nr_res); if (IS_ERR(pdev)) { - acpi_unregister_gsi(wd->timer_interrupt); + if (irq > 0) + acpi_unregister_gsi(wd->timer_interrupt); return PTR_ERR(pdev); } -- 2.29.2