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. also s/efi_gopmode/gopmode/ 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