[alsa-devel] [PATCH v2 0/22] On-demand device probing
Hello,
I have a problem with the panel on my Tegra Chromebook taking longer than expected to be ready during boot (Stéphane Marchesin reported what is basically the same issue in [0]), and have looked into ordered probing as a better way of solving this than moving nodes around in the DT or playing with initcall levels and linking order.
While reading the thread [1] that Alexander Holler started with his series to make probing order deterministic, it occurred to me that it should be possible to achieve the same by probing devices as they are referenced by other devices.
This basically reuses the information that is already implicit in the probe() implementations, saving us from refactoring existing drivers or adding information to DTBs.
During review of v1 of this series Linus Walleij suggested that it should be the device driver core to make sure that dependencies are ready before probing a device. I gave this idea a try [2] but Mark Brown pointed out to the logic duplication between the resource acquisition and dependency discovery code paths (though I think it's fairly minor).
To address that code duplication I experimented with Arnd's devm_probe [3] concept of having drivers declare their dependencies instead of acquiring them during probe, and while it worked [4], I don't think we end up winning anything when compared to just probing devices on-demand from resource getters.
One remaining objection is to the "sprinkling" of calls to fwnode_ensure_device() in the resource getters of each subsystem, but I think it's the right thing to do given that the storage of resources is currently subsystem-specific.
We could avoid the above by moving resource storage into the core, but I don't think there's a compelling case for that.
I have tested this on boards with Tegra, iMX.6, Exynos and OMAP SoCs, and these patches were enough to eliminate all the deferred probes (except one in PandaBoard because omap_dma_system doesn't have a firmware node as of yet).
With this series I get the kernel to output to the panel in 0.5s, instead of 2.8s.
Regards,
Tomeu
[0] http://lists.freedesktop.org/archives/dri-devel/2014-August/066527.html
[1] https://lkml.org/lkml/2014/5/12/452
[2] https://lkml.org/lkml/2015/6/17/305
[3] http://article.gmane.org/gmane.linux.ports.arm.kernel/277689
[4] https://lkml.org/lkml/2015/7/21/441
Changes in v2: - Move delay to platform.c - Use set_primary_fwnode() - Use of_node_full_name() - Move the logic for finding a platform device from its firmware node to of/platform.c as it's not needed for ACPI nodes. - Add acpi_dev_get_device() - Add fwnode_ensure_device() so the mechanism for probing devices on demand is independent of the firmware format. - Acquire regulator device lock before returning from regulator_dev_lookup()
Tomeu Vizoso (22): platform: delay device-driver matches until late_initcall of/platform: Set fwnode field for new devices device property: add fwnode_get_name() of/platform: add of_platform_device_find() ACPI: add acpi_dev_get_device() device property: add fwnode_ensure_device() gpio: Probe GPIO drivers on demand gpio: Probe pinctrl devices on demand regulator: core: Reduce critical area in _regulator_get regulator: core: Probe regulators on demand drm: Probe panels on demand drm/tegra: Probe dpaux devices on demand i2c: core: Probe i2c master devices on demand pwm: Probe PWM chip devices on demand backlight: Probe backlight devices on demand usb: phy: Probe phy devices on demand clk: Probe clk providers on demand pinctrl: Probe pinctrl devices on demand phy: core: Probe phy providers on demand dma: of: Probe DMA controllers on demand power-supply: Probe power supplies on demand ASoC: core: Probe components on demand
drivers/base/platform.c | 28 +++++++++++ drivers/base/property.c | 73 +++++++++++++++++++++++++++ drivers/clk/clk.c | 3 ++ drivers/dma/of-dma.c | 2 + drivers/gpio/gpiolib-of.c | 4 ++ drivers/gpu/drm/drm_panel.c | 2 + drivers/gpu/drm/tegra/dpaux.c | 2 + drivers/i2c/i2c-core.c | 2 + drivers/of/platform.c | 61 +++++++++++++++++++++++ drivers/phy/phy-core.c | 2 + drivers/pinctrl/devicetree.c | 1 + drivers/power/power_supply_core.c | 2 + drivers/pwm/core.c | 2 + drivers/regulator/core.c | 99 +++++++++++++++++++++---------------- drivers/usb/phy/phy.c | 2 + drivers/video/backlight/backlight.c | 2 + include/linux/acpi.h | 10 ++++ include/linux/of_platform.h | 1 + include/linux/property.h | 4 ++ sound/soc/soc-core.c | 6 ++- 20 files changed, 264 insertions(+), 44 deletions(-)
When looking up a component through its firmware node, probe it if it hasn't already.
The goal is to reduce deferred probes to a minimum, as it makes it very cumbersome to find out why a device failed to probe, and can introduce very big delays in when a critical device is probed.
Signed-off-by: Tomeu Vizoso tomeu.vizoso@collabora.com ---
Changes in v2: None
sound/soc/soc-core.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c index c81aec9c872a..4c55da97f9ed 100644 --- a/sound/soc/soc-core.c +++ b/sound/soc/soc-core.c @@ -865,10 +865,12 @@ static const struct snd_soc_dai_ops null_dai_ops = { };
static struct snd_soc_component *soc_find_component( - const struct device_node *of_node, const char *name) + struct device_node *of_node, const char *name) { struct snd_soc_component *component;
+ fwnode_ensure_device(&of_node->fwnode); + lockdep_assert_held(&client_mutex);
list_for_each_entry(component, &component_list, list) { @@ -890,6 +892,8 @@ static struct snd_soc_dai *snd_soc_find_dai( struct snd_soc_dai *dai; struct device_node *component_of_node;
+ fwnode_ensure_device(&dlc->of_node->fwnode); + lockdep_assert_held(&client_mutex);
/* Find CPU DAI from registered DAIs*/
On Tuesday, July 28, 2015 03:19:31 PM Tomeu Vizoso wrote:
Hello,
I have a problem with the panel on my Tegra Chromebook taking longer than expected to be ready during boot (Stéphane Marchesin reported what is basically the same issue in [0]), and have looked into ordered probing as a better way of solving this than moving nodes around in the DT or playing with initcall levels and linking order.
While reading the thread [1] that Alexander Holler started with his series to make probing order deterministic, it occurred to me that it should be possible to achieve the same by probing devices as they are referenced by other devices.
This basically reuses the information that is already implicit in the probe() implementations, saving us from refactoring existing drivers or adding information to DTBs.
During review of v1 of this series Linus Walleij suggested that it should be the device driver core to make sure that dependencies are ready before probing a device. I gave this idea a try [2] but Mark Brown pointed out to the logic duplication between the resource acquisition and dependency discovery code paths (though I think it's fairly minor).
To address that code duplication I experimented with Arnd's devm_probe [3] concept of having drivers declare their dependencies instead of acquiring them during probe, and while it worked [4], I don't think we end up winning anything when compared to just probing devices on-demand from resource getters.
One remaining objection is to the "sprinkling" of calls to fwnode_ensure_device() in the resource getters of each subsystem, but I think it's the right thing to do given that the storage of resources is currently subsystem-specific.
We could avoid the above by moving resource storage into the core, but I don't think there's a compelling case for that.
I have tested this on boards with Tegra, iMX.6, Exynos and OMAP SoCs, and these patches were enough to eliminate all the deferred probes (except one in PandaBoard because omap_dma_system doesn't have a firmware node as of yet).
With this series I get the kernel to output to the panel in 0.5s, instead of 2.8s.
Can you trim your CC list somewhat, please?
I'm definitely going to look at this, but not before then next week. Sorry about that.
Thanks, Rafael
On Tue, Jul 28, 2015 at 8:19 AM, Tomeu Vizoso tomeu.vizoso@collabora.com wrote:
Hello,
I have a problem with the panel on my Tegra Chromebook taking longer than expected to be ready during boot (Stéphane Marchesin reported what is basically the same issue in [0]), and have looked into ordered probing as a better way of solving this than moving nodes around in the DT or playing with initcall levels and linking order.
While reading the thread [1] that Alexander Holler started with his series to make probing order deterministic, it occurred to me that it should be possible to achieve the same by probing devices as they are referenced by other devices.
This basically reuses the information that is already implicit in the probe() implementations, saving us from refactoring existing drivers or adding information to DTBs.
During review of v1 of this series Linus Walleij suggested that it should be the device driver core to make sure that dependencies are ready before probing a device. I gave this idea a try [2] but Mark Brown pointed out to the logic duplication between the resource acquisition and dependency discovery code paths (though I think it's fairly minor).
To address that code duplication I experimented with Arnd's devm_probe [3] concept of having drivers declare their dependencies instead of acquiring them during probe, and while it worked [4], I don't think we end up winning anything when compared to just probing devices on-demand from resource getters.
One remaining objection is to the "sprinkling" of calls to fwnode_ensure_device() in the resource getters of each subsystem, but I think it's the right thing to do given that the storage of resources is currently subsystem-specific.
Seems like a minor change to me.
We could avoid the above by moving resource storage into the core, but I don't think there's a compelling case for that.
I have tested this on boards with Tegra, iMX.6, Exynos and OMAP SoCs, and these patches were enough to eliminate all the deferred probes (except one in PandaBoard because omap_dma_system doesn't have a firmware node as of yet).
With this series I get the kernel to output to the panel in 0.5s, instead of 2.8s.
Generally, I think this looks pretty good. It is simple and the error path is simply falling back to deferred probe.
One overall comment is I'm not so sure if fwnode_ensure_device shouldn't just be of_ensure_device. At least currently, it looks like all the calling locations are DT specific functions anyway. There's very little logic within the function to really benefit sharing with ACPI. It is basically just a call to of_platform_device_find and then bus_probe_device. I expect the get functions will always call into DT/ACPI specific functions which can then call the firmware specific device find function.
Rob
On 30 July 2015 at 05:06, Rob Herring robherring2@gmail.com wrote:
On Tue, Jul 28, 2015 at 8:19 AM, Tomeu Vizoso tomeu.vizoso@collabora.com wrote:
Hello,
I have a problem with the panel on my Tegra Chromebook taking longer than expected to be ready during boot (Stéphane Marchesin reported what is basically the same issue in [0]), and have looked into ordered probing as a better way of solving this than moving nodes around in the DT or playing with initcall levels and linking order.
While reading the thread [1] that Alexander Holler started with his series to make probing order deterministic, it occurred to me that it should be possible to achieve the same by probing devices as they are referenced by other devices.
This basically reuses the information that is already implicit in the probe() implementations, saving us from refactoring existing drivers or adding information to DTBs.
During review of v1 of this series Linus Walleij suggested that it should be the device driver core to make sure that dependencies are ready before probing a device. I gave this idea a try [2] but Mark Brown pointed out to the logic duplication between the resource acquisition and dependency discovery code paths (though I think it's fairly minor).
To address that code duplication I experimented with Arnd's devm_probe [3] concept of having drivers declare their dependencies instead of acquiring them during probe, and while it worked [4], I don't think we end up winning anything when compared to just probing devices on-demand from resource getters.
One remaining objection is to the "sprinkling" of calls to fwnode_ensure_device() in the resource getters of each subsystem, but I think it's the right thing to do given that the storage of resources is currently subsystem-specific.
Seems like a minor change to me.
We could avoid the above by moving resource storage into the core, but I don't think there's a compelling case for that.
I have tested this on boards with Tegra, iMX.6, Exynos and OMAP SoCs, and these patches were enough to eliminate all the deferred probes (except one in PandaBoard because omap_dma_system doesn't have a firmware node as of yet).
With this series I get the kernel to output to the panel in 0.5s, instead of 2.8s.
Generally, I think this looks pretty good. It is simple and the error path is simply falling back to deferred probe.
One overall comment is I'm not so sure if fwnode_ensure_device shouldn't just be of_ensure_device. At least currently, it looks like all the calling locations are DT specific functions anyway. There's very little logic within the function to really benefit sharing with ACPI. It is basically just a call to of_platform_device_find and then bus_probe_device. I expect the get functions will always call into DT/ACPI specific functions which can then call the firmware specific device find function.
That's fine with me. I just went that way because I assumed the plan was for subsystems to move to consume fw data through fwnode and drop as much fw-specific code as possible.
But I have just looked at fwnode_get_named_gpiod and the OF and ACPI code paths are so dissimilar that I guess that's not so and would be better to do as you say.
Thanks,
Tomeu
participants (3)
-
Rafael J. Wysocki
-
Rob Herring
-
Tomeu Vizoso