From: "Leif Lindholm" <leif@nuviainc.com>
To: Jeff Brasen <jbrasen@nvidia.com>
Cc: devel@edk2.groups.io, ardb+tianocore@kernel.org,
abner.chang@hpe.com, daniel.schaefer@hpe.com
Subject: Re: [PATCH v2 2/2] EmbeddedPkg: Add LoadFile2 for linux initrd
Date: Tue, 7 Sep 2021 18:51:20 +0100 [thread overview]
Message-ID: <20210907175120.5osd27md7isohizz@leviathan> (raw)
In-Reply-To: <ce13405ac952e2a8b85cb5e7506ed26b62048be3.1630527693.git.jbrasen@nvidia.com>
Minor style comments below.
On Wed, Sep 01, 2021 at 20:28:27 +0000, Jeff Brasen wrote:
> 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>
Move that inserted line up one to maintain alphabetical sorting.
> #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>
Glad to see we're *really* including libfdt.h (also included above and
completely unrelated to this patch).
> @@ -25,7 +29,14 @@ typedef struct {
> EFI_DEVICE_PATH_PROTOCOL End;
> } MEMORY_DEVICE_PATH;
>
> +typedef struct {
> + VENDOR_DEVICE_PATH VenMediaNode;
VendorMediaNode
> + 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;
> + }
It looks to me like this changes the functionality so that if
PcdAndroidBootLoadFile2 is set, we now don't locate/update an FDT,
which was not clear to me from the cover letter and commit message.
This may well be intentional and correct, but since this function was
already a bit messy, I'd kind of prefer shunting some of this off into
helper functions now we're adding to the complexity.
/
Leif
> }
>
> 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-07 17:51 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 ` [PATCH v2 2/2] EmbeddedPkg: Add LoadFile2 for linux initrd Jeff Brasen
2021-09-07 17:51 ` Leif Lindholm [this message]
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=20210907175120.5osd27md7isohizz@leviathan \
--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