// /**
//
// Copyright (c) 2016 - 2023, Arm Limited. All rights reserved.<BR>
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
// Module Name:
//
// UefiShellAcpiViewCommandLib.uni
//
// Abstract:
//
// String definitions for UEFI Shell acpiview command
//
//
// */

/=#

#langdef   en-US "english"

#string STR_GEN_PROBLEM           #language en-US "%H%s%N: Unknown flag - '%H%s%N'\r\n"
#string STR_GEN_NO_VALUE          #language en-US "%H%s%N: Missing argument for flag - '%H%s%N'\r\n"
#string STR_GEN_TOO_MANY          #language en-US "%H%s%N: Too many arguments.\r\n"
#string STR_GEN_MISSING_OPTION    #language en-US "%H%s%N: Missing option '%H%s%N' required by flag - '%H%s%N'\r\n"
#string STR_GEN_READONLY_MEDIA    #language en-US "%H%s%N: Unable to write to the current directory, check if media is writable.\r\n"

#string STR_GET_HELP_ACPIVIEW   #language en-US ""
".TH acpiview 0 "Display ACPI information."\r\n"
".SH NAME\r\n"
"Display ACPI Table information.\r\n"
".SH SYNOPSIS\r\n"
" \r\n"
"ACPIVIEW [[-?] | [[[[-l] | [-s AcpiTable [-d]]] [-q] [-h]] [-r Spec]]]\r\n"
" \r\n"
".SH OPTIONS\r\n"
" \r\n"
"  -l - Display list of installed ACPI Tables.\r\n"
"  -s - Display only the specified AcpiTable type and only support single\r\n"
"       invocation option.\r\n"
"         AcpiTable    : The required ACPI Table type.\r\n"
"  -d - Generate a binary file dump of the specified AcpiTable.\r\n"
"  -q - Quiet. Suppress errors and warnings. Disables consistency checks.\r\n"
"  -h - Enable colour highlighting.\r\n"
"  -r - Validate that all required ACPI tables are installed\r\n"
"         Spec  : Specification to validate against.\r\n"
"                 For Arm, the possible values are:\r\n"
"                   0 - Server Base Boot Requirements v1.0\r\n"
"                   1 - Server Base Boot Requirements v1.1\r\n"
"                   2 - Server Base Boot Requirements v1.2\r\n"
"  -? - Show help.\r\n"
" \r\n"
".SH DESCRIPTION\r\n"
" \r\n"
"  This program is provided to allow examination of ACPI table values from the\r\n"
"  UEFI Shell.  This can help with investigations, especially at that stage\r\n"
"  where the tables are not enabling an OS to boot.\r\n"
"  The program is not exhaustive, and only encapsulates detailed knowledge of a\r\n"
"  limited number of table types.\r\n"
" \r\n"
"  Default behaviour is to display the content of all tables installed.\r\n"
"  'Known' table types (listed in NOTES below) will be parsed and displayed\r\n"
"  with descriptions and field values.  Where appropriate a degree of\r\n"
"  consistency checking is done and errors may be reported in the output.\r\n"
"  Other table types will be displayed as an array of Hexadecimal bytes.\r\n"
" \r\n"
"  To facilitate debugging, the -s and -d options can be used to generate a\r\n"
"  binary file image of a table that can be copied elsewhere for investigation\r\n"
"  using tools such as those provided by acpica.org.  This is especially\r\n"
"  relevant for AML type tables like DSDT and SSDT.\r\n"
" \r\n"
"NOTES:\r\n"
"  1. The AcpiTable parameter can match any installed table type.\r\n"
"     Tables without specific handling will be displayed as a raw hex dump (or\r\n"
"     dumped to a file if -d is used).\r\n"
"  2. -s option supports to display the specified AcpiTable type that is present\r\n"
"     in the system. For normal type AcpiTable, it would display the data of the\r\n"
"     AcpiTable and AcpiTable header. The following type may contain header type\r\n"
"     other than AcpiTable header. The actual header can refer to the ACPI spec\r\n"
"     6.2\r\n"
"     Extra A. Particular types:\r\n"
"       AEST  - Arm Error Source Table\r\n"
"       APIC  - Multiple APIC Description Table (MADT)\r\n"
"       APMT  - Arm Performance Monitoring Unit Table\r\n"
"       BGRT  - Boot Graphics Resource Table\r\n"
"       DBG2  - Debug Port Table 2\r\n"
"       DSDT  - Differentiated System Description Table\r\n"
"       FACP  - Fixed ACPI Description Table (FADT)\r\n"
"       GTDT  - Generic Timer Description Table\r\n"
"       HMAT  - Heterogeneous Memory Attributes Table\r\n"
"       IORT  - IO Remapping Table\r\n"
"       MCFG  - Memory Mapped Config Space Base Address Description Table\r\n"
"       MPAM  - Memory System Resource Partitioning and Monitoring Table\r\n"
"       PPTT  - Processor Properties Topology Table\r\n"
"       RSDP  - Root System Description Pointer\r\n"
"       SLIT  - System Locality Information Table\r\n"
"       SPCR  - Serial Port Console Redirection Table\r\n"
"       SRAT  - System Resource Affinity Table\r\n"
"       SSDT  - Secondary SystemDescription Table\r\n"
"       XSDT  - Extended System Description Table\r\n"
" \r\n"
".SH STANDARDS\r\n"
" \r\n"
"  Table details correspond to those in 'Advanced Configuration and Power\r\n"
"  Interface Specification' Version 6.2 Errata A, [September 2017]\r\n"
"  (http://www.uefi.org/sites/default/files/resources/ACPI%206_2_A_Sept29.pdf)\r\n"
" \r\n"
"  NOTE: The nature of the ACPI standard means that almost all tables in 6.1\r\n"
"        will be 'backwards compatible' with prior version of the specification\r\n"
"        in terms of structure, so formatted output should be correct.  The main\r\n"
"        exception will be that previously 'reserved' fields will be reported\r\n"
"        with new names, where they have been added in later versions of the\r\n"
"        specification.\r\n"
" \r\n"
".SH EXAMPLES\r\n"
" \r\n"
" \r\n"
"EXAMPLES:\r\n"
"  * To display a list of the installed table types:\r\n"
"    fs0:\> acpiview -l\r\n"
" \r\n"
"  * To parse and display a specific table type:\r\n"
"    fs0:\> acpiview -s GTDT\r\n"
" \r\n"
"  * To save a binary dump of the contents of a table to a file\r\n"
"    in the current working directory:\r\n"
"    fs0:\> acpiview -s DSDT -d\r\n"
" \r\n"
"  * To display contents of all ACPI tables:\r\n"
"    fs0:\> acpiview\r\n"
" \r\n"
"  * To check if all Server Base Boot Requirements (SBBR) v1.2 mandatory\r\n"
"    ACPI tables are installed (Arm only):\r\n"
"    fs0:\> acpiview -r 2\r\n"
" \r\n"
".SH RETURNVALUES\r\n"
" \r\n"
"RETURN VALUES:\r\n"
"  SHELL_SUCCESS             Data was displayed as requested.\r\n"
"  SHELL_INVALID_PARAMETER   ACPI Table parsing failed.\r\n"
" \r\n"

