Received: by 2002:a25:824b:0:0:0:0:0 with SMTP id d11csp1302841ybn; Wed, 25 Sep 2019 16:00:39 -0700 (PDT) X-Google-Smtp-Source: APXvYqyQViH98G0vCdybyZ4LCAv3n70FB0nxszjJ9X4sIv7mY0qSjH3/0QcE6ixpEWWN+ZNIfC4F X-Received: by 2002:a05:6402:1a4f:: with SMTP id bf15mr458294edb.292.1569452439199; Wed, 25 Sep 2019 16:00:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1569452439; cv=none; d=google.com; s=arc-20160816; b=0BYpIdwELMMICf8PK5GWtoNG0lWgWBHdvIXiqR4nKXobSlb174U2rdTquMaDF5HG7x 98qnicHQpWCzcxJcZwAr9fXsxBDhrNXzITatz2iSL7zcZwkAWQVnKSMc1FUUvpAIhWpS xkLYMGROPq8FDIXtcUT0W0t9wD7z08m/yyo90/kZ2vrfwfU8pV3icvtW60CO88t5BEtU Fg09f9wOb3pdBzBV/M9YFHG9elDOdYhHo8vHj68TudTrQdcbY9Tb+Mn96o1B9l+XuZ6F eUAFgTjTjKN/c5YFKPLbE9raJwjrJr+rXH7XD4DOApXeTADzIOxp5vUidHgfSaEroqHV f/Fw== 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=jhd/vJ36YXDXXOvGrMwivrzMV1U0G+ud2eokB57+P1o=; b=kejUqAPw2JcJbzU38/bifil25q5qEVcKB3NdBlckZJ4pbAA30rKD5X+oYOZRSHa32T 3DaEZRX0pvLzyewAMJzUnHtNckOHiav09ZHlk38wircNwUwzs5VaPg3ggH5XhO9iGh3d GpslLHeFpi6BDw15qnEjIuCTF6DoUyuH3Fk3AoXmyPJCSLpyrIoQJf5FC+M/zmGAxzba lXGNnkpYavzeRiaDPZ5gR4eja1QlHk4MGhRyYOPfuo0/Ns1bWSAmn0biA6oRxgJ53TIe 0KfYBAvLON1RnzZhSu7s6mgekGKRuMEaMGKv6SHcl1WEJHyl3sdKAWGLTk05ifOSrP95 +1TA== 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 y8si282622edd.355.2019.09.25.16.00.15; Wed, 25 Sep 2019 16:00:39 -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 S2502318AbfIWS1Q (ORCPT + 99 others); Mon, 23 Sep 2019 14:27:16 -0400 Received: from foss.arm.com ([217.140.110.172]:46864 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2502300AbfIWS1P (ORCPT ); Mon, 23 Sep 2019 14:27:15 -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 28BF619BF; Mon, 23 Sep 2019 11:27:15 -0700 (PDT) Received: from big-swifty.lan (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7400A3F694; Mon, 23 Sep 2019 11:27:11 -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 13/35] irqchip/gic-v4.1: Implement the v4.1 flavour of VMOVP Date: Mon, 23 Sep 2019 19:25:44 +0100 Message-Id: <20190923182606.32100-14-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 With GICv4.1, VMOVP is extended to allow a default doorbell to be specified, as well as a validity bit for this doorbell. As an added bonus, VMOPVP isn't required anymore of moving a VPE between redistributors that share the same affinity. Let's add this support to the VMOVP builder, and make sure we don't issuer the command if we don't really need to. Signed-off-by: Marc Zyngier --- drivers/irqchip/irq-gic-v3-its.c | 40 ++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index a9976bc81d9a..c71aa0046bf0 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -443,6 +443,17 @@ static void its_encode_vmapp_default_db(struct its_cmd_block *cmd, its_mask_encode(&cmd->raw_cmd[1], vpe_db_lpi, 31, 0); } +static void its_encode_vmovp_default_db(struct its_cmd_block *cmd, + u32 vpe_db_lpi) +{ + its_mask_encode(&cmd->raw_cmd[3], vpe_db_lpi, 31, 0); +} + +static void its_encode_db(struct its_cmd_block *cmd, bool db) +{ + its_mask_encode(&cmd->raw_cmd[2], db, 63, 63); +} + static inline void its_fixup_cmd(struct its_cmd_block *cmd) { /* Let's fixup BE commands */ @@ -729,6 +740,11 @@ static struct its_vpe *its_build_vmovp_cmd(struct its_node *its, its_encode_vpeid(cmd, desc->its_vmovp_cmd.vpe->vpe_id); its_encode_target(cmd, target); + if (is_v4_1(its)) { + its_encode_db(cmd, true); + its_encode_vmovp_default_db(cmd, desc->its_vmovp_cmd.vpe->vpe_db_lpi); + } + its_fixup_cmd(cmd); return valid_vpe(its, desc->its_vmovp_cmd.vpe); @@ -3178,7 +3194,7 @@ static int its_vpe_set_affinity(struct irq_data *d, bool force) { struct its_vpe *vpe = irq_data_get_irq_chip_data(d); - int cpu = cpumask_first(mask_val); + int from, cpu = cpumask_first(mask_val); /* * Changing affinity is mega expensive, so let's be as lazy as @@ -3186,14 +3202,24 @@ static int its_vpe_set_affinity(struct irq_data *d, * into the proxy device, we need to move the doorbell * interrupt to its new location. */ - if (vpe->col_idx != cpu) { - int from = vpe->col_idx; + if (vpe->col_idx == cpu) + goto out; - vpe->col_idx = cpu; - its_send_vmovp(vpe); - its_vpe_db_proxy_move(vpe, from, cpu); - } + from = vpe->col_idx; + vpe->col_idx = cpu; + + /* + * GICv4.1 allows us to skip VMOVP if moving to a cpu whose RD + * is sharing its VPE table with the current one. + */ + if (gic_data_rdist_cpu(cpu)->vpe_table_mask && + cpumask_test_cpu(from, gic_data_rdist_cpu(cpu)->vpe_table_mask)) + goto out; + its_send_vmovp(vpe); + its_vpe_db_proxy_move(vpe, from, cpu); + +out: irq_data_update_effective_affinity(d, cpumask_of(cpu)); return IRQ_SET_MASK_OK_DONE; -- 2.20.1