Message ID | 20190612201325.1150-1-daniel.lezcano@linaro.org |
---|---|
State | Accepted |
Commit | 980af75ede4f36107b98aa5c247359b87c6afc30 |
Headers | show |
Series | [1/2] thermal/drivers/core: Add init section table for self-encapsulation | expand |
Any chance this patch gets merged for v5.4? Thanks -- Daniel On 12/06/2019 22:13, Daniel Lezcano wrote: > Currently the governors are declared in their respective files but they > export their [un]register functions which in turn call the [un]register > governors core's functions. That implies a cyclic dependency which is > not desirable. There is a way to self-encapsulate the governors by letting > them to declare themselves in a __init section table. > > Define the table in the asm generic linker description like the other > tables and provide the specific macros to deal with. > > Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org> > Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> > --- > drivers/thermal/thermal_core.h | 15 +++++++++++++++ > include/asm-generic/vmlinux.lds.h | 11 +++++++++++ > 2 files changed, 26 insertions(+) > > diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h > index 0df190ed82a7..be901e84aa65 100644 > --- a/drivers/thermal/thermal_core.h > +++ b/drivers/thermal/thermal_core.h > @@ -15,6 +15,21 @@ > /* Initial state of a cooling device during binding */ > #define THERMAL_NO_TARGET -1UL > > +/* Init section thermal table */ > +extern struct thermal_governor *__governor_thermal_table[]; > +extern struct thermal_governor *__governor_thermal_table_end[]; > + > +#define THERMAL_TABLE_ENTRY(table, name) \ > + (static typeof(name) *__thermal_table_entry_##name \ > + __used __section(__##table##_thermal_table) = &name) > + > +#define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY(governor, name) > + > +#define for_each_governor_table(__governor) \ > + for (__governor = __governor_thermal_table; \ > + __governor < __governor_thermal_table_end; \ > + __governor++) > + > /* > * This structure is used to describe the behavior of > * a certain cooling device on a certain trip point > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > index f8f6f04c4453..8312fdc2b2fa 100644 > --- a/include/asm-generic/vmlinux.lds.h > +++ b/include/asm-generic/vmlinux.lds.h > @@ -239,6 +239,16 @@ > #define ACPI_PROBE_TABLE(name) > #endif > > +#ifdef CONFIG_THERMAL > +#define THERMAL_TABLE(name) \ > + . = ALIGN(8); \ > + __##name##_thermal_table = .; \ > + KEEP(*(__##name##_thermal_table)) \ > + __##name##_thermal_table_end = .; > +#else > +#define THERMAL_TABLE(name) > +#endif > + > #define KERNEL_DTB() \ > STRUCT_ALIGN(); \ > __dtb_start = .; \ > @@ -609,6 +619,7 @@ > IRQCHIP_OF_MATCH_TABLE() \ > ACPI_PROBE_TABLE(irqchip) \ > ACPI_PROBE_TABLE(timer) \ > + THERMAL_TABLE(governor) \ > EARLYCON_TABLE() \ > LSM_TABLE() > > -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
On 一, 2019-06-24 at 09:32 +0200, Daniel Lezcano wrote: > Any chance this patch gets merged for v5.4? > > Thanks > -- Daniel > have you run compile test for the patch? I got the following errors when compiling. In file included from drivers/thermal/fair_share.c:16:0: drivers/thermal/thermal_core.h:23:3: error: expected identifier or ‘(’ before ‘static’ (static typeof(name) *__thermal_table_entry_##name \ ^ drivers/thermal/thermal_core.h:26:40: note: in expansion of macro ‘THERMAL_TABLE_ENTRY’ #define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY(governor, name) ^ drivers/thermal/fair_share.c:120:1: note: in expansion of macro ‘THERMAL_GOVERNOR_DECLARE’ THERMAL_GOVERNOR_DECLARE(thermal_gov_fair_share); ^ drivers/thermal/fair_share.c:116:32: warning: ‘thermal_gov_fair_share’ defined but not used [-Wunused-variable] static struct thermal_governor thermal_gov_fair_share = { ^ make[2]: *** [drivers/thermal/fair_share.o] Error 1 make[2]: *** Waiting for unfinished jobs.... In file included from drivers/thermal/gov_bang_bang.c:14:0: drivers/thermal/thermal_core.h:23:3: error: expected identifier or ‘(’ before ‘static’ (static typeof(name) *__thermal_table_entry_##name \ ^ drivers/thermal/thermal_core.h:26:40: note: in expansion of macro ‘THERMAL_TABLE_ENTRY’ #define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY(governor, name) ^ drivers/thermal/gov_bang_bang.c:119:1: note: in expansion of macro ‘THERMAL_GOVERNOR_DECLARE’ THERMAL_GOVERNOR_DECLARE(thermal_gov_bang_bang); ^ drivers/thermal/gov_bang_bang.c:115:32: warning: ‘thermal_gov_bang_bang’ defined but not used [-Wunused-variable] static struct thermal_governor thermal_gov_bang_bang = { ^ make[2]: *** [drivers/thermal/gov_bang_bang.o] Error 1 make[1]: *** [drivers/thermal] Error 2 make[1]: *** Waiting for unfinished jobs.... make: *** [drivers] Error 2 Fix the problem by removing the round brackets of THERMAL_TABLE_ENTRY(), and applied. thanks, rui > On 12/06/2019 22:13, Daniel Lezcano wrote: > > > > Currently the governors are declared in their respective files but > > they > > export their [un]register functions which in turn call the > > [un]register > > governors core's functions. That implies a cyclic dependency which > > is > > not desirable. There is a way to self-encapsulate the governors by > > letting > > them to declare themselves in a __init section table. > > > > Define the table in the asm generic linker description like the > > other > > tables and provide the specific macros to deal with. > > > > Reviewed-by: Amit Kucheria <amit.kucheria@linaro.org> > > Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> > > --- > > drivers/thermal/thermal_core.h | 15 +++++++++++++++ > > include/asm-generic/vmlinux.lds.h | 11 +++++++++++ > > 2 files changed, 26 insertions(+) > > > > diff --git a/drivers/thermal/thermal_core.h > > b/drivers/thermal/thermal_core.h > > index 0df190ed82a7..be901e84aa65 100644 > > --- a/drivers/thermal/thermal_core.h > > +++ b/drivers/thermal/thermal_core.h > > @@ -15,6 +15,21 @@ > > /* Initial state of a cooling device during binding */ > > #define THERMAL_NO_TARGET -1UL > > > > +/* Init section thermal table */ > > +extern struct thermal_governor *__governor_thermal_table[]; > > +extern struct thermal_governor *__governor_thermal_table_end[]; > > + > > +#define THERMAL_TABLE_ENTRY(table, name) \ > > + (static typeof(name) *__thermal_table_entry_##name > > \ > > + __used __section(__##table##_thermal_table) = &name) > > + > > +#define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY( > > governor, name) > > + > > +#define for_each_governor_table(__governor) \ > > + for (__governor = __governor_thermal_table; \ > > + __governor < __governor_thermal_table_end; \ > > + __governor++) > > + > > /* > > * This structure is used to describe the behavior of > > * a certain cooling device on a certain trip point > > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm- > > generic/vmlinux.lds.h > > index f8f6f04c4453..8312fdc2b2fa 100644 > > --- a/include/asm-generic/vmlinux.lds.h > > +++ b/include/asm-generic/vmlinux.lds.h > > @@ -239,6 +239,16 @@ > > #define ACPI_PROBE_TABLE(name) > > #endif > > > > +#ifdef CONFIG_THERMAL > > +#define THERMAL_TABLE(name) > > \ > > + . = ALIGN(8); > > \ > > + __##name##_thermal_table = .; > > \ > > + KEEP(*(__##name##_thermal_table)) > > \ > > + __##name##_thermal_table_end = .; > > +#else > > +#define THERMAL_TABLE(name) > > +#endif > > + > > #define KERNEL_DTB() > > \ > > STRUCT_ALIGN(); > > \ > > __dtb_start = .; > > \ > > @@ -609,6 +619,7 @@ > > IRQCHIP_OF_MATCH_TABLE() > > \ > > ACPI_PROBE_TABLE(irqchip) > > \ > > ACPI_PROBE_TABLE(timer) > > \ > > + THERMAL_TABLE(governor) > > \ > > EARLYCON_TABLE() > > \ > > LSM_TABLE() > > > > >
On 27/06/2019 15:21, Zhang Rui wrote: > On 一, 2019-06-24 at 09:32 +0200, Daniel Lezcano wrote: >> Any chance this patch gets merged for v5.4? >> >> Thanks >> -- Daniel >> > > have you run compile test for the patch? > I got the following errors when compiling. Yes I did and also booted, changed the governor at runtime, etc ... I already got this error and fixed it. I probably forgot to fold or commit the fix ... :/ > In file included from drivers/thermal/fair_share.c:16:0: > drivers/thermal/thermal_core.h:23:3: error: expected identifier or ‘(’ > before ‘static’ > (static typeof(name) *__thermal_table_entry_##name \ > ^ > drivers/thermal/thermal_core.h:26:40: note: in expansion of macro > ‘THERMAL_TABLE_ENTRY’ > #define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY(governor, > name) > ^ [ ... ] > ^ > make[2]: *** [drivers/thermal/gov_bang_bang.o] Error 1 > make[1]: *** [drivers/thermal] Error 2 > make[1]: *** Waiting for unfinished jobs.... > make: *** [drivers] Error 2 > > Fix the problem by removing the round brackets > of THERMAL_TABLE_ENTRY(), and applied. Ok, thanks for fixing it! -- Daniel -- <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook | <http://twitter.com/#!/linaroorg> Twitter | <http://www.linaro.org/linaro-blog/> Blog
diff --git a/drivers/thermal/thermal_core.h b/drivers/thermal/thermal_core.h index 0df190ed82a7..be901e84aa65 100644 --- a/drivers/thermal/thermal_core.h +++ b/drivers/thermal/thermal_core.h @@ -15,6 +15,21 @@ /* Initial state of a cooling device during binding */ #define THERMAL_NO_TARGET -1UL +/* Init section thermal table */ +extern struct thermal_governor *__governor_thermal_table[]; +extern struct thermal_governor *__governor_thermal_table_end[]; + +#define THERMAL_TABLE_ENTRY(table, name) \ + (static typeof(name) *__thermal_table_entry_##name \ + __used __section(__##table##_thermal_table) = &name) + +#define THERMAL_GOVERNOR_DECLARE(name) THERMAL_TABLE_ENTRY(governor, name) + +#define for_each_governor_table(__governor) \ + for (__governor = __governor_thermal_table; \ + __governor < __governor_thermal_table_end; \ + __governor++) + /* * This structure is used to describe the behavior of * a certain cooling device on a certain trip point diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index f8f6f04c4453..8312fdc2b2fa 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -239,6 +239,16 @@ #define ACPI_PROBE_TABLE(name) #endif +#ifdef CONFIG_THERMAL +#define THERMAL_TABLE(name) \ + . = ALIGN(8); \ + __##name##_thermal_table = .; \ + KEEP(*(__##name##_thermal_table)) \ + __##name##_thermal_table_end = .; +#else +#define THERMAL_TABLE(name) +#endif + #define KERNEL_DTB() \ STRUCT_ALIGN(); \ __dtb_start = .; \ @@ -609,6 +619,7 @@ IRQCHIP_OF_MATCH_TABLE() \ ACPI_PROBE_TABLE(irqchip) \ ACPI_PROBE_TABLE(timer) \ + THERMAL_TABLE(governor) \ EARLYCON_TABLE() \ LSM_TABLE()