mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Arend van Spriel <arend@broadcom.com>
To: Ming Lei <ming.lei@canonical.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: Sun, 30 Aug 2015 10:25:50 +0200	[thread overview]
Message-ID: <55E2BE0E.1070907@broadcom.com> (raw)
In-Reply-To: <20150829183802.480b1425@tom-T450>

On 08/29/2015 12:38 PM, Ming Lei wrote:
> 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;
> +

Does this mean a built-in driver can not get firmware from initramfs or 
built in the kernel early. Seems a bit too aggressive. The problem 
stated in this thread is when the firmware is not on initramfs but only 
on the rootfs.

Regards,
Arend

>   	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,
>


  reply	other threads:[~2015-08-30  8:26 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     ` 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
2015-08-30  8:25                                 ` Arend van Spriel [this message]
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=55E2BE0E.1070907@broadcom.com \
    --to=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=ming.lei@canonical.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

Powered by JetHome