From patchwork Fri Jun 9 17:41:40 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9779021 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 8B351603B4 for ; Fri, 9 Jun 2017 17:44:11 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 772C1286E0 for ; Fri, 9 Jun 2017 17:44:11 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6B7B1286E2; Fri, 9 Jun 2017 17:44:11 +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 EF124286E7 for ; Fri, 9 Jun 2017 17:44:10 +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 1dJNvg-0004ro-GZ; Fri, 09 Jun 2017 17:42:36 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dJNvf-0004lv-0H for xen-devel@lists.xenproject.org; Fri, 09 Jun 2017 17:42:35 +0000 Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id 5F/8B-01735-A0EDA395; Fri, 09 Jun 2017 17:42:34 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrELMWRWlGSWpSXmKPExsVysyfVTZf9nlW kwdkfUhbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8a7uTMYC/6pVSy4b9nAuF22i5GLQ0hgM6PE iXcXWCCc5YwSvRNbWLsYOTnYBHQldtx8zQxiiwiESjxd8J0ZpIhZ4DqjxOkd89lAEsICQRL/V n8DK2IRUJX4++oKYxcjBwevgLXEnweyIGEJATmJhvP3wUo4gcLb9qwFaxUSsJJoOXSZfQIj9w JGhlWMGsWpRWWpRbpGxnpJRZnpGSW5iZk5uoYGpnq5qcXFiempOYlJxXrJ+bmbGIH+rWdgYNz BuKPd7xCjJAeTkijvtAKrSCG+pPyUyozE4oz4otKc1OJDjBocHAKb166+wCjFkpefl6okwfvq DlCdYFFqempFWmYOMABhSiU4eJREeF+cBErzFhck5hZnpkOkTjEqSonzbgTpEwBJZJTmwbXBg v4So6yUMC8jAwODEE9BalFuZgmq/CtGcQ5GJWFew7tAU3gy80rgpr8CWswEtHjJOwuQxSWJCC mpBkYXafa40qNir+PNHiv9WPRntsvubD6xMjav9fLJ1z9O3iSx+IeI2w4l1wvOsdrba4/qplz gXalkqM8laapaecpn0rfyZ/Ihb3btXG0c/6RnoW5Li83yI7EBrTfPM3e5HgrkLc969MguriSl pCKoz6qudreHt19X/6v7Pa3dz8qKoovXXWQ8r8RSnJFoqMVcVJwIAPEgt/d1AgAA X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-10.tower-206.messagelabs.com!1497030150!74254043!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.19; banners=-,-,- X-VirusChecked: Checked Received: (qmail 53918 invoked from network); 9 Jun 2017 17:42:31 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-10.tower-206.messagelabs.com with SMTP; 9 Jun 2017 17:42:31 -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 7CB2A1596; Fri, 9 Jun 2017 10:42:30 -0700 (PDT) Received: from e104803-lin.lan (unknown [10.1.207.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 327F63F578; Fri, 9 Jun 2017 10:42:29 -0700 (PDT) From: Andre Przywara To: Julien Grall , Stefano Stabellini Date: Fri, 9 Jun 2017 18:41:40 +0100 Message-Id: <20170609174141.5068-34-andre.przywara@arm.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170609174141.5068-1-andre.przywara@arm.com> References: <20170609174141.5068-1-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org, Vijaya Kumar K , Vijay Kilari , Shanker Donthineni , Manish Jaggi Subject: [Xen-devel] [PATCH v11 33/34] 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 configure the virtual ITSes to match the hardware ones, that is we keep the number of device ID bits and event ID bits the same as the host ITS. Signed-off-by: Andre Przywara Acked-by: Julien Grall --- xen/arch/arm/vgic-v3-its.c | 77 ++++++++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/domain.h | 1 + 2 files changed, 78 insertions(+) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 4eef37e..ddc00b7 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -52,6 +52,7 @@ */ struct virt_its { struct domain *d; + struct list_head vits_list; paddr_t doorbell_address; unsigned int devid_bits; unsigned int evid_bits; @@ -1455,6 +1456,46 @@ static const struct mmio_handler_ops vgic_its_mmio_handler = { .write = vgic_v3_its_mmio_write, }; +static int vgic_v3_its_init_virtual(struct domain *d, paddr_t guest_addr, + unsigned int devid_bits, + unsigned int evid_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(dev_table_entry_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(coll_table_entry_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->evid_bits = evid_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 ITS to be able to clean it up later. */ + list_add_tail(&its->vits_list, &d->arch.vgic.vits_list); + + return 0; +} + unsigned int vgic_v3_its_count(const struct domain *d) { struct host_its *hw_its; @@ -1470,16 +1511,52 @@ unsigned int vgic_v3_its_count(const struct domain *d) return ret; } +/* + * For a hardware domain, this will iterate over the host ITSes + * and map one virtual ITS per host ITS at the same address. + */ int vgic_v3_its_init_domain(struct domain *d) { + int ret; + + INIT_LIST_HEAD(&d->arch.vgic.vits_list); spin_lock_init(&d->arch.vgic.its_devices_lock); d->arch.vgic.its_devices = RB_ROOT; + if ( is_hardware_domain(d) ) + { + struct host_its *hw_its; + + 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 and event ID bits as the host. + */ + ret = vgic_v3_its_init_virtual(d, hw_its->addr, + hw_its->devid_bits, + hw_its->evid_bits); + if ( ret ) + return ret; + else + d->arch.vgic.has_its = true; + } + } + return 0; } 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)); } diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index b33f54a..8dfc1d1 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 */ + struct list_head vits_list; /* List of virtual ITSes */ unsigned int intid_bits; /* * TODO: if there are more bool's being added below, consider