From: "Leif Lindholm" <leif.lindholm@linaro.org>
To: Pete Batard <pete@akeo.ie>
Cc: devel@edk2.groups.io, ard.biesheuvel@linaro.org
Subject: Re: [edk2-platforms PATCH 1/1] Platforms/RPi3: DisplayDxe virtual resolution improvements
Date: Sun, 29 Sep 2019 00:05:25 +0100 [thread overview]
Message-ID: <20190928230525.GX25504@bivouac.eciton.net> (raw)
In-Reply-To: <20190927092016.5604-1-pete@akeo.ie>
On Fri, Sep 27, 2019 at 10:20:15AM +0100, Pete Batard wrote:
> From: Andrei Warkentin <andrey.warkentin@gmail.com>
>
> The Pi GPU decouples requested resolution from actual physical resolution
> and can perform scaling of virtual resolutions. This enables platform users
> to do something like ask for 1024x768 and get a framebuffer of that size,
> regardless of the actual output (which could be a very blurry SDTV).
>
> Specifically, this patch allows selecting which specific virtual
> resolutions to enable, thus replacing the old all-or-nothing behaviour
> with either all virtual resolutions supported, or just the native one.
>
> This patch also adds enables the common 7" Pi (800x480) screen to be used
> at 800x600 resolution, instead of forcing 640x480 as the only usable
> resolution.
I am basically OK with this patch, but I note that the change in
variable name/content means existing users will end up with stale
variables.
So I wonder if it would be worth explicitly adding a stanza deleting
the old variable if found?
/
Leif.
> Signed-off-by: Pete Batard <pete@akeo.ie>
> ---
> Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c | 9 +--
> Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf | 2 +-
> Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.uni | 17 +++--
> Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr | 71 ++++++++++++++++----
> Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c | 53 +++++++++++++--
> Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf | 2 +-
> Platform/RaspberryPi/RPi3/RPi3.dec | 2 +-
> Platform/RaspberryPi/RPi3/RPi3.dsc | 2 +-
> 8 files changed, 125 insertions(+), 33 deletions(-)
>
> diff --git a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c
> index fcb4ce6935b6..98e58a560ed4 100644
> --- a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c
> +++ b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c
> @@ -92,6 +92,7 @@ SetupVariables (
> )
> {
> UINTN Size;
> + UINT8 Var8;
> UINT32 Var32;
> EFI_STATUS Status;
>
> @@ -180,12 +181,12 @@ SetupVariables (
> PcdSet32 (PcdDebugShowUEFIExit, PcdGet32 (PcdDebugShowUEFIExit));
> }
>
> - Size = sizeof (UINT32);
> - Status = gRT->GetVariable (L"DisplayEnableVModes",
> + Size = sizeof (UINT8);
> + Status = gRT->GetVariable (L"DisplayEnableScaledVModes",
> &gConfigDxeFormSetGuid,
> - NULL, &Size, &Var32);
> + NULL, &Size, &Var8);
> if (EFI_ERROR (Status)) {
> - PcdSet32 (PcdDisplayEnableVModes, PcdGet32 (PcdDisplayEnableVModes));
> + PcdSet8 (PcdDisplayEnableScaledVModes, PcdGet8 (PcdDisplayEnableScaledVModes));
> }
>
> Size = sizeof (UINT32);
> diff --git a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf
> index 2fc4302526a1..24112d517467 100644
> --- a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf
> +++ b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf
> @@ -64,7 +64,7 @@ [Pcd]
> gRaspberryPiTokenSpaceGuid.PcdMmcDisableMulti
> gRaspberryPiTokenSpaceGuid.PcdDebugEnableJTAG
> gRaspberryPiTokenSpaceGuid.PcdDebugShowUEFIExit
> - gRaspberryPiTokenSpaceGuid.PcdDisplayEnableVModes
> + gRaspberryPiTokenSpaceGuid.PcdDisplayEnableScaledVModes
> gRaspberryPiTokenSpaceGuid.PcdDisplayEnableSShot
>
> [FeaturePcd]
> diff --git a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.uni b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.uni
> index 65b45f3e6496..9b4076635f05 100644
> --- a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.uni
> +++ b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.uni
> @@ -71,10 +71,19 @@
> #string STR_DISPLAY_FORM_TITLE #language en-US "Display"
> #string STR_DISPLAY_FORM_SUBTITLE #language en-US "UEFI video driver settings"
>
> -#string STR_DISPLAY_VMODES_PROMPT #language en-US "Resolutions"
> -#string STR_DISPLAY_VMODES_HELP #language en-US "Support for non-native modes"
> -#string STR_DISPLAY_VMODES_ENABLE #language en-US "Also support 640x480, 800x600, 1024x768, 720p and 1080p"
> -#string STR_DISPLAY_VMODES_DISABLE #language en-US "Only native resolution"
> +#string STR_DISPLAY_VMODES_640_PROMPT #language en-US "Virtual 640x480"
> +#string STR_DISPLAY_VMODES_640_HELP #language en-US "Enable scaled 640x480 mode"
> +#string STR_DISPLAY_VMODES_800_PROMPT #language en-US "Virtual 800x600"
> +#string STR_DISPLAY_VMODES_800_HELP #language en-US "Enable scaled 800x600 mode"
> +#string STR_DISPLAY_VMODES_1024_PROMPT #language en-US "Virtual 1024x768"
> +#string STR_DISPLAY_VMODES_1024_HELP #language en-US "Enable scaled 1024x768 mode"
> +#string STR_DISPLAY_VMODES_720_PROMPT #language en-US "Virtual 720p"
> +#string STR_DISPLAY_VMODES_720_HELP #language en-US "Enable scaled 720p mode"
> +#string STR_DISPLAY_VMODES_1080_PROMPT #language en-US "Virtual 1080p"
> +#string STR_DISPLAY_VMODES_1080_HELP #language en-US "Enable scaled 1080p mode"
> +
> +#string STR_DISPLAY_VMODES_REAL_PROMPT #language en-US "Native resolution"
> +#string STR_DISPLAY_VMODES_REAL_HELP #language en-US "Native resolution"
>
> #string STR_DISPLAY_SSHOT_PROMPT #language en-US "Screenshot Support"
> #string STR_DISPLAY_SSHOT_HELP #language en-US "Save screen capture as a BMP on the first writable file system found"
> diff --git a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr
> index 217a285b5a1f..60bfdbd4d17e 100644
> --- a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr
> +++ b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr
> @@ -9,14 +9,23 @@
> #include <Guid/HiiPlatformSetupFormset.h>
> #include "ConfigDxeFormSetGuid.h"
>
> +#pragma pack(1)
> typedef struct {
> /*
> - * 0 - One mode for the boot resolution.
> - * 1 - Adds additional "typical" resolutions like
> - * 640x480, 800x600, 1024 x 768, 720p and 1080p.
> + * One bit for each scaled resolution supported,
> + * these are ordered exactly like mGopModeData
> + * in DisplayDxe.
> + *
> + * 800x600, 640x480, 1024x768, 720p, 1080p, native.
> */
> - UINT32 Enable;
> -} DISPLAY_ENABLE_VMODES_VARSTORE_DATA;
> + UINT8 v640 : 1;
> + UINT8 v800 : 1;
> + UINT8 v1024 : 1;
> + UINT8 v720p : 1;
> + UINT8 v1080p : 1;
> + UINT8 Physical : 1;
> +} DISPLAY_ENABLE_SCALED_VMODES_VARSTORE_DATA;
> +#pragma pack()
>
> typedef struct {
> /*
> @@ -166,9 +175,9 @@ formset
> name = DebugShowUEFIExit,
> guid = CONFIGDXE_FORM_SET_GUID;
>
> - efivarstore DISPLAY_ENABLE_VMODES_VARSTORE_DATA,
> + efivarstore DISPLAY_ENABLE_SCALED_VMODES_VARSTORE_DATA,
> attribute = EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
> - name = DisplayEnableVModes,
> + name = DisplayEnableScaledVModes,
> guid = CONFIGDXE_FORM_SET_GUID;
>
> efivarstore DISPLAY_ENABLE_SSHOT_VARSTORE_DATA,
> @@ -282,13 +291,47 @@ formset
> title = STRING_TOKEN(STR_DISPLAY_FORM_TITLE);
> subtitle text = STRING_TOKEN(STR_DISPLAY_FORM_SUBTITLE);
>
> - oneof varid = DisplayEnableVModes.Enable,
> - prompt = STRING_TOKEN(STR_DISPLAY_VMODES_PROMPT),
> - help = STRING_TOKEN(STR_DISPLAY_VMODES_HELP),
> - flags = NUMERIC_SIZE_4 | INTERACTIVE | RESET_REQUIRED,
> - option text = STRING_TOKEN(STR_DISPLAY_VMODES_ENABLE), value = 1, flags = DEFAULT;
> - option text = STRING_TOKEN(STR_DISPLAY_VMODES_DISABLE), value = 0, flags = 0;
> - endoneof;
> + checkbox varid = DisplayEnableScaledVModes.v640,
> + prompt = STRING_TOKEN(STR_DISPLAY_VMODES_640_PROMPT),
> + help = STRING_TOKEN(STR_DISPLAY_VMODES_640_HELP),
> + flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
> + default = TRUE,
> + endcheckbox;
> +
> + checkbox varid = DisplayEnableScaledVModes.v800,
> + prompt = STRING_TOKEN(STR_DISPLAY_VMODES_800_PROMPT),
> + help = STRING_TOKEN(STR_DISPLAY_VMODES_800_HELP),
> + flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
> + default = TRUE,
> + endcheckbox;
> +
> + checkbox varid = DisplayEnableScaledVModes.v1024,
> + prompt = STRING_TOKEN(STR_DISPLAY_VMODES_1024_PROMPT),
> + help = STRING_TOKEN(STR_DISPLAY_VMODES_1024_HELP),
> + flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
> + default = TRUE,
> + endcheckbox;
> +
> + checkbox varid = DisplayEnableScaledVModes.v720p,
> + prompt = STRING_TOKEN(STR_DISPLAY_VMODES_720_PROMPT),
> + help = STRING_TOKEN(STR_DISPLAY_VMODES_720_HELP),
> + flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
> + default = TRUE,
> + endcheckbox;
> +
> + checkbox varid = DisplayEnableScaledVModes.v1080p,
> + prompt = STRING_TOKEN(STR_DISPLAY_VMODES_1080_PROMPT),
> + help = STRING_TOKEN(STR_DISPLAY_VMODES_1080_HELP),
> + flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
> + default = TRUE,
> + endcheckbox;
> +
> + checkbox varid = DisplayEnableScaledVModes.Physical,
> + prompt = STRING_TOKEN(STR_DISPLAY_VMODES_REAL_PROMPT),
> + help = STRING_TOKEN(STR_DISPLAY_VMODES_REAL_HELP),
> + flags = CHECKBOX_DEFAULT | CHECKBOX_DEFAULT_MFG | RESET_REQUIRED,
> + default = TRUE,
> + endcheckbox;
>
> oneof varid = DisplayEnableSShot.Enable,
> prompt = STRING_TOKEN(STR_DISPLAY_SSHOT_PROMPT),
> diff --git a/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c b/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c
> index 9475a5ad670c..b880ca827bd6 100644
> --- a/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c
> +++ b/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c
> @@ -10,6 +10,14 @@
> #include <Base.h>
> #include "DisplayDxe.h"
>
> +#define MODE_800_ENABLED BIT0
> +#define MODE_640_ENABLED BIT1
> +#define MODE_1024_ENABLED BIT2
> +#define MODE_720P_ENABLED BIT3
> +#define MODE_1080P_ENABLED BIT4
> +#define MODE_NATIVE_ENABLED BIT5
> +#define JUST_NATIVE_ENABLED MODE_NATIVE_ENABLED
> +#define ALL_MODES (BIT6 - 1)
> #define POS_TO_FB(posX, posY) ((UINT8*) \
> ((UINTN)This->Mode->FrameBufferBase + \
> (posY) * This->Mode->Info->PixelsPerScanLine * \
> @@ -104,7 +112,7 @@ STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
> STATIC EFI_CPU_ARCH_PROTOCOL *mCpu;
>
> STATIC UINTN mLastMode;
> -STATIC GOP_MODE_DATA mGopModeData[] = {
> +STATIC GOP_MODE_DATA mGopModeTemplate[] = {
> { 800, 600 }, /* Legacy */
> { 640, 480 }, /* Legacy */
> { 1024, 768 }, /* Legacy */
> @@ -113,6 +121,9 @@ STATIC GOP_MODE_DATA mGopModeData[] = {
> { 0, 0 }, /* Physical */
> };
>
> +STATIC UINTN mLastMode;
> +STATIC GOP_MODE_DATA mGopModeData[ARRAY_SIZE (mGopModeTemplate)];
> +
> STATIC DISPLAY_DEVICE_PATH mDisplayProtoDevicePath =
> {
> {
> @@ -446,6 +457,7 @@ DriverStart (
> )
> {
> UINTN Index;
> + UINTN TempIndex;
> EFI_STATUS Status;
> VOID *Dummy;
>
> @@ -473,11 +485,29 @@ DriverStart (
> goto Done;
> }
>
> + PcdSet8 (PcdDisplayEnableScaledVModes,
> + PcdGet8 (PcdDisplayEnableScaledVModes) & ALL_MODES);
>
> - if (PcdGet32 (PcdDisplayEnableVModes)) {
> - mLastMode = ARRAY_SIZE (mGopModeData) - 1;
> - } else {
> - mLastMode = 0;
> + if (PcdGet8 (PcdDisplayEnableScaledVModes) == 0) {
> + PcdSet8 (PcdDisplayEnableScaledVModes, JUST_NATIVE_ENABLED);
> + }
> +
> + mLastMode = 0;
> + for (TempIndex = 0, Index = 0;
> + TempIndex < ARRAY_SIZE (mGopModeTemplate); TempIndex++) {
> + if ((PcdGet8 (PcdDisplayEnableScaledVModes) & (1 << TempIndex)) != 0) {
> + DEBUG ((DEBUG_ERROR, "Mode %u: %u x %u present\n",
> + TempIndex, mGopModeTemplate[TempIndex].Width,
> + mGopModeTemplate[TempIndex].Height));
> +
> + CopyMem (&mGopModeData[Index], &mGopModeTemplate[TempIndex],
> + sizeof (GOP_MODE_DATA));
> + mLastMode = Index;
> + Index++;
> + }
> + }
> +
> + if (PcdGet8 (PcdDisplayEnableScaledVModes) == JUST_NATIVE_ENABLED) {
> /*
> * mBootWidth x mBootHeight may not be sensible,
> * so clean it up, since we won't be adding
> @@ -486,11 +516,20 @@ DriverStart (
> if (mBootWidth < 640 || mBootHeight < 480) {
> mBootWidth = 640;
> mBootHeight = 480;
> + } else if (mBootWidth == 800 && mBootHeight == 480) {
> + /* The Pi 7" screen is close to 800x600, just pretend it is. */
> + mBootHeight = 600;
> }
> }
>
> - mGopModeData[mLastMode].Width = mBootWidth;
> - mGopModeData[mLastMode].Height = mBootHeight;
> + if ((PcdGet8(PcdDisplayEnableScaledVModes) & MODE_NATIVE_ENABLED) != 0) {
> + /*
> + * Adjust actual native res only if native res is enabled
> + * (so last mode is native res).
> + */
> + mGopModeData[mLastMode].Width = mBootWidth;
> + mGopModeData[mLastMode].Height = mBootHeight;
> + }
>
> for (Index = 0; Index <= mLastMode; Index++) {
> UINTN FbSize;
> diff --git a/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf b/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf
> index 11271045bdd9..31da2090b402 100644
> --- a/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf
> +++ b/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf
> @@ -57,7 +57,7 @@ [Protocols]
> gRaspberryPiFirmwareProtocolGuid
>
> [Pcd]
> - gRaspberryPiTokenSpaceGuid.PcdDisplayEnableVModes
> + gRaspberryPiTokenSpaceGuid.PcdDisplayEnableScaledVModes
> gRaspberryPiTokenSpaceGuid.PcdDisplayEnableSShot
>
> [Guids]
> diff --git a/Platform/RaspberryPi/RPi3/RPi3.dec b/Platform/RaspberryPi/RPi3/RPi3.dec
> index d2a813417648..0554ee20bac5 100644
> --- a/Platform/RaspberryPi/RPi3/RPi3.dec
> +++ b/Platform/RaspberryPi/RPi3/RPi3.dec
> @@ -54,5 +54,5 @@ [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
> gRaspberryPiTokenSpaceGuid.PcdDebugEnableJTAG|0|UINT32|0x00000014
> gRaspberryPiTokenSpaceGuid.PcdDebugShowUEFIExit|0|UINT32|0x00000015
> gRaspberryPiTokenSpaceGuid.PcdCustomCpuClock|0|UINT32|0x00000016
> - gRaspberryPiTokenSpaceGuid.PcdDisplayEnableVModes|0|UINT32|0x00000017
> + gRaspberryPiTokenSpaceGuid.PcdDisplayEnableScaledVModes|0|UINT8|0x00000017
> gRaspberryPiTokenSpaceGuid.PcdDisplayEnableSShot|0|UINT32|0x00000018
> diff --git a/Platform/RaspberryPi/RPi3/RPi3.dsc b/Platform/RaspberryPi/RPi3/RPi3.dsc
> index 2b9e619ad55c..b37a02e97da7 100644
> --- a/Platform/RaspberryPi/RPi3/RPi3.dsc
> +++ b/Platform/RaspberryPi/RPi3/RPi3.dsc
> @@ -416,7 +416,7 @@ [PcdsDynamicHii.common.DEFAULT]
> #
> # Display-related.
> #
> - gRaspberryPiTokenSpaceGuid.PcdDisplayEnableVModes|L"DisplayEnableVModes"|gConfigDxeFormSetGuid|0x0|0
> + gRaspberryPiTokenSpaceGuid.PcdDisplayEnableScaledVModes|L"DisplayEnableScaledVModes"|gConfigDxeFormSetGuid|0x0|0xff
> gRaspberryPiTokenSpaceGuid.PcdDisplayEnableSShot|L"DisplayEnableSShot"|gConfigDxeFormSetGuid|0x0|1
>
> #
> --
> 2.21.0.windows.1
>
next prev parent reply other threads:[~2019-09-28 23:05 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-27 9:20 [edk2-platforms PATCH 1/1] Platforms/RPi3: DisplayDxe virtual resolution improvements Pete Batard
2019-09-27 16:38 ` [edk2-devel] " Philippe Mathieu-Daudé
2019-09-27 17:49 ` Leif Lindholm
2019-09-27 20:23 ` Philippe Mathieu-Daudé
2019-09-27 20:41 ` Pete Batard
2019-10-01 10:20 ` Philippe Mathieu-Daudé
2019-10-01 13:18 ` Leif Lindholm
2019-09-27 17:51 ` Pete Batard
2019-09-28 23:05 ` Leif Lindholm [this message]
2019-09-30 9:32 ` Pete Batard
2019-10-01 13:10 ` Leif Lindholm
2019-10-01 13:35 ` [edk2-devel] " Philippe Mathieu-Daudé
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-list 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=20190928230525.GX25504@bivouac.eciton.net \
--to=devel@edk2.groups.io \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox