diff mbox series

[meta-rockchip,3/4] remove /boot partition from wic:bootimg-paritition

Message ID 20240212202342.37778-3-twoerner@gmail.com
State New
Headers show
Series [meta-rockchip,1/4] rockchip.wks: specify fstype | expand

Commit Message

Trevor Woerner Feb. 12, 2024, 8:23 p.m. UTC
In order to boot successfully, most Rockchip SoCs require a specific
partitioning scheme which was defined many years (and many SoCs) ago. That
partitioning scheme places the SPL and U-Boot at specific offsets at the
start of the boot block device:

	https://opensource.rock-chips.com/wiki_Partitions

The Rockchip partitioning scheme goes on to also define the locations and
sizes of a number of additional partitions, including the "boot" and "root"
partitions.

Since both the SPL and U-Boot have already been placed on the block device,
the "boot" partition only contains the extlinux config file and the
kernel+dtb/fitImage; it doesn't contain any bootloader artifacts (other
than the extlinux config).

The locations and sizes of the SPL and U-Boot partitions are hard
dependencies since the BOOTROM etched inside the Rockchip SoCs is
programmed to blindly load and run what it finds at these locations. The
locations, sizes, and contents of the "boot" and "root" partitions are
not so rigid since it is U-Boot which interacts with them. U-Boot is very
flexible with how it finds boot components, and in its support for various
devices, filesystems, sizes, etc.

Both oe-core's U-Boot metadata and wic's bootimg-partition script contain
logic to generate the extlinux pieces required for a bootloader to boot
a Linux system. If both are enabled, the wic pieces silently clobber the
U-Boot pieces. However, the mechanisms contained in the U-Boot metadata are
much more flexible, from a user's point of view, than the mechanisms in
bootimg-partition.

Also, if a user wishes to setup some sort of A/B redundant update
mechanism, they must have redundant root partitions (in order to update
their filesystem contents) but they also need to have redundant boot
partitions if they wish to update the kernel as part of their update
mechanism. Pairing redundant kernel partitions with redundant filesystem
partitions becomes unnecessarily complicated. Therefore it makes sense
to combine the kernel and the filesystem into the same partition so that
both the kernel and filesystem are updated, or rolled back, in lock-step
as one unit. Specific kernel versions and configurations often have
dependencies on user-space components and versions.

The boot partition is not going away. This patch simply transfers
responsibility for its creation to the more flexible U-Boot mechanism and
includes the kernel as part of the same partition as the root filesystem.
Not only does it add flexibility, it also makes update schemes more
straightforward. Although having a separate /boot partition is a
"requirement" of the Rockchip partitioning scheme, it is not an actual
hard requirement when using a flexible, open-source bootloader (such as
U-Boot) instead of using Rockchip's proprietary miniloader, preloader, and
trust.img.

Boot-tested on:
	nanopi-m4b, nanopi-r2s, nanopi-r4s, roc-rk3328-cc, rock-3a,
	rock-pi-4b, rock-5a, rock-5b, rock-pi-e, rock-pi-s, rock64

Signed-off-by: Trevor Woerner <twoerner@gmail.com>
---
 conf/machine/include/rockchip-defaults.inc |  2 ++
 conf/machine/include/rockchip-extlinux.inc | 10 ++++++++++
 conf/machine/include/rockchip-wic.inc      | 17 ++---------------
 wic/rockchip.wks                           |  5 ++---
 4 files changed, 16 insertions(+), 18 deletions(-)
 create mode 100644 conf/machine/include/rockchip-extlinux.inc

Comments

Quentin Schulz Feb. 15, 2024, 5:45 p.m. UTC | #1
Hi Trevor,

On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
> In order to boot successfully, most Rockchip SoCs require a specific
> partitioning scheme which was defined many years (and many SoCs) ago. That
> partitioning scheme places the SPL and U-Boot at specific offsets at the
> start of the boot block device:
> 
> 	https://opensource.rock-chips.com/wiki_Partitions
> 
> The Rockchip partitioning scheme goes on to also define the locations and
> sizes of a number of additional partitions, including the "boot" and "root"
> partitions.
> 
> Since both the SPL and U-Boot have already been placed on the block device,
> the "boot" partition only contains the extlinux config file and the
> kernel+dtb/fitImage; it doesn't contain any bootloader artifacts (other
> than the extlinux config).
> 
> The locations and sizes of the SPL and U-Boot partitions are hard
> dependencies since the BOOTROM etched inside the Rockchip SoCs is > programmed to blindly load and run what it finds at these locations. The

What matters is the location of TPL+SPL, U-Boot proper can be 
programmatically be put anywhere (not where TPL+SPL is of course :) ). 
The SPL actually stores in itself where to look for U-Boot proper in the 
storage media (and different storage media may have different locations, 
we have this for Puma RK3399 which has a differnet location for U-Boot 
proper on SPI-NOR and on eMMC/SD card). We do this on Puma RK3399 and 
Ringneck PX30 for example (but we're not using this wks file so this 
isn't really relevant). Also, IIRC, the BootROM tries a few locations 
for the TPL+SPL in the boot storage medium (e.g. every 32KB offsets for 
the first 2/3/4).

Also, "blindly" is a bit of a stretch, the BootROM checks for a magic 
header value and then another magic string (e.g. RK33 for RK3399 and 
PX30). RK3568 and RK3588 have a different header layout also (headerv1 
vs headerv2). There's also secure boot that is possible, doing a bunch 
of extra checks directly from the BootROM, etc. :)

> locations, sizes, and contents of the "boot" and "root" partitions are
> not so rigid since it is U-Boot which interacts with them. U-Boot is very
> flexible with how it finds boot components, and in its support for various
> devices, filesystems, sizes, etc.
> 
> Both oe-core's U-Boot metadata and wic's bootimg-partition script contain
> logic to generate the extlinux pieces required for a bootloader to boot
> a Linux system. If both are enabled, the wic pieces silently clobber the
> U-Boot pieces. However, the mechanisms contained in the U-Boot metadata are
> much more flexible, from a user's point of view, than the mechanisms in
> bootimg-partition.
> 
> Also, if a user wishes to setup some sort of A/B redundant update
> mechanism, they must have redundant root partitions (in order to update
> their filesystem contents) but they also need to have redundant boot
> partitions if they wish to update the kernel as part of their update
> mechanism. Pairing redundant kernel partitions with redundant filesystem
> partitions becomes unnecessarily complicated. Therefore it makes sense
> to combine the kernel and the filesystem into the same partition so that
> both the kernel and filesystem are updated, or rolled back, in lock-step
> as one unit. Specific kernel versions and configurations often have
> dependencies on user-space components and versions.
> 

And now users would have to update a potentially multi-gigabyte image 
only to update their kernel or dtb :)

> The boot partition is not going away. This patch simply transfers
> responsibility for its creation to the more flexible U-Boot mechanism and
> includes the kernel as part of the same partition as the root filesystem.

This means the boot partition is going away :) which is confirmed by the 
change in wic/rockchip.wks.

I think you meant to say the boot directory is not going away, or rather 
the content of the boot partition is not going away?

> Not only does it add flexibility, it also makes update schemes more
> straightforward. Although having a separate /boot partition is a
> "requirement" of the Rockchip partitioning scheme, it is not an actual
> hard requirement when using a flexible, open-source bootloader (such as
> U-Boot) instead of using Rockchip's proprietary miniloader, preloader, and
> trust.img.
> 

The upgrade path from current state to the new one is not 
straightforward though? The boot partition would disappear IF the 
partition table is reflashed (which is rarely done I guess?) Otherwise 
it would still exist, with the old and never-to-be-updated-again kernel 
binaries in the /boot partition (which does very much still exist unless 
you reflash the partition table AND flash on the / partition with the 
update mechanism). This also means that a rollback is impossible.

> Boot-tested on:
> 	nanopi-m4b, nanopi-r2s, nanopi-r4s, roc-rk3328-cc, rock-3a,
> 	rock-pi-4b, rock-5a, rock-5b, rock-pi-e, rock-pi-s, rock64
> 
> Signed-off-by: Trevor Woerner <twoerner@gmail.com>
> ---
>   conf/machine/include/rockchip-defaults.inc |  2 ++
>   conf/machine/include/rockchip-extlinux.inc | 10 ++++++++++
>   conf/machine/include/rockchip-wic.inc      | 17 ++---------------
>   wic/rockchip.wks                           |  5 ++---
>   4 files changed, 16 insertions(+), 18 deletions(-)
>   create mode 100644 conf/machine/include/rockchip-extlinux.inc
> 
> diff --git a/conf/machine/include/rockchip-defaults.inc b/conf/machine/include/rockchip-defaults.inc
> index 3ce2e246ab0b..2387eb909934 100644
> --- a/conf/machine/include/rockchip-defaults.inc
> +++ b/conf/machine/include/rockchip-defaults.inc
> @@ -19,3 +19,5 @@ XSERVER = " \
>   
>   # misc
>   SERIAL_CONSOLES ?= "1500000;ttyS2"
> +RK_CONSOLE_BAUD ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[0]}"
> +RK_CONSOLE_DEVICE ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[1].split()[0]}"
> diff --git a/conf/machine/include/rockchip-extlinux.inc b/conf/machine/include/rockchip-extlinux.inc
> new file mode 100644
> index 000000000000..c73fb7d17e02
> --- /dev/null
> +++ b/conf/machine/include/rockchip-extlinux.inc
> @@ -0,0 +1,10 @@
> +UBOOT_EXTLINUX ?= "1"
> +UBOOT_EXTLINUX_ROOT ?= "root=PARTLABEL=root"
> +UBOOT_EXTLINUX_FDTDIR ?= ""

This should probably be checking for IMAGETYPE!=fitImage and then 
install at the very least the first entry in KERNEL_DEVICETREE? The same 
way it was done in IMAGE_BOOT_FILES before?

> +UBOOT_EXTLINUX_CONSOLE ?= "console=tty1 console=${RK_CONSOLE_DEVICE},${RK_CONSOLE_BAUD}n8"
> +UBOOT_EXTLINUX_KERNEL_ARGS ?= "rootwait rw rootfstype=ext4 earlycon"

earlycon seems to be new here. and also should probably be part of the 
console entry rather, no?

Maybe also abstract the ext4 type here into a variable and use that 
variable as fstype in the wks?

> +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"

FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot 
(upstream at the very least) will check for / and then /boot prefix for 
the paths in extlinux.conf. Not providing /boot means if someone still 
wants to use a separate boot partition, they wouldn't have to update 
this variable. But since it's overridable, this is basically up to your 
preference.

> +UBOOT_EXTLINUX_LABELS ?= "default"
> +UBOOT_EXTLINUX_MENU_DESCRIPTION:default ?= "${MACHINE}"
> +
> +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "u-boot-extlinux"

Is the image actually bootable if we do NOT have u-boot-extlinux 
installed? I'm challenging the RRECOMMENDS basically. And wondering 
whether MACHINE_ESSENTIAL_EXTRA_* is always included (it seems like 
RDEPENDS one is part of packagegroup-core-boot which is virtually 
installed in all images).

This is actually quite nice, I was wondering also if there was a way to 
create as many entries as there are Device Trees supported for the 
machine (and maybe even device tree overlays? but this one's difficult 
because we need knowledge of which device tree overlay can apply on top 
of which device tree(s) :) ). But I don't think we can have anonymous 
python in conf file? Or maybe we should do this in u-boot bbappend?

> diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
> index 67a8310f7d6a..cae14c90e1db 100644
> --- a/conf/machine/include/rockchip-wic.inc
> +++ b/conf/machine/include/rockchip-wic.inc
> @@ -1,5 +1,7 @@
>   # common meta-rockchip wic/wks items
>   
> +require conf/machine/include/rockchip-extlinux.inc
> +
>   SPL_BINARY ?= "idbloader.img"
>   
>   IMAGE_FSTYPES += "wic wic.bmap"
> @@ -11,23 +13,8 @@ WKS_FILE_DEPENDS ?= " \
>   	virtual/bootloader \
>   	virtual/kernel \
>   	"

Does the WKS file still really depend on virtual/kernel or is it rather 
a misplaced dependency now?

The backward compatibility issues omitted, this is quite nice :)

Cheers,
Quentin
Trevor Woerner Feb. 16, 2024, 8:25 a.m. UTC | #2
On Thu 2024-02-15 @ 06:45:59 PM, Quentin Schulz wrote:
> Hi Trevor,
> 
> On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
> > In order to boot successfully, most Rockchip SoCs require a specific
> > partitioning scheme which was defined many years (and many SoCs) ago. That
> > partitioning scheme places the SPL and U-Boot at specific offsets at the
> > start of the boot block device:
> > 
> > 	https://opensource.rock-chips.com/wiki_Partitions
> > 
> > The Rockchip partitioning scheme goes on to also define the locations and
> > sizes of a number of additional partitions, including the "boot" and "root"
> > partitions.
> > 
> > Since both the SPL and U-Boot have already been placed on the block device,
> > the "boot" partition only contains the extlinux config file and the
> > kernel+dtb/fitImage; it doesn't contain any bootloader artifacts (other
> > than the extlinux config).
> > 
> > The locations and sizes of the SPL and U-Boot partitions are hard
> > dependencies since the BOOTROM etched inside the Rockchip SoCs is > programmed to blindly load and run what it finds at these locations. The
> 
> What matters is the location of TPL+SPL, U-Boot proper can be
> programmatically be put anywhere (not where TPL+SPL is of course :) ). The
> SPL actually stores in itself where to look for U-Boot proper in the storage
> media (and different storage media may have different locations, we have
> this for Puma RK3399 which has a differnet location for U-Boot proper on
> SPI-NOR and on eMMC/SD card). We do this on Puma RK3399 and Ringneck PX30
> for example (but we're not using this wks file so this isn't really
> relevant). Also, IIRC, the BootROM tries a few locations for the TPL+SPL in
> the boot storage medium (e.g. every 32KB offsets for the first 2/3/4).
> 
> Also, "blindly" is a bit of a stretch, the BootROM checks for a magic header
> value and then another magic string (e.g. RK33 for RK3399 and PX30). RK3568
> and RK3588 have a different header layout also (headerv1 vs headerv2).
> There's also secure boot that is possible, doing a bunch of extra checks
> directly from the BootROM, etc. :)

Good points. I've updated the commit message accordingly.

> > locations, sizes, and contents of the "boot" and "root" partitions are
> > not so rigid since it is U-Boot which interacts with them. U-Boot is very
> > flexible with how it finds boot components, and in its support for various
> > devices, filesystems, sizes, etc.
> > 
> > Both oe-core's U-Boot metadata and wic's bootimg-partition script contain
> > logic to generate the extlinux pieces required for a bootloader to boot
> > a Linux system. If both are enabled, the wic pieces silently clobber the
> > U-Boot pieces. However, the mechanisms contained in the U-Boot metadata are
> > much more flexible, from a user's point of view, than the mechanisms in
> > bootimg-partition.
> > 
> > Also, if a user wishes to setup some sort of A/B redundant update
> > mechanism, they must have redundant root partitions (in order to update
> > their filesystem contents) but they also need to have redundant boot
> > partitions if they wish to update the kernel as part of their update
> > mechanism. Pairing redundant kernel partitions with redundant filesystem
> > partitions becomes unnecessarily complicated. Therefore it makes sense
> > to combine the kernel and the filesystem into the same partition so that
> > both the kernel and filesystem are updated, or rolled back, in lock-step
> > as one unit. Specific kernel versions and configurations often have
> > dependencies on user-space components and versions.
> > 
> 
> And now users would have to update a potentially multi-gigabyte image only
> to update their kernel or dtb :)
> 
> > The boot partition is not going away. This patch simply transfers
> > responsibility for its creation to the more flexible U-Boot mechanism and
> > includes the kernel as part of the same partition as the root filesystem.
> 
> This means the boot partition is going away :) which is confirmed by the
> change in wic/rockchip.wks.
> 
> I think you meant to say the boot directory is not going away, or rather the
> content of the boot partition is not going away?

Yes.

> > Not only does it add flexibility, it also makes update schemes more
> > straightforward. Although having a separate /boot partition is a
> > "requirement" of the Rockchip partitioning scheme, it is not an actual
> > hard requirement when using a flexible, open-source bootloader (such as
> > U-Boot) instead of using Rockchip's proprietary miniloader, preloader, and
> > trust.img.
> > 
> 
> The upgrade path from current state to the new one is not straightforward
> though? The boot partition would disappear IF the partition table is
> reflashed (which is rarely done I guess?) Otherwise it would still exist,
> with the old and never-to-be-updated-again kernel binaries in the /boot
> partition (which does very much still exist unless you reflash the partition
> table AND flash on the / partition with the update mechanism). This also
> means that a rollback is impossible.
> 
> > Boot-tested on:
> > 	nanopi-m4b, nanopi-r2s, nanopi-r4s, roc-rk3328-cc, rock-3a,
> > 	rock-pi-4b, rock-5a, rock-5b, rock-pi-e, rock-pi-s, rock64
> > 
> > Signed-off-by: Trevor Woerner <twoerner@gmail.com>
> > ---
> >   conf/machine/include/rockchip-defaults.inc |  2 ++
> >   conf/machine/include/rockchip-extlinux.inc | 10 ++++++++++
> >   conf/machine/include/rockchip-wic.inc      | 17 ++---------------
> >   wic/rockchip.wks                           |  5 ++---
> >   4 files changed, 16 insertions(+), 18 deletions(-)
> >   create mode 100644 conf/machine/include/rockchip-extlinux.inc
> > 
> > diff --git a/conf/machine/include/rockchip-defaults.inc b/conf/machine/include/rockchip-defaults.inc
> > index 3ce2e246ab0b..2387eb909934 100644
> > --- a/conf/machine/include/rockchip-defaults.inc
> > +++ b/conf/machine/include/rockchip-defaults.inc
> > @@ -19,3 +19,5 @@ XSERVER = " \
> >   # misc
> >   SERIAL_CONSOLES ?= "1500000;ttyS2"
> > +RK_CONSOLE_BAUD ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[0]}"
> > +RK_CONSOLE_DEVICE ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[1].split()[0]}"
> > diff --git a/conf/machine/include/rockchip-extlinux.inc b/conf/machine/include/rockchip-extlinux.inc
> > new file mode 100644
> > index 000000000000..c73fb7d17e02
> > --- /dev/null
> > +++ b/conf/machine/include/rockchip-extlinux.inc
> > @@ -0,0 +1,10 @@
> > +UBOOT_EXTLINUX ?= "1"
> > +UBOOT_EXTLINUX_ROOT ?= "root=PARTLABEL=root"
> > +UBOOT_EXTLINUX_FDTDIR ?= ""
> 
> This should probably be checking for IMAGETYPE!=fitImage and then install at
> the very least the first entry in KERNEL_DEVICETREE? The same way it was
> done in IMAGE_BOOT_FILES before?

Good catch!

> > +UBOOT_EXTLINUX_CONSOLE ?= "console=tty1 console=${RK_CONSOLE_DEVICE},${RK_CONSOLE_BAUD}n8"
> > +UBOOT_EXTLINUX_KERNEL_ARGS ?= "rootwait rw rootfstype=ext4 earlycon"
> 
> earlycon seems to be new here. and also should probably be part of the
> console entry rather, no?

Sounds good.

> Maybe also abstract the ext4 type here into a variable and use that variable
> as fstype in the wks?

I'll do that as a separate, future patch.

> > +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
> 
> FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot (upstream
> at the very least) will check for / and then /boot prefix for the paths in
> extlinux.conf. Not providing /boot means if someone still wants to use a
> separate boot partition, they wouldn't have to update this variable. But
> since it's overridable, this is basically up to your preference.

This is a good example of working ahead. The next thing I have queued up is
a meta-rauc-rockchip example that works generically on all (most?) rockchip
boards. As part of the U-Boot script I need to make the A/B logic work, it
needs the "/boot" in there otherwise it doesn't work; therefore it's best to
set it up properly now.

> > +UBOOT_EXTLINUX_LABELS ?= "default"
> > +UBOOT_EXTLINUX_MENU_DESCRIPTION:default ?= "${MACHINE}"
> > +
> > +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "u-boot-extlinux"
> 
> Is the image actually bootable if we do NOT have u-boot-extlinux installed?
> I'm challenging the RRECOMMENDS basically. And wondering whether
> MACHINE_ESSENTIAL_EXTRA_* is always included (it seems like RDEPENDS one is
> part of packagegroup-core-boot which is virtually installed in all images).

I can double-check, but I'm pretty sure that line was added explicitly after
testing and noticing that it was needed. If we remove the extlinux artifacts
from the image, what boot method is U-Boot supposed to use?

> This is actually quite nice, I was wondering also if there was a way to
> create as many entries as there are Device Trees supported for the machine
> (and maybe even device tree overlays? but this one's difficult because we
> need knowledge of which device tree overlay can apply on top of which device
> tree(s) :) ). But I don't think we can have anonymous python in conf file?
> Or maybe we should do this in u-boot bbappend?

Yes. The bbclass has logic to generate as many entries as user-supplied labels
in UBOOT_EXTLINUX_LABELS:

https://git.openembedded.org/openembedded-core/tree/meta/classes-recipe/uboot-extlinux-config.bbclass#n114

I actually hint at the mechanism my providing the superfluous ":default"
entry.

> > diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
> > index 67a8310f7d6a..cae14c90e1db 100644
> > --- a/conf/machine/include/rockchip-wic.inc
> > +++ b/conf/machine/include/rockchip-wic.inc
> > @@ -1,5 +1,7 @@
> >   # common meta-rockchip wic/wks items
> > +require conf/machine/include/rockchip-extlinux.inc
> > +
> >   SPL_BINARY ?= "idbloader.img"
> >   IMAGE_FSTYPES += "wic wic.bmap"
> > @@ -11,23 +13,8 @@ WKS_FILE_DEPENDS ?= " \
> >   	virtual/bootloader \
> >   	virtual/kernel \
> >   	"
> 
> Does the WKS file still really depend on virtual/kernel or is it rather a
> misplaced dependency now?

Great catch! Also, since all the partitions now have explicit fstypes, and the
fact we no longer have a vfat-formatted /boot partition, the mtools-native and
dosfstools-native dependencies can also be removed.

It will probably get rejected, but I think I'm going to create a patch for wic
that assumes unspecified partitions are "none" instead of "vfat". I wonder how
many BSP layers are copy&past'ing the mtools and dosfstools dependencies that
aren't using vfat-based partitions and wondering why?

> The backward compatibility issues omitted, this is quite nice :)
> 
> Cheers,
> Quentin
Quentin Schulz Feb. 16, 2024, 9:31 a.m. UTC | #3
On 2/16/24 09:25, Trevor Woerner wrote:
> On Thu 2024-02-15 @ 06:45:59 PM, Quentin Schulz wrote:
>> Hi Trevor,
>>
>> On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
[...]
>>> +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
>>
>> FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot (upstream
>> at the very least) will check for / and then /boot prefix for the paths in
>> extlinux.conf. Not providing /boot means if someone still wants to use a
>> separate boot partition, they wouldn't have to update this variable. But
>> since it's overridable, this is basically up to your preference.
> 
> This is a good example of working ahead. The next thing I have queued up is
> a meta-rauc-rockchip example that works generically on all (most?) rockchip
> boards. As part of the U-Boot script I need to make the A/B logic work, it
> needs the "/boot" in there otherwise it doesn't work; therefore it's best to
> set it up properly now.
> 

Mmmm I'm interested to see why it fails without the /boot thing? Let's 
see when we get patches :)

>>> +UBOOT_EXTLINUX_LABELS ?= "default"
>>> +UBOOT_EXTLINUX_MENU_DESCRIPTION:default ?= "${MACHINE}"
>>> +
>>> +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "u-boot-extlinux"
>>
>> Is the image actually bootable if we do NOT have u-boot-extlinux installed?
>> I'm challenging the RRECOMMENDS basically. And wondering whether
>> MACHINE_ESSENTIAL_EXTRA_* is always included (it seems like RDEPENDS one is
>> part of packagegroup-core-boot which is virtually installed in all images).
> 
> I can double-check, but I'm pretty sure that line was added explicitly after
> testing and noticing that it was needed. If we remove the extlinux artifacts
> from the image, what boot method is U-Boot supposed to use?
> 

I'm not saying it is not needed, I'm thinking _RRECOMMENDS is too weak 
and it should be _RDEPENDS instead?

I'm not sure the wic image (or rather the rootfs) is proper basically if 
u-boot-extlinux is not installed.

As for what U-Boot does if it doesn't find an extlinux.conf, it depends 
on what U-Boot is configured to do. If I rememebr correctly, most (all) 
Rockchip boards now use bootflow by default.

You can check the content of the bootcmd environment variable, that's 
what's started when the user does nothing to interrupt the boot.

For me on Jaguar RK3588:
"""
 > printenv bootcmd
bootcmd=bootflow scan -lb
"""

remove the -b flag so it doesn't boot and you should have something 
reasonable.

For me:
"""
=> bootflow scan -lae
Scanning for bootflows in all bootdevs
Seq  Method       State   Uclass    Part  Name                      Filename
---  -----------  ------  --------  ----  ------------------------ 
----------------
Scanning global bootmeth 'efi_mgr':
   0  efi_mgr      ready   (none)       0  <NULL>
Scanning bootdev 'mmc@fe2e0000.bootdev':
   1  extlinux     media   mmc          0  mmc@fe2e0000.bootdev.whol
      ** No partition found, err=-2: No such file or directory
   2  script       media   mmc          0  mmc@fe2e0000.bootdev.whol
      ** No partition found, err=-2: No such file or directory
   3  efi          media   mmc          0  mmc@fe2e0000.bootdev.whol
      ** No partition found, err=-2: No such file or directory
   4  pxe          base    mmc          0  mmc@fe2e0000.bootdev.whol
      ** No media/partition found, err=-524: Unknown error
   5  extlinux     media   mmc          1  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   6  script       media   mmc          1  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   7  efi          media   mmc          1  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   8  pxe          base    mmc          1  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
   9  extlinux     media   mmc          2  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   a  script       media   mmc          2  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   b  efi          media   mmc          2  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   c  pxe          base    mmc          2  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
   d  extlinux     media   mmc          3  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   e  script       media   mmc          3  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
   f  efi          media   mmc          3  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  10  pxe          base    mmc          3  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  11  extlinux     media   mmc          4  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  12  script       media   mmc          4  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  13  efi          media   mmc          4  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  14  pxe          base    mmc          4  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  15  extlinux     media   mmc          5  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  16  script       media   mmc          5  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  17  efi          media   mmc          5  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  18  pxe          base    mmc          5  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  19  extlinux     ready   mmc          6  mmc@fe2e0000.bootdev.part 
/extlinux/extlinux.conf
  1a  script       fs      mmc          6  mmc@fe2e0000.bootdev.part 
/boot/boot.scr
      ** File not found, err=-2: No such file or directory
  1b  efi          fs      mmc          6  mmc@fe2e0000.bootdev.part 
efi/boot/bootaa64.efi
      ** File not found, err=-2: No such file or directory
  1c  pxe          base    mmc          6  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  1d  extlinux     media   mmc          7  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  1e  script       media   mmc          7  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  1f  efi          media   mmc          7  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-22: Invalid argument
  20  pxe          base    mmc          7  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  21  extlinux     media   mmc          8  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  22  script       media   mmc          8  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  23  efi          media   mmc          8  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  24  pxe          base    mmc          8  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  25  extlinux     media   mmc          9  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  26  script       media   mmc          9  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  27  efi          media   mmc          9  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  28  pxe          base    mmc          9  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  29  extlinux     media   mmc          a  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  2a  script       media   mmc          a  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  2b  efi          media   mmc          a  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  2c  pxe          base    mmc          a  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  2d  extlinux     media   mmc          b  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  2e  script       media   mmc          b  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  2f  efi          media   mmc          b  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  30  pxe          base    mmc          b  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  31  extlinux     media   mmc          c  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  32  script       media   mmc          c  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  33  efi          media   mmc          c  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  34  pxe          base    mmc          c  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  35  extlinux     media   mmc          d  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  36  script       media   mmc          d  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  37  efi          media   mmc          d  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  38  pxe          base    mmc          d  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  39  extlinux     media   mmc          e  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  3a  script       media   mmc          e  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  3b  efi          media   mmc          e  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  3c  pxe          base    mmc          e  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  3d  extlinux     media   mmc          f  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  3e  script       media   mmc          f  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  3f  efi          media   mmc          f  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  40  pxe          base    mmc          f  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  41  extlinux     media   mmc         10  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  42  script       media   mmc         10  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  43  efi          media   mmc         10  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  44  pxe          base    mmc         10  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  45  extlinux     media   mmc         11  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  46  script       media   mmc         11  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  47  efi          media   mmc         11  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  48  pxe          base    mmc         11  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  49  extlinux     media   mmc         12  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  4a  script       media   mmc         12  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  4b  efi          media   mmc         12  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  4c  pxe          base    mmc         12  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  4d  extlinux     media   mmc         13  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  4e  script       media   mmc         13  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  4f  efi          media   mmc         13  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  50  pxe          base    mmc         13  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  51  extlinux     media   mmc         14  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  52  script       media   mmc         14  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  53  efi          media   mmc         14  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  54  pxe          base    mmc         14  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  55  extlinux     media   mmc         15  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  56  script       media   mmc         15  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  57  efi          media   mmc         15  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  58  pxe          base    mmc         15  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  59  extlinux     media   mmc         16  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  5a  script       media   mmc         16  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  5b  efi          media   mmc         16  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  5c  pxe          base    mmc         16  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  5d  extlinux     media   mmc         17  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  5e  script       media   mmc         17  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  5f  efi          media   mmc         17  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  60  pxe          base    mmc         17  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  61  extlinux     media   mmc         18  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  62  script       media   mmc         18  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  63  efi          media   mmc         18  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  64  pxe          base    mmc         18  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  65  extlinux     media   mmc         19  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  66  script       media   mmc         19  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  67  efi          media   mmc         19  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  68  pxe          base    mmc         19  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  69  extlinux     media   mmc         1a  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  6a  script       media   mmc         1a  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  6b  efi          media   mmc         1a  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  6c  pxe          base    mmc         1a  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  6d  extlinux     media   mmc         1b  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  6e  script       media   mmc         1b  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  6f  efi          media   mmc         1b  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  70  pxe          base    mmc         1b  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  71  extlinux     media   mmc         1c  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  72  script       media   mmc         1c  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  73  efi          media   mmc         1c  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  74  pxe          base    mmc         1c  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
  75  extlinux     media   mmc         1d  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  76  script       media   mmc         1d  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  77  efi          media   mmc         1d  mmc@fe2e0000.bootdev.part
      ** No partition found, err=-2: No such file or directory
  78  pxe          base    mmc         1d  mmc@fe2e0000.bootdev.part
      ** No media/partition found, err=-524: Unknown error
Scanning bootdev 'mmc@fe2c0000.bootdev':
Card did not respond to voltage select! : -110
Unknown uclass 'nvme' in label
scanning bus for devices...
Bus usb@fc800000: USB EHCI 1.00
Bus usb@fc840000: USB OHCI 1.0
Bus usb@fc880000: USB EHCI 1.00
Bus usb@fc8c0000: USB OHCI 1.0
scanning bus usb@fc800000 for devices... 1 USB Device(s) found
scanning bus usb@fc840000 for devices... 1 USB Device(s) found
scanning bus usb@fc880000 for devices... 1 USB Device(s) found
scanning bus usb@fc8c0000 for devices... 1 USB Device(s) found
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
BOOTP broadcast 6
BOOTP broadcast 7
BOOTP broadcast 8
BOOTP broadcast 9
BOOTP broadcast 10
BOOTP broadcast 11
BOOTP broadcast 12
BOOTP broadcast 13
BOOTP broadcast 14
BOOTP broadcast 15
BOOTP broadcast 16
BOOTP broadcast 17

Retry time exceeded; starting again
BOOTP broadcast 1
BOOTP broadcast 2
BOOTP broadcast 3
BOOTP broadcast 4
BOOTP broadcast 5
BOOTP broadcast 6
BOOTP broadcast 7
BOOTP broadcast 8
BOOTP broadcast 9
BOOTP broadcast 10
BOOTP broadcast 11
BOOTP broadcast 12
BOOTP broadcast 13
BOOTP broadcast 14
BOOTP broadcast 15
BOOTP broadcast 16
BOOTP broadcast 17

Retry time exceeded; starting again
No more bootdevs
---  -----------  ------  --------  ----  ------------------------ 
----------------
(121 bootflows, 2 valid)
"""

The media tested seems to be located in boot_targets, which defaults for 
that board to:

"""
 > printenv boot_targets
boot_targets=mmc0 mmc1 nvme scsi usb pxe dhcp spi
"""

So it tries to boot from mmc0 (eMMC usually), mmc1 (SD card usually), 
nvme, scsi, usb, pxe (glorified TFTP?), dhcp, spi.

So if nothing works/exists before scsi, then it'll try to boot from 
that, then USB, then from the network and finally maybe from spi but 
that is very likely to fail as well since SPI flashes are typically very 
small and wouldn't be able to contain even the kernel Image?

>> This is actually quite nice, I was wondering also if there was a way to
>> create as many entries as there are Device Trees supported for the machine
>> (and maybe even device tree overlays? but this one's difficult because we
>> need knowledge of which device tree overlay can apply on top of which device
>> tree(s) :) ). But I don't think we can have anonymous python in conf file?
>> Or maybe we should do this in u-boot bbappend?
> 
> Yes. The bbclass has logic to generate as many entries as user-supplied labels
> in UBOOT_EXTLINUX_LABELS:
> 
> https://git.openembedded.org/openembedded-core/tree/meta/classes-recipe/uboot-extlinux-config.bbclass#n114
> 
> I actually hint at the mechanism my providing the superfluous ":default"
> entry.
> 

I'm actually more discussing how to *feed* this to this part of the 
code. Right now, this is manual because we need to define labels and for 
each variable a label override.

I was wondering if we could have something that automatically creates 
labels for the non fitimage usecase, based on the KERNEL_DEVICETREE 
variable.

in pseudo code:

UBOOT_EXTLINUX_LABELS ?= ""

python __anonymous() {
     UBOOT_EXTLINUX_DEFAULT_LABEL = first(KERNEL_DEVICETREE)
     for devicetree in KERNEL_DEVICETREE:
         UBOOT_EXTLINUX_LABELS += basename(devicetree)
         UBOOT_EXTLINUX_FDT:basename(devicetree) = devicetree
}

>>> diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
>>> index 67a8310f7d6a..cae14c90e1db 100644
>>> --- a/conf/machine/include/rockchip-wic.inc
>>> +++ b/conf/machine/include/rockchip-wic.inc
>>> @@ -1,5 +1,7 @@
>>>    # common meta-rockchip wic/wks items
>>> +require conf/machine/include/rockchip-extlinux.inc
>>> +
>>>    SPL_BINARY ?= "idbloader.img"
>>>    IMAGE_FSTYPES += "wic wic.bmap"
>>> @@ -11,23 +13,8 @@ WKS_FILE_DEPENDS ?= " \
>>>    	virtual/bootloader \
>>>    	virtual/kernel \
>>>    	"
>>
>> Does the WKS file still really depend on virtual/kernel or is it rather a
>> misplaced dependency now?
> 
> Great catch! Also, since all the partitions now have explicit fstypes, and the
> fact we no longer have a vfat-formatted /boot partition, the mtools-native and
> dosfstools-native dependencies can also be removed.
> 
> It will probably get rejected, but I think I'm going to create a patch for wic
> that assumes unspecified partitions are "none" instead of "vfat". I wonder how
> many BSP layers are copy&past'ing the mtools and dosfstools dependencies that
> aren't using vfat-based partitions and wondering why?
> 

And a nice catch from you there too :)

Cheers,
Quentin
Trevor Woerner Feb. 18, 2024, 5:28 p.m. UTC | #4
On Fri 2024-02-16 @ 10:31:36 AM, Quentin Schulz wrote:
> 
> 
> On 2/16/24 09:25, Trevor Woerner wrote:
> > On Thu 2024-02-15 @ 06:45:59 PM, Quentin Schulz wrote:
> > > Hi Trevor,
> > > 
> > > On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
> [...]
> > > > +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
> > > 
> > > FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot (upstream
> > > at the very least) will check for / and then /boot prefix for the paths in
> > > extlinux.conf. Not providing /boot means if someone still wants to use a
> > > separate boot partition, they wouldn't have to update this variable. But
> > > since it's overridable, this is basically up to your preference.
> > 
> > This is a good example of working ahead. The next thing I have queued up is
> > a meta-rauc-rockchip example that works generically on all (most?) rockchip
> > boards. As part of the U-Boot script I need to make the A/B logic work, it
> > needs the "/boot" in there otherwise it doesn't work; therefore it's best to
> > set it up properly now.
> > 
> 
> Mmmm I'm interested to see why it fails without the /boot thing? Let's see
> when we get patches :)

I'm working on getting rauc working with meta-rockchip generically so it works
with all the MACHINES in meta-rockchip. The patch won't be part of
meta-rockchip, but rather be part of a meta-rauc-community/meta-rauc-rockchip
I hope to submit upstream at some point.

Basically rauc works with U-Boot via a boot script. To make that script more
flexible I'm borrowing a variable form meta-rockchip in the rauc U-Boot script
to actually do the booting of the kernel/fitImage/etc. So while U-Boot might
be smart enough to check a bunch of places looking for the thing to boot, the
rauc boot script isn't quite so smart. It's my script to write, and I could
add such logic, but that would just inflate the script for questionable gain.

> > > > +UBOOT_EXTLINUX_LABELS ?= "default"
> > > > +UBOOT_EXTLINUX_MENU_DESCRIPTION:default ?= "${MACHINE}"
> > > > +
> > > > +MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "u-boot-extlinux"
> > > 
> > > Is the image actually bootable if we do NOT have u-boot-extlinux installed?
> > > I'm challenging the RRECOMMENDS basically. And wondering whether
> > > MACHINE_ESSENTIAL_EXTRA_* is always included (it seems like RDEPENDS one is
> > > part of packagegroup-core-boot which is virtually installed in all images).
> > 
> > I can double-check, but I'm pretty sure that line was added explicitly after
> > testing and noticing that it was needed. If we remove the extlinux artifacts
> > from the image, what boot method is U-Boot supposed to use?
> > 
> 
> I'm not saying it is not needed, I'm thinking _RRECOMMENDS is too weak and
> it should be _RDEPENDS instead?
> 
> I'm not sure the wic image (or rather the rootfs) is proper basically if
> u-boot-extlinux is not installed.
> 
> As for what U-Boot does if it doesn't find an extlinux.conf, it depends on
> what U-Boot is configured to do. If I rememebr correctly, most (all)
> Rockchip boards now use bootflow by default.
> 
> You can check the content of the bootcmd environment variable, that's what's
> started when the user does nothing to interrupt the boot.
> 
> For me on Jaguar RK3588:
> """
> > printenv bootcmd
> bootcmd=bootflow scan -lb
> """
> 
> remove the -b flag so it doesn't boot and you should have something
> reasonable.
> 
> For me:
> """
> => bootflow scan -lae
> Scanning for bootflows in all bootdevs
> Seq  Method       State   Uclass    Part  Name                      Filename
> ---  -----------  ------  --------  ----  ------------------------
> ----------------
> Scanning global bootmeth 'efi_mgr':
>   0  efi_mgr      ready   (none)       0  <NULL>
> Scanning bootdev 'mmc@fe2e0000.bootdev':
>   1  extlinux     media   mmc          0  mmc@fe2e0000.bootdev.whol
>      ** No partition found, err=-2: No such file or directory
>   2  script       media   mmc          0  mmc@fe2e0000.bootdev.whol
>      ** No partition found, err=-2: No such file or directory
>   3  efi          media   mmc          0  mmc@fe2e0000.bootdev.whol
>      ** No partition found, err=-2: No such file or directory
>   4  pxe          base    mmc          0  mmc@fe2e0000.bootdev.whol
>      ** No media/partition found, err=-524: Unknown error
>   5  extlinux     media   mmc          1  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   6  script       media   mmc          1  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   7  efi          media   mmc          1  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   8  pxe          base    mmc          1  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>   9  extlinux     media   mmc          2  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   a  script       media   mmc          2  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   b  efi          media   mmc          2  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   c  pxe          base    mmc          2  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>   d  extlinux     media   mmc          3  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   e  script       media   mmc          3  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>   f  efi          media   mmc          3  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  10  pxe          base    mmc          3  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  11  extlinux     media   mmc          4  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  12  script       media   mmc          4  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  13  efi          media   mmc          4  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  14  pxe          base    mmc          4  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  15  extlinux     media   mmc          5  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  16  script       media   mmc          5  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  17  efi          media   mmc          5  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  18  pxe          base    mmc          5  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  19  extlinux     ready   mmc          6  mmc@fe2e0000.bootdev.part
> /extlinux/extlinux.conf
>  1a  script       fs      mmc          6  mmc@fe2e0000.bootdev.part
> /boot/boot.scr
>      ** File not found, err=-2: No such file or directory
>  1b  efi          fs      mmc          6  mmc@fe2e0000.bootdev.part
> efi/boot/bootaa64.efi
>      ** File not found, err=-2: No such file or directory
>  1c  pxe          base    mmc          6  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  1d  extlinux     media   mmc          7  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  1e  script       media   mmc          7  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  1f  efi          media   mmc          7  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-22: Invalid argument
>  20  pxe          base    mmc          7  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  21  extlinux     media   mmc          8  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  22  script       media   mmc          8  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  23  efi          media   mmc          8  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  24  pxe          base    mmc          8  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  25  extlinux     media   mmc          9  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  26  script       media   mmc          9  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  27  efi          media   mmc          9  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  28  pxe          base    mmc          9  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  29  extlinux     media   mmc          a  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  2a  script       media   mmc          a  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  2b  efi          media   mmc          a  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  2c  pxe          base    mmc          a  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  2d  extlinux     media   mmc          b  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  2e  script       media   mmc          b  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  2f  efi          media   mmc          b  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  30  pxe          base    mmc          b  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  31  extlinux     media   mmc          c  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  32  script       media   mmc          c  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  33  efi          media   mmc          c  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  34  pxe          base    mmc          c  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  35  extlinux     media   mmc          d  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  36  script       media   mmc          d  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  37  efi          media   mmc          d  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  38  pxe          base    mmc          d  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  39  extlinux     media   mmc          e  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  3a  script       media   mmc          e  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  3b  efi          media   mmc          e  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  3c  pxe          base    mmc          e  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  3d  extlinux     media   mmc          f  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  3e  script       media   mmc          f  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  3f  efi          media   mmc          f  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  40  pxe          base    mmc          f  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  41  extlinux     media   mmc         10  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  42  script       media   mmc         10  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  43  efi          media   mmc         10  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  44  pxe          base    mmc         10  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  45  extlinux     media   mmc         11  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  46  script       media   mmc         11  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  47  efi          media   mmc         11  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  48  pxe          base    mmc         11  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  49  extlinux     media   mmc         12  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  4a  script       media   mmc         12  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  4b  efi          media   mmc         12  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  4c  pxe          base    mmc         12  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  4d  extlinux     media   mmc         13  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  4e  script       media   mmc         13  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  4f  efi          media   mmc         13  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  50  pxe          base    mmc         13  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  51  extlinux     media   mmc         14  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  52  script       media   mmc         14  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  53  efi          media   mmc         14  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  54  pxe          base    mmc         14  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  55  extlinux     media   mmc         15  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  56  script       media   mmc         15  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  57  efi          media   mmc         15  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  58  pxe          base    mmc         15  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  59  extlinux     media   mmc         16  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  5a  script       media   mmc         16  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  5b  efi          media   mmc         16  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  5c  pxe          base    mmc         16  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  5d  extlinux     media   mmc         17  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  5e  script       media   mmc         17  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  5f  efi          media   mmc         17  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  60  pxe          base    mmc         17  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  61  extlinux     media   mmc         18  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  62  script       media   mmc         18  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  63  efi          media   mmc         18  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  64  pxe          base    mmc         18  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  65  extlinux     media   mmc         19  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  66  script       media   mmc         19  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  67  efi          media   mmc         19  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  68  pxe          base    mmc         19  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  69  extlinux     media   mmc         1a  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  6a  script       media   mmc         1a  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  6b  efi          media   mmc         1a  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  6c  pxe          base    mmc         1a  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  6d  extlinux     media   mmc         1b  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  6e  script       media   mmc         1b  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  6f  efi          media   mmc         1b  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  70  pxe          base    mmc         1b  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  71  extlinux     media   mmc         1c  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  72  script       media   mmc         1c  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  73  efi          media   mmc         1c  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  74  pxe          base    mmc         1c  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
>  75  extlinux     media   mmc         1d  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  76  script       media   mmc         1d  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  77  efi          media   mmc         1d  mmc@fe2e0000.bootdev.part
>      ** No partition found, err=-2: No such file or directory
>  78  pxe          base    mmc         1d  mmc@fe2e0000.bootdev.part
>      ** No media/partition found, err=-524: Unknown error
> Scanning bootdev 'mmc@fe2c0000.bootdev':
> Card did not respond to voltage select! : -110
> Unknown uclass 'nvme' in label
> scanning bus for devices...
> Bus usb@fc800000: USB EHCI 1.00
> Bus usb@fc840000: USB OHCI 1.0
> Bus usb@fc880000: USB EHCI 1.00
> Bus usb@fc8c0000: USB OHCI 1.0
> scanning bus usb@fc800000 for devices... 1 USB Device(s) found
> scanning bus usb@fc840000 for devices... 1 USB Device(s) found
> scanning bus usb@fc880000 for devices... 1 USB Device(s) found
> scanning bus usb@fc8c0000 for devices... 1 USB Device(s) found
> BOOTP broadcast 1
> BOOTP broadcast 2
> BOOTP broadcast 3
> BOOTP broadcast 4
> BOOTP broadcast 5
> BOOTP broadcast 6
> BOOTP broadcast 7
> BOOTP broadcast 8
> BOOTP broadcast 9
> BOOTP broadcast 10
> BOOTP broadcast 11
> BOOTP broadcast 12
> BOOTP broadcast 13
> BOOTP broadcast 14
> BOOTP broadcast 15
> BOOTP broadcast 16
> BOOTP broadcast 17
> 
> Retry time exceeded; starting again
> BOOTP broadcast 1
> BOOTP broadcast 2
> BOOTP broadcast 3
> BOOTP broadcast 4
> BOOTP broadcast 5
> BOOTP broadcast 6
> BOOTP broadcast 7
> BOOTP broadcast 8
> BOOTP broadcast 9
> BOOTP broadcast 10
> BOOTP broadcast 11
> BOOTP broadcast 12
> BOOTP broadcast 13
> BOOTP broadcast 14
> BOOTP broadcast 15
> BOOTP broadcast 16
> BOOTP broadcast 17
> 
> Retry time exceeded; starting again
> No more bootdevs
> ---  -----------  ------  --------  ----  ------------------------
> ----------------
> (121 bootflows, 2 valid)
> """
> 
> The media tested seems to be located in boot_targets, which defaults for
> that board to:
> 
> """
> > printenv boot_targets
> boot_targets=mmc0 mmc1 nvme scsi usb pxe dhcp spi
> """
> 
> So it tries to boot from mmc0 (eMMC usually), mmc1 (SD card usually), nvme,
> scsi, usb, pxe (glorified TFTP?), dhcp, spi.
> 
> So if nothing works/exists before scsi, then it'll try to boot from that,
> then USB, then from the network and finally maybe from spi but that is very
> likely to fail as well since SPI flashes are typically very small and
> wouldn't be able to contain even the kernel Image?
> 
> > > This is actually quite nice, I was wondering also if there was a way to
> > > create as many entries as there are Device Trees supported for the machine
> > > (and maybe even device tree overlays? but this one's difficult because we
> > > need knowledge of which device tree overlay can apply on top of which device
> > > tree(s) :) ). But I don't think we can have anonymous python in conf file?
> > > Or maybe we should do this in u-boot bbappend?
> > 
> > Yes. The bbclass has logic to generate as many entries as user-supplied labels
> > in UBOOT_EXTLINUX_LABELS:
> > 
> > https://git.openembedded.org/openembedded-core/tree/meta/classes-recipe/uboot-extlinux-config.bbclass#n114
> > 
> > I actually hint at the mechanism my providing the superfluous ":default"
> > entry.
> > 
> 
> I'm actually more discussing how to *feed* this to this part of the code.
> Right now, this is manual because we need to define labels and for each
> variable a label override.
> 
> I was wondering if we could have something that automatically creates labels
> for the non fitimage usecase, based on the KERNEL_DEVICETREE variable.
> 
> in pseudo code:
> 
> UBOOT_EXTLINUX_LABELS ?= ""
> 
> python __anonymous() {
>     UBOOT_EXTLINUX_DEFAULT_LABEL = first(KERNEL_DEVICETREE)
>     for devicetree in KERNEL_DEVICETREE:
>         UBOOT_EXTLINUX_LABELS += basename(devicetree)
>         UBOOT_EXTLINUX_FDT:basename(devicetree) = devicetree

I made all the EXTLINUX variables ?= so users could override them as they see
fit. If a user wants to add more boot targets then I figure they can generate
the entries manually in their own overrides/configurations to suit their needs
for the time-being. Maybe eventually we could have something clever and
automated (based on KERNEL_DEVICETREE) but that's a future task. In that case
the user would only need to specify a set of device trees and the BSP would
handle it automatically.

However boot targets might not all be based, or all be wanted, from different
device trees. If the user wanted to have a, for example. Xen target, that
would be an entirely separate thing.

More things to think about. In any case, the proposed changes allow the user
to do what the want, even if it means a bit more work on their part for the
time-being.

And that's why I'm happy to be switching over to the EXTLINUX handling
provided by the U-Boot metadata in oecore rather than using the EXTLINUX
pieces from wic. The oecore pieces are much more flexible. The wic support
doesn't allow anywhere near as much flexibility and certainly doesn't provide
a way to define multiple targets.

> }
> 
> > > > diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
> > > > index 67a8310f7d6a..cae14c90e1db 100644
> > > > --- a/conf/machine/include/rockchip-wic.inc
> > > > +++ b/conf/machine/include/rockchip-wic.inc
> > > > @@ -1,5 +1,7 @@
> > > >    # common meta-rockchip wic/wks items
> > > > +require conf/machine/include/rockchip-extlinux.inc
> > > > +
> > > >    SPL_BINARY ?= "idbloader.img"
> > > >    IMAGE_FSTYPES += "wic wic.bmap"
> > > > @@ -11,23 +13,8 @@ WKS_FILE_DEPENDS ?= " \
> > > >    	virtual/bootloader \
> > > >    	virtual/kernel \
> > > >    	"
> > > 
> > > Does the WKS file still really depend on virtual/kernel or is it rather a
> > > misplaced dependency now?
> > 
> > Great catch! Also, since all the partitions now have explicit fstypes, and the
> > fact we no longer have a vfat-formatted /boot partition, the mtools-native and
> > dosfstools-native dependencies can also be removed.
> > 
> > It will probably get rejected, but I think I'm going to create a patch for wic
> > that assumes unspecified partitions are "none" instead of "vfat". I wonder how
> > many BSP layers are copy&past'ing the mtools and dosfstools dependencies that
> > aren't using vfat-based partitions and wondering why?
> > 
> 
> And a nice catch from you there too :)
> 
> Cheers,
> Quentin
Quentin Schulz Feb. 21, 2024, 6:31 p.m. UTC | #5
Hi Trevor,

On 2/18/24 18:28, Trevor Woerner wrote:
> On Fri 2024-02-16 @ 10:31:36 AM, Quentin Schulz wrote:
>>
>>
>> On 2/16/24 09:25, Trevor Woerner wrote:
>>> On Thu 2024-02-15 @ 06:45:59 PM, Quentin Schulz wrote:
>>>> Hi Trevor,
>>>>
>>>> On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
>> [...]
>>>>> +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
>>>>
>>>> FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot (upstream
>>>> at the very least) will check for / and then /boot prefix for the paths in
>>>> extlinux.conf. Not providing /boot means if someone still wants to use a
>>>> separate boot partition, they wouldn't have to update this variable. But
>>>> since it's overridable, this is basically up to your preference.
>>>
>>> This is a good example of working ahead. The next thing I have queued up is
>>> a meta-rauc-rockchip example that works generically on all (most?) rockchip
>>> boards. As part of the U-Boot script I need to make the A/B logic work, it
>>> needs the "/boot" in there otherwise it doesn't work; therefore it's best to
>>> set it up properly now.
>>>
>>
>> Mmmm I'm interested to see why it fails without the /boot thing? Let's see
>> when we get patches :)
> 
> I'm working on getting rauc working with meta-rockchip generically so it works
> with all the MACHINES in meta-rockchip. The patch won't be part of
> meta-rockchip, but rather be part of a meta-rauc-community/meta-rauc-rockchip
> I hope to submit upstream at some point.
> 
> Basically rauc works with U-Boot via a boot script. To make that script more
> flexible I'm borrowing a variable form meta-rockchip in the rauc U-Boot script
> to actually do the booting of the kernel/fitImage/etc. So while U-Boot might
> be smart enough to check a bunch of places looking for the thing to boot, the
> rauc boot script isn't quite so smart. It's my script to write, and I could
> add such logic, but that would just inflate the script for questionable gain.
> 

This seems like you're not using extlinux.conf when using rauc but using 
one of the variables used to build the extlinux.conf to do some 
magic/logic in rauc?

In any case, not a blocker.

Cheers,
Quentin
Trevor Woerner Feb. 21, 2024, 7:18 p.m. UTC | #6
On Wed 2024-02-21 @ 07:31:17 PM, Quentin Schulz wrote:
> Hi Trevor,
> 
> On 2/18/24 18:28, Trevor Woerner wrote:
> > On Fri 2024-02-16 @ 10:31:36 AM, Quentin Schulz wrote:
> > > 
> > > 
> > > On 2/16/24 09:25, Trevor Woerner wrote:
> > > > On Thu 2024-02-15 @ 06:45:59 PM, Quentin Schulz wrote:
> > > > > Hi Trevor,
> > > > > 
> > > > > On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
> > > [...]
> > > > > > +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
> > > > > 
> > > > > FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot (upstream
> > > > > at the very least) will check for / and then /boot prefix for the paths in
> > > > > extlinux.conf. Not providing /boot means if someone still wants to use a
> > > > > separate boot partition, they wouldn't have to update this variable. But
> > > > > since it's overridable, this is basically up to your preference.
> > > > 
> > > > This is a good example of working ahead. The next thing I have queued up is
> > > > a meta-rauc-rockchip example that works generically on all (most?) rockchip
> > > > boards. As part of the U-Boot script I need to make the A/B logic work, it
> > > > needs the "/boot" in there otherwise it doesn't work; therefore it's best to
> > > > set it up properly now.
> > > > 
> > > 
> > > Mmmm I'm interested to see why it fails without the /boot thing? Let's see
> > > when we get patches :)
> > 
> > I'm working on getting rauc working with meta-rockchip generically so it works
> > with all the MACHINES in meta-rockchip. The patch won't be part of
> > meta-rockchip, but rather be part of a meta-rauc-community/meta-rauc-rockchip
> > I hope to submit upstream at some point.
> > 
> > Basically rauc works with U-Boot via a boot script. To make that script more
> > flexible I'm borrowing a variable form meta-rockchip in the rauc U-Boot script
> > to actually do the booting of the kernel/fitImage/etc. So while U-Boot might
> > be smart enough to check a bunch of places looking for the thing to boot, the
> > rauc boot script isn't quite so smart. It's my script to write, and I could
> > add such logic, but that would just inflate the script for questionable gain.
> > 
> 
> This seems like you're not using extlinux.conf when using rauc but using one
> of the variables used to build the extlinux.conf to do some magic/logic in
> rauc?

I'm using sed to search and replace a tag in a U-Boot script template with
UBOOT_EXTLINUX_KERNEL_IMAGE which my U-Boot bbappend then turns into a U-Boot
script that handles the rauc A/B logic.

Specifically once it figures out whether to use A or B,
UBOOT_EXTLINUX_KERNEL_IMAGE is what is booted.

So keeping the initial "/boot/" part of UBOOT_EXTLINUX_KERNEL_IMAGE is useful
to me so the U-Boot script can find what it needs to boot in the filesystem
image. I could strip that prefix from the variable and include it as part of
the script template, but the current way provides the most flexibility. In
theory the fitImage could be located anywhere in the filesystem and the U-Boot
script would be able to find, load, and run it.
Quentin Schulz Feb. 22, 2024, 9:37 a.m. UTC | #7
Hi Trevor,

On 2/21/24 20:18, Trevor Woerner wrote:
> On Wed 2024-02-21 @ 07:31:17 PM, Quentin Schulz wrote:
>> Hi Trevor,
>>
>> On 2/18/24 18:28, Trevor Woerner wrote:
>>> On Fri 2024-02-16 @ 10:31:36 AM, Quentin Schulz wrote:
>>>>
>>>>
>>>> On 2/16/24 09:25, Trevor Woerner wrote:
>>>>> On Thu 2024-02-15 @ 06:45:59 PM, Quentin Schulz wrote:
>>>>>> Hi Trevor,
>>>>>>
>>>>>> On 2/12/24 21:23, Trevor Woerner via lists.yoctoproject.org wrote:
>>>> [...]
>>>>>>> +UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
>>>>>>
>>>>>> FWIW, I don't think /boot is required. bootstd/bootmeth in U-Boot (upstream
>>>>>> at the very least) will check for / and then /boot prefix for the paths in
>>>>>> extlinux.conf. Not providing /boot means if someone still wants to use a
>>>>>> separate boot partition, they wouldn't have to update this variable. But
>>>>>> since it's overridable, this is basically up to your preference.
>>>>>
>>>>> This is a good example of working ahead. The next thing I have queued up is
>>>>> a meta-rauc-rockchip example that works generically on all (most?) rockchip
>>>>> boards. As part of the U-Boot script I need to make the A/B logic work, it
>>>>> needs the "/boot" in there otherwise it doesn't work; therefore it's best to
>>>>> set it up properly now.
>>>>>
>>>>
>>>> Mmmm I'm interested to see why it fails without the /boot thing? Let's see
>>>> when we get patches :)
>>>
>>> I'm working on getting rauc working with meta-rockchip generically so it works
>>> with all the MACHINES in meta-rockchip. The patch won't be part of
>>> meta-rockchip, but rather be part of a meta-rauc-community/meta-rauc-rockchip
>>> I hope to submit upstream at some point.
>>>
>>> Basically rauc works with U-Boot via a boot script. To make that script more
>>> flexible I'm borrowing a variable form meta-rockchip in the rauc U-Boot script
>>> to actually do the booting of the kernel/fitImage/etc. So while U-Boot might
>>> be smart enough to check a bunch of places looking for the thing to boot, the
>>> rauc boot script isn't quite so smart. It's my script to write, and I could
>>> add such logic, but that would just inflate the script for questionable gain.
>>>
>>
>> This seems like you're not using extlinux.conf when using rauc but using one
>> of the variables used to build the extlinux.conf to do some magic/logic in
>> rauc?
> 
> I'm using sed to search and replace a tag in a U-Boot script template with
> UBOOT_EXTLINUX_KERNEL_IMAGE which my U-Boot bbappend then turns into a U-Boot
> script that handles the rauc A/B logic.
> 
> Specifically once it figures out whether to use A or B,
> UBOOT_EXTLINUX_KERNEL_IMAGE is what is booted.
> 
> So keeping the initial "/boot/" part of UBOOT_EXTLINUX_KERNEL_IMAGE is useful
> to me so the U-Boot script can find what it needs to boot in the filesystem
> image. I could strip that prefix from the variable and include it as part of
> the script template, but the current way provides the most flexibility. In
> theory the fitImage could be located anywhere in the filesystem and the U-Boot
> script would be able to find, load, and run it.

Would be nice if you had some code somewhere we could use as a base for 
discussion :)

FWIW, upstream U-Boot seems to have some interest using VBL/VBE for A/B 
mechanism, this seems to be pushed by Google? So maybe something to look 
there in the future.

Cheers,
Quentin
diff mbox series

Patch

diff --git a/conf/machine/include/rockchip-defaults.inc b/conf/machine/include/rockchip-defaults.inc
index 3ce2e246ab0b..2387eb909934 100644
--- a/conf/machine/include/rockchip-defaults.inc
+++ b/conf/machine/include/rockchip-defaults.inc
@@ -19,3 +19,5 @@  XSERVER = " \
 
 # misc
 SERIAL_CONSOLES ?= "1500000;ttyS2"
+RK_CONSOLE_BAUD ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[0]}"
+RK_CONSOLE_DEVICE ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[1].split()[0]}"
diff --git a/conf/machine/include/rockchip-extlinux.inc b/conf/machine/include/rockchip-extlinux.inc
new file mode 100644
index 000000000000..c73fb7d17e02
--- /dev/null
+++ b/conf/machine/include/rockchip-extlinux.inc
@@ -0,0 +1,10 @@ 
+UBOOT_EXTLINUX ?= "1"
+UBOOT_EXTLINUX_ROOT ?= "root=PARTLABEL=root"
+UBOOT_EXTLINUX_FDTDIR ?= ""
+UBOOT_EXTLINUX_CONSOLE ?= "console=tty1 console=${RK_CONSOLE_DEVICE},${RK_CONSOLE_BAUD}n8"
+UBOOT_EXTLINUX_KERNEL_ARGS ?= "rootwait rw rootfstype=ext4 earlycon"
+UBOOT_EXTLINUX_KERNEL_IMAGE ?= "/boot/${KERNEL_IMAGETYPE}"
+UBOOT_EXTLINUX_LABELS ?= "default"
+UBOOT_EXTLINUX_MENU_DESCRIPTION:default ?= "${MACHINE}"
+
+MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "u-boot-extlinux"
diff --git a/conf/machine/include/rockchip-wic.inc b/conf/machine/include/rockchip-wic.inc
index 67a8310f7d6a..cae14c90e1db 100644
--- a/conf/machine/include/rockchip-wic.inc
+++ b/conf/machine/include/rockchip-wic.inc
@@ -1,5 +1,7 @@ 
 # common meta-rockchip wic/wks items
 
+require conf/machine/include/rockchip-extlinux.inc
+
 SPL_BINARY ?= "idbloader.img"
 
 IMAGE_FSTYPES += "wic wic.bmap"
@@ -11,23 +13,8 @@  WKS_FILE_DEPENDS ?= " \
 	virtual/bootloader \
 	virtual/kernel \
 	"
-# KERNEL_DEVICETREE follows the pattern of 'rockchip/${SOC_FAMILY}-${BOARD}.dtb'
-# but is placed in the deploy directory as simply '${SOC_FAMILY}-${BOARD}.dtb'
-# therefore we have to strip off the 'rockchip/' for IMAGE_BOOT_FILES
-NONFITDT="${@d.getVar('KERNEL_DEVICETREE').split('/')[1]}"
-IMAGE_BOOT_FILES = " \
-	${KERNEL_IMAGETYPE} \
-	${@bb.utils.contains('KERNEL_IMAGETYPE', 'fitImage', '', '${NONFITDT}', d)} \
-	"
-
-# use the first-defined <baud>;<device> pair in SERIAL_CONSOLES
-# for the console parameter in the wks files
-RK_CONSOLE_BAUD ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[0]}"
-RK_CONSOLE_DEVICE ?= "${@d.getVar('SERIAL_CONSOLES').split(';')[1].split()[0]}"
 
 WICVARS:append = " \
-	RK_CONSOLE_BAUD \
-	RK_CONSOLE_DEVICE \
 	SPL_BINARY \
 	UBOOT_SUFFIX \
 	"
diff --git a/wic/rockchip.wks b/wic/rockchip.wks
index 8dc4d20f2f54..5d7701ef8a2e 100644
--- a/wic/rockchip.wks
+++ b/wic/rockchip.wks
@@ -28,7 +28,6 @@  part uboot_env  --offset 4064   --fixed-size 32K      --fstype=none
 part reserved2  --offset 4096   --fixed-size 4096K    --fstype=none
 part loader2    --offset 8192   --fixed-size 4096K    --fstype=none            --source rawcopy                                   --sourceparams="file=u-boot.${UBOOT_SUFFIX}"
 part atf        --offset 12288  --fixed-size 4096K    --fstype=none
-part /boot      --offset 16384  --size       114688K  --fstype=vfat  --active  --source bootimg-partition --label boot --use-uuid --sourceparams="loader=u-boot"
-part /                                                --fstype=ext4            --source rootfs            --label root --use-uuid
+part /          --offset 16384                        --fstype=ext4  --active  --source rootfs            --label root
 
-bootloader --ptable gpt --append="console=tty1 console=${RK_CONSOLE_DEVICE},${RK_CONSOLE_BAUD}n8 rw rootfstype=ext4 init=/sbin/init"
+bootloader --ptable gpt