From patchwork Wed Sep 7 06:56:16 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Edgar E. Iglesias" X-Patchwork-Id: 9318299 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 615B16077F for ; Wed, 7 Sep 2016 06:58:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 545AA2909C for ; Wed, 7 Sep 2016 06:58:31 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 498B12909E; Wed, 7 Sep 2016 06:58:31 +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=-1.7 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=no 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 BEC9E2909C for ; Wed, 7 Sep 2016 06:58:30 +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 1bhWmn-0000At-9H; Wed, 07 Sep 2016 06:56:41 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bhWmm-00009r-52 for xen-devel@lists.xen.org; Wed, 07 Sep 2016 06:56:40 +0000 Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id 5A/73-12460-72ABFC75; Wed, 07 Sep 2016 06:56:39 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrBIsWRWlGSWpSXmKPExsVyMfSOk67arvP hBgt+6los+biYxYHR4+ju30wBjFGsmXlJ+RUJrBmHft1mK7igWzHps3MD4zWFLkYuDiGBPkaJ nsaNLCAOi8BLFolpZ+YwdzFyckgI9LNK/LjnDmHHSKye1sQEYVdJ9B3uZgOxhQTUJU6/28EGM ekho8Tmvl2sIAk2AROJvX8egDWICEhLXPt8mRHEZhbwlbi58zhYXFggVOLymhYgmwNos6rEu7 mpICavgLvEhe9Qq+QkTh6bDDaRU8BDYub2l+wQa90l9nyayjyBUWABI8MqRvXi1KKy1CJdM72 kosz0jJLcxMwcXUMDU73c1OLixPTUnMSkYr3k/NxNjMCQYgCCHYxTG5wPMUpyMCmJ8m6ddD5c iC8pP6UyI7E4I76oNCe1+BCjDAeHkgTv9h1AOcGi1PTUirTMHGBww6QlOHiURHhng6R5iwsSc 4sz0yFSpxgtObb8vraWiWPZ5jtActvUe2uZhFjy8vNSpcR5z4A0CIA0ZJTmwY2DReAlRlkpYV 5GoAOFeApSi3IzS1DlXzGKczAqCfOuBpnCk5lXArf1FdBBTEAHrdt9GuSgkkSElFQDo0zjNqt bz15fvWYt7RptP6nu3ypB5j/ST9ilZyjEfmoRX5L+rUnR1OBwNe/SUKO6+zdY1odpdT6PXamg 4LxE7sfjhf6Vre3X3zc9+156rquDUXt35oYXTQ77RFrNwnKvtR+1DtcJuFq+ZIfovYc/j00W6 /1snqrwcuUPz8m50ftsj32ufBsyQYmlOCPRUIu5qDgRANVm6K27AgAA X-Env-Sender: edgar.iglesias@gmail.com X-Msg-Ref: server-16.tower-206.messagelabs.com!1473231397!42291522!1 X-Originating-IP: [209.85.220.66] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.84; banners=-,-,- X-VirusChecked: Checked Received: (qmail 20024 invoked from network); 7 Sep 2016 06:56:38 -0000 Received: from mail-pa0-f66.google.com (HELO mail-pa0-f66.google.com) (209.85.220.66) by server-16.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 7 Sep 2016 06:56:38 -0000 Received: by mail-pa0-f66.google.com with SMTP id h5so438823pao.0 for ; Tue, 06 Sep 2016 23:56:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DwD84l7NCOFZvO7FmL3quSse541LxHSqmESwp1mTDxg=; b=TioKauE6bYSF0Cxu5njAoAKWEdCLVabDUKQjFQlx7ivAUYVBks9SqmLl4HYoCLsXed sMGP4Pk6hlb2hw/iPw1GGTo93hXPDTLGBPGgtAVvk+kvUebOnjNS7PukzCey+8dynMVD Lxu9msmdnJ9Ac7kazXwkWnwTNyqhAsDAdd3w+TkyNTpZH3h8nB1eTl30s9Qlk5r9I+Jj L9rI7M3zzXqGjdR4lveaBsbOMfSVUXru31VyMmbesbiCqtaAiNXcPoXsihNaw2GaSqPH kluUQ0jphLZ/3SdIYgMYCuY9vQbt1F4FY+3EBg+n5DF7OmVcHXO337L7qt+i2Y58lxlj n0sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DwD84l7NCOFZvO7FmL3quSse541LxHSqmESwp1mTDxg=; b=GRIaj/yBBcOPuQSA8SVrgZPMKiCLIY0PZbwmesLaRAYfY46Iex7P0+5AIBampzgPlz yX4A/2O9tEGjTVUkU3KeWAFBtUo9v84nxVLiHL7KUTFIgXP46+0MExUHt1O8hW/4tqdc 8X2S7zKd8mBy0XGKC387K1y8c7i74G7FTBsYT59Cqk7cRBFwf2QrjzJltniy8nz2A2LZ 7RpJ4KV4irUbLv+bcpR4F/SXf8OuWSIL16Ps4HXv4XcfY1+CyQ4GfoMdm0R6i0NwbYCC A7r1XpeAtNliaYI5T5fkEZW45bTRRZSBe0MgZwAZyqYAl+UnhYvblljcw3AQrTnWgz7O BYEw== X-Gm-Message-State: AE9vXwPjrOHvPt1Cs5Hcul+GEgDCIZTTLOoOTwjOyuMIvLbVSUF7xghfEausselNFSBUmQ== X-Received: by 10.66.249.134 with SMTP id yu6mr17480216pac.44.1473231396745; Tue, 06 Sep 2016 23:56:36 -0700 (PDT) Received: from localhost ([40.140.7.61]) by smtp.gmail.com with ESMTPSA id xv9sm45832513pab.36.2016.09.06.23.56.36 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Tue, 06 Sep 2016 23:56:36 -0700 (PDT) From: "Edgar E. Iglesias" To: xen-devel@lists.xen.org Date: Wed, 7 Sep 2016 08:56:16 +0200 Message-Id: <1473231377-7800-6-git-send-email-edgar.iglesias@gmail.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1473231377-7800-1-git-send-email-edgar.iglesias@gmail.com> References: <1473231377-7800-1-git-send-email-edgar.iglesias@gmail.com> Cc: edgar.iglesias@xilinx.com, julien.grall@arm.com, sstabellini@kernel.org Subject: [Xen-devel] [PATCH v3 5/6] xen/arm: domain_build: Plumb for different mapping attributes 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 From: "Edgar E. Iglesias" Add plumbing for passing around mapping attributes. This is in preparation to allow us to differentiate the attributes for specific device nodes. We still use the same DEVICE mappings for all nodes so this patch has no functional change. Signed-off-by: Edgar E. Iglesias Acked-by: Julien Grall --- xen/arch/arm/domain_build.c | 42 +++++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index f022342..bbe4895 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -42,6 +42,12 @@ static void __init parse_dom0_mem(const char *s) } custom_param("dom0_mem", parse_dom0_mem); +struct map_range_data +{ + struct domain *d; + p2m_type_t p2mt; +}; + //#define DEBUG_11_ALLOCATION #ifdef DEBUG_11_ALLOCATION # define D11PRINT(fmt, args...) printk(XENLOG_DEBUG fmt, ##args) @@ -974,7 +980,8 @@ static int map_range_to_domain(const struct dt_device_node *dev, u64 addr, u64 len, void *data) { - struct domain *d = data; + struct map_range_data *mr_data = data; + struct domain *d = mr_data->d; bool_t need_mapping = !dt_device_for_passthrough(dev); int res; @@ -991,10 +998,12 @@ static int map_range_to_domain(const struct dt_device_node *dev, if ( need_mapping ) { - res = map_mmio_regions(d, + res = map_regions_p2mt(d, _gfn(paddr_to_pfn(addr)), DIV_ROUND_UP(len, PAGE_SIZE), - _mfn(paddr_to_pfn(addr))); + _mfn(paddr_to_pfn(addr)), + mr_data->p2mt); + if ( res < 0 ) { printk(XENLOG_ERR "Unable to map 0x%"PRIx64 @@ -1005,7 +1014,8 @@ static int map_range_to_domain(const struct dt_device_node *dev, } } - dt_dprintk(" - MMIO: %010"PRIx64" - %010"PRIx64"\n", addr, addr + len); + dt_dprintk(" - MMIO: %010"PRIx64" - %010"PRIx64" P2MType=%x\n", + addr, addr + len, mr_data->p2mt); return 0; } @@ -1016,8 +1026,10 @@ static int map_range_to_domain(const struct dt_device_node *dev, * the child resources available to domain 0. */ static int map_device_children(struct domain *d, - const struct dt_device_node *dev) + const struct dt_device_node *dev, + p2m_type_t p2mt) { + struct map_range_data mr_data = { .d = d, .p2mt = p2mt }; int ret; if ( dt_device_type_is_equal(dev, "pci") ) @@ -1029,7 +1041,7 @@ static int map_device_children(struct domain *d, if ( ret < 0 ) return ret; - ret = dt_for_each_range(dev, &map_range_to_domain, d); + ret = dt_for_each_range(dev, &map_range_to_domain, &mr_data); if ( ret < 0 ) return ret; } @@ -1045,7 +1057,8 @@ static int map_device_children(struct domain *d, * - Assign the device to the guest if it's protected by an IOMMU * - Map the IRQs and iomem regions to DOM0 */ -static int handle_device(struct domain *d, struct dt_device_node *dev) +static int handle_device(struct domain *d, struct dt_device_node *dev, + p2m_type_t p2mt) { unsigned int nirq; unsigned int naddr; @@ -1111,6 +1124,7 @@ static int handle_device(struct domain *d, struct dt_device_node *dev) /* Give permission and map MMIOs */ for ( i = 0; i < naddr; i++ ) { + struct map_range_data mr_data = { .d = d, .p2mt = p2mt }; res = dt_device_get_address(dev, i, &addr, &size); if ( res ) { @@ -1119,12 +1133,12 @@ static int handle_device(struct domain *d, struct dt_device_node *dev) return res; } - res = map_range_to_domain(dev, addr, size, d); + res = map_range_to_domain(dev, addr, size, &mr_data); if ( res ) return res; } - res = map_device_children(d, dev); + res = map_device_children(d, dev, p2mt); if ( res ) return res; @@ -1132,7 +1146,8 @@ static int handle_device(struct domain *d, struct dt_device_node *dev) } static int handle_node(struct domain *d, struct kernel_info *kinfo, - struct dt_device_node *node) + struct dt_device_node *node, + p2m_type_t p2mt) { static const struct dt_device_match skip_matches[] __initconst = { @@ -1219,7 +1234,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, "WARNING: Path %s is reserved, skip the node as we may re-use the path.\n", path); - res = handle_device(d, node); + res = handle_device(d, node, p2mt); if ( res) return res; @@ -1241,7 +1256,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, for ( child = node->child; child != NULL; child = child->sibling ) { - res = handle_node(d, kinfo, child); + res = handle_node(d, kinfo, child, p2mt); if ( res ) return res; } @@ -1273,6 +1288,7 @@ static int handle_node(struct domain *d, struct kernel_info *kinfo, static int prepare_dtb(struct domain *d, struct kernel_info *kinfo) { + const p2m_type_t default_p2mt = p2m_mmio_direct_nc; const void *fdt; int new_size; int ret; @@ -1292,7 +1308,7 @@ static int prepare_dtb(struct domain *d, struct kernel_info *kinfo) fdt_finish_reservemap(kinfo->fdt); - ret = handle_node(d, kinfo, dt_host); + ret = handle_node(d, kinfo, dt_host, default_p2mt); if ( ret ) goto err;