On Thu, May 28, 2020 at 02:06:28PM +0200, Mark Kettenis wrote:
> > Date: Thu, 28 May 2020 20:49:18 +0900 (JST)
> > From: YASUOKA Masahiko <yasu...@openbsd.org>
> > 
> > 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?
> 
> The attached diff looks good to me.
> 
> ok kettenis@

ok jsg@ on this one as well

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

Reply via email to