Received: by 2002:a25:d7c1:0:0:0:0:0 with SMTP id o184csp1938306ybg; Sun, 27 Oct 2019 07:48:34 -0700 (PDT) X-Google-Smtp-Source: APXvYqzJnBTJpsDZvjsKC8G/+SaqyOMgwYi4zBG9OVKWv3vrQIVT8aVljplwlHjqCz5ojrv21kfw X-Received: by 2002:a17:906:3b4e:: with SMTP id h14mr12398309ejf.111.1572187714602; Sun, 27 Oct 2019 07:48:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1572187714; cv=none; d=google.com; s=arc-20160816; b=C1mbsV9141pRkG5Orcfdd2p/x5++uMCQVASc2rXJMOGp9uY+mFF0VI50s8oa0YZCVE EHm/XrrBSnCX0xvGhVkob9wV96eGOXCt6us5SIF03PnoybiiS1ySBc90au+wJp+G885b MzROewYgygByLgxnJPqx/sdwcA0UZnTilvQ/IXilh8a6vNSmatIdJbnwPAxN5j3Xppm1 8cyLgqRiDnG2SuRuBqdAy9ft8XYPP80zLuIdP0QoHKRxl2t91fwvlizjyGouw7hzynam ggOVRW/RCADIe9Hw56Sh3MxdX7JjO7T7fyNw2tkVDKJxNfJk6QXQ+Vnnp5jblmPrd/Vh TzBA== 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 :dkim-signature; bh=1AEvFacUy849ZvmfyNaR1ewwyvUD0LDGfmajxVPHLqs=; b=mPEnFlvtxK8g4uZFICjKd0iyd2ldNPcGFxShaSfvRiuC5nDYh8nFhgRAUyjimLxy4y xQonI3sBrvtQUtuQvxg8Q7Zizzueokk2Lwm6mM2pguUSa++i4rm9i+yUpqf49OM/c2L1 4Mn93Ygir384H4G/3Sw8Q90G0imSpOhUaL+la+cE2PV9W9TfsfX/j5ZROcn6jh6CvKii 879hSbNRXOt398rg7Pqe0hSmnMZ6dVxzBmL9HqZvDx/cCOiWPoTS0RJp7yuXTZxG73uf SliBAHtCI/1WWzzK5fI5eBp7Xd+UUW8nT0oUyurwAQLGDP17CVL3Fa4dXxwY8+Pj6CsL 2Z6g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=Iwe06Yy8; 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=pass (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 f37si5956504ede.11.2019.10.27.07.48.11; Sun, 27 Oct 2019 07:48:34 -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; dkim=pass header.i=@kernel.org header.s=default header.b=Iwe06Yy8; 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=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727333AbfJ0Oou (ORCPT + 99 others); Sun, 27 Oct 2019 10:44:50 -0400 Received: from mail.kernel.org ([198.145.29.99]:37890 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726944AbfJ0Oot (ORCPT ); Sun, 27 Oct 2019 10:44:49 -0400 Received: from localhost.localdomain (82-132-239-15.dab.02.net [82.132.239.15]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 3C97B21850; Sun, 27 Oct 2019 14:44:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1572187488; bh=OvqA2+Qm/Jp/XJTuxqpzYBqEAklKjunLQcAiKcV82iA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Iwe06Yy8h5nIeS0Kgy2BTdz2+WzuLmgDQnQq8rOE90H5Wif5tVwz3d1gzkneKOV4P jJl9K2ef1H+Z1Mjmzq1ZNlWaG4B5KXbQhUR8l8nplZ+7Mr/DIAGlqAULvyH1TuK/m3 UtYtyCCSYb4ofxt5uXzdDCzNZfjhQMIOelbxVon4= 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 , Zenghui Yu , Jayachandran C , Robert Richter Subject: [PATCH v2 16/36] irqchip/gic-v4.1: Add mask/unmask doorbell callbacks Date: Sun, 27 Oct 2019 14:42:14 +0000 Message-Id: <20191027144234.8395-17-maz@kernel.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191027144234.8395-1-maz@kernel.org> References: <20191027144234.8395-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 masking/unmasking doorbells on GICv4.1 relies on a new INVDB command, which broadcasts the invalidation to all RDs. Implement the new command as well as the masking callbacks, and plug the whole thing into the v4.1 VPE irqchip. Signed-off-by: Marc Zyngier --- drivers/irqchip/irq-gic-v3-its.c | 60 ++++++++++++++++++++++++++++++ include/linux/irqchip/arm-gic-v3.h | 3 +- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c index dcc7227af5f1..3c34bef70bdd 100644 --- a/drivers/irqchip/irq-gic-v3-its.c +++ b/drivers/irqchip/irq-gic-v3-its.c @@ -309,6 +309,10 @@ struct its_cmd_desc { u16 seq_num; u16 its_list; } its_vmovp_cmd; + + struct { + struct its_vpe *vpe; + } its_invdb_cmd; }; }; @@ -750,6 +754,21 @@ static struct its_vpe *its_build_vmovp_cmd(struct its_node *its, return valid_vpe(its, desc->its_vmovp_cmd.vpe); } +static struct its_vpe *its_build_invdb_cmd(struct its_node *its, + struct its_cmd_block *cmd, + struct its_cmd_desc *desc) +{ + if (WARN_ON(!is_v4_1(its))) + return NULL; + + its_encode_cmd(cmd, GITS_CMD_INVDB); + its_encode_vpeid(cmd, desc->its_invdb_cmd.vpe->vpe_id); + + its_fixup_cmd(cmd); + + return valid_vpe(its, desc->its_invdb_cmd.vpe); +} + static u64 its_cmd_ptr_to_offset(struct its_node *its, struct its_cmd_block *ptr) { @@ -1117,6 +1136,14 @@ static void its_send_vinvall(struct its_node *its, struct its_vpe *vpe) its_send_single_vcommand(its, its_build_vinvall_cmd, &desc); } +static void its_send_invdb(struct its_node *its, struct its_vpe *vpe) +{ + struct its_cmd_desc desc; + + desc.its_invdb_cmd.vpe = vpe; + its_send_single_vcommand(its, its_build_invdb_cmd, &desc); +} + /* * irqchip functions - assumes MSI, mostly. */ @@ -3408,6 +3435,37 @@ static struct irq_chip its_vpe_irq_chip = { .irq_set_vcpu_affinity = its_vpe_set_vcpu_affinity, }; +static void its_vpe_4_1_send_inv(struct irq_data *d) +{ + struct its_vpe *vpe = irq_data_get_irq_chip_data(d); + struct its_node *its; + + /* + * GICv4.1 wants doorbells to be invalidated using the + * INVDB command in order to be broadcast to all RDs. Send + * it to the first valid ITS, and let the HW do its magic. + */ + list_for_each_entry(its, &its_nodes, entry) { + if (!is_v4_1(its)) + continue; + + its_send_invdb(its, vpe); + break; + } +} + +static void its_vpe_4_1_mask_irq(struct irq_data *d) +{ + lpi_write_config(d->parent_data, LPI_PROP_ENABLED, 0); + its_vpe_4_1_send_inv(d); +} + +static void its_vpe_4_1_unmask_irq(struct irq_data *d) +{ + lpi_write_config(d->parent_data, 0, LPI_PROP_ENABLED); + its_vpe_4_1_send_inv(d); +} + static int its_vpe_4_1_set_vcpu_affinity(struct irq_data *d, void *vcpu_info) { struct its_cmd_info *info = vcpu_info; @@ -3429,6 +3487,8 @@ static int its_vpe_4_1_set_vcpu_affinity(struct irq_data *d, void *vcpu_info) static struct irq_chip its_vpe_4_1_irq_chip = { .name = "GICv4.1-vpe", + .irq_mask = its_vpe_4_1_mask_irq, + .irq_unmask = its_vpe_4_1_unmask_irq, .irq_eoi = irq_chip_eoi_parent, .irq_set_affinity = its_vpe_set_affinity, .irq_set_vcpu_affinity = its_vpe_4_1_set_vcpu_affinity, diff --git a/include/linux/irqchip/arm-gic-v3.h b/include/linux/irqchip/arm-gic-v3.h index f1d6de53e09b..8157737053e4 100644 --- a/include/linux/irqchip/arm-gic-v3.h +++ b/include/linux/irqchip/arm-gic-v3.h @@ -484,8 +484,9 @@ #define GITS_CMD_VMAPTI GITS_CMD_GICv4(GITS_CMD_MAPTI) #define GITS_CMD_VMOVI GITS_CMD_GICv4(GITS_CMD_MOVI) #define GITS_CMD_VSYNC GITS_CMD_GICv4(GITS_CMD_SYNC) -/* VMOVP is the odd one, as it doesn't have a physical counterpart */ +/* VMOVP and INVDB are the odd ones, as they dont have a physical counterpart */ #define GITS_CMD_VMOVP GITS_CMD_GICv4(2) +#define GITS_CMD_INVDB GITS_CMD_GICv4(0xe) /* * ITS error numbers -- 2.20.1