File uboot-image-setup.in of Package JeOS

#!/bin/bash

set -x

flavor=FLAVOR
target=TARGET
kerneladdr=
ramdiskaddr=
bootkernel=BOOTKERNEL

# Kiwi 9.x
# Filesystem will be ext4 or btrfs
filesystem=$1
# Boot part ID is the partition number where boot/ folder go. It is generaly 2.
boot_part_id=$2


case $target in
  firstboot)
    conf=boot/boot.script
    binconf=boot/boot.scr
    kernel=boot/zImage
    initrd=boot/initrd
    # the kernel command line is already prepopulated by KIWI
    bootargs=
    # Kiwi 9.x
    source etc/default/grub
    source etc/sysconfig/bootloader
    # kiwi 9.14.2 switched from GRUB_CMDLINE_LINUX to GRUB_CMDLINE_LINUX_DEFAULT in commit 8c916de to fix bsc#1084117
    # and in recent kiwi, GRUB_CMDLINE_LINUX_DEFAULT misses root="xyz" - boo#1167565, so use DEFAULT_APPEND, if available
    if [ -n "$DEFAULT_APPEND" ]; then
            bootargs="$DEFAULT_APPEND"
    elif [ -z "$GRUB_CMDLINE_LINUX" ]; then
	    bootargs="$GRUB_CMDLINE_LINUX_DEFAULT"
    else
	    bootargs="$GRUB_CMDLINE_LINUX"
    fi
    ;;
  boot)
    hookName=$1     # name of hook script calling this code
    mountPrefix=$2  # mount path of the image
    destsPrefix=$3  # base dir for the config files
    unum=$4         # boot partition ID
    rdev=$5         # root partition
    ufix=$6         # title postfix
    swap=$7         # optional swap partition
    conf=$destsPrefix/boot/boot.script
    binconf=$destsPrefix/boot/boot.script

    #======================================
    # make sure conf dir exists
    #--------------------------------------
    mkdir -p $destsPrefix/boot
    #======================================
    # check for device by ID
    #--------------------------------------
    local diskByID=`getDiskID $rdev`
    local swapByID=`getDiskID $swap swap`
    #======================================
    # check for system image .profile
    #--------------------------------------
    if [ -f $mountPrefix/image/.profile ];then
        importFile < $mountPrefix/image/.profile
    fi
    #======================================
    # check for kernel options
    #--------------------------------------
    if [ ! -z "$kiwi_cmdline" ];then
        KIWI_KERNEL_OPTIONS="$KIWI_KERNEL_OPTIONS $kiwi_cmdline"
    fi

    # /.../
    # On other systems which supports a boot menu we add
    # the linux kernel and initrd with its file names
    # like this:
    #
    #   kernel=`echo $i | cut -f1 -d:`
    #   initrd=`echo $i | cut -f2 -d:`
    #
    # But on arm systems there can only be one kernel because
    # uboot doesn't support a menu. Thus perl-bootloader also
    # doesn't support updating the uboot configuration and
    # that's the reason why we use the links created by
    # mkinitrd to point to the kernel and initrd in order
    # to support kernel updates
    # ----
    kernel=uImage
    initrd=initrd

    # gather kernel command line
    bootargs="root=$diskByID loader=$loader"
    if [ "$imageDiskDevice" ];then
        bootargs="$bootargs disk=$(getDiskID $imageDiskDevice)"
    fi
    if [ "$swap" ];then
        bootargs="$bootargs resume=$swapByID"
    fi
    if [ "$haveLVM" = "yes" ];then
        bootargs="$bootargs VGROUP=$VGROUP"
    fi
    bootargs="$bootargs $KIWI_INITRD_PARAMS"
    bootargs="$bootargs $KIWI_KERNEL_OPTIONS"

    # start with a fresh config
    true > $conf
    ;;
  *)
    echo "Unknown target $target" >&2
    exit 1
    ;;
esac

