From patchwork Tue Dec 19 03:17:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sameer Goel X-Patchwork-Id: 122337 Delivered-To: patch@linaro.org Received: by 10.140.22.227 with SMTP id 90csp3622178qgn; Mon, 18 Dec 2017 19:20:00 -0800 (PST) X-Google-Smtp-Source: ACJfBotiFEUGK9HjIkiP7bQJn26wglCJD6iy+3u+R2JGs9X9ace/mvQ0Qk+2zGp6lJ8J66AKITcc X-Received: by 10.36.105.66 with SMTP id e63mr1677574itc.46.1513653600521; Mon, 18 Dec 2017 19:20:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513653600; cv=none; d=google.com; s=arc-20160816; b=raVBnvgqYCQbIz5+fGi4S3dXfg/BB+X8PprtmfBEiLgoucZJ9dW+T2sysDMbuMHt9K HHvygStjaWY+5eNTnyr9RCjAKizk9SA2JYg5uuIOJmHGu3bBr1C6M0XR74F5/uG2621I u5XbC9Wo5UxVZqR7oyt2JpCneYm0YQ00i53qZEoSaWvF4cbvzzidiZvCrtNcrrweggkY IQ7EeDJxMkgmugCVY0/blgapV/Xv/VAO240b8E5mr+2N5hq87wr9wEdGpM1norzH0ZG+ ZWS1+hw1J7nH/MCvQslg+Sj7UVOEvuTrZxN1Lrrb42TQYhjy3Kmgu1s0yDVg9P3RFRT1 6mXw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:list-subscribe:list-help :list-post:list-unsubscribe:list-id:precedence:subject:cc :mime-version:references:in-reply-to:message-id:date:to:from :dkim-signature:arc-authentication-results; bh=2DhSep9TsclxVKQ7ozwXbyvgKB4teif86p74n2aciMs=; b=xPY9UUTQZhHkhBXuOABdJvnJa0zCKCTyMqSXEqKN5fCzT5uQrLZbHgkPnVXpz3yCPk GXX1haFupngYf17QmBmBeMA5gyNxr2kQe7YwdKDn27fvt7x4Z02gsUNiG5VuEgme2Xzw pe3zsBXmswlXM88XwvA+A0SxArdu9dlAIA/Ki8ga/1yxIAQxdUHWaCtiF3K2Yz0XfWwy 8xaKdUKtAPVGwxEf6qWf81kbC6jEAdLoaSrEizkCLpR0TQLt+615/37s9gcoaOfd133g 1ZyKMIRhn7JIYBgNvPQ7ZC5BM4sB6TxGume5zK73E6NWHOoq7pobJoc4QjSAEyGDF9Wb f2tA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=Y+eBQP6q; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id p144si566699itc.61.2017.12.18.19.20.00 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Dec 2017 19:20:00 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=Y+eBQP6q; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eR8PJ-0006gk-Li; Tue, 19 Dec 2017 03:17:29 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eR8PI-0006eU-Gv for xen-devel@lists.xenproject.org; Tue, 19 Dec 2017 03:17:28 +0000 X-Inumbo-ID: 0a16f574-e46b-11e7-b4a6-bc764e045a96 Received: from mail-pl0-x242.google.com (unknown [2607:f8b0:400e:c01::242]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 0a16f574-e46b-11e7-b4a6-bc764e045a96; Tue, 19 Dec 2017 04:16:44 +0100 (CET) Received: by mail-pl0-x242.google.com with SMTP id o2so6148042plk.12 for ; Mon, 18 Dec 2017 19:17:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=niexPLJJnQSql5UlPx3mSBBjeI2LkmM27i6wET6s94E=; b=Y+eBQP6qVWcy5/Bzfe3QTIhgiR3S0Ryn1poAWA6JyvxkUju8/nGNRHsykzGUHPdL7y KLcd7qNPDU4hrLugXsAPAgD6c9wBBIXjQcKKXMvfrJDdA0DCBmK+f9rzC64RWuvkfmQ3 lG4pa59W2VjxVisP92Pw9ni6juC15hqSG2AJY= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=niexPLJJnQSql5UlPx3mSBBjeI2LkmM27i6wET6s94E=; b=QOVDUYQlyshgUTYFiMIOqsxuuV6vMHNwWM2OkejDzK65K9XYtuInna6U8MeLU7Xf+1 eSRoCyYY6GG7nJPsKAi19IyNeoPxH0r0ib8r/DQ28jo4U9I1BVh56VW8ELMOvb2yoUCs ng5/eCD3+iAo2Mln7P0ILcluvt7ZEFP1Fw2lex5jX+4YOrPS0k05NvfkFib9K/tWJso9 ayQ+OeP8T2CM/joP8w/lteZr43VpS9JXONBlRqdIrqHCrJ3kqZGRBp5vW6SGiPtGFFND WrSepHei6mv45u1lTX1zreRK54fg16Pv+dCOVTahOzbr7naz2rAiuqNNVsJFpDlX03A4 NHDw== X-Gm-Message-State: AKGB3mKBuFNHL//JPoz7AXBgwJucyayxb1CJbf29hyGK6s+20Wqe0n5k k4GiYGI00uoM//ZScbAhsadvDvwNByQ= X-Received: by 10.159.252.10 with SMTP id n10mr1744401pls.90.1513653445657; Mon, 18 Dec 2017 19:17:25 -0800 (PST) Received: from sameer-ubuntu-book.qualcomm.com (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id 84sm28289917pfp.180.2017.12.18.19.17.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 18 Dec 2017 19:17:25 -0800 (PST) From: Sameer Goel To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Date: Mon, 18 Dec 2017 20:17:03 -0700 Message-Id: <20171219031703.23420-9-sameer.goel@linaro.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20171219031703.23420-1-sameer.goel@linaro.org> References: <20171219031703.23420-1-sameer.goel@linaro.org> MIME-Version: 1.0 Cc: sstabellini@kernel.org, shankerd@codeaurora.org, andre.przywara@linaro.org, Sameer Goel Subject: [Xen-devel] [RFC v4 8/8] drivers/passthrough/arm: Refactor code for arm smmu drivers X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Pull common defines for SMMU drivers in a local header. Signed-off-by: Sameer Goel --- xen/drivers/passthrough/arm/arm_smmu.h | 113 +++++++++++++++++++++++++++++++++ xen/drivers/passthrough/arm/smmu-v3.c | 96 ++-------------------------- xen/drivers/passthrough/arm/smmu.c | 104 +----------------------------- 3 files changed, 121 insertions(+), 192 deletions(-) create mode 100644 xen/drivers/passthrough/arm/arm_smmu.h diff --git a/xen/drivers/passthrough/arm/arm_smmu.h b/xen/drivers/passthrough/arm/arm_smmu.h new file mode 100644 index 0000000000..70f97e7d50 --- /dev/null +++ b/xen/drivers/passthrough/arm/arm_smmu.h @@ -0,0 +1,113 @@ +/****************************************************************************** + * arm_smmu.h + * + * Common compatibility defines and data_structures for porting arm smmu + * drivers from Linux. + * + * Copyright (c) 2017 Linaro Limited + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; If not, see . + */ + +#ifndef __ARM_SMMU_H__ +#define __ARM_SMMU_H__ + +/* Helpers to get device MMIO and IRQs */ +struct resource { + u64 addr; + u64 size; + unsigned int type; +}; + +#define resource_size(res) ((res)->size) + +#define platform_device device + +#define IORESOURCE_MEM 0 +#define IORESOURCE_IRQ 1 + +/* Stub out DMA domain related functions */ +#define iommu_get_dma_cookie(dom) 0 +#define iommu_put_dma_cookie(dom) + +#define VA_BITS 0 /* Only used for configuring stage-1 input size */ + +#define MODULE_DEVICE_TABLE(type, name) +#define module_param_named(name, value, type, perm) +#define MODULE_PARM_DESC(_parm, desc) + +static void __iomem *devm_ioremap_resource(struct device *dev, + struct resource *res) +{ + void __iomem *ptr; + + if ( !res || res->type != IORESOURCE_MEM ) + { + dev_err(dev, "Invalid resource\n"); + return ERR_PTR(-EINVAL); + } + + ptr = ioremap_nocache(res->addr, res->size); + if ( !ptr ) + { + dev_err(dev, + "ioremap failed (addr 0x%"PRIx64" size 0x%"PRIx64")\n", + res->addr, res->size); + return ERR_PTR(-ENOMEM); + } + + return ptr; +} + +/* + * Domain type definitions. Not really needed for Xen, defining to port + * Linux code as-is + */ +#define IOMMU_DOMAIN_UNMANAGED 0 +#define IOMMU_DOMAIN_DMA 1 +#define IOMMU_DOMAIN_IDENTITY 2 + +/* Xen: Compatibility define for iommu_domain_geometry.*/ +struct iommu_domain_geometry { + dma_addr_t aperture_start; /* First address that can be mapped */ + dma_addr_t aperture_end; /* Last address that can be mapped */ + bool force_aperture; /* DMA only allowed in mappable range? */ +}; + +/* Xen: Dummy iommu_domain */ +struct iommu_domain { + /* Runtime SMMU configuration for this iommu_domain */ + struct arm_smmu_domain *priv; + unsigned int type; + + /* Dummy compatibility defines */ + unsigned long pgsize_bitmap; + struct iommu_domain_geometry geometry; + + atomic_t ref; + /* Used to link iommu_domain contexts for a same domain. + * There is at least one per-SMMU to used by the domain. + */ + struct list_head list; +}; + +/* Xen: Describes information required for a Xen domain */ +struct arm_smmu_xen_domain { + spinlock_t lock; + /* List of iommu domains associated to this domain */ + struct list_head contexts; +}; + +#endif /* __ARM_SMMU_H__ */ + diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/passthrough/arm/smmu-v3.c index 3488184ad4..6e705f63a3 100644 --- a/xen/drivers/passthrough/arm/smmu-v3.c +++ b/xen/drivers/passthrough/arm/smmu-v3.c @@ -49,20 +49,7 @@ #include #include - -/* Xen: Helpers to get device MMIO and IRQs */ -struct resource { - u64 addr; - u64 size; - unsigned int type; -}; - -#define resource_size(res) ((res)->size) - -#define platform_device device - -#define IORESOURCE_MEM 0 -#define IORESOURCE_IRQ 1 +#include "arm_smmu.h" /* Not a self contained header. So last in the list */ static struct resource *platform_get_resource(struct platform_device *pdev, unsigned int type, @@ -192,81 +179,10 @@ void dmam_free_coherent(struct device *dev, size_t size, void *vaddr, xfree(vaddr); } -/* Xen: Stub out DMA domain related functions */ -#define iommu_get_dma_cookie(dom) 0 -#define iommu_put_dma_cookie(dom) - -/* Xen: Stub out module param related function */ -#define module_param_named(a, b, c, d) -#define MODULE_PARM_DESC(a, b) - #define dma_set_mask_and_coherent(d, b) 0 #define of_dma_is_coherent(n) 0 -#define MODULE_DEVICE_TABLE(type, name) -#define of_device_id dt_device_match - -static void __iomem *devm_ioremap_resource(struct device *dev, - struct resource *res) -{ - void __iomem *ptr; - - if (!res || res->type != IORESOURCE_MEM) { - dev_err(dev, "Invalid resource\n"); - return ERR_PTR(-EINVAL); - } - - ptr = ioremap_nocache(res->addr, res->size); - if (!ptr) { - dev_err(dev, - "ioremap failed (addr 0x%"PRIx64" size 0x%"PRIx64")\n", - res->addr, res->size); - return ERR_PTR(-ENOMEM); - } - - return ptr; -} - -/* Xen: Compatibility define for iommu_domain_geometry.*/ -struct iommu_domain_geometry { - dma_addr_t aperture_start; /* First address that can be mapped */ - dma_addr_t aperture_end; /* Last address that can be mapped */ - bool force_aperture; /* DMA only allowed in mappable range? */ -}; - - -/* Xen: Type definitions for iommu_domain */ -#define IOMMU_DOMAIN_UNMANAGED 0 -#define IOMMU_DOMAIN_DMA 1 -#define IOMMU_DOMAIN_IDENTITY 2 - -/* Xen: Dummy iommu_domain */ -struct iommu_domain { - /* Runtime SMMU configuration for this iommu_domain */ - struct arm_smmu_domain *priv; - unsigned int type; - - /* Dummy compatibility defines */ - unsigned long pgsize_bitmap; - struct iommu_domain_geometry geometry; - - atomic_t ref; - /* - * Used to link iommu_domain contexts for a same domain. - * There is at least one per-SMMU to used by the domain. - */ - struct list_head list; -}; - - -/* Xen: Describes information required for a Xen domain */ -struct arm_smmu_xen_domain { - spinlock_t lock; - /* List of iommu domains associated to this domain */ - struct list_head iommu_domains; -}; - /* * Xen: Information about each device stored in dev->archdata.iommu * @@ -3396,7 +3312,7 @@ static int __must_check arm_smmu_iotlb_flush_all(struct domain *d) struct iommu_domain *cfg; spin_lock(&smmu_domain->lock); - list_for_each_entry(cfg, &smmu_domain->iommu_domains, list) { + list_for_each_entry(cfg, &smmu_domain->contexts, list) { /* * Only invalidate the context when SMMU is present. * This is because the context initialization is delayed @@ -3435,7 +3351,7 @@ static struct iommu_domain *arm_smmu_get_domain(struct domain *d, * Loop through the &xen_domain->contexts to locate a context * assigned to this SMMU */ - list_for_each_entry(domain, &xen_domain->iommu_domains, list) { + list_for_each_entry(domain, &xen_domain->contexts, list) { smmu_domain = to_smmu_domain(domain); if (smmu_domain->smmu == smmu) return domain; @@ -3489,7 +3405,7 @@ static int arm_smmu_assign_dev(struct domain *d, u8 devfn, arm_smmu->s2_cfg.domain = d; /* Chain the new context to the domain */ - list_add(&domain->list, &xen_domain->iommu_domains); + list_add(&domain->list, &xen_domain->contexts); } @@ -3569,7 +3485,7 @@ static int arm_smmu_iommu_domain_init(struct domain *d) return -ENOMEM; spin_lock_init(&xen_domain->lock); - INIT_LIST_HEAD(&xen_domain->iommu_domains); + INIT_LIST_HEAD(&xen_domain->contexts); dom_iommu(d)->arch.priv = xen_domain; @@ -3584,7 +3500,7 @@ static void arm_smmu_iommu_domain_teardown(struct domain *d) { struct arm_smmu_xen_domain *xen_domain = dom_iommu(d)->arch.priv; - ASSERT(list_empty(&xen_domain->iommu_domains)); + ASSERT(list_empty(&xen_domain->contexts)); xfree(xen_domain); } diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c index ad956d5b8d..4c04391e21 100644 --- a/xen/drivers/passthrough/arm/smmu.c +++ b/xen/drivers/passthrough/arm/smmu.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -51,36 +52,13 @@ #include #include +#include "arm_smmu.h" /* Not a self contained header. So last in the list */ /* Xen: The below defines are redefined within the file. Undef it */ #undef SCTLR_AFE #undef SCTLR_TRE #undef SCTLR_M #undef TTBCR_EAE -/* Alias to Xen device tree helpers */ -#define device_node dt_device_node -#define of_phandle_args dt_phandle_args -#define of_device_id dt_device_match -#define of_match_node dt_match_node -#define of_property_read_u32(np, pname, out) (!dt_property_read_u32(np, pname, out)) -#define of_property_read_bool dt_property_read_bool -#define of_parse_phandle_with_args dt_parse_phandle_with_args - -/* Xen: Helpers to get device MMIO and IRQs */ -struct resource -{ - u64 addr; - u64 size; - unsigned int type; -}; - -#define resource_size(res) (res)->size; - -#define platform_device device - -#define IORESOURCE_MEM 0 -#define IORESOURCE_IRQ 1 - static struct resource *platform_get_resource(struct platform_device *pdev, unsigned int type, unsigned int num) @@ -118,58 +96,6 @@ static struct resource *platform_get_resource(struct platform_device *pdev, /* Xen: Helpers for IRQ functions */ #define request_irq(irq, func, flags, name, dev) request_irq(irq, flags, func, name, dev) -#define free_irq release_irq - -enum irqreturn { - IRQ_NONE = (0 << 0), - IRQ_HANDLED = (1 << 0), -}; - -typedef enum irqreturn irqreturn_t; - -/* Device logger functions - * TODO: Handle PCI - */ -#define dev_print(dev, lvl, fmt, ...) \ - printk(lvl "smmu: %s: " fmt, dt_node_full_name(dev_to_dt(dev)), ## __VA_ARGS__) - -#define dev_dbg(dev, fmt, ...) dev_print(dev, XENLOG_DEBUG, fmt, ## __VA_ARGS__) -#define dev_notice(dev, fmt, ...) dev_print(dev, XENLOG_INFO, fmt, ## __VA_ARGS__) -#define dev_warn(dev, fmt, ...) dev_print(dev, XENLOG_WARNING, fmt, ## __VA_ARGS__) -#define dev_err(dev, fmt, ...) dev_print(dev, XENLOG_ERR, fmt, ## __VA_ARGS__) - -#define dev_err_ratelimited(dev, fmt, ...) \ - dev_print(dev, XENLOG_ERR, fmt, ## __VA_ARGS__) - -#define dev_name(dev) dt_node_full_name(dev_to_dt(dev)) - -/* Alias to Xen allocation helpers */ -#define kfree xfree -#define kmalloc(size, flags) _xmalloc(size, sizeof(void *)) -#define kzalloc(size, flags) _xzalloc(size, sizeof(void *)) -#define devm_kzalloc(dev, size, flags) _xzalloc(size, sizeof(void *)) -#define kmalloc_array(size, n, flags) _xmalloc_array(size, sizeof(void *), n) - -static void __iomem *devm_ioremap_resource(struct device *dev, - struct resource *res) -{ - void __iomem *ptr; - - if (!res || res->type != IORESOURCE_MEM) { - dev_err(dev, "Invalid resource\n"); - return ERR_PTR(-EINVAL); - } - - ptr = ioremap_nocache(res->addr, res->size); - if (!ptr) { - dev_err(dev, - "ioremap failed (addr 0x%"PRIx64" size 0x%"PRIx64")\n", - res->addr, res->size); - return ERR_PTR(-ENOMEM); - } - - return ptr; -} /* Xen doesn't handle IOMMU fault */ #define report_iommu_fault(...) 1 @@ -196,32 +122,6 @@ static inline int pci_for_each_dma_alias(struct pci_dev *pdev, #define PHYS_MASK_SHIFT PADDR_BITS typedef paddr_t phys_addr_t; -#define VA_BITS 0 /* Only used for configuring stage-1 input size */ - -#define MODULE_DEVICE_TABLE(type, name) -#define module_param_named(name, value, type, perm) -#define MODULE_PARM_DESC(_parm, desc) - -/* Xen: Dummy iommu_domain */ -struct iommu_domain -{ - /* Runtime SMMU configuration for this iommu_domain */ - struct arm_smmu_domain *priv; - - atomic_t ref; - /* Used to link iommu_domain contexts for a same domain. - * There is at least one per-SMMU to used by the domain. - * */ - struct list_head list; -}; - -/* Xen: Describes informations required for a Xen domain */ -struct arm_smmu_xen_domain { - spinlock_t lock; - /* List of context (i.e iommu_domain) associated to this domain */ - struct list_head contexts; -}; - /* * Xen: Information about each device stored in dev->archdata.iommu *