Introduce automatic DMA configuration for IOMMU masters
Subsystems (5)
v5 cover Introduce automatic DMA configuration for IOMMU masters
Hi all,
Here is v5 of the patches I've previously sent here:
RFCv1: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-August/283023.html
RFCv2: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/283752.html
RFCv3: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/287031.html
RFCv4: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-November/302711.html
Changes since RFCv4 include:
- Dropped the RFC tag, since has been used by a couple of people now
- Dropped the DMA segment configuration from of_dma_configure, as there appear to be assumptions about 64k segments elsewhere in the kernel
- Added acks/tested-bys (thanks to everybody who reviewed the series)
- A few small fixes for issues found by Marek
Arnd: Is this too late for 3.19? We could merge the first 6 patches with no issues, since there aren't any callers of of_iommu_init without patch 7 anyway.
Up to you.
Will
--->8
Marek Szyprowski (1):
iommu: fix initialization without 'add_device' callback
Will Deacon (7):
iommu: provide early initialisation hook for IOMMU drivers
dma-mapping: replace set_arch_dma_coherent_ops with arch_setup_dma_ops
iommu: add new iommu_ops callback for adding an OF device
iommu: provide helper function to configure an IOMMU for an of master
dma-mapping: detect and configure IOMMU in of_dma_configure
arm: call iommu_init before of_platform_populate
arm: dma-mapping: plumb our iommu mapping ops into arch_setup_dma_ops
arch/arm/include/asm/dma-mapping.h | 12 +++--- arch/arm/kernel/setup.c | 2 + arch/arm/mm/dma-mapping.c | 83 ++++++++++++++++++++++++++++++++++---- drivers/iommu/Kconfig | 2 +- drivers/iommu/iommu.c | 2 +- drivers/iommu/of_iommu.c | 50 +++++++++++++++++++++++ drivers/of/platform.c | 50 ++++++++++++----------- include/asm-generic/vmlinux.lds.h | 2 + include/linux/dma-mapping.h | 13 +++--- include/linux/iommu.h | 8 ++++ include/linux/of_iommu.h | 31 ++++++++++++++ 11 files changed, 211 insertions(+), 44 deletions(-)
Signature · 1 line
2.1.1
PATCH v5 1/8 iommu: provide early initialisation hook for IOMMU drivers
IOMMU drivers must be initialised before any of their upstream devices, otherwise the relevant iommu_ops won't be configured for the bus in question. To solve this, a number of IOMMU drivers use initcalls to initialise the driver before anything has a chance to be probed.
Whilst this solves the immediate problem, it leaves the job of probing the IOMMU completely separate from the iommu_ops to configure the IOMMU, which are called on a per-bus basis and require the driver to figure out exactly which instance of the IOMMU is being requested. In particular, the add_device callback simply passes a struct device to the driver, which then has to parse firmware tables or probe buses to identify the relevant IOMMU instance.
This patch takes the first step in addressing this problem by adding an early initialisation pass for IOMMU drivers, giving them the ability to store some per-instance data in their iommu_ops structure and store that in their of_node. This can later be used when parsing OF masters to identify the IOMMU instance in question.
--- drivers/iommu/of_iommu.c | 17 +++++++++++++++++ include/asm-generic/vmlinux.lds.h | 2 ++ include/linux/iommu.h | 2 ++ include/linux/of_iommu.h | 25 +++++++++++++++++++++++++ 4 files changed, 46 insertions(+)
drivers/iommu/of_iommu.c +17 -0
@@ -22,6 +22,9 @@#include <linux/of.h> #include <linux/of_iommu.h> +static const struct of_device_id __iommu_of_table_sentinel +__used __section (__iommu_of_table_end); +/** * of_get_dma_window - Parse *dma-window property and returns 0 if found. *
@@ -89,3 +92,17 @@ int of_get_dma_window(struct device_node *dn, const char *prefix, int index,return 0 ; }EXPORT_SYMBOL_GPL (of_get_dma_window); + +void __init of_iommu_init (void ) +{ +struct device_node *np; +const struct of_device_id *match, *matches = &__iommu_of_table; + +for_each_matching_node_and_match (np, matches, &match) { +const of_iommu_init_fn init_fn = match->data; + +if (init_fn (np)) +pr_err ("Failed to initialise IOMMU %s\n" , +of_node_full_name (np)); + } +}
include/asm-generic/vmlinux.lds.h +2 -0
@@ -164,6 +164,7 @@#define CLKSRC_OF_TABLES () OF_TABLE(CONFIG_CLKSRC_OF, clksrc)#define IRQCHIP_OF_MATCH_TABLE () OF_TABLE(CONFIG_IRQCHIP, irqchip)#define CLK_OF_TABLES () OF_TABLE(CONFIG_COMMON_CLK, clk) +#define IOMMU_OF_TABLES () OF_TABLE(CONFIG_OF_IOMMU, iommu)#define RESERVEDMEM_OF_TABLES () OF_TABLE(CONFIG_OF_RESERVED_MEM, reservedmem)#define CPU_METHOD_OF_TABLES () OF_TABLE(CONFIG_SMP, cpu_method)#define EARLYCON_OF_TABLES () OF_TABLE(CONFIG_SERIAL_EARLYCON, earlycon)
@@ -497,6 +498,7 @@ CLK_OF_TABLES() \ RESERVEDMEM_OF_TABLES() \ CLKSRC_OF_TABLES() \ + IOMMU_OF_TABLES() \ CPU_METHOD_OF_TABLES() \ KERNEL_DTB() \IRQCHIP_OF_MATCH_TABLE () \
include/linux/iommu.h +2 -0
@@ -103,6 +103,7 @@ enum iommu_attr {* @domain_get_attr: Query domain attributes * @domain_set_attr: Change domain attributes * @pgsize_bitmap: bitmap of supported page sizes +* @priv: per-instance data private to the iommu driver */ struct iommu_ops {bool (*capable)(enum iommu_cap );
@@ -133,6 +134,7 @@ struct iommu_ops {u32 (*domain_get_windows)(struct iommu_domain *domain);unsigned long pgsize_bitmap; +void *priv; };#define IOMMU_GROUP_NOTIFY_ADD_DEVICE 1/* Device added */
include/linux/of_iommu.h +25 -0
@@ -1,12 +1,17 @@#ifndef __OF_IOMMU_H#define __OF_IOMMU_H +#include <linux/iommu.h> +#include <linux/of.h> +#ifdef CONFIG_OF_IOMMU extern int of_get_dma_window (struct device_node *dn,const char *prefix,int index,unsigned long *busno,dma_addr_t *addr,size_t *size); +extern void of_iommu_init (void ); +#else static inline int of_get_dma_window(struct device_node *dn, const char *prefix,
@@ -16,6 +21,26 @@ static inline int of_get_dma_window(struct device_node *dn, const char *prefix,return -EINVAL ; } +static inline void of_iommu_init (void ) { } +#endif /* CONFIG_OF_IOMMU */ +static inline void of_iommu_set_ops (struct device_node *np, +const struct iommu_ops *ops) +{ + np->data = (struct iommu_ops *)ops; +} + +static inline struct iommu_ops *of_iommu_get_ops (struct device_node *np) +{ +return np->data; +} + +extern struct of_device_id __iommu_of_table; + +typedef int (*of_iommu_init_fn )(struct device_node *); + +#define IOMMU_OF_DECLARE (name, compat, fn) \ + _OF_DECLARE(iommu, name, compat, fn, of_iommu_init_fn) +#endif /* __OF_IOMMU_H */
Signature · 1 line
2.1.1
PATCH v5 2/8 dma-mapping: replace set_arch_dma_coherent_ops with arch_setup_dma_ops
In reply to Will Deaconset_arch_dma_coherent_ops is called from of_dma_configure in order to swizzle the architectural dma-mapping functions over to a cache-coherent implementation. This is currently implemented only for ARM.
In anticipation of re-using this mechanism for IOMMU-backed dma-mapping ops too, this patch replaces the function with a broader arch_setup_dma_ops callback which will be extended in future.
--- arch/arm/include/asm/dma-mapping.h | 8 ++++---- drivers/of/platform.c | 31 +++++++++++++------------------ include/linux/dma-mapping.h | 7 ++----- 3 files changed, 19 insertions(+), 27 deletions(-)
arch/arm/include/asm/dma-mapping.h +4 -4
@@ -121,12 +121,12 @@ static inline unsigned long dma_max_pfn(struct device *dev) }#define dma_max_pfn (dev) dma_max_pfn(dev) -static inline int set_arch_dma_coherent_ops (struct device *dev) +static inline void arch_setup_dma_ops (struct device *dev,bool coherent) { -set_dma_ops (dev, &arm_coherent_dma_ops); -return 0 ; +if (coherent) +set_dma_ops (dev, &arm_coherent_dma_ops); } -#define set_arch_dma_coherent_ops (dev) set_arch_dma_coherent_ops(dev) +#define arch_setup_dma_ops arch_setup_dma_opsstatic inline dma_addr_t phys_to_dma (struct device *dev,phys_addr_t paddr) {
drivers/of/platform.c +13 -18
@@ -164,6 +164,8 @@ static void of_dma_configure(struct device *dev) {u64 dma_addr, paddr, size;int ret; +bool coherent; +unsigned long offset;/* * Set default dma-mask to 32 bit. Drivers are expected to setup
@@ -178,28 +180,21 @@ static void of_dma_configure(struct device *dev)if (!dev->dma_mask) dev->dma_mask = &dev->coherent_dma_mask; -/* -* if dma-coherent property exist, call arch hook to setup -* dma coherent operations. -*/ -if (of_dma_is_coherent (dev->of_node)) { -set_arch_dma_coherent_ops (dev); -dev_dbg (dev,"device is dma coherent\n" ); - } - -/* -* if dma-ranges property doesn't exist - just return else -* setup the dma offset -*/ ret =of_dma_get_range (dev->of_node, &dma_addr, &paddr, &size);if (ret <0 ) { -dev_dbg (dev,"no dma range information to setup\n" ); -return ; + dma_addr = offset =0 ; + size = dev->coherent_dma_mask; + }else { + offset =PFN_DOWN (paddr - dma_addr); +dev_dbg (dev,"dma_pfn_offset(%#08lx)\n" , dev->dma_pfn_offset); } + dev->dma_pfn_offset = offset; + + coherent =of_dma_is_coherent (dev->of_node); +dev_dbg (dev,"device is%sdma coherent\n" , + coherent ?" " :" not " ); -/* DMA ranges found. Calculate and set dma_pfn_offset */ - dev->dma_pfn_offset =PFN_DOWN (paddr - dma_addr); -dev_dbg (dev,"dma_pfn_offset(%#08lx)\n" , dev->dma_pfn_offset); +arch_setup_dma_ops (dev, coherent); }/**
include/linux/dma-mapping.h +2 -5
@@ -129,11 +129,8 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)extern u64 dma_get_required_mask (struct device *dev); -#ifndef set_arch_dma_coherent_ops -static inline int set_arch_dma_coherent_ops (struct device *dev) -{ -return 0 ; -} +#ifndef arch_setup_dma_ops +static inline void arch_setup_dma_ops (struct device *dev,bool coherent) { }#endif static inline unsigned int dma_get_max_seg_size (struct device *dev)
Signature · 1 line
2.1.1
PATCH v5 3/8 iommu: add new iommu_ops callback for adding an OF device
In reply to Will DeaconThis patch adds a new function to the iommu_ops structure to allow an OF device to be added to a specific IOMMU instance using the recently merged generic devicetree binding for IOMMUs. The callback (of_xlate) takes a struct device representing the master and an of_phandle_args representing the IOMMU and the correspondong IDs for the new master.
--- include/linux/iommu.h | 6 ++++++ 1 file changed, 6 insertions(+)
include/linux/iommu.h +6 -0
@@ -21,6 +21,7 @@#include <linux/errno.h> #include <linux/err.h> +#include <linux/of.h> #include <linux/types.h> #include <trace/events/iommu.h>
@@ -102,6 +103,7 @@ enum iommu_attr {* @remove_device: remove device from iommu grouping * @domain_get_attr: Query domain attributes * @domain_set_attr: Change domain attributes +* @of_xlate: add OF master IDs to iommu grouping * @pgsize_bitmap: bitmap of supported page sizes * @priv: per-instance data private to the iommu driver */
@@ -133,6 +135,10 @@ struct iommu_ops {/* Get the numer of window per domain */ u32 (*domain_get_windows)(struct iommu_domain *domain); +#ifdef CONFIG_OF_IOMMU +int (*of_xlate)(struct device *dev,struct of_phandle_args *args); +#endif +unsigned long pgsize_bitmap;void *priv; };
Signature · 1 line
2.1.1
PATCH v5 4/8 iommu: provide helper function to configure an IOMMU for an of master
In reply to Will DeaconThe generic IOMMU device-tree bindings can be used to add arbitrary OF masters to an IOMMU with a compliant binding.
This patch introduces of_iommu_configure, which does exactly that.
--- drivers/iommu/Kconfig | 2 +- drivers/iommu/of_iommu.c | 33 +++++++++++++++++++++++++++++++++ include/linux/of_iommu.h | 6 ++++++ 3 files changed, 40 insertions(+), 1 deletion(-)
drivers/iommu/Kconfig +1 -1
@@ -15,7 +15,7 @@ if IOMMU_SUPPORT config OF_IOMMU def_bool y - depends on OF + depends on OF && IOMMU_API config FSL_PAMU bool "Freescale IOMMU support"
drivers/iommu/of_iommu.c +33 -0
@@ -18,6 +18,7 @@*/ #include <linux/export.h> +#include <linux/iommu.h> #include <linux/limits.h> #include <linux/of.h> #include <linux/of_iommu.h>
@@ -93,6 +94,38 @@ int of_get_dma_window(struct device_node *dn, const char *prefix, int index, }EXPORT_SYMBOL_GPL (of_get_dma_window); +struct iommu_ops *of_iommu_configure (struct device *dev) +{ +struct of_phandle_args iommu_spec; +struct device_node *np; +struct iommu_ops *ops =NULL ; +int idx =0 ; + +/* +* We don't currently walk up the tree looking for a parent IOMMU. +* See the `Notes:' section of +* Documentation/devicetree/bindings/iommu/iommu.txt +*/ +while (!of_parse_phandle_with_args (dev->of_node,"iommus" , +"#iommu-cells" , idx, + &iommu_spec)) { + np = iommu_spec.np; + ops =of_iommu_get_ops (np); + +if (!ops || !ops->of_xlate || ops->of_xlate (dev, &iommu_spec)) + goto err_put_node; + +of_node_put (np); + idx++; + } + +return ops; + +err_put_node: +of_node_put (np); +return NULL ; +} +void __init of_iommu_init (void ) {struct device_node *np;
include/linux/of_iommu.h +6 -0
@@ -1,6 +1,7 @@#ifndef __OF_IOMMU_H#define __OF_IOMMU_H +#include <linux/device.h> #include <linux/iommu.h> #include <linux/of.h>
@@ -11,6 +12,7 @@ extern int of_get_dma_window(struct device_node *dn, const char *prefix, size_t *size);extern void of_iommu_init (void ); +extern struct iommu_ops *of_iommu_configure (struct device *dev);#else
@@ -22,6 +24,10 @@ static inline int of_get_dma_window(struct device_node *dn, const char *prefix, }static inline void of_iommu_init (void ) { } +static inline struct iommu_ops *of_iommu_configure (struct device *dev) +{ +return NULL ; +}#endif /* CONFIG_OF_IOMMU */
Signature · 1 line
2.1.1
PATCH v5 5/8 iommu: fix initialization without 'add_device' callback
In reply to Will DeaconFrom: Marek Szyprowski <[email protected]>
IOMMU drivers can be initialized from of_iommu helpers. Such drivers don't need to provide device_add callbacks to operate properly, so there is no need to fail initialization if the callback is missing.
--- drivers/iommu/iommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iommu/iommu.c +1 -1
@@ -737,7 +737,7 @@ static int add_iommu_group(struct device *dev, void *data)const struct iommu_ops *ops = cb->ops;if (!ops->add_device) -return -ENODEV ; +return 0 ;WARN_ON (dev->iommu_group);
Signature · 1 line
2.1.1
PATCH v5 6/8 dma-mapping: detect and configure IOMMU in of_dma_configure
In reply to Will DeaconThis patch extends of_dma_configure so that it sets up the IOMMU for a device, as well as the coherent/non-coherent DMA mapping ops.
--- arch/arm/include/asm/dma-mapping.h | 4 +++- drivers/of/platform.c | 21 ++++++++++++++------- include/linux/dma-mapping.h | 8 +++++++- 3 files changed, 24 insertions(+), 9 deletions(-)
arch/arm/include/asm/dma-mapping.h +3 -1
@@ -121,7 +121,9 @@ static inline unsigned long dma_max_pfn(struct device *dev) }#define dma_max_pfn (dev) dma_max_pfn(dev) -static inline void arch_setup_dma_ops (struct device *dev,bool coherent) +static inline void arch_setup_dma_ops (struct device *dev,u64 dma_base, +u64 size,struct iommu_ops *iommu, +bool coherent) {if (coherent)set_dma_ops (dev, &arm_coherent_dma_ops);
drivers/of/platform.c +14 -7
@@ -19,6 +19,7 @@#include <linux/slab.h> #include <linux/of_address.h> #include <linux/of_device.h> +#include <linux/of_iommu.h> #include <linux/of_irq.h> #include <linux/of_platform.h> #include <linux/platform_device.h>
@@ -166,6 +167,7 @@ static void of_dma_configure(struct device *dev)int ret;bool coherent;unsigned long offset; +struct iommu_ops *iommu;/* * Set default dma-mask to 32 bit. Drivers are expected to setup
@@ -194,7 +196,16 @@ static void of_dma_configure(struct device *dev)dev_dbg (dev,"device is%sdma coherent\n" , coherent ?" " :" not " ); -arch_setup_dma_ops (dev, coherent); + iommu =of_iommu_configure (dev); +dev_dbg (dev,"device is%sbehind an iommu\n" , + iommu ?" " :" not " ); + +arch_setup_dma_ops (dev, dma_addr, size, iommu, coherent); +} + +static void of_dma_deconfigure (struct device *dev) +{ +arch_teardown_dma_ops (dev); }/**
@@ -223,16 +234,12 @@ static struct platform_device *of_platform_device_create_pdata(if (!dev) goto err_clear_flag; -of_dma_configure (&dev->dev); dev->dev.bus = &platform_bus_type; dev->dev.platform_data = platform_data; - -/* We do not fill the DMA ops for platform devices by default. -* This is currently the responsibility of the platform code -* to do such, possibly using a device notifier -*/ +of_dma_configure (&dev->dev);if (of_device_add (dev) !=0 ) { +of_dma_deconfigure (&dev->dev);platform_device_put (dev); goto err_clear_flag; }
include/linux/dma-mapping.h +7 -1
@@ -130,7 +130,13 @@ static inline int dma_coerce_mask_and_coherent(struct device *dev, u64 mask)extern u64 dma_get_required_mask (struct device *dev);#ifndef arch_setup_dma_ops -static inline void arch_setup_dma_ops (struct device *dev,bool coherent) { } +static inline void arch_setup_dma_ops (struct device *dev,u64 dma_base, +u64 size,struct iommu_ops *iommu, +bool coherent) { } +#endif + +#ifndef arch_teardown_dma_ops +static inline void arch_teardown_dma_ops (struct device *dev) { }#endif static inline unsigned int dma_get_max_seg_size (struct device *dev)
Signature · 1 line
2.1.1
PATCH v5 7/8 arm: call iommu_init before of_platform_populate
In reply to Will DeaconWe need to ensure that the IOMMUs in the system have a chance to perform some basic initialisation before we start adding masters to them.
This patch adds a call to of_iommu_init before of_platform_populate.
--- arch/arm/kernel/setup.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/kernel/setup.c +2 -0
@@ -18,6 +18,7 @@#include <linux/bootmem.h> #include <linux/seq_file.h> #include <linux/screen_info.h> +#include <linux/of_iommu.h> #include <linux/of_platform.h> #include <linux/init.h> #include <linux/kexec.h>
@@ -806,6 +807,7 @@ static int __init customize_machine(void)* machine from the device tree, if no callback is provided, * otherwise we would always need an init_machine callback. */ +of_iommu_init ();if (machine_desc->init_machine) machine_desc->init_machine ();#ifdef CONFIG_OF
Signature · 1 line
2.1.1
PATCH v5 8/8 arm: dma-mapping: plumb our iommu mapping ops into arch_setup_dma_ops
In reply to Will DeaconThis patch plumbs the existing ARM IOMMU DMA infrastructure (which isn't actually called outside of a few drivers) into arch_setup_dma_ops, so that we can use IOMMUs for DMA transfers in a more generic fashion.
Since this significantly complicates the arch_setup_dma_ops function, it is moved out of line into dma-mapping.c. If CONFIG_ARM_DMA_USE_IOMMU is not set, the iommu parameter is ignored and the normal ops are used instead.
--- arch/arm/include/asm/dma-mapping.h | 12 +++--- arch/arm/mm/dma-mapping.c | 83 ++++++++++++++++++++++++++++++++++---- 2 files changed, 81 insertions(+), 14 deletions(-)
arch/arm/include/asm/dma-mapping.h +5 -7
@@ -121,14 +121,12 @@ static inline unsigned long dma_max_pfn(struct device *dev) }#define dma_max_pfn (dev) dma_max_pfn(dev) -static inline void arch_setup_dma_ops (struct device *dev,u64 dma_base, -u64 size,struct iommu_ops *iommu, -bool coherent) -{ -if (coherent) -set_dma_ops (dev, &arm_coherent_dma_ops); -}#define arch_setup_dma_ops arch_setup_dma_ops +extern void arch_setup_dma_ops (struct device *dev,u64 dma_base,u64 size, +struct iommu_ops *iommu,bool coherent); + +#define arch_teardown_dma_ops arch_teardown_dma_ops +extern void arch_teardown_dma_ops (struct device *dev);static inline dma_addr_t phys_to_dma (struct device *dev,phys_addr_t paddr) {
arch/arm/mm/dma-mapping.c +76 -7
109 lines not on this page · raw message
Signature · 1 line
2.1.1
Arnd Bergmann
maintainerv5 cover Introduce automatic DMA configuration for IOMMU masters
In reply to Will DeaconQuoted 18 lines · On Friday 28 November 2014 13:29:38 Will Deacon wrote:
Hi all,
Here is v5 of the patches I've previously sent here:
RFCv1: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-August/283023.html
RFCv2: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/283752.html
RFCv3: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/287031.html
RFCv4: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-November/302711.htmlChanges since RFCv4 include:
- Dropped the RFC tag, since has been used by a couple of people now
- Dropped the DMA segment configuration from
of_dma_configure, as there appear to be assumptions about 64k segments elsewhere in the kernel- Added acks/tested-bys (thanks to everybody who reviewed the series)
Quoted 7 lines
- A few small fixes for issues found by Marek
Arnd: Is this too late for 3.19? We could merge the first 6 patches with no issues, since there aren't any callers of
of_iommu_initwithout patch 7 anyway.Up to you.
I think this looks great overall. My only feedback is the exact same comment that Joerg already made:
Quoted 9 lines · On Friday 28 November 2014 14:03:36 jroedel at suse.de wrote:
Hmm, I don't like the idea of storing private data in
iommu_ops. But given that this is already an improvement we can build on later, here is myAcked-by Joerg Roedel <[email protected]>To further improve this we should probably introduce a seperate iommu-descriptor data-structure later which then describes a single hardware iommu device.
so I second that and add my
Now, who should merge this series? I think someone should put all eight patches into linux-next now, and if something goes wrong with the last two, then we skip them for 3.19.
Arnd
v5 cover Introduce automatic DMA configuration for IOMMU masters
Quoted 35 lines · Arnd Bergmann
Quoted 16 lines · On Friday 28 November 2014 13:29:38 Will Deacon wrote:
Here is v5 of the patches I've previously sent here:
RFCv1: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-August/283023.html
RFCv2: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/283752.html
RFCv3: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-September/287031.html
RFCv4: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-November/302711.htmlChanges since RFCv4 include:
- Dropped the RFC tag, since has been used by a couple of people now
- Dropped the DMA segment configuration from
of_dma_configure, as there appear to be assumptions about 64k segments elsewhere in the kernel- Added acks/tested-bys (thanks to everybody who reviewed the series)
Quoted 7 lines
- A few small fixes for issues found by Marek
Arnd: Is this too late for 3.19? We could merge the first 6 patches with no issues, since there aren't any callers of
of_iommu_initwithout patch 7 anyway.Up to you.
I think this looks great overall. My only feedback is the exact same comment that Joerg already made:
Quoted 6 lines · On Friday 28 November 2014 14:03:36 jroedel at suse.de wrote:
Hmm, I don't like the idea of storing private data in
iommu_ops. But given that this is already an improvement we can build on later, here is myAcked-by Joerg Roedel <[email protected]>
Quoted 7 lines
Quoted 3 lines
To further improve this we should probably introduce a seperate iommu-descriptor data-structure later which then describes a single hardware iommu device.
so I second that and add my
Acked-by Arnd Bergmann <[email protected]>
Yup, I'll take a look at that as part of a separate series, since I really want to have different pgsize_bitmaps anyway.
Quoted 3 lines
Now, who should merge this series? I think someone should put all eight patches into linux-next now, and if something goes wrong with the last two, then we skip them for 3.19.
I think it makes most sense to go via arm-soc, but we'd need rmk's ack on the last two patches.
Russell, are you ok with that plan?
Will