EmbeddedPkg/FdtPlatformDxe: 'setfdt' command, display the successful device path

Display in the EFI Shell the device path from which
the FDT was retrieved when the installation process
triggered by the "-i" option is successful.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ronald Cron <Ronald.Cron@arm.com>
Reviewed-by: Olivier Martin <olivier.martin@arm.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17301 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatform.c b/EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatform.c
index eb4f554..35a5fba 100644
--- a/EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatform.c
+++ b/EmbeddedPkg/Drivers/FdtPlatformDxe/FdtPlatform.c
@@ -270,6 +270,14 @@
   been asked to be retrieved for. For each device path, try to install

   the FDT. Stop as soon as an installation succeeds.

 

+  @param[in]  SuccessfullDevicePath  If not NULL, address where to store the

+                                     pointer to the text device path from

+                                     which the FDT was successfully retrieved.

+                                     Not used if the FDT installation failed.

+                                     The returned address is the address of

+                                     an allocated buffer that has to be

+                                     freed by the caller.

+

   @retval  EFI_SUCCESS            The FDT was installed.

   @retval  EFI_NOT_FOUND          Failed to locate a protocol or a file.

   @retval  EFI_INVALID_PARAMETER  Invalid device path.

@@ -280,31 +288,30 @@
 STATIC

 EFI_STATUS

 RunFdtInstallation (

-  VOID

+  OUT CHAR16  **SuccessfullDevicePath

   )

 {

   EFI_STATUS  Status;

   UINTN       DataSize;

-  VOID        *Data;

+  CHAR16      *TextDevicePath;

   CHAR16      *TextDevicePathStart;

   CHAR16      *TextDevicePathSeparator;

   UINTN       TextDevicePathLen;

-  CHAR16      *TextDevicePath;

 

+  TextDevicePath = NULL;

   //

   // For development purpose, if enabled through the "PcdOverridePlatformFdt"

   // feature PCD, try first to install the FDT specified by the device path in

   // text form stored in the "Fdt" UEFI variable.

   //

   if (FeaturePcdGet (PcdOverridePlatformFdt)) {

-    Data     = NULL;

     DataSize = 0;

     Status = gRT->GetVariable (

                     L"Fdt",

                     &gFdtVariableGuid,

                     NULL,

                     &DataSize,

-                    Data

+                    NULL

                     );

 

     //

@@ -312,39 +319,39 @@
     //

 

     if (Status == EFI_BUFFER_TOO_SMALL) {

-      Data = AllocatePool (DataSize);

-      if (Data == NULL) {

+      TextDevicePath = AllocatePool (DataSize);

+      if (TextDevicePath == NULL) {

         Status = EFI_OUT_OF_RESOURCES;

-      } else {

-        Status = gRT->GetVariable (

-                        L"Fdt",

-                        &gFdtVariableGuid,

-                        NULL,

-                        &DataSize,

-                        Data

-                        );

-        if (!EFI_ERROR (Status)) {

-          Status = InstallFdt ((CHAR16*)Data);

-          if (!EFI_ERROR (Status)) {

-            DEBUG ((

-              EFI_D_WARN,

-              "Installation of the FDT using the device path <%s> completed.\n",

-              (CHAR16*)Data

-              ));

-          }

-        }

-        FreePool (Data);

+        goto Error;

       }

 

+      Status = gRT->GetVariable (

+                      L"Fdt",

+                      &gFdtVariableGuid,

+                      NULL,

+                      &DataSize,

+                      TextDevicePath

+                      );

       if (EFI_ERROR (Status)) {

-        DEBUG ((

-          EFI_D_ERROR,

-          "Installation of the FDT specified by the \"Fdt\" UEFI variable failed - %r\n",

-          Status

-          ));

-      } else {

-        return Status;

+        FreePool (TextDevicePath);

+        goto Error;

       }

+

+      Status = InstallFdt (TextDevicePath);

+      if (!EFI_ERROR (Status)) {

+        DEBUG ((

+          EFI_D_WARN,

+          "Installation of the FDT using the device path <%s> completed.\n",

+          TextDevicePath

+          ));

+        goto Done;

+      }

+      DEBUG ((

+        EFI_D_ERROR,

+        "Installation of the FDT specified by the \"Fdt\" UEFI variable failed - %r\n",

+        Status

+        ));

+      FreePool (TextDevicePath);

     }

   }

 

@@ -353,7 +360,7 @@
   // paths are in text form and separated by a semi-colon.

   //

 

-  Status = EFI_SUCCESS;

+  Status = EFI_NOT_FOUND;

   for (TextDevicePathStart = (CHAR16*)PcdGetPtr (PcdFdtDevicePaths);

        *TextDevicePathStart != L'\0'                               ; ) {

     TextDevicePathSeparator = StrStr (TextDevicePathStart, L";");

@@ -362,48 +369,55 @@
     // Last device path of the list

     //

     if (TextDevicePathSeparator == NULL) {

-      TextDevicePath = TextDevicePathStart;

+      TextDevicePathLen = StrLen (TextDevicePathStart);

     } else {

       TextDevicePathLen = (UINTN)(TextDevicePathSeparator - TextDevicePathStart);

-      TextDevicePath = AllocateCopyPool (

-                         (TextDevicePathLen + 1) * sizeof (CHAR16),

-                         TextDevicePathStart

-                         );

-      if (TextDevicePath == NULL) {

-        Status = EFI_OUT_OF_RESOURCES;

-        DEBUG ((EFI_D_ERROR, "Memory allocation error during FDT installation process.\n"));

-        break;

-      }

-      TextDevicePath[TextDevicePathLen] = L'\0';

     }

 

+    TextDevicePath = AllocateCopyPool (

+                       (TextDevicePathLen + 1) * sizeof (CHAR16),

+                       TextDevicePathStart

+                       );

+    if (TextDevicePath == NULL) {

+      Status = EFI_OUT_OF_RESOURCES;

+      goto Error;

+    }

+    TextDevicePath[TextDevicePathLen] = L'\0';

+

     Status = InstallFdt (TextDevicePath);

-    if (EFI_ERROR (Status)) {

-      DEBUG ((EFI_D_WARN, "Installation of the FDT using the device path <%s> failed - %r.\n",

-        TextDevicePath, Status

-        ));

-    } else {

+    if (!EFI_ERROR (Status)) {

       DEBUG ((EFI_D_WARN, "Installation of the FDT using the device path <%s> completed.\n",

         TextDevicePath

         ));

+      goto Done;

     }

 

+    DEBUG ((EFI_D_WARN, "Installation of the FDT using the device path <%s> failed - %r.\n",

+      TextDevicePath, Status

+      ));

+    FreePool (TextDevicePath);

+

     if (TextDevicePathSeparator == NULL) {

-      break;

-    } else {

-      FreePool (TextDevicePath);

-      if (!EFI_ERROR (Status)) {

-        break;

-      }

-      TextDevicePathStart = TextDevicePathSeparator + 1;

+      goto Error;

     }

+    TextDevicePathStart = TextDevicePathSeparator + 1;

   }

 

+Error:

+Done:

+

   if (EFI_ERROR (Status)) {

     DEBUG ((EFI_D_ERROR, "Failed to install the FDT - %r.\n", Status));

+    return Status;

   }

 

-  return Status;

+  if (SuccessfullDevicePath != NULL) {

+    *SuccessfullDevicePath = TextDevicePath;

+  } else {

+    FreePool (TextDevicePath);

+  }

+

+  return EFI_SUCCESS;

 }

 

 /**

@@ -445,6 +459,7 @@
   LIST_ENTRY    *ParamPackage;

   BOOLEAN       FilePath;

   CONST CHAR16  *ValueStr;

+  CHAR16        *TextDevicePath;

 

   ShellStatus  = SHELL_SUCCESS;

   ParamPackage = NULL;

@@ -538,14 +553,16 @@
       STRING_TOKEN (STR_SETFDT_INSTALLING),

       mFdtPlatformDxeHiiHandle

       );

-    Status = RunFdtInstallation ();

+    Status = RunFdtInstallation (&TextDevicePath);

     ShellStatus = EfiCodeToShellCode (Status);

     if (!EFI_ERROR (Status)) {

       ShellPrintHiiEx (

         -1, -1, NULL,

         STRING_TOKEN (STR_SETFDT_INSTALL_SUCCEEDED),

-        mFdtPlatformDxeHiiHandle

+        mFdtPlatformDxeHiiHandle,

+        TextDevicePath

         );

+      FreePool (TextDevicePath);

     } else {

       if (Status == EFI_INVALID_PARAMETER) {

         ShellPrintHiiEx (

@@ -823,8 +840,7 @@
       ShellPrintHiiEx (

         -1, -1, NULL,

         STRING_TOKEN (STR_SETFDT_UPDATE_DELETED),

-        mFdtPlatformDxeHiiHandle,

-        FdtVariableValue

+        mFdtPlatformDxeHiiHandle

         );

     }

   } else {