Blob Blame History Raw
From 28faeb5f94b4866b9da16cf2a1e4e0fc09a26e37 Mon Sep 17 00:00:00 2001
From: Laszlo Ersek <lersek@redhat.com>
Date: Tue, 25 Feb 2014 18:40:35 +0100
Subject: MdeModulePkg: TerminalDxe: add other text resolutions (RHEL only)

Notes about the RHEL-7.6/ovmf-20180508-2.gitee3198e672e2.el7 ->
RHEL-8.0/20180508-ee3198e672e2 rebase:

- reorder the rebase changelog in the commit message so that it reads like
  a blog: place more recent entries near the top
- no changes to the patch body

Notes about the 20171011-92d07e48907f -> 20180508-ee3198e672e2 rebase:

- update commit message as requested in
  <https://bugzilla.redhat.com/show_bug.cgi?id=1503316#c0>

Notes about the 20170228-c325e41585e3 -> 20171011-92d07e48907f rebase:

- no changes

Notes about the 20160608b-988715a -> 20170228-c325e41585e3 rebase:

- adapt commit 0bc77c63de03 (code and commit message) to upstream commit
  390b95a49c14 ("MdeModulePkg/TerminalDxe: Refine
  InitializeTerminalConsoleTextMode", 2017-01-10).

When the console output is multiplexed to several devices by
ConSplitterDxe, then ConSplitterDxe builds an intersection of text modes
supported by all console output devices.

Two notable output devices are provided by:
(1) MdeModulePkg/Universal/Console/GraphicsConsoleDxe,
(2) MdeModulePkg/Universal/Console/TerminalDxe.

GraphicsConsoleDxe supports four modes at most -- see
InitializeGraphicsConsoleTextMode() and "mGraphicsConsoleModeData":

(1a) 80x25 (required by the UEFI spec as mode 0),
(1b) 80x50 (not necessarily supported, but if it is, then the UEFI spec
     requires the driver to provide it as mode 1),
(1c) 100x31 (corresponding to graphics resolution 800x600, which the UEFI
     spec requires from all plug-in graphics devices),
(1d) "full screen" resolution, derived form the underlying GOP's
     horizontal and vertical resolutions with division by EFI_GLYPH_WIDTH
     (8) and EFI_GLYPH_HEIGHT (19), respectively.

The automatic "full screen resolution" makes GraphicsConsoleDxe's
character console very flexible. However, TerminalDxe (which runs on
serial ports) only provides the following fixed resolutions -- see
InitializeTerminalConsoleTextMode() and "mTerminalConsoleModeData":

(2a) 80x25 (required by the UEFI spec as mode 0),
(2b) 80x50 (since the character resolution of a serial device cannot be
     interrogated easily, this is added unconditionally as mode 1),
(2c) 100x31 (since the character resolution of a serial device cannot be
     interrogated easily, this is added unconditionally as mode 2).

When ConSplitterDxe combines (1) and (2), multiplexing console output to
both video output and serial terminal, the list of commonly supported text
modes (ie. the "intersection") comprises:

(3a) 80x25, unconditionally, from (1a) and (2a),
(3b) 80x50, if the graphics console provides at least 640x950 pixel
     resolution, from (1b) and (2b)
(3c) 100x31, if the graphics device is a plug-in one (because in that case
     800x600 is a mandated pixel resolution), from (1c) and (2c).

Unfortunately, the "full screen resolution" (1d) of the GOP-based text
console is not available in general.

Mitigate this problem by extending "mTerminalConsoleModeData" with a
handful of text resolutions that are derived from widespread maximal pixel
resolutions. This way TerminalDxe won't cause ConSplitterDxe to filter out
the most frequent (1d) values from the intersection, and eg. the MODE
command in the UEFI shell will offer the "best" (ie. full screen)
resolution too.

Upstreaming efforts for this patch have been discontinued; it was clear
from the off-list thread that consensus was impossible to reach.

Signed-off-by: Laszlo Ersek <lersek@redhat.com>
(cherry picked from commit 99dc3720ac86059f60156197328cc433603c536e)
(cherry picked from commit d2066c1748f885043026c51dec1bc8d6d406ae8f)
(cherry picked from commit 1facdd58e946c584a3dc1e5be8f2f837b5a7c621)
---
 .../Universal/Console/TerminalDxe/Terminal.c       | 41 ++++++++++++++++++++--
 1 file changed, 38 insertions(+), 3 deletions(-)

diff --git a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
index 66dd3ad..78a1983 100644
--- a/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
+++ b/MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
@@ -113,9 +113,44 @@ TERMINAL_DEV  mTerminalDevTemplate = {
 };
 
 TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {
-  {80,  25},
-  {80,  50},
-  {100, 31},
+  {   80,  25 }, // from graphics resolution  640 x  480
+  {   80,  50 }, // from graphics resolution  640 x  960
+  {  100,  25 }, // from graphics resolution  800 x  480
+  {  100,  31 }, // from graphics resolution  800 x  600
+  {  104,  32 }, // from graphics resolution  832 x  624
+  {  120,  33 }, // from graphics resolution  960 x  640
+  {  128,  31 }, // from graphics resolution 1024 x  600
+  {  128,  40 }, // from graphics resolution 1024 x  768
+  {  144,  45 }, // from graphics resolution 1152 x  864
+  {  144,  45 }, // from graphics resolution 1152 x  870
+  {  160,  37 }, // from graphics resolution 1280 x  720
+  {  160,  40 }, // from graphics resolution 1280 x  760
+  {  160,  40 }, // from graphics resolution 1280 x  768
+  {  160,  42 }, // from graphics resolution 1280 x  800
+  {  160,  50 }, // from graphics resolution 1280 x  960
+  {  160,  53 }, // from graphics resolution 1280 x 1024
+  {  170,  40 }, // from graphics resolution 1360 x  768
+  {  170,  40 }, // from graphics resolution 1366 x  768
+  {  175,  55 }, // from graphics resolution 1400 x 1050
+  {  180,  47 }, // from graphics resolution 1440 x  900
+  {  200,  47 }, // from graphics resolution 1600 x  900
+  {  200,  63 }, // from graphics resolution 1600 x 1200
+  {  210,  55 }, // from graphics resolution 1680 x 1050
+  {  240,  56 }, // from graphics resolution 1920 x 1080
+  {  240,  63 }, // from graphics resolution 1920 x 1200
+  {  240,  75 }, // from graphics resolution 1920 x 1440
+  {  250, 105 }, // from graphics resolution 2000 x 2000
+  {  256,  80 }, // from graphics resolution 2048 x 1536
+  {  256, 107 }, // from graphics resolution 2048 x 2048
+  {  320,  75 }, // from graphics resolution 2560 x 1440
+  {  320,  84 }, // from graphics resolution 2560 x 1600
+  {  320, 107 }, // from graphics resolution 2560 x 2048
+  {  350, 110 }, // from graphics resolution 2800 x 2100
+  {  400, 126 }, // from graphics resolution 3200 x 2400
+  {  480, 113 }, // from graphics resolution 3840 x 2160
+  {  512, 113 }, // from graphics resolution 4096 x 2160
+  {  960, 227 }, // from graphics resolution 7680 x 4320
+  { 1024, 227 }, // from graphics resolution 8192 x 4320
   //
   // New modes can be added here.
   //
-- 
1.8.3.1