On 17 November 2017 at 16:10, Leif Lindholm <[email protected]> wrote:
> On Fri, Nov 10, 2017 at 02:21:22PM +0000, Ard Biesheuvel wrote:
>> Ordinary computers typically have a physical switch or jumper on the
>> board that allows non-volatile settings to be cleared. Let's implement
>> the same using DIP switch #1 on block #3, and clear the EFI variable
>> store if it is set to ON at boot time.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.1
>> Signed-off-by: Ard Biesheuvel <[email protected]>
>> ---
>>  Platform/Socionext/DeveloperBox/DeveloperBox.dsc                            
>>             |  4 ++++
>>  Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.dsc                
>>             |  4 ++++
>>  Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.fdf                
>>             |  1 +
>>  
>> Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.c
>>    | 25 +++++++++++++++++++-
>>  
>> Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.inf
>>  |  6 +++++
>>  Silicon/Socionext/SynQuacer/SynQuacer.dec                                   
>>             |  2 ++
>>  6 files changed, 41 insertions(+), 1 deletion(-)
>>
>> diff --git a/Platform/Socionext/DeveloperBox/DeveloperBox.dsc 
>> b/Platform/Socionext/DeveloperBox/DeveloperBox.dsc
>> index 10d070773cdc..af978db2c034 100644
>> --- a/Platform/Socionext/DeveloperBox/DeveloperBox.dsc
>> +++ b/Platform/Socionext/DeveloperBox/DeveloperBox.dsc
>> @@ -381,6 +381,9 @@ [PcdsFixedAtBuild.common]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId|0x4f524e4c # LNRO
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision|1
>>
>> +  # set DIP switch DSW3-PIN1 to clear the varstore
>> +  gSynQuacerTokenSpaceGuid.PcdClearSettingsGpioPin|0
>> +
>
> Right, so could you change this value to 1 ...
>

OK

>>  [PcdsPatchableInModule]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|0
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|0
>> @@ -418,6 +421,7 @@ [Components.common]
>>    MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
>>    MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
>>    MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
>> +  Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf
>>    MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
>>      <LibraryClasses>
>>        
>> NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
>> diff --git a/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.dsc 
>> b/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.dsc
>> index 4630d78bce93..4034bcfe82c5 100644
>> --- a/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.dsc
>> +++ b/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.dsc
>> @@ -369,6 +369,9 @@ [PcdsFixedAtBuild.common]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase|0x08420000
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize|0x00010000
>>
>> +  # set DIP switch DSW3-PIN1 to clear the varstore
>> +  gSynQuacerTokenSpaceGuid.PcdClearSettingsGpioPin|0
>> +
>>  [PcdsPatchableInModule]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdVideoHorizontalResolution|0
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdVideoVerticalResolution|0
>> @@ -406,6 +409,7 @@ [Components.common]
>>    MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
>>    MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
>>    MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
>> +  Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf
>>    MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf {
>>      <LibraryClasses>
>>        
>> NULL|MdeModulePkg/Library/LzmaCustomDecompressLib/LzmaCustomDecompressLib.inf
>> diff --git a/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.fdf 
>> b/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.fdf
>> index 365085c8f243..4577bd316a1f 100644
>> --- a/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.fdf
>> +++ b/Platform/Socionext/SynQuacerEvalBoard/SynQuacerEvalBoard.fdf
>> @@ -248,6 +248,7 @@ [FV.FVMAIN_COMPACT]
>>    INF MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf
>>    INF MdeModulePkg/Universal/Variable/Pei/VariablePei.inf
>>    INF MdeModulePkg/Universal/CapsulePei/CapsulePei.inf
>> +  INF 
>> Silicon/Socionext/SynQuacer/Drivers/SynQuacerGpioPei/SynQuacerGpioPei.inf
>>    INF RuleOverride = FMP_IMAGE_DESC 
>> Platform/Socionext/SynQuacerEvalBoard/SystemFirmwareDescriptor/SystemFirmwareDescriptor.inf
>>    INF MdeModulePkg/Core/DxeIplPeim/DxeIpl.inf
>>
>> diff --git 
>> a/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.c
>>  
>> b/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.c
>> index 358dd5a91f08..bd8ee7a368f5 100644
>> --- 
>> a/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.c
>> +++ 
>> b/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.c
>> @@ -21,6 +21,7 @@
>>  #include <Library/PeiServicesLib.h>
>>  #include <Platform/DramInfo.h>
>>  #include <Ppi/DramInfo.h>
>> +#include <Ppi/EmbeddedGpio.h>
>>  #include <Ppi/MemoryDiscovered.h>
>>
>>  STATIC
>> @@ -103,10 +104,32 @@ PlatformPeim (
>>    VOID
>>    )
>>  {
>> -  EFI_STATUS      Status;
>> +  EMBEDDED_GPIO_PPI   *Gpio;
>> +  EFI_STATUS          Status;
>> +  UINTN               Value;
>
> And use a local variable Pin, initialized to
> FixedPcdGet32 (PcdClearSettingsGpioPin) - 1?
> (You could then also have an assert verifying PcdClearSettingsGpioPin
> != 0, to make fallback to default value flash warnings.)
>

Right. The DEBUG build already produces the NorFlashDxe blurb that the
FV is being reinitialized.

In any case, given that the SoC does number its GPIOs 0 - 31, the fact
that developerbox DSW3 pins are 1 based does not mean 0 is
unallocated. So I think it would make more sense to use UINT32_MAX as
unused.

>>
>>    ASSERT (mDramInfo->NumRegions > 0);
>>
>> +  Status = PeiServicesLocatePpi (&gEdkiiEmbeddedGpioPpiGuid, 0, NULL,
>> +             (VOID **)&Gpio);
>> +  ASSERT_EFI_ERROR (Status);
>> +
>> +  Status = Gpio->Set (Gpio, FixedPcdGet32 (PcdClearSettingsGpioPin),
>> +                   GPIO_MODE_INPUT);
>> +  if (EFI_ERROR (Status)) {
>> +    DEBUG ((DEBUG_WARN, "%a: failed to set GPIO as input - %r\n", 
>> __FUNCTION__,
>> +      Status));
>> +  } else {
>> +    Status = Gpio->Get (Gpio, FixedPcdGet32 (PcdClearSettingsGpioPin), 
>> &Value);
>> +    if (EFI_ERROR (Status)) {
>> +      DEBUG ((DEBUG_WARN, "%a: failed to get GPIO state - %r\n", 
>> __FUNCTION__,
>> +        Status));
>> +    } else if (Value > 0) {
>> +      DEBUG ((DEBUG_INFO, "%a: clearing NVRAM\n", __FUNCTION__));
>> +      PeiServicesSetBootMode (BOOT_WITH_DEFAULT_SETTINGS);
>> +    }
>> +  }
>> +
>>    //
>>    // Record the first region into PcdSystemMemoryBase and 
>> PcdSystemMemorySize.
>>    // This is the region we will use for UEFI itself.
>> diff --git 
>> a/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.inf
>>  
>> b/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.inf
>> index 70eb715d44e3..a6501fb205e1 100644
>> --- 
>> a/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.inf
>> +++ 
>> b/Silicon/Socionext/SynQuacer/Library/SynQuacerPlatformPeiLib/SynQuacerPlatformPeiLib.inf
>> @@ -25,6 +25,7 @@ [Sources]
>>
>>  [Packages]
>>    ArmPkg/ArmPkg.dec
>> +  EmbeddedPkg/EmbeddedPkg.dec
>>    MdePkg/MdePkg.dec
>>    MdeModulePkg/MdeModulePkg.dec
>>    Silicon/Socionext/SynQuacer/SynQuacer.dec
>> @@ -40,11 +41,16 @@ [LibraryClasses]
>>  [FixedPcd]
>>    gArmTokenSpaceGuid.PcdFvBaseAddress
>>    gArmTokenSpaceGuid.PcdFvSize
>> +  gSynQuacerTokenSpaceGuid.PcdClearSettingsGpioPin
>>    gSynQuacerTokenSpaceGuid.PcdDramInfoBase
>>
>>  [Ppis]
>> +  gEdkiiEmbeddedGpioPpiGuid             ## CONSUMES
>>    gSynQuacerDramInfoPpiGuid             ## PRODUCES
>>
>>  [Pcd]
>>    gArmTokenSpaceGuid.PcdSystemMemoryBase
>>    gArmTokenSpaceGuid.PcdSystemMemorySize
>> +
>> +[Depex]
>> +  gEdkiiEmbeddedGpioPpiGuid
>> diff --git a/Silicon/Socionext/SynQuacer/SynQuacer.dec 
>> b/Silicon/Socionext/SynQuacer/SynQuacer.dec
>> index 1a683b81521b..c11550469cd0 100644
>> --- a/Silicon/Socionext/SynQuacer/SynQuacer.dec
>> +++ b/Silicon/Socionext/SynQuacer/SynQuacer.dec
>> @@ -30,3 +30,5 @@ [PcdsFixedAtBuild]
>>
>>    gSynQuacerTokenSpaceGuid.PcdNetsecEepromBase|0|UINT32|0x00000002
>>    gSynQuacerTokenSpaceGuid.PcdNetsecPhyAddress|0|UINT8|0x00000003
>> +
>> +  gSynQuacerTokenSpaceGuid.PcdClearSettingsGpioPin|0|UINT32|0x00000004
>
> And add a small comment for this line that this refers to block 3 and
> 0 means "don't use"?
>

Block 3 is platform specific not SoC specific.
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to