Hello,

I am working with a self-designed board based on MinnowBard-Max reference board 
and I would like to change some default boot behaviour.

I am specifically trying to change the value of Setup.eMMCBootMode (which is 
defined in SouthClusterConfig.vfi) from the default value 0 (auto detect) to 3 
(eMMC 4.5), but the problem that I find is more general.

Changing DEFAULT flag definition in the .vfi file as shown below doesn't work. 
When recompiling and booting, the value in the menu is always 0 (auto-detect) 
no matter which default value I set.

                ...
  oneof varid   = Setup.eMMCBootMode,
    prompt      = STRING_TOKEN(STR_EMMC_BOOT_PROMPT),
    help        = STRING_TOKEN(STR_EMMC_BOOT_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value=0, flags=RESET_REQUIRED;
    option text = STRING_TOKEN(STR_AUTO_DETECT), value=1, flags=RESET_REQUIRED;
    option text = STRING_TOKEN(STR_EMMC_BOOT_41), value=2, flags=RESET_REQUIRED;
    option text = STRING_TOKEN(STR_EMMC_BOOT_45), value=3, flags=DEFAULT | 
MANUFACTURING | RESET_REQUIRED;
  endoneof;
                ...

I have verified that after flashing a new BIOS, the default value is set 
(previous manual configurations are erased), so it means somewhere in the code, 
the Setup variable is being built with that default value. If I add debug 
messages anywhere in the code, I see that eMMCBootCode is always 0.

Another solution that I have tried is to add new fields to SYSTEM_CONFIGURATION 
structure.

  ...
  UINT8   SdCardRemovable; // ACPI reporting MMC/SD media as: 
removable/non-removable
  UINT8   GpioWakeCapability;
  UINT8   RtcBattery;
  UINT8   LpeAudioReportedByDSDT;

  UINT8   new_field1;
  UINT8   new_field2;
  UINT8   new_field3;
  UINT8   new_field4;
} SYSTEM_CONFIGURATION;
#pragma pack()
...

The problem with this modification is that the condition VariableSize != 
sizeof(SYSTEM_CONFIGURATION) always fails so I get an Assert. Below it's shown 
a place where this condition is checked (extract from PlatformEarlyInit.c).

  //


  // Use normal setup default from NVRAM variable,


  // the Platform Mode (manufacturing/safe/normal) is handle in PeiGetVariable.


  //


  VariableSize = sizeof(SYSTEM_CONFIGURATION);


  Status = Variable->GetVariable (


                       Variable,


                       L"Setup",


                       &gEfiSetupVariableGuid,


                       NULL,


                       &VariableSize,


                       SystemConfiguration


                       );


  if (EFI_ERROR (Status) || VariableSize != sizeof(SYSTEM_CONFIGURATION)) {


   //The setup variable is corrupted


    VariableSize = sizeof(SYSTEM_CONFIGURATION);


    Status = Variable->GetVariable(


              Variable,


              L"SetupRecovery",


              &gEfiSetupVariableGuid,


              NULL,


              &VariableSize,


              SystemConfiguration


              );


    ASSERT_EFI_ERROR (Status);


  }


The condition fails because VariableSize still reflects the original length of 
SYSTEM_CONFIGURATION whereas sizeof(SYSTEM_CONFIGURATION) shows the new value 
(4 bytes more) with the fields added. This brings me to the conclusion that 
there is some other place in the code where the variable "Setup" is initialized 
and it is using another copy of the structure.

I would like to know:

  *   if it is possible to change the default value of the "Setup" variable and 
the place to do so
  *   if it is possible to add new fields to the "Setup" variable and how to do 
it

Thanks in advance,
David

_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to