From: "Jeff Brasen" <jbrasen@nvidia.com>
To: <devel@edk2.groups.io>
Cc: <leif@nuviainc.com>, <ardb+tianocore@kernel.org>,
<abner.chang@hpe.com>, <daniel.schaefer@hpe.com>,
Jeff Brasen <jbrasen@nvidia.com>
Subject: [PATCH v2 2/2] EmbeddedPkg: Add LoadFile2 for linux initrd
Date: Wed, 1 Sep 2021 20:28:27 +0000 [thread overview]
Message-ID: <ce13405ac952e2a8b85cb5e7506ed26b62048be3.1630527693.git.jbrasen@nvidia.com> (raw)
In-Reply-To: <cover.1630527693.git.jbrasen@nvidia.com>
Add support under a pcd feature for using the new interface to pass
initrd to the linux kernel.
Signed-off-by: Jeff Brasen <jbrasen@nvidia.com>
---
EmbeddedPkg/EmbeddedPkg.dec | 1 +
.../AndroidBootImgLib/AndroidBootImgLib.inf | 3 +
.../AndroidBootImgLib/AndroidBootImgLib.c | 147 +++++++++++++++++-
3 files changed, 144 insertions(+), 7 deletions(-)
diff --git a/EmbeddedPkg/EmbeddedPkg.dec b/EmbeddedPkg/EmbeddedPkg.dec
index c2068ce5a8ce..7638aaaadeb8 100644
--- a/EmbeddedPkg/EmbeddedPkg.dec
+++ b/EmbeddedPkg/EmbeddedPkg.dec
@@ -86,6 +86,7 @@ [Ppis]
[PcdsFeatureFlag.common]
gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob|FALSE|BOOLEAN|0x0000001b
gEmbeddedTokenSpaceGuid.PcdGdbSerial|FALSE|BOOLEAN|0x00000053
+ gEmbeddedTokenSpaceGuid.PcdAndroidBootLoadFile2|FALSE|BOOLEAN|0x0000005b
[PcdsFixedAtBuild.common]
gEmbeddedTokenSpaceGuid.PcdPrePiStackBase|0|UINT32|0x0000000b
diff --git a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf
index bfed4ba9dcd4..39d8abe72cd1 100644
--- a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf
+++ b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.inf
@@ -42,3 +42,6 @@ [Protocols]
[Guids]
gFdtTableGuid
+
+[FeaturePcd]
+ gEmbeddedTokenSpaceGuid.PcdAndroidBootLoadFile2
diff --git a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c
index 3c617649f735..635965690dc0 100644
--- a/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c
+++ b/EmbeddedPkg/Library/AndroidBootImgLib/AndroidBootImgLib.c
@@ -10,11 +10,15 @@
#include <libfdt.h>
#include <Library/AndroidBootImgLib.h>
#include <Library/PrintLib.h>
+#include <Library/DevicePathLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Protocol/AndroidBootImg.h>
#include <Protocol/LoadedImage.h>
+#include <Protocol/LoadFile2.h>
+
+#include <Guid/LinuxEfiInitrdMedia.h>
#include <libfdt.h>
@@ -25,7 +29,14 @@ typedef struct {
EFI_DEVICE_PATH_PROTOCOL End;
} MEMORY_DEVICE_PATH;
+typedef struct {
+ VENDOR_DEVICE_PATH VenMediaNode;
+ EFI_DEVICE_PATH_PROTOCOL EndNode;
+} RAMDISK_DEVICE_PATH;
+
STATIC ANDROID_BOOTIMG_PROTOCOL *mAndroidBootImg;
+STATIC VOID *mRamdiskData = NULL;
+STATIC UINTN mRamdiskSize = 0;
STATIC CONST MEMORY_DEVICE_PATH mMemoryDevicePathTemplate =
{
@@ -48,6 +59,99 @@ STATIC CONST MEMORY_DEVICE_PATH mMemoryDevicePathTemplate =
} // End
};
+STATIC CONST RAMDISK_DEVICE_PATH mRamdiskDevicePath =
+{
+ {
+ {
+ MEDIA_DEVICE_PATH,
+ MEDIA_VENDOR_DP,
+ { sizeof (VENDOR_DEVICE_PATH), 0 }
+ },
+ LINUX_EFI_INITRD_MEDIA_GUID
+ },
+ {
+ END_DEVICE_PATH_TYPE,
+ END_ENTIRE_DEVICE_PATH_SUBTYPE,
+ { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 }
+ }
+};
+
+/**
+ Causes the driver to load a specified file.
+
+ @param This Protocol instance pointer.
+ @param FilePath The device specific path of the file to load.
+ @param BootPolicy Should always be FALSE.
+ @param BufferSize On input the size of Buffer in bytes. On output with a return
+ code of EFI_SUCCESS, the amount of data transferred to
+ Buffer. On output with a return code of EFI_BUFFER_TOO_SMALL,
+ the size of Buffer required to retrieve the requested file.
+ @param Buffer The memory buffer to transfer the file to. IF Buffer is NULL,
+ then no the size of the requested file is returned in
+ BufferSize.
+
+ @retval EFI_SUCCESS The file was loaded.
+ @retval EFI_UNSUPPORTED BootPolicy is TRUE.
+ @retval EFI_INVALID_PARAMETER FilePath is not a valid device path, or
+ BufferSize is NULL.
+ @retval EFI_NO_MEDIA No medium was present to load the file.
+ @retval EFI_DEVICE_ERROR The file was not loaded due to a device error.
+ @retval EFI_NO_RESPONSE The remote system did not respond.
+ @retval EFI_NOT_FOUND The file was not found
+ @retval EFI_ABORTED The file load process was manually canceled.
+ @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to read the current
+ directory entry. BufferSize has been updated with
+ the size needed to complete the request.
+
+
+**/
+EFI_STATUS
+EFIAPI
+AndroidBootImgLoadFile2 (
+ IN EFI_LOAD_FILE2_PROTOCOL *This,
+ IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
+ IN BOOLEAN BootPolicy,
+ IN OUT UINTN *BufferSize,
+ IN VOID *Buffer OPTIONAL
+ )
+
+{
+ // Verify if the valid parameters
+ if (This == NULL ||
+ BufferSize == NULL ||
+ FilePath == NULL ||
+ !IsDevicePathValid (FilePath, 0)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (BootPolicy) {
+ return EFI_UNSUPPORTED;
+ }
+
+ // Check if the given buffer size is big enough
+ // EFI_BUFFER_TOO_SMALL to allow caller to allocate a bigger buffer
+ if (mRamdiskSize == 0) {
+ return EFI_NOT_FOUND;
+ }
+ if (Buffer == NULL || *BufferSize < mRamdiskSize) {
+ *BufferSize = mRamdiskSize;
+ return EFI_BUFFER_TOO_SMALL;
+ }
+
+ // Copy InitRd
+ CopyMem (Buffer, mRamdiskData, mRamdiskSize);
+ *BufferSize = mRamdiskSize;
+
+ return EFI_SUCCESS;
+}
+
+///
+/// Load File Protocol instance
+///
+STATIC EFI_LOAD_FILE2_PROTOCOL mAndroidBootImgLoadFile2 = {
+ AndroidBootImgLoadFile2
+};
+
EFI_STATUS
AndroidBootImgGetImgSize (
IN VOID *BootImg,
@@ -383,6 +487,7 @@ AndroidBootImgBoot (
VOID *RamdiskData;
UINTN RamdiskSize;
IN VOID *FdtBase;
+ EFI_HANDLE RamDiskLoadFileHandle;
NewKernelArg = NULL;
ImageHandle = NULL;
@@ -423,14 +528,29 @@ AndroidBootImgBoot (
goto Exit;
}
- Status = AndroidBootImgLocateFdt (Buffer, &FdtBase);
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
+ if (FeaturePcdGet (PcdAndroidBootLoadFile2)) {
+ RamDiskLoadFileHandle = NULL;
+ mRamdiskData = RamdiskData;
+ mRamdiskSize = RamdiskSize;
+ Status = gBS->InstallMultipleProtocolInterfaces (&RamDiskLoadFileHandle,
+ &gEfiLoadFile2ProtocolGuid,
+ &mAndroidBootImgLoadFile2,
+ &gEfiDevicePathProtocolGuid,
+ &mRamdiskDevicePath,
+ NULL);
+ if (EFI_ERROR (Status)) {
+ goto Exit;
+ }
+ } else {
+ Status = AndroidBootImgLocateFdt (Buffer, &FdtBase);
+ if (EFI_ERROR (Status)) {
+ goto Exit;
+ }
- Status = AndroidBootImgUpdateFdt (Buffer, FdtBase, RamdiskData, RamdiskSize);
- if (EFI_ERROR (Status)) {
- goto Exit;
+ Status = AndroidBootImgUpdateFdt (Buffer, FdtBase, RamdiskData, RamdiskSize);
+ if (EFI_ERROR (Status)) {
+ goto Exit;
+ }
}
KernelDevicePath = mMemoryDevicePathTemplate;
@@ -474,5 +594,18 @@ AndroidBootImgBoot (
NewKernelArg = NULL;
}
}
+ if (FeaturePcdGet (PcdAndroidBootLoadFile2)) {
+ mRamdiskData = NULL;
+ mRamdiskSize = 0;
+ if (RamDiskLoadFileHandle != NULL) {
+ gBS->UninstallMultipleProtocolInterfaces (RamDiskLoadFileHandle,
+ &gEfiLoadFile2ProtocolGuid,
+ &mAndroidBootImgLoadFile2,
+ &gEfiDevicePathProtocolGuid,
+ &mRamdiskDevicePath,
+ NULL);
+ RamDiskLoadFileHandle = NULL;
+ }
+ }
return Status;
}
--
2.17.1
next prev parent reply other threads:[~2021-09-01 20:28 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-01 20:28 [PATCH v2 0/2] AndroidBootImgLib improvements Jeff Brasen
2021-09-01 20:28 ` [PATCH v2 1/2] EmbeddedPkg: AndroidBootImgBoot error handling updates Jeff Brasen
2021-09-01 20:28 ` Jeff Brasen [this message]
2021-09-07 17:51 ` [PATCH v2 2/2] EmbeddedPkg: Add LoadFile2 for linux initrd Leif Lindholm
2021-09-09 21:01 ` Jeff Brasen
2021-09-07 15:44 ` [PATCH v2 0/2] AndroidBootImgLib improvements Jeff Brasen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ce13405ac952e2a8b85cb5e7506ed26b62048be3.1630527693.git.jbrasen@nvidia.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox