[PATCH v3 01/17] dm: Emit the arch_cpu_init_dm() even only before relocation

Simon Glass sjg at chromium.org
Mon Jun 12 23:17:35 CEST 2023


Hi Jan,

On Sun, 4 Jun 2023 at 13:05, Jan Kiszka <jan.kiszka at siemens.com> wrote:
>
> On 05.05.23 00:50, Simon Glass wrote:
> > The original function was only called once, before relocation. The new
> > one is called again after relocation. This was not the intent of the
> > original call. Fix this by renaming and updating the calling logic.
> >
> > With this, chromebook_link64 makes it through SPL.
> >
> > Fixes: 7fe32b3442f ("event: Convert arch_cpu_init_dm() to")
> > Fixes: 7fe32b3442f0 ("event: Convert arch_cpu_init_dm() to use events")
> > Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > Changes in v3:
> > - Fix 'intend' typo
> >
> >  arch/arm/mach-imx/imx8/cpu.c        | 2 +-
> >  arch/arm/mach-imx/imx8m/soc.c       | 2 +-
> >  arch/arm/mach-imx/imx8ulp/soc.c     | 2 +-
> >  arch/arm/mach-imx/imx9/soc.c        | 2 +-
> >  arch/arm/mach-omap2/am33xx/board.c  | 2 +-
> >  arch/arm/mach-omap2/hwinit-common.c | 2 +-
> >  arch/mips/mach-pic32/cpu.c          | 2 +-
> >  arch/nios2/cpu/cpu.c                | 2 +-
> >  arch/riscv/cpu/cpu.c                | 2 +-
> >  arch/x86/cpu/baytrail/cpu.c         | 2 +-
> >  arch/x86/cpu/broadwell/cpu.c        | 2 +-
> >  arch/x86/cpu/ivybridge/cpu.c        | 2 +-
> >  arch/x86/cpu/quark/quark.c          | 2 +-
> >  arch/x86/lib/fsp2/fsp_init.c        | 2 +-
> >  doc/develop/event.rst               | 6 +++---
> >  drivers/core/root.c                 | 4 ++--
> >  drivers/cpu/microblaze_cpu.c        | 2 +-
> >  include/event.h                     | 2 +-
> >  18 files changed, 21 insertions(+), 21 deletions(-)
> >
> > diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c
> > index be1f4edded1..99772f68c32 100644
> > --- a/arch/arm/mach-imx/imx8/cpu.c
> > +++ b/arch/arm/mach-imx/imx8/cpu.c
> > @@ -89,7 +89,7 @@ static int imx8_init_mu(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, imx8_init_mu);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, imx8_init_mu);
> >
> >  #if defined(CONFIG_ARCH_MISC_INIT)
> >  int arch_misc_init(void)
> > diff --git a/arch/arm/mach-imx/imx8m/soc.c b/arch/arm/mach-imx/imx8m/soc.c
> > index 4705e6c1192..5a4f8358c9f 100644
> > --- a/arch/arm/mach-imx/imx8m/soc.c
> > +++ b/arch/arm/mach-imx/imx8m/soc.c
> > @@ -549,7 +549,7 @@ static int imx8m_check_clock(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, imx8m_check_clock);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, imx8m_check_clock);
> >
> >  static void imx8m_setup_snvs(void)
> >  {
> > diff --git a/arch/arm/mach-imx/imx8ulp/soc.c b/arch/arm/mach-imx/imx8ulp/soc.c
> > index 8424332f429..81eae02b6a8 100644
> > --- a/arch/arm/mach-imx/imx8ulp/soc.c
> > +++ b/arch/arm/mach-imx/imx8ulp/soc.c
> > @@ -808,7 +808,7 @@ static int imx8ulp_evt_dm_post_init(void *ctx, struct event *event)
> >  {
> >       return imx8ulp_dm_post_init();
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, imx8ulp_evt_dm_post_init);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, imx8ulp_evt_dm_post_init);
> >
> >  #if defined(CONFIG_SPL_BUILD)
> >  __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
> > diff --git a/arch/arm/mach-imx/imx9/soc.c b/arch/arm/mach-imx/imx9/soc.c
> > index a16e22ea6bb..252663a9eec 100644
> > --- a/arch/arm/mach-imx/imx9/soc.c
> > +++ b/arch/arm/mach-imx/imx9/soc.c
> > @@ -262,7 +262,7 @@ int imx9_probe_mu(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, imx9_probe_mu);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, imx9_probe_mu);
> >
> >  int timer_init(void)
> >  {
> > diff --git a/arch/arm/mach-omap2/am33xx/board.c b/arch/arm/mach-omap2/am33xx/board.c
> > index a52d04d85c8..ecc0a592e99 100644
> > --- a/arch/arm/mach-omap2/am33xx/board.c
> > +++ b/arch/arm/mach-omap2/am33xx/board.c
> > @@ -535,4 +535,4 @@ static int am33xx_dm_post_init(void *ctx, struct event *event)
> >  #endif
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, am33xx_dm_post_init);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, am33xx_dm_post_init);
> > diff --git a/arch/arm/mach-omap2/hwinit-common.c b/arch/arm/mach-omap2/hwinit-common.c
> > index c4a8eabc3eb..771533394bc 100644
> > --- a/arch/arm/mach-omap2/hwinit-common.c
> > +++ b/arch/arm/mach-omap2/hwinit-common.c
> > @@ -246,7 +246,7 @@ static int omap2_system_init(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, omap2_system_init);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, omap2_system_init);
> >
> >  /*
> >   * Routine: wait_for_command_complete
> > diff --git a/arch/mips/mach-pic32/cpu.c b/arch/mips/mach-pic32/cpu.c
> > index de449e3c6a2..ec3c2505313 100644
> > --- a/arch/mips/mach-pic32/cpu.c
> > +++ b/arch/mips/mach-pic32/cpu.c
> > @@ -102,7 +102,7 @@ static int pic32_flash_prefetch(void *ctx, struct event *event)
> >       prefetch_init();
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, pic32_flash_prefetch);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, pic32_flash_prefetch);
> >
> >  /* Un-gate DDR2 modules (gated by default) */
> >  static void ddr2_pmd_ungate(void)
> > diff --git a/arch/nios2/cpu/cpu.c b/arch/nios2/cpu/cpu.c
> > index 85544503a5e..da167f4b29e 100644
> > --- a/arch/nios2/cpu/cpu.c
> > +++ b/arch/nios2/cpu/cpu.c
> > @@ -80,7 +80,7 @@ static int nios_cpu_setup(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, nios_cpu_setup);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, nios_cpu_setup);
> >
> >  static int altera_nios2_get_desc(const struct udevice *dev, char *buf,
> >                                int size)
> > diff --git a/arch/riscv/cpu/cpu.c b/arch/riscv/cpu/cpu.c
> > index e1ed4ec01d0..ecfb1fb08c4 100644
> > --- a/arch/riscv/cpu/cpu.c
> > +++ b/arch/riscv/cpu/cpu.c
> > @@ -145,7 +145,7 @@ int riscv_cpu_setup(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, riscv_cpu_setup);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, riscv_cpu_setup);
> >
> >  int arch_early_init_r(void)
> >  {
> > diff --git a/arch/x86/cpu/baytrail/cpu.c b/arch/x86/cpu/baytrail/cpu.c
> > index 4fb6a485542..4a7b4f617f8 100644
> > --- a/arch/x86/cpu/baytrail/cpu.c
> > +++ b/arch/x86/cpu/baytrail/cpu.c
> > @@ -64,7 +64,7 @@ static int baytrail_uart_init(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, baytrail_uart_init);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, baytrail_uart_init);
> >
> >  static void set_max_freq(void)
> >  {
> > diff --git a/arch/x86/cpu/broadwell/cpu.c b/arch/x86/cpu/broadwell/cpu.c
> > index 7877961451a..f30aebfe4c6 100644
> > --- a/arch/x86/cpu/broadwell/cpu.c
> > +++ b/arch/x86/cpu/broadwell/cpu.c
> > @@ -40,7 +40,7 @@ static int broadwell_init_cpu(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, broadwell_init_cpu);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, broadwell_init_cpu);
> >
> >  void set_max_freq(void)
> >  {
> > diff --git a/arch/x86/cpu/ivybridge/cpu.c b/arch/x86/cpu/ivybridge/cpu.c
> > index cffc5d5b1d8..c988d7ff477 100644
> > --- a/arch/x86/cpu/ivybridge/cpu.c
> > +++ b/arch/x86/cpu/ivybridge/cpu.c
> > @@ -86,7 +86,7 @@ static int ivybridge_cpu_init(void *ctx, struct event *ev)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, ivybridge_cpu_init);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, ivybridge_cpu_init);
> >
> >  #define PCH_EHCI0_TEMP_BAR0 0xe8000000
> >  #define PCH_EHCI1_TEMP_BAR0 0xe8000400
> > diff --git a/arch/x86/cpu/quark/quark.c b/arch/x86/cpu/quark/quark.c
> > index 0a1fbb34d40..1be8e38cdf4 100644
> > --- a/arch/x86/cpu/quark/quark.c
> > +++ b/arch/x86/cpu/quark/quark.c
> > @@ -263,7 +263,7 @@ static int quark_init_pcie(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, quark_init_pcie);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, quark_init_pcie);
> >
> >  int checkcpu(void)
> >  {
> > diff --git a/arch/x86/lib/fsp2/fsp_init.c b/arch/x86/lib/fsp2/fsp_init.c
> > index b15926e8247..afec7d08d67 100644
> > --- a/arch/x86/lib/fsp2/fsp_init.c
> > +++ b/arch/x86/lib/fsp2/fsp_init.c
> > @@ -42,7 +42,7 @@ int fsp_setup_pinctrl(void *ctx, struct event *event)
> >
> >       return ret;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, fsp_setup_pinctrl);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, fsp_setup_pinctrl);
> >
> >  #if !defined(CONFIG_TPL_BUILD)
> >  binman_sym_declare(ulong, intel_fsp_m, image_pos);
> > diff --git a/doc/develop/event.rst b/doc/develop/event.rst
> > index 4ff59348371..4c34fffc63b 100644
> > --- a/doc/develop/event.rst
> > +++ b/doc/develop/event.rst
> > @@ -11,7 +11,7 @@ block device is probed.
> >  Rather than using weak functions and direct calls across subsystemss, it is
> >  often easier to use an event.
> >
> > -An event consists of a type (e.g. EVT_DM_POST_INIT) and some optional data,
> > +An event consists of a type (e.g. EVT_DM_POST_INIT_F) and some optional data,
> >  in `union event_data`. An event spy can be creasted to watch for events of a
> >  particular type. When the event is created, it is sent to each spy in turn.
> >
> > @@ -26,9 +26,9 @@ To declare a spy, use something like this::
> >          /* do something */
> >          return 0;
> >      }
> > -    EVENT_SPY(EVT_DM_POST_INIT, snow_setup_cpus);
> > +    EVENT_SPY(EVT_DM_POST_INIT_F, snow_setup_cpus);
> >
> > -Your function is called when EVT_DM_POST_INIT is emitted, i.e. after driver
> > +Your function is called when EVT_DM_POST_INIT_F is emitted, i.e. after driver
> >  model is inited (in SPL, or in U-Boot proper before and after relocation).
> >
> >
> > diff --git a/drivers/core/root.c b/drivers/core/root.c
> > index c4fb48548bb..6775fb0b657 100644
> > --- a/drivers/core/root.c
> > +++ b/drivers/core/root.c
> > @@ -436,8 +436,8 @@ int dm_init_and_scan(bool pre_reloc_only)
> >                       return ret;
> >               }
> >       }
> > -     if (CONFIG_IS_ENABLED(DM_EVENT)) {
> > -             ret = event_notify_null(EVT_DM_POST_INIT);
> > +     if (CONFIG_IS_ENABLED(DM_EVENT) && !(gd->flags & GD_FLG_RELOC)) {
> > +             ret = event_notify_null(EVT_DM_POST_INIT_F);
> >               if (ret)
> >                       return log_msg_ret("ev", ret);
> >       }
> > diff --git a/drivers/cpu/microblaze_cpu.c b/drivers/cpu/microblaze_cpu.c
> > index b9d07928223..c97a89fbd5c 100644
> > --- a/drivers/cpu/microblaze_cpu.c
> > +++ b/drivers/cpu/microblaze_cpu.c
> > @@ -29,7 +29,7 @@ static int microblaze_cpu_probe_all(void *ctx, struct event *event)
> >
> >       return 0;
> >  }
> > -EVENT_SPY(EVT_DM_POST_INIT, microblaze_cpu_probe_all);
> > +EVENT_SPY(EVT_DM_POST_INIT_F, microblaze_cpu_probe_all);
> >
> >  static void microblaze_set_cpuinfo_pvr(struct microblaze_cpuinfo *ci)
> >  {
> > diff --git a/include/event.h b/include/event.h
> > index e4580b68350..fe41080fa63 100644
> > --- a/include/event.h
> > +++ b/include/event.h
> > @@ -22,7 +22,7 @@ enum event_t {
> >       EVT_TEST,
> >
> >       /* Events related to driver model */
> > -     EVT_DM_POST_INIT,
> > +     EVT_DM_POST_INIT_F,
> >       EVT_DM_PRE_PROBE,
> >       EVT_DM_POST_PROBE,
> >       EVT_DM_PRE_REMOVE,
>
> This broke the VisonFive2:
>
> ...
> U-Boot 2023.07-rc2-00058-g55171aedda8 (Jun 04 2023 - 14:00:57 +0200)
>
> CPU:   rv64imafdc_zba_zbb
> Model: StarFive VisionFive 2 v1.3B
> DRAM:  8 GiB
> initcall sequence 00000000fffe0b10 failed at call 00000000402160bc (err=-19)
> ### ERROR ### Please RESET the board ###
>
>
> Already known?

Yes there was a thread about it. I am not sure why, though. The change
dropped calling this function after relocation, but it is still called
before relocation.

Actually, perhaps:
- before relocation the CPU devices are not bound (no bootph-pre-ram tags)
- after relocation it is no-longer called
- so it breaks?

The fix could be to add a new EVT_DM_POST_INIT_R event?

Regards,
Simon


More information about the U-Boot mailing list