On Thu, 10 Nov 2022 at 15:36, Marek Szyprowski <m.szyprowski@xxxxxxxxxxx> wrote: [snip] > I've finally made Exynos IOMMU working as a module on Exynos5433 based > TM2e board. It looks that this will be a bit longer journey that I've > initially thought. I've posted a simple update of the fix for the driver > initialization sequence, but the real problem is in the platform driver > framework and OF helpers. > > Basically to get it working as a module I had to apply the following > changes: > > diff --git a/drivers/base/dd.c b/drivers/base/dd.c > index 3dda62503102..f6921f5fcab6 100644 > --- a/drivers/base/dd.c > +++ b/drivers/base/dd.c > @@ -257,7 +257,7 @@ static int deferred_devs_show(struct seq_file *s, > void *data) > DEFINE_SHOW_ATTRIBUTE(deferred_devs); > > #ifdef CONFIG_MODULES > -int driver_deferred_probe_timeout = 10; > +int driver_deferred_probe_timeout = 30; > #else > int driver_deferred_probe_timeout; > #endif > diff --git a/drivers/of/property.c b/drivers/of/property.c > index 967f79b59016..e5df6672fee6 100644 > --- a/drivers/of/property.c > +++ b/drivers/of/property.c > @@ -1384,7 +1384,7 @@ static struct device_node *parse_interrupts(struct > device_node *np, > static const struct supplier_bindings of_supplier_bindings[] = { > { .parse_prop = parse_clocks, }, > { .parse_prop = parse_interconnects, }, > - { .parse_prop = parse_iommus, .optional = true, }, > + { .parse_prop = parse_iommus, }, > { .parse_prop = parse_iommu_maps, .optional = true, }, > { .parse_prop = parse_mboxes, }, > { .parse_prop = parse_io_channels, }, > > Without that a really nasty things happened. > > Initialization of the built-in drivers and loading modules takes time, > so the default 10s deferred probe timeout is not enough to ensure that > the built-in driver won't be probed before the Exynos IOMMU driver is > loaded. > Yeah, the whole time-based sync looks nasty... I remember coming across the slides by Andrzej Hajda called "Deferred Problem" [1], but I guess the proposed solution was never applied. Just hope that increasing the timeout is upstreamable solution. [1] https://events19.linuxfoundation.org/wp-content/uploads/2017/12/Deferred-Problem-Issues-With-Complex-Dependencies-Between-Devices-in-Linux-Kernel-Andrzej-Hajda-Samsung.pdf > The second change fixes the problem that driver core probes Exynos IOMMU > controllers in parallel to probing the master devices, what results in > calling exynos_iommu_of_xlate() and exynos_iommu_probe_device() even on > the partially initialized IOMMU controllers or initializing the dma_ops > under the already probed and working master device. This was easy to > observe especially on the master devices with multiple IOMMU > controllers. I wasn't able to solve this concurrency/race issues inside > the Exynos IOMMU driver. > > Frankly speaking I don't know what is the rationale for making the > 'iommus' property optional, but this simply doesn't work well with IOMMU > driver being a module. CCed Saravana and Rob for this. > The patch which makes 'iommus' optional doesn't provide much of insight on reasons in commit message either. > Without fixing the above issues, I would add a warning that compiling > the driver as a module leads to serious issues. > Nice catch! It doesn't reproduce on my platform, alas. Can I expect you to submit those patches? If so, I'll probably just wait for those to be applied, and then re-send my modularization series on top of it. Does that sounds reasonable? [snip] > > Best regards > -- > Marek Szyprowski, PhD > Samsung R&D Institute Poland >