From 58c58654a68fb4da4c1e5dbe9b954b4fbe26dd42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ky=C3=B6sti=20M=C3=A4lkki?= Date: Sat, 29 May 2021 21:10:51 +0300 Subject: cpu/x86/lapic: Redo DEBUG_HALT_SELF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I7e42519d5bcee95970d366fd64923de874098172 Signed-off-by: Kyösti Mälkki Reviewed-on: https://review.coreboot.org/c/coreboot/+/55189 Reviewed-by: Angel Pons Reviewed-by: Arthur Heymans Tested-by: build bot (Jenkins) --- src/cpu/x86/lapic/lapic_cpu_init.c | 46 +++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'src/cpu') 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(); } -- cgit v1.2.3