diff options
author | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2021-05-29 21:10:51 +0300 |
---|---|---|
committer | Kyösti Mälkki <kyosti.malkki@gmail.com> | 2021-06-07 21:06:01 +0000 |
commit | 58c58654a68fb4da4c1e5dbe9b954b4fbe26dd42 (patch) | |
tree | cf78db325d4e062900bc505fe4e6a1fb5db95ee6 | |
parent | 67d07a64e335402166b1bd484e22f8f9e256baad (diff) |
cpu/x86/lapic: Redo DEBUG_HALT_SELF
Change-Id: I7e42519d5bcee95970d366fd64923de874098172
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/55189
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r-- | src/cpu/x86/lapic/lapic_cpu_init.c | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/src/cpu/x86/lapic/lapic_cpu_init.c b/src/cpu/x86/lapic/lapic_cpu_init.c index d4718c60cc..ba88a3662d 100644 --- a/src/cpu/x86/lapic/lapic_cpu_init.c +++ b/src/cpu/x86/lapic/lapic_cpu_init.c @@ -317,6 +317,12 @@ static int start_cpu(struct device *cpu) */ #define DEBUG_HALT_SELF 0 +#if DEBUG_HALT_SELF +#define dprintk(LEVEL, args...) do { printk(LEVEL, ##args); } while (0) +#else +#define dprintk(LEVEL, args...) do { } while (0) +#endif + /** * Normally this function is defined in lapic.h as an always inline function * that just keeps the CPU in a hlt() loop. This does not work on all CPUs. @@ -339,47 +345,37 @@ void stop_this_cpu(void) LAPIC_INT_ASSERT | LAPIC_DM_INIT); /* wait for the ipi send to finish */ -#if DEBUG_HALT_SELF - printk(BIOS_SPEW, "Waiting for send to finish...\n"); -#endif + dprintk(BIOS_SPEW, "Waiting for send to finish...\n"); + timeout = 0; do { -#if DEBUG_HALT_SELF - printk(BIOS_SPEW, "+"); -#endif + dprintk(BIOS_SPEW, "+"); udelay(100); send_status = lapic_read(LAPIC_ICR) & LAPIC_ICR_BUSY; } while (send_status && (timeout++ < 1000)); - if (timeout >= 1000) { -#if DEBUG_HALT_SELF - printk(BIOS_ERR, "timed out\n"); -#endif - } + + if (timeout >= 1000) + dprintk(BIOS_ERR, "timed out\n"); + mdelay(10); -#if DEBUG_HALT_SELF - printk(BIOS_SPEW, "Deasserting INIT.\n"); -#endif + dprintk(BIOS_SPEW, "Deasserting INIT.\n"); + /* Deassert the LAPIC INIT */ lapic_write_around(LAPIC_ICR2, SET_LAPIC_DEST_FIELD(id)); lapic_write_around(LAPIC_ICR, LAPIC_INT_LEVELTRIG | LAPIC_DM_INIT); -#if DEBUG_HALT_SELF - printk(BIOS_SPEW, "Waiting for send to finish...\n"); -#endif + dprintk(BIOS_SPEW, "Waiting for send to finish...\n"); + timeout = 0; do { -#if DEBUG_HALT_SELF - printk(BIOS_SPEW, "+"); -#endif + dprintk(BIOS_SPEW, "+"); udelay(100); send_status = lapic_read(LAPIC_ICR) & LAPIC_ICR_BUSY; } while (send_status && (timeout++ < 1000)); - if (timeout >= 1000) { -#if DEBUG_HALT_SELF - printk(BIOS_ERR, "timed out\n"); -#endif - } + + if (timeout >= 1000) + dprintk(BIOS_ERR, "timed out\n"); halt(); } |