From patchwork Fri Mar 31 18:05:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9657081 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 3E46D60350 for ; Fri, 31 Mar 2017 18:05:38 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 32789286EF for ; Fri, 31 Mar 2017 18:05:38 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 27656286F1; Fri, 31 Mar 2017 18:05:38 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B147A286F0 for ; Fri, 31 Mar 2017 18:05:37 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cu0u2-000629-FZ; Fri, 31 Mar 2017 18:04:02 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cu0u1-0005z5-Jd for xen-devel@lists.xenproject.org; Fri, 31 Mar 2017 18:04:01 +0000 Received: from [193.109.254.147] by server-7.bemta-6.messagelabs.com id 25/AB-04817-11A9ED85; Fri, 31 Mar 2017 18:04:01 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrILMWRWlGSWpSXmKPExsVysyfVTVdg1r0 IgxvNshbft0xmcmD0OPzhCksAYxRrZl5SfkUCa0Zzd0FBu0ZF/9EzbA2MB+S7GLk4hAQ2MUr8 uH6LFcJZzijx+dJKxi5GTg42AV2JHTdfM4PYIgKhEk8XfAeyOTiYBSoluhfxg4SFBQIl2ifeY QKxWQRUJeac+ABWzitgI/Fw0nmwuISAnETD+ftgcU6g+PxdP1hBbCEBa4mGT3eZJzByL2BkWM WoUZxaVJZapGtkoZdUlJmeUZKbmJmja2hgppebWlycmJ6ak5hUrJecn7uJEehdBiDYwXh+beA hRkkOJiVR3u/F9yKE+JLyUyozEosz4otKc1KLDzFqcHAIbF67+gKjFEtefl6qkgSvxwygOsGi 1PTUirTMHGD4wZRKcPAoifB+mA6U5i0uSMwtzkyHSJ1iVJQS5z0G0icAksgozYNrg4X8JUZZK WFeRqCjhHgKUotyM0tQ5V8xinMwKgnzFoFM4cnMK4Gb/gpoMRPQYouvd0EWlyQipKQaGGuaGJ i3GdZd9s+9c6P82uzAp70W7tPvNBsp8PNdKzU+e7tGjKf9cZVDDdcM26qYuROj0ndfu+5txGm 2dP1WvoDQI50Riy81O2w1n/bs/Obfv9OKHux4MIU/6Kzbmk/HEh9e4H3meGiV09Jfp3kttvkc P3s1KnLv4aMqBUHqdh/XLJyhuflWoooSS3FGoqEWc1FxIgD+7heGdAIAAA== X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-9.tower-27.messagelabs.com!1490983439!95029854!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 13225 invoked from network); 31 Mar 2017 18:04:00 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-9.tower-27.messagelabs.com with SMTP; 31 Mar 2017 18:04:00 -0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9C50FB16; Fri, 31 Mar 2017 11:03:59 -0700 (PDT) Received: from e104803-lin.lan (unknown [10.1.207.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 2F8D03F59A; Fri, 31 Mar 2017 11:03:58 -0700 (PDT) From: Andre Przywara To: Julien Grall , Stefano Stabellini Date: Fri, 31 Mar 2017 19:05:23 +0100 Message-Id: <20170331180525.30038-25-andre.przywara@arm.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170331180525.30038-1-andre.przywara@arm.com> References: <20170331180525.30038-1-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org, Shanker Donthineni , Vijay Kilari Subject: [Xen-devel] [PATCH v3 24/26] ARM: vITS: create and initialize virtual ITSes for Dom0 X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP For each hardware ITS create and initialize a virtual ITS for Dom0. We use the same memory mapped address to keep the doorbell working. Signed-off-by: Andre Przywara --- xen/arch/arm/vgic-v3-its.c | 32 ++++++++++++++++++++++++++++++++ xen/arch/arm/vgic-v3.c | 17 +++++++++++++++++ xen/include/asm-arm/domain.h | 1 + xen/include/asm-arm/gic_v3_its.h | 16 ++++++++++++++++ 4 files changed, 66 insertions(+) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 24e7d17..c5cf249 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -1074,6 +1074,38 @@ static const struct mmio_handler_ops vgic_its_mmio_handler = { .write = vgic_v3_its_mmio_write, }; +int vgic_v3_its_init_virtual(struct domain *d, paddr_t guest_addr, + unsigned int devid_bits, unsigned int intid_bits) +{ + struct virt_its *its; + uint64_t base_attr; + + its = xzalloc(struct virt_its); + if ( ! its ) + return -ENOMEM; + + base_attr = GIC_BASER_InnerShareable << GITS_BASER_SHAREABILITY_SHIFT; + base_attr |= GIC_BASER_CACHE_SameAsInner << GITS_BASER_OUTER_CACHEABILITY_SHIFT; + base_attr |= GIC_BASER_CACHE_RaWaWb << GITS_BASER_INNER_CACHEABILITY_SHIFT; + + its->cbaser = base_attr; + base_attr |= 0ULL << GITS_BASER_PAGE_SIZE_SHIFT; + its->baser_dev = GITS_BASER_TYPE_DEVICE << GITS_BASER_TYPE_SHIFT; + its->baser_dev |= (7ULL << GITS_BASER_ENTRY_SIZE_SHIFT) | base_attr; + its->baser_coll = GITS_BASER_TYPE_COLLECTION << GITS_BASER_TYPE_SHIFT; + its->baser_coll |= (1ULL << GITS_BASER_ENTRY_SIZE_SHIFT) | base_attr; + its->d = d; + its->doorbell_address = guest_addr + ITS_DOORBELL_OFFSET; + its->devid_bits = devid_bits; + its->intid_bits = intid_bits; + spin_lock_init(&its->vcmd_lock); + spin_lock_init(&its->its_lock); + + register_mmio_handler(d, &vgic_its_mmio_handler, guest_addr, SZ_64K, its); + + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index 4159fb8..22a7b1b 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -1583,6 +1584,7 @@ static int vgic_v3_domain_init(struct domain *d) */ if ( is_hardware_domain(d) ) { + struct host_its *hw_its; unsigned int first_cpu = 0; d->arch.vgic.dbase = vgic_v3_hw.dbase; @@ -1608,6 +1610,21 @@ static int vgic_v3_domain_init(struct domain *d) first_cpu += size / d->arch.vgic.rdist_stride; } + d->arch.vgic.nr_regions = vgic_v3_hw.nr_rdist_regions; + + list_for_each_entry(hw_its, &host_its_list, entry) + { + /* + * For each host ITS create a virtual ITS using the same + * base and thus doorbell address. + * Use the same number of device ID bits as the host, and + * allow 20 bits for the interrupt ID. + */ + vgic_v3_its_init_virtual(d, hw_its->addr, hw_its->devid_bits, 20); + + d->arch.vgic.has_its = true; + } + } else { diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index ad4dfdc..fa227ca 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -116,6 +116,7 @@ struct arch_domain spinlock_t its_devices_lock; /* Protects the its_devices tree */ struct radix_tree_root pend_lpi_tree; /* Stores struct pending_irq's */ rwlock_t pend_lpi_tree_lock; /* Protects the pend_lpi_tree */ + bool has_its; #endif } vgic; diff --git a/xen/include/asm-arm/gic_v3_its.h b/xen/include/asm-arm/gic_v3_its.h index 457400b..e055735 100644 --- a/xen/include/asm-arm/gic_v3_its.h +++ b/xen/include/asm-arm/gic_v3_its.h @@ -149,6 +149,14 @@ uint64_t gicv3_get_redist_address(unsigned int cpu, bool use_pta); int gicv3_its_setup_collection(unsigned int cpu); /* + * Create and register a virtual ITS at the given guest address. + * If a host ITS is specified, a hardware domain can reach out to that host + * ITS to deal with devices and LPI mappings and can enable/disable LPIs. + */ +int vgic_v3_its_init_virtual(struct domain *d, paddr_t guest_addr, + unsigned int devid_bits, unsigned int intid_bits); + +/* * Map a device on the host by allocating an ITT on the host (ITS). * "nr_event" specifies how many events (interrupts) this device will need. * Setting "valid" to false deallocates the device. @@ -213,6 +221,14 @@ static inline void gicv3_its_unmap_all_devices(struct domain *d) { } +static inline int vgic_v3_its_init_virtual(struct domain *d, + paddr_t guest_addr, + unsigned int devid_bits, + unsigned int intid_bits) +{ + return 0; +} + #endif /* CONFIG_HAS_ITS */ #endif