From patchwork Thu Jun 7 23:47:31 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sameer Goel X-Patchwork-Id: 137906 Delivered-To: patch@linaro.org Received: by 2002:a2e:970d:0:0:0:0:0 with SMTP id r13-v6csp207256lji; Thu, 7 Jun 2018 16:50:28 -0700 (PDT) X-Google-Smtp-Source: ADUXVKLpFtuyD3S0RjwstREoZ0xMC50Yw6wOLWs+rQdcKjSrWPf9DP9LjOpeqmGikun/kULTxern X-Received: by 2002:a24:650b:: with SMTP id u11-v6mr3981897itb.30.1528415428456; Thu, 07 Jun 2018 16:50:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528415428; cv=none; d=google.com; s=arc-20160816; b=YyQ91jDNmDZIKKV9aaebDjcixYSPA9Tj2fmz8wnWMqnDhtU9/zB9swMsDB+QhKzzDB ycWgpVtjDmw3R7995kw2TjvVOmAE9nZFQfNpma9cr7Dmzj435nv8F9PibgzeK/boEgJs kV5O+TjioQBpG8hKoDqW4QvpBGZ7ndUQyjYI1RqJKY71gKrXrfa78a0D5rvaHk7eYQ++ ovxiBHHB3bpOCEnWocx3FIQ2a9ktTwEoBBQkNigaLgNNnRVg88j9HFCbInVpHU9aQWpY gXZuUS1AvcKfDDPrHaV9YZTX8+eHbZOkFvysEBMnBpXsIyQC+1TZrlopu5JTeYbokmyy t1Dw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:list-subscribe :list-help:list-post:list-unsubscribe:list-id:precedence:subject :mime-version:references:in-reply-to:message-id:date:to:from :dkim-signature:arc-authentication-results; bh=iWCecIb3FKNmYzCmWFh1IednuYPikX8/QTfFkZC3pyc=; b=cJCvMdFb6pZcpCNnOdN7Cq65RAXRJTl2daVDu5vgJYYY+UIQczj3wUyxamjibIgAZs BhCzlj7AHfm1gJNk4lWqMRDakVHmAAx7/A3FtkIV4Kr84rkfjxpuji2TYPTSnljUhZsQ ac5V9oZk0RT56UCcvngVUe/6lgEBQt7FxCGHvWD7gEJUpj4BVMBqRttbveMphHiNoKZj nvrb3RxSGknIUlpjxk7zwL5wZEX1O4Pu5A8sziNmPdeyCnwOU/5XuAj7vPa9kcRZ8TTP zs6Lr1RoNijv++eCMJkCh3HMmtNsnlZeZtFbjHdw1RwCRtkvRMcleYeCGhIO6dQpmk3P XfJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=SWJbPdqG; 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 c16-v6si105760itd.93.2018.06.07.16.50.28 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 07 Jun 2018 16:50:28 -0700 (PDT) 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=SWJbPdqG; 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.89) (envelope-from ) id 1fR4dR-0007jo-IQ; Thu, 07 Jun 2018 23:48:05 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fR4dP-0007iY-M4 for xen-devel@lists.xenproject.org; Thu, 07 Jun 2018 23:48:03 +0000 X-Inumbo-ID: e4593fae-6aac-11e8-9728-bc764e045a96 Received: from mail-pl0-x244.google.com (unknown [2607:f8b0:400e:c01::244]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id e4593fae-6aac-11e8-9728-bc764e045a96; Fri, 08 Jun 2018 01:45:43 +0200 (CEST) Received: by mail-pl0-x244.google.com with SMTP id g20-v6so7125579plq.1 for ; Thu, 07 Jun 2018 16:48:01 -0700 (PDT) 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=qi0ie0ML/TWo0sMYPyRMgC//oR/t5lT7z/k8qvyfMVU=; b=SWJbPdqGTJLFHycND1d6UV59eXko6IWzn65BoU7O8Rnd2s3MvdUNnKSYjIstb/IqFJ jhLwrkpBVnvu6CV1j0Qrq33nXrTuj6Zn4lpR9JfsebBz2F0XkXTDXFDSR923L+EHQ9uS mkPmm55Lu/YlnLjJ2yIPDJmKxVzsEbvhmeNTE= 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=qi0ie0ML/TWo0sMYPyRMgC//oR/t5lT7z/k8qvyfMVU=; b=FwzMYh/ePD97HJBu24VZv7UGlaNHNl6kTNi78Xr6yG3Xvz3qoP8OHV043GB4Oze91B zxsvU2mUpR6PhxEEzAJH03LpdqUBy/2XHTCIDbNdyb9kmPAnjIK7OpmztDrxqHGaEzEl RVC8RDEleeNYTin8VdTyfHZvYBk+Uz0yiqsED0EuOHFBklzN0y66CHCdlZVzOCdSwTXf 7OWTNE2WMTAYOEllsiPoi1F/qeVyQ9DfivRzSWDbS1rzwWpoDkkwYfyBKls9Hq3P6PIz nPtA1lzYVzTYRK9o/iUxGzCc3OHwPlY4GpZ1/ICWf+KVRCQwJtVSJCQE7a8XZ/t5H1vx r+YA== X-Gm-Message-State: APt69E29txcX7gGW+HvnaC0nXfOTP4jYsIpaik+GWxU2SL+zO7IqYuK/ /Fi/u8P4Zj1G64b9FJ/34BHLDoKi3Gc= X-Received: by 2002:a17:902:8a87:: with SMTP id p7-v6mr3985666plo.278.1528415280906; Thu, 07 Jun 2018 16:48:00 -0700 (PDT) Received: from sameer-ubuntu-book.qualcomm.com (i-global254.qualcomm.com. [199.106.103.254]) by smtp.gmail.com with ESMTPSA id y20-v6sm46183321pge.46.2018.06.07.16.47.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Jun 2018 16:48:00 -0700 (PDT) From: Sameer Goel To: xen-devel@lists.xenproject.org, julien.grall@arm.com, mjaggi@caviumnetworks.com Date: Thu, 7 Jun 2018 17:47:31 -0600 Message-Id: <20180607234732.20124-6-sameer.goel@linaro.org> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180607234732.20124-1-sameer.goel@linaro.org> References: <20180607234732.20124-1-sameer.goel@linaro.org> MIME-Version: 1.0 Subject: [Xen-devel] [v3 5/6] drivers/passthrough/arm: Refactor code for arm smmu drivers X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: roger.pau@citrix.com, sstabellini@kernel.org, jbeulich@suse.com, shankerd@codeaurora.org, Sameer Goel 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/smmu-v3.c | 96 +------------------- xen/drivers/passthrough/arm/smmu.c | 104 +-------------------- xen/drivers/passthrough/arm/smmu.h | 125 ++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 197 deletions(-) create mode 100644 xen/drivers/passthrough/arm/smmu.h diff --git a/xen/drivers/passthrough/arm/smmu-v3.c b/xen/drivers/passthrough/arm/smmu-v3.c index 75c3411ad9..fdf85c1508 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 "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..f7a6b107de 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 "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 * diff --git a/xen/drivers/passthrough/arm/smmu.h b/xen/drivers/passthrough/arm/smmu.h new file mode 100644 index 0000000000..8e38d78c1a --- /dev/null +++ b/xen/drivers/passthrough/arm/smmu.h @@ -0,0 +1,125 @@ +/****************************************************************************** + * ./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 __SMMU_H__ +#define __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 /* __SMMU_H__ */ +