Message ID | 1436214373-12969-2-git-send-email-pali.rohar@gmail.com |
---|---|
State | New |
Headers | show |
On Monday 06 July 2015 22:26:09 Pali Rohár wrote: > With this patch "/revision" DT entry is used to set global system_rev > variable. DT "/revision" is expected to be u32 numeric value. > > TODO: add documentation > > Signed-off-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/arm/kernel/devtree.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c > index 11c54de..7d82749 100644 > --- a/arch/arm/kernel/devtree.c > +++ b/arch/arm/kernel/devtree.c > @@ -19,6 +19,7 @@ > #include <linux/of_irq.h> > #include <linux/of_platform.h> > #include <linux/smp.h> > +#include <linux/libfdt_env.h> > > #include <asm/cputype.h> > #include <asm/setup.h> > @@ -26,6 +27,7 @@ > #include <asm/smp_plat.h> > #include <asm/mach/arch.h> > #include <asm/mach-types.h> > +#include <asm/system_info.h> > > > #ifdef CONFIG_SMP > @@ -204,6 +206,8 @@ static const void * __init arch_get_next_mach(const char *const **match) > const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) > { > const struct machine_desc *mdesc, *mdesc_best = NULL; > + unsigned long dt_root; > + const u32 *rev; > > #ifdef CONFIG_ARCH_MULTIPLATFORM > DT_MACHINE_START(GENERIC_DT, "Generic DT based system") > @@ -215,17 +219,16 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) > if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys))) > return NULL; > > + dt_root = of_get_flat_dt_root(); > mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach); > > if (!mdesc) { > const char *prop; > int size; > - unsigned long dt_root; > > early_print("\nError: unrecognized/unsupported " > "device tree compatible list:\n[ "); > > - dt_root = of_get_flat_dt_root(); > prop = of_get_flat_dt_prop(dt_root, "compatible", &size); > while (size > 0) { > early_print("'%s' ", prop); > @@ -246,5 +249,10 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) > /* Change machine number to match the mdesc we're using */ > __machine_arch_type = mdesc->nr; > > + /* Set system revision from DT */ > + rev = of_get_flat_dt_prop(dt_root, "revision", NULL); > + if (rev) > + system_rev = fdt32_to_cpu(*rev); > + > return mdesc; > } This patch and second one (with subject "[PATCH 2/5] arm: boot: convert ATAG_REVISION to DT "/revision" entry") are still needed. Are there any objections for them? If not, I will add missing DT documentation and will resend them.
Adding devicetree-spec, and commenting below. On 12/24/2015 11:02 AM, Pali Rohár wrote: > On Monday 06 July 2015 22:26:09 Pali Rohár wrote: >> With this patch "/revision" DT entry is used to set global system_rev >> variable. DT "/revision" is expected to be u32 numeric value. >> >> TODO: add documentation >> >> Signed-off-by: Pali Rohár <pali.rohar@gmail.com> >> --- >> arch/arm/kernel/devtree.c | 12 ++++++++++-- >> 1 file changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c >> index 11c54de..7d82749 100644 >> --- a/arch/arm/kernel/devtree.c >> +++ b/arch/arm/kernel/devtree.c >> @@ -19,6 +19,7 @@ >> #include <linux/of_irq.h> >> #include <linux/of_platform.h> >> #include <linux/smp.h> >> +#include <linux/libfdt_env.h> >> >> #include <asm/cputype.h> >> #include <asm/setup.h> >> @@ -26,6 +27,7 @@ >> #include <asm/smp_plat.h> >> #include <asm/mach/arch.h> >> #include <asm/mach-types.h> >> +#include <asm/system_info.h> >> >> >> #ifdef CONFIG_SMP >> @@ -204,6 +206,8 @@ static const void * __init arch_get_next_mach(const char *const **match) >> const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) >> { >> const struct machine_desc *mdesc, *mdesc_best = NULL; >> + unsigned long dt_root; >> + const u32 *rev; >> >> #ifdef CONFIG_ARCH_MULTIPLATFORM >> DT_MACHINE_START(GENERIC_DT, "Generic DT based system") >> @@ -215,17 +219,16 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) >> if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys))) >> return NULL; >> >> + dt_root = of_get_flat_dt_root(); >> mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach); >> >> if (!mdesc) { >> const char *prop; >> int size; >> - unsigned long dt_root; >> >> early_print("\nError: unrecognized/unsupported " >> "device tree compatible list:\n[ "); >> >> - dt_root = of_get_flat_dt_root(); >> prop = of_get_flat_dt_prop(dt_root, "compatible", &size); >> while (size > 0) { >> early_print("'%s' ", prop); >> @@ -246,5 +249,10 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) >> /* Change machine number to match the mdesc we're using */ >> __machine_arch_type = mdesc->nr; >> >> + /* Set system revision from DT */ >> + rev = of_get_flat_dt_prop(dt_root, "revision", NULL); >> + if (rev) >> + system_rev = fdt32_to_cpu(*rev); >> + >> return mdesc; >> } > > This patch and second one (with subject "[PATCH 2/5] arm: boot: convert > ATAG_REVISION to DT "/revision" entry") are still needed. > > Are there any objections for them? If not, I will add missing DT > documentation and will resend them. Patch 2/5 copies the value from ATAG_REVISION into the fdt "/revision" property. If the use of /revision is limited to being a location to hold an ATAG value to pass to the global variable system_rev, then it would make sense to just copy directly from the ATAG value into system_rev in the same board file where you are copying the ATAGs. -Frank
On Monday 28 December 2015 13:01:22 Frank Rowand wrote: > > Patch 2/5 copies the value from ATAG_REVISION into the fdt "/revision" > property. > > If the use of /revision is limited to being a location to hold an ATAG > value to pass to the global variable system_rev, then it would make > sense to just copy directly from the ATAG value into system_rev in the > same board file where you are copying the ATAGs. Agreed. That would be simpler, and avoid a situation where someone relies on the /revision property in DT to be set from the atags compat code (preventing an upgrade to a newer bootloader), or on the system_rev variable to be the same across multiple boot loaders, in the absence of other kernel code setting it. Arnd
On Monday 28 December 2015 23:27:17 Arnd Bergmann wrote: > On Monday 28 December 2015 13:01:22 Frank Rowand wrote: > > > > Patch 2/5 copies the value from ATAG_REVISION into the fdt "/revision" > > property. > > > > If the use of /revision is limited to being a location to hold an ATAG > > value to pass to the global variable system_rev, then it would make > > sense to just copy directly from the ATAG value into system_rev in the > > same board file where you are copying the ATAGs. > > Agreed. That would be simpler, and avoid a situation where someone relies > on the /revision property in DT to be set from the atags compat code > (preventing an upgrade to a newer bootloader), or on the system_rev variable > to be the same across multiple boot loaders, in the absence of other > kernel code setting it. So, set system_rev only for Nokia N900? At same place where is called save_atags()?
On Tuesday 05 January 2016 12:37:50 Pali Rohár wrote: > On Monday 28 December 2015 23:27:17 Arnd Bergmann wrote: > > On Monday 28 December 2015 13:01:22 Frank Rowand wrote: > > > > > > Patch 2/5 copies the value from ATAG_REVISION into the fdt "/revision" > > > property. > > > > > > If the use of /revision is limited to being a location to hold an ATAG > > > value to pass to the global variable system_rev, then it would make > > > sense to just copy directly from the ATAG value into system_rev in the > > > same board file where you are copying the ATAGs. > > > > Agreed. That would be simpler, and avoid a situation where someone relies > > on the /revision property in DT to be set from the atags compat code > > (preventing an upgrade to a newer bootloader), or on the system_rev variable > > to be the same across multiple boot loaders, in the absence of other > > kernel code setting it. > > So, set system_rev only for Nokia N900? At same place where is called > save_atags()? > > Yes. Arnd
* Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com> [160205 10:17]: Can you please add the "why?" part here? Other than that looks OK to me. And unless people have objections, I'd like to get this merged in as it fixes yet another legacy boot vs DT boot regression. Regards, Tony > Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com> > --- > arch/arm/mach-omap2/board-generic.c | 22 +++++++++++++++++++++- > 1 file changed, 21 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c > index 8098272..b91fabe 100644 > --- a/arch/arm/mach-omap2/board-generic.c > +++ b/arch/arm/mach-omap2/board-generic.c > @@ -18,6 +18,7 @@ > > #include <asm/setup.h> > #include <asm/mach/arch.h> > +#include <asm/system_info.h> > > #include "common.h" > > @@ -77,12 +78,31 @@ static const char *const n900_boards_compat[] __initconst = { > NULL, > }; > > +/* Set system_rev from atags */ > +static void __init rx51_system_rev(const struct tag *tags) > +{ > + const struct tag *tag; > + > + if (tags->hdr.tag != ATAG_CORE) > + return; > + > + for_each_tag(tag, tags) { > + if (tag->hdr.tag == ATAG_REVISION) { > + system_rev = tag->u.revision.rev; > + break; > + } > + } > +} > + > /* Legacy userspace on Nokia N900 needs ATAGS exported in /proc/atags, > * save them while the data is still not overwritten > */ > static void __init rx51_reserve(void) > { > - save_atags((const struct tag *)(PAGE_OFFSET + 0x100)); > + const struct tag *tags = (const struct tag *)(PAGE_OFFSET + 0x100); > + > + save_atags(tags); > + rx51_system_rev(tags); > omap_reserve(); > } > > -- > 1.9.1 >
On Friday 05 February 2016 20:15:02 Ivaylo Dimitrov wrote: > Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com> Reviewed-by: Pali Rohár <pali.rohar@gmail.com> Tested-by: Pali Rohár <pali.rohar@gmail.com> > --- > arch/arm/mach-omap2/board-generic.c | 22 +++++++++++++++++++++- > 1 file changed, 21 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c > index 8098272..b91fabe 100644 > --- a/arch/arm/mach-omap2/board-generic.c > +++ b/arch/arm/mach-omap2/board-generic.c > @@ -18,6 +18,7 @@ > > #include <asm/setup.h> > #include <asm/mach/arch.h> > +#include <asm/system_info.h> > > #include "common.h" > > @@ -77,12 +78,31 @@ static const char *const n900_boards_compat[] __initconst = { > NULL, > }; > > +/* Set system_rev from atags */ > +static void __init rx51_system_rev(const struct tag *tags) > +{ > + const struct tag *tag; > + > + if (tags->hdr.tag != ATAG_CORE) > + return; > + > + for_each_tag(tag, tags) { > + if (tag->hdr.tag == ATAG_REVISION) { > + system_rev = tag->u.revision.rev; > + break; > + } > + } > +} > + > /* Legacy userspace on Nokia N900 needs ATAGS exported in /proc/atags, > * save them while the data is still not overwritten > */ > static void __init rx51_reserve(void) > { > - save_atags((const struct tag *)(PAGE_OFFSET + 0x100)); > + const struct tag *tags = (const struct tag *)(PAGE_OFFSET + 0x100); > + > + save_atags(tags); > + rx51_system_rev(tags); Tony, if you are going to take this patch, I would suggest to rename function name rx51_system_rev to rx51_set_system_rev as it says what function do (set system rev :-)). > omap_reserve(); > } >
* Pali Rohár <pali.rohar@gmail.com> [160208 13:11]: > > Tony, if you are going to take this patch, I would suggest to rename > function name rx51_system_rev to rx51_set_system_rev as it says what > function do (set system rev :-)). Ivaylo can change it when reposting as the patch description is missing. Regards, Tony
* Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com> [160210 10:24]: > This fixed a regression with DT boot compared to legacy boot. > > Signed-off-by: Ivaylo Dimitrov <ivo.g.dimitrov.75@gmail.com> Thanks, applying into omap-for-v4.5/fixes with Pali's ack. Regards, Tony > --- > arch/arm/mach-omap2/board-generic.c | 22 +++++++++++++++++++++- > 1 file changed, 21 insertions(+), 1 deletion(-) > > diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c > index 8098272..bab814d 100644 > --- a/arch/arm/mach-omap2/board-generic.c > +++ b/arch/arm/mach-omap2/board-generic.c > @@ -18,6 +18,7 @@ > > #include <asm/setup.h> > #include <asm/mach/arch.h> > +#include <asm/system_info.h> > > #include "common.h" > > @@ -77,12 +78,31 @@ static const char *const n900_boards_compat[] __initconst = { > NULL, > }; > > +/* Set system_rev from atags */ > +static void __init rx51_set_system_rev(const struct tag *tags) > +{ > + const struct tag *tag; > + > + if (tags->hdr.tag != ATAG_CORE) > + return; > + > + for_each_tag(tag, tags) { > + if (tag->hdr.tag == ATAG_REVISION) { > + system_rev = tag->u.revision.rev; > + break; > + } > + } > +} > + > /* Legacy userspace on Nokia N900 needs ATAGS exported in /proc/atags, > * save them while the data is still not overwritten > */ > static void __init rx51_reserve(void) > { > - save_atags((const struct tag *)(PAGE_OFFSET + 0x100)); > + const struct tag *tags = (const struct tag *)(PAGE_OFFSET + 0x100); > + > + save_atags(tags); > + rx51_set_system_rev(tags); > omap_reserve(); > } > > -- > 1.9.1 >
diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c index 11c54de..7d82749 100644 --- a/arch/arm/kernel/devtree.c +++ b/arch/arm/kernel/devtree.c @@ -19,6 +19,7 @@ #include <linux/of_irq.h> #include <linux/of_platform.h> #include <linux/smp.h> +#include <linux/libfdt_env.h> #include <asm/cputype.h> #include <asm/setup.h> @@ -26,6 +27,7 @@ #include <asm/smp_plat.h> #include <asm/mach/arch.h> #include <asm/mach-types.h> +#include <asm/system_info.h> #ifdef CONFIG_SMP @@ -204,6 +206,8 @@ static const void * __init arch_get_next_mach(const char *const **match) const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) { const struct machine_desc *mdesc, *mdesc_best = NULL; + unsigned long dt_root; + const u32 *rev; #ifdef CONFIG_ARCH_MULTIPLATFORM DT_MACHINE_START(GENERIC_DT, "Generic DT based system") @@ -215,17 +219,16 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) if (!dt_phys || !early_init_dt_verify(phys_to_virt(dt_phys))) return NULL; + dt_root = of_get_flat_dt_root(); mdesc = of_flat_dt_match_machine(mdesc_best, arch_get_next_mach); if (!mdesc) { const char *prop; int size; - unsigned long dt_root; early_print("\nError: unrecognized/unsupported " "device tree compatible list:\n[ "); - dt_root = of_get_flat_dt_root(); prop = of_get_flat_dt_prop(dt_root, "compatible", &size); while (size > 0) { early_print("'%s' ", prop); @@ -246,5 +249,10 @@ const struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys) /* Change machine number to match the mdesc we're using */ __machine_arch_type = mdesc->nr; + /* Set system revision from DT */ + rev = of_get_flat_dt_prop(dt_root, "revision", NULL); + if (rev) + system_rev = fdt32_to_cpu(*rev); + return mdesc; }
With this patch "/revision" DT entry is used to set global system_rev variable. DT "/revision" is expected to be u32 numeric value. TODO: add documentation Signed-off-by: Pali Rohár <pali.rohar@gmail.com> --- arch/arm/kernel/devtree.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)