From patchwork Tue Mar 11 15:49:58 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 26034 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-vc0-f199.google.com (mail-vc0-f199.google.com [209.85.220.199]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 6318720068 for ; Tue, 11 Mar 2014 15:51:29 +0000 (UTC) Received: by mail-vc0-f199.google.com with SMTP id hu8sf21072075vcb.2 for ; Tue, 11 Mar 2014 08:51:29 -0700 (PDT) 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=F2K5ey4sb2dSJvqQQknnEIxkPGWMSQE/+YQp9CBZCrQ=; b=QbNH1NcoyehWzvZpfDgnhhlFF5Fpe8bqEF7JpjDOorlKcBaOBm7OpdVGkRoRSQTLZp m1tlQAdclGAG3C/gzSKXbz7y7jMsXecObpmmalBeWOW8GNdGvJk2E3PHwIYBp5lbnD10 jtIiNo3Do+DgZzw3jd19HN/jcy4vxtFE6k/c5ZH5rWRyj3V6QIoYleAeeN5InXtG9vB2 vtkaxLXGXjOuIdUN++tGiol/aEkasW5D1UmFeYcJ2gaAN/7lhatnq+x1S2Mo0GnZveVT 5et+FpLQFEn1/HD7MFlIyRKStZwkP9Il5Y7CYndUUwpQhsuQpaTrYRDlZTO6rlk8WEmB 4H4g== X-Gm-Message-State: ALoCoQk9Rlfgg2UDaLYZxz0FSu1QL/S1ZbzhjHuWb7usgidwW99lceNf9Jem+P8454yD1DkwlZY1 X-Received: by 10.58.85.3 with SMTP id d3mr6040238vez.40.1394553089006; Tue, 11 Mar 2014 08:51:29 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.107.7 with SMTP id g7ls1146675qgf.53.gmail; Tue, 11 Mar 2014 08:51:28 -0700 (PDT) X-Received: by 10.58.69.20 with SMTP id a20mr48897veu.63.1394553088563; Tue, 11 Mar 2014 08:51:28 -0700 (PDT) Received: from mail-ve0-f179.google.com (mail-ve0-f179.google.com [209.85.128.179]) by mx.google.com with ESMTPS id tt2si6556194vdc.22.2014.03.11.08.51.28 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Tue, 11 Mar 2014 08:51:28 -0700 (PDT) Received-SPF: neutral (google.com: 209.85.128.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.128.179; Received: by mail-ve0-f179.google.com with SMTP id db12so8624886veb.24 for ; Tue, 11 Mar 2014 08:51:28 -0700 (PDT) X-Received: by 10.52.240.207 with SMTP id wc15mr1180596vdc.14.1394553088466; Tue, 11 Mar 2014 08:51:28 -0700 (PDT) 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.78.9 with SMTP id i9csp215042vck; Tue, 11 Mar 2014 08:51:28 -0700 (PDT) X-Received: by 10.50.143.12 with SMTP id sa12mr24573884igb.45.1394553087195; Tue, 11 Mar 2014 08:51:27 -0700 (PDT) Received: from lists.xen.org (lists.xen.org. [50.57.142.19]) by mx.google.com with ESMTPS id cx6si42155525igc.35.2014.03.11.08.51.26 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 11 Mar 2014 08:51:27 -0700 (PDT) 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 1WNOwy-0007AC-Bi; Tue, 11 Mar 2014 15:50:40 +0000 Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1WNOww-00076q-82 for xen-devel@lists.xenproject.org; Tue, 11 Mar 2014 15:50:38 +0000 Received: from [85.158.143.35:49481] by server-3.bemta-4.messagelabs.com id FD/5C-13602-DC03F135; Tue, 11 Mar 2014 15:50:37 +0000 X-Env-Sender: julien.grall@linaro.org X-Msg-Ref: server-8.tower-21.messagelabs.com!1394553036!1274910!1 X-Originating-IP: [74.125.82.51] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 6.11.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 24841 invoked from network); 11 Mar 2014 15:50:36 -0000 Received: from mail-wg0-f51.google.com (HELO mail-wg0-f51.google.com) (74.125.82.51) by server-8.tower-21.messagelabs.com with RC4-SHA encrypted SMTP; 11 Mar 2014 15:50:36 -0000 Received: by mail-wg0-f51.google.com with SMTP id k14so7780271wgh.34 for ; Tue, 11 Mar 2014 08:50:36 -0700 (PDT) X-Received: by 10.180.149.206 with SMTP id uc14mr3662812wib.10.1394553036507; Tue, 11 Mar 2014 08:50:36 -0700 (PDT) Received: from belegaer.uk.xensource.com. ([185.25.64.249]) by mx.google.com with ESMTPSA id bm8sm62454537wjc.12.2014.03.11.08.50.35 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 11 Mar 2014 08:50:35 -0700 (PDT) From: Julien Grall To: xen-devel@lists.xenproject.org Date: Tue, 11 Mar 2014 15:49:58 +0000 Message-Id: <1394552999-14171-13-git-send-email-julien.grall@linaro.org> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1394552999-14171-1-git-send-email-julien.grall@linaro.org> References: <1394552999-14171-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 v3 12/13] 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.128.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 2438aa0..565784a 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 */ @@ -843,7 +881,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; @@ -874,7 +912,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; @@ -1027,6 +1065,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;