Received: by 2002:a25:7ec1:0:0:0:0:0 with SMTP id z184csp1883968ybc; Wed, 20 Nov 2019 05:42:15 -0800 (PST) X-Google-Smtp-Source: APXvYqw/edMQy0Sw1MeygtaAM4Azaj5nI9iZiPHoJaIZiU+LCjT1pwd8aWB6Jpgx+NoKnNN/lgiu X-Received: by 2002:a17:906:52c4:: with SMTP id w4mr5246349ejn.99.1574257334935; Wed, 20 Nov 2019 05:42:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1574257334; cv=none; d=google.com; s=arc-20160816; b=nwqDS0cXZcLvnn5MEnnJ+Z68VTNcZlAI9E3OTGfTfzRr/mvcvUQflrZAVue2sAB6U4 /4+MvG1/5zGGK+5x1mJCzw/SbUbGNvVVne59fcihGgx2b6++FxfG74bvsLqpIAa7xvbz 6G8NkkHrwiwriyIb8rIspDfXwsOk+xE6JnfQn83XBsVsGfuy+lVfaW7KZOth+UqTcOmL FHqmk/6QLj7coVWdM6V9eeLYcw0X9fyoiRlKaGhLW5H1o4/HDA1F2bP0Ph983pLfSKGU OrwDEHii6o4WjMYnitTQLenJYi1A1w2FaFSgnbC5nc+BC+vGK2q5w0vcGBjKlNW/GSG8 e3Hw== 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 :robot-unsubscribe:robot-id:message-id:mime-version:references :in-reply-to:cc:subject:to:reply-to:from:date; bh=hDC8m35dB7ExIAy6Ur3t6LlL3xODWCECLrcRJIRp+x0=; b=SwH4v489fRlZIdZaU33VEEn5HbAIlwQDZxN2iikfwqjfLf178S3zr6mZEIa40hhFbF yMz6HB3dPkP+21CN/J0dY3+rIe2zdmN2V+Qt/i4ejTLTlIfduZCAQjpmUeLC5O//0lMG uCS0T4gujfbPGj7i57aRgS34Tq9FnyYMLFsfoWoex6+plB634cMGVLxw00cH5P/9cnqE iZuFwWSXS7LsZP7fsczAiBbladWoWpEGC69zf3lCm3P0ux8VBCAgH+2f+MlJadLenikk mSC6xY5w1pnCd08eHvVpoJmsZ4m5ZyWIv1CCZp9UK/QkPzxuywwjgmFf9yhmRIntmDj0 iL6w== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v2si15752584ejh.313.2019.11.20.05.41.50; Wed, 20 Nov 2019 05:42:14 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730471AbfKTNWv (ORCPT + 99 others); Wed, 20 Nov 2019 08:22:51 -0500 Received: from Galois.linutronix.de ([193.142.43.55]:56757 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730215AbfKTNVS (ORCPT ); Wed, 20 Nov 2019 08:21:18 -0500 Received: from [5.158.153.53] (helo=tip-bot2.lab.linutronix.de) by Galois.linutronix.de with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1iXPuz-0007Aq-An; Wed, 20 Nov 2019 14:21:13 +0100 Received: from [127.0.1.1] (localhost [IPv6:::1]) by tip-bot2.lab.linutronix.de (Postfix) with ESMTP id CD5491C1A17; Wed, 20 Nov 2019 14:21:04 +0100 (CET) Date: Wed, 20 Nov 2019 13:21:04 -0000 From: "tip-bot2 for Marc Zyngier" Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: irq/core] irqchip/gic-v3-its: Allow LPI invalidation via the DirectLPI interface Cc: Marc Zyngier , Zenghui Yu , Ingo Molnar , Borislav Petkov , linux-kernel@vger.kernel.org In-Reply-To: <20191027144234.8395-4-maz@kernel.org> References: <20191027144234.8395-4-maz@kernel.org> MIME-Version: 1.0 Message-ID: <157425606477.12247.1951688405515949505.tip-bot2@tip-bot2> X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The following commit has been merged into the irq/core branch of tip: Commit-ID: 425c09be0f091a3b5940261d9a5d8467d62987e7 Gitweb: https://git.kernel.org/tip/425c09be0f091a3b5940261d9a5d8467d62987e7 Author: Marc Zyngier AuthorDate: Fri, 08 Nov 2019 16:57:57 Committer: Marc Zyngier CommitterDate: Sun, 10 Nov 2019 18:47:51 irqchip/gic-v3-its: Allow LPI invalidation via the DirectLPI interface We currently don't make much use of the DirectLPI feature, and it would be beneficial to do this more, if only because it becomes a mandatory feature for GICv4.1. Signed-off-by: Marc Zyngier Reviewed-by: Zenghui Yu Link: https://lore.kernel.org/r/20191027144234.8395-4-maz@kernel.org Link: https://lore.kernel.org/r/20191108165805.3071-4-maz@kernel.org --- drivers/irqchip/irq-gic-v3-its.c | 40 ++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index 78d3e73..6065b09 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -191,6 +191,12 @@ static u16 get_its_list(struct its_vm *vm) return (u16)its_list; } +static inline u32 its_get_event_id(struct irq_data *d) +{ + struct its_device *its_dev = irq_data_get_irq_chip_data(d); + return d->hwirq - its_dev->event_map.lpi_base; +} + static struct its_collection *dev_event_to_col(struct its_device *its_dev, u32 event) { @@ -199,6 +205,13 @@ static struct its_collection *dev_event_to_col(struct its_device *its_dev, return its->collections + its_dev->event_map.col_map[event]; } +static struct its_collection *irq_to_col(struct irq_data *d) +{ + struct its_device *its_dev = irq_data_get_irq_chip_data(d); + + return dev_event_to_col(its_dev, its_get_event_id(d)); +} + static struct its_collection *valid_col(struct its_collection *col) { if (WARN_ON_ONCE(col->target_address & GENMASK_ULL(15, 0))) @@ -1049,12 +1062,6 @@ static void its_send_vinvall(struct its_node *its, struct its_vpe *vpe) * irqchip functions - assumes MSI, mostly. */ -static inline u32 its_get_event_id(struct irq_data *d) -{ - struct its_device *its_dev = irq_data_get_irq_chip_data(d); - return d->hwirq - its_dev->event_map.lpi_base; -} - static void lpi_write_config(struct irq_data *d, u8 clr, u8 set) { irq_hw_number_t hwirq; @@ -1099,12 +1106,28 @@ static void wait_for_syncr(void __iomem *rdbase) cpu_relax(); } +static void direct_lpi_inv(struct irq_data *d) +{ + struct its_collection *col; + void __iomem *rdbase; + + /* Target the redistributor this LPI is currently routed to */ + col = irq_to_col(d); + rdbase = per_cpu_ptr(gic_rdists->rdist, col->col_id)->rd_base; + gic_write_lpir(d->hwirq, rdbase + GICR_INVLPIR); + + wait_for_syncr(rdbase); +} + static void lpi_update_config(struct irq_data *d, u8 clr, u8 set) { struct its_device *its_dev = irq_data_get_irq_chip_data(d); lpi_write_config(d, clr, set); - its_send_inv(its_dev, its_get_event_id(d)); + if (gic_rdists->has_direct_lpi && !irqd_is_forwarded_to_vcpu(d)) + direct_lpi_inv(d); + else + its_send_inv(its_dev, its_get_event_id(d)); } static void its_vlpi_set_doorbell(struct irq_data *d, bool enable) @@ -2935,8 +2958,9 @@ static void its_vpe_send_inv(struct irq_data *d) if (gic_rdists->has_direct_lpi) { void __iomem *rdbase; + /* Target the redistributor this VPE is currently known on */ rdbase = per_cpu_ptr(gic_rdists->rdist, vpe->col_idx)->rd_base; - gic_write_lpir(vpe->vpe_db_lpi, rdbase + GICR_INVLPIR); + gic_write_lpir(d->parent_data->hwirq, rdbase + GICR_INVLPIR); wait_for_syncr(rdbase); } else { its_vpe_send_cmd(vpe, its_send_inv);