diff mbox series

[U-Boot,v4,2/5] arm: socfpga: fix U-Boot running from fpga OnChip RAM

Message ID 20180813193437.9539-3-simon.k.r.goldschmidt@gmail.com
State Superseded
Delegated to: Marek Vasut
Headers show
Series Get socfpga gen5 SPL working again. | expand

Commit Message

Simon Goldschmidt Aug. 13, 2018, 7:34 p.m. UTC
gd->env_addr points to pre-relocation address even after
relocation. This leads to an abort in env_callback_init
when loading the environment.

Fix this by enabling CONFIG_SYS_EXTRA_ENV_RELOC.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
---

Changes in v4: enable this fix for all socfpga, not for gen5 only
Changes in v3: this patch is new in v3
Changes in v2: None

 include/configs/socfpga_common.h | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Marek Vasut Aug. 13, 2018, 8:32 p.m. UTC | #1
On 08/13/2018 09:34 PM, Simon Goldschmidt wrote:
> gd->env_addr points to pre-relocation address even after
> relocation. This leads to an abort in env_callback_init
> when loading the environment.
> 
> Fix this by enabling CONFIG_SYS_EXTRA_ENV_RELOC.
> 
> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
> ---
> 
> Changes in v4: enable this fix for all socfpga, not for gen5 only
> Changes in v3: this patch is new in v3
> Changes in v2: None
> 
>  include/configs/socfpga_common.h | 6 ++++++
>  1 file changed, 6 insertions(+)
> 
> diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
> index 8ebf6b85fe..d1148b838b 100644
> --- a/include/configs/socfpga_common.h
> +++ b/include/configs/socfpga_common.h
> @@ -284,6 +284,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>  #define CONFIG_SPL_STACK		CONFIG_SYS_SPL_MALLOC_START
>  #endif
>  
> +/* When U-Boot is started from FPGA, prevent gd->env_addr to point into

Multi-line comment should have this format
/*
 * foo
 * bar
 */

> + * FPGA OnChip RAM after relocation
> + */
> +#define CONFIG_SYS_EXTRA_ENV_RELOC
> +#define CONFIG_SYS_MONITOR_BASE	CONFIG_SYS_TEXT_BASE	/* start of monitor */

What you don't explain in the commit message is this last line. Why is
this needed ?

>  /* Extra Environment */
>  #ifndef CONFIG_SPL_BUILD
>  
>
Simon Goldschmidt Aug. 14, 2018, 6:09 a.m. UTC | #2
Marek Vasut <marex@denx.de> schrieb am Mo., 13. Aug. 2018, 22:36:

> On 08/13/2018 09:34 PM, Simon Goldschmidt wrote:
> > gd->env_addr points to pre-relocation address even after
> > relocation. This leads to an abort in env_callback_init
> > when loading the environment.
> >
> > Fix this by enabling CONFIG_SYS_EXTRA_ENV_RELOC.
> >
> > Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
> > ---
> >
> > Changes in v4: enable this fix for all socfpga, not for gen5 only
> > Changes in v3: this patch is new in v3
> > Changes in v2: None
> >
> >  include/configs/socfpga_common.h | 6 ++++++
> >  1 file changed, 6 insertions(+)
> >
> > diff --git a/include/configs/socfpga_common.h
> b/include/configs/socfpga_common.h
> > index 8ebf6b85fe..d1148b838b 100644
> > --- a/include/configs/socfpga_common.h
> > +++ b/include/configs/socfpga_common.h
> > @@ -284,6 +284,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
> >  #define CONFIG_SPL_STACK             CONFIG_SYS_SPL_MALLOC_START
> >  #endif
> >
> > +/* When U-Boot is started from FPGA, prevent gd->env_addr to point into
>
> Multi-line comment should have this format
> /*
>  * foo
>  * bar
>  */
>

Right, of course. I wonder why patman didn't warm me about that...


> > + * FPGA OnChip RAM after relocation
> > + */
> > +#define CONFIG_SYS_EXTRA_ENV_RELOC
> > +#define CONFIG_SYS_MONITOR_BASE      CONFIG_SYS_TEXT_BASE    /* start
> of monitor */
>
> What you don't explain in the commit message is this last line. Why is
> this needed ?
>

The code enabled by CONFIG_SYS_EXTRA_ENV_RELOC used this to calculate the
relocation offset. I do think that's a bit strange, but I wouldn't change
it with this patchset, or should I?

Simon


