Received: by 2002:a25:b794:0:0:0:0:0 with SMTP id n20csp3888507ybh; Tue, 6 Aug 2019 03:04:30 -0700 (PDT) X-Google-Smtp-Source: APXvYqw8bMXr9xxwnQc/wzsLwpSxx+4nSGcCnNjBGKaK9/Ngvw9RIYuw0lccOA55SxfozgQsfVjx X-Received: by 2002:a17:90a:17a6:: with SMTP id q35mr2385069pja.118.1565085870448; Tue, 06 Aug 2019 03:04:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565085870; cv=none; d=google.com; s=arc-20160816; b=oYlXSKWtOGKkzFgu+B0Iqdw9SIUBbZS5LYL8zgzdFXNtOgIm/6BeZ7qx74i22sPtS+ byFSaNr4u7z9gRo5gy3nvGyKBAJJd1FklLmd2mW72Bq4IQWZzloHwaVAl/qkzYkodnl5 JR3qBYcbsm/K+5Zli44taDbnwVh5MjyW0/S6IchnCUjfEGzylCLCigSPndYVIQI07GOr ZxJCqaiKiGpcxkDtOC9fXQWkyYO3S1PqxM2A/Ms0HjmkdiYlO8s4fONp7vq7qBttvWSq N9JmLygwK0mAXMcheUmX/S0r5/C8eZ2qK2cGmKO/9V46+PhZZtHX3tBz1lDCbTh6Hz3E 5zkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=6hlvdRrZYM5ndliw7TdeltVYmNbxG0D3IRf3n69muHA=; b=fQVM3jNRyZWcD1sTZ5QXX3KW81e4iR4FZ46esfshJKVQzUW4rioAiqEUDhP0k9drkk pEKRhuhgucGkNrbEqxCjfIPH78lP7S5YtW82YRuXfsrrQUGPrYRb3UUFjlY1fLi0w1FQ OlVVxUmWNJTstBb8BzljbaxFBHnhvk3RY/YYsj87K0Ts0DaFNhQIjAN9pWrM2MvD6M2g yFcygOynpBoUnUlwNBUhUK10IKj57PP6A27p3hHjvWDsj/uxkYjCxrx8lbDdWKAyqzDq QIY4aAj9eK6VhtP7fR5MMhFEiQ6hKZCUnEg81cjtpHUunlgUPlruj8FLn6fmrL5M9sSI ARgw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a21si48065655pfl.167.2019.08.06.03.04.14; Tue, 06 Aug 2019 03:04:30 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732762AbfHFKBs (ORCPT + 99 others); Tue, 6 Aug 2019 06:01:48 -0400 Received: from foss.arm.com ([217.140.110.172]:59538 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732726AbfHFKBq (ORCPT ); Tue, 6 Aug 2019 06:01:46 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A07BB337; Tue, 6 Aug 2019 03:01:45 -0700 (PDT) Received: from filthy-habits.cambridge.arm.com (filthy-habits.cambridge.arm.com [10.1.197.61]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 680773F706; Tue, 6 Aug 2019 03:01:44 -0700 (PDT) From: Marc Zyngier To: Thomas Gleixner , Jason Cooper , Julien Thierry , Rob Herring Cc: John Garry , Shameerali Kolothum Thodi , Lokesh Vutla , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH v2 12/12] irqchip/gic-v3: Add quirks for HIP06/07 invalid GICD_TYPER erratum 161010803 Date: Tue, 6 Aug 2019 11:01:21 +0100 Message-Id: <20190806100121.240767-13-maz@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190806100121.240767-1-maz@kernel.org> References: <20190806100121.240767-1-maz@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org It looks like the HIP06/07 SoCs have extra bits in their GICD_TYPER registers, which confuse the GICv3.1 code (these systems appear to expose ESPIs while they actually don't). Detect these systems as early as possible and wipe the fields that should be RES0 in the register. Signed-off-by: Marc Zyngier --- Documentation/arm64/silicon-errata.rst | 2 + drivers/irqchip/irq-gic-v3.c | 54 +++++++++++++++++++++----- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/Documentation/arm64/silicon-errata.rst b/Documentation/arm64/silicon-errata.rst index 3e57d09246e6..17ea3fecddaa 100644 --- a/Documentation/arm64/silicon-errata.rst +++ b/Documentation/arm64/silicon-errata.rst @@ -115,6 +115,8 @@ stable kernels. +----------------+-----------------+-----------------+-----------------------------+ | Hisilicon | Hip0{6,7} | #161010701 | N/A | +----------------+-----------------+-----------------+-----------------------------+ +| Hisilicon | Hip0{6,7} | #161010803 | N/A | ++----------------+-----------------+-----------------+-----------------------------+ | Hisilicon | Hip07 | #161600802 | HISILICON_ERRATUM_161600802 | +----------------+-----------------+-----------------+-----------------------------+ | Hisilicon | Hip08 SMMU PMCG | #162001800 | N/A | diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 334a10d9dbfb..bee141613b67 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -1441,6 +1441,46 @@ static bool gic_enable_quirk_msm8996(void *data) return true; } +static bool gic_enable_quirk_hip06_07(void *data) +{ + struct gic_chip_data *d = data; + + /* + * HIP06 GICD_IIDR clashes with GIC-600 product number (despite + * not being an actual ARM implementation). The saving grace is + * that GIC-600 doesn't have ESPI, so nothing to do in that case. + * HIP07 doesn't even have a proper IIDR, and still pretends to + * have ESPI. In both cases, put them right. + */ + if (d->rdists.gicd_typer & GICD_TYPER_ESPI) { + /* Zero both ESPI and the RES0 field next to it... */ + d->rdists.gicd_typer &= ~GENMASK(9, 8); + return true; + } + + return false; +} + +static const struct gic_quirk gic_quirks[] = { + { + .desc = "GICv3: Qualcomm MSM8996 broken firmware", + .compatible = "qcom,msm8996-gic-v3", + .init = gic_enable_quirk_msm8996, + }, + { + .desc = "GICv3: HIP06 erratum 161010803", + .iidr = 0x0204043b, + .init = gic_enable_quirk_hip06_07, + }, + { + .desc = "GICv3: HIP07 erratum 161010803", + .iidr = 0x00000000, + .init = gic_enable_quirk_hip06_07, + }, + { + } +}; + static void gic_enable_nmi_support(void) { int i; @@ -1494,6 +1534,10 @@ static int __init gic_init_bases(void __iomem *dist_base, */ typer = readl_relaxed(gic_data.dist_base + GICD_TYPER); gic_data.rdists.gicd_typer = typer; + + gic_enable_quirks(readl_relaxed(gic_data.dist_base + GICD_IIDR), + gic_quirks, &gic_data); + pr_info("%d SPIs implemented\n", GIC_LINE_NR - 32); pr_info("%d Extended SPIs implemented\n", GIC_ESPI_NR); gic_data.domain = irq_domain_create_tree(handle, &gic_irq_domain_ops, @@ -1676,16 +1720,6 @@ static void __init gic_of_setup_kvm_info(struct device_node *node) gic_set_kvm_info(&gic_v3_kvm_info); } -static const struct gic_quirk gic_quirks[] = { - { - .desc = "GICv3: Qualcomm MSM8996 broken firmware", - .compatible = "qcom,msm8996-gic-v3", - .init = gic_enable_quirk_msm8996, - }, - { - } -}; - static int __init gic_of_init(struct device_node *node, struct device_node *parent) { void __iomem *dist_base; -- 2.20.1