From patchwork Fri Feb 9 03:10:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sameer Goel X-Patchwork-Id: 127753 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp209434ljc; Thu, 8 Feb 2018 19:13:45 -0800 (PST) X-Google-Smtp-Source: AH8x225Qy1QxqOdqUd1tIp9BOg3c6GOaZwUM5J4P788H0bS518ExKR7+mQ0dlkNQ5+i701HyskeB X-Received: by 10.36.173.96 with SMTP id a32mr1620066itj.21.1518146025250; Thu, 08 Feb 2018 19:13:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518146025; cv=none; d=google.com; s=arc-20160816; b=MUoS+yIAlo5mB+hM9IwYM44MjJQxvS1QG0eW888A7L0TDwWa8JVDcn8DiHmt9UYuzM h1RW5uuqwuGe5dDgP42Sus+B9Zsojkcb18q5U1Gtqilvfg+TyIgUB+lbO+eYpOoZV2ao XMVoSlotccCOVHmKESjeFheDKzY6G75Mi+pDkfmVRvjfsxDVAl/PKCEdAb30EtZbYjig uYnime273oOlGoUCTcmoiGgUMzyRjLNhBzyginWCDHjs5+LFy2df3Lwb+cUzdZwQFgfS DWyIONMHjD/m1TTGIGQobeVSmjmG3AS3sGWBPKgEv+BuT+otG7eXE6QK7M52Ip+jV4AF 7/MQ== 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=GQC7RB+xViEKWrvOPJjxP9yIwQAujYrqa1Rs9m4T1dw=; b=BaPpYvKRY1DftAf5EglKR4DMFV63T/AO478l8QKRVHQqexxpXqEFQqk5YL9L29QGPd XNNfn3O0HJqVyAQCWG3vnOg0aPiKrNW0dqla+dl4V4rtkTULcvJpPP/a47L326Z7+p/3 HsMdCWW02qqV2AriyoGXgAd6hAtgf7UTAqFXr58jjZfKq00arCVqXMgLpCz6VvQxbnca qJ2u7+bAKpDSRbK18whXkI81lGYUP9AYpCvOIswafJkCaM7D3syR8ha+1DiHD+xGhj9C t0c/Rj7ZVtvfDHejAn7KVgaUm/sjGWq9kHeiDFmXsO8cirTYb842MGOnSI+6lLKQYhgX ZKYw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=ME3C+D2i; 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 b2si988381itc.138.2018.02.08.19.13.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Feb 2018 19:13:45 -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=ME3C+D2i; 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 1ejz64-00055i-UQ; Fri, 09 Feb 2018 03:11:32 +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 1ejz63-00054T-Rp for xen-devel@lists.xenproject.org; Fri, 09 Feb 2018 03:11:31 +0000 X-Inumbo-ID: dc2a0415-0d46-11e8-ba59-bc764e045a96 Received: from mail-pl0-x244.google.com (unknown [2607:f8b0:400e:c01::244]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id dc2a0415-0d46-11e8-ba59-bc764e045a96; Fri, 09 Feb 2018 04:11:03 +0100 (CET) Received: by mail-pl0-x244.google.com with SMTP id o13so862325pli.6 for ; Thu, 08 Feb 2018 19:11:30 -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=MDlR1e1gFyDUK5LZ8d0NAy1dpbeoAPVl/NexFCvK3XY=; b=ME3C+D2iwTRW713Pp0FP/GbQwWMPEG2ZIHxA8HOhIZ0obhY4WSG4uyMyPjPT4cWxrx /XqL4xE1Y83idj4crkRgSwTiInCvKYuASkmI/APryiDjczTk9ssqRQ1uw5lU28B7AhKP sL3kkLmvHf5gHltqrDzQsxJCXQDmoDpUdj+rg= 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=MDlR1e1gFyDUK5LZ8d0NAy1dpbeoAPVl/NexFCvK3XY=; b=WQ74O6MsEhhbFTuKMVKtx82HmNDjozRCsgz0HtweWwwzTxAOLrUJHGLCg4syKxng2E KMajEKRxoqTiq8ZyytT5NNtNfT/s6WRnGk7xk2aAVop1ZQHqYAjdHMBNyjxZR+Civb2w AWGh1/Y+f2Q+LcOEUoVrR4BOuWHN2lojJifZk2qzXEbO8eEGZLhqL7VY/15kJN2I/g/m yOW+R//GMGxXO5AQHWbqGYdy0nDjKExKcsMT57QhXSd4gNii1AteXrA8UWbwtQcX6Z5b z3cXIwjOzP0SKydWxkeYgkGoWSubak65QiYuyTMrtieH3M7peAoIi/S/2E/cpr1Razn4 +ENQ== X-Gm-Message-State: APf1xPCQTMidz9rDRsCIiLoY73/JC3L8/ZsxQwIiwnwMlQllW2g4Loj7 hFr0Lw4eSWPZrM9p4xyCLhZf6oc0VvA= X-Received: by 2002:a17:902:6b05:: with SMTP id o5-v6mr1109079plk.179.1518145889624; Thu, 08 Feb 2018 19:11:29 -0800 (PST) Received: from localhost.localdomain (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id z15sm2663487pgr.62.2018.02.08.19.11.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 08 Feb 2018 19:11:29 -0800 (PST) From: Sameer Goel To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Date: Thu, 8 Feb 2018 20:10:54 -0700 Message-Id: <20180209031055.21926-7-sameer.goel@linaro.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180209031055.21926-1-sameer.goel@linaro.org> References: <20180209031055.21926-1-sameer.goel@linaro.org> MIME-Version: 1.0 Cc: sstabellini@kernel.org, roger.pau@citrix.com, shankerd@codeaurora.org, Sameer Goel Subject: [Xen-devel] [PATCH 6/7] 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 drives in a local header. Signed-off-by: Sameer Goel --- xen/drivers/passthrough/arm/arm_smmu.h | 125 +++++++++++++++++++++++++++++++++ xen/drivers/passthrough/arm/smmu-v3.c | 96 +------------------------ xen/drivers/passthrough/arm/smmu.c | 104 +-------------------------- 3 files changed, 128 insertions(+), 197 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..f49dceb5b4 --- /dev/null +++ b/xen/drivers/passthrough/arm/arm_smmu.h @@ -0,0 +1,125 @@ +/****************************************************************************** + * ./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__ + + +/* 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 + +/* 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) + +#define dma_set_mask_and_coherent(d, b) 0 +#define of_dma_is_coherent(n) 0 + +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 f43485fe6e..f0a61521fb 100644 --- a/xen/drivers/passthrough/arm/smmu-v3.c +++ b/xen/drivers/passthrough/arm/smmu-v3.c @@ -49,28 +49,7 @@ #include #include -/* 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 +#include "arm_smmu.h" static struct resource *platform_get_resource(struct platform_device *pdev, unsigned int type, @@ -200,79 +179,6 @@ static 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) - -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 contexts; -}; - /* * Xen: Information about each device stored in dev->archdata.iommu * 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 *