> >  /* Extra Environment */
> >  #ifndef CONFIG_SPL_BUILD
> >
> >
>
>
> --
> Best regards,
> Marek Vasut
>
Marek Vasut Aug. 14, 2018, 8:37 a.m. UTC | #3
On 08/14/2018 08:09 AM, Simon Goldschmidt wrote:
> 
> 
> Marek Vasut <marex@denx.de <mailto:marex@denx.de>> schrieb am Mo., 13.
> Aug. 2018, 22:36:
> 
>     On 08/13/2018 09:34 PM, Simon Goldschmidt wrote:
>     > gd->env_addr points to pre-relocation address even after
>     > relocation. This leads to an abort in env_callback_init
>     > when loading the environment.
>     >
>     > Fix this by enabling CONFIG_SYS_EXTRA_ENV_RELOC.
>     >
>     > Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com
>     <mailto:simon.k.r.goldschmidt@gmail.com>>
>     > ---
>     >
>     > Changes in v4: enable this fix for all socfpga, not for gen5 only
>     > Changes in v3: this patch is new in v3
>     > Changes in v2: None
>     >
>     >  include/configs/socfpga_common.h | 6 ++++++
>     >  1 file changed, 6 insertions(+)
>     >
>     > diff --git a/include/configs/socfpga_common.h
>     b/include/configs/socfpga_common.h
>     > index 8ebf6b85fe..d1148b838b 100644
>     > --- a/include/configs/socfpga_common.h
>     > +++ b/include/configs/socfpga_common.h
>     > @@ -284,6 +284,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>     >  #define CONFIG_SPL_STACK             CONFIG_SYS_SPL_MALLOC_START
>     >  #endif
>     > 
>     > +/* When U-Boot is started from FPGA, prevent gd->env_addr to
>     point into
> 
>     Multi-line comment should have this format
>     /*
>      * foo
>      * bar
>      */
> 
> 
> Right, of course. I wonder why patman didn't warm me about that...
> 
> 
>     > + * FPGA OnChip RAM after relocation
>     > + */
>     > +#define CONFIG_SYS_EXTRA_ENV_RELOC
>     > +#define CONFIG_SYS_MONITOR_BASE      CONFIG_SYS_TEXT_BASE    /*
>     start of monitor */
> 
>     What you don't explain in the commit message is this last line. Why is
>     this needed ?
> 
> 
> The code enabled by CONFIG_SYS_EXTRA_ENV_RELOC used this to calculate
> the relocation offset. I do think that's a bit strange, but I wouldn't
> change it with this patchset, or should I?

You should document _why_ this is needed. Not "because the code enabled
by foo needed this", but why that code enabled this and why setting it
to SYS_TEXT_BASE is correct.
Simon Goldschmidt Aug. 14, 2018, 8:19 p.m. UTC | #4
On Tue, Aug 14, 2018 at 10:37 AM Marek Vasut <marex@denx.de> wrote:
>
> On 08/14/2018 08:09 AM, Simon Goldschmidt wrote:
> >
> >
> > Marek Vasut <marex@denx.de <mailto:marex@denx.de>> schrieb am Mo., 13.
> > Aug. 2018, 22:36:
> >
> >     On 08/13/2018 09:34 PM, Simon Goldschmidt wrote:
> >     > gd->env_addr points to pre-relocation address even after
> >     > relocation. This leads to an abort in env_callback_init
> >     > when loading the environment.
> >     >
> >     > Fix this by enabling CONFIG_SYS_EXTRA_ENV_RELOC.
> >     >
> >     > Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com
> >     <mailto:simon.k.r.goldschmidt@gmail.com>>
> >     > ---
> >     >
> >     > Changes in v4: enable this fix for all socfpga, not for gen5 only
> >     > Changes in v3: this patch is new in v3
> >     > Changes in v2: None
> >     >
> >     >  include/configs/socfpga_common.h | 6 ++++++
> >     >  1 file changed, 6 insertions(+)
> >     >
> >     > diff --git a/include/configs/socfpga_common.h
> >     b/include/configs/socfpga_common.h
> >     > index 8ebf6b85fe..d1148b838b 100644
> >     > --- a/include/configs/socfpga_common.h
> >     > +++ b/include/configs/socfpga_common.h
> >     > @@ -284,6 +284,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
> >     >  #define CONFIG_SPL_STACK             CONFIG_SYS_SPL_MALLOC_START
> >     >  #endif
> >     >
> >     > +/* When U-Boot is started from FPGA, prevent gd->env_addr to
> >     point into
> >
> >     Multi-line comment should have this format
> >     /*
> >      * foo
> >      * bar
> >      */
> >
> >
> > Right, of course. I wonder why patman didn't warm me about that...
> >
> >
> >     > + * FPGA OnChip RAM after relocation
> >     > + */
> >     > +#define CONFIG_SYS_EXTRA_ENV_RELOC
> >     > +#define CONFIG_SYS_MONITOR_BASE      CONFIG_SYS_TEXT_BASE    /*
> >     start of monitor */
> >
> >     What you don't explain in the commit message is this last line. Why is
> >     this needed ?
> >
> >
> > The code enabled by CONFIG_SYS_EXTRA_ENV_RELOC used this to calculate
> > the relocation offset. I do think that's a bit strange, but I wouldn't
> > change it with this patchset, or should I?
>
> You should document _why_ this is needed. Not "because the code enabled
> by foo needed this", but why that code enabled this and why setting it
> to SYS_TEXT_BASE is correct.

Yes, I wouldn't have sent a patch like that. I rather wanted to phrase
that I don't know why this is needed for env relocation, as fdt
relocation just uses gd->reloc_off. That might work for env
relocation, too, but changing that seems out of scope for this
patchset.

Simon
Marek Vasut Aug. 15, 2018, 7:55 a.m. UTC | #5
On 08/14/2018 10:19 PM, Simon Goldschmidt wrote:
> On Tue, Aug 14, 2018 at 10:37 AM Marek Vasut <marex@denx.de> wrote:
>>
>> On 08/14/2018 08:09 AM, Simon Goldschmidt wrote:
>>>
>>>
>>> Marek Vasut <marex@denx.de <mailto:marex@denx.de>> schrieb am Mo., 13.
>>> Aug. 2018, 22:36:
>>>
>>>     On 08/13/2018 09:34 PM, Simon Goldschmidt wrote:
>>>     > gd->env_addr points to pre-relocation address even after
>>>     > relocation. This leads to an abort in env_callback_init
>>>     > when loading the environment.
>>>     >
>>>     > Fix this by enabling CONFIG_SYS_EXTRA_ENV_RELOC.
>>>     >
>>>     > Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com
>>>     <mailto:simon.k.r.goldschmidt@gmail.com>>
>>>     > ---
>>>     >
>>>     > Changes in v4: enable this fix for all socfpga, not for gen5 only
>>>     > Changes in v3: this patch is new in v3
>>>     > Changes in v2: None
>>>     >
>>>     >  include/configs/socfpga_common.h | 6 ++++++
>>>     >  1 file changed, 6 insertions(+)
>>>     >
>>>     > diff --git a/include/configs/socfpga_common.h
>>>     b/include/configs/socfpga_common.h
>>>     > index 8ebf6b85fe..d1148b838b 100644
>>>     > --- a/include/configs/socfpga_common.h
>>>     > +++ b/include/configs/socfpga_common.h
>>>     > @@ -284,6 +284,12 @@ unsigned int cm_get_qspi_controller_clk_hz(void);
>>>     >  #define CONFIG_SPL_STACK             CONFIG_SYS_SPL_MALLOC_START
>>>     >  #endif
>>>     >
>>>     > +/* When U-Boot is started from FPGA, prevent gd->env_addr to
>>>     point into
>>>
>>>     Multi-line comment should have this format
>>>     /*
>>>      * foo
>>>      * bar
>>>      */
>>>
>>>
>>> Right, of course. I wonder why patman didn't warm me about that...
>>>
>>>
>>>     > + * FPGA OnChip RAM after relocation
>>>     > + */
>>>     > +#define CONFIG_SYS_EXTRA_ENV_RELOC
>>>     > +#define CONFIG_SYS_MONITOR_BASE      CONFIG_SYS_TEXT_BASE    /*
>>>     start of monitor */
>>>
>>>     What you don't explain in the commit message is this last line. Why is
>>>     this needed ?
>>>
>>>
>>> The code enabled by CONFIG_SYS_EXTRA_ENV_RELOC used this to calculate
>>> the relocation offset. I do think that's a bit strange, but I wouldn't
>>> change it with this patchset, or should I?
>>
>> You should document _why_ this is needed. Not "because the code enabled
>> by foo needed this", but why that code enabled this and why setting it
>> to SYS_TEXT_BASE is correct.
> 
> Yes, I wouldn't have sent a patch like that. I rather wanted to phrase
> that I don't know why this is needed for env relocation, as fdt
> relocation just uses gd->reloc_off. That might work for env
> relocation, too, but changing that seems out of scope for this
> patchset.

Maybe the comment in board_r.c explains why?

143 #ifdef CONFIG_SYS_EXTRA_ENV_RELOC
144         /*
145          * Some systems need to relocate the env_addr pointer early
because the
146          * location it points to will get invalidated before
env_relocate is
147          * called.  One example is on systems that might use a L2 or
L3 cache
148          * in SRAM mode and initialize that cache from SRAM mode
back to being
149          * a cache in cpu_init_r.
150          */
151         gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE;
152 #endif

But then the env shouldn't point to pre-reloc address after relocation
according to the comment ?
diff mbox series

Patch

diff --git a/include/configs/socfpga_common.h b/include/configs/socfpga_common.h
index 8ebf6b85fe..d1148b838b 100644
--- a/include/configs/socfpga_common.h
+++ b/include/configs/socfpga_common.h
@@ -284,6 +284,12 @@  unsigned int cm_get_qspi_controller_clk_hz(void);
 #define CONFIG_SPL_STACK		CONFIG_SYS_SPL_MALLOC_START
 #endif
 
+/* When U-Boot is started from FPGA, prevent gd->env_addr to point into
+ * FPGA OnChip RAM after relocation
+ */
+#define CONFIG_SYS_EXTRA_ENV_RELOC
+#define CONFIG_SYS_MONITOR_BASE	CONFIG_SYS_TEXT_BASE	/* start of monitor */
+
 /* Extra Environment */
 #ifndef CONFIG_SPL_BUILD