x86: Handle running as EFI payload
authorSimon Glass <sjg@chromium.org>
Tue, 4 Aug 2015 18:34:00 +0000 (12:34 -0600)
committerSimon Glass <sjg@chromium.org>
Wed, 5 Aug 2015 14:44:08 +0000 (08:44 -0600)
When U-Boot runs as an EFI payload it needs to avoid setting up the CPU
again. Also U-Boot currently does not handle interrupts for many devices, so
run with interrupts disabled.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/Kconfig
arch/x86/cpu/cpu.c
arch/x86/cpu/interrupts.c
arch/x86/lib/bootm.c
arch/x86/lib/efi/Kconfig [new file with mode: 0644]

index f124d58fde48b658ff958d5dfc157daabd4140f1..01ed76042f755f03b54e565e7f6bfff68b7b0b15 100644 (file)
@@ -194,6 +194,7 @@ config X86_RAMTEST
 
 config HAVE_FSP
        bool "Add an Firmware Support Package binary"
+       depends on !EFI
        help
          Select this option to add an Firmware Support Package binary to
          the resulting U-Boot image. It is a binary blob which U-Boot uses
@@ -309,6 +310,7 @@ menu "System tables"
 
 config GENERATE_PIRQ_TABLE
        bool "Generate a PIRQ table"
+       depends on !EFI
        default n
        help
          Generate a PIRQ routing table for this board. The PIRQ routing table
@@ -319,6 +321,7 @@ config GENERATE_PIRQ_TABLE
 
 config GENERATE_SFI_TABLE
        bool "Generate a SFI (Simple Firmware Interface) table"
+       depends on !EFI
        help
          The Simple Firmware Interface (SFI) provides a lightweight method
          for platform firmware to pass information to the operating system
@@ -333,6 +336,7 @@ config GENERATE_SFI_TABLE
 
 config GENERATE_MP_TABLE
        bool "Generate an MP (Multi-Processor) table"
+       depends on !EFI
        default n
        help
          Generate an MP (Multi-Processor) table for this board. The MP table
@@ -383,4 +387,6 @@ config PCIE_ECAM_SIZE
          so a default 0x10000000 size covers all of the 256 buses which is the
          maximum number of PCI buses as defined by the PCI specification.
 
+source "arch/x86/lib/efi/Kconfig"
+
 endmenu
index d233a459289140adc561d259117e8afad1d4ddbb..129777c71755a327a8da460069481aa2ac194580 100644 (file)
@@ -330,13 +330,15 @@ int x86_cpu_init_f(void)
        const u32 em_rst = ~X86_CR0_EM;
        const u32 mp_ne_set = X86_CR0_MP | X86_CR0_NE;
 
-       /* initialize FPU, reset EM, set MP and NE */
-       asm ("fninit\n" \
-            "movl %%cr0, %%eax\n" \
-            "andl %0, %%eax\n" \
-            "orl  %1, %%eax\n" \
-            "movl %%eax, %%cr0\n" \
-            : : "i" (em_rst), "i" (mp_ne_set) : "eax");
+       if (ll_boot_init()) {
+               /* initialize FPU, reset EM, set MP and NE */
+               asm ("fninit\n" \
+               "movl %%cr0, %%eax\n" \
+               "andl %0, %%eax\n" \
+               "orl  %1, %%eax\n" \
+               "movl %%eax, %%cr0\n" \
+               : : "i" (em_rst), "i" (mp_ne_set) : "eax");
+       }
 
        /* identify CPU via cpuid and store the decoded info into gd->arch */
        if (has_cpuid()) {
@@ -712,5 +714,8 @@ __weak int x86_init_cpus(void)
 
 int cpu_init_r(void)
 {
-       return x86_init_cpus();
+       if (ll_boot_init())
+               return x86_init_cpus();
+
+       return 0;
 }
index a1129384e2e31809d797cb9bb7bf4d2d9a5b1835..9217307e4abfa2d2776e2bcacce2bbfeb468bf41 100644 (file)
@@ -258,8 +258,14 @@ int interrupt_init(void)
        /* Initialize core interrupt and exception functionality of CPU */
        cpu_init_interrupts();
 
-       /* It is now safe to enable interrupts */
-       enable_interrupts();
+       /*
+        * It is now safe to enable interrupts.
+        *
+        * TODO(sjg@chromium.org): But we don't handle these correctly when
+        * booted from EFI.
+        */
+       if (ll_boot_init())
+               enable_interrupts();
 #endif
 
        return 0;
index 445ee6e45546a9e9c1d1d41fe8c5871d03a277af..f441c84df5628290bd1803c6c4c0a58753b910c1 100644 (file)
@@ -164,7 +164,11 @@ int boot_linux_kernel(ulong setup_base, ulong load_address, bool image_64bit)
                * the data segments are 0x18, 4GB flat, and read/write.
                * U-boot is setting them up that way for itself in
                * arch/i386/cpu/cpu.c.
+               *
+               * Note that we cannot currently boot a kernel while running as
+               * an EFI application. Please use the payload option for that.
                */
+#ifndef CONFIG_EFI_APP
                __asm__ __volatile__ (
                "movl $0, %%ebp\n"
                "cli\n"
@@ -173,6 +177,7 @@ int boot_linux_kernel(ulong setup_base, ulong load_address, bool image_64bit)
                [boot_params] "S"(setup_base),
                "b"(0), "D"(0)
                );
+#endif
        }
 
        /* We can't get to here */
diff --git a/arch/x86/lib/efi/Kconfig b/arch/x86/lib/efi/Kconfig
new file mode 100644 (file)
index 0000000..e0975d3
--- /dev/null
@@ -0,0 +1,11 @@
+if EFI
+
+config SYS_CAR_ADDR
+       hex
+       default 0x100000
+
+config SYS_CAR_SIZE
+       hex
+       default 0x20000
+
+endif