[U-Boot] [PATCH 066/126] x86: spl: Support init of a PUNIT
Simon Glass
sjg at chromium.org
Mon Oct 14 20:02:32 UTC 2019
Hi Bin,
On Wed, 9 Oct 2019 at 08:02, Bin Meng <bmeng.cn at gmail.com> wrote:
>
> Hi Simon,
>
> On Wed, Sep 25, 2019 at 10:58 PM Simon Glass <sjg at chromium.org> wrote:
> >
> > The x86 power unit handles power management. Support initing this device
> > which is modelled as a new type of system controller since there are no
> > operations needed.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> > arch/x86/include/asm/cpu.h | 1 +
> > arch/x86/lib/spl.c | 40 ++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 41 insertions(+)
> >
> > diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h
> > index feee0f915f6..21a05dab7de 100644
> > --- a/arch/x86/include/asm/cpu.h
> > +++ b/arch/x86/include/asm/cpu.h
> > @@ -55,6 +55,7 @@ enum {
> > X86_SYSCON_PINCONF, /* Intel x86 pin configuration */
> > X86_SYSCON_PMU, /* Power Management Unit */
> > X86_SYSCON_SCU, /* System Controller Unit */
> > + X86_SYSCON_PUNIT, /* Power unit */
> > };
> >
> > struct cpuid_result {
> > diff --git a/arch/x86/lib/spl.c b/arch/x86/lib/spl.c
> > index 2baac913837..db1ce67a590 100644
> > --- a/arch/x86/lib/spl.c
> > +++ b/arch/x86/lib/spl.c
> > @@ -5,11 +5,15 @@
> >
> > #include <common.h>
> > #include <debug_uart.h>
> > +#include <dm.h>
> > #include <malloc.h>
> > #include <spl.h>
> > +#include <syscon.h>
> > #include <asm/cpu.h>
> > +#include <asm/cpu_common.h>
> > #include <asm/mrccache.h>
> > #include <asm/mtrr.h>
> > +#include <asm/pci.h>
> > #include <asm/processor.h>
> > #include <asm/spl.h>
> > #include <asm-generic/sections.h>
> > @@ -21,6 +25,32 @@ __weak int arch_cpu_init_dm(void)
> > return 0;
> > }
> >
> > +#ifdef CONFIG_TPL
> > +
> > +static int set_max_freq(void)
> > +{
> > + if (cpu_get_burst_mode_state() == BURST_MODE_UNAVAILABLE) {
> > + /*
> > + * Burst Mode has been factory-configured as disabled and is not
> > + * available in this physical processor package
> > + */
> > + debug("Burst Mode is factory-disabled\n");
> > + return -ENOENT;
> > + }
> > +
> > + /* Enable burst mode */
> > + cpu_set_burst_mode(true);
> > +
> > + /* Enable speed step */
> > + cpu_set_eist(true);
> > +
> > + /* Set P-State ratio */
> > + cpu_set_p_state_to_turbo_ratio();
> > +
> > + return 0;
> > +}
> > +#endif
> > +
> > static int x86_spl_init(void)
> > {
> > #ifndef CONFIG_TPL
> > @@ -31,6 +61,8 @@ static int x86_spl_init(void)
> > * place it immediately below CONFIG_SYS_TEXT_BASE.
> > */
> > char *ptr = (char *)0x110000;
> > +#else
> > + struct udevice *punit;
> > #endif
> > int ret;
> >
> > @@ -101,6 +133,14 @@ static int x86_spl_init(void)
> > return ret;
> > }
> > mtrr_commit(true);
> > +#else
> > + ret = syscon_get_by_driver_data(X86_SYSCON_PUNIT, &punit);
> > + if (ret)
> > + debug("Could not find PUNIT (err-%d)\n", ret);
>
> err=%d
>
> But I wonder what's the purpose of init punit at this point?
See punit_init() - among other things it tells the systemagent that
U-Boot is running and sets the thermal target for the device.
>
> > +
> > + ret = set_max_freq();
>
> Can we delay this to U-Boot proper? I don't see a need to bring the
> core up to speed at this early stage.
Yes, but it does add time. SPL is 8ms slower without this, and getting
to board_init_r() in U-Boot is 50ms slower.
>
> > + if (ret)
> > + debug("Failed to set CPU frequency (err=%d)\n", ret);
> > #endif
> >
> > return 0;
> > --
>
> Regards,
> Bin
More information about the U-Boot
mailing list