broken nouveau dependency on power supply
Hi folks !
With CONFIG_POWER_SUPPLY=m & nouveau built-in we get a build failure:
drivers/built-in.o: In function `.nouveau_pm_trigger':
(.text+0xa56e8): undefined reference to `.power_supply_is_system_supplied'
nouveau probably needs to depends on CONFIG_POWER_SUPPLY to force a module build with the latter is =m
Cheers,
Ben.
Quoted 9 lines · Benjamin Herrenschmidt
Hi folks !
With
CONFIG_POWER_SUPPLY=m& nouveau built-in we get a build failure:
drivers/built-in.o: In function `.nouveau_pm_trigger':
(.text+0xa56e8): undefined reference to `.power_supply_is_system_supplied'nouveau probably needs to depends on
CONFIG_POWER_SUPPLYto force a module build with the latter is =m
Ok, not that trivial...
The problem is more like POWER_SUPPLY should be a bool, not a tristate.
If you think about it: you don't want things like nouveau to depend on a random subsystem like that, people will never get it. In fact, POWER_SUPPLY provides empty inline stubs when not enabled, so that's really designed to not have depends...
However that -cannot- work if POWER_SUPPLY is modular and the drivers who use it are not. The only fixes here that make sense I can think of that don't also involve Kconfig horrors are:
- Ugly: in power_supply.h, use the extern variant if
defined(CONFIG_POWER_SUPPLY) || (defined(CONFIG_POWER_SUPPLY_MODULE) && defined(MODULE))
IE. use the stub if power supply is a module and what is being built is built-in. Of course that's not only ugly, it somewhat sucks from a user perspective as the subsystem now exists but can't be used by some drivers...
- Better: Just make the bloody thing a bool :-) The power supply
framework itself is small enough, just make it a boolean option and avoid the problem entirely. The actual power supply sub drivers can remain modular of course.
Cheers,
Ben.
Quoted 30 lines
Ok, not that trivial...
The problem is more like
POWER_SUPPLYshould be a bool, not a tristate.If you think about it: you don't want things like nouveau to depend on a
random subsystem like that, people will never get it. In fact,POWER_SUPPLYprovides empty inline stubs when not enabled, so that's really designed to not have depends...However that -cannot- work if
POWER_SUPPLYis modular and the drivers who use it are not. The only fixes here that make sense I can think of
that don't also involveKconfighorrors are:- Ugly: in
power_supply.h, use the extern variant ifdefined(CONFIG_POWER_SUPPLY) || (defined(CONFIG_POWER_SUPPLY_MODULE) && defined(MODULE))IE. use the stub if power supply is a module and what is being built is
built-in. Of course that's not only ugly, it somewhat sucks from a user
perspective as the subsystem now exists but can't be used by some drivers...
Quoted 4 lines
- Better: Just make the bloody thing a bool :-) The power supply
framework itself is small enough, just make it a boolean option and avoid the problem entirely. The actual power supply sub drivers can remain modular of course.
We can just do select POWER_SUPPLY.
Yes it reduces the option range for some stupid corner case but really I don't care, removing features from the kernel that a driver depends on is just leading to insane state combination and QA problems.
Dave.
Quoted 6 lines · David Airlie
Quoted 4 lines
- Better: Just make the bloody thing a bool :-) The power supply
framework itself is small enough, just make it a boolean option and avoid the problem entirely. The actual power supply sub drivers can remain modular of course.We can just do select
POWER_SUPPLY.
Well, select'ing otherwise user configurable options was still frowned on last we discussed that... and it makes the whole inline stubs in power_supply.h totally pointless :-)
Quoted 3 lines
Yes it reduces the option range for some stupid corner case but really I don't care, removing features from the kernel that a driver depends on is just leading to insane state combination and QA problems.
Well, the power supply stuff only works if you have a backend for it, which not all platforms are, and it's fairly safe to assume AC whenever it's not actually supported.
(Talking of which, we should be able to do a PowerBook backend reasonably easily).
I don't care which solution you guys end up choosing though, just fix it :-)
Cheers,
Ben.
Hello Benjamin,
Sorry, it took me some time to get to it.
On Mon, Apr 02, 2012 at 01:53:23PM +1000, Benjamin Herrenschmidt wrote:
[...]
Quoted 11 lines
Quoted 7 lines
With
CONFIG_POWER_SUPPLY=m& nouveau built-in we get a build failure:
drivers/built-in.o: In function `.nouveau_pm_trigger':
(.text+0xa56e8): undefined reference to `.power_supply_is_system_supplied'nouveau probably needs to depends on
CONFIG_POWER_SUPPLYto force a module build with the latter is =mOk, not that trivial...
The problem is more like
POWER_SUPPLYshould be a bool, not a tristate.
I see that nouveau already selects POWER_SUPPLY, but your points are still valid. Let's make the power supply thing simple. I've applied the following patch:
- - - -
[PATCH] power_supply: Make the core a boolean instead of a tristate
Quoted 31 lines · Benjamin Herrenschmidt
Quoted 5 lines
drivers/built-in.o: In function `.nouveau_pm_trigger':
(.text+0xa56e8): undefined reference to `.power_supply_is_system_supplied'nouveau probably needs to depends on
CONFIG_POWER_SUPPLYto force a module build with the latter is =mOk, not that trivial...
The problem is more like
POWER_SUPPLYshould be a bool, not a tristate.If you think about it: you don't want things like nouveau to depend on a random subsystem like that, people will never get it. In fact,
POWER_SUPPLYprovides empty inline stubs when not enabled, so that's really designed to not have depends...However that -cannot- work if
POWER_SUPPLYis modular and the drivers who use it are not.The only fixes here that make sense I can think of that don't also involve
Kconfighorrors are:- Ugly: in
power_supply.h, use the extern variant ifdefined(CONFIG_POWER_SUPPLY) || (defined(CONFIG_POWER_SUPPLY_MODULE) && defined(MODULE))IE. use the stub if power supply is a module and what is being built is built-in. Of course that's not only ugly, it somewhat sucks from a user perspective as the subsystem now exists but can't be used by some drivers...
Quoted 4 lines
- Better: Just make the bloody thing a bool :-) The power supply
framework itself is small enough, just make it a boolean option and avoid the problem entirely. The actual power supply sub drivers can remain modular of course.
--- drivers/power/Kconfig | 2 +- include/linux/power_supply.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/power/Kconfig +1 -1
@@ -1,5 +1,5 @@ menuconfig POWER_SUPPLY - tristate "Power supply class support" + bool "Power supply class support" help Say Y here to enable power supply class support. This allows power supply (batteries, AC, USB) monitoring by userspace
include/linux/power_supply.h +1 -1
@@ -212,7 +212,7 @@ extern void power_supply_changed(struct power_supply *psy);extern int power_supply_am_i_supplied (struct power_supply *psy);extern int power_supply_set_battery_charged (struct power_supply *psy); -#if defined(CONFIG_POWER_SUPPLY ) || defined(CONFIG_POWER_SUPPLY_MODULE ) +#ifdef CONFIG_POWER_SUPPLY extern int power_supply_is_system_supplied (void );#else static inline int power_supply_is_system_supplied (void ) {return -ENOSYS ; }
Signature · 1 line
1.7.9.2