From patchwork Sun Feb 23 22:16:31 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 25152 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-oa0-f69.google.com (mail-oa0-f69.google.com [209.85.219.69]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 6329520972 for ; Sun, 23 Feb 2014 22:18:16 +0000 (UTC) Received: by mail-oa0-f69.google.com with SMTP id i7sf16785480oag.0 for ; Sun, 23 Feb 2014 14:18:15 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:cc:subject:precedence:list-id:list-unsubscribe:list-post :list-help:list-subscribe:mime-version:sender:errors-to :x-original-sender:x-original-authentication-results:mailing-list :list-archive:content-type:content-transfer-encoding; bh=AwnWDNxbfzr8KXBu/jRzLI0YR+2qnAzuJPTMpVnVwrI=; b=FPi3VtuSdkvQbD9CUIWkkSuHkHqD3RRoQUO+Je5gMqa1c+yYXazCkgSqKK3pHydMPh L0Z89LzUhcQKntVeTRvEwRb7zouVfHUDKKnXbFcZQToIqB2y8EPynJnXyvHjTaHjSAf9 UrwJb4l/bLwF2KSbUd089nT3M/krEi33j1Q1X3FB0TMzUWBz1Fg3CgVNeP0Cu4lpBxQy 91C5mcazI4Pu/kOMHO8yM725EkxUmjsRwnU+IvtQ7RAMLkxC3hpO6bHNoT0D0NDFgS1j SkCj+MVWpeOCo0RPCMYs6vWX4Tv4Qi8U1GLH73j06+bUW7sRaR+mLcONqSucATbh7m9g GbSQ== X-Gm-Message-State: ALoCoQkilYKa1WpVVBcBnbGgcs03HhKs2fCyskFBDXyoWwUtCUmMxFGu42KtOhrcDzktYEU94Oz9 X-Received: by 10.43.96.73 with SMTP id cf9mr8077097icc.22.1393193895901; Sun, 23 Feb 2014 14:18:15 -0800 (PST) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.50.1 with SMTP id r1ls1781142qga.24.gmail; Sun, 23 Feb 2014 14:18:15 -0800 (PST) X-Received: by 10.221.39.138 with SMTP id tm10mr10744305vcb.7.1393193895773; Sun, 23 Feb 2014 14:18:15 -0800 (PST) Received: from mail-vc0-f179.google.com (mail-vc0-f179.google.com [209.85.220.179]) by mx.google.com with ESMTPS id w14si5305621vco.78.2014.02.23.14.18.15 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 23 Feb 2014 14:18:15 -0800 (PST) Received-SPF: neutral (google.com: 209.85.220.179 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) client-ip=209.85.220.179; Received: by mail-vc0-f179.google.com with SMTP id lh14so5112281vcb.38 for ; Sun, 23 Feb 2014 14:18:15 -0800 (PST) X-Received: by 10.52.246.227 with SMTP id xz3mr9011791vdc.95.1393193895695; Sun, 23 Feb 2014 14:18:15 -0800 (PST) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.220.174.196 with SMTP id u4csp20478vcz; Sun, 23 Feb 2014 14:18:15 -0800 (PST) X-Received: by 10.52.116.171 with SMTP id jx11mr3025302vdb.88.1393193895215; Sun, 23 Feb 2014 14:18:15 -0800 (PST) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id wt4si5310486vcb.40.2014.02.23.14.18.14 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 23 Feb 2014 14:18:15 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xen.org designates 50.57.142.19 as permitted sender) client-ip=50.57.142.19; Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WHhM7-00077e-MD; Sun, 23 Feb 2014 22:17:03 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WHhM4-00072j-6a for xen-devel@lists.xenproject.org; Sun, 23 Feb 2014 22:17:00 +0000 Received: from [85.158.137.68:55375] by server-5.bemta-3.messagelabs.com id 43/27-04712-B537A035; Sun, 23 Feb 2014 22:16:59 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-13.tower-31.messagelabs.com!1393193818!2418437!1 X-Originating-IP: [74.125.83.53] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.9.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 5867 invoked from network); 23 Feb 2014 22:16:58 -0000 Received: from mail-ee0-f53.google.com (HELO mail-ee0-f53.google.com) (74.125.83.53) by server-13.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 23 Feb 2014 22:16:58 -0000 Received: by mail-ee0-f53.google.com with SMTP id t10so2771408eei.40 for ; Sun, 23 Feb 2014 14:16:58 -0800 (PST) X-Received: by 10.14.205.3 with SMTP id i3mr20714289eeo.23.1393193818307; Sun, 23 Feb 2014 14:16:58 -0800 (PST) Received: from belegaer.uk.xensource.com. ([185.25.64.249]) by mx.google.com with ESMTPSA id g1sm55994749eet.6.2014.02.23.14.16.57 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Feb 2014 14:16:57 -0800 (PST) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Sun, 23 Feb 2014 22:16:31 +0000 Message-Id: <1393193792-20008-15-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1393193792-20008-1-git-send-email-julien.grall@linaro.org> References: <1393193792-20008-1-git-send-email-julien.grall@linaro.org> Cc: stefano.stabellini@citrix.com, Julien Grall , tim@xen.org, ian.campbell@citrix.com Subject: [Xen-devel] [PATCH v2 14/15] xen/arm: Add the property "protected-devices" in the hypervisor node X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: julien.grall@linaro.org X-Original-Authentication-Results: mx.google.com; spf=neutral (google.com: 209.85.220.179 is neither permitted nor denied by best guess record for domain of patch+caf_=patchwork-forward=linaro.org@linaro.org) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Archive: DOM0 is using the swiotlb to bounce DMA. With the IOMMU support in Xen, protected devices should not use it. Only Xen is abled to know if an IOMMU protects the device. The new property "protected-devices" is a list of device phandles protected by an IOMMU. Signed-off-by: Julien Grall --- This patch *MUST NOT* be applied until we agreed on a device binding the device tree folks. DOM0 can run safely with swiotlb on protected devices while LVM is not used for guest disk. Changes in v2: - Patch added --- xen/arch/arm/domain_build.c | 51 ++++++++++++++++++++++++++++++++++++++----- xen/arch/arm/kernel.h | 3 +++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 9cbdd61..ca7dade 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -324,19 +324,22 @@ static int make_memory_node(const struct domain *d, return res; } -static int make_hypervisor_node(struct domain *d, - void *fdt, const struct dt_device_node *parent) +static int make_hypervisor_node(struct domain *d, struct kernel_info *kinfo, + const struct dt_device_node *parent) { const char compat[] = "xen,xen-"__stringify(XEN_VERSION)"."__stringify(XEN_SUBVERSION)"\0" "xen,xen"; __be32 reg[4]; gic_interrupt_t intr; - __be32 *cells; + __be32 *cells, *_cells; int res; int addrcells = dt_n_addr_cells(parent); int sizecells = dt_n_size_cells(parent); paddr_t gnttab_start, gnttab_size; + const struct dt_device_node *dev; + struct hvm_iommu *hd = domain_hvm_iommu(d); + void *fdt = kinfo->fdt; DPRINT("Create hypervisor node\n"); @@ -384,6 +387,39 @@ static int make_hypervisor_node(struct domain *d, if ( res ) return res; + if ( kinfo->num_dev_protected ) + { + /* Don't need to take dtdevs_lock here */ + cells = xmalloc_array(__be32, kinfo->num_dev_protected * + dt_size_to_cells(sizeof(dt_phandle))); + if ( !cells ) + return -FDT_ERR_XEN(ENOMEM); + + _cells = cells; + + DPRINT(" List of protected devices\n"); + list_for_each_entry( dev, &hd->dt_devices, next_assigned ) + { + DPRINT(" - %s\n", dt_node_full_name(dev)); + if ( !dev->phandle ) + { + printk(XENLOG_ERR "Unable to handle protected device (%s)" + "with no phandle", dt_node_full_name(dev)); + xfree(cells); + return -FDT_ERR_XEN(EINVAL); + } + dt_set_cell(&_cells, dt_size_to_cells(sizeof(dt_phandle)), + dev->phandle); + } + + res = fdt_property(fdt, "protected-devices", cells, + sizeof (dt_phandle) * kinfo->num_dev_protected); + + xfree(cells); + if ( res ) + return res; + } + res = fdt_end_node(fdt); return res; @@ -670,7 +706,8 @@ static int make_timer_node(const struct domain *d, void *fdt, } /* Map the device in the domain */ -static int map_device(struct domain *d, struct dt_device_node *dev) +static int map_device(struct domain *d, struct kernel_info *kinfo, + struct dt_device_node *dev) { unsigned int nirq; unsigned int naddr; @@ -695,6 +732,7 @@ static int map_device(struct domain *d, struct dt_device_node *dev) dt_node_full_name(dev)); return res; } + kinfo->num_dev_protected++; } /* Map IRQs */ @@ -844,7 +882,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, if ( !dt_device_type_is_equal(node, "memory") && dt_device_is_available(node) ) { - res = map_device(d, node); + res = map_device(d, kinfo, node); if ( res ) return res; @@ -875,7 +913,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, if ( node == dt_host ) { - res = make_hypervisor_node(d, kinfo->fdt, node); + res = make_hypervisor_node(d, kinfo, node); if ( res ) return res; @@ -1028,6 +1066,7 @@ int construct_dom0(struct domain *d) d->max_pages = ~0U; + kinfo.num_dev_protected = 0; kinfo.unassigned_mem = dom0_mem; allocate_memory(d, &kinfo); diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h index b48c2c9..3af5c50 100644 --- a/xen/arch/arm/kernel.h +++ b/xen/arch/arm/kernel.h @@ -18,6 +18,9 @@ struct kernel_info { paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */ struct dt_mem_info mem; + /* Number of devices protected by an IOMMU */ + unsigned int num_dev_protected; + paddr_t dtb_paddr; paddr_t entry;