Patchwork [U-Boot] x86: Add a default implementation for cleanup_before_linux.

login
register
mail settings
Submitter Gabe Black
Date Dec. 6, 2011, 1:55 a.m.
Message ID <1323136554-24015-1-git-send-email-gabeblack@chromium.org>
Download mbox | patch
Permalink /patch/129493/
State Superseded, archived
Delegated to: Simon Glass
Headers show

Comments

Gabe Black - Dec. 6, 2011, 1:55 a.m.
This function provides an opportunity for some last minute cleanup and
reconfiguration before control is handed over to Linux. It's possible this
may need to do something in the future, but for now it's left empty. It's set
up as a weak symbol so it can be overridden if necessary on a case by case
basis.

Signed-off-by: Gabe Black <gabeblack@chromium.org>
---
 arch/x86/cpu/cpu.c                |    8 ++++++++
 arch/x86/include/asm/u-boot-x86.h |    1 +
 2 files changed, 9 insertions(+), 0 deletions(-)
Graeme Russ - Dec. 6, 2011, 2:04 a.m.
Hi Gabe,

On Tue, Dec 6, 2011 at 12:55 PM, Gabe Black <gabeblack@chromium.org> wrote:
> This function provides an opportunity for some last minute cleanup and
> reconfiguration before control is handed over to Linux. It's possible this
> may need to do something in the future, but for now it's left empty. It's set
> up as a weak symbol so it can be overridden if necessary on a case by case
> basis.
>
> Signed-off-by: Gabe Black <gabeblack@chromium.org>
> ---
>  arch/x86/cpu/cpu.c                |    8 ++++++++
>  arch/x86/include/asm/u-boot-x86.h |    1 +
>  2 files changed, 9 insertions(+), 0 deletions(-)
>
> diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> index 61d0b69..3a2a64a 100644
> --- a/arch/x86/cpu/cpu.c
> +++ b/arch/x86/cpu/cpu.c
> @@ -86,6 +86,14 @@ static void reload_gdt(void)
>                     : : "m" (gdt) : "ecx");
>  }
>
> +int x86_cleanup_before_linux(void)
> +{
> +       return 0;
> +}
> +int cleanup_before_linux(void)
> +       __attribute__((weak, alias("x86_cleanup_before_linux")));
> +
> +
>  int x86_cpu_init_f(void)
>  {
>        const u32 em_rst = ~X86_CR0_EM;
> diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
> index 755f88a..8cc4be6 100644
> --- a/arch/x86/include/asm/u-boot-x86.h
> +++ b/arch/x86/include/asm/u-boot-x86.h
> @@ -37,6 +37,7 @@ int x86_cpu_init_r(void);
>  int cpu_init_r(void);
>  int x86_cpu_init_f(void);
>  int cpu_init_f(void);
> +int cleanup_before_linux(void);
>
>  /* cpu/.../timer.c */
>  void timer_isr(void *);
> --
> 1.7.3.1

Hmmm, interesting...

sc520 already has a function to put the board into maximal PC/AT
compatibility mode because, quite frankly, that was the easiest way to get
Linux working. So this seems to be a logical extension of that hook...

However, I while ago I had a crack at cleaning up the U-Boot init sequence
using a concept blantantly stolen from Linux[1],[2]. I wonder if it might
be worth looking at a similar solution here. That would allow CPU, arch
and board specific 'cleanups' to be dynamically defined without having to
do a whole bunch of background plumbing...

Regards,

Graeme

[1] http://patchwork.ozlabs.org/patch/110316/ and
[2] http://patchwork.ozlabs.org/patch/110515/
Gabe Black - Dec. 6, 2011, 5:55 a.m.
On Mon, Dec 5, 2011 at 9:04 PM, Graeme Russ <graeme.russ@gmail.com> wrote:

> Hi Gabe,
>
> On Tue, Dec 6, 2011 at 12:55 PM, Gabe Black <gabeblack@chromium.org>
> wrote:
> > This function provides an opportunity for some last minute cleanup and
> > reconfiguration before control is handed over to Linux. It's possible
> this
> > may need to do something in the future, but for now it's left empty.
> It's set
> > up as a weak symbol so it can be overridden if necessary on a case by
> case
> > basis.
> >
> > Signed-off-by: Gabe Black <gabeblack@chromium.org>
> > ---
> >  arch/x86/cpu/cpu.c                |    8 ++++++++
> >  arch/x86/include/asm/u-boot-x86.h |    1 +
> >  2 files changed, 9 insertions(+), 0 deletions(-)
> >
> > diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
> > index 61d0b69..3a2a64a 100644
> > --- a/arch/x86/cpu/cpu.c
> > +++ b/arch/x86/cpu/cpu.c
> > @@ -86,6 +86,14 @@ static void reload_gdt(void)
> >                     : : "m" (gdt) : "ecx");
> >  }
> >
> > +int x86_cleanup_before_linux(void)
> > +{
> > +       return 0;
> > +}
> > +int cleanup_before_linux(void)
> > +       __attribute__((weak, alias("x86_cleanup_before_linux")));
> > +
> > +
> >  int x86_cpu_init_f(void)
> >  {
> >        const u32 em_rst = ~X86_CR0_EM;
> > diff --git a/arch/x86/include/asm/u-boot-x86.h
> b/arch/x86/include/asm/u-boot-x86.h
> > index 755f88a..8cc4be6 100644
> > --- a/arch/x86/include/asm/u-boot-x86.h
> > +++ b/arch/x86/include/asm/u-boot-x86.h
> > @@ -37,6 +37,7 @@ int x86_cpu_init_r(void);
> >  int cpu_init_r(void);
> >  int x86_cpu_init_f(void);
> >  int cpu_init_f(void);
> > +int cleanup_before_linux(void);
> >
> >  /* cpu/.../timer.c */
> >  void timer_isr(void *);
> > --
> > 1.7.3.1
>
> Hmmm, interesting...
>
> sc520 already has a function to put the board into maximal PC/AT
> compatibility mode because, quite frankly, that was the easiest way to get
> Linux working. So this seems to be a logical extension of that hook...
>
> However, I while ago I had a crack at cleaning up the U-Boot init sequence
> using a concept blantantly stolen from Linux[1],[2]. I wonder if it might
> be worth looking at a similar solution here. That would allow CPU, arch
> and board specific 'cleanups' to be dynamically defined without having to
> do a whole bunch of background plumbing...
>
> Regards,
>
> Graeme
>
> [1] http://patchwork.ozlabs.org/patch/110316/ and
> [2] http://patchwork.ozlabs.org/patch/110515/
>


This is primarily to get otherwise generic code which uses this function to
compile for x86. It could be expanded to actually do something useful which
the commit message suggests. That would go in a follow on commit since it's
outside the scope of what I'm trying to do here.

Gabe

Patch

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 61d0b69..3a2a64a 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -86,6 +86,14 @@  static void reload_gdt(void)
 		     : : "m" (gdt) : "ecx");
 }
 
+int x86_cleanup_before_linux(void)
+{
+	return 0;
+}
+int cleanup_before_linux(void)
+	__attribute__((weak, alias("x86_cleanup_before_linux")));
+
+
 int x86_cpu_init_f(void)
 {
 	const u32 em_rst = ~X86_CR0_EM;
diff --git a/arch/x86/include/asm/u-boot-x86.h b/arch/x86/include/asm/u-boot-x86.h
index 755f88a..8cc4be6 100644
--- a/arch/x86/include/asm/u-boot-x86.h
+++ b/arch/x86/include/asm/u-boot-x86.h
@@ -37,6 +37,7 @@  int x86_cpu_init_r(void);
 int cpu_init_r(void);
 int x86_cpu_init_f(void);
 int cpu_init_f(void);
+int cleanup_before_linux(void);
 
 /* cpu/.../timer.c */
 void timer_isr(void *);