ShellPkg: Add acpiview tool to dump ACPI tables
[mirror_edk2.git] / ShellPkg / Library / UefiShellAcpiViewCommandLib / Parsers / Spcr / SpcrParser.c
1 /**\r
2   SPCR table parser\r
3 \r
4   Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.\r
5   This program and the accompanying materials\r
6   are licensed and made available under the terms and conditions of the BSD License\r
7   which accompanies this distribution.  The full text of the license may be found at\r
8   http://opensource.org/licenses/bsd-license.php\r
9 \r
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 \r
13   @par Reference(s):\r
14     - Microsoft Serial Port Console Redirection Table\r
15       Specification - Version 1.03 - August 10, 2015.\r
16 **/\r
17 \r
18 #include <IndustryStandard/Acpi.h>\r
19 #include <IndustryStandard/SerialPortConsoleRedirectionTable.h>\r
20 #include <Library/UefiLib.h>\r
21 #include "AcpiParser.h"\r
22 #include "AcpiTableParser.h"\r
23 \r
24 // Local variables\r
25 STATIC ACPI_DESCRIPTION_HEADER_INFO AcpiHdrInfo;\r
26 \r
27 /** This function validates the Interrupt Type.\r
28 \r
29   @param [in] Ptr     Pointer to the start of the field data.\r
30   @param [in] Context Pointer to context specific information e.g. this\r
31                       could be a pointer to the ACPI table header.\r
32 */\r
33 STATIC\r
34 VOID\r
35 EFIAPI\r
36 ValidateInterruptType (\r
37   IN UINT8* Ptr,\r
38   IN VOID*  Context\r
39   );\r
40 \r
41 /** This function validates the Irq.\r
42 \r
43   @param [in] Ptr     Pointer to the start of the field data.\r
44   @param [in] Context Pointer to context specific information e.g. this\r
45                       could be a pointer to the ACPI table header.\r
46 */\r
47 STATIC\r
48 VOID\r
49 EFIAPI\r
50 ValidateIrq (\r
51   IN UINT8* Ptr,\r
52   IN VOID*  Context\r
53   );\r
54 \r
55 /** An ACPI_PARSER array describing the ACPI SPCR Table.\r
56 */\r
57 STATIC CONST ACPI_PARSER SpcrParser[] = {\r
58   PARSE_ACPI_HEADER (&AcpiHdrInfo),\r
59   {L"Interface Type", 1, 36, L"%d", NULL, NULL, NULL, NULL},\r
60   {L"Reserved", 3, 37, L"%x %x %x", Dump3Chars, NULL, NULL, NULL},\r
61   {L"Base Address", 12, 40, NULL, DumpGas, NULL, NULL, NULL},\r
62   {L"Interrupt Type", 1, 52, L"%d", NULL, NULL, ValidateInterruptType, NULL},\r
63   {L"IRQ", 1, 53, L"%d", NULL, NULL, ValidateIrq, NULL},\r
64   {L"Global System Interrupt", 4, 54, L"0x%x", NULL, NULL, NULL, NULL},\r
65   {L"Baud Rate", 1, 58, L"%d", NULL, NULL, NULL, NULL},\r
66   {L"Parity", 1, 59, L"%d", NULL, NULL, NULL, NULL},\r
67   {L"Stop Bits", 1, 60, L"%d", NULL, NULL, NULL, NULL},\r
68   {L"Flow Control", 1, 61, L"0x%x", NULL, NULL, NULL, NULL},\r
69   {L"Terminal Type", 1, 62, L"%d", NULL, NULL, NULL, NULL},\r
70   {L"Reserved", 1, 63, L"%x", NULL, NULL, NULL, NULL},\r
71 \r
72   {L"PCI Device ID", 2, 64, L"0x%x", NULL, NULL, NULL, NULL},\r
73   {L"PCI Vendor ID", 2, 66, L"0x%x", NULL, NULL, NULL, NULL},\r
74   {L"PCI Bus Number", 1, 68, L"0x%x", NULL, NULL, NULL, NULL},\r
75   {L"PCI Device Number", 1, 69, L"0x%x", NULL, NULL, NULL, NULL},\r
76   {L"PCI Function Number", 1, 70, L"0x%x", NULL, NULL, NULL, NULL},\r
77   {L"PCI Flags", 4, 71, L"0x%x", NULL, NULL, NULL, NULL},\r
78   {L"PCI Segment", 1, 75, L"0x%x", NULL, NULL, NULL, NULL},\r
79   {L"Reserved", 4, 76, L"%x", NULL, NULL, NULL, NULL}\r
80 };\r
81 \r
82 /** This function validates the Interrupt Type.\r
83 \r
84   @param [in] Ptr     Pointer to the start of the field data.\r
85   @param [in] Context Pointer to context specific information e.g. this\r
86                       could be a pointer to the ACPI table header.\r
87 */\r
88 STATIC\r
89 VOID\r
90 EFIAPI\r
91 ValidateInterruptType (\r
92   IN UINT8* Ptr,\r
93   IN VOID*  Context\r
94   )\r
95 {\r
96 #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r
97   UINT8 InterruptType = *Ptr;\r
98   if (InterruptType !=\r
99         EFI_ACPI_SERIAL_PORT_CONSOLE_REDIRECTION_TABLE_INTERRUPT_TYPE_GIC) {\r
100     IncrementErrorCount ();\r
101     Print (\r
102       L"\nERROR: InterruptType = %d. This must be 8 on ARM Platforms",\r
103       InterruptType\r
104       );\r
105   }\r
106 #endif\r
107 }\r
108 \r
109 /** This function validates the Irq.\r
110 \r
111   @param [in] Ptr     Pointer to the start of the field data.\r
112   @param [in] Context Pointer to context specific information e.g. this\r
113                       could be a pointer to the ACPI table header.\r
114 */\r
115 STATIC\r
116 VOID\r
117 EFIAPI\r
118 ValidateIrq (\r
119   IN UINT8* Ptr,\r
120   IN VOID*  Context\r
121   )\r
122 {\r
123 #if defined (MDE_CPU_ARM) || defined (MDE_CPU_AARCH64)\r
124   UINT8 Irq = *Ptr;\r
125   if (Irq != 0) {\r
126     IncrementErrorCount ();\r
127     Print (\r
128       L"\nERROR: Irq = %d. This must be zero on ARM Platforms\n",\r
129       Irq\r
130       );\r
131   }\r
132 #endif\r
133 }\r
134 \r
135 /** This function parses the ACPI SPCR table.\r
136   When trace is enabled this function parses the SPCR table and\r
137   traces the ACPI table fields.\r
138 \r
139   This function also performs validations of the ACPI table fields.\r
140 \r
141   @param [in] Trace              If TRUE, trace the ACPI fields.\r
142   @param [in] Ptr                Pointer to the start of the buffer.\r
143   @param [in] AcpiTableLength    Length of the ACPI table.\r
144   @param [in] AcpiTableRevision  Revision of the ACPI table.\r
145 */\r
146 VOID\r
147 EFIAPI\r
148 ParseAcpiSpcr (\r
149   IN BOOLEAN Trace,\r
150   IN UINT8*  Ptr,\r
151   IN UINT32  AcpiTableLength,\r
152   IN UINT8   AcpiTableRevision\r
153   )\r
154 {\r
155   if (!Trace) {\r
156     return;\r
157   }\r
158 \r
159   // Dump the SPCR\r
160   ParseAcpi (\r
161     TRUE,\r
162     0,\r
163     "SPCR",\r
164     Ptr,\r
165     AcpiTableLength,\r
166     PARSER_PARAMS (SpcrParser)\r
167     );\r
168 }\r