|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v3 5/6] drivers/passthrough/arm: Refactor code for arm smmu drivers
On 6/7/2018 10:36 PM, Manish Jaggi wrote:
> Hi Sameer,
>
>
> On 06/08/2018 05:17 AM, Sameer Goel wrote:
>> Pull common defines for SMMU drives in a local header.
> Can add more detail in commit message?
>>
>> Signed-off-by: Sameer Goel <sameer.goel@xxxxxxxxxx>
>> ---
>> 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 <asm/io.h>
>> #include <asm/platform.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
>> -
>> -/* Xen: Helpers to get device MMIO and IRQs */
> Added and removed in subsequent patches? code specific to xen.
> you can remove from patch#4 itself.
No, removed as this was pulled into the common header. I wanted to first write
the smmuv3 files will all the deps in it. Then clean both the SMMU files
together. I think this makes more of a case for a common header. You can say
that why not create a common header before making the smmu-v3 changes. I think
that this progression works in a similar way.
Thanks,
Sameer
>> -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;
>> -};
>> -
> This xen dummy structure was introduced in patch 4 and now removing in patch5,
> Can you remove it from patch 4 itself?
>> -/* 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;
>> -};
>> -
> Same as above
>> /*
>> * 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 <xen/irq.h>
>> #include <xen/lib.h>
>> #include <xen/list.h>
>> +#include <xen/linux-compat.h>
>> #include <xen/mm.h>
>> #include <xen/vmap.h>
>> #include <xen/rbtree.h>
>> @@ -51,36 +52,13 @@
>> #include <asm/io.h>
>> #include <asm/platform.h>
>> +#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 <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +#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__ */
>> +
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |