]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDebug1CommandsLib/SerMode.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / SerMode.c
CommitLineData
5d73d92f 1/** @file\r
2 Main file for SerMode shell Debug1 function.\r
3\r
c011b6c9 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 5 Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
5d73d92f 7\r
8**/\r
9\r
10#include "UefiShellDebug1CommandsLib.h"\r
11#include <Library/ShellLib.h>\r
12#include <Protocol/SerialIo.h>\r
13\r
3737ac2b 14/**\r
15 Display information about a serial device by it's handle.\r
16\r
17 If HandleValid is FALSE, do all devices.\r
18\r
19 @param[in] HandleIdx The handle index for the device.\r
20 @param[in] HandleValid TRUE if HandleIdx is valid.\r
21\r
22 @retval SHELL_INVALID_PARAMETER A parameter was invalid.\r
23 @retval SHELL_SUCCESS The operation was successful.\r
24**/\r
5d73d92f 25SHELL_STATUS\r
3737ac2b 26DisplaySettings (\r
47d20b54
MK
27 IN UINTN HandleIdx,\r
28 IN BOOLEAN HandleValid\r
5d73d92f 29 )\r
30{\r
31 EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
32 UINTN NoHandles;\r
33 EFI_HANDLE *Handles;\r
34 EFI_STATUS Status;\r
35 UINTN Index;\r
36 CHAR16 *StopBits;\r
37 CHAR16 Parity;\r
38 SHELL_STATUS ShellStatus;\r
39\r
47d20b54
MK
40 Handles = NULL;\r
41 StopBits = NULL;\r
5d73d92f 42\r
43 ShellStatus = SHELL_SUCCESS;\r
44\r
47d20b54 45 Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
5d73d92f 46 if (EFI_ERROR (Status)) {\r
47d20b54 47 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 48 return SHELL_INVALID_PARAMETER;\r
49 }\r
50\r
51 for (Index = 0; Index < NoHandles; Index++) {\r
52 if (HandleValid) {\r
47d20b54 53 if (ConvertHandleIndexToHandle (HandleIdx) != Handles[Index]) {\r
5d73d92f 54 continue;\r
55 }\r
56 }\r
57\r
47d20b54 58 Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID **)&SerialIo);\r
5d73d92f 59 if (!EFI_ERROR (Status)) {\r
60 switch (SerialIo->Mode->Parity) {\r
47d20b54 61 case DefaultParity:\r
5d73d92f 62\r
47d20b54
MK
63 Parity = 'D';\r
64 break;\r
5d73d92f 65\r
47d20b54 66 case NoParity:\r
5d73d92f 67\r
47d20b54
MK
68 Parity = 'N';\r
69 break;\r
5d73d92f 70\r
47d20b54 71 case EvenParity:\r
5d73d92f 72\r
47d20b54
MK
73 Parity = 'E';\r
74 break;\r
5d73d92f 75\r
47d20b54 76 case OddParity:\r
5d73d92f 77\r
47d20b54
MK
78 Parity = 'O';\r
79 break;\r
5d73d92f 80\r
47d20b54 81 case MarkParity:\r
5d73d92f 82\r
47d20b54
MK
83 Parity = 'M';\r
84 break;\r
5d73d92f 85\r
47d20b54 86 case SpaceParity:\r
5d73d92f 87\r
47d20b54
MK
88 Parity = 'S';\r
89 break;\r
5d73d92f 90\r
47d20b54 91 default:\r
5d73d92f 92\r
47d20b54 93 Parity = 'U';\r
5d73d92f 94 }\r
95\r
96 switch (SerialIo->Mode->StopBits) {\r
47d20b54 97 case DefaultStopBits:\r
5d73d92f 98\r
47d20b54
MK
99 StopBits = L"Default";\r
100 break;\r
5d73d92f 101\r
47d20b54 102 case OneStopBit:\r
5d73d92f 103\r
47d20b54
MK
104 StopBits = L"1";\r
105 break;\r
5d73d92f 106\r
47d20b54 107 case TwoStopBits:\r
5d73d92f 108\r
47d20b54
MK
109 StopBits = L"2";\r
110 break;\r
5d73d92f 111\r
47d20b54 112 case OneFiveStopBits:\r
5d73d92f 113\r
47d20b54
MK
114 StopBits = L"1.5";\r
115 break;\r
5d73d92f 116\r
47d20b54 117 default:\r
5d73d92f 118\r
47d20b54 119 StopBits = L"Unknown";\r
5d73d92f 120 }\r
47d20b54
MK
121\r
122 ShellPrintHiiEx (\r
5d73d92f 123 -1,\r
124 -1,\r
125 NULL,\r
126 STRING_TOKEN (STR_SERMODE_DISPLAY),\r
127 gShellDebug1HiiHandle,\r
128 ConvertHandleToHandleIndex (Handles[Index]),\r
129 Handles[Index],\r
130 SerialIo->Mode->BaudRate,\r
131 Parity,\r
132 SerialIo->Mode->DataBits,\r
133 StopBits\r
47d20b54 134 );\r
5d73d92f 135 } else {\r
47d20b54 136 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 137 ShellStatus = SHELL_NOT_FOUND;\r
138 break;\r
139 }\r
140\r
141 if (HandleValid) {\r
142 break;\r
143 }\r
144 }\r
145\r
146 if (Index == NoHandles) {\r
47d20b54
MK
147 if (((NoHandles != 0) && HandleValid) || (0 == NoHandles)) {\r
148 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 149 ShellStatus = SHELL_NOT_FOUND;\r
150 }\r
151 }\r
152\r
153 return ShellStatus;\r
154}\r
155\r
3737ac2b 156/**\r
157 Function for 'sermode' command.\r
158\r
159 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
160 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
161**/\r
5d73d92f 162SHELL_STATUS\r
163EFIAPI\r
164ShellCommandRunSerMode (\r
165 IN EFI_HANDLE ImageHandle,\r
166 IN EFI_SYSTEM_TABLE *SystemTable\r
167 )\r
168{\r
169 EFI_STATUS Status;\r
170 SHELL_STATUS ShellStatus;\r
171 UINTN Index;\r
172 UINTN NoHandles;\r
173 EFI_HANDLE *Handles;\r
174 EFI_PARITY_TYPE Parity;\r
175 EFI_STOP_BITS_TYPE StopBits;\r
176 UINTN HandleIdx;\r
177 UINTN BaudRate;\r
178 UINTN DataBits;\r
179 UINTN Value;\r
180 EFI_SERIAL_IO_PROTOCOL *SerialIo;\r
181 LIST_ENTRY *Package;\r
182 CHAR16 *ProblemParam;\r
183 CONST CHAR16 *Temp;\r
3737ac2b 184 UINT64 Intermediate;\r
5d73d92f 185\r
186 ShellStatus = SHELL_SUCCESS;\r
187 HandleIdx = 0;\r
188 Parity = DefaultParity;\r
189 Handles = NULL;\r
190 NoHandles = 0;\r
191 Index = 0;\r
192 Package = NULL;\r
193\r
194 Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
195 if (EFI_ERROR (Status)) {\r
196 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
197 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"sermode", ProblemParam);\r
198 FreePool (ProblemParam);\r
5d73d92f 199 ShellStatus = SHELL_INVALID_PARAMETER;\r
200 } else {\r
47d20b54 201 ASSERT (FALSE);\r
5d73d92f 202 }\r
203 } else {\r
47d20b54
MK
204 if ((ShellCommandLineGetCount (Package) < 6) && (ShellCommandLineGetCount (Package) > 2)) {\r
205 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 206 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
207 } else if (ShellCommandLineGetCount (Package) > 6) {\r
208 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 209 ShellStatus = SHELL_INVALID_PARAMETER;\r
210 } else {\r
47d20b54 211 Temp = ShellCommandLineGetRawValue (Package, 1);\r
5d73d92f 212 if (Temp != NULL) {\r
47d20b54 213 Status = ShellConvertStringToUint64 (Temp, &Intermediate, TRUE, FALSE);\r
3737ac2b 214 HandleIdx = (UINTN)Intermediate;\r
47d20b54 215 Temp = ShellCommandLineGetRawValue (Package, 2);\r
5d73d92f 216 if (Temp == NULL) {\r
3737ac2b 217 ShellStatus = DisplaySettings (HandleIdx, TRUE);\r
5d73d92f 218 goto Done;\r
219 }\r
220 } else {\r
3737ac2b 221 ShellStatus = DisplaySettings (0, FALSE);\r
5d73d92f 222 goto Done;\r
223 }\r
47d20b54
MK
224\r
225 Temp = ShellCommandLineGetRawValue (Package, 2);\r
5d73d92f 226 if (Temp != NULL) {\r
47d20b54 227 BaudRate = ShellStrToUintn (Temp);\r
5d73d92f 228 } else {\r
47d20b54 229 ASSERT (FALSE);\r
5d73d92f 230 BaudRate = 0;\r
231 }\r
47d20b54
MK
232\r
233 Temp = ShellCommandLineGetRawValue (Package, 3);\r
234 if ((Temp == NULL) || (StrLen (Temp) > 1)) {\r
235 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
5d73d92f 236 ShellStatus = SHELL_INVALID_PARAMETER;\r
237 } else {\r
47d20b54
MK
238 switch (Temp[0]) {\r
239 case 'd':\r
240 case 'D':\r
241 Parity = DefaultParity;\r
242 break;\r
243 case 'n':\r
244 case 'N':\r
245 Parity = NoParity;\r
246 break;\r
247 case 'e':\r
248 case 'E':\r
249 Parity = EvenParity;\r
250 break;\r
251 case 'o':\r
252 case 'O':\r
253 Parity = OddParity;\r
254 break;\r
255 case 'm':\r
256 case 'M':\r
257 Parity = MarkParity;\r
258 break;\r
259 case 's':\r
260 case 'S':\r
261 Parity = SpaceParity;\r
262 break;\r
263 default:\r
264 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
265 ShellStatus = SHELL_INVALID_PARAMETER;\r
266 goto Done;\r
5d73d92f 267 }\r
268 }\r
47d20b54
MK
269\r
270 Temp = ShellCommandLineGetRawValue (Package, 4);\r
5d73d92f 271 if (Temp != NULL) {\r
47d20b54 272 DataBits = ShellStrToUintn (Temp);\r
5d73d92f 273 } else {\r
274 //\r
275 // make sure this is some number not in the list below.\r
276 //\r
277 DataBits = 0;\r
278 }\r
47d20b54 279\r
5d73d92f 280 switch (DataBits) {\r
47d20b54
MK
281 case 4:\r
282 case 7:\r
283 case 8:\r
284 break;\r
285 default:\r
286 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
287 ShellStatus = SHELL_INVALID_PARAMETER;\r
288 goto Done;\r
5d73d92f 289 }\r
47d20b54
MK
290\r
291 Temp = ShellCommandLineGetRawValue (Package, 5);\r
292 Value = ShellStrToUintn (Temp);\r
5d73d92f 293 switch (Value) {\r
47d20b54
MK
294 case 0:\r
295 StopBits = DefaultStopBits;\r
296 break;\r
5d73d92f 297\r
47d20b54
MK
298 case 1:\r
299 StopBits = OneStopBit;\r
300 break;\r
5d73d92f 301\r
47d20b54
MK
302 case 2:\r
303 StopBits = TwoStopBits;\r
304 break;\r
5d73d92f 305\r
47d20b54
MK
306 case 15:\r
307 StopBits = OneFiveStopBits;\r
308 break;\r
5d73d92f 309\r
47d20b54
MK
310 default:\r
311 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp);\r
312 ShellStatus = SHELL_INVALID_PARAMETER;\r
313 goto Done;\r
5d73d92f 314 }\r
47d20b54
MK
315\r
316 Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles);\r
5d73d92f 317 if (EFI_ERROR (Status)) {\r
47d20b54 318 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode");\r
5d73d92f 319 ShellStatus = SHELL_INVALID_PARAMETER;\r
320 goto Done;\r
321 }\r
322\r
323 for (Index = 0; Index < NoHandles; Index++) {\r
324 if (ConvertHandleIndexToHandle (HandleIdx) != Handles[Index]) {\r
325 continue;\r
326 }\r
327\r
47d20b54 328 Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID **)&SerialIo);\r
5d73d92f 329 if (!EFI_ERROR (Status)) {\r
330 Status = SerialIo->SetAttributes (\r
47d20b54
MK
331 SerialIo,\r
332 (UINT64)BaudRate,\r
333 SerialIo->Mode->ReceiveFifoDepth,\r
334 SerialIo->Mode->Timeout,\r
335 Parity,\r
336 (UINT8)DataBits,\r
337 StopBits\r
338 );\r
5d73d92f 339 if (EFI_ERROR (Status)) {\r
68227ac3 340 if (Status == EFI_INVALID_PARAMETER) {\r
47d20b54 341 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index]));\r
68227ac3
TS
342 ShellStatus = SHELL_UNSUPPORTED;\r
343 } else if (Status == EFI_DEVICE_ERROR) {\r
47d20b54 344 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index]));\r
68227ac3
TS
345 ShellStatus = SHELL_ACCESS_DENIED;\r
346 } else {\r
47d20b54 347 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex (Handles[Index]));\r
68227ac3
TS
348 ShellStatus = SHELL_ACCESS_DENIED;\r
349 }\r
5d73d92f 350 } else {\r
47d20b54 351 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex (Handles[Index]));\r
5d73d92f 352 }\r
47d20b54 353\r
5d73d92f 354 break;\r
355 }\r
356 }\r
357 }\r
358 }\r
359\r
47d20b54
MK
360 if ((ShellStatus == SHELL_SUCCESS) && (Index == NoHandles)) {\r
361 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, L"sermode", HandleIdx);\r
5d73d92f 362 ShellStatus = SHELL_INVALID_PARAMETER;\r
363 }\r
364\r
365Done:\r
366 if (Package != NULL) {\r
367 ShellCommandLineFreeVarList (Package);\r
368 }\r
47d20b54 369\r
5d73d92f 370 if (Handles != NULL) {\r
371 FreePool (Handles);\r
372 }\r
47d20b54 373\r
5d73d92f 374 return ShellStatus;\r
375}\r