diff mbox series

[1/2] spl: Introduce architecture specific init function

Message ID 20240320131928.1836386-2-lukas.funke-oss@weidmueller.com
State Superseded
Delegated to: Michal Simek
Headers show
Series Introduce spl_arch_init() for architecture specific initialization | expand

Commit Message

Lukas Funke March 20, 2024, 1:19 p.m. UTC
From: Lukas Funke <lukas.funke@weidmueller.com>

Some architectures use spl_board_init() in their architecture specific
implementation. Board developers should be able to add board specific
implementation via spl_board_init(). Hence, introduce a spl_arch_init()
method which is called right before spl_board_init() for architecture
specific implementation.

Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
---

 common/spl/Kconfig | 7 +++++++
 common/spl/spl.c   | 3 +++
 include/spl.h      | 8 ++++++++
 3 files changed, 18 insertions(+)

Comments

Tom Rini March 20, 2024, 2:30 p.m. UTC | #1
On Wed, Mar 20, 2024 at 02:19:26PM +0100, lukas.funke-oss@weidmueller.com wrote:

> From: Lukas Funke <lukas.funke@weidmueller.com>
> 
> Some architectures use spl_board_init() in their architecture specific
> implementation. Board developers should be able to add board specific
> implementation via spl_board_init(). Hence, introduce a spl_arch_init()
> method which is called right before spl_board_init() for architecture
> specific implementation.
> 
> Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>

I think this could allow for other SoCs to clean up their existing
ad-hoc mechanisms for SoC/architecture init and then board init, so this
looks like a good idea to me.

Reviewed-by: Tom Rini <trini@konsulko.com>
Devarsh Thakkar March 20, 2024, 3:22 p.m. UTC | #2
Hi Tom, Lukas,

Thanks for the patch Lukas.

On 20/03/24 20:00, Tom Rini wrote:
> On Wed, Mar 20, 2024 at 02:19:26PM +0100, lukas.funke-oss@weidmueller.com wrote:
> 
>> From: Lukas Funke <lukas.funke@weidmueller.com>
>>
>> Some architectures use spl_board_init() in their architecture specific
>> implementation. Board developers should be able to add board specific
>> implementation via spl_board_init(). Hence, introduce a spl_arch_init()
>> method which is called right before spl_board_init() for architecture
>> specific implementation.
>>
>> Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
> 
> I think this could allow for other SoCs to clean up their existing

Does it make more sense to make this SoC specific then instead of arch
specific to allow broader range of code?

For e.g., if we have something like spl_soc_init then it would help
accommodate soc specific functionality too along with calling arch specific code ?

Also I see some vendors already having implemented spl_soc_init in their arch
specific files [1], so I think it would be good if it is moved it to framework
level.

[1] :
https://source.denx.de/u-boot/u-boot/-/blob/master/arch/riscv/cpu/fu540/spl.c?ref_type=heads#L10
https://source.denx.de/u-boot/u-boot/-/blob/master/arch/riscv/include/asm/arch-fu740/spl.h?ref_type=heads#L12

Regards
Devarsh

> ad-hoc mechanisms for SoC/architecture init and then board init, so this
> looks like a good idea to me.
> 
> Reviewed-by: Tom Rini <trini@konsulko.com>
>
Tom Rini March 20, 2024, 3:33 p.m. UTC | #3
On Wed, Mar 20, 2024 at 08:52:30PM +0530, Devarsh Thakkar wrote:
> Hi Tom, Lukas,
> 
> Thanks for the patch Lukas.
> 
> On 20/03/24 20:00, Tom Rini wrote:
> > On Wed, Mar 20, 2024 at 02:19:26PM +0100, lukas.funke-oss@weidmueller.com wrote:
> > 
> >> From: Lukas Funke <lukas.funke@weidmueller.com>
> >>
> >> Some architectures use spl_board_init() in their architecture specific
> >> implementation. Board developers should be able to add board specific
> >> implementation via spl_board_init(). Hence, introduce a spl_arch_init()
> >> method which is called right before spl_board_init() for architecture
> >> specific implementation.
> >>
> >> Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
> > 
> > I think this could allow for other SoCs to clean up their existing
> 
> Does it make more sense to make this SoC specific then instead of arch
> specific to allow broader range of code?

"soc" and "arch" are somewhat interchangeable at times, so I think we
can go one step at a time here and bring in this abstraction and see
where everyone else is able to clean their code up to.
Andre Przywara March 20, 2024, 3:49 p.m. UTC | #4
On Wed, 20 Mar 2024 11:33:16 -0400
Tom Rini <trini@konsulko.com> wrote:

Hi,

