From patchwork Mon Apr 3 20:28:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9660549 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 6A7056032D for ; Mon, 3 Apr 2017 20:28:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5BFAA28403 for ; Mon, 3 Apr 2017 20:28:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 510DE2841C; Mon, 3 Apr 2017 20:28:57 +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 DD78528403 for ; Mon, 3 Apr 2017 20:28:56 +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 1cv8Z3-0005WO-Kd; Mon, 03 Apr 2017 20:27:01 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cv8Z2-0005Nj-2O for xen-devel@lists.xenproject.org; Mon, 03 Apr 2017 20:27:00 +0000 Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id 36/95-03705-310B2E85; Mon, 03 Apr 2017 20:26:59 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrMLMWRWlGSWpSXmKPExsVysyfVTVd4w6M Ig6uTOS2+b5nM5MDocfjDFZYAxijWzLyk/IoE1oyDDw6wF7RrVLxYuoOpgfGAfBcjF4eQwEZG iZ2t69khnOWMEj/7F7J0MXJysAnoSuy4+ZoZxBYRCJV4uuA7mM0soCSx/+w1RhBbWCBQ4sre4 2wgNouAqsTWtnlgNbwC1hLfJx0DmyMhICfRcP4+WJwTKN768ShYr5CAlcSEh01MExi5FzAyrG LUKE4tKkst0jU010sqykzPKMlNzMzRNTQw1stNLS5OTE/NSUwq1kvOz93ECPQwAxDsYHx52vM QoyQHk5Ior/qkRxFCfEn5KZUZicUZ8UWlOanFhxg1ODgENq9dfYFRiiUvPy9VSYL32DqgOsGi 1PTUirTMHGAIwpRKcPAoifBuBknzFhck5hZnpkOkTjEqSonzZoAkBEASGaV5cG2wsL/EKCslz MsIdJQQT0FqUW5mCar8K0ZxDkYlYV5VkCk8mXklcNNfAS1mAlr85M5DkMUliQgpqQZG8aMnnX jv7uM4fdPzaL/9Ep3mJ+wGASoND+/UKes+XiQav+vRZvWZKzWKT2SX1it973i9uJt5172baV+ nSEU1WO28LXrDbKvh10mRtcn/8h6auNV1dqXlXmSqmqzcmm4y/6jfipn9J733yDb7TLn50G7G H8+Gsz1GNU4/T21R3eSaO7dF85uQEktxRqKhFnNRcSIAbcWN43YCAAA= X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-9.tower-31.messagelabs.com!1491251218!38401368!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 31382 invoked from network); 3 Apr 2017 20:26:58 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-9.tower-31.messagelabs.com with SMTP; 3 Apr 2017 20:26:58 -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 3E20D2B; Mon, 3 Apr 2017 13:26:58 -0700 (PDT) Received: from e104803-lin.lan (unknown [10.1.207.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B5FA03F4FF; Mon, 3 Apr 2017 13:26:56 -0700 (PDT) From: Andre Przywara To: Julien Grall , Stefano Stabellini Date: Mon, 3 Apr 2017 21:28:27 +0100 Message-Id: <20170403202829.7278-26-andre.przywara@arm.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170403202829.7278-1-andre.przywara@arm.com> References: <20170403202829.7278-1-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org Subject: [Xen-devel] [PATCH v4 25/27] 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 35a0730..dfb6eb3 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -1080,6 +1080,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 ebcfc16..3fc309e 100644 --- a/xen/arch/arm/vgic-v3.c +++ b/xen/arch/arm/vgic-v3.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -1582,6 +1583,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; @@ -1607,6 +1609,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 f460457..6a60630 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -115,6 +115,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 3b5f898..fb05311 100644 --- a/xen/include/asm-arm/gic_v3_its.h +++ b/xen/include/asm-arm/gic_v3_its.h @@ -154,6 +154,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. @@ -219,6 +227,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