mbox series

[v2,0/6] introduce EFI_RAM_DISK_PROTOCOL

Message ID 20230714054406.761508-1-masahisa.kojima@linaro.org
Headers show
Series introduce EFI_RAM_DISK_PROTOCOL | expand

Message

Masahisa Kojima July 14, 2023, 5:44 a.m. UTC
This series introduces the EFI_RAM_DISK_PROTOCOL implementation.
The major purpose of this series is a preparation for EFI HTTP(S) boot.

Now U-Boot can download the distro installer ISO image
via wget or tftpboot commands, but U-Boot can not mount
the downloaded ISO image.
By calling EFI_RAM_DISK_PROTOCOL->register API, user can
mount the ISO image and boot the distro installer.

Note that the installation process may not proceed
after the distro installer calls ExitBootServices()
since there is no hand-off process for the block device of
memory mapped ISO image.

The EFI_RAM_DISK_PROTOCOL was tested with the
debian network installer[1] on qemu_arm64 platform.
The example procedure is as follows.
 => tftpboot 41000000 mini.iso
 => efidebug disk mount 41000000 $filesize
        or
 => ramdisk mount 41000000 $filesize

ramdisk command works without CONFIG_EFI_LOADER enabled.

After these commands, ISO image is mounted like:

 => efidebug dh

    000000007eec63f0 (ramdisk_blk#0)
      /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/RamDisk(0x41000000,4974afff,3d5abd30-4175-87ce-6d64-d2ade523c4bb,0x0)
      Block IO

    000000007eec6560 (ramdisk_blk#0:1)
      /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/RamDisk(0x41000000,4974afff,3d5abd30-4175-87ce-6d64-d2ade523c4bb,0x0)/HD(1,0x01,0,0x0,0x33800)
      Block IO

    000000007eec66d0 (ramdisk_blk#0:2)
      /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/RamDisk(0x41000000,4974afff,3d5abd30-4175-87ce-6d64-d2ade523c4bb,0x0)/HD(2,0x01,0,0x33800,0x10000)
      Block IO
      System Partition
      Simple File System

 => dm tree -s

    ramdisk       0  [ + ]   ramdisk               |-- ramdisk0
    blk           0  [ + ]   ramdisk_blk           |   `-- ramdisk_blk#0
    partition     0  [ + ]   blk_partition         |       |-- ramdisk_blk#0:1
    partition     1  [ + ]   blk_partition         |       `-- ramdisk_blk#0:2

Debian can be successfully installed with this ramdisk on QEMU.

The created ramdisk can be accessed by the existing commands such as 'fatls':
 => fatls ramdisk 0:2

[TODO]
- add ramdisk command documentation
- add ramdisk command dm test

[1] https://deb.debian.org/debian/dists/bookworm/main/installer-arm64/current/images/netboot/mini.iso

[Changelog]
v1 -> v2
- implement ramdisk uclass and driver,
  then EFI_RAM_DISK_PROTOCOL is implemented based on the ramdisk uclass

Masahisa Kojima (6):
  efi_loader: add RAM disk device path
  ramdisk: add ramdisk uclass and driver
  cmd: ramdisk: add ramdisk control command
  efi_loader: add EFI_RAM_DISK_PROTOCOL implementation
  cmd: efidebug: add RAM disk mount command
  efi_selftest: add EFI_RAM_DISK_PROTOCOL selftest

 cmd/Kconfig                              |   7 +
 cmd/Makefile                             |   1 +
 cmd/efidebug.c                           | 118 ++++++
 cmd/ramdisk.c                            |  92 ++++
 disk/part.c                              |   3 +
 drivers/block/Kconfig                    |   7 +-
 drivers/block/Makefile                   |   2 +
 drivers/block/blk-uclass.c               |   1 +
 drivers/block/blk_ramdisk.c              | 187 +++++++++
 drivers/block/ramdisk-uclass.c           |  14 +
 include/dm/uclass-id.h                   |   1 +
 include/efi_api.h                        |  32 ++
 include/efi_loader.h                     |   4 +
 include/ramdisk.h                        |  32 ++
 lib/efi_loader/Kconfig                   |   7 +
 lib/efi_loader/Makefile                  |   1 +
 lib/efi_loader/efi_device_path.c         |  25 ++
 lib/efi_loader/efi_device_path_to_text.c |  14 +
 lib/efi_loader/efi_ram_disk.c            | 142 +++++++
 lib/efi_loader/efi_setup.c               |   6 +
 lib/efi_selftest/Makefile                |   1 +
 lib/efi_selftest/efi_selftest_ram_disk.c | 511 +++++++++++++++++++++++
 lib/uuid.c                               |   4 +
 23 files changed, 1211 insertions(+), 1 deletion(-)
 create mode 100644 cmd/ramdisk.c
 create mode 100644 drivers/block/blk_ramdisk.c
 create mode 100644 drivers/block/ramdisk-uclass.c
 create mode 100644 include/ramdisk.h
 create mode 100644 lib/efi_loader/efi_ram_disk.c
 create mode 100644 lib/efi_selftest/efi_selftest_ram_disk.c


base-commit: e2e2aea5733f0d23cd9593bbefe5c803c552dcb9

Comments

Tobias Waldekranz July 14, 2023, 10:01 p.m. UTC | #1
Hi Masahisa,

On fre, jul 14, 2023 at 14:44, Masahisa Kojima <masahisa.kojima@linaro.org> wrote:
> This series introduces the EFI_RAM_DISK_PROTOCOL implementation.
> The major purpose of this series is a preparation for EFI HTTP(S) boot.
>
> Now U-Boot can download the distro installer ISO image
> via wget or tftpboot commands, but U-Boot can not mount
> the downloaded ISO image.

A while back, I added the blkmap command and backend to U-Boot, which
is, among other things, capable of creating ramdisks. What exactly does
this series add that can't be supported by a block map? There is some
documentation available here:

https://u-boot.readthedocs.io/en/latest/usage/blkmap.html
Masahisa Kojima July 18, 2023, 2:49 a.m. UTC | #2
Hi Tobias,

On Sat, 15 Jul 2023 at 07:01, Tobias Waldekranz <tobias@waldekranz.com> wrote:
>
>
> Hi Masahisa,
>
> On fre, jul 14, 2023 at 14:44, Masahisa Kojima <masahisa.kojima@linaro.org> wrote:
> > This series introduces the EFI_RAM_DISK_PROTOCOL implementation.
> > The major purpose of this series is a preparation for EFI HTTP(S) boot.
> >
> > Now U-Boot can download the distro installer ISO image
> > via wget or tftpboot commands, but U-Boot can not mount
> > the downloaded ISO image.
>
> A while back, I added the blkmap command and backend to U-Boot, which
> is, among other things, capable of creating ramdisks. What exactly does
> this series add that can't be supported by a block map? There is some
> documentation available here:
>
> https://u-boot.readthedocs.io/en/latest/usage/blkmap.html

Thank you for your comment.
I am not aware of the blkmap feature.
Yes, I can use blkmap for creating ramdisk.

Thanks,
Masahisa Kojima