Received: by 2002:a05:6358:7058:b0:131:369:b2a3 with SMTP id 24csp5563817rwp; Mon, 17 Jul 2023 06:17:00 -0700 (PDT) X-Google-Smtp-Source: APBJJlEPM9h39p618LtbQxQns6yZPQsJEm1dUZliFuu6nedxwAUgvQZXEA++T4JqmopgfbhazIxX X-Received: by 2002:a05:6402:1514:b0:516:9fef:f8e7 with SMTP id f20-20020a056402151400b005169feff8e7mr10525060edw.3.1689599819920; Mon, 17 Jul 2023 06:16:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689599819; cv=none; d=google.com; s=arc-20160816; b=lKLpFmY6ZSBCktruGV48ZUTaBKUlq97VWJsBadyIDT54JqncbZRQhPpFOPAqXZ045h BYU3QpHMh394bCzYLN5brI2WvXi2gcbH4be+Gpq81nooiNoHKofXunuXV2xjq4J5SPHS 3CV0WaUT0CYvmpS8Ixchfo2FFcUYWWBoCuT6dq6D864UOPng7ipyd9XWd6daSi78JHh3 gNJVgqD703fgSJI+En1ILVZiG4yGNHFpM5V1ZM/0PvdMR0dyfG8sbSOSMyS+UoMiKCXC z/G7n/PsLDt38KosGH6rF751fnck+GrGxXITEKgFNziha6ngJwHQ2dLnKKpCPwB6SE/V u38g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:references:in-reply-to:cc:subject :to:reply-to:sender:from:dkim-signature:dkim-signature:date; bh=vefuixJumtk0yBn2sqoLWA3CCbpwswU21mplj/dOOjU=; fh=iOU0HEa7A0ZWu+1LI7V56S7vvQ2nil35sqxdaf8pmnw=; b=MDKtMsQYHzp2pbFG4Q45b1RyfrDSvK1Dbnmv/d91VjiBnefIoaA9j1QDCx5N3v1JXP s/bQ7bShRC9MAh0svArkUtWNc+VQciw6DlsBxs9q8ZMOfaL5T0xDPDRukkec61xoJBJ+ 2Scj33K8mKqet+KFpjLa6uDfpsMofvXpASNN6q9sLhwe4xvq+q6j4yH3m6vKMY8HvmzK UxRt0921mYYyQHha1FXYF97g3IXQUyKvuv1ErpcXQuSIzCB71vUIi2W0LLEzEyEAiYhg PUfZvd4JmxVJQqH5w3tFVbJDcDxURWNRaSBLhR4/AyWrRSbm0FXju2rMtG2QziHW1ahZ A01Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=syF+4cms; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=baQNiIy7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id a12-20020aa7cf0c000000b0051e01f391besi12735945edy.581.2023.07.17.06.16.36; Mon, 17 Jul 2023 06:16:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=syF+4cms; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=baQNiIy7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231387AbjGQM63 (ORCPT + 99 others); Mon, 17 Jul 2023 08:58:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39232 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231245AbjGQM6Q (ORCPT ); Mon, 17 Jul 2023 08:58:16 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6A51A1725 for ; Mon, 17 Jul 2023 05:57:49 -0700 (PDT) Date: Mon, 17 Jul 2023 12:57:34 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1689598655; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vefuixJumtk0yBn2sqoLWA3CCbpwswU21mplj/dOOjU=; b=syF+4cmsk7NI5FfDT/5grmxRSR/HydT9Xd6WeDnOxJlCAAlF/ec0UOmt1xoYU+T+1oMfs3 ECNmpB9fLDjcXiC778GItkpbg18qAQU4bK+ZB21hlS6Pgb3ZgXlTBvMz1h/00H1v3s1H6H E+i/XJLAQVjbJsdrQm9VYSLZuFgNFxWI91U8Mb/iGa5+qJ2Oat+0lxCFI8FE8pZhFc/nGC O5sVhUkvzmLcBgy8YrkPFHuAMUvl70dKzzkCjDE+QQeehNzkipCJSQRsvKSDcX+j/VVLHU ZvPmRn3zrTma3xd3vMafXvQPrCt4nMP2NwI3FvHIUCC5QFl37aO8+C5HybVu9g== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1689598655; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vefuixJumtk0yBn2sqoLWA3CCbpwswU21mplj/dOOjU=; b=baQNiIy771xl46P0IJIUzcpYctr9FN7w4kW+C3IpOrnPrR7kcK6ucnx/fO994vozaggic3 VzgPf828fAZ1V8BA== From: "irqchip-bot for Lorenzo Pieralisi" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-kernel@vger.kernel.org Subject: [irqchip: irq/irqchip-fixes] irqchip/gic-v3: Workaround for GIC-700 erratum 2941627 Cc: Lorenzo Pieralisi , Marc Zyngier , tglx@linutronix.de In-Reply-To: <20230704155034.148262-1-lpieralisi@kernel.org> References: <20230704155034.148262-1-lpieralisi@kernel.org> MIME-Version: 1.0 Message-ID: <168959865456.28540.15803135888794607892.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the irq/irqchip-fixes branch of irqchip: Commit-ID: 6fe5c68ee6a1aae0ef291a56001e7888de547fa2 Gitweb: https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms/6fe5c68ee6a1aae0ef291a56001e7888de547fa2 Author: Lorenzo Pieralisi AuthorDate: Tue, 04 Jul 2023 17:50:34 +02:00 Committer: Marc Zyngier CommitterDate: Tue, 11 Jul 2023 09:04:31 +01:00 irqchip/gic-v3: Workaround for GIC-700 erratum 2941627 GIC700 erratum 2941627 may cause GIC-700 missing SPIs wake requests when SPIs are deactivated while targeting a sleeping CPU - ie a CPU for which the redistributor: GICR_WAKER.ProcessorSleep == 1 This runtime situation can happen if an SPI that has been activated on a core is retargeted to a different core, it becomes pending and the target core subsequently enters a power state quiescing the respective redistributor. When this situation is hit, the de-activation carried out on the core that activated the SPI (through either ICC_EOIR1_EL1 or ICC_DIR_EL1 register writes) does not trigger a wake requests for the sleeping GIC redistributor even if the SPI is pending. Work around the erratum by de-activating the SPI using the redistributor GICD_ICACTIVER register if the runtime conditions require it (ie the IRQ was retargeted between activation and de-activation). Signed-off-by: Lorenzo Pieralisi Signed-off-by: Marc Zyngier Link: https://lore.kernel.org/r/20230704155034.148262-1-lpieralisi@kernel.org --- Documentation/arm64/silicon-errata.rst | 3 +- drivers/irqchip/irq-gic-v3.c | 62 ++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/Documentation/arm64/silicon-errata.rst b/Documentation/arm64/silicon-errata.rst index d6430ad..0d55d58 100644 --- a/Documentation/arm64/silicon-errata.rst +++ b/Documentation/arm64/silicon-errata.rst @@ -141,6 +141,9 @@ stable kernels. | ARM | MMU-500 | #841119,826419 | N/A | +----------------+-----------------+-----------------+-----------------------------+ +----------------+-----------------+-----------------+-----------------------------+ +| ARM | GIC-700 | #2941627 | ARM64_ERRATUM_2941627 | ++----------------+-----------------+-----------------+-----------------------------+ ++----------------+-----------------+-----------------+-----------------------------+ | Broadcom | Brahma-B53 | N/A | ARM64_ERRATUM_845719 | +----------------+-----------------+-----------------+-----------------------------+ | Broadcom | Brahma-B53 | N/A | ARM64_ERRATUM_843419 | diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 0c6c1af..eedfa8e 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -69,6 +69,8 @@ struct gic_chip_data { static void __iomem *t241_dist_base_alias[T241_CHIPS_MAX] __read_mostly; static DEFINE_STATIC_KEY_FALSE(gic_nvidia_t241_erratum); +static DEFINE_STATIC_KEY_FALSE(gic_arm64_2941627_erratum); + static struct gic_chip_data gic_data __read_mostly; static DEFINE_STATIC_KEY_TRUE(supports_deactivate_key); @@ -592,10 +594,39 @@ static void gic_irq_nmi_teardown(struct irq_data *d) gic_irq_set_prio(d, GICD_INT_DEF_PRI); } +static bool gic_arm64_erratum_2941627_needed(struct irq_data *d) +{ + enum gic_intid_range range; + + if (!static_branch_unlikely(&gic_arm64_2941627_erratum)) + return false; + + range = get_intid_range(d); + + /* + * The workaround is needed if the IRQ is an SPI and + * the target cpu is different from the one we are + * executing on. + */ + return (range == SPI_RANGE || range == ESPI_RANGE) && + !cpumask_test_cpu(raw_smp_processor_id(), + irq_data_get_effective_affinity_mask(d)); +} + static void gic_eoi_irq(struct irq_data *d) { write_gicreg(gic_irq(d), ICC_EOIR1_EL1); isb(); + + if (gic_arm64_erratum_2941627_needed(d)) { + /* + * Make sure the GIC stream deactivate packet + * issued by ICC_EOIR1_EL1 has completed before + * deactivating through GICD_IACTIVER. + */ + dsb(sy); + gic_poke_irq(d, GICD_ICACTIVER); + } } static void gic_eoimode1_eoi_irq(struct irq_data *d) @@ -606,7 +637,11 @@ static void gic_eoimode1_eoi_irq(struct irq_data *d) */ if (gic_irq(d) >= 8192 || irqd_is_forwarded_to_vcpu(d)) return; - gic_write_dir(gic_irq(d)); + + if (!gic_arm64_erratum_2941627_needed(d)) + gic_write_dir(gic_irq(d)); + else + gic_poke_irq(d, GICD_ICACTIVER); } static int gic_set_type(struct irq_data *d, unsigned int type) @@ -1816,6 +1851,12 @@ static bool gic_enable_quirk_asr8601(void *data) return true; } +static bool gic_enable_quirk_arm64_2941627(void *data) +{ + static_branch_enable(&gic_arm64_2941627_erratum); + return true; +} + static const struct gic_quirk gic_quirks[] = { { .desc = "GICv3: Qualcomm MSM8996 broken firmware", @@ -1864,6 +1905,25 @@ static const struct gic_quirk gic_quirks[] = { .init = gic_enable_quirk_nvidia_t241, }, { + /* + * GIC-700: 2941627 workaround - IP variant [0,1] + * + */ + .desc = "GICv3: ARM64 erratum 2941627", + .iidr = 0x0400043b, + .mask = 0xff0e0fff, + .init = gic_enable_quirk_arm64_2941627, + }, + { + /* + * GIC-700: 2941627 workaround - IP variant [2] + */ + .desc = "GICv3: ARM64 erratum 2941627", + .iidr = 0x0402043b, + .mask = 0xff0f0fff, + .init = gic_enable_quirk_arm64_2941627, + }, + { } };