> On Wed, Mar 20, 2024 at 08:52:30PM +0530, Devarsh Thakkar wrote:
> > Hi Tom, Lukas,
> > 
> > Thanks for the patch Lukas.
> > 
> > On 20/03/24 20:00, Tom Rini wrote:  
> > > On Wed, Mar 20, 2024 at 02:19:26PM +0100, lukas.funke-oss@weidmueller.com wrote:
> > >   
> > >> From: Lukas Funke <lukas.funke@weidmueller.com>
> > >>
> > >> Some architectures use spl_board_init() in their architecture specific
> > >> implementation. Board developers should be able to add board specific
> > >> implementation via spl_board_init(). Hence, introduce a spl_arch_init()
> > >> method which is called right before spl_board_init() for architecture
> > >> specific implementation.
> > >>
> > >> Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>  
> > > 
> > > I think this could allow for other SoCs to clean up their existing  
> > 
> > Does it make more sense to make this SoC specific then instead of arch
> > specific to allow broader range of code?  
> 
> "soc" and "arch" are somewhat interchangeable at times, so I think we

Isn't "arch" ambiguous anyway? I connect that with CPU architecture, as in
x86, ARM, RISC-V. And we have that in the top level directories: arch/arm,
etc.
But here it's one level below, isn't it? Where "platform" (or "plat")
would be a more suiting term to describe a SoC family, like xilinx or
sunxi?
So the hierarchy would be really: arch -> plat -> soc -> board?

Or am I confused here?

Cheers,
Andre


> can go one step at a time here and bring in this abstraction and see
> where everyone else is able to clean their code up to.
>
Lukas Funke March 21, 2024, 7:54 a.m. UTC | #5
On 20.03.2024 16:49, Andre Przywara wrote:
> On Wed, 20 Mar 2024 11:33:16 -0400
> Tom Rini <trini@konsulko.com> wrote:
> 
> Hi,
> 
>> On Wed, Mar 20, 2024 at 08:52:30PM +0530, Devarsh Thakkar wrote:
>>> Hi Tom, Lukas,
>>>
>>> Thanks for the patch Lukas.
>>>
>>> On 20/03/24 20:00, Tom Rini wrote:
>>>> On Wed, Mar 20, 2024 at 02:19:26PM +0100, lukas.funke-oss@weidmueller.com wrote:
>>>>    
>>>>> From: Lukas Funke <lukas.funke@weidmueller.com>
>>>>>
>>>>> Some architectures use spl_board_init() in their architecture specific
>>>>> implementation. Board developers should be able to add board specific
>>>>> implementation via spl_board_init(). Hence, introduce a spl_arch_init()
>>>>> method which is called right before spl_board_init() for architecture
>>>>> specific implementation.
>>>>>
>>>>> Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
>>>>
>>>> I think this could allow for other SoCs to clean up their existing
>>>
>>> Does it make more sense to make this SoC specific then instead of arch
>>> specific to allow broader range of code?
>>
>> "soc" and "arch" are somewhat interchangeable at times, so I think we
> 
> Isn't "arch" ambiguous anyway? I connect that with CPU architecture, as in
> x86, ARM, RISC-V. And we have that in the top level directories: arch/arm,
> etc.
> But here it's one level below, isn't it? Where "platform" (or "plat")
> would be a more suiting term to describe a SoC family, like xilinx or
> sunxi?
> So the hierarchy would be really: arch -> plat -> soc -> board?
> 
> Or am I confused here?

No. But in some cases the 'platform' level is missing: for xilinx it's 
"arch->arm->mach-zynq-><impl>", for rockchip it's 
"arch->arm->plat->soc", i.e. "arch->arm->mach-rockchip->rk3399-><impl>". 
If we follow your proposed rule it should be: 
arch->arm->mach-xilinx->zynq-><impl>. Maybe this is an idea for the next 
cleanup round?

Regarding the patch:

I'd agree that the init code is not (cpu)architecture dependent. Some 
vendors init the console, some init the ddr, some init the leds and so 
on. Thus, we should go one level upwards and change it to 
"spl_soc_init()" if everyone is okay with it?

Best regards,
Lukas

> 
> Cheers,
> Andre
> 
> 
>> can go one step at a time here and bring in this abstraction and see
>> where everyone else is able to clean their code up to.
>>
>
Michal Simek March 21, 2024, 3:13 p.m. UTC | #6
čt 21. 3. 2024 v 8:55 odesílatel Lukas Funke <
lukas.funke-oss@weidmueller.com> napsal:

> On 20.03.2024 16:49, Andre Przywara wrote:
> > On Wed, 20 Mar 2024 11:33:16 -0400
> > Tom Rini <trini@konsulko.com> wrote:
> >
> > Hi,
> >
> >> On Wed, Mar 20, 2024 at 08:52:30PM +0530, Devarsh Thakkar wrote:
> >>> Hi Tom, Lukas,
> >>>
> >>> Thanks for the patch Lukas.
> >>>
> >>> On 20/03/24 20:00, Tom Rini wrote:
> >>>> On Wed, Mar 20, 2024 at 02:19:26PM +0100,
> lukas.funke-oss@weidmueller.com wrote:
> >>>>
> >>>>> From: Lukas Funke <lukas.funke@weidmueller.com>
> >>>>>
> >>>>> Some architectures use spl_board_init() in their architecture
> specific
> >>>>> implementation. Board developers should be able to add board specific
> >>>>> implementation via spl_board_init(). Hence, introduce a
> spl_arch_init()
> >>>>> method which is called right before spl_board_init() for architecture
> >>>>> specific implementation.
> >>>>>
> >>>>> Signed-off-by: Lukas Funke <lukas.funke@weidmueller.com>
> >>>>
> >>>> I think this could allow for other SoCs to clean up their existing
> >>>
> >>> Does it make more sense to make this SoC specific then instead of arch
> >>> specific to allow broader range of code?
> >>
> >> "soc" and "arch" are somewhat interchangeable at times, so I think we
> >
> > Isn't "arch" ambiguous anyway? I connect that with CPU architecture, as
> in
> > x86, ARM, RISC-V. And we have that in the top level directories:
> arch/arm,
> > etc.
> > But here it's one level below, isn't it? Where "platform" (or "plat")
> > would be a more suiting term to describe a SoC family, like xilinx or
> > sunxi?
> > So the hierarchy would be really: arch -> plat -> soc -> board?
> >
> > Or am I confused here?
>
> No. But in some cases the 'platform' level is missing: for xilinx it's
> "arch->arm->mach-zynq-><impl>", for rockchip it's
> "arch->arm->plat->soc", i.e. "arch->arm->mach-rockchip->rk3399-><impl>".
> If we follow your proposed rule it should be:
> arch->arm->mach-xilinx->zynq-><impl>. Maybe this is an idea for the next
> cleanup round?
>
> Regarding the patch:
>
> I'd agree that the init code is not (cpu)architecture dependent. Some
> vendors init the console, some init the ddr, some init the leds and so
> on. Thus, we should go one level upwards and change it to
> "spl_soc_init()" if everyone is okay with it?
>
>
In our case soc and plat are the same.
Arch is clear that's armv7/v8,
socs/platform are zynq/zynqmp/versal/versal-net
And boards are generic/kria or antminer, syzygy, topic, etc.

And agree that we should do some cleanup in this.

Thanks,
Michal
diff mbox series

Patch

diff --git a/common/spl/Kconfig b/common/spl/Kconfig
index 6405374bcc..1a987037bb 100644
--- a/common/spl/Kconfig
+++ b/common/spl/Kconfig
@@ -272,6 +272,13 @@  config SPL_TEXT_BASE
 	help
 	  The address in memory that SPL will be running from.
 
+config SPL_ARCH_INIT
+	bool "Call arch-specific initialization in SPL"
+	help
+	  If this option is enabled, U-Boot will call the function
+	  spl_arch_init() from board_init_r(). This function should be
+	  provided by the architecture.
+
 config SPL_BOARD_INIT
 	bool "Call board-specific initialization in SPL"
 	help
diff --git a/common/spl/spl.c b/common/spl/spl.c
index b65c439e7a..2f2deae14f 100644
--- a/common/spl/spl.c
+++ b/common/spl/spl.c
@@ -711,6 +711,9 @@  void board_init_r(gd_t *dummy1, ulong dummy2)
 		}
 	}
 
+	if (CONFIG_IS_ENABLED(ARCH_INIT))
+		spl_arch_init();
+
 	if (CONFIG_IS_ENABLED(BOARD_INIT))
 		spl_board_init();
 
diff --git a/include/spl.h b/include/spl.h
index 043875f10f..2d23c8c0de 100644
--- a/include/spl.h
+++ b/include/spl.h
@@ -816,6 +816,14 @@  int spl_early_init(void);
  */
 int spl_init(void);
 
+/*
+ * spl_arch_init() - Do architecture-specific init in SPL
+ *
+ * If SPL_ARCH_INIT is enabled, this is called from board_init_r() before
+ * jumping to the next phase.
+ */
+void spl_arch_init(void);
+
 /*
  * spl_board_init() - Do board-specific init in SPL
  *