//
//
// Copyright (c) 2004  - 2014, Intel Corporation. All rights reserved.<BR>
//                                                                                  
// This program and the accompanying materials are licensed and made available under
// the terms and conditions of the BSD License that accompanies this distribution.  
// The full text of the license may be found at                                     
// http://opensource.org/licenses/bsd-license.php.                                  
//                                                                                  
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,            
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.    
//                                                                                  
//
//
// Module Name:
//
//   Boot.vfi
//
// Abstract:
//
//   Driver Setup formset.
//
// Revision History:
//
// --*/


form formid = BOOT_CONFIGURATION_FORM_ID,

  title  = STRING_TOKEN(STR_BOOT_CONFIGURATION_TITLE);


  oneof varid  = Setup.FastBoot,
    prompt   = STRING_TOKEN(STR_FAST_BOOT_PROMPT),
    help     = STRING_TOKEN(STR_FAST_BOOT_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value=0, flags= DEFAULT | RESET_REQUIRED;
    option text = STRING_TOKEN(STR_ENABLE),  value=1, flags= MANUFACTURING | RESET_REQUIRED;
  endoneof;

  oneof varid  = Setup.SecureBoot,
    prompt   = STRING_TOKEN(STR_SECURITY_BOOT_PROMPT),
    help     = STRING_TOKEN(STR_SECURITY_BOOT_HELP),
        option text = STRING_TOKEN(STR_DISABLE), value=0, flags= DEFAULT | MANUFACTURING | RESET_REQUIRED;
        option text = STRING_TOKEN(STR_ENABLE),  value=1, flags= RESET_REQUIRED;
  endoneof;


  oneof varid  = Setup.QuietBoot,
    prompt   = STRING_TOKEN(STR_QUIETBOOT_PROMPT),
    help     = STRING_TOKEN(STR_QUIETBOOT_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value=0, flags=DEFAULT | MANUFACTURING | RESET_REQUIRED;
    option text = STRING_TOKEN(STR_ENABLE),  value=1, flags=0 | RESET_REQUIRED;
  endoneof;



  oneof   varid   = Setup.LogBootTime,
      prompt      = STRING_TOKEN(STR_LOG_BOOT_TIME_PROMPT),
      help        = STRING_TOKEN(STR_LOG_BOOT_TIME_HELP),
      option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = 0 | RESET_REQUIRED;
      option text = STRING_TOKEN(STR_ENABLE),  value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
  endoneof;

  suppressif ideqval Setup.LogBootTime == 0x00;
    text
      help   = STRING_TOKEN(STR_NULL_STRING),
      text   = STRING_TOKEN(STR_LOG_BOOT_TIME_RECORD),
      text   = STRING_TOKEN(STR_LOG_BOOT_TIME_VALUE),
      flags  = 0,
      key    = 0;
  endif;

endform;




