u-boot: load a kernel that's in a ubi volume
Hi Joel,
Per our discussion, here are the details of what we’re trying to do and the things I’ve tried.
Goal: Have u-boot load a kernel that's in a ubi volume.
1. Added ubi support to uboot by adding the following macros to include/configs/ast-g5-ncsi.h temporarily for testing purposes (a new config header would probably need to be created for a final implementation):
| +#define CONFIG_CMD_UBI | +#define CONFIG_CMD_UBIFS | +#define CONFIG_RBTREE | +#define CONFIG_MTD_DEVICE | +#define CONFIG_MTD_PARTITIONS | +#define CONFIG_CMD_MTDPARTS | +#define CONFIG_LZO
2. Built a romulus image with the above u-boot change plus commit https://gerrit.openbmc-project.xyz/#/c/5812/ which is the top-most commit for a set of changes to remove the initramfs and create a flash image that builds the kernel and rootsfs into ubi volumes.
3. Used the generated obmc-phosphor-image-romulus.ubi.mtd to boot qemu.
4. To be able to use ubi in u-boot, the mtdparts and mtdids variables need to be set (reference: https://fossies.org/linux/qemu/roms/u-boot/doc/README.ubi).
Here is where I’ve been unable to get u-boot to recognize the existing mtd. I’ve tried multiple combinations for mtdids, such as nor0=bmc, nor0=<addr>.flash, etc etc. But when running “mtdparts” command from u-boot, or a ubi command, always get "Device nor0 not found!”. Ex:
ast# mtdparts
Device nor0 not found!
ast# ubi part kernel0
Device nor0 not found!
Error initializing mtdparts!
I’ve also taken a stab at adding the romulus device tree to u-boot to see if that may be the reason, by copying from the kernel and adding to u-boot the files arch/arm/dts/aspeed-g5.dtsi, aspeed-bmc-opp-flash-layout.dtsi, aspeed-bmc-opp-romulus.dts, and adding the dts to the Makefile. Also added a CONFIG_DEFAULT_DEVICE_TREE macro. This might not be the correct or complete way to add the device tree to the openbmc version of u-boot.
Let me know if you need additional details and thanks in advance for your insight.
Quoted 4 lines · anoo
Hi Joel,
Per our discussion, here are the details of what we’re trying to do and the things I’ve tried.
Thanks. I spent the afternoon attempting to recreate your results.
Quoted 7 lines
Goal: Have u-boot load a kernel that's in a ubi volume.
1. Added ubi support to uboot by adding the following macros to
include/configs/ast-g5-ncsi.htemporarily for testing purposes (a new config header would probably need to be created for a final implementation):
Quoted 7 lines
| +#define CONFIG_CMD_UBI | +#define CONFIG_CMD_UBIFS | +#define CONFIG_RBTREE | +#define CONFIG_MTD_DEVICE | +#define CONFIG_MTD_PARTITIONS | +#define CONFIG_CMD_MTDPARTS | +#define CONFIG_LZO
I replicated this. I noted that this increases the size of the u-boot image a lot:
Old size: 232632
New size: 358320
This is an extra 122kB, or a 54% increase in the u-boot size.
It does still fit in the partition we have, which is 384 KB.
Quoted 5 lines
2. Built a romulus image with the above u-boot change plus commit
https://gerrit.openbmc-project.xyz/#/c/5812/ which is the top-most commit for a set of changes to remove the initramfs and create a flash image that builds the kernel and rootsfs into ubi volumes.
Why Romulus? Isn't this work being done for Witherspoon?
Quoted 1 line
3. Used the generated obmc-phosphor-image-romulus.ubi.mtd to boot qemu.
What was the Qemu command line you used?
Can you share a mkfs.ubifs command line that I can use to create a ubi image?
When I tried to boot the image I downloaded from the gerrit job, none of the uboot commands you listed worked:
U-Boot 2016.07 (Jul 27 2017 - 21:13:25 +0000)
Watchdog enabled
DRAM: 496 MiB Flash: 32 MiB
*** Warning - bad CRC, using default environment
In: serial Out: serial Err: serial Net: aspeednic#0 Error: aspeednic#0 address not set.
Hit any key to stop autoboot: 0 libfdt fdt_check_header(): FDT_ERR_BADMAGIC Wrong Image Format for bootm command
ERROR: can't get kernel image!
ast# mtdparts
Unknown command 'mtdparts' - try 'help' ast# ubi part kernel0
Unknown command 'ubi' - try 'help'
Quoted 17 lines
4. To be able to use ubi in u-boot, the mtdparts and mtdids variables need to be set (reference:
https://fossies.org/linux/qemu/roms/u-boot/doc/README.ubi).Here is where I’ve been unable to get u-boot to recognize the existing mtd. I’ve tried multiple combinations for mtdids, such as nor0=bmc, nor0=<addr>.flash, etc etc. But when running “mtdparts” command from u-boot, or a ubi command, always get "Device nor0 not found!”. Ex:
ast# mtdparts
Device nor0 not found!ast# ubi part kernel0
Device nor0 not found!
Error initializing mtdparts!
Quoted 6 lines
I’ve also taken a stab at adding the romulus device tree to u-boot to see if that may be the reason, by copying from the kernel and adding to u-boot the files
arch/arm/dts/aspeed-g5.dtsi,aspeed-bmc-opp-flash-layout.dtsi,aspeed-bmc-opp-romulus.dts, and adding the dts to theMakefile. Also added aCONFIG_DEFAULT_DEVICE_TREEmacro. This might not be the correct or complete way to add the device tree to the openbmc version of u-boot.
Can you explain what you were trying to do there?
Cheers,
Joel
Quoted 26 lines · Joel Stanley
Quoted 4 lines · anoo
Hi Joel,
Per our discussion, here are the details of what we’re trying to do and the things I’ve tried.
Thanks. I spent the afternoon attempting to recreate your results.
Quoted 7 lines
Goal: Have u-boot load a kernel that's in a ubi volume.
1. Added ubi support to uboot by adding the following macros to
include/configs/ast-g5-ncsi.htemporarily for testing purposes (a new config header would probably need to be created for a final implementation):Quoted 7 lines
| +#define CONFIG_CMD_UBI | +#define CONFIG_CMD_UBIFS | +#define CONFIG_RBTREE | +#define CONFIG_MTD_DEVICE | +#define CONFIG_MTD_PARTITIONS | +#define CONFIG_CMD_MTDPARTS | +#define CONFIG_LZOI replicated this. I noted that this increases the size of the u-boot image a lot:
Quoted 6 lines
Old size: 232632
New size: 358320This is an extra 122kB, or a 54% increase in the u-boot size.
It does still fit in the partition we have, which is 384 KB.
Definitely something to keep in mind.
Quoted 8 lines
Quoted 6 lines
2. Built a romulus image with the above u-boot change plus commit
https://gerrit.openbmc-project.xyz/#/c/5812/ which is the top-most commit for a set of changes to remove the initramfs and create a flash image that builds the kernel and rootsfs into ubi volumes.Why Romulus? Isn't this work being done for Witherspoon?
Yeah, this is being done for witherspoon. I've tested with witherspoon as well but also Romulus in case there were device tree changes that needed to be done that's a smaller system.
Quoted 3 lines
Quoted 1 line
3. Used the generated obmc-phosphor-image-romulus.ubi.mtd to boot qemu.
What was the Qemu command line you used?
After cloning the openbmc/qemu repo and building (using as reference https://github.com/openbmc/docs/blob/master/cheatsheet.md#using-qemu):
./build/arm-softmmu/qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=/<path_to>/obmc-phosphor-image-romulus.ubi.mtd,format=raw,if=mtd -net nic -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostfwd=:127.0.0.1:2300-:3000,hostname=qemu
For witherspoon, I use the same command, just pointing to a withespoon image.
Quoted 2 lines
Can you share a mkfs.ubifs command line that I can use to create a ubi image?
You can create a config test file (named ubi.cfg in this example) in a directory where you have the kernel fit image fitImage-<system>.bin, ex:
$ cat ubi.cfg [kernel0] mode=ubi image=fitImage-<system>.bin vol_type=static vol_name=kernel0 vol_id=0
Then use ubinize command:
$ ubinize -p 64 -m 1 -o <outputfilename> ubi.cfg
The ubinize command is being added to the openbmc build with this commit: https://gerrit.openbmc-project.xyz/#/c/5801/3/meta-phosphor/classes/image_types_phosphor.bbclass
The rwfs is built with:
"UBIFS_RWFS_CMD = "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE}KiB rwfs.ubifs"
Then the ubi image is built with:
"ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg"
Quoted 3 lines
When I tried to boot the image I downloaded from the gerrit job, none of the uboot commands you listed worked:
An image needs to built with the u-boot changes that enable ubi, since that is not in gerrit. You'd need to build an openbmc image with the u-boot recipe pointing to a local u-boot repo that has the ubi macros enabled.
I'll pass you in a separate msg the image I have built.
Quoted 41 lines
U-Boot 2016.07 (Jul 27 2017 - 21:13:25 +0000)
Watchdog enabled
DRAM: 496 MiB Flash: 32 MiB*** Warning - bad CRC, using default environment
In: serial Out: serial Err: serial Net: aspeednic#0 Error: aspeednic#0 address not set.Hit any key to stop autoboot: 0 libfdt
fdt_check_header():FDT_ERR_BADMAGICWrong Image Format for bootm command
ERROR: can't get kernel image!
ast# mtdparts
Unknown command 'mtdparts' - try 'help' ast# ubi part kernel0
Unknown command 'ubi' - try 'help'Quoted 17 lines
4. To be able to use ubi in u-boot, the mtdparts and mtdids variables need to be set (reference:
https://fossies.org/linux/qemu/roms/u-boot/doc/README.ubi).Here is where I’ve been unable to get u-boot to recognize the existing mtd. I’ve tried multiple combinations for mtdids, such as nor0=bmc, nor0=<addr>.flash, etc etc. But when running “mtdparts” command from u-boot, or a ubi command, always get "Device nor0 not found!”. Ex:
ast# mtdparts
Device nor0 not found!ast# ubi part kernel0
Device nor0 not found!
Error initializing mtdparts!
Quoted 8 lines
Quoted 6 lines
I’ve also taken a stab at adding the romulus device tree to u-boot to see if that may be the reason, by copying from the kernel and adding to u-boot the files
arch/arm/dts/aspeed-g5.dtsi,aspeed-bmc-opp-flash-layout.dtsi,aspeed-bmc-opp-romulus.dts, and adding the dts to theMakefile. Also added aCONFIG_DEFAULT_DEVICE_TREEmacro. This might not be the correct or complete way to add the device tree to the openbmc version of u-boot.Can you explain what you were trying to do there?
I was trying to add the system device tree to u-boot. The device trees for the openbmc systems are defined in the kernel, but they may be required to be defined in u-boot for u-boot to find the mtd partitions.
Quoted 4 lines
Cheers,
Joel
I'm surprised you are putting the kernel in a bare UBI volume. AFAIK, U-Boot can load kernels from UBIFS. Why wouldn't you create a UBIFS volume for /boot and put the fitImage in there?
Quoted 186 lines · anoo
Quoted 32 lines · Joel Stanley
Quoted 6 lines · anoo
Hi Joel,
Per our discussion, here are the details of what we’re trying to do and the
things I’ve tried.Thanks. I spent the afternoon attempting to recreate your results.
Quoted 8 lines
Goal: Have u-boot load a kernel that's in a ubi volume.
1. Added ubi support to uboot by adding the following macros to
include/configs/ast-g5-ncsi.htemporarily for testing purposes (a new config
header would probably need to be created for a final implementation):Quoted 7 lines
| +#define CONFIG_CMD_UBI | +#define CONFIG_CMD_UBIFS | +#define CONFIG_RBTREE | +#define CONFIG_MTD_DEVICE | +#define CONFIG_MTD_PARTITIONS | +#define CONFIG_CMD_MTDPARTS | +#define CONFIG_LZOI replicated this. I noted that this increases the size of the u-boot image a lot:
Quoted 6 lines
Old size: 232632
New size: 358320This is an extra 122kB, or a 54% increase in the u-boot size.
It does still fit in the partition we have, which is 384 KB.
Definitely something to keep in mind.
Quoted 10 lines
Quoted 7 lines
2. Built a romulus image with the above u-boot change plus commit
https://gerrit.openbmc-project.xyz/#/c/5812/ which is the top-most commit for a set of changes to remove the initramfs and create a flash image that
builds the kernel and rootsfs into ubi volumes.Why Romulus? Isn't this work being done for Witherspoon?
Yeah, this is being done for witherspoon. I've tested with witherspoon as well but also Romulus in case there were device tree changes that needed to be done that's a smaller system.
Quoted 4 lines
Quoted 1 line
3. Used the generated obmc-phosphor-image-romulus.ubi.mtd to boot qemu.
What was the Qemu command line you used?
After cloning the openbmc/qemu repo and building (using as reference
https://github.com/openbmc/docs/blob/master/cheatsheet.md#using-qemu):./build/arm-softmmu/qemu-system-arm -m 256 -M romulus-bmc -nographic -drive file=/<path_to>/obmc-phosphor-image-romulus.ubi.mtd,format=raw,if=mtd -net
nic -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostfwd=:127.0.0.1:2300-:3000,hostname=qemuFor witherspoon, I use the same command, just pointing to a withespoon image.
Quoted 3 lines
Can you share a mkfs.ubifs command line that I can use to create a ubi image?
You can create a config test file (named ubi.cfg in this example) in a directory where you have the kernel fit image fitImage-<system>.bin, ex:
$ cat ubi.cfg [kernel0] mode=ubi image=fitImage-<system>.bin vol_type=static vol_name=kernel0 vol_id=0Then use ubinize command:
$ ubinize -p 64 -m 1 -o <outputfilename> ubi.cfgThe ubinize command is being added to the openbmc build with this commit:
https://gerrit.openbmc-project.xyz/#/c/5801/3/meta-phosphor/classes/image_types_phosphor.bbclassThe rwfs is built with:
"UBIFS_RWFS_CMD= "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE}KiB rwfs.ubifs"Then the ubi image is built with:
"ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg"Quoted 3 lines
When I tried to boot the image I downloaded from the gerrit job, none of the uboot commands you listed worked:
An image needs to built with the u-boot changes that enable ubi, since that is not in gerrit. You'd need to build an openbmc image with the u-boot recipe pointing to a local u-boot repo that has the ubi macros enabled.
I'll pass you in a separate msg the image I have built.
Quoted 56 lines
U-Boot 2016.07 (Jul 27 2017 - 21:13:25 +0000)
Watchdog enabled
DRAM: 496 MiB Flash: 32 MiB*** Warning - bad CRC, using default environment
In: serial Out: serial Err: serial Net: aspeednic#0 Error: aspeednic#0 address not set.Hit any key to stop autoboot: 0 libfdt
fdt_check_header():FDT_ERR_BADMAGICWrong Image Format for bootm command
ERROR: can't get kernel image!
ast# mtdparts
Unknown command 'mtdparts' - try 'help' ast# ubi part kernel0
Unknown command 'ubi' - try 'help'Quoted 20 lines
4. To be able to use ubi in u-boot, the mtdparts and mtdids variables need
to be set (reference:
https://fossies.org/linux/qemu/roms/u-boot/doc/README.ubi).Here is where I’ve been unable to get u-boot to recognize the existing mtd.
I’ve tried multiple combinations for mtdids, such as nor0=bmc, nor0=<addr>.flash, etc etc. But when running “mtdparts” command from u-boot,
or a ubi command, always get "Device nor0 not found!”. Ex:ast# mtdparts
Device nor0 not found!ast# ubi part kernel0
Device nor0 not found!
Error initializing mtdparts!Quoted 10 lines
I’ve also taken a stab at adding the romulus device tree to u-boot to see if
that may be the reason, by copying from the kernel and adding to u-boot the
filesarch/arm/dts/aspeed-g5.dtsi,aspeed-bmc-opp-flash-layout.dtsi,aspeed-bmc-opp-romulus.dts, and adding the dts to theMakefile. Also added aCONFIG_DEFAULT_DEVICE_TREEmacro. This might not be the correct or complete
way to add the device tree to the openbmc version of u-boot.Quoted 1 line
Can you explain what you were trying to do there?
I was trying to add the system device tree to u-boot. The device trees for the openbmc systems are defined in the kernel, but they may be required to be defined in u-boot for u-boot to find the mtd partitions.
Quoted 4 lines
Cheers,
Joel
Milton got mtdparts working by enabling the macro CONFIG_FLASH_CFI_MTD plus the u-boot patch I just sent to the mailing list.
Something to discuss would be where to add the UBI and MTD macros (instead of ast-g5-ncsi.h). Perhaps a new header file but maybe not generic a generic base one so that it's off by default.
Quoted 3 lines · Rick Altherr
I'm surprised you are putting the kernel in a bare UBI volume. AFAIK, U-Boot can load kernels from UBIFS. Why wouldn't you create a UBIFS volume for /boot and put the fitImage in there?
Is there an advantage with UBIFS? Talking with Milton there’s no need to access it during runtime, and we’d just have a couple kernels as static volumes.
Quoted 189 lines · anoo
Quoted 188 lines · Joel Stanley
Quoted 32 lines · anoo
Quoted 6 lines
Hi Joel,
Per our discussion, here are the details of what we’re trying to do and the
things I’ve tried.Thanks. I spent the afternoon attempting to recreate your results.
Quoted 8 lines
Goal: Have u-boot load a kernel that's in a ubi volume.
1. Added ubi support to uboot by adding the following macros to
include/configs/ast-g5-ncsi.htemporarily for testing purposes (a new config
header would probably need to be created for a final implementation):Quoted 7 lines
| +#define CONFIG_CMD_UBI | +#define CONFIG_CMD_UBIFS | +#define CONFIG_RBTREE | +#define CONFIG_MTD_DEVICE | +#define CONFIG_MTD_PARTITIONS | +#define CONFIG_CMD_MTDPARTS | +#define CONFIG_LZOI replicated this. I noted that this increases the size of the u-boot image a lot:
Quoted 6 lines
Old size: 232632
New size: 358320This is an extra 122kB, or a 54% increase in the u-boot size.
It does still fit in the partition we have, which is 384 KB.
Definitely something to keep in mind.
Quoted 10 lines
Quoted 7 lines
2. Built a romulus image with the above u-boot change plus commit
https://gerrit.openbmc-project.xyz/#/c/5812/ which is the top-most commit for a set of changes to remove the initramfs and create a flash image that
builds the kernel and rootsfs into ubi volumes.Why Romulus? Isn't this work being done for Witherspoon?
Yeah, this is being done for witherspoon. I've tested with witherspoon as well but also Romulus in case there were device tree changes that needed to be done that's a smaller system.
Quoted 4 lines
Quoted 1 line
3. Used the generated obmc-phosphor-image-romulus.ubi.mtd to boot qemu.
What was the Qemu command line you used?
After cloning the openbmc/qemu repo and building (using as reference
https://github.com/openbmc/docs/blob/master/cheatsheet.md#using-qemu):./build/arm-softmmu/qemu-system-arm -m 256 -M romulus-bmc -nographic
-drive
file=/<path_to>/obmc-phosphor-image-romulus.ubi.mtd,format=raw,if=mtd
-net
nic -net user,hostfwd=:127.0.0.1:2222-:22,hostfwd=:127.0.0.1:2443-:443,hostfwd=:127.0.0.1:2300-:3000,hostname=qemuFor witherspoon, I use the same command, just pointing to a withespoon image.
Quoted 3 lines
Can you share a mkfs.ubifs command line that I can use to create a ubi image?
You can create a config test file (named ubi.cfg in this example) in a directory where you have the kernel fit image fitImage-<system>.bin, ex:
$ cat ubi.cfg [kernel0] mode=ubi image=fitImage-<system>.bin vol_type=static vol_name=kernel0 vol_id=0Then use ubinize command:
$ ubinize -p 64 -m 1 -o <outputfilename> ubi.cfgThe ubinize command is being added to the openbmc build with this commit:
https://gerrit.openbmc-project.xyz/#/c/5801/3/meta-phosphor/classes/image_types_phosphor.bbclassThe rwfs is built with:
"UBIFS_RWFS_CMD= "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE}KiB rwfs.ubifs"Then the ubi image is built with:
"ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg"Quoted 3 lines
When I tried to boot the image I downloaded from the gerrit job, none of the uboot commands you listed worked:
An image needs to built with the u-boot changes that enable ubi, since that is not in gerrit. You'd need to build an openbmc image with the u-boot recipe pointing to a local u-boot repo that has the ubi macros enabled.
I'll pass you in a separate msg the image I have built.
Quoted 56 lines
U-Boot 2016.07 (Jul 27 2017 - 21:13:25 +0000)
Watchdog enabled
DRAM: 496 MiB Flash: 32 MiB*** Warning - bad CRC, using default environment
In: serial Out: serial Err: serial Net: aspeednic#0 Error: aspeednic#0 address not set.Hit any key to stop autoboot: 0 libfdt
fdt_check_header():FDT_ERR_BADMAGICWrong Image Format for bootm command
ERROR: can't get kernel image!
ast# mtdparts
Unknown command 'mtdparts' - try 'help' ast# ubi part kernel0
Unknown command 'ubi' - try 'help'Quoted 20 lines
4. To be able to use ubi in u-boot, the mtdparts and mtdids variables need
to be set (reference:
https://fossies.org/linux/qemu/roms/u-boot/doc/README.ubi).Here is where I’ve been unable to get u-boot to recognize the existing mtd.
I’ve tried multiple combinations for mtdids, such as nor0=bmc, nor0=<addr>.flash, etc etc. But when running “mtdparts” command from u-boot,
or a ubi command, always get "Device nor0 not found!”. Ex:ast# mtdparts
Device nor0 not found!ast# ubi part kernel0
Device nor0 not found!
Error initializing mtdparts!Quoted 10 lines
I’ve also taken a stab at adding the romulus device tree to u-boot to see if
that may be the reason, by copying from the kernel and adding to u-boot the
filesarch/arm/dts/aspeed-g5.dtsi,aspeed-bmc-opp-flash-layout.dtsi,aspeed-bmc-opp-romulus.dts, and adding the dts to theMakefile. Also added aCONFIG_DEFAULT_DEVICE_TREEmacro. This might not be the correct or complete
way to add the device tree to the openbmc version of u-boot.Quoted 1 line
Can you explain what you were trying to do there?
I was trying to add the system device tree to u-boot. The device trees for the openbmc systems are defined in the kernel, but they may be required to be defined in u-boot for u-boot to find the mtd partitions.
Quoted 4 lines
Cheers,
Joel