IN CONST CHAR8 *Language\r
);\r
\r
+STATIC VOID DisplayFdtDevicePaths (\r
+ VOID\r
+ );\r
+\r
STATIC SHELL_STATUS UpdateFdtTextDevicePath (\r
IN EFI_SHELL_PROTOCOL *Shell,\r
IN CONST CHAR16 *FilePath\r
switch (ShellCommandLineGetCount (ParamPackage)) {\r
case 1:\r
//\r
- // Case "setfdt -i"\r
+ // Case "setfdt" or "setfdt -i"\r
//\r
if (!ShellCommandLineGetFlag (ParamPackage, L"-i")) {\r
- Status = EFI_INVALID_PARAMETER;\r
+ DisplayFdtDevicePaths ();\r
}\r
break;\r
\r
Status\r
);\r
}\r
+ DisplayFdtDevicePaths ();\r
}\r
}\r
\r
);\r
}\r
\r
+/**\r
+ Display FDT device paths.\r
+\r
+ Display in text form the device paths used to install the FDT from the\r
+ highest to the lowest priority.\r
+\r
+**/\r
+STATIC\r
+VOID\r
+DisplayFdtDevicePaths (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ UINTN DataSize;\r
+ CHAR16 *TextDevicePath;\r
+ CHAR16 *TextDevicePaths;\r
+ CHAR16 *TextDevicePathSeparator;\r
+\r
+ ShellPrintHiiEx (\r
+ -1, -1, NULL,\r
+ STRING_TOKEN (STR_SETFDT_DEVICE_PATH_LIST),\r
+ mFdtPlatformDxeHiiHandle\r
+ );\r
+\r
+ if (FeaturePcdGet (PcdOverridePlatformFdt)) {\r
+ DataSize = 0;\r
+ Status = gRT->GetVariable (\r
+ L"Fdt",\r
+ &gFdtVariableGuid,\r
+ NULL,\r
+ &DataSize,\r
+ NULL\r
+ );\r
+\r
+ //\r
+ // Keep going only if the "Fdt" variable is defined.\r
+ //\r
+\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ TextDevicePath = AllocatePool (DataSize);\r
+ if (TextDevicePath == NULL) {\r
+ return;\r
+ }\r
+\r
+ Status = gRT->GetVariable (\r
+ L"Fdt",\r
+ &gFdtVariableGuid,\r
+ NULL,\r
+ &DataSize,\r
+ TextDevicePath\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ ShellPrintHiiEx (\r
+ -1, -1, NULL,\r
+ STRING_TOKEN (STR_SETFDT_DEVICE_PATH),\r
+ mFdtPlatformDxeHiiHandle,\r
+ TextDevicePath\r
+ );\r
+ }\r
+\r
+ FreePool (TextDevicePath);\r
+ }\r
+ }\r
+\r
+ //\r
+ // Loop over the device path list provided by "PcdFdtDevicePaths". The device\r
+ // paths are in text form and separated by a semi-colon.\r
+ //\r
+\r
+ TextDevicePaths = AllocateCopyPool (\r
+ StrSize ((CHAR16*)PcdGetPtr (PcdFdtDevicePaths)),\r
+ (CHAR16*)PcdGetPtr (PcdFdtDevicePaths)\r
+ );\r
+ if (TextDevicePaths == NULL) {\r
+ return;\r
+ }\r
+\r
+ for (TextDevicePath = TextDevicePaths;\r
+ *TextDevicePath != L'\0' ; ) {\r
+ TextDevicePathSeparator = StrStr (TextDevicePath, L";");\r
+\r
+ if (TextDevicePathSeparator != NULL) {\r
+ *TextDevicePathSeparator = L'\0';\r
+ }\r
+\r
+ ShellPrintHiiEx (\r
+ -1, -1, NULL,\r
+ STRING_TOKEN (STR_SETFDT_DEVICE_PATH),\r
+ mFdtPlatformDxeHiiHandle,\r
+ TextDevicePath\r
+ );\r
+\r
+ if (TextDevicePathSeparator == NULL) {\r
+ break;\r
+ }\r
+ TextDevicePath = TextDevicePathSeparator + 1;\r
+ }\r
+\r
+ FreePool (TextDevicePaths);\r
+\r
+}\r
+\r
/**\r
Update the text device path stored in the "Fdt" UEFI variable given\r
an EFI Shell file path or a text device path.\r