[OE-core] [PATCH] kernel-fitimage: add initramfs support

Marek Vasut marex at denx.de
Thu May 26 18:32:01 UTC 2016


On 05/26/2016 03:53 PM, George McCollister wrote:
> On Wed, May 25, 2016 at 5:33 PM, Marek Vasut <marex at denx.de> wrote:
>> On 05/25/2016 01:25 AM, George McCollister wrote:
>>> If INITRAMFS_IMAGE is set, build an additional fitImage containing the
>>> initramfs. Copy the additional fitImage and the source .its file used to
>>> create it to DEPLOYDIR. The fitImage containing the initramfs must be
>>> built before do_deploy and after do_install to avoid circular dependencies.
>>
>> Yes, the circular dep is quite nasty.
>>
>>> UBOOT_RD_LOADADDRESS - Specifies the load address used by u-boot for the
>>>                        initramfs.
>>> UBOOT_RD_ENTRYPOINT  - Specifies the entry point used by u-boot for the
>>>                        initramfs.
>>>
>>> Signed-off-by: George McCollister <george.mccollister at gmail.com>
>>> ---
>>>  meta/classes/kernel-fitimage.bbclass | 275 +++++++++++++++++++++++------------
>>>  1 file changed, 180 insertions(+), 95 deletions(-)
>>>
>>> diff --git a/meta/classes/kernel-fitimage.bbclass b/meta/classes/kernel-fitimage.bbclass
>>> index 298eda2..2c2a642 100644
>>> --- a/meta/classes/kernel-fitimage.bbclass
>>> +++ b/meta/classes/kernel-fitimage.bbclass
>>> @@ -14,7 +14,7 @@ python __anonymous () {
>>>
>>>          image = d.getVar('INITRAMFS_IMAGE', True)
>>>          if image:
>>> -            d.appendVarFlag('do_assemble_fitimage', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
>>> +            d.appendVarFlag('do_assemble_fitimage_initramfs', 'depends', ' ${INITRAMFS_IMAGE}:do_image_complete')
>>>
>>>          # Verified boot will sign the fitImage and append the public key to
>>>          # U-boot dtb. We ensure the U-Boot dtb is deployed before assembling
>>> @@ -30,8 +30,9 @@ UBOOT_MKIMAGE_DTCOPTS ??= ""
>>>  #
>>>  # Emit the fitImage ITS header
>>>  #
>>> +# $1 ... .its filename
>>>  fitimage_emit_fit_header() {
>>> -     cat << EOF >> fit-image.its
>>> +     cat << EOF >> ${1}
>>>  /dts-v1/;
>>>
>>>  / {
>>> @@ -43,32 +44,33 @@ EOF
>>>  #
>>>  # Emit the fitImage section bits
>>>  #
>>> -# $1 ... Section bit type: imagestart - image section start
>>> +# $1 ... .its filename
>>> +# $2 ... Section bit type: imagestart - image section start
>>>  #                          confstart  - configuration section start
>>>  #                          sectend    - section end
>>>  #                          fitend     - fitimage end
>>>  #
>>>  fitimage_emit_section_maint() {
>>> -     case $1 in
>>> +     case $2 in
>>>       imagestart)
>>> -             cat << EOF >> fit-image.its
>>> +             cat << EOF >> ${1}
>>>
>>>          images {
>>>  EOF
>>>       ;;
>>>       confstart)
>>> -             cat << EOF >> fit-image.its
>>> +             cat << EOF >> ${1}
>>>
>>>          configurations {
>>>  EOF
>>>       ;;
>>>       sectend)
>>> -             cat << EOF >> fit-image.its
>>> +             cat << EOF >> ${1}
>>>       };
>>>  EOF
>>>       ;;
>>>       fitend)
>>> -             cat << EOF >> fit-image.its
>>> +             cat << EOF >> ${1}
>>>  };
>>>  EOF
>>>       ;;
>>
>> OK
>>
>>> @@ -78,9 +80,10 @@ EOF
>>>  #
>>>  # Emit the fitImage ITS kernel section
>>>  #
>>> -# $1 ... Image counter
>>> -# $2 ... Path to kernel image
>>> -# $3 ... Compression type
>>> +# $1 ... .its filename
>>> +# $2 ... Image counter
>>> +# $3 ... Path to kernel image
>>> +# $4 ... Compression type
>>>  fitimage_emit_section_kernel() {
>>>
>>>       kernel_csum="sha1"
>>> @@ -88,17 +91,17 @@ fitimage_emit_section_kernel() {
>>>       ENTRYPOINT=${UBOOT_ENTRYPOINT}
>>>       if test -n "${UBOOT_ENTRYSYMBOL}"; then
>>>               ENTRYPOINT=`${HOST_PREFIX}nm ${S}/vmlinux | \
>>> -                     awk '$3=="${UBOOT_ENTRYSYMBOL}" {print $1}'`
>>> +                     awk '$4=="${UBOOT_ENTRYSYMBOL}" {print $2}'`
>>>       fi
>>>
>>> -     cat << EOF >> fit-image.its
>>> -                kernel@${1} {
>>> +     cat << EOF >> ${1}
>>> +                kernel@${2} {
>>>                          description = "Linux kernel";
>>> -                        data = /incbin/("${2}");
>>> +                        data = /incbin/("${3}");
>>>                          type = "kernel";
>>>                          arch = "${UBOOT_ARCH}";
>>>                          os = "linux";
>>> -                        compression = "${3}";
>>> +                        compression = "${4}";
>>>                          load = <${UBOOT_LOADADDRESS}>;
>>>                          entry = <${ENTRYPOINT}>;
>>>                          hash at 1 {
>>
>> OK
>>
>>> @@ -111,16 +114,17 @@ EOF
>>>  #
>>>  # Emit the fitImage ITS DTB section
>>>  #
>>> -# $1 ... Image counter
>>> -# $2 ... Path to DTB image
>>> +# $1 ... .its filename
>>> +# $2 ... Image counter
>>> +# $3 ... Path to DTB image
>>>  fitimage_emit_section_dtb() {
>>>
>>>       dtb_csum="sha1"
>>>
>>> -     cat << EOF >> fit-image.its
>>> -                fdt@${1} {
>>> +     cat << EOF >> ${1}
>>> +                fdt@${2} {
>>>                          description = "Flattened Device Tree blob";
>>> -                        data = /incbin/("${2}");
>>> +                        data = /incbin/("${3}");
>>>                          type = "flat_dt";
>>>                          arch = "${UBOOT_ARCH}";
>>>                          compression = "none";
>>
>> OK
>>
>>> @@ -132,10 +136,39 @@ EOF
>>>  }
>>>
>>>  #
>>> +# Emit the fitImage ITS ramdisk section
>>> +#
>>> +# $1 ... .its filename
>>> +# $2 ... Image counter
>>> +# $3 ... Path to ramdisk image
>>> +fitimage_emit_section_ramdisk() {
>>> +
>>> +     ramdisk_csum="sha1"
>>> +
>>> +     cat << EOF >> ${1}
>>> +                ramdisk@${2} {
>>> +                        description = "ramdisk image";
>>> +                        data = /incbin/("${3}");
>>> +                        type = "ramdisk";
>>> +                        arch = "${UBOOT_ARCH}";
>>> +                        os = "linux";
>>
>> Do you need to set this for ramdisk ?
> Without it, I get this error when trying to boot:
> ## Loading ramdisk from FIT Image at 82000000 ...
>   Using 'conf at 1' configuration
>   Trying 'ramdisk at 1' ramdisk subimage
>     Description:  ramdisk image
>     Type:         RAMDisk Image
>     Compression:  uncompressed
>     Data Start:   0x8250d3cc
>     Data Size:    5395968 Bytes = 5.1 MiB
>     Architecture: ARM
>     OS:           Unknown OS
>     Load Address: 0x81000000
>     Entry Point:  0x81000000
>     Hash algo:    sha1
>     Hash value:   d5a83229e5d045a685d03419f5495d2eab7513a7
>   Verifying Hash Integrity ... sha1+ OK
> No Unknown OS ARM RAMDisk Image Image
> Ramdisk image is corrupt or invalid

Oh, hmmmm, that's not great but it does make sense. Thanks for checking!

>>> +                        compression = "none";
>>> +                        load = <${UBOOT_RD_LOADADDRESS}>;
>>> +                        entry = <${UBOOT_RD_ENTRYPOINT}>;
>>> +                        hash at 1 {
>>> +                                algo = "${ramdisk_csum}";
>>> +                        };
>>> +                };
>>> +EOF
>>> +}
>>> +
>>> +#
>>>  # Emit the fitImage ITS configuration section
>>>  #
>>> -# $1 ... Linux kernel ID
>>> -# $2 ... DTB image ID
>>> +# $1 ... .its filename
>>> +# $2 ... Linux kernel ID
>>> +# $3 ... DTB image ID
>>> +# $4 ... ramdisk ID
>>>  fitimage_emit_section_config() {
>>>
>>>       conf_csum="sha1"
>>> @@ -144,21 +177,29 @@ fitimage_emit_section_config() {
>>>       fi
>>>
>>>       # Test if we have any DTBs at all
>>> -     if [ -z "${2}" ] ; then
>>> +     if [ -z "${3}" ] ; then
>>>               conf_desc="Boot Linux kernel"
>>>               fdt_line=""
>>> -     else
>>> +             ramdisk_line=""
>>> +     elif [ -z "${4}" ]; then
>>>               conf_desc="Boot Linux kernel with FDT blob"
>>> -             fdt_line="fdt = \"fdt@${2}\";"
>>> +             fdt_line="fdt = \"fdt@${3}\";"
>>> +             ramdisk_line=""
>>> +     else
>>> +             # TODO - handle ramdisk without FDT blob
>>
>> I really don't like the todo here :) Maybe you can check if the DT image
>> ends with .dtb or not to discern ramdisk and DT ?
> Okay, this should be taken care of. See incoming v2 patch.

Thanks!

>>> +             conf_desc="Boot Linux kernel with FDT blob, ramdisk"
>>> +             fdt_line="fdt = \"fdt@${3}\";"
>>> +             ramdisk_line="ramdisk = \"ramdisk@${4}\";"
>>>       fi
>>> -     kernel_line="kernel = \"kernel@${1}\";"
>>> +     kernel_line="kernel = \"kernel@${2}\";"
>>>
>>> -     cat << EOF >> fit-image.its
>>> +     cat << EOF >> ${1}
>>>                  default = "conf at 1";
>>>                  conf at 1 {
>>>                          description = "${conf_desc}";
>>>                       ${kernel_line}
>>>                       ${fdt_line}
>>> +                     ${ramdisk_line}
>>>                          hash at 1 {
>>>                                  algo = "${conf_csum}";
>>>                          };
>>> @@ -166,102 +207,131 @@ EOF
>>>
>>>       if [ ! -z "${conf_sign_keyname}" ] ; then
>>>
>>> -             if [ -z "${2}" ] ; then
>>> +             if [ -z "${3}" ] ; then
>>>                       sign_line="sign-images = \"kernel\";"
>>> -             else
>>> +             elif [ -z "${4}" ]; then
>>>                       sign_line="sign-images = \"fdt\", \"kernel\";"
>>> +             else
>>> +                     sign_line="sign-images = \"ramdisk\", \"fdt\", \"kernel\";"
>>>               fi
>>>
>>> -             cat << EOF >> fit-image.its
>>> +             cat << EOF >> ${1}
>>>                          signature at 1 {
>>>                                  algo = "${conf_csum},rsa2048";
>>>                                  key-name-hint = "${conf_sign_keyname}";
>>> -                                sign-images = "fdt", "kernel";
>>> +                                ${sign_line}
>>>                          };
>>>  EOF
>>>       fi
>>>
>>> -     cat << EOF >> fit-image.its
>>> +     cat << EOF >> ${1}
>>>                  };
>>
>> OK
>>
>>>  EOF
>>>  }
>>>
>>> -do_assemble_fitimage() {
>>> -     if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then
>>> -             kernelcount=1
>>> -             dtbcount=""
>>> -             rm -f fit-image.its arch/${ARCH}/boot/fitImage
>>> -
>>> -             fitimage_emit_fit_header
>>> -
>>> -             #
>>> -             # Step 1: Prepare a kernel image section.
>>> -             #
>>> -             fitimage_emit_section_maint imagestart
>>> -
>>> -             uboot_prep_kimage
>>> -             fitimage_emit_section_kernel "${kernelcount}" linux.bin "${linux_comp}"
>>> -
>>> -             #
>>> -             # Step 2: Prepare a DTB image section
>>> -             #
>>> -             if test -n "${KERNEL_DEVICETREE}"; then
>>> -                     dtbcount=1
>>> -                     for DTB in ${KERNEL_DEVICETREE}; do
>>> -                             if echo ${DTB} | grep -q '/dts/'; then
>>> -                                     bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
>>> -                                     DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>>> -                             fi
>>> -                             DTB_PATH="arch/${ARCH}/boot/dts/${DTB}"
>>> -                             if [ ! -e "${DTB_PATH}" ]; then
>>> -                                     DTB_PATH="arch/${ARCH}/boot/${DTB}"
>>> -                             fi
>>> -
>>> -                             fitimage_emit_section_dtb ${dtbcount} ${DTB_PATH}
>>> -                             dtbcount=`expr ${dtbcount} + 1`
>>> -                     done
>>> -             fi
>>> +#
>>> +# Assemble fitImage
>>> +#
>>> +# $1 ... .its filename
>>> +# $2 ... fitImage name
>>> +# $3 ... include ramdisk
>>> +fitimage_assemble() {
>>> +     kernelcount=1
>>> +     dtbcount=""
>>> +     ramdiskcount=${3}
>>> +     rm -f ${1} arch/${ARCH}/boot/${2}
>>> +
>>> +     fitimage_emit_fit_header ${1}
>>> +
>>> +     #
>>> +     # Step 1: Prepare a kernel image section.
>>> +     #
>>> +     fitimage_emit_section_maint ${1} imagestart
>>> +
>>> +     uboot_prep_kimage
>>> +     fitimage_emit_section_kernel ${1} "${kernelcount}" linux.bin "${linux_comp}"
>>> +
>>> +     #
>>> +     # Step 2: Prepare a DTB image section
>>> +     #
>>> +     if test -n "${KERNEL_DEVICETREE}"; then
>>> +             dtbcount=1
>>> +             for DTB in ${KERNEL_DEVICETREE}; do
>>> +                     if echo ${DTB} | grep -q '/dts/'; then
>>> +                             bbwarn "${DTB} contains the full path to the the dts file, but only the dtb name should be used."
>>> +                             DTB=`basename ${DTB} | sed 's,\.dts$,.dtb,g'`
>>> +                     fi
>>> +                     DTB_PATH="arch/${ARCH}/boot/dts/${DTB}"
>>> +                     if [ ! -e "${DTB_PATH}" ]; then
>>> +                             DTB_PATH="arch/${ARCH}/boot/${DTB}"
>>> +                     fi
>>> +
>>> +                     fitimage_emit_section_dtb ${1} ${dtbcount} ${DTB_PATH}
>>> +                     dtbcount=`expr ${dtbcount} + 1`
>>> +             done
>>> +     fi
>>>
>>> -             fitimage_emit_section_maint sectend
>>> +     #
>>> +     # Step 3: Prepare a ramdisk section.
>>> +     #
>>> +     if [ "x${ramdiskcount}" = "x1" ] ; then
>>> +             copy_initramfs
>>> +             fitimage_emit_section_ramdisk ${1} "${ramdiskcount}" ${B}/usr/${INITRAMFS_IMAGE}-${MACHINE}.cpio
>>> +     fi
>>>
>>> -             # Force the first Kernel and DTB in the default config
>>> -             kernelcount=1
>>> -             dtbcount=1
>>> +     fitimage_emit_section_maint ${1} sectend
>>> +
>>> +     # Force the first Kernel and DTB in the default config
>>> +     kernelcount=1
>>> +     dtbcount=1
>>>
>>> -             #
>>> -             # Step 3: Prepare a configurations section
>>> -             #
>>> -             fitimage_emit_section_maint confstart
>>> +     #
>>> +     # Step 4: Prepare a configurations section
>>> +     #
>>> +     fitimage_emit_section_maint ${1} confstart
>>>
>>> -             fitimage_emit_section_config ${kernelcount} ${dtbcount}
>>> +     fitimage_emit_section_config ${1} ${kernelcount} ${dtbcount} ${ramdiskcount}
>>>
>>> -             fitimage_emit_section_maint sectend
>>> +     fitimage_emit_section_maint ${1} sectend
>>>
>>> -             fitimage_emit_section_maint fitend
>>> +     fitimage_emit_section_maint ${1} fitend
>>>
>>> -             #
>>> -             # Step 4: Assemble the image
>>> -             #
>>> +     #
>>> +     # Step 5: Assemble the image
>>> +     #
>>> +     uboot-mkimage \
>>> +             ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
>>> +             -f ${1} \
>>> +             arch/${ARCH}/boot/${2}
>>> +
>>> +     #
>>> +     # Step 6: Sign the image and add public key to U-Boot dtb
>>> +     #
>>> +     if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
>>>               uboot-mkimage \
>>>                       ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
>>> -                     -f fit-image.its \
>>> -                     arch/${ARCH}/boot/fitImage
>>> -
>>> -             #
>>> -             # Step 5: Sign the image and add public key to U-Boot dtb
>>> -             #
>>> -             if [ "x${UBOOT_SIGN_ENABLE}" = "x1" ] ; then
>>> -                     uboot-mkimage \
>>> -                             ${@'-D "${UBOOT_MKIMAGE_DTCOPTS}"' if len('${UBOOT_MKIMAGE_DTCOPTS}') else ''} \
>>> -                             -F -k "${UBOOT_SIGN_KEYDIR}" \
>>> -                             -K "${DEPLOY_DIR_IMAGE}/${UBOOT_DTB_BINARY}" \
>>> -                             -r arch/${ARCH}/boot/fitImage
>>> -             fi
>>> +                     -F -k "${UBOOT_SIGN_KEYDIR}" \
>>> +                     -K "${DEPLOY_DIR_IMAGE}/${UBOOT_DTB_BINARY}" \
>>> +                     -r arch/${ARCH}/boot/${2}
>>> +     fi
>>> +}
>>> +
>>> +do_assemble_fitimage() {
>>> +     if test "x${KERNEL_IMAGETYPE}" = "xfitImage" ; then
>>> +             fitimage_assemble fit-image.its fitImage
>>>       fi
>>>  }
>>>
>>>  addtask assemble_fitimage before do_install after do_compile
>>>
>>> +do_assemble_fitimage_initramfs() {
>>> +     if test "x${KERNEL_IMAGETYPE}" = "xfitImage" -a -n "${INITRAMFS_IMAGE}" ; then
>>> +             fitimage_assemble fit-image-${INITRAMFS_IMAGE}.its fitImage-${INITRAMFS_IMAGE} 1
>>> +     fi
>>> +}
>>> +
>>> +addtask assemble_fitimage_initramfs before do_deploy after do_install
>>> +
>>>  kernel_do_deploy[vardepsexclude] = "DATETIME"
>>>  kernel_do_deploy_append() {
>>>       # Update deploy directory
>>> @@ -275,8 +345,23 @@ kernel_do_deploy_append() {
>>>               linux_bin_symlink_name=${KERNEL_IMAGETYPE}-linux.bin-${MACHINE}
>>>               install -m 0644 linux.bin ${DEPLOYDIR}/${linux_bin_base_name}.bin
>>>
>>> +             if [ -n "${INITRAMFS_IMAGE}" ]; then
>>> +                     echo "Copying fit-image-${INITRAMFS_IMAGE}.its source file..."
>>> +                     its_initramfs_base_name="${KERNEL_IMAGETYPE}-its-${INITRAMFS_IMAGE}-${PV}-${PR}-${MACHINE}-${DATETIME}"
>>> +                     its_initramfs_symlink_name=${KERNEL_IMAGETYPE}-its-${INITRAMFS_IMAGE}-${MACHINE}
>>> +                     install -m 0644 fit-image-${INITRAMFS_IMAGE}.its ${DEPLOYDIR}/${its_initramfs_base_name}.its
>>> +                     fit_initramfs_base_name="${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${PV}-${PR}-${MACHINE}-${DATETIME}"
>>> +                     fit_initramfs_symlink_name=${KERNEL_IMAGETYPE}-${INITRAMFS_IMAGE}-${MACHINE}
>>> +                     install -m 0644 arch/${ARCH}/boot/fitImage-${INITRAMFS_IMAGE} ${DEPLOYDIR}/${fit_initramfs_base_name}.bin
>>> +             fi
>>> +
>>>               cd ${DEPLOYDIR}
>>>               ln -sf ${its_base_name}.its ${its_symlink_name}.its
>>>               ln -sf ${linux_bin_base_name}.bin ${linux_bin_symlink_name}.bin
>>> +
>>> +             if [ -n "${INITRAMFS_IMAGE}" ]; then
>>> +                     ln -sf ${its_initramfs_base_name}.its ${its_initramfs_symlink_name}.its
>>> +                     ln -sf ${fit_initramfs_base_name}.bin ${fit_initramfs_symlink_name}.bin
>>> +             fi
>>>       fi
>>>  }
>>>
>> Cool stuff, thanks!
>>
>> --
>> Best regards,
>> Marek Vasut


-- 
Best regards,
Marek Vasut



More information about the Openembedded-core mailing list