Merge tag 'u-boot-rockchip-20200501' of https://gitlab.denx.de/u-boot/custodians...
[platform/kernel/u-boot.git] / arch / x86 / cpu / i386 / interrupt.c
index ba576fe..e67a116 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * (C) Copyright 2008-2011
  * Graeme Russ, <graeme.russ@gmail.com>
@@ -7,12 +8,15 @@
  *
  * Portions of this file are derived from the Linux kernel source
  *  Copyright (C) 1991, 1992  Linus Torvalds
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
 #include <common.h>
 #include <dm.h>
+#include <efi_loader.h>
+#include <hang.h>
+#include <init.h>
+#include <irq.h>
+#include <irq_func.h>
 #include <asm/control_regs.h>
 #include <asm/i8259.h>
 #include <asm/interrupt.h>
@@ -38,7 +42,7 @@ static char *exceptions[] = {
        "Overflow",
        "BOUND Range Exceeded",
        "Invalid Opcode (Undefined Opcode)",
-       "Device Not Avaiable (No Math Coprocessor)",
+       "Device Not Available (No Math Coprocessor)",
        "Double Fault",
        "Coprocessor Segment Overrun",
        "Invalid TSS",
@@ -65,6 +69,18 @@ static char *exceptions[] = {
        "Reserved"
 };
 
+/**
+ * show_efi_loaded_images() - show loaded UEFI images
+ *
+ * List all loaded UEFI images.
+ *
+ * @eip:       instruction pointer
+ */
+static void show_efi_loaded_images(uintptr_t eip)
+{
+       efi_print_image_infos((void *)eip);
+}
+
 static void dump_regs(struct irq_regs *regs)
 {
        unsigned long cs, eip, eflags;
@@ -145,6 +161,7 @@ static void dump_regs(struct irq_regs *regs)
                printf("0x%8.8lx : 0x%8.8lx\n", sp, (ulong)readl(sp));
                sp -= 4;
        }
+       show_efi_loaded_images(eip);
 }
 
 static void do_exception(struct irq_regs *regs)
@@ -247,8 +264,11 @@ int interrupt_init(void)
        struct udevice *dev;
        int ret;
 
+       if (!ll_boot_init())
+               return 0;
+
        /* Try to set up the interrupt router, but don't require one */
-       ret = uclass_first_device_err(UCLASS_IRQ, &dev);
+       ret = irq_first_device_type(X86_IRQT_BASE, &dev);
        if (ret && ret != -ENODEV)
                return ret;
 
@@ -265,7 +285,9 @@ int interrupt_init(void)
        i8259_init();
 #endif
 
+#ifdef CONFIG_APIC
        lapic_setup();
+#endif
 
        /* Initialize core interrupt and exception functionality of CPU */
        cpu_init_interrupts();
@@ -276,8 +298,7 @@ int interrupt_init(void)
         * TODO(sjg@chromium.org): But we don't handle these correctly when
         * booted from EFI.
         */
-       if (ll_boot_init())
-               enable_interrupts();
+       enable_interrupts();
 #endif
 
        return 0;