bootdevs=mmc
units="0"
bootparts='${unit}:'$boot_part_id
boottype=bootz
[ `uname -m` = "aarch64" ] && boottype=booti
setdev='mmc dev ${unit}'
sizeprefix=0x
fdtfolder=boot/dtb
fs=ext2
initrd_high=0xffffffff
fdt_high=0xffffffff
# To display a splash file, we need a working display, an uncompressed BMP file and 'bmp' commands
should_use_splashfile=0
splashfile=opensuse.bmp

case $flavor in
  midway)
    bootdevs=scsi
    should_use_fdt=1
    setdev=1
    # Highbank's u-boot already prepends 0x to the file size
    sizeprefix=
    # And calls the variable $fdt_addr rather than $fdtaddr
    use_fdt_addr=1
    ;;
  cubox)
    kerneladdr=0x2000000
    ramdiskaddr=0x5000000
    ;;
  loco)
    kerneladdr=0x70800000
    ramdiskaddr=0x7e000000
    fdtaddr=0x7d800000
    should_use_fdt=1
    should_load_fdt=1
    units="0 1"
    fdtfile=imx53-qsb.dtb
    ;;
  m400)
    fs="" # Just use "load" command
    boottype=bootm
    bootdevs=scsi
    setdev="true"
    kerneladdr=0x4002000000
    fdtaddr=calculate
    ramdiskaddr=calculate
    use_fdt_addr_r=1
    should_load_fdt=1
    should_use_fdt=1
    remove_fdt_high=1
    initrd_high=0x43e0000000
    fdtfile=apm/apm-m400.dtb
    fdt_high=
    ;;
  pinephone)
    fs=""
    use_fdt_addr_r=1
    should_load_fdt=1
    should_use_fdt=1
    fdtfolder=boot/dtb/allwinner
    fdtfile=sun50i-a64-pinephone-1.2.dtb
    kernel=boot/Image
    initrd=boot/initrd
    units='0 1'
    use_gpio=1
    gpios='114 115 116'
    ;;
esac

# override zImage file names
if [ $boottype = bootz -a $target = boot ]; then
    kernel=zImage
fi

if [ $boottype = booti -a $target = boot ]; then
    kernel=Image
fi

# calculate fdt- and ramdiskaddr from kerneladdr
# kernel needs maximum 63MB
# fdt maximum 1MB
# ramdisk can be placed anywhere after that
if [ "x$fdtaddr" = "xcalculate" ]; then
    fdtaddr=$(( $kerneladdr + 0x03F00000 )) # kernel + 63M
    fdtaddr=`printf '0x%X' $fdtaddr` # convert back to hexadecimal
fi
if [ "x$ramdiskaddr" = "xcalculate" ]; then
    ramdiskaddr=$(( $fdtaddr + 0x00100000 )) # fdt + 1M
    ramdiskaddr=`printf '0x%X' $ramdiskaddr` # convert back to hexadecimal
fi

# copy bash variables into boot script (except 'target' which is not used in u-boot and may overlap u-boot variables (e.g. cubox-i))
for variable in kernel initrd fdtfile fdtfolder flavor bootdevs bootparts \
                initrd_high fdt_high boottype kerneladdr ramdiskaddr should_use_fdt \
                should_load_fdt fdtaddr setdev units sizeprefix use_fdt_addr \
                use_fdt_addr_r fs remove_fdt_high should_use_splashfile splashfile use_gpio gpios; do
    value=$(eval "echo $(echo \$$variable)")
    # only set variables that contain data, leave the others alone
    if [ "$value" ]; then
        echo "setenv $variable '$value'" >> $conf
    fi
done

# follow KIWI modules/KIWIBoot.pm and append $append variable to the end of bootargs
# this allows user to consistently add extra parameters to kernel as simply as possible:
# > setenv append extraopt
# > boot
if [ "x$bootargs" != "x" ]; then
    echo "setenv bootargs \"$bootargs \${append}\"" >> $conf
fi

cat >> $conf <<-"EOF"
	test -n "$kerneladdr" || setenv kerneladdr ${kernel_addr_r}
	test -n "$ramdiskaddr" || setenv ramdiskaddr ${ramdisk_addr_r}
	if test 1${should_use_splashfile} = 11; then
		setenv load_splashfile 'if ${fs}load ${bootdev} ${bootpart} ${kerneladdr} ${splashfile}; then; bmp display ${kerneladdr}; fi;'
	else
		setenv load_splashfile ''
	fi
	setenv load_kernel '${fs}load ${bootdev} ${bootpart} ${kerneladdr} ${kernel}'
	setenv load_initrd '${fs}load ${bootdev} ${bootpart} ${ramdiskaddr} ${initrd}; setenv rd_filesize ${sizeprefix}${filesize}'
	if test 1${should_load_fdt} = 11; then
		if test 0${fdtfile} = 0call_findfdt; then
			run findfdt
		fi
		if test 0${fdtfile} = 0call_autodetectfdt; then
			run autodetectfdt
		fi
		if test -n "$validatefdt"; then
			# Beagleboard xM needs to run validatefdt with latest u-boot, but bootpart is 0:2 by default and prefix file with $bootdir.
			setenv bootpart 0:1
			setenv bootdir ${fdtfolder}
			run validatefdt
		fi
		setenv loadfdt '${fs}load ${bootdev} ${bootpart} ${fdtaddr} ${fdtfolder}/${fdtfile}'
	else
		setenv loadfdt ''
	fi
	if test 1${use_fdt_addr} = 11; then
		# Calxeda systems use $fdt_addr rather than $fdtaddr
		setenv fdtaddr $fdt_addr
	fi
	if test 1${use_fdt_addr_r} = 11; then
		# At least upstream rpi_b uses $fdt_addr_r rather than $fdtaddr
		setenv fdtaddr ${fdt_addr_r}
	fi
	if test 1${should_use_fdt} = 11; then
		setenv boot_kernel '${boottype} ${kerneladdr} ${ramdiskaddr}:${rd_filesize} ${fdtaddr}'
	else
		setenv boot_kernel '${boottype} ${kerneladdr} ${ramdiskaddr}:${rd_filesize}'
	fi
	if test 1${remove_fdt_high} = 11; then
		setenv fdt_high
	fi
        if test 1${use_gpio} = 11; then
                setenv gpioset 'for pin in ${gpios}; do gpio set ${pin}; done'
                setenv gpioclear 'for pin in ${gpios}; do gpio clear ${pin}; done'
        else
                setenv gpioset ''
                sentenv gpioclear ''
        fi
	setenv doit 'run gpioset; run load_splashfile; if run load_kernel; then; run load_initrd; run loadfdt; run gpioclear; run boot_kernel; fi'
	setenv bootcmd 'for bootdev in ${bootdevs}; do for unit in ${units}; do setenv bootpart; for bootpart in ${bootparts}; do setenv fix_bootpart "setenv bootpart $bootpart"; run fix_bootpart; run setdev; run doit; done; done; done'
	boot
EOF

#==========================================
# Create machine readable uboot format
# (only during image creation)
#------------------------------------------
if [ -x /usr/bin/mkimage -a "$target" = firstboot ];then
    mkopts="-A arm -O linux -a 0 -e 0 -T script -C none";
    if ! mkimage $mkopts -n 'Boot-Script' -d $conf $binconf;then
        echo "Failed to create uboot script image"
        exit 1
    fi
fi

#==========================================
# create a uImage for one-off x-gene
#------------------------------------------
if [ "$flavor" = "m400" ]; then
    if [ "$target" = "firstboot" ]; then
        mkimage -A arm -O linux -C none -T kernel -a 0x00080000 -e 0x00080000 -n Linux -d $kernel boot/uImage
        mv boot/uImage $kernel
    fi
fi

set +x
openSUSE Build Service is sponsored by