From: Ming Lei <ming.lei@canonical.com>
To: Arend van Spriel <arend@broadcom.com>
Cc: Takashi Iwai <tiwai@suse.de>,
"Luis R. Rodriguez" <mcgrof@suse.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Liam Girdwood <liam.r.girdwood@linux.intel.com>,
"Jie, Yang" <yang.jie@intel.com>,
"Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
"joonas.lahtinen@linux.intel.com"
<joonas.lahtinen@linux.intel.com>, Tom Gundersen <teg@jklm.no>,
Al Viro <viro@zeniv.linux.org.uk>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Kay Sievers <kay@vrfy.org>, David Woodhouse <dwmw2@infradead.org>,
"Luis Rodriguez" <mcgrof@do-not-panic.com>,
lkml <linux-kernel@vger.kernel.org>,
yalin wang <yalin.wang2010@gmail.com>,
tom.leiming@gmail.com
Subject: Re: Problems loading firmware using built-in drivers with kernels that use initramfs.
Date: Sat, 29 Aug 2015 18:38:02 +0800 [thread overview]
Message-ID: <20150829183802.480b1425@tom-T450> (raw)
In-Reply-To: <55E1724E.6040303@broadcom.com>
On Sat, 29 Aug 2015 10:50:22 +0200
Arend van Spriel <arend@broadcom.com> wrote:
> On 08/29/2015 09:11 AM, Takashi Iwai wrote:
> > On Sat, 29 Aug 2015 06:09:01 +0200,
> > Ming Lei wrote:
> >>
> >> On Sat, Aug 29, 2015 at 9:11 AM, Luis R. Rodriguez <mcgrof@suse.com> wrote:
> >>> On Thu, Aug 27, 2015 at 08:55:13AM +0800, Ming Lei wrote:
> >>>> On Thu, Aug 27, 2015 at 2:07 AM, Linus Torvalds
> >>>> <torvalds@linux-foundation.org> wrote:
> >>>>> On Wed, Aug 26, 2015 at 1:06 AM, Liam Girdwood
> >>>>> <liam.r.girdwood@linux.intel.com> wrote:
> >>>>>>
> >>>>>> I think the options are to either :-
> >>>>>>
> >>>>>> 1) Don not support audio DSP drivers using topology data as built-in
> >>>>>> drivers. Audio is not really a critical system required for booting
> >>>>>> anyway.
> >>>>>
> >>>>> Yes, forcing it to be a module and not letting people compile it in by
> >>>>> mistake (and then not have it work) is an option.
> >>>>>
> >>>>> That said, there are situations where people don't want to use
> >>>>> modules. I used to eschew them for security reasons, for example - now
> >>>>> I instead just do a one-time temporary key. But others may have other
> >>>>> reasons to try to avoid modules.
> >>>>>
> >>>>>> 2) Create a default PCM for every driver that has topology data on the
> >>>>>> assumption that every sound card will at least 1 PCM. This PCM can then
> >>>>>> be re-configured when the FW is loaded.
> >>>>>
> >>>>> That would seem to be the better option if it is reasonably implementable.
> >>>>>
> >>>>> Of course, some kind of timer-based retry (limited *somehow*) of the
> >>>>> fw loading could work too, but smells really really hacky.
> >>>>
> >>>> Yeah, years ago, we discussed to use -EPROBE_DEFER for the situation,
> >>>> which should be one kind of fix, but looks there were objections at that time.
> >>>
> >>> That would still be a hack. I'll note there is also asynchronous probe support
> >>> now but to use that would also be a hack for this issue. We don't want to
> >>
> >> If we think firmware as one kind of resources like regulators, gpio and others,
> >> PROBE_DEFER is one good match for firmware loading case, and
> >> it has been used by lots of drivers, so why can't it be used for
> >> firmware loading?
> >>
> >> One problem is that we need to convert drivers into returning -EPROBE_DEFER
> >> in case of request failure, and that may involve some work, but which
> >> should be mechanical.
> >
> > I find such a delaying mechanism not so bad, too. It's very
> > straightforward, at least, no big pain in the transition in the driver
> > side.
>
> Not sure how this is going to work with request_firmware_nowait(). We
> use that in our drivers to get rid of ~60 sec. delay in probe and
> consequently boot time when built-in. So basically we return 0 on probe
> lacking better knowledge. Guess we can always move back to
> request_firmware calls when defer_probe support is available.
How about the following untested draft patch?
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index be0eb46..f66912f 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -171,6 +171,12 @@ static void driver_deferred_probe_trigger(void)
queue_work(deferred_wq, &deferred_probe_work);
}
+void driver_trigger_fw_load()
+{
+ driver_deferred_probe_trigger();
+}
+EXPORT_SYMBOL_GPL(driver_trigger_fw_load);
+
/**
* deferred_probe_initcall() - Enable probing of deferred devices
*
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c
index 8524450..f879a07 100644
--- a/drivers/base/firmware_class.c
+++ b/drivers/base/firmware_class.c
@@ -1132,6 +1132,11 @@ _request_firmware(const struct firmware **firmware_p, const char *name,
if (ret <= 0) /* error or already assigned */
goto out;
+ if (system_state == SYSTEM_BOOTING) {
+ ret = -EPROBE_DEFER;
+ goto out;
+ }
+
ret = 0;
timeout = firmware_loading_timeout();
if (opt_flags & FW_OPT_NOWAIT) {
@@ -1311,6 +1316,9 @@ request_firmware_nowait(
{
struct firmware_work *fw_work;
+ if (system_state == SYSTEM_BOOTING)
+ return -EPROBE_DEFER;
+
fw_work = kzalloc(sizeof(struct firmware_work), gfp);
if (!fw_work)
return -ENOMEM;
diff --git a/include/linux/device.h b/include/linux/device.h
index 5d7bc63..1c189fe 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -289,6 +289,7 @@ extern struct device_driver *driver_find(const char *name,
struct bus_type *bus);
extern int driver_probe_done(void);
extern void wait_for_device_probe(void);
+extern void driver_trigger_fw_load(void);
/* sysfs interface for exporting driver attributes */
diff --git a/init/main.c b/init/main.c
index 9e64d70..be8411b 100644
--- a/init/main.c
+++ b/init/main.c
@@ -943,6 +943,9 @@ static int __ref kernel_init(void *unused)
flush_delayed_fput();
+ /* trigger probe for request_firmware and its no_wait pair */
+ driver_trigger_fw_load();
+
if (ramdisk_execute_command) {
ret = run_init_process(ramdisk_execute_command);
if (!ret)
Thanks,
next prev parent reply other threads:[~2015-08-29 10:38 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1440449403.2469.35.camel@loki>
[not found] ` <1440489900.2419.4.camel@loki>
[not found] ` <rbhuamrc6ajy3l1qereb60l8.1440494220682@email.android.com>
2015-08-25 19:34 ` Problems loading firmware using built-in drivers with kernels that use initramfs Luis R. Rodriguez
2015-08-25 19:46 ` Takashi Iwai
2015-08-25 19:58 ` Dmitry Torokhov
2015-08-25 20:26 ` Linus Torvalds
2015-08-26 5:30 ` yalin wang
2015-08-26 5:12 ` Jie, Yang
2015-08-26 5:32 ` Takashi Iwai
2015-08-26 6:17 ` Jie, Yang
2015-08-26 8:06 ` Liam Girdwood
2015-08-26 8:29 ` Jie, Yang
2015-08-26 9:00 ` Liam Girdwood
2015-08-27 1:50 ` Lin, Mengdong
2015-08-27 7:09 ` Liam Girdwood
2015-08-26 18:07 ` Linus Torvalds
2015-08-27 0:55 ` Ming Lei
2015-08-29 1:11 ` Luis R. Rodriguez
2015-08-29 4:09 ` Ming Lei
2015-08-29 7:11 ` Takashi Iwai
2015-08-29 8:50 ` Arend van Spriel
2015-08-29 10:38 ` Ming Lei [this message]
2015-08-30 8:25 ` Arend van Spriel
2015-08-30 18:11 ` Linus Torvalds
2015-12-17 19:24 ` Luis R. Rodriguez
2015-08-31 14:21 ` Ming Lei
2015-09-02 1:19 ` Luis R. Rodriguez
2015-09-02 12:09 ` Arend van Spriel
2015-09-02 12:13 ` Arend van Spriel
2015-09-02 18:58 ` Luis R. Rodriguez
2015-09-02 21:03 ` Arend van Spriel
2015-09-02 23:13 ` Dmitry Torokhov
2015-09-02 23:22 ` Luis R. Rodriguez
2015-09-02 23:29 ` Dmitry Torokhov
2015-09-02 23:46 ` Luis R. Rodriguez
2015-09-03 17:23 ` Arend van Spriel
2015-09-03 17:33 ` Dmitry Torokhov
2015-10-16 19:35 ` Luis R. Rodriguez
2015-10-16 21:05 ` Luis R. Rodriguez
2015-10-17 8:31 ` Arend van Spriel
2015-09-02 20:43 ` Dmitry Torokhov
2015-09-02 0:39 ` Luis R. Rodriguez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150829183802.480b1425@tom-T450 \
--to=ming.lei@canonical.com \
--cc=arend@broadcom.com \
--cc=dmitry.torokhov@gmail.com \
--cc=dwmw2@infradead.org \
--cc=gregkh@linuxfoundation.org \
--cc=joonas.lahtinen@linux.intel.com \
--cc=kay@vrfy.org \
--cc=liam.r.girdwood@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mcgrof@do-not-panic.com \
--cc=mcgrof@suse.com \
--cc=teg@jklm.no \
--cc=tiwai@suse.de \
--cc=tom.leiming@gmail.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
--cc=yalin.wang2010@gmail.com \
--cc=yang.jie@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox