From patchwork Wed Apr 5 23:19:20 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9665895 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 CAD4F60352 for ; Wed, 5 Apr 2017 23:23:07 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BCA6D2816B for ; Wed, 5 Apr 2017 23:23:07 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B15E828584; Wed, 5 Apr 2017 23:23:07 +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 297672816B for ; Wed, 5 Apr 2017 23:23:07 +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 1cvuEt-0005PO-UR; Wed, 05 Apr 2017 23:21:23 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvuEs-0005LD-AO for xen-devel@lists.xenproject.org; Wed, 05 Apr 2017 23:21:22 +0000 Received: from [85.158.143.35] by server-2.bemta-6.messagelabs.com id 46/03-19731-1FB75E85; Wed, 05 Apr 2017 23:21:21 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrALMWRWlGSWpSXmKPExsVysyfVTfdj9dM Ig4f72Cy+b5nM5MDocfjDFZYAxijWzLyk/IoE1oybD8QKZhtW9P79xd7AeEyti5GLQ0hgE6NE e8MrJghnL6PElBfvWbsYOTnYBHQldtx8zQxiiwiESsz5+QjI5uBgFqiU6F7EDxIWFgiUuLbyJ BuIzSKgKvH7TA87iM0r4C5x8sg3sHIJATmJK/8SQMKcQOGXrcdYQGwhATeJaxOnskxg5F7AyL CKUaM4tagstUjX0EIvqSgzPaMkNzEzR9fQwEwvN7W4ODE9NScxqVgvOT93EyPQtwxAsIPx5sa AQ4ySHExKorwKPk8ihPiS8lMqMxKLM+KLSnNSiw8xanBwCGxeu/oCoxRLXn5eqpIE77aqpxFC gkWp6akVaZk5wOCDKZXg4FES4X0PkuYtLkjMLc5Mh0idYlSUEufdBJIQAElklObBtcEC/hKjr JQwLyPQUUI8BalFuZklqPKvGMU5GJWEebmB8SPEk5lXAjf9FdBiJqDFT+48BFlckoiQkmpgbH 3gGGa2Xo+nxscqxuyo9/LuC0+UFx14KGNYVhxouEcuMHZ/6sS/e88fPfPq2o3fT6ZeqS8Wc2a IubukfIMv1wd3MxGxYra2hxJ3F5aUsDzgz/xdGlCtxCfz2fJKRqWp+N+PWqzypannVyYsnp2/ hHWqvOrZe7uPuf5+fZX9SWyOEb8p+1EJJZbijERDLeai4kQAqsZod3MCAAA= X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-9.tower-21.messagelabs.com!1491434480!62301279!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.4.12; banners=-,-,- X-VirusChecked: Checked Received: (qmail 5968 invoked from network); 5 Apr 2017 23:21:20 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-9.tower-21.messagelabs.com with SMTP; 5 Apr 2017 23:21:20 -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 415D6344; Wed, 5 Apr 2017 16:21:20 -0700 (PDT) Received: from slackpad.lan (usa-sjc-mx-foss1.foss.arm.com [217.140.101.70]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 018D53F4FF; Wed, 5 Apr 2017 16:21:18 -0700 (PDT) From: Andre Przywara To: Stefano Stabellini , Julien Grall Date: Thu, 6 Apr 2017 00:19:20 +0100 Message-Id: <1491434362-30310-29-git-send-email-andre.przywara@arm.com> X-Mailer: git-send-email 2.8.2 In-Reply-To: <1491434362-30310-1-git-send-email-andre.przywara@arm.com> References: <1491434362-30310-1-git-send-email-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org, Shanker Donthineni , Vijay Kilari Subject: [Xen-devel] [PATCH v5 28/30] 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. This introduces a function to initialize a virtual ITS. We maintain a list of virtual ITSes, at the moment for the only purpose of later being able to free them again. We advertise 24 bits worth of LPIs on the guest side, using the full 32 bits seems to trigger a Linux bug (to be investigated). Signed-off-by: Andre Przywara --- xen/arch/arm/vgic-v3-its.c | 46 ++++++++++++++++++++++++++++++++++++++++ xen/arch/arm/vgic-v3.c | 17 +++++++++++++++ xen/include/asm-arm/domain.h | 2 ++ xen/include/asm-arm/gic_v3_its.h | 12 +++++++++++ 4 files changed, 77 insertions(+) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 9684b3a..4e66cad 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -42,6 +42,7 @@ */ struct virt_its { struct domain *d; + struct list_head vits_list; paddr_t doorbell_address; unsigned int devid_bits; unsigned int intid_bits; @@ -72,12 +73,20 @@ struct vits_itte void vgic_v3_its_init_domain(struct domain *d) { + INIT_LIST_HEAD(&d->arch.vgic.vits_list); spin_lock_init(&d->arch.vgic.its_devices_lock); d->arch.vgic.its_devices = RB_ROOT; } void vgic_v3_its_free_domain(struct domain *d) { + struct virt_its *pos, *temp; + + list_for_each_entry_safe( pos, temp, &d->arch.vgic.vits_list, vits_list ) + { + list_del(&pos->vits_list); + xfree(pos); + } ASSERT(RB_EMPTY_ROOT(&d->arch.vgic.its_devices)); } @@ -1157,6 +1166,43 @@ 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; /* 4K pages */ + its->baser_dev = GITS_BASER_TYPE_DEVICE << GITS_BASER_TYPE_SHIFT; + its->baser_dev |= (sizeof(uint64_t) - 1) << GITS_BASER_ENTRY_SIZE_SHIFT; + its->baser_dev |= base_attr; + its->baser_coll = GITS_BASER_TYPE_COLLECTION << GITS_BASER_TYPE_SHIFT; + its->baser_coll |= (sizeof(uint16_t) - 1) << GITS_BASER_ENTRY_SIZE_SHIFT; + its->baser_coll |= 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); + + /* Register the virtual ITSes to be able to clean them up later. */ + list_add_tail(&its->vits_list, &d->arch.vgic.vits_list); + + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/arch/arm/vgic-v3.c b/xen/arch/arm/vgic-v3.c index e6a33d0..3b01247 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 @@ -1569,6 +1570,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; @@ -1594,6 +1596,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 24 bits for the interrupt ID. + */ + vgic_v3_its_init_virtual(d, hw_its->addr, hw_its->devid_bits, 24); + + d->arch.vgic.has_its = true; + } + } else { diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index f993292..cbbfb99 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -115,6 +115,8 @@ 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 */ + struct list_head vits_list; /* List of virtual ITSes */ + 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 daae143..1b8e47c 100644 --- a/xen/include/asm-arm/gic_v3_its.h +++ b/xen/include/asm-arm/gic_v3_its.h @@ -161,6 +161,10 @@ int gicv3_its_setup_collection(unsigned int cpu); void vgic_v3_its_init_domain(struct domain *d); void vgic_v3_its_free_domain(struct domain *d); +/* Create and register a virtual ITS at the given guest address. */ +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. @@ -237,6 +241,14 @@ static inline void vgic_v3_its_free_domain(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