//
//
// 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:
//
//   DebugConfiguration.vfi
//
// Abstract:
//
//   Debug Configuration formset.
//


// --*/

form formid = DEBUG_CONFIGURATION_FORM_ID,
  title    = STRING_TOKEN(STR_DEBUG_CONFIGURATION_TITLE);


  subtitle text = STRING_TOKEN(STR_NULL_STRING);
  subtitle text = STRING_TOKEN(STR_ACPIMEMDBG_STRING);

  //ACPI Memory Debug Switch
    oneof varid   = Setup.ACPIMemDbg,
      prompt      = STRING_TOKEN (STR_ACPIMEMDBG_SWTICH),
      help        = STRING_TOKEN (STR_ACPIMEMDBG_SWTICH_HELP),
      option text = STRING_TOKEN (STR_ENABLE),  value = 1, flags =  DEFAULT | MANUFACTURING | RESET_REQUIRED;
      option text = STRING_TOKEN (STR_DISABLE), value = 0, flags =  RESET_REQUIRED;
    endoneof;


  subtitle text = STRING_TOKEN(STR_NULL_STRING);

    oneof varid   = Setup.ExISupport,
      prompt      = STRING_TOKEN(STR_EXISUPPORT_PROMPT),
      help        = STRING_TOKEN(STR_EXISUPPORT_HELP),
      option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED;
      option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | RESET_REQUIRED;
    endoneof;
 subtitle text = STRING_TOKEN(STR_WITT_CONFIGURATION_TITLE);

  oneof varid   = Setup.WittEnable,
    prompt      = STRING_TOKEN(STR_WITT_PROMPT),
    help        = STRING_TOKEN(STR_WITT_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | RESET_REQUIRED;
    option text = STRING_TOKEN(STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
  endoneof;

  oneof varid   = Setup.UtsEnable,
    prompt      = STRING_TOKEN(STR_UTS_PROMPT),
    help        = STRING_TOKEN(STR_UTS_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | RESET_REQUIRED;
    option text = STRING_TOKEN(STR_ENABLE),  value = 1, flags = RESET_REQUIRED;
  endoneof;

  //
  //Lakemore Settings
  //
  subtitle text = STRING_TOKEN(STR_NULL_STRING);
  subtitle text = STRING_TOKEN(STR_LM_INFORMATION_TITLE);

    grayoutif ideqval Setup.PunitBIOSConfig == 0x1;
      oneof varid   = Setup.LmMemSize,
        prompt      = STRING_TOKEN (STR_LM_MEMORY_PROMPT),
        help        = STRING_TOKEN (STR_LM_MEMORY_HELP),
        option text = STRING_TOKEN (STR_LM_MEMORY_16MB),  value = 16384, flags = RESET_REQUIRED;
        option text = STRING_TOKEN (STR_LM_MEMORY_8MB),   value = 8192,  flags = RESET_REQUIRED;
        option text = STRING_TOKEN (STR_LM_MEMORY_1MB),   value = 1024,  flags = RESET_REQUIRED;
        option text = STRING_TOKEN (STR_LM_MEMORY_128KB), value = 128,   flags = RESET_REQUIRED;
        option text = STRING_TOKEN (STR_LM_MEMORY_0MB),   value = 0,     flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
      endoneof;
    endif;

    oneof varid   = Setup.PunitBIOSConfig,
      prompt      = STRING_TOKEN (STR_PUINT_BIOS_CONFIG_DISPLAY),
      help        = STRING_TOKEN (STR_PUINT_BIOS_CONFIG_DISPLAY_HELP),
      option text = STRING_TOKEN (STR_PUINT_BIOS_PDM),         value = 3,  flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
      option text = STRING_TOKEN (STR_PUINT_BIOS_PERFORMANCE), value = 2,  flags = RESET_REQUIRED;
      option text = STRING_TOKEN (STR_PUINT_BIOS_POWERSAVE),   value = 1,  flags = RESET_REQUIRED;
	  option text = STRING_TOKEN (STR_PUINT_BIOS_RESERVED),    value = 0,  flags = RESET_REQUIRED;
    endoneof;

    suppressif NOT ideqval Setup.PunitBIOSConfig == 0x3;
      oneof varid   = Setup.PDMConfig,
        prompt      = STRING_TOKEN (STR_PDM_OUTPUT_CONFIG_SWTICH),
        help        = STRING_TOKEN (STR_PDM_OUTPUT_CONFIG_SWTICH_HELP),
        option text = STRING_TOKEN (STR_DISABLE), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
        option text = STRING_TOKEN (STR_PDM_OUTPUT_MEM), value = 1, flags = RESET_REQUIRED;
        option text = STRING_TOKEN (STR_PDM_OUTPUT_IO),  value = 2, flags = RESET_REQUIRED;
      endoneof;
    endif;

  subtitle text = STRING_TOKEN(STR_NULL_STRING);
  oneof varid   = Setup.ENDBG2,
    prompt      = STRING_TOKEN (STR_ENABLE_DBG2),
    help        = STRING_TOKEN (STR_ENABLE_DBG2_HELP),
    option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED;
    option text = STRING_TOKEN(STR_ENABLE),  value = 1, flags = DEFAULT | RESET_REQUIRED;
  endoneof;

  subtitle text = STRING_TOKEN(STR_NULL_STRING);

  subtitle text = STRING_TOKEN(STR_NULL_STRING);
  oneof varid = Setup.DisableCodec262,
  prompt   = STRING_TOKEN(STR_CODEC262_DISABLED_PROMPT),
  help     = STRING_TOKEN(STR_CODEC262_DISABLED_HELP),
  option text = STRING_TOKEN(STR_YES), value = 1, flags = RESET_REQUIRED;
  option text = STRING_TOKEN(STR_NO), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED;
  endoneof;

endform;
