diff --git a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.c index fcb4ce6935b..98e58a560ed 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 2fc4302526a..24112d51746 100644 --- a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf +++ b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxe.inf @@ -64,7 +64,7 @@ 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 65b45f3e649..9b4076635f0 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 217a285b5a1..60bfdbd4d17 100644 --- a/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr +++ b/Platform/RaspberryPi/RPi3/Drivers/ConfigDxe/ConfigDxeHii.vfr @@ -9,14 +9,23 @@ #include #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 9475a5ad670..b880ca827bd 100644 --- a/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c +++ b/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.c @@ -10,6 +10,14 @@ #include #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 11271045bdd..31da2090b40 100644 --- a/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf +++ b/Platform/RaspberryPi/RPi3/Drivers/DisplayDxe/DisplayDxe.inf @@ -57,7 +57,7 @@ gRaspberryPiFirmwareProtocolGuid [Pcd] - gRaspberryPiTokenSpaceGuid.PcdDisplayEnableVModes + gRaspberryPiTokenSpaceGuid.PcdDisplayEnableScaledVModes gRaspberryPiTokenSpaceGuid.PcdDisplayEnableSShot [Guids] diff --git a/Platform/RaspberryPi/RPi3/RPi3.dec b/Platform/RaspberryPi/RPi3/RPi3.dec index d2a81341764..0554ee20bac 100644 --- a/Platform/RaspberryPi/RPi3/RPi3.dec +++ b/Platform/RaspberryPi/RPi3/RPi3.dec @@ -54,5 +54,5 @@ 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 2b9e619ad55..b37a02e97da 100644 --- a/Platform/RaspberryPi/RPi3/RPi3.dsc +++ b/Platform/RaspberryPi/RPi3/RPi3.dsc @@ -416,7 +416,7 @@ # # Display-related. # - gRaspberryPiTokenSpaceGuid.PcdDisplayEnableVModes|L"DisplayEnableVModes"|gConfigDxeFormSetGuid|0x0|0 + gRaspberryPiTokenSpaceGuid.PcdDisplayEnableScaledVModes|L"DisplayEnableScaledVModes"|gConfigDxeFormSetGuid|0x0|0xff gRaspberryPiTokenSpaceGuid.PcdDisplayEnableSShot|L"DisplayEnableSShot"|gConfigDxeFormSetGuid|0x0|1 #