of: iommu: make of_iommu_init() postcore_initcall_sync
The of_iommu_init() is called multiple times by arch code, make it postcore_initcall_sync, then we can drop relevant calls fully. Note, the IOMMUs should have a chance to perform some basic initialisation before we start adding masters to them. So postcore_initcall_sync is good choice, it ensures of_iommu_init() called before of_platform_populate. Acked-by: Rich Felker <dalias@libc.org> Tested-by: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Rich Felker <dalias@libc.org> Cc: Rob Herring <robh+dt@kernel.org> Cc: Robin Murphy <robin.murphy@arm.com> Cc: Will Deacon <will.deacon@arm.com> Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com> Acked-by: Joerg Roedel <jroedel@suse.de> Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
parent
5edb56491d
commit
bb8e15d604
|
@ -19,7 +19,6 @@
|
||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/screen_info.h>
|
#include <linux/screen_info.h>
|
||||||
#include <linux/of_iommu.h>
|
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
@ -903,7 +902,6 @@ static int __init customize_machine(void)
|
||||||
* machine from the device tree, if no callback is provided,
|
* machine from the device tree, if no callback is provided,
|
||||||
* otherwise we would always need an init_machine callback.
|
* otherwise we would always need an init_machine callback.
|
||||||
*/
|
*/
|
||||||
of_iommu_init();
|
|
||||||
if (machine_desc->init_machine)
|
if (machine_desc->init_machine)
|
||||||
machine_desc->init_machine();
|
machine_desc->init_machine();
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/of_iommu.h>
|
|
||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/efi.h>
|
#include <linux/efi.h>
|
||||||
|
@ -305,7 +304,6 @@ void __init setup_arch(char **cmdline_p)
|
||||||
static int __init arm64_device_init(void)
|
static int __init arm64_device_init(void)
|
||||||
{
|
{
|
||||||
if (of_have_populated_dt()) {
|
if (of_have_populated_dt()) {
|
||||||
of_iommu_init();
|
|
||||||
of_platform_populate(NULL, of_default_bus_match_table,
|
of_platform_populate(NULL, of_default_bus_match_table,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
} else if (acpi_disabled) {
|
} else if (acpi_disabled) {
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/of_fdt.h>
|
#include <linux/of_fdt.h>
|
||||||
#include <linux/of_iommu.h>
|
|
||||||
#include <linux/clocksource.h>
|
#include <linux/clocksource.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/clk-provider.h>
|
#include <linux/clk-provider.h>
|
||||||
|
@ -185,7 +184,6 @@ static int __init sh_of_device_init(void)
|
||||||
{
|
{
|
||||||
pr_info("SH generic board support: populating platform devices\n");
|
pr_info("SH generic board support: populating platform devices\n");
|
||||||
if (of_have_populated_dt()) {
|
if (of_have_populated_dt()) {
|
||||||
of_iommu_init();
|
|
||||||
of_platform_populate(NULL, of_default_bus_match_table,
|
of_platform_populate(NULL, of_default_bus_match_table,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -174,7 +174,7 @@ err_put_node:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init of_iommu_init(void)
|
static int __init of_iommu_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
const struct of_device_id *match, *matches = &__iommu_of_table;
|
const struct of_device_id *match, *matches = &__iommu_of_table;
|
||||||
|
@ -186,4 +186,7 @@ void __init of_iommu_init(void)
|
||||||
pr_err("Failed to initialise IOMMU %s\n",
|
pr_err("Failed to initialise IOMMU %s\n",
|
||||||
of_node_full_name(np));
|
of_node_full_name(np));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
postcore_initcall_sync(of_iommu_init);
|
||||||
|
|
|
@ -11,7 +11,6 @@ extern int of_get_dma_window(struct device_node *dn, const char *prefix,
|
||||||
int index, unsigned long *busno, dma_addr_t *addr,
|
int index, unsigned long *busno, dma_addr_t *addr,
|
||||||
size_t *size);
|
size_t *size);
|
||||||
|
|
||||||
extern void of_iommu_init(void);
|
|
||||||
extern const struct iommu_ops *of_iommu_configure(struct device *dev,
|
extern const struct iommu_ops *of_iommu_configure(struct device *dev,
|
||||||
struct device_node *master_np);
|
struct device_node *master_np);
|
||||||
|
|
||||||
|
@ -24,7 +23,6 @@ static inline int of_get_dma_window(struct device_node *dn, const char *prefix,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void of_iommu_init(void) { }
|
|
||||||
static inline const struct iommu_ops *of_iommu_configure(struct device *dev,
|
static inline const struct iommu_ops *of_iommu_configure(struct device *dev,
|
||||||
struct device_node *master_np)
|
struct device_node *master_np)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue