Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp1254218ybn; Wed, 25 Sep 2019 15:06:51 -0700 (PDT) X-Google-Smtp-Source: APXvYqxH+SZXNju0H1jUW5ZshoFK1xTfBdFXv76rPVZN58WpVjZcu/AySAjbSc1y/APir0F+vxnG X-Received: by 2002:a17:906:254d:: with SMTP id j13mr399953ejb.30.1569449211277; Wed, 25 Sep 2019 15:06:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569449211; cv=none; d=google.com; s=arc-20160816; b=jb0zQaXib3FvXgX+liNXPvcX/Y0AUJxR+pBdOLQJTmvG6va9aHI0aON1GyzwzfdUGN eDGlLUCTjtoLxYczulzbs4/lItEaN8fqnievFqKbqH2ud9CTpbOAJdUOH99uxZr32742 gXhzFxobK7o8D7tmDnAmKePPMWkiXrWFqX4s7OhJbW6irhwW0iXPA65j/QybFBphmd3o a5Tcmtitmtenm49j/yd0if18KFeF23xwjB3aT0u9+b3+BUnLaJjY7YnufgwXFYBawjkN 3nD7Tw9jQo+wdpsSj7S/hk9AjPFZbuvwCN7f7czG6XeiTf0GPnX7iug5Eb919XdMMicg THdg== 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=02iLU78HG5NTN43bUhpF3tjm0PaZjGqhdvPAGp1S958=; b=d1TTLYSK1iCf+OZAKMzYPO6/Ct70vA6lV2FMfPOju9e3BvVewtcMVZDUoy4nRC3584 +ydxk3hOf8R3V8uvesG62ZWEs9Nj2a9R1G6cskStHvQeeVOThe0xM/yeL8E7xXe47Imn GZJR725piQ23Nr5Th5YVKadHaM3yj3730ckkSm01/lbedVrDWHqZL3Dgll6QTEhK6NfZ 4xxx8vVi0bSgfvvTvMOIWLXuwivI2RgutSOKeSxt8Ny7+6dLBHettsJNmdSrQVbbvfLe 2J71SN029PCRVbNO+hzX2tLf+9Fl5U2h+6qZu2sn0XwjOGS7ncXZyQwlIc/8c94q/YdO mZqg== 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 g3si229415edj.220.2019.09.25.15.06.27; Wed, 25 Sep 2019 15:06:51 -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 S2440466AbfIWS0o (ORCPT + 99 others); Mon, 23 Sep 2019 14:26:44 -0400 Received: from foss.arm.com ([217.140.110.172]:46682 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2438244AbfIWS0n (ORCPT ); Mon, 23 Sep 2019 14:26:43 -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 4E3DF15AB; Mon, 23 Sep 2019 11:26:43 -0700 (PDT) Received: from big-swifty.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DC8DD3F694; Mon, 23 Sep 2019 11:26:39 -0700 (PDT) From: Marc Zyngier To: kvmarm@lists.cs.columbia.edu, linux-kernel@vger.kernel.org Cc: Eric Auger , James Morse , Julien Thierry , Suzuki K Poulose , Thomas Gleixner , Jason Cooper , Lorenzo Pieralisi , Andrew Murray Subject: [PATCH 04/35] irqchip/gic-v3: Detect GICv4.1 supporting RVPEID Date: Mon, 23 Sep 2019 19:25:35 +0100 Message-Id: <20190923182606.32100-5-maz@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190923182606.32100-1-maz@kernel.org> References: <20190923182606.32100-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 GICv4.1 supports the RVPEID ("Residency per vPE ID"), which allows for a much efficient way of making virtual CPUs resident (to allow direct injection of interrupts). The functionnality needs to be discovered on each and every redistributor in the system, and disabled if the settings are inconsistent. Signed-off-by: Marc Zyngier --- drivers/irqchip/irq-gic-v3.c | 21 ++++++++++++++++++--- include/linux/irqchip/arm-gic-v3.h | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index 422664ac5f53..0b545e2c3498 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -849,8 +849,21 @@ static int __gic_update_rdist_properties(struct redist_region *region, void __iomem *ptr) { u64 typer = gic_read_typer(ptr + GICR_TYPER); + gic_data.rdists.has_vlpis &= !!(typer & GICR_TYPER_VLPIS); - gic_data.rdists.has_direct_lpi &= !!(typer & GICR_TYPER_DirectLPIS); + + /* RVPEID implies some form of DirectLPI, no matter what the doc says... :-/ */ + gic_data.rdists.has_rvpeid &= !!(typer & GICR_TYPER_RVPEID); + gic_data.rdists.has_direct_lpi &= (!!(typer & GICR_TYPER_DirectLPIS) | + gic_data.rdists.has_rvpeid); + + /* Detect non-sensical configurations */ + if (WARN_ON_ONCE(gic_data.rdists.has_rvpeid && !gic_data.rdists.has_vlpis)) { + gic_data.rdists.has_direct_lpi = false; + gic_data.rdists.has_vlpis = false; + gic_data.rdists.has_rvpeid = false; + } + gic_data.ppi_nr = min(GICR_TYPER_NR_PPIS(typer), gic_data.ppi_nr); return 1; @@ -863,9 +876,10 @@ static void gic_update_rdist_properties(void) if (WARN_ON(gic_data.ppi_nr == UINT_MAX)) gic_data.ppi_nr = 0; pr_info("%d PPIs implemented\n", gic_data.ppi_nr); - pr_info("%sVLPI support, %sdirect LPI support\n", + pr_info("%sVLPI support, %sdirect LPI support, %sRVPEID support\n", !gic_data.rdists.has_vlpis ? "no " : "", - !gic_data.rdists.has_direct_lpi ? "no " : ""); + !gic_data.rdists.has_direct_lpi ? "no " : "", + !gic_data.rdists.has_rvpeid ? "no " : ""); } /* Check whether it's single security state view */ @@ -1546,6 +1560,7 @@ static int __init gic_init_bases(void __iomem *dist_base, &gic_data); irq_domain_update_bus_token(gic_data.domain, DOMAIN_BUS_WIRED); gic_data.rdists.rdist = alloc_percpu(typeof(*gic_data.rdists.rdist)); + gic_data.rdists.has_rvpeid = true; gic_data.rdists.has_vlpis = true; gic_data.rdists.has_direct_lpi = true; diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h index 5cc10cf7cb3e..b34e0c113697 100644 --- a/include/linux/irqchip/arm-gic-v3.h +++ b/include/linux/irqchip/arm-gic-v3.h @@ -234,6 +234,7 @@ #define GICR_TYPER_VLPIS (1U << 1) #define GICR_TYPER_DirectLPIS (1U << 3) #define GICR_TYPER_LAST (1U << 4) +#define GICR_TYPER_RVPEID (1U << 7) #define GIC_V3_REDIST_SIZE 0x20000 @@ -613,6 +614,7 @@ struct rdists { u64 flags; u32 gicd_typer; bool has_vlpis; + bool has_rvpeid; bool has_direct_lpi; }; -- 2.20.1