From owner-svn-src-all@freebsd.org Sun Aug 30 01:40:00 2015 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 96B799C5890; Sun, 30 Aug 2015 01:40:00 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8740FE9D; Sun, 30 Aug 2015 01:40:00 +0000 (UTC) (envelope-from marcel@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id t7U1e0MK039050; Sun, 30 Aug 2015 01:40:00 GMT (envelope-from marcel@FreeBSD.org) Received: (from marcel@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id t7U1e0ej039049; Sun, 30 Aug 2015 01:40:00 GMT (envelope-from marcel@FreeBSD.org) Message-Id: <201508300140.t7U1e0ej039049@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: marcel set sender to marcel@FreeBSD.org using -f From: Marcel Moolenaar Date: Sun, 30 Aug 2015 01:40:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r287299 - head/sys/boot/efi/loader/arch/amd64 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 30 Aug 2015 01:40:00 -0000 Author: marcel Date: Sun Aug 30 01:39:59 2015 New Revision: 287299 URL: https://svnweb.freebsd.org/changeset/base/287299 Log: Add a gop command to help diagnose VT efifb problems. The gop command has the following sub-commands: list - list all possible modes (paged) get - return the current mode set - set the current mode to Modified: head/sys/boot/efi/loader/arch/amd64/framebuffer.c Modified: head/sys/boot/efi/loader/arch/amd64/framebuffer.c ============================================================================== --- head/sys/boot/efi/loader/arch/amd64/framebuffer.c Sat Aug 29 20:41:09 2015 (r287298) +++ head/sys/boot/efi/loader/arch/amd64/framebuffer.c Sun Aug 30 01:39:59 2015 (r287299) @@ -29,6 +29,7 @@ #include __FBSDID("$FreeBSD$"); +#include #include #include @@ -83,3 +84,97 @@ efi_find_framebuffer(struct efi_fb *efif } return (0); } + +COMMAND_SET(gop, "gop", "graphics output protocol", command_gop); + +static void +command_gop_display(u_int mode, EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info) +{ + + printf("mode %u: %ux%u, stride=%u, color=", mode, + info->HorizontalResolution, info->VerticalResolution, + info->PixelsPerScanLine); + switch (info->PixelFormat) { + case PixelRedGreenBlueReserved8BitPerColor: + printf("32-bit (RGB)"); + break; + case PixelBlueGreenRedReserved8BitPerColor: + printf("32-bit (BGR)"); + break; + case PixelBitMask: + printf("mask (R=%x, G=%x, B=%x, X=%x)", + info->PixelInformation.RedMask, + info->PixelInformation.GreenMask, + info->PixelInformation.BlueMask, + info->PixelInformation.ReservedMask); + break; + case PixelBltOnly: + printf("unsupported (blt only)"); + break; + default: + printf("unsupported (unknown)"); + break; + } +} + +static int +command_gop(int argc, char *argv[]) +{ + EFI_GRAPHICS_OUTPUT *gop; + EFI_STATUS status; + u_int mode; + + status = BS->LocateProtocol(&gop_guid, NULL, (VOID **)&gop); + if (EFI_ERROR(status)) { + sprintf(command_errbuf, "%s: Graphics Output Protocol not " + "present (error=%lu)", argv[0], status & ~EFI_ERROR_MASK); + return (CMD_ERROR); + } + + if (argc == 1) + goto usage; + + if (!strcmp(argv[1], "set")) { + char *cp; + + if (argc != 3) + goto usage; + mode = strtol(argv[2], &cp, 0); + if (cp[0] != '\0') { + sprintf(command_errbuf, "mode is an integer"); + return (CMD_ERROR); + } + status = gop->SetMode(gop, mode); + if (EFI_ERROR(status)) { + sprintf(command_errbuf, "%s: Unable to set mode to " + "%u (error=%lu)", argv[0], mode, + status & ~EFI_ERROR_MASK); + return (CMD_ERROR); + } + } else if (!strcmp(argv[1], "get")) { + command_gop_display(gop->Mode->Mode, gop->Mode->Info); + printf("\n frame buffer: address=%jx, size=%lx\n", + (uintmax_t)gop->Mode->FrameBufferBase, + gop->Mode->FrameBufferSize); + } else if (!strcmp(argv[1], "list")) { + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; + UINTN infosz; + + pager_open(); + for (mode = 0; mode < gop->Mode->MaxMode; mode++) { + status = gop->QueryMode(gop, mode, &infosz, &info); + if (EFI_ERROR(status)) + continue; + command_gop_display(mode, info); + if (pager_output("\n")) + break; + } + pager_close(); + } + return (CMD_OK); + + usage: + sprintf(command_errbuf, "usage: %s [list | get | set ]", + argv[0]); + return (CMD_ERROR); +}