Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp2517765pxj; Mon, 10 May 2021 05:03:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwbNlObtJHiSt4vO/nXtMxqAWW5KMfxKzIlJHqP95kalfch+k8TUeetuJWoWrqjhkfB9kU3 X-Received: by 2002:a05:6402:1109:: with SMTP id u9mr29786581edv.174.1620648191018; Mon, 10 May 2021 05:03:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620648191; cv=none; d=google.com; s=arc-20160816; b=KcMA/cMF93bEtQUm4aS5wliafEe/EZ1w6FH3IhfjIkX6w7VOfzYlH3SY3nNv4am5Oy r1Ou3Ykm5VC6QhbT1gOVUnUHuN429JmAYLBhDZhiKgEsyz8AvS/63AGFUiVlzVpYeymY BsLNbmQGEKqXvvWmFbCbUCCAxtKgaykXurqxA5pbFFzAxJP83d55Idfj5Dfz7Wi9t3Nh Dv0tTuMClLz8nUS5VeoCBOdo07/ug9ZII/EtqaavTCS0XMzvHNl+3PZrdEhqsScthiXU lXyCEWOBd99trc2q1SQP9TNWQ9Rm7uWAYR3wW5lF/pdJaNCwRNaUE0Eb6cPNic4BSaBo NHlg== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=uJ3txCIFQaL80NFSZ9PvvKn1hdzAemfpbghh/7ZymHY=; b=HmZuW0vPr/di0RYL9H/J135pWDH6UoYowYzSUpuLC5fTFrHh+Vr/0kiSPCcLZmLB+X JedijTBAtNP93DAs6ZW3gRKLp5edNlgdL2PuHTKr5O9n78B49oDbEYtHbZwDHncpJwaC wyOMDecmzzld78rrehPZMCu1gHBxjCk6z+TxQhYxo3GX+G9EjklE4H7ztbkY1INzerd1 xe6kCWtIHEvlAO65ZQ8G32jeNhc3DiUz47vszgdGxVv+2sNuK74mtUsoVwUky7wSL37L SsDQLxydtRVfW+RpQqTrYjJSk6ysCjP2pXzwcvOG4gNksD8I9tN38fInPUiXmyMxC2Wl gAqA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ZcwCALAL; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id b31si13893026edf.440.2021.05.10.05.02.46; Mon, 10 May 2021 05:03:11 -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; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=ZcwCALAL; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243270AbhEJLsW (ORCPT + 99 others); Mon, 10 May 2021 07:48:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:55722 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233878AbhEJLB7 (ORCPT ); Mon, 10 May 2021 07:01:59 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 7BC4A61C5B; Mon, 10 May 2021 10:54:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620644041; bh=8TUX8ebQCnnosyGIob6anlDtDbTdnqT6huL51mjRUGc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZcwCALALNg87cHWgp7B1p0tGG3PcgqPTFfDFsfouPSi6i39BkdlyJboaF6ghfo3/p 9phFGTgCj3eO9o/bNADd/Ca3/c3vFbQNxasgJ6AmvrLkSZOj4Z1h/Js+jSxvcEzCLj OJruB+mANn6FkXlATO7Uo9OTsY/buoqm+33Cu3A0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, dann frazier , Marc Zyngier , Fu Wei , Sudeep Holla , Hanjun Guo , Lorenzo Pieralisi , Catalin Marinas Subject: [PATCH 5.11 264/342] ACPI: GTDT: Dont corrupt interrupt mappings on watchdow probe failure Date: Mon, 10 May 2021 12:20:54 +0200 Message-Id: <20210510102018.822975507@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210510102010.096403571@linuxfoundation.org> References: <20210510102010.096403571@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Marc Zyngier commit 1ecd5b129252249b9bc03d7645a7bda512747277 upstream. 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: Cc: Fu Wei Reviewed-by: Sudeep Holla Tested-by: dann frazier Tested-by: Hanjun Guo Reviewed-by: Hanjun Guo Reviewed-by: Lorenzo Pieralisi Link: https://lore.kernel.org/r/20210421164317.1718831-2-maz@kernel.org Signed-off-by: Catalin Marinas Signed-off-by: Greg Kroah-Hartman --- drivers/acpi/arm64/gtdt.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) --- a/drivers/acpi/arm64/gtdt.c +++ b/drivers/acpi/arm64/gtdt.c @@ -329,7 +329,7 @@ static int __init gtdt_import_sbsa_gwdt( 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 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( 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( */ 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); }