All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ard Biesheuvel <ardb@kernel.org>
To: linux-efi@vger.kernel.org, Ingo Molnar <mingo@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>
Cc: Ard Biesheuvel <ardb@kernel.org>,
	linux-kernel@vger.kernel.org,
	Arvind Sankar <nivedita@alum.mit.edu>,
	Atish Patra <atish.patra@wdc.com>,
	Palmer Dabbelt <palmerdabbelt@google.com>,
	Zou Wei <zou_wei@huawei.com>
Subject: [PATCH 18/33] efi/gop: Allow automatically choosing the best mode
Date: Fri, 24 Apr 2020 15:05:16 +0200	[thread overview]
Message-ID: <20200424130531.30518-19-ardb@kernel.org> (raw)
In-Reply-To: <20200424130531.30518-1-ardb@kernel.org>

From: Arvind Sankar <nivedita@alum.mit.edu>

Add the ability to automatically pick the highest resolution video mode
(defined as the product of vertical and horizontal resolution) by using
a command-line argument of the form
	video=efifb:auto

If there are multiple modes with the highest resolution, pick one with
the highest color depth.

Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200328160601.378299-2-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 Documentation/fb/efifb.rst         |  6 +++
 drivers/firmware/efi/libstub/gop.c | 84 +++++++++++++++++++++++++++++-
 2 files changed, 89 insertions(+), 1 deletion(-)

diff --git a/Documentation/fb/efifb.rst b/Documentation/fb/efifb.rst
index eca38466487a..519550517fd4 100644
--- a/Documentation/fb/efifb.rst
+++ b/Documentation/fb/efifb.rst
@@ -57,4 +57,10 @@ mode=n
         "rgb" or "bgr" to match specifically those pixel formats, or a number
         for a mode with matching bits per pixel.
 
+auto
+        The EFI stub will choose the mode with the highest resolution (product
+        of horizontal and vertical resolution). If there are multiple modes
+        with the highest resolution, it will choose one with the highest color
+        depth.
+
 Edgar Hucek <gimli@dark-green.com>
diff --git a/drivers/firmware/efi/libstub/gop.c b/drivers/firmware/efi/libstub/gop.c
index 848cb605a9c4..fa05a0b0adfd 100644
--- a/drivers/firmware/efi/libstub/gop.c
+++ b/drivers/firmware/efi/libstub/gop.c
@@ -18,7 +18,8 @@
 enum efi_cmdline_option {
 	EFI_CMDLINE_NONE,
 	EFI_CMDLINE_MODE_NUM,
-	EFI_CMDLINE_RES
+	EFI_CMDLINE_RES,
+	EFI_CMDLINE_AUTO
 };
 
 static struct {
@@ -86,6 +87,19 @@ static bool parse_res(char *option, char **next)
 	return true;
 }
 
+static bool parse_auto(char *option, char **next)
+{
+	if (!strstarts(option, "auto"))
+		return false;
+	option += strlen("auto");
+	if (*option && *option++ != ',')
+		return false;
+	cmdline.option = EFI_CMDLINE_AUTO;
+
+	*next = option;
+	return true;
+}
+
 void efi_parse_option_graphics(char *option)
 {
 	while (*option) {
@@ -93,6 +107,8 @@ void efi_parse_option_graphics(char *option)
 			continue;
 		if (parse_res(option, &option))
 			continue;
+		if (parse_auto(option, &option))
+			continue;
 
 		while (*option && *option++ != ',')
 			;
@@ -211,6 +227,69 @@ static u32 choose_mode_res(efi_graphics_output_protocol_t *gop)
 	return cur_mode;
 }
 
+static u32 choose_mode_auto(efi_graphics_output_protocol_t *gop)
+{
+	efi_status_t status;
+
+	efi_graphics_output_protocol_mode_t *mode;
+	efi_graphics_output_mode_info_t *info;
+	unsigned long info_size;
+
+	u32 max_mode, cur_mode, best_mode, area;
+	u8 depth;
+	int pf;
+	efi_pixel_bitmask_t pi;
+	u32 m, w, h, a;
+	u8 d;
+
+	mode = efi_table_attr(gop, mode);
+
+	cur_mode = efi_table_attr(mode, mode);
+	max_mode = efi_table_attr(mode, max_mode);
+
+	info = efi_table_attr(mode, info);
+
+	pf = info->pixel_format;
+	pi = info->pixel_information;
+	w  = info->horizontal_resolution;
+	h  = info->vertical_resolution;
+
+	best_mode = cur_mode;
+	area = w * h;
+	depth = pixel_bpp(pf, pi);
+
+	for (m = 0; m < max_mode; m++) {
+		if (m == cur_mode)
+			continue;
+
+		status = efi_call_proto(gop, query_mode, m,
+					&info_size, &info);
+		if (status != EFI_SUCCESS)
+			continue;
+
+		pf = info->pixel_format;
+		pi = info->pixel_information;
+		w  = info->horizontal_resolution;
+		h  = info->vertical_resolution;
+
+		efi_bs_call(free_pool, info);
+
+		if (pf == PIXEL_BLT_ONLY || pf >= PIXEL_FORMAT_MAX)
+			continue;
+		a = w * h;
+		if (a < area)
+			continue;
+		d = pixel_bpp(pf, pi);
+		if (a > area || d > depth) {
+			best_mode = m;
+			area = a;
+			depth = d;
+		}
+	}
+
+	return best_mode;
+}
+
 static void set_mode(efi_graphics_output_protocol_t *gop)
 {
 	efi_graphics_output_protocol_mode_t *mode;
@@ -223,6 +302,9 @@ static void set_mode(efi_graphics_output_protocol_t *gop)
 	case EFI_CMDLINE_RES:
 		new_mode = choose_mode_res(gop);
 		break;
+	case EFI_CMDLINE_AUTO:
+		new_mode = choose_mode_auto(gop);
+		break;
 	default:
 		return;
 	}
-- 
2.17.1


  parent reply	other threads:[~2020-04-24 13:07 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-24 13:04 [GIT PULL 00/33] EFI updates for v5.8 Ard Biesheuvel
2020-04-24 13:04 ` [PATCH 01/33] efi/libstub: Move arm-stub to a common file Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 02/33] efi/libstub: Make initrd file loader configurable Ard Biesheuvel
2020-04-24 13:15   ` Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 03/33] efi/libstub: Unify EFI call wrappers for non-x86 Ard Biesheuvel
2020-05-03 15:09   ` Guenter Roeck
2020-05-03 16:09     ` Arvind Sankar
2020-05-03 16:11       ` Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 04/33] efi/libstub/arm: Make install_memreserve_table static Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 05/33] efi/gop: Remove redundant current_fb_base Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 06/33] efi/gop: Move check for framebuffer before con_out Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 07/33] efi/gop: Get mode information outside the loop Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 08/33] efi/gop: Factor out locating the gop into a function Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 09/33] efi/gop: Slightly re-arrange logic of find_gop Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 10/33] efi/gop: Move variable declarations into loop block Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 11/33] efi/gop: Use helper macros for populating lfb_base Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 12/33] efi/gop: Use helper macros for find_bits Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 13/33] efi/gop: Remove unreachable code from setup_pixel_info Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 14/33] efi/gop: Add prototypes for query_mode and set_mode Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 15/33] efi/gop: Allow specifying mode number on command line Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 16/33] efi/gop: Allow specifying mode by <xres>x<yres> Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 17/33] efi/gop: Allow specifying depth as well as resolution Ard Biesheuvel
2020-04-24 13:05 ` Ard Biesheuvel [this message]
2020-04-24 13:05 ` [PATCH 19/33] efi/libstub/random: Align allocate size to EFI_ALLOC_ALIGN Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 20/33] efi/libstub/random: Increase random alloc granularity Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 21/33] efi/libstub/arm64: Replace 'preferred' offset with alignment check Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 22/33] efi/libstub/arm64: Simplify randomized loading of kernel image Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 23/33] efi/libstub: Add API function to allocate aligned memory Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 24/33] efi/libstub/arm64: Switch to ordinary page allocator for kernel image Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 25/33] efi/libstub: Move efi_relocate_kernel() into separate source file Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 26/33] efi/arm: Remove __efistub_global annotation Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 27/33] efi/x86: Remove __efistub_global and add relocation check Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 28/33] efi: Kill __efistub_global Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 29/33] efi/libstub: Drop __pure getter for efi_system_table Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 30/33] efi/libstub: Drop __pure getters for EFI stub options Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 31/33] efi/libstub/x86: Avoid getter function for efi_is64 Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 32/33] efi: Clean up config table description arrays Ard Biesheuvel
2020-04-24 13:05 ` [PATCH 33/33] efi: Move arch_tables check to caller Ard Biesheuvel
2020-04-25  8:27 ` [GIT PULL 00/33] EFI updates for v5.8 Ingo Molnar
2020-04-25  9:57   ` Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200424130531.30518-19-ardb@kernel.org \
    --to=ardb@kernel.org \
    --cc=atish.patra@wdc.com \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=nivedita@alum.mit.edu \
    --cc=palmerdabbelt@google.com \
    --cc=tglx@linutronix.de \
    --cc=zou_wei@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.