x86: spl: Support init of a PUNIT
authorSimon Glass <sjg@chromium.org>
Mon, 21 Oct 2019 03:37:49 +0000 (21:37 -0600)
committerBin Meng <bmeng.cn@gmail.com>
Sat, 2 Nov 2019 23:20:27 +0000 (07:20 +0800)
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@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/include/asm/cpu.h
arch/x86/lib/spl.c

index feee0f915f6920e265a5103de58052cbb4070790..21a05dab7de8f4fa15c33b1ab3afdc89823db757 100644 (file)
@@ -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 {
index 7623fc9ada0777d585f25d6e2d2f7842a304b93a..a8eaafeb5b5f4d91b451e29661b9470ca6f35e1c 100644 (file)
@@ -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);
+
+       ret = set_max_freq();
+       if (ret)
+               debug("Failed to set CPU frequency (err=%d)\n", ret);
 #endif
 
        return 0;