From patchwork Thu Mar 16 11:20:22 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andre Przywara X-Patchwork-Id: 9627957 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 A7DF66048C for ; Thu, 16 Mar 2017 11:20:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9BB18285B5 for ; Thu, 16 Mar 2017 11:20:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9091828643; Thu, 16 Mar 2017 11:20:58 +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 0FE9F285B5 for ; Thu, 16 Mar 2017 11:20:58 +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 1coTR6-00088w-Ja; Thu, 16 Mar 2017 11:19:16 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coTR5-000868-EW for xen-devel@lists.xenproject.org; Thu, 16 Mar 2017 11:19:15 +0000 Received: from [85.158.143.35] by server-1.bemta-6.messagelabs.com id AD/4E-27678-2B47AC85; Thu, 16 Mar 2017 11:19:14 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrKLMWRWlGSWpSXmKPExsVysyfVTXdTyak Ig7Z3TBbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8bOtecZC35IVCw+fZapgfGjUBcjJ4eQwGZG ifaf/l2MXED2ckaJLc1LmEASbAK6EjtuvmYGsUUEQiXm/HwEZjMLVEpc/LCfDcQWFrCQ+PH2I JjNIqAqsXXhZ7BeXgEbie8//oHFJQTkJBrO3wfr5QSKd5zcwwax2Fri89HP7BMYuRcwMqxiVC 9OLSpLLdI11ksqykzPKMlNzMzRNTQw08tNLS5OTE/NSUwq1kvOz93ECPQuAxDsYOz453SIUZK DSUmUt/zHiQghvqT8lMqMxOKM+KLSnNTiQ4wyHBxKErxPFU5GCAkWpaanVqRl5gDDDCYtwcGj JMJ7BCTNW1yQmFucmQ6ROsWoKCXOexIkIQCSyCjNg2uDhfYlRlkpYV5GoEOEeApSi3IzS1DlX zGKczAqCfNeBZnCk5lXAjf9FdBiJqDFbz+cAFlckoiQkmpg3Phr+5m1QYtc6zQq7rQGT01jCr mQHHshu61Y8tLmqcqpoh4vS3+2/VLnnDhFc7rp34zfkQsVN/2Y0D/70ubZRiJbLu0w/93pssF IUHHa5eIZ76a+2nzwwp6Y70asD9zms/96J/zte8f/w4uP+HGY2Nxft8/AwXWHjOFXqXXLc2fq +pxoTv30JF+JpTgj0VCLuag4EQA7n3/LaAIAAA== X-Env-Sender: andre.przywara@arm.com X-Msg-Ref: server-2.tower-21.messagelabs.com!1489663153!48694569!1 X-Originating-IP: [217.140.101.70] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 8028 invoked from network); 16 Mar 2017 11:19:13 -0000 Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by server-2.tower-21.messagelabs.com with SMTP; 16 Mar 2017 11:19:13 -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 57F8F152D; Thu, 16 Mar 2017 04:19:13 -0700 (PDT) Received: from e104803-lin.lan (unknown [10.1.207.46]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 527173F5C9; Thu, 16 Mar 2017 04:19:12 -0700 (PDT) From: Andre Przywara To: Stefano Stabellini , Julien Grall Date: Thu, 16 Mar 2017 11:20:22 +0000 Message-Id: <20170316112030.20419-20-andre.przywara@arm.com> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20170316112030.20419-1-andre.przywara@arm.com> References: <20170316112030.20419-1-andre.przywara@arm.com> Cc: xen-devel@lists.xenproject.org, Shanker Donthineni , Vijay Kilari Subject: [Xen-devel] [PATCH v2 19/27] ARM: vITS: handle MAPD command 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 The MAPD command maps a device by associating a memory region for storing ITEs with a certain device ID. We store the given guest physical address in the device table, and, if this command comes from Dom0, tell the host ITS driver about this new mapping, so it can issue the corresponing host MAPD command and create the required tables. We don't map the device tables permanently, as their alignment requirement is only 256 Bytes, thus making mapping of several tables complicated. Instead we map the device tables on demand when we need them later. Signed-off-by: Andre Przywara --- xen/arch/arm/vgic-v3-its.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 175a213..c26d5d4 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -38,6 +38,7 @@ /* Data structure to describe a virtual ITS */ struct virt_its { struct domain *d; + paddr_t doorbell_address; spinlock_t vcmd_lock; /* protects the virtual command buffer */ uint64_t cbaser; uint64_t *cmdbuf; @@ -291,6 +292,46 @@ static int its_handle_mapc(struct virt_its *its, uint64_t *cmdptr) return ret; } +static int its_handle_mapd(struct virt_its *its, uint64_t *cmdptr) +{ + uint32_t devid = its_cmd_get_deviceid(cmdptr); + int size = its_cmd_get_size(cmdptr); + bool valid = its_cmd_get_validbit(cmdptr); + paddr_t itt_addr = its_cmd_mask_field(cmdptr, 2, 0, 52) & GENMASK(51, 8); + int ret; + + if ( !its->dev_table ) + return -1; + + /* + * There is no easy and clean way for Xen to know the ITS device ID of a + * particular (PCI) device, so we have to rely on the guest telling + * us about it. For *now* we are just using the device ID *Dom0* uses, + * because the driver there has the actual knowledge. + * Eventually this will be replaced with a dedicated hypercall to + * announce pass-through of devices. + */ + if ( is_hardware_domain(its->d) ) + { + /* Dom0's ITSes are mapped 1:1, so both address are the same. */ + ret = gicv3_its_map_guest_device(its->d, its->doorbell_address, devid, + its->doorbell_address, devid, + BIT(size + 1), valid); + if ( ret ) + return ret; + } + + spin_lock(&its->its_lock); + if ( valid ) + its->dev_table[devid] = DEV_TABLE_ENTRY(itt_addr, size + 1); + else + its->dev_table[devid] = 0; + + spin_unlock(&its->its_lock); + + return 0; +} + #define ITS_CMD_BUFFER_SIZE(baser) ((((baser) & 0xff) + 1) << 12) static int vgic_its_handle_cmds(struct domain *d, struct virt_its *its, @@ -320,6 +361,9 @@ static int vgic_its_handle_cmds(struct domain *d, struct virt_its *its, case GITS_CMD_MAPC: its_handle_mapc(its, cmdptr); break; + case GITS_CMD_MAPD: + its_handle_mapd(its, cmdptr); + break; case GITS_CMD_SYNC: /* We handle ITS commands synchronously, so we ignore SYNC. */ break;