UEFI + SOL / COM ports = boot hang

From: Matt Simerson <matt_at_tnpi.net>
Date: Mon, 23 Sep 2024 22:22:14 UTC
I have a Quanta D52B-1U server. When I boot it via legacy BIOS, there is no issue. When I boot with UEFI and COM ports & console redirection disabled, there is no issue. However, when boot UEFI and enable the COM ports and/or console redirection, the server hangs at boot time right here:

Version 2.20.1276. Copyright (C) 2023 American Megatrends, Inc.
BIOS Date: 12/04/2023 17:24:26 Ver: 3B28.Q102 
Consoles: EFI console
    Reading loader env vars from /efi/freebsd/loader.env
Setting currdev to disk0p1:
FreeBSD/amd64 EFI loader, Revision 1.1

   Command line arguments: loader.efi
   Image base: 0x5e993000
   EFI version: 2.70
   EFI Firmware: American Megatrends (rev 5.14)
   Console: efi (0x20000000)
   Load Path: \EFI\FREEBSD\LOADER.EFI
   Load Device: PciRoot(0x9)/Pci(0x0,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-01-30-54-9D-E4-D2-5C)/HD(1,GPT,F669D424-7170-11EF-83D1-A0369F6BA978,0x28,0x82000)
   BootCurrent: 0000
   BootOrder: 0000[*] 0003 0006 0007 0002 0008
   BootInfo Path: HD(1,GPT,F669D424-7170-11EF-83D1-A0369F6BA978,0x28,0x82000)/\EFI\FREEBSD\LOADER.EFI
Ignoring Boot0000: Only one DP found
Trying ESP: PciRoot(0x9)/Pci(0x0,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-01-30-54-9D-E4-D2-5C)/HD(1,GPT,F669D424-7170-11EF-83D1-A0369F6BA978,0x28,0x82000)
Setting currdev to disk0p1:
Trying: PciRoot(0x9)/Pci(0x0,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-01-30-54-9D-E4-D2-5C)/HD(2,GPT,4F537B49-7176-11EF-83D1-A0369F6BA978,0x82028,0x1000000)
Setting currdev to disk0p2:
Trying: PciRoot(0x9)/Pci(0x0,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-01-30-54-9D-E4-D2-5C)/HD(3,GPT,B6D8B384-7176-11EFLoading /boot/defaults/loader.conf86860)
Loading /boot/defaults/loader.confdefault:
Loading /boot/device.hints
Loading /boot/loader.conf
Loading /boot/loader.conf.local
|

On one occasion, I left it setting there for minutes.

I currently have FreeBSD 14.1 installed and I also replicated this when booting off a FreeBSD 15.0-CURRENT ISO. 

The chipset is Intel C621 & C624. Output from dmesg is here <https://gist.github.com/msimerson/1b6a3f3e34f9036b30e0972477993cfc>.

BIOS settings which enable console redirection and SOL are:

Super IO
	Port 0, Disabled or Enabled (IO=3F8h, IRQ=4)
	Port 1, Enabled (IO=2F8h, IRQ=3)   <-- SOL port
Serial Port Console Redirection
	COM0
		Console Redirection, Port is Disabled
	SOL
		Console Redirection, [Enabled]
		Console Redirection Settings, (VT100, 115200, None)
	Legacy Console Redirection Settings
		Redirection COM Port: SOL (other option: COM0)
	Serial Port for OOB Management/Windows EMS
		Console Redirection: Enabled
		Console Redirection Settings, Out-of-Band Mgmt Port: SOL (other option: COM0)
		Console Redirection Settings, (VT100, 115200, None)

There are variations on those settings which work for getting BIOS POST messages and the FreeBSD loader messages redirected to the IPMI SOL port.  However, any combination that works also causes FreeBSD to hang at exactly the same spot.

I'm accustomed to adding a few lines to loader.conf to tell FreeBSD how to direct console output, but nothing added there makes any difference. I've twiddled the hint.uart.* knobs in /boot/device.hints to no avail.

This is what works on my Dell R630:

# console port via IPMI & DRAC
boot_multicons="YES"
boot_serial="YES"
console="efi,comconsole"
# for legacy BIOS
#console="comconsole,vidconsole"
comconsole_speed="115200"

How does one go about troubleshooting this?

Matt