On Thu, 28 May 2020 12:31:31 +0200 (CEST) Mark Kettenis <mark.kette...@xs4all.nl> wrote: >> Date: Thu, 28 May 2020 17:01:48 +0900 (JST) >> From: YASUOKA Masahiko <yasu...@openbsd.org> >> >> Hi, >> >> I'd like to conclude this issue. >> >> On Fri, 21 Feb 2020 14:09:07 +0900 (JST) >> YASUOKA Masahiko <yasu...@openbsd.org> wrote: >> > 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. >> >> If we have a way to detect whether the machine has VGA. ACPI >> FADT_NO_VGA was a candidate. But that bit is cleard both on my "HPE >> DL20 Gen10" and Andrew Daugherity's Dell PowerEdge R230. Also the >> problem newly posted at misc@ (*) might be the same problem. >> >> (*) https://marc.info/?l=openbsd-misc&m=159064773219779&w=2 >> >> I think having the diff folowing is the best for this momemnt. >> The diff does: >> >> - move cninit() after parsing bootinfo >> - give up the debug message which can be enabled if BOOTINFO_DEBUG is >> defined >> >> ok? > > I suspect we have to accept that there is too much broken hardware out > there.
Finally we might have no way other than having a configuration in boot.conf... > There is no real reason to drop the debug messages. OK, the debug messages are reverted. > I'd prefer to call cninit() directly from init_x86_64, so I'd just > move the call immediately after the block that calls getbootinfo(). > And emove the call from getbootinfo() of course. I think the last diff already satisfied these things. >> @@ -1395,11 +1395,6 @@ init_x86_64(paddr_t first_avail) >> i8254_startclock(); >> >> /* >> - * Attach the glass console early in case we need to display a panic. >> - */ >> - cninit(); >> - >> - /* >> * Initialize PAGE_SIZE-dependent variables. >> */ >> uvm_setpagesize(); >> @@ -1421,6 +1416,8 @@ init_x86_64(paddr_t first_avail) >> } else >> panic("invalid /boot"); >> >> + cninit(); >> + >> /* >> * Memory on the AMD64 port is described by three different things. >> * A hidden line which calls getbootinfo() is at just before second chunk. The updated diff was created with "-U 4" to clarify this. Alternatively, are you suggesting getbootinfo(bootinfo, bootinfo_size); + cninit(); } else panic("invalid /boot"); ? Both is OK for me. How about this? Index: sys/arch/amd64/amd64/machdep.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/machdep.c,v retrieving revision 1.264 diff -u -p -U4 -r1.264 machdep.c --- sys/arch/amd64/amd64/machdep.c 16 May 2020 14:44:44 -0000 1.264 +++ sys/arch/amd64/amd64/machdep.c 28 May 2020 11:34:39 -0000 @@ -1394,13 +1394,8 @@ init_x86_64(paddr_t first_avail) i8254_startclock(); /* - * Attach the glass console early in case we need to display a panic. - */ - cninit(); - - /* * Initialize PAGE_SIZE-dependent variables. */ uvm_setpagesize(); @@ -1420,8 +1415,10 @@ init_x86_64(paddr_t first_avail) getbootinfo(bootinfo, bootinfo_size); } else panic("invalid /boot"); + cninit(); + /* * Memory on the AMD64 port is described by three different things. * * 1. biosbasemem - This is outdated, and should really only be used to @@ -1926,10 +1923,8 @@ getbootinfo(char *bootinfo, int bootinfo bootarg32_t *q; bios_ddb_t *bios_ddb; bios_bootduid_t *bios_bootduid; bios_bootsr_t *bios_bootsr; - int docninit = 0; - #undef BOOTINFO_DEBUG #ifdef BOOTINFO_DEBUG printf("bootargv:"); #endif @@ -1982,11 +1977,8 @@ getbootinfo(char *bootinfo, int bootinfo comconsunit = unit; comconsaddr = consaddr; comconsrate = cdp->conspeed; comconsiot = X86_BUS_SPACE_IO; - - /* Probe the serial port this time. */ - docninit++; } #endif #ifdef BOOTINFO_DEBUG printf(" console 0x%x:%d", @@ -2022,10 +2014,8 @@ getbootinfo(char *bootinfo, int bootinfo break; case BOOTARG_EFIINFO: bios_efiinfo = (bios_efiinfo_t *)q->ba_arg; - if (bios_efiinfo->fb_addr != 0) - docninit++; break; case BOOTARG_UCODE: bios_ucode = (bios_ucode_t *)q->ba_arg; @@ -2038,10 +2028,8 @@ getbootinfo(char *bootinfo, int bootinfo #endif break; } } - if (docninit > 0) - cninit(); #ifdef BOOTINFO_DEBUG printf("\n"); #endif }