On Tue, Oct 10, 2017 at 02:56:26AM +0000, YASUOKA Masahiko wrote:
> On Sat, 7 Oct 2017 09:24:20 +0200
> Klemens Nanni <k...@posteo.org> wrote:
> > On Sat, Oct 07, 2017 at 01:15:40AM +0000, YASUOKA Masahiko wrote:
> >> > See my updated diff for reusing the gopi struct, please.
> >> 
> >> ok, but the diff seems to be against wrong revision.  You seems to
> >> have other diffs, moving gop and gopi to global at least.
> >> 
> >> Can you send it entirely?
> > My bad, those were applied on top of other (unsubmitted) diffs such as
> > https://marc.info/?l=openbsd-tech&m=150437080106164
> 
> Ah, sorry I missed that mail.
> 
> On Fri, 6 Oct 2017 20:11:24 +0200
> Klemens Nanni <k...@posteo.org> wrote:
> > Declaring the gop and gopi strucutures globally makes things easier in
> > preparation for the next commit.
> > 
> > Both changes also improve consistency with regard to other structures
> > like ei, di and conout as well.
> 
> As for gopi, I'd like to keep it be a local since it is used to refer
> various different modes.
That's fine.

> also s/efi_gopmode/gopmode/
I adapted efi_gopmode from your previous patch.

> comments?
> 
> Index: sys/arch/amd64/stand/efiboot/efiboot.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/efiboot.c,v
> retrieving revision 1.24
> diff -u -p -r1.24 efiboot.c
> --- sys/arch/amd64/stand/efiboot/efiboot.c    6 Oct 2017 04:52:22 -0000       
> 1.24
> +++ sys/arch/amd64/stand/efiboot/efiboot.c    10 Oct 2017 02:52:46 -0000
> @@ -60,7 +60,7 @@ static void  efi_memprobe_internal(void)
>  static void   efi_video_init(void);
>  static void   efi_video_reset(void);
>  static EFI_STATUS
> -              efi_gop_setmode(EFI_GRAPHICS_OUTPUT *gop, int mode);
> +              efi_gop_setmode(int mode);
>  EFI_STATUS    efi_main(EFI_HANDLE, EFI_SYSTEM_TABLE *);
>  
>  void (*run_i386)(u_long, u_long, int, int, int, int, int, int, int, int)
> @@ -696,13 +696,15 @@ efi_com_putc(dev_t dev, int c)
>   * {EFI_,}_ACPI_20_TABLE_GUID or EFI_ACPI_TABLE_GUID means
>   * ACPI 2.0 or above.
>   */
> -static EFI_GUID acpi_guid = ACPI_20_TABLE_GUID;
> -static EFI_GUID smbios_guid = SMBIOS_TABLE_GUID;
> +static EFI_GUID                       acpi_guid = ACPI_20_TABLE_GUID;
> +static EFI_GUID                       smbios_guid = SMBIOS_TABLE_GUID;
> +static EFI_GRAPHICS_OUTPUT   *gop;
> +static int                    gopmode = -1;
>  
>  #define      efi_guidcmp(_a, _b)     memcmp((_a), (_b), sizeof(EFI_GUID))
>  
>  static EFI_STATUS
> -efi_gop_setmode(EFI_GRAPHICS_OUTPUT *gop, int mode)
> +efi_gop_setmode(int mode)
>  {
>       EFI_STATUS      status;
>  
> @@ -718,14 +720,11 @@ efi_makebootargs(void)
>  {
>       int                      i;
>       EFI_STATUS               status;
> -     EFI_GRAPHICS_OUTPUT     *gop;
>       EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
>                               *gopi;
>       bios_efiinfo_t           ei;
> -     int                      curmode, bestmode = -1;
> +     int                      curmode;
>       UINTN                    sz, gopsiz, bestsiz = 0;
> -     EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
> -                             *info;
>  
>       memset(&ei, 0, sizeof(ei));
>       /*
> @@ -748,21 +747,24 @@ efi_makebootargs(void)
>       status = EFI_CALL(BS->LocateProtocol, &gop_guid, NULL,
>           (void **)&gop);
>       if (!EFI_ERROR(status)) {
> -             for (i = 0; i < gop->Mode->MaxMode; i++) {
> -                     status = EFI_CALL(gop->QueryMode, gop, i, &sz, &info);
> -                     if (EFI_ERROR(status))
> -                             continue;
> -                     gopsiz = info->HorizontalResolution *
> -                         info->VerticalResolution;
> -                     if (gopsiz > bestsiz) {
> -                             bestmode = i;
> -                             bestsiz = gopsiz;
> +             if (gopmode < 0) {
> +                     for (i = 0; i < gop->Mode->MaxMode; i++) {
> +                             status = EFI_CALL(gop->QueryMode, gop,
> +                                 i, &sz, &gopi);
> +                             if (EFI_ERROR(status))
> +                                     continue;
> +                             gopsiz = gopi->HorizontalResolution *
> +                                 gopi->VerticalResolution;
> +                             if (gopsiz > bestsiz) {
> +                                     gopmode = i;
> +                                     bestsiz = gopsiz;
> +                             }
>                       }
>               }
> -             if (bestmode >= 0) {
> +             if (gopmode >= 0 && gopmode != gop->Mode->Mode) {
>                       curmode = gop->Mode->Mode;
> -                     if (efi_gop_setmode(gop, bestmode) != EFI_SUCCESS)
> -                             (void)efi_gop_setmode(gop, curmode);
> +                     if (efi_gop_setmode(gopmode) != EFI_SUCCESS)
> +                             (void)efi_gop_setmode(curmode);
>               }
>  
>               gopi = gop->Mode->Info;
> @@ -882,5 +884,46 @@ int
>  Xpoweroff_efi(void)
>  {
>       EFI_CALL(RS->ResetSystem, EfiResetShutdown, EFI_SUCCESS, 0, NULL);
> +     return (0);
> +}
> +
> +int
> +Xgop_efi(void)
> +{
> +     EFI_STATUS       status;
> +     int              i, mode = -1;
> +     UINTN            sz;
> +     EFI_GRAPHICS_OUTPUT_MODE_INFORMATION
> +                     *gopi;
> +
> +     status = EFI_CALL(BS->LocateProtocol, &gop_guid, NULL,
> +         (void **)&gop);
> +     if (EFI_ERROR(status))
> +             return (0);
> +
> +     if (cmd.argc >= 2) {
> +             mode = strtol(cmd.argv[1], NULL, 10);
> +             if (0 <= mode && mode < gop->Mode->MaxMode) {
> +                     status = EFI_CALL(gop->QueryMode, gop, mode,
> +                         &sz, &gopi);
> +                     if (!EFI_ERROR(status)) {
> +                             if (efi_gop_setmode(mode) == EFI_SUCCESS)
> +                                     gopmode = mode;
> +                     }
> +             }
> +     } else {
> +             for (i = 0; i < gop->Mode->MaxMode; i++) {
> +                     status = EFI_CALL(gop->QueryMode, gop, i, &sz, &gopi);
> +                     if (EFI_ERROR(status))
> +                             continue;
> +                     printf("Mode %d: %d x %d (stride = %d)\n", i,
> +                         gopi->HorizontalResolution,
> +                         gopi->VerticalResolution,
> +                         gopi->PixelsPerScanLine);
> +             }
> +             printf("\n");
> +     }
> +     printf("Current Mode = %d\n", gop->Mode->Mode);
> +
>       return (0);
>  }
> Index: sys/arch/amd64/stand/efiboot/efiboot.h
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/efiboot/efiboot.h,v
> retrieving revision 1.2
> diff -u -p -r1.2 efiboot.h
> --- sys/arch/amd64/stand/efiboot/efiboot.h    31 May 2017 08:40:32 -0000      
> 1.2
> +++ sys/arch/amd64/stand/efiboot/efiboot.h    10 Oct 2017 02:52:47 -0000
> @@ -30,6 +30,7 @@ void         efi_com_init(struct consdev *);
>  int   efi_com_getc(dev_t);
>  void  efi_com_putc(dev_t, int);
>  int   Xvideo_efi(void);
> +int   Xgop_efi(void);
>  int   Xexit_efi(void);
>  void  efi_makebootargs(void);
>  
> Index: sys/arch/amd64/stand/libsa/cmd_i386.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/amd64/stand/libsa/cmd_i386.c,v
> retrieving revision 1.11
> diff -u -p -r1.11 cmd_i386.c
> --- sys/arch/amd64/stand/libsa/cmd_i386.c     31 May 2017 08:23:33 -0000      
> 1.11
> +++ sys/arch/amd64/stand/libsa/cmd_i386.c     10 Oct 2017 02:52:47 -0000
> @@ -62,6 +62,7 @@ const struct cmd_table cmd_machine[] = {
>       { "memory",     CMDT_CMD, Xmemory },
>  #ifdef EFIBOOT
>       { "video",      CMDT_CMD, Xvideo_efi },
> +     { "gop",        CMDT_CMD, Xgop_efi },
>       { "exit",       CMDT_CMD, Xexit_efi },
>       { "poweroff",   CMDT_CMD, Xpoweroff_efi },
>  #endif
> 
> 
> 
Good :)

Reply via email to