> 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.

There is no real reason to drop the debug messages.

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.

> Index: sys/arch/amd64/amd64/machdep.c
> ===================================================================
> RCS file: /disk/cvs/openbsd/src/sys/arch/amd64/amd64/machdep.c,v
> retrieving revision 1.264
> diff -u -p -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 07:40:14 -0000
> @@ -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.
>   *
> @@ -1927,12 +1924,6 @@ getbootinfo(char *bootinfo, int bootinfo
>       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
>  
>       for (q = (bootarg32_t *)bootinfo;
>           (q->ba_type != BOOTARG_END) &&
> @@ -1942,24 +1933,15 @@ getbootinfo(char *bootinfo, int bootinfo
>               switch (q->ba_type) {
>               case BOOTARG_MEMMAP:
>                       bios_memmap = (bios_memmap_t *)q->ba_arg;
> -#ifdef BOOTINFO_DEBUG
> -                     printf(" memmap %p", bios_memmap);
> -#endif
>                       break;
>               case BOOTARG_DISKINFO:
>                       bios_diskinfo = (bios_diskinfo_t *)q->ba_arg;
> -#ifdef BOOTINFO_DEBUG
> -                     printf(" diskinfo %p", bios_diskinfo);
> -#endif
>                       break;
>               case BOOTARG_APMINFO:
>                       /* generated by i386 boot loader */
>                       break;
>               case BOOTARG_CKSUMLEN:
>                       bios_cksumlen = *(u_int32_t *)q->ba_arg;
> -#ifdef BOOTINFO_DEBUG
> -                     printf(" cksumlen %d", bios_cksumlen);
> -#endif
>                       break;
>               case BOOTARG_PCIINFO:
>                       /* generated by i386 boot loader */
> @@ -1983,15 +1965,8 @@ getbootinfo(char *bootinfo, int bootinfo
>                                       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",
> -                                 cdp->consdev, cdp->conspeed);
> -#endif
>                       }
>                       break;
>               case BOOTARG_BOOTMAC:
> @@ -2023,8 +1998,6 @@ getbootinfo(char *bootinfo, int bootinfo
>  
>               case BOOTARG_EFIINFO:
>                       bios_efiinfo = (bios_efiinfo_t *)q->ba_arg;
> -                     if (bios_efiinfo->fb_addr != 0)
> -                             docninit++;
>                       break;
>  
>               case BOOTARG_UCODE:
> @@ -2032,18 +2005,9 @@ getbootinfo(char *bootinfo, int bootinfo
>                       break;
>  
>               default:
> -#ifdef BOOTINFO_DEBUG
> -                     printf(" unsupported arg (%d) %p", q->ba_type,
> -                         q->ba_arg);
> -#endif
>                       break;
>               }
>       }
> -     if (docninit > 0)
> -             cninit();
> -#ifdef BOOTINFO_DEBUG
> -     printf("\n");
> -#endif
>  }
>  
>  int
> 

Reply via email to