Hello, I am testing a new hardware, HPE DL20 Gen10.
When efiboot starts the kernel, the video display becomes distorted and never recovered until CPU reset. Our kernel tries to initialized console twice, first trial is done before getting boot info and second trial is done after getting boot info. Since EFI framebuffer needs "boot info", it is initialized on second trial. On HPE DL20 Gen10, probing vga is succeeded on first trial, the kernel selects vga for the console, but actually it is broken. On usual machines which boot with EFI, the problem doesn't happen since they have no vga. The diff following fixes the problem by initializing efifb console even if the VGA is probed. # Also, HP DL20 Gen10 has "UEFI optimized boot" setting on BIOS and # disabling the setting avoids the problem happening. But since the # setting seems to be for old Windows, I think we should fix our # kernel. comment? ok? Initialize efifb as a console even if the VGA is probed. Index: sys/arch/amd64/amd64/wscons_machdep.c =================================================================== RCS file: /var/cvs/openbsd/src/sys/arch/amd64/amd64/wscons_machdep.c,v retrieving revision 1.14 diff -u -p -r1.14 wscons_machdep.c --- sys/arch/amd64/amd64/wscons_machdep.c 14 Oct 2017 04:44:43 -0000 1.14 +++ sys/arch/amd64/amd64/wscons_machdep.c 21 Feb 2020 04:42:38 -0000 @@ -73,7 +73,7 @@ #include <machine/efifbvar.h> #endif -int wscn_video_init(void); +int wscn_video_init(int); void wscn_input_init(int); cons_decl(ws); @@ -103,10 +103,12 @@ wscninit(struct consdev *cp) { static int initted = 0; - if (initted) + if (initted) { + wscn_video_init(1); return; + } - if (wscn_video_init() == 0) { + if (wscn_video_init(0) == 0) { initted = 1; wscn_input_init(0); } @@ -134,11 +136,17 @@ wscnpollc(dev_t dev, int on) * Configure the display part of the console. */ int -wscn_video_init(void) +wscn_video_init(int pass) { #if (NEFIFB > 0) - if (efifb_cnattach() == 0) - return (0); + extern int vgaconsole; + if (pass > 0) { + if (efifb_cnattach() == 0) { + vgaconsole = 0; + return (0); + } + return (-1); + } #endif #if (NVGA > 0) if (vga_cnattach(X86_BUS_SPACE_IO, X86_BUS_SPACE_MEM, -1, 1) == 0)