Message ID | 1415830124-28787-3-git-send-email-hdegoede@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Nov 12, 2014 at 11:08:43PM +0100, Hans de Goede wrote: > One of the reasons for having the simplefb nodes in /chosen, and doing > explicit enumeration of the nodes there, is too allow enumerating them sooner, > so that we get a console earlier on. > > Doing this earlier then fs_initcall is not useful, since the fb only turns into > a console when fbcon intializes, which is a fs_initcall too. > > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- > drivers/video/fbdev/simplefb.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c > index be7d288..8c0c972 100644 > --- a/drivers/video/fbdev/simplefb.c > +++ b/drivers/video/fbdev/simplefb.c > @@ -415,7 +415,11 @@ static void __exit simplefb_exit(void) > platform_driver_unregister(&simplefb_driver); > } > > -module_init(simplefb_init); > +/* > + * While this can be a module, if builtin it's most likely the console > + * So let's leave module_exit but move module_init to an earlier place > + */ Not really related to this patch itself, but do we want to support simplefb as a module? It seems like it's going to be most of the time broken. Maxime
Hi Maxime, On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard <maxime.ripard@free-electrons.com> wrote: >> -module_init(simplefb_init); >> +/* >> + * While this can be a module, if builtin it's most likely the console >> + * So let's leave module_exit but move module_init to an earlier place >> + */ > > Not really related to this patch itself, but do we want to support > simplefb as a module? It seems like it's going to be most of the time > broken. If it depends on clocks, it won't work as a module, as CCF will have disabled all unused clocks at that point. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On 11/13/2014 09:52 AM, Maxime Ripard wrote: > On Wed, Nov 12, 2014 at 11:08:43PM +0100, Hans de Goede wrote: >> One of the reasons for having the simplefb nodes in /chosen, and doing >> explicit enumeration of the nodes there, is too allow enumerating them sooner, >> so that we get a console earlier on. >> >> Doing this earlier then fs_initcall is not useful, since the fb only turns into >> a console when fbcon intializes, which is a fs_initcall too. >> >> Signed-off-by: Hans de Goede <hdegoede@redhat.com> >> --- >> drivers/video/fbdev/simplefb.c | 6 +++++- >> 1 file changed, 5 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c >> index be7d288..8c0c972 100644 >> --- a/drivers/video/fbdev/simplefb.c >> +++ b/drivers/video/fbdev/simplefb.c >> @@ -415,7 +415,11 @@ static void __exit simplefb_exit(void) >> platform_driver_unregister(&simplefb_driver); >> } >> >> -module_init(simplefb_init); >> +/* >> + * While this can be a module, if builtin it's most likely the console >> + * So let's leave module_exit but move module_init to an earlier place >> + */ > > Not really related to this patch itself, but do we want to support > simplefb as a module? It seems like it's going to be most of the time > broken. A valid point, my mean reasoning here is that some may see not being able to use it as a module as a regression, so I just kept things as is, but I do agree that it is advisable to just build it in. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Nov 13, 2014 at 9:24 AM, Hans de Goede <hdegoede@redhat.com> wrote: > Hi, > > On 11/13/2014 09:52 AM, Maxime Ripard wrote: >> On Wed, Nov 12, 2014 at 11:08:43PM +0100, Hans de Goede wrote: >>> One of the reasons for having the simplefb nodes in /chosen, and doing >>> explicit enumeration of the nodes there, is too allow enumerating them sooner, >>> so that we get a console earlier on. >>> >>> Doing this earlier then fs_initcall is not useful, since the fb only turns into >>> a console when fbcon intializes, which is a fs_initcall too. >>> >>> Signed-off-by: Hans de Goede <hdegoede@redhat.com> >>> --- >>> drivers/video/fbdev/simplefb.c | 6 +++++- >>> 1 file changed, 5 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c >>> index be7d288..8c0c972 100644 >>> --- a/drivers/video/fbdev/simplefb.c >>> +++ b/drivers/video/fbdev/simplefb.c >>> @@ -415,7 +415,11 @@ static void __exit simplefb_exit(void) >>> platform_driver_unregister(&simplefb_driver); >>> } >>> >>> -module_init(simplefb_init); >>> +/* >>> + * While this can be a module, if builtin it's most likely the console >>> + * So let's leave module_exit but move module_init to an earlier place >>> + */ >> >> Not really related to this patch itself, but do we want to support >> simplefb as a module? It seems like it's going to be most of the time >> broken. > > A valid point, my mean reasoning here is that some may see not being able to > use it as a module as a regression, so I just kept things as is, but I do > agree that it is advisable to just build it in. Like a lot of things, if it is made a modules, and it breaks for the user, the user gets to keep the pieces. There are potentially some valid scenarios where it is fine to have it as a module. I don't recommend changing this unless is actually starts causing problems. g. -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Nov 13, 2014 at 10:29 AM, Grant Likely <grant.likely@linaro.org> wrote: > On Thu, Nov 13, 2014 at 9:24 AM, Hans de Goede <hdegoede@redhat.com> wrote: >> Hi, >> >> On 11/13/2014 09:52 AM, Maxime Ripard wrote: >>> On Wed, Nov 12, 2014 at 11:08:43PM +0100, Hans de Goede wrote: >>>> One of the reasons for having the simplefb nodes in /chosen, and doing >>>> explicit enumeration of the nodes there, is too allow enumerating them sooner, >>>> so that we get a console earlier on. >>>> >>>> Doing this earlier then fs_initcall is not useful, since the fb only turns into >>>> a console when fbcon intializes, which is a fs_initcall too. >>>> >>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com> >>>> --- >>>> drivers/video/fbdev/simplefb.c | 6 +++++- >>>> 1 file changed, 5 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c >>>> index be7d288..8c0c972 100644 >>>> --- a/drivers/video/fbdev/simplefb.c >>>> +++ b/drivers/video/fbdev/simplefb.c >>>> @@ -415,7 +415,11 @@ static void __exit simplefb_exit(void) >>>> platform_driver_unregister(&simplefb_driver); >>>> } >>>> >>>> -module_init(simplefb_init); >>>> +/* >>>> + * While this can be a module, if builtin it's most likely the console >>>> + * So let's leave module_exit but move module_init to an earlier place >>>> + */ >>> >>> Not really related to this patch itself, but do we want to support >>> simplefb as a module? It seems like it's going to be most of the time >>> broken. >> >> A valid point, my mean reasoning here is that some may see not being able to >> use it as a module as a regression, so I just kept things as is, but I do >> agree that it is advisable to just build it in. > > Like a lot of things, if it is made a modules, and it breaks for the > user, the user gets to keep the pieces. There are potentially some > valid scenarios where it is fine to have it as a module. I don't > recommend changing this unless is actually starts causing problems. I assume that you've tested this and it actually makes a difference, correct? If so, Acked-by: Grant Likely <grant.likely@linaro.org> -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Nov 13, 2014 at 10:29:52AM +0000, Grant Likely wrote: > On Thu, Nov 13, 2014 at 9:24 AM, Hans de Goede <hdegoede@redhat.com> wrote: > > On 11/13/2014 09:52 AM, Maxime Ripard wrote: > >>> +/* > >>> + * While this can be a module, if builtin it's most likely the console > >>> + * So let's leave module_exit but move module_init to an earlier place > >>> + */ > >> > >> Not really related to this patch itself, but do we want to support > >> simplefb as a module? It seems like it's going to be most of the time > >> broken. > > > > A valid point, my mean reasoning here is that some may see not being able to > > use it as a module as a regression, so I just kept things as is, but I do > > agree that it is advisable to just build it in. > > Like a lot of things, if it is made a modules, and it breaks for the > user, the user gets to keep the pieces. There are potentially some > valid scenarios where it is fine to have it as a module. I don't > recommend changing this unless is actually starts causing problems. I don't really agree here. If it's broken because the clocks, reset, memory, or whatever resource has been reclaimed by the kernel before the module even had a chance to probe, the only thing that the user will get is that there's no chance it's ever going to work, and that it's just unreliable. If we know that it's going to break, and that there's no way it can be reliable (as in on all the SoCs reliable), keeping it as a module is just asking for trouble. Maxime
Hi, On 11/13/2014 11:31 AM, Grant Likely wrote: > On Thu, Nov 13, 2014 at 10:29 AM, Grant Likely <grant.likely@linaro.org> wrote: >> On Thu, Nov 13, 2014 at 9:24 AM, Hans de Goede <hdegoede@redhat.com> wrote: >>> Hi, >>> >>> On 11/13/2014 09:52 AM, Maxime Ripard wrote: >>>> On Wed, Nov 12, 2014 at 11:08:43PM +0100, Hans de Goede wrote: >>>>> One of the reasons for having the simplefb nodes in /chosen, and doing >>>>> explicit enumeration of the nodes there, is too allow enumerating them sooner, >>>>> so that we get a console earlier on. >>>>> >>>>> Doing this earlier then fs_initcall is not useful, since the fb only turns into >>>>> a console when fbcon intializes, which is a fs_initcall too. >>>>> >>>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com> >>>>> --- >>>>> drivers/video/fbdev/simplefb.c | 6 +++++- >>>>> 1 file changed, 5 insertions(+), 1 deletion(-) >>>>> >>>>> diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c >>>>> index be7d288..8c0c972 100644 >>>>> --- a/drivers/video/fbdev/simplefb.c >>>>> +++ b/drivers/video/fbdev/simplefb.c >>>>> @@ -415,7 +415,11 @@ static void __exit simplefb_exit(void) >>>>> platform_driver_unregister(&simplefb_driver); >>>>> } >>>>> >>>>> -module_init(simplefb_init); >>>>> +/* >>>>> + * While this can be a module, if builtin it's most likely the console >>>>> + * So let's leave module_exit but move module_init to an earlier place >>>>> + */ >>>> >>>> Not really related to this patch itself, but do we want to support >>>> simplefb as a module? It seems like it's going to be most of the time >>>> broken. >>> >>> A valid point, my mean reasoning here is that some may see not being able to >>> use it as a module as a regression, so I just kept things as is, but I do >>> agree that it is advisable to just build it in. >> >> Like a lot of things, if it is made a modules, and it breaks for the >> user, the user gets to keep the pieces. There are potentially some >> valid scenarios where it is fine to have it as a module. I don't >> recommend changing this unless is actually starts causing problems. > > I assume that you've tested this and it actually makes a difference, > correct? If so, > > Acked-by: Grant Likely <grant.likely@linaro.org> Yes I've tested the entire set on 4 boards / 4 SoCs (A10, A10s, A20 and A31), and yes it makes a difference. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: > Hi Maxime, > > On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard > <maxime.ripard@free-electrons.com> wrote: > >> -module_init(simplefb_init); > >> +/* > >> + * While this can be a module, if builtin it's most likely the console > >> + * So let's leave module_exit but move module_init to an earlier place > >> + */ > > > > Not really related to this patch itself, but do we want to support > > simplefb as a module? It seems like it's going to be most of the time > > broken. > > If it depends on clocks, it won't work as a module, as CCF will have disabled > all unused clocks at that point. If it does depend on anything beyond clocks it won't work at all. Clocks are special because they get set up very early at boot time. If it turns out that a simplefb ever needs a regulator to remain on, and that's even quite likely to happen eventually, it's going to fail miserably, because those regulators will typically be provided by a PMIC on an I2C bus. The regulator won't be registered until very late into the boot process and a regulator_get() call will almost certainly cause the simplefb driver to defer probing. Now deferring probing is a real showstopper for simplefb, because not only does it make the framebuffer useless as early boot console, once probing is attempted again the clocks that it would have needed to acquire to keep going will already have been switched off, too. Thierry
Hi, On 11/18/2014 11:19 AM, Thierry Reding wrote: > On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: >> Hi Maxime, >> >> On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard >> <maxime.ripard@free-electrons.com> wrote: >>>> -module_init(simplefb_init); >>>> +/* >>>> + * While this can be a module, if builtin it's most likely the console >>>> + * So let's leave module_exit but move module_init to an earlier place >>>> + */ >>> >>> Not really related to this patch itself, but do we want to support >>> simplefb as a module? It seems like it's going to be most of the time >>> broken. >> >> If it depends on clocks, it won't work as a module, as CCF will have disabled >> all unused clocks at that point. > > If it does depend on anything beyond clocks it won't work at all. Clocks > are special because they get set up very early at boot time. If it turns > out that a simplefb ever needs a regulator to remain on, and that's even > quite likely to happen eventually, it's going to fail miserably, because > those regulators will typically be provided by a PMIC on an I2C bus. The > regulator won't be registered until very late into the boot process and > a regulator_get() call will almost certainly cause the simplefb driver > to defer probing. Right, this has been discussed already and the plan is to have simplefb continue its probe function and return success from it if it encounters any -eprobe_defer errors, while tracking which resources it misses. And then have a late_initcall which will claim any resources which failed with -eprobe beforehand. > Now deferring probing is a real showstopper for simplefb, because not > only does it make the framebuffer useless as early boot console, once > probing is attempted again the clocks that it would have needed to > acquire to keep going will already have been switched off, too. That is not true, even with the current implementation, if all necessary drivers are built in, then simplefb will come up later, but it will still come up before the late_initcall which disables the clocks. Once we do the split probing described above (which is something which we plan to do when it becomes necessary), then simplefb will still come up early. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Nov 18, 2014 at 12:01:08PM +0100, Hans de Goede wrote: > Hi, > > On 11/18/2014 11:19 AM, Thierry Reding wrote: > > On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: > >> Hi Maxime, > >> > >> On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard > >> <maxime.ripard@free-electrons.com> wrote: > >>>> -module_init(simplefb_init); > >>>> +/* > >>>> + * While this can be a module, if builtin it's most likely the console > >>>> + * So let's leave module_exit but move module_init to an earlier place > >>>> + */ > >>> > >>> Not really related to this patch itself, but do we want to support > >>> simplefb as a module? It seems like it's going to be most of the time > >>> broken. > >> > >> If it depends on clocks, it won't work as a module, as CCF will have disabled > >> all unused clocks at that point. > > > > If it does depend on anything beyond clocks it won't work at all. Clocks > > are special because they get set up very early at boot time. If it turns > > out that a simplefb ever needs a regulator to remain on, and that's even > > quite likely to happen eventually, it's going to fail miserably, because > > those regulators will typically be provided by a PMIC on an I2C bus. The > > regulator won't be registered until very late into the boot process and > > a regulator_get() call will almost certainly cause the simplefb driver > > to defer probing. > > Right, this has been discussed already and the plan is to have simplefb > continue its probe function and return success from it if it encounters > any -eprobe_defer errors, while tracking which resources it misses. > > And then have a late_initcall which will claim any resources which failed > with -eprobe beforehand. How do you ensure that the late_initcall gets run before any of the other late_initcalls that disable the resources? Also my recollection is that deferred probing will first be triggered the first time from a late_initcall, so chances aren't very high that all resources have shown up by that time. > > Now deferring probing is a real showstopper for simplefb, because not > > only does it make the framebuffer useless as early boot console, once > > probing is attempted again the clocks that it would have needed to > > acquire to keep going will already have been switched off, too. > > That is not true, even with the current implementation, if all necessary > drivers are built in, then simplefb will come up later, but it will still > come up before the late_initcall which disables the clocks. Yes, in the current implementation because clocks typically are registered very early and thus you don't hit the deferred probe. The same is not true for other types of resources where it's actually quite common to hit deferred probing (regulators is a very notorious one). It doesn't matter whether a driver is built-in or not, once you hit deferred probing you lose. > Once we do the split probing described above (which is something which > we plan to do when it becomes necessary), then simplefb will still come > up early. It will come up early but won't have acquired all the resources that it needs, so unless you somehow manage to order late_initcalls in exactly the way that you need them, the frameworks will still turn off what you haven't managed to claim yet. Thierry
Hi, On 11/18/2014 12:21 PM, Thierry Reding wrote: > On Tue, Nov 18, 2014 at 12:01:08PM +0100, Hans de Goede wrote: >> Hi, >> >> On 11/18/2014 11:19 AM, Thierry Reding wrote: >>> On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: >>>> Hi Maxime, >>>> >>>> On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard >>>> <maxime.ripard@free-electrons.com> wrote: >>>>>> -module_init(simplefb_init); >>>>>> +/* >>>>>> + * While this can be a module, if builtin it's most likely the console >>>>>> + * So let's leave module_exit but move module_init to an earlier place >>>>>> + */ >>>>> >>>>> Not really related to this patch itself, but do we want to support >>>>> simplefb as a module? It seems like it's going to be most of the time >>>>> broken. >>>> >>>> If it depends on clocks, it won't work as a module, as CCF will have disabled >>>> all unused clocks at that point. >>> >>> If it does depend on anything beyond clocks it won't work at all. Clocks >>> are special because they get set up very early at boot time. If it turns >>> out that a simplefb ever needs a regulator to remain on, and that's even >>> quite likely to happen eventually, it's going to fail miserably, because >>> those regulators will typically be provided by a PMIC on an I2C bus. The >>> regulator won't be registered until very late into the boot process and >>> a regulator_get() call will almost certainly cause the simplefb driver >>> to defer probing. >> >> Right, this has been discussed already and the plan is to have simplefb >> continue its probe function and return success from it if it encounters >> any -eprobe_defer errors, while tracking which resources it misses. >> >> And then have a late_initcall which will claim any resources which failed >> with -eprobe beforehand. > > How do you ensure that the late_initcall gets run before any of the > other late_initcalls that disable the resources? > Also my recollection is > that deferred probing will first be triggered the first time from a > late_initcall, so chances aren't very high that all resources have shown > up by that time. So I just looked up the relevant code, and your right, this means that the whole model of "disable unused resources once probing is done" which we use for e.g. clocks, is already somewhat broken since there is no guarantee probing is really done when the cleanup code runs. >>> Now deferring probing is a real showstopper for simplefb, because not >>> only does it make the framebuffer useless as early boot console, once >>> probing is attempted again the clocks that it would have needed to >>> acquire to keep going will already have been switched off, too. >> >> That is not true, even with the current implementation, if all necessary >> drivers are built in, then simplefb will come up later, but it will still >> come up before the late_initcall which disables the clocks. > > Yes, in the current implementation because clocks typically are > registered very early and thus you don't hit the deferred probe. The > same is not true for other types of resources where it's actually quite > common to hit deferred probing (regulators is a very notorious one). > > It doesn't matter whether a driver is built-in or not, once you hit > deferred probing you lose. > >> Once we do the split probing described above (which is something which >> we plan to do when it becomes necessary), then simplefb will still come >> up early. > > It will come up early but won't have acquired all the resources that it > needs, so unless you somehow manage to order late_initcalls in exactly > the way that you need them, the frameworks will still turn off what you > haven't managed to claim yet. If it is a resource which only shows up as a result of deferred probing, then it may very well not have been probed & registered yet, when the framework cleanup functions runs, and thus will not get turned off... So yes you're right that deferred probing may cause issues, but it seems that this is not something simplefb specific, but rather a generic problem with deferred-probing vs subsys cleanup functions. My view on this is simple, lets worry about this when we actually have a board which hits these issues, and then we'll see from there. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi, On 11/18/2014 12:46 PM, Hans de Goede wrote: > Hi, > > On 11/18/2014 12:21 PM, Thierry Reding wrote: >> On Tue, Nov 18, 2014 at 12:01:08PM +0100, Hans de Goede wrote: >>> Hi, >>> >>> On 11/18/2014 11:19 AM, Thierry Reding wrote: >>>> On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: >>>>> Hi Maxime, >>>>> >>>>> On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard >>>>> <maxime.ripard@free-electrons.com> wrote: >>>>>>> -module_init(simplefb_init); >>>>>>> +/* >>>>>>> + * While this can be a module, if builtin it's most likely the console >>>>>>> + * So let's leave module_exit but move module_init to an earlier place >>>>>>> + */ >>>>>> >>>>>> Not really related to this patch itself, but do we want to support >>>>>> simplefb as a module? It seems like it's going to be most of the time >>>>>> broken. >>>>> >>>>> If it depends on clocks, it won't work as a module, as CCF will have disabled >>>>> all unused clocks at that point. >>>> >>>> If it does depend on anything beyond clocks it won't work at all. Clocks >>>> are special because they get set up very early at boot time. If it turns >>>> out that a simplefb ever needs a regulator to remain on, and that's even >>>> quite likely to happen eventually, it's going to fail miserably, because >>>> those regulators will typically be provided by a PMIC on an I2C bus. The >>>> regulator won't be registered until very late into the boot process and >>>> a regulator_get() call will almost certainly cause the simplefb driver >>>> to defer probing. >>> >>> Right, this has been discussed already and the plan is to have simplefb >>> continue its probe function and return success from it if it encounters >>> any -eprobe_defer errors, while tracking which resources it misses. >>> >>> And then have a late_initcall which will claim any resources which failed >>> with -eprobe beforehand. >> >> How do you ensure that the late_initcall gets run before any of the >> other late_initcalls that disable the resources? > >> Also my recollection is >> that deferred probing will first be triggered the first time from a >> late_initcall, so chances aren't very high that all resources have shown >> up by that time. > > So I just looked up the relevant code, and your right, this means that > the whole model of "disable unused resources once probing is done" which > we use for e.g. clocks, is already somewhat broken since there is > no guarantee probing is really done when the cleanup code runs. > >>>> Now deferring probing is a real showstopper for simplefb, because not >>>> only does it make the framebuffer useless as early boot console, once >>>> probing is attempted again the clocks that it would have needed to >>>> acquire to keep going will already have been switched off, too. >>> >>> That is not true, even with the current implementation, if all necessary >>> drivers are built in, then simplefb will come up later, but it will still >>> come up before the late_initcall which disables the clocks. >> >> Yes, in the current implementation because clocks typically are >> registered very early and thus you don't hit the deferred probe. The >> same is not true for other types of resources where it's actually quite >> common to hit deferred probing (regulators is a very notorious one). >> >> It doesn't matter whether a driver is built-in or not, once you hit >> deferred probing you lose. >> >>> Once we do the split probing described above (which is something which >>> we plan to do when it becomes necessary), then simplefb will still come >>> up early. >> >> It will come up early but won't have acquired all the resources that it >> needs, so unless you somehow manage to order late_initcalls in exactly >> the way that you need them, the frameworks will still turn off what you >> haven't managed to claim yet. > > If it is a resource which only shows up as a result of deferred probing, > then it may very well not have been probed & registered yet, when the > framework cleanup functions runs, and thus will not get turned off... > > So yes you're right that deferred probing may cause issues, but it seems > that this is not something simplefb specific, but rather a generic problem > with deferred-probing vs subsys cleanup functions. > > My view on this is simple, lets worry about this when we actually have > a board which hits these issues, and then we'll see from there. So thinking more about this, I think this is not that hard to fix. First lets fix the generic conflict between eprobedefer and subsys cleanup functions. This can be done by: 1) Having a linked list of subsys cleanup functions to call in drivers/base/dd.c 2) Have subsystems register their cleanup function rather then using late_initcall to get it called 3) Have deferred_probe_work_func iterate over the list and call the cleanup functions once deferred_probe_active_list goes empty. It should also remove them once called, so that they only get called the first time deferred_probe_active_list goes empty (iow when the deferred probing of' build-in drivers is done). This way cleanup functions actually get run when all probing of (buildin) drivers is done. Then when we move simplefb to a 2 fase probe, we can simply register the framebuffer at the first probe call, and claim any resources we get, but return -eprobe_defer if some resources returned that themselves. Then when simplefb_probe gets re-called, it can first check if it did not already register a fb, and if it did, it can use that and see which resources are missing, and only try to claim those. If some resources still return probe_defer, return eprobe_defer again, otherwise success. This way simplefb_probe will get called as long as resources are missing and other drivers are successfully completing deferred probes (if no driver successfully completes a deferred probe, deferred_probe_active_list will go empty). And then when the subsys cleanup functions run, simplefb will have been able to claim any resources registered by buildin drivers. Regards, Hans -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Nov 18, 2014 at 01:44:44PM +0100, Hans de Goede wrote: > Hi, > > On 11/18/2014 12:46 PM, Hans de Goede wrote: > > Hi, > > > > On 11/18/2014 12:21 PM, Thierry Reding wrote: > >> On Tue, Nov 18, 2014 at 12:01:08PM +0100, Hans de Goede wrote: > >>> Hi, > >>> > >>> On 11/18/2014 11:19 AM, Thierry Reding wrote: > >>>> On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: > >>>>> Hi Maxime, > >>>>> > >>>>> On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard > >>>>> <maxime.ripard@free-electrons.com> wrote: > >>>>>>> -module_init(simplefb_init); > >>>>>>> +/* > >>>>>>> + * While this can be a module, if builtin it's most likely the console > >>>>>>> + * So let's leave module_exit but move module_init to an earlier place > >>>>>>> + */ > >>>>>> > >>>>>> Not really related to this patch itself, but do we want to support > >>>>>> simplefb as a module? It seems like it's going to be most of the time > >>>>>> broken. > >>>>> > >>>>> If it depends on clocks, it won't work as a module, as CCF will have disabled > >>>>> all unused clocks at that point. > >>>> > >>>> If it does depend on anything beyond clocks it won't work at all. Clocks > >>>> are special because they get set up very early at boot time. If it turns > >>>> out that a simplefb ever needs a regulator to remain on, and that's even > >>>> quite likely to happen eventually, it's going to fail miserably, because > >>>> those regulators will typically be provided by a PMIC on an I2C bus. The > >>>> regulator won't be registered until very late into the boot process and > >>>> a regulator_get() call will almost certainly cause the simplefb driver > >>>> to defer probing. > >>> > >>> Right, this has been discussed already and the plan is to have simplefb > >>> continue its probe function and return success from it if it encounters > >>> any -eprobe_defer errors, while tracking which resources it misses. > >>> > >>> And then have a late_initcall which will claim any resources which failed > >>> with -eprobe beforehand. > >> > >> How do you ensure that the late_initcall gets run before any of the > >> other late_initcalls that disable the resources? > > > >> Also my recollection is > >> that deferred probing will first be triggered the first time from a > >> late_initcall, so chances aren't very high that all resources have shown > >> up by that time. > > > > So I just looked up the relevant code, and your right, this means that > > the whole model of "disable unused resources once probing is done" which > > we use for e.g. clocks, is already somewhat broken since there is > > no guarantee probing is really done when the cleanup code runs. > > > >>>> Now deferring probing is a real showstopper for simplefb, because not > >>>> only does it make the framebuffer useless as early boot console, once > >>>> probing is attempted again the clocks that it would have needed to > >>>> acquire to keep going will already have been switched off, too. > >>> > >>> That is not true, even with the current implementation, if all necessary > >>> drivers are built in, then simplefb will come up later, but it will still > >>> come up before the late_initcall which disables the clocks. > >> > >> Yes, in the current implementation because clocks typically are > >> registered very early and thus you don't hit the deferred probe. The > >> same is not true for other types of resources where it's actually quite > >> common to hit deferred probing (regulators is a very notorious one). > >> > >> It doesn't matter whether a driver is built-in or not, once you hit > >> deferred probing you lose. > >> > >>> Once we do the split probing described above (which is something which > >>> we plan to do when it becomes necessary), then simplefb will still come > >>> up early. > >> > >> It will come up early but won't have acquired all the resources that it > >> needs, so unless you somehow manage to order late_initcalls in exactly > >> the way that you need them, the frameworks will still turn off what you > >> haven't managed to claim yet. > > > > If it is a resource which only shows up as a result of deferred probing, > > then it may very well not have been probed & registered yet, when the > > framework cleanup functions runs, and thus will not get turned off... > > > > So yes you're right that deferred probing may cause issues, but it seems > > that this is not something simplefb specific, but rather a generic problem > > with deferred-probing vs subsys cleanup functions. > > > > My view on this is simple, lets worry about this when we actually have > > a board which hits these issues, and then we'll see from there. > > So thinking more about this, I think this is not that hard to fix. > > First lets fix the generic conflict between eprobedefer and subsys cleanup > functions. This can be done by: > > 1) Having a linked list of subsys cleanup functions > to call in drivers/base/dd.c > > 2) Have subsystems register their cleanup function rather then using > late_initcall to get it called > > 3) Have deferred_probe_work_func iterate over the list and call the cleanup > functions once deferred_probe_active_list goes empty. It should also remove > them once called, so that they only get called the first time > deferred_probe_active_list goes empty (iow when the deferred probing of' > build-in drivers is done). > > This way cleanup functions actually get run when all probing of (buildin) > drivers is done. That sounds like a reasonable solution to me. > Then when we move simplefb to a 2 fase probe, we can simply register the > framebuffer at the first probe call, and claim any resources we get, but > return -eprobe_defer if some resources returned that themselves. > > Then when simplefb_probe gets re-called, it can first check if it did not > already register a fb, and if it did, it can use that and see which > resources are missing, and only try to claim those. If some resources > still return probe_defer, return eprobe_defer again, otherwise success. I'm not sure you can check that the fb was already registered. When the driver probe fails the driver core will pretty much remove any trace of the driver, so checking for an already-reagistered framebuffer isn't going to be easy. But if you can manage to make that work it should give us a pretty good solution that should be easy to make use of by other drivers as well. Thierry
On Tue, Nov 18, 2014 at 04:16:04PM +0100, Thierry Reding wrote: > On Tue, Nov 18, 2014 at 01:44:44PM +0100, Hans de Goede wrote: > > Hi, > > > > On 11/18/2014 12:46 PM, Hans de Goede wrote: > > > Hi, > > > > > > On 11/18/2014 12:21 PM, Thierry Reding wrote: > > >> On Tue, Nov 18, 2014 at 12:01:08PM +0100, Hans de Goede wrote: > > >>> Hi, > > >>> > > >>> On 11/18/2014 11:19 AM, Thierry Reding wrote: > > >>>> On Thu, Nov 13, 2014 at 09:58:41AM +0100, Geert Uytterhoeven wrote: > > >>>>> Hi Maxime, > > >>>>> > > >>>>> On Thu, Nov 13, 2014 at 9:52 AM, Maxime Ripard > > >>>>> <maxime.ripard@free-electrons.com> wrote: > > >>>>>>> -module_init(simplefb_init); > > >>>>>>> +/* > > >>>>>>> + * While this can be a module, if builtin it's most likely the console > > >>>>>>> + * So let's leave module_exit but move module_init to an earlier place > > >>>>>>> + */ > > >>>>>> > > >>>>>> Not really related to this patch itself, but do we want to support > > >>>>>> simplefb as a module? It seems like it's going to be most of the time > > >>>>>> broken. > > >>>>> > > >>>>> If it depends on clocks, it won't work as a module, as CCF will have disabled > > >>>>> all unused clocks at that point. > > >>>> > > >>>> If it does depend on anything beyond clocks it won't work at all. Clocks > > >>>> are special because they get set up very early at boot time. If it turns > > >>>> out that a simplefb ever needs a regulator to remain on, and that's even > > >>>> quite likely to happen eventually, it's going to fail miserably, because > > >>>> those regulators will typically be provided by a PMIC on an I2C bus. The > > >>>> regulator won't be registered until very late into the boot process and > > >>>> a regulator_get() call will almost certainly cause the simplefb driver > > >>>> to defer probing. > > >>> > > >>> Right, this has been discussed already and the plan is to have simplefb > > >>> continue its probe function and return success from it if it encounters > > >>> any -eprobe_defer errors, while tracking which resources it misses. > > >>> > > >>> And then have a late_initcall which will claim any resources which failed > > >>> with -eprobe beforehand. > > >> > > >> How do you ensure that the late_initcall gets run before any of the > > >> other late_initcalls that disable the resources? > > > > > >> Also my recollection is > > >> that deferred probing will first be triggered the first time from a > > >> late_initcall, so chances aren't very high that all resources have shown > > >> up by that time. > > > > > > So I just looked up the relevant code, and your right, this means that > > > the whole model of "disable unused resources once probing is done" which > > > we use for e.g. clocks, is already somewhat broken since there is > > > no guarantee probing is really done when the cleanup code runs. > > > > > >>>> Now deferring probing is a real showstopper for simplefb, because not > > >>>> only does it make the framebuffer useless as early boot console, once > > >>>> probing is attempted again the clocks that it would have needed to > > >>>> acquire to keep going will already have been switched off, too. > > >>> > > >>> That is not true, even with the current implementation, if all necessary > > >>> drivers are built in, then simplefb will come up later, but it will still > > >>> come up before the late_initcall which disables the clocks. > > >> > > >> Yes, in the current implementation because clocks typically are > > >> registered very early and thus you don't hit the deferred probe. The > > >> same is not true for other types of resources where it's actually quite > > >> common to hit deferred probing (regulators is a very notorious one). > > >> > > >> It doesn't matter whether a driver is built-in or not, once you hit > > >> deferred probing you lose. > > >> > > >>> Once we do the split probing described above (which is something which > > >>> we plan to do when it becomes necessary), then simplefb will still come > > >>> up early. > > >> > > >> It will come up early but won't have acquired all the resources that it > > >> needs, so unless you somehow manage to order late_initcalls in exactly > > >> the way that you need them, the frameworks will still turn off what you > > >> haven't managed to claim yet. > > > > > > If it is a resource which only shows up as a result of deferred probing, > > > then it may very well not have been probed & registered yet, when the > > > framework cleanup functions runs, and thus will not get turned off... > > > > > > So yes you're right that deferred probing may cause issues, but it seems > > > that this is not something simplefb specific, but rather a generic problem > > > with deferred-probing vs subsys cleanup functions. > > > > > > My view on this is simple, lets worry about this when we actually have > > > a board which hits these issues, and then we'll see from there. > > > > So thinking more about this, I think this is not that hard to fix. > > > > First lets fix the generic conflict between eprobedefer and subsys cleanup > > functions. This can be done by: > > > > 1) Having a linked list of subsys cleanup functions > > to call in drivers/base/dd.c > > > > 2) Have subsystems register their cleanup function rather then using > > late_initcall to get it called > > > > 3) Have deferred_probe_work_func iterate over the list and call the cleanup > > functions once deferred_probe_active_list goes empty. It should also remove > > them once called, so that they only get called the first time > > deferred_probe_active_list goes empty (iow when the deferred probing of' > > build-in drivers is done). > > > > This way cleanup functions actually get run when all probing of (buildin) > > drivers is done. > > That sounds like a reasonable solution to me. > > > Then when we move simplefb to a 2 fase probe, we can simply register the > > framebuffer at the first probe call, and claim any resources we get, but > > return -eprobe_defer if some resources returned that themselves. > > > > Then when simplefb_probe gets re-called, it can first check if it did not > > already register a fb, and if it did, it can use that and see which > > resources are missing, and only try to claim those. If some resources > > still return probe_defer, return eprobe_defer again, otherwise success. > > I'm not sure you can check that the fb was already registered. When the > driver probe fails the driver core will pretty much remove any trace of > the driver, so checking for an already-reagistered framebuffer isn't > going to be easy. > > But if you can manage to make that work it should give us a pretty good > solution that should be easy to make use of by other drivers as well. What about handling priorities in the suggested cleanup mechanism, and just add the second phase as the highest priority cleanup callback? That way, we would be guaranteed to be run just before any cleanup function. Maxime
diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c index be7d288..8c0c972 100644 --- a/drivers/video/fbdev/simplefb.c +++ b/drivers/video/fbdev/simplefb.c @@ -415,7 +415,11 @@ static void __exit simplefb_exit(void) platform_driver_unregister(&simplefb_driver); } -module_init(simplefb_init); +/* + * While this can be a module, if builtin it's most likely the console + * So let's leave module_exit but move module_init to an earlier place + */ +fs_initcall(simplefb_init); module_exit(simplefb_exit); MODULE_AUTHOR("Stephen Warren <swarren@wwwdotorg.org>");
One of the reasons for having the simplefb nodes in /chosen, and doing explicit enumeration of the nodes there, is too allow enumerating them sooner, so that we get a console earlier on. Doing this earlier then fs_initcall is not useful, since the fb only turns into a console when fbcon intializes, which is a fs_initcall too. Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/video/fbdev/simplefb